diff --git a/cmd/update-dns/main.go b/cmd/update-dns/main.go index ed32928..ccfa781 100644 --- a/cmd/update-dns/main.go +++ b/cmd/update-dns/main.go @@ -119,7 +119,7 @@ func action(context *cli.Context) error { content, getContentError = getContent(ipClient, kind, context.String("content")) }() - dnsClient := dns.New(context.String("dnsimple-token")) + dnsClient := dns.New(dns.WithOAuth(context.String("dnsimple-token"))) records := []dns.Record{} var getRecordsError error diff --git a/dns/dns.go b/dns/dns.go index 3fae6ba..7c15630 100644 --- a/dns/dns.go +++ b/dns/dns.go @@ -1,29 +1,44 @@ package dns import ( - "strconv" + "context" + "fmt" "strings" "github.com/dnsimple/dnsimple-go/dnsimple" "github.com/pkg/errors" + "golang.org/x/oauth2" ) // Client holds metadata for the dns api client type Client struct { client *dnsimple.Client - accountID string + accountID int64 } // Record is the type used for a Zone record type Record dnsimple.ZoneRecord +// Option type +type Option func(*Client) + +// WithOAuth returns Option for oauth +func WithOAuth(oauthToken string) Option { + return func(c *Client) { + ts := oauth2.StaticTokenSource(&oauth2.Token{AccessToken: oauthToken}) + oauthClient := oauth2.NewClient(context.Background(), ts) + client := dnsimple.NewClient(oauthClient) + c.client = client + } +} + // New returns an implementation of a DNS interface -func New(oauthToken string) *Client { - credentials := dnsimple.NewOauthTokenCredentials(oauthToken) - client := dnsimple.NewClient(credentials) - return &Client{ - client: client, +func New(options ...Option) *Client { + c := &Client{} + for _, option := range options { + option(c) } + return c } // GetRecords returns all record for a host @@ -38,7 +53,11 @@ func (d *Client) GetRecords(host, kind string) ([]Record, error) { return nil, errors.Wrap(err, "unable to parse host") } - records, err := d.client.Zones.ListRecords(accountID, domain, &dnsimple.ZoneRecordListOptions{}) + records, err := d.client.Zones.ListRecords( + fmt.Sprintf("%d", accountID), + domain, + &dnsimple.ZoneRecordListOptions{}, + ) if err != nil { return nil, errors.Wrap(err, "could not get list of records") } @@ -66,7 +85,8 @@ func (d *Client) CreateRecord(host string, record Record) error { newRecord := dnsimple.ZoneRecord(record) newRecord.Name = subdomain - if _, err := d.client.Zones.CreateRecord(accountID, domain, newRecord); err != nil { + aID := fmt.Sprintf("%d", accountID) + if _, err := d.client.Zones.CreateRecord(aID, domain, newRecord); err != nil { return errors.Wrap(err, "could not create record") } return nil @@ -79,7 +99,8 @@ func (d *Client) UpdateRecord(record Record) error { return errors.Wrap(err, "unable to get account id") } - if _, err := d.client.Zones.UpdateRecord(accountID, record.ZoneID, record.ID, dnsimple.ZoneRecord(record)); err != nil { + aID := fmt.Sprintf("%d", accountID) + if _, err := d.client.Zones.UpdateRecord(aID, record.ZoneID, record.ID, dnsimple.ZoneRecord(record)); err != nil { return errors.Wrap(err, "could not update record") } return nil @@ -92,25 +113,26 @@ func (d *Client) DeleteRecord(record Record) error { return errors.Wrap(err, "unable to get account id") } - if _, err := d.client.Zones.DeleteRecord(accountID, record.ZoneID, record.ID); err != nil { + aID := fmt.Sprintf("%d", accountID) + if _, err := d.client.Zones.DeleteRecord(aID, record.ZoneID, record.ID); err != nil { return errors.Wrap(err, "could not delete record") } return nil } -func (d *Client) getAccountID() (string, error) { - if d.accountID != "" { +func (d *Client) getAccountID() (int64, error) { + if d.accountID != 0 { return d.accountID, nil } whoamiResponse, err := d.client.Identity.Whoami() if err != nil { - return "", errors.Wrap(err, "could not get account information from dnsimple") + return 0, errors.Wrap(err, "could not get account information from dnsimple") } if whoamiResponse.Data.Account == nil { - return "", errors.New("could not get account information") + return 0, errors.New("could not get account information") } - d.accountID = strconv.Itoa(whoamiResponse.Data.Account.ID) + d.accountID = whoamiResponse.Data.Account.ID return d.accountID, nil } diff --git a/go.mod b/go.mod index c590487..6394b6c 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( github.com/pkg/errors v0.8.1 github.com/urfave/cli v1.20.0 golang.org/x/net v0.0.0-20190110200230-915654e7eabc // indirect - golang.org/x/oauth2 v0.0.0-20190111185915-36a7019397c4 // indirect + golang.org/x/oauth2 v0.0.0-20190111185915-36a7019397c4 ) go 1.13