Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 50 additions & 0 deletions client.go
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,22 @@ type accountUnlockRequest struct {
TAN string `json:"tan"`
}

type nameserverListRequest struct {
Page int `json:"page,omitempty"`
PageLimit int `json:"pagelimit,omitempty"`
}

type nameserverListResponse struct {
Count int `json:"count"`
Domains []nameserverListItem `json:"domains"`
}

type nameserverListItem struct {
RoID int `json:"roId"`
Domain string `json:"domain"`
Type string `json:"type"`
}

const endpointURL = "https://api.domrobot.com/jsonrpc/"

func newClient(endpointURL string) (*client, error) {
Expand Down Expand Up @@ -237,6 +253,40 @@ func (c *client) deleteNameserver(ctx context.Context, domain string) error {
return err
}

func (c *client) listNameservers(ctx context.Context) ([]nameserverListItem, error) {
var allDomains []nameserverListItem
page := 1
pageLimit := 100

for {
response, err := c.call(ctx, "nameserver.list", nameserverListRequest{
Page: page,
PageLimit: pageLimit,
})

if err != nil {
return nil, err
}

data := nameserverListResponse{}
err = json.Unmarshal(response, &data)

if err != nil {
return nil, err
}

allDomains = append(allDomains, data.Domains...)

if len(allDomains) >= data.Count {
break
}

page++
}

return allDomains, nil
}

func (c *client) login(ctx context.Context, username string, password string, sharedSecret string) error {
response, err := c.call(ctx, "account.login", accountLoginRequest{
User: username,
Expand Down
27 changes: 27 additions & 0 deletions provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,32 @@ func (p *Provider) DeleteRecords(ctx context.Context, zone string, records []lib
return results, nil
}

// ListZones lists all zones (nameserver domains) available in the INWX account.
func (p *Provider) ListZones(ctx context.Context) ([]libdns.Zone, error) {
client, err := p.getClient(ctx)
defer p.removeClient(ctx)

if err != nil {
return nil, err
}

domains, err := client.listNameservers(ctx)

if err != nil {
return nil, err
}

zones := make([]libdns.Zone, 0, len(domains))

for _, domain := range domains {
zones = append(zones, libdns.Zone{
Name: domain.Domain,
})
}

return zones, nil
}

func (p *Provider) getClient(ctx context.Context) (*client, error) {
p.clientMu.Lock()
defer p.clientMu.Unlock()
Expand Down Expand Up @@ -257,4 +283,5 @@ var (
_ libdns.RecordAppender = (*Provider)(nil)
_ libdns.RecordSetter = (*Provider)(nil)
_ libdns.RecordDeleter = (*Provider)(nil)
_ libdns.ZoneLister = (*Provider)(nil)
)
36 changes: 36 additions & 0 deletions provider_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -327,3 +327,39 @@ func TestProvider_DeleteRecords(t *testing.T) {
}
}
}

func TestProvider_ListZones(t *testing.T) {
p := getProvider()

err := createTestNameserver(p)

t.Cleanup(func() {
err = deleteTestNameserver(p)

if err != nil {
t.Fatal(err)
}
})

if err != nil {
t.Fatal(err)
}

zones, err := p.ListZones(context.Background())

if err != nil {
t.Fatal(err)
}

if len(zones) == 0 {
t.Fatal("expected at least one zone, got none")
}

found := contains(zones, func(z libdns.Zone) bool {
return z.Name == getDomain(zone)
})

if !found {
t.Fatalf("expected zone %q not found in listed zones: %v", getDomain(zone), zones)
}
}
Loading