FEAT: Refactor allowing multiple DNS Providers
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful

This commit is contained in:
2024-03-15 23:16:23 +13:00
parent a977adf929
commit 17014eeae1
10 changed files with 56416 additions and 75 deletions

View File

@@ -0,0 +1,85 @@
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
}