mirror of
https://gitlab.com/pnx-tools/dns-updater.git
synced 2026-06-16 05:54:56 +02:00
98 lines
1.9 KiB
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
|
|
}
|