diff --git a/documentation/providers.md b/documentation/providers.md index 3ea68f8fd..d9a37484f 100644 --- a/documentation/providers.md +++ b/documentation/providers.md @@ -19,7 +19,7 @@ If a feature is definitively not supported for whatever reason, we would also li | [`AXFRDDNS`](providers/axfrddns.md) | ❌ | ✅ | ❌ | ❔ | ✅ | ✅ | ❔ | ✅ | ✅ | ❔ | ✅ | ✅ | ✅ | ❔ | ❌ | ❌ | ❌ | ❌ | | [`AZURE_DNS`](providers/azure_dns.md) | ✅ | ✅ | ❌ | ❌ | ✅ | ❔ | ❌ | ❌ | ✅ | ❔ | ✅ | ❌ | ❌ | ❔ | ✅ | ✅ | ✅ | ✅ | | [`BIND`](providers/bind.md) | ✅ | ✅ | ❌ | ❔ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | -| [`CLOUDFLAREAPI`](providers/cloudflareapi.md) | ✅ | ✅ | ❌ | ✅ | ✅ | ❔ | ❌ | ❔ | ✅ | ❔ | ✅ | ✅ | ✅ | ❔ | ❌ | ✅ | ✅ | ✅ | +| [`CLOUDFLAREAPI`](providers/cloudflareapi.md) | ✅ | ✅ | ❌ | ✅ | ✅ | ❔ | ❌ | ✅ | ✅ | ❔ | ✅ | ✅ | ✅ | ❔ | ❌ | ✅ | ✅ | ✅ | | [`CLOUDNS`](providers/cloudns.md) | ❌ | ✅ | ❌ | ✅ | ✅ | ❔ | ❌ | ❔ | ✅ | ❔ | ✅ | ✅ | ✅ | ❔ | ❔ | ✅ | ✅ | ✅ | | [`CSCGLOBAL`](providers/cscglobal.md) | ✅ | ✅ | ✅ | ❔ | ✅ | ❔ | ❔ | ❔ | ❔ | ❔ | ✅ | ❔ | ❔ | ❔ | ❔ | ❌ | ✅ | ✅ | | [`DESEC`](providers/desec.md) | ❌ | ✅ | ❌ | ❔ | ✅ | ✅ | ❔ | ✅ | ✅ | ❔ | ✅ | ✅ | ✅ | ✅ | ❔ | ✅ | ✅ | ✅ | diff --git a/providers/cloudflare/cloudflareProvider.go b/providers/cloudflare/cloudflareProvider.go index 9f303fae1..a310c4136 100644 --- a/providers/cloudflare/cloudflareProvider.go +++ b/providers/cloudflare/cloudflareProvider.go @@ -45,6 +45,7 @@ var features = providers.DocumentationNotes{ providers.CanUseCAA: providers.Can(), providers.CanUseDSForChildren: providers.Can(), providers.CanUseLOC: providers.Cannot(), + providers.CanUseNAPTR: providers.Can(), providers.CanUsePTR: providers.Can(), providers.CanUseSRV: providers.Can(), providers.CanUseSSHFP: providers.Can(), @@ -793,6 +794,15 @@ func (c cfTarget) FQDN() string { return strings.TrimRight(string(c), ".") + "." } +type cfNaptrRecData struct { + Flags string `json:"flags"` + Order uint16 `json:"order"` + Preference uint16 `json:"preference"` + Regex string `json:"regex"` + Replacement string `json:"replacement"` + Service string `json:"service"` +} + // uint16Zero converts value to uint16 or returns 0. func uint16Zero(value interface{}) uint16 { switch v := value.(type) { diff --git a/providers/cloudflare/rest.go b/providers/cloudflare/rest.go index ec2138b4b..b2072b11e 100644 --- a/providers/cloudflare/rest.go +++ b/providers/cloudflare/rest.go @@ -118,6 +118,17 @@ func cfSshfpData(rec *models.RecordConfig) *cfRecData { } } +func cfNaptrData(rec *models.RecordConfig) *cfNaptrRecData { + return &cfNaptrRecData{ + Flags: rec.NaptrFlags, + Order: rec.NaptrOrder, + Preference: rec.NaptrPreference, + Regex: rec.NaptrRegexp, + Replacement: rec.GetTargetField(), + Service: rec.NaptrService, + } +} + func (c *cloudflareProvider) createRec(rec *models.RecordConfig, domainID string) []*models.Correction { var id string content := rec.GetTargetField() @@ -159,6 +170,9 @@ func (c *cloudflareProvider) createRec(rec *models.RecordConfig, domainID string cf.Name = rec.GetLabelFQDN() } else if rec.Type == "DS" { cf.Data = cfDSData(rec) + } else if rec.Type == "NAPTR" { + cf.Data = cfNaptrData(rec) + cf.Name = rec.GetLabelFQDN() } resp, err := c.cfClient.CreateDNSRecord(context.Background(), cloudflare.ZoneIdentifier(domainID), cf) if err != nil { @@ -225,6 +239,9 @@ func (c *cloudflareProvider) createRecDiff2(rec *models.RecordConfig, domainID s cf.Name = rec.GetLabelFQDN() } else if rec.Type == "DS" { cf.Data = cfDSData(rec) + } else if rec.Type == "NAPTR" { + cf.Data = cfNaptrData(rec) + cf.Name = rec.GetLabelFQDN() } resp, err := c.cfClient.CreateDNSRecord(context.Background(), cloudflare.ZoneIdentifier(domainID), cf) if err != nil { @@ -275,6 +292,9 @@ func (c *cloudflareProvider) modifyRecord(domainID, recID string, proxied bool, } else if rec.Type == "DS" { r.Data = cfDSData(rec) r.Content = "" + } else if rec.Type == "NAPTR" { + r.Data = cfNaptrData(rec) + r.Name = rec.GetLabelFQDN() } _, err := c.cfClient.UpdateDNSRecord(context.Background(), cloudflare.ZoneIdentifier(domainID), r) return err