1
0
Fork 0
mirror of https://gitlab.com/pnx-tools/dns-updater.git synced 2026-06-16 05:54:56 +02:00
dns-updater/provider/digitalocean/provider.go

98 lines
1.9 KiB
Go

package digitalocean
import (
"context"
"errors"
"fmt"
"net"
"dnsupdater/provider"
"github.com/digitalocean/godo"
)
type Provider struct {
service godo.DomainsService
cache map[string][]godo.DomainRecord
}
func New(token string) Provider {
return Provider{
service: godo.NewFromToken(token).Domains,
cache: make(map[string][]godo.DomainRecord),
}
}
func Factory(args map[string]interface{}) (provider.Provider, error) {
t, ok := args["token"]
if !ok {
return nil, errors.New("did not find token")
}
token, ok := t.(string)
if !ok {
return nil, errors.New("token must be a string")
}
return New(token), nil
}
func (d *Provider) fetch(domain string) ([]godo.DomainRecord, error) {
domains, ok := d.cache[domain]
if !ok {
var err error
options := &godo.ListOptions{
PerPage: 50,
}
domains, _, err = d.service.RecordsByType(context.Background(), domain, "A", options)
if err != nil {
return nil, err
}
d.cache[domain] = domains
}
return domains, nil
}
func (d *Provider) find(domain string, record string) (*godo.DomainRecord, error) {
records, err := d.fetch(domain)
if err != nil {
return nil, err
}
for _, r := range records {
if r.Name == record {
return &r, nil
}
}
return nil, fmt.Errorf("could not find record %s", record)
}
func (d Provider) Update(domain string, record string, ip net.IP) error {
r, err := d.find(domain, record)
if err != nil {
return err
}
if r.Data != ip.String() {
// Update
req := godo.DomainRecordEditRequest{
// Type: r.Type,
// Name: r.Name,
Data: ip.String(),
// Priority: r.Priority,
// Port: r.Port,
// TTL: r.TTL,
// Weight: r.Weight,
// Flags: r.Flags,
// Tag: r.Tag,
}
_, _, err := d.service.EditRecord(context.Background(), domain, r.ID, &req)
if err != nil {
return err
}
}
return nil
}