libdns-vultr/client.go

163 lines
3.1 KiB
Go
Raw Permalink Normal View History

2020-11-02 18:44:07 +01:00
package vultr
import (
"context"
"sync"
"golang.org/x/oauth2"
2020-11-02 18:44:07 +01:00
"github.com/libdns/libdns"
2023-03-31 16:14:52 +02:00
"github.com/vultr/govultr/v3"
2020-11-02 18:44:07 +01:00
)
type Client struct {
vultr *govultr.Client
mutex sync.Mutex
2020-11-02 18:44:07 +01:00
}
func (p *Provider) getClient() error {
if p.client.vultr == nil {
oauth_cfg := &oauth2.Config{}
2023-03-31 16:16:01 +02:00
oauth_token_source := oauth_cfg.TokenSource(context.TODO(), &oauth2.Token{AccessToken: p.APIToken})
2023-03-31 16:16:01 +02:00
p.client.vultr = govultr.NewClient(oauth2.NewClient(context.TODO(), oauth_token_source))
2020-11-02 18:44:07 +01:00
}
return nil
}
func (p *Provider) getDNSEntries(ctx context.Context, domain string) ([]libdns.Record, error) {
p.client.mutex.Lock()
defer p.client.mutex.Unlock()
2020-11-02 18:44:07 +01:00
p.getClient()
listOptions := &govultr.ListOptions{}
2020-11-02 18:44:07 +01:00
var records []libdns.Record
for {
2023-03-31 16:14:52 +02:00
dns_entries, meta, _, err := p.client.vultr.DomainRecord.List(ctx, domain, listOptions)
if err != nil {
return records, err
}
2020-11-02 18:44:07 +01:00
for _, entry := range dns_entries {
2025-06-01 15:14:24 +02:00
record, err := libdnsRecord(entry, domain)
if err != nil {
return records, err
}
2025-06-01 15:14:24 +02:00
records = append(records, record)
2020-11-02 18:44:07 +01:00
}
if meta.Links.Next == "" {
break
}
listOptions.Cursor = meta.Links.Next
2020-11-02 18:44:07 +01:00
}
return records, nil
}
2025-06-01 15:14:24 +02:00
func (p *Provider) addDNSRecord(ctx context.Context, domain string, r libdns.Record) (libdns.Record, error) {
p.client.mutex.Lock()
defer p.client.mutex.Unlock()
2020-11-02 18:44:07 +01:00
p.getClient()
2025-06-01 15:14:24 +02:00
rr := r.RR()
domainRecordReq, err := vultrRecordReq(rr)
if err != nil {
return r, err
}
2025-06-01 15:14:24 +02:00
rec, _, err := p.client.vultr.DomainRecord.Create(ctx, domain, &domainRecordReq)
2020-11-02 18:44:07 +01:00
if err != nil {
2025-06-01 15:14:24 +02:00
return nil, err
2020-11-02 18:44:07 +01:00
}
2025-06-01 15:14:24 +02:00
record, err := libdnsRecord(*rec, domain)
if err != nil {
return nil, err
}
return record, nil
2020-11-02 18:44:07 +01:00
}
func (p *Provider) removeDNSRecord(ctx context.Context, domain string, record libdns.Record) (libdns.Record, error) {
p.client.mutex.Lock()
defer p.client.mutex.Unlock()
2020-11-02 18:44:07 +01:00
p.getClient()
2025-06-01 15:14:24 +02:00
recordId, err := GetRecordID(record)
if err != nil {
return record, err
}
err = p.client.vultr.DomainRecord.Delete(ctx, domain, recordId)
2020-11-02 18:44:07 +01:00
if err != nil {
return record, err
}
return record, nil
}
func (p *Provider) updateDNSRecord(ctx context.Context, domain string, record libdns.Record) (libdns.Record, error) {
p.client.mutex.Lock()
defer p.client.mutex.Unlock()
2020-11-02 18:44:07 +01:00
p.getClient()
2025-06-01 15:14:24 +02:00
recordId, err := GetRecordID(record)
if err != nil {
return record, err
}
domainRecordReq, err := vultrRecordReq(record)
if err != nil {
return nil, err
2020-11-02 18:44:07 +01:00
}
2025-06-01 15:14:24 +02:00
err = p.client.vultr.DomainRecord.Update(ctx, domain, recordId, &domainRecordReq)
2020-11-02 18:44:07 +01:00
if err != nil {
return record, err
}
return record, nil
}
func (p *Provider) getDNSZones(ctx context.Context) ([]libdns.Zone, error) {
p.client.mutex.Lock()
defer p.client.mutex.Unlock()
p.getClient()
listOptions := &govultr.ListOptions{}
var zones []libdns.Zone
for {
dns_zones, meta, _, err := p.client.vultr.Domain.List(ctx, listOptions)
if err != nil {
return zones, err
}
for _, entry := range dns_zones {
zone := libdns.Zone{
Name: entry.Domain,
}
zones = append(zones, zone)
}
if meta.Links.Next == "" {
break
}
listOptions.Cursor = meta.Links.Next
}
return zones, nil
}