package dns_providers import ( "context" "log" "github.com/cloudflare/cloudflare-go" "github.com/mkelcik/cloudflare-ddns-update/internal" ) const ( CloudflareTag = "cloudflare" ) type CloudflareProvider struct { Context context.Context Client *cloudflare.API Config internal.Config } func (d *CloudflareProvider) UpdateRecord(hostname string, ip string, old_ip string) error { // old_ip is not required for Cloudflare updates domain_parts := GetDomainParts(hostname) zoneId := d.FindZoneIdByName(domain_parts.Domain) dnsRecords, err := d.GetDnsRecord(hostname, zoneId) if err != nil { log.Fatal(err) } update := cloudflare.UpdateDNSRecordParams{ ID: dnsRecords[0].ID, Content: ip, } if d.Config.OnChangeComment != "" { update.Comment = &d.Config.OnChangeComment } _, err = d.Client.UpdateDNSRecord(d.Context, cloudflare.ZoneIdentifier(zoneId), update) if err != nil { return err } return nil } func (d *CloudflareProvider) NewClient(api_token string) { api, err := cloudflare.NewWithAPIToken(api_token) if err != nil { log.Fatal(err) } d.Client = api } func (d *CloudflareProvider) FindZoneIdByName(hostname string) string { // Fetch user details on the account zoneID, err := d.Client.ZoneIDByName(hostname) if err != nil { log.Fatal(err) } return zoneID } func (d *CloudflareProvider) GetDnsRecord(name string, zoneId string) ([]cloudflare.DNSRecord, error) { params := cloudflare.ListDNSRecordsParams{ Name: name, } page, _, err := d.Client.ListDNSRecords(d.Context, cloudflare.ZoneIdentifier(zoneId), params) if err != nil { return nil, err } return page, nil } func NewCloudflareProvider(ctx context.Context, config internal.Config) *CloudflareProvider { c := &CloudflareProvider{} c.Context = ctx c.Config = config c.NewClient(c.Config.ApiToken) return c }