You've already forked ddns-updater
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
FEAT: Directadmin provider is now working
93 lines
2.1 KiB
Go
93 lines
2.1 KiB
Go
package dns_providers
|
|
|
|
import (
|
|
"context"
|
|
"log"
|
|
|
|
"github.com/cloudflare/cloudflare-go"
|
|
"hub.cybercinch.nz/cybercinch/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) 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.CloudflareOnChangeComment != "" {
|
|
update.Comment = &d.Config.CloudflareOnChangeComment
|
|
}
|
|
|
|
_, err = d.Client.UpdateDNSRecord(d.Context, cloudflare.ZoneIdentifier(zoneId), update)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (d *CloudflareProvider) FetchRecord(hostname string) (string, error) {
|
|
domain_parts := GetDomainParts(hostname)
|
|
zoneId := d.FindZoneIdByName(domain_parts.Domain)
|
|
dnsRecord, err := d.GetDnsRecord(hostname, zoneId)
|
|
return dnsRecord[0].Content, err
|
|
}
|
|
|
|
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
|
|
}
|