mirror of
https://github.com/StackExchange/dnscontrol.git
synced 2025-12-11 14:45:52 +08:00
CNR Provider: Review CI / Docs / Capabilities (add NAPTR, SSHFP) (#3241)
Co-authored-by: Kai Schwarz <kai.schwarz@centralnic.com> Co-authored-by: AsifNawaz-cnic <asif.nawaz@centralnic.com>
This commit is contained in:
parent
e2cf886326
commit
0b85cf2fe2
5 changed files with 44 additions and 14 deletions
|
|
@ -39,7 +39,7 @@ changelog:
|
||||||
regexp: "(?i)^.*(major|new provider|feature)[(\\w)]*:+.*$"
|
regexp: "(?i)^.*(major|new provider|feature)[(\\w)]*:+.*$"
|
||||||
order: 1
|
order: 1
|
||||||
- title: 'Provider-specific changes:'
|
- title: 'Provider-specific changes:'
|
||||||
regexp: "(?i)((akamaiedge|autodns|axfrd|azure|azure_private_dns|bind|bunnydns|cloudflare|cloudflareapi_old|cloudns|cscglobal|desec|digitalocean|dnsimple|dnsmadeeasy|doh|domainnameshop|dynadot|easyname|exoscale|gandi|gcloud|gcore|hedns|hetzner|hexonet|hostingde|huaweicloud|inwx|linode|loopia|luadns|msdns|mythicbeasts|namecheap|namedotcom|netcup|netlify|ns1|opensrs|oracle|ovh|packetframe|porkbun|powerdns|realtimeregister|route53|rwth|sakuracloud|softlayer|transip|vultr).*:)+.*"
|
regexp: "(?i)((akamaiedge|autodns|axfrd|azure|azure_private_dns|bind|bunnydns|cloudflare|cloudflareapi_old|cloudns|cnr|cscglobal|desec|digitalocean|dnsimple|dnsmadeeasy|doh|domainnameshop|dynadot|easyname|exoscale|gandi|gcloud|gcore|hedns|hetzner|hexonet|hostingde|huaweicloud|inwx|linode|loopia|luadns|msdns|mythicbeasts|namecheap|namedotcom|netcup|netlify|ns1|opensrs|oracle|ovh|packetframe|porkbun|powerdns|realtimeregister|route53|rwth|sakuracloud|softlayer|transip|vultr).*:)+.*"
|
||||||
order: 2
|
order: 2
|
||||||
- title: 'Documentation:'
|
- title: 'Documentation:'
|
||||||
regexp: "(?i)^.*(docs)[(\\w)]*:+.*$"
|
regexp: "(?i)^.*(docs)[(\\w)]*:+.*$"
|
||||||
|
|
|
||||||
|
|
@ -112,6 +112,7 @@
|
||||||
* [Azure Private DNS](provider/azure_private_dns.md)
|
* [Azure Private DNS](provider/azure_private_dns.md)
|
||||||
* [BIND](provider/bind.md)
|
* [BIND](provider/bind.md)
|
||||||
* [Bunny DNS](provider/bunny\_dns.md)
|
* [Bunny DNS](provider/bunny\_dns.md)
|
||||||
|
* [CentralNic Reseller (fka RRPproxy)](provider/cnr.md)
|
||||||
* [Cloudflare](provider/cloudflareapi.md)
|
* [Cloudflare](provider/cloudflareapi.md)
|
||||||
* [ClouDNS](provider/cloudns.md)
|
* [ClouDNS](provider/cloudns.md)
|
||||||
* [CSC Global](provider/cscglobal.md)
|
* [CSC Global](provider/cscglobal.md)
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ If a feature is definitively not supported for whatever reason, we would also li
|
||||||
| [`BUNNY_DNS`](provider/bunny_dns.md) | ❌ | ✅ | ❌ | ❌ | ✅ | ✅ | ❌ | ❔ | ❌ | ❌ | ✅ | ❌ | ✅ | ❌ | ❔ | ❌ | ❌ | ❌ | ❔ | ❔ | ❌ | ✅ | ✅ |
|
| [`BUNNY_DNS`](provider/bunny_dns.md) | ❌ | ✅ | ❌ | ❌ | ✅ | ✅ | ❌ | ❔ | ❌ | ❌ | ✅ | ❌ | ✅ | ❌ | ❔ | ❌ | ❌ | ❌ | ❔ | ❔ | ❌ | ✅ | ✅ |
|
||||||
| [`CLOUDFLAREAPI`](provider/cloudflareapi.md) | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ❔ | ✅ | ❌ | ✅ | ✅ | ❔ | ✅ | ✅ | ✅ | ✅ | ❔ | ❔ | ❔ | ❌ | ❌ | ✅ | ✅ |
|
| [`CLOUDFLAREAPI`](provider/cloudflareapi.md) | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ❔ | ✅ | ❌ | ✅ | ✅ | ❔ | ✅ | ✅ | ✅ | ✅ | ❔ | ❔ | ❔ | ❌ | ❌ | ✅ | ✅ |
|
||||||
| [`CLOUDNS`](provider/cloudns.md) | ❌ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ❔ | ✅ | ❔ | ✅ | ❔ | ✅ | ✅ | ❔ | ✅ | ❔ | ❔ | ✅ | ❔ | ❔ | ✅ | ✅ |
|
| [`CLOUDNS`](provider/cloudns.md) | ❌ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ❔ | ✅ | ❔ | ✅ | ❔ | ✅ | ✅ | ❔ | ✅ | ❔ | ❔ | ✅ | ❔ | ❔ | ✅ | ✅ |
|
||||||
| [`CNR`](provider/cnr.md) | ❌ | ✅ | ✅ | ✅ | ❌ | ✅ | ❔ | ❔ | ❔ | ❔ | ✅ | ❔ | ✅ | ❔ | ❔ | ✅ | ❔ | ❔ | ❔ | ❔ | ✅ | ✅ | ✅ |
|
| [`CNR`](provider/cnr.md) | ❌ | ✅ | ✅ | ✅ | ❌ | ✅ | ❔ | ❌ | ❌ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ | ✅ | ❔ | ❌ | ❌ | ❔ | ✅ | ✅ | ✅ |
|
||||||
| [`CSCGLOBAL`](provider/cscglobal.md) | ✅ | ✅ | ✅ | ✅ | ❔ | ✅ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ✅ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❌ | ✅ |
|
| [`CSCGLOBAL`](provider/cscglobal.md) | ✅ | ✅ | ✅ | ✅ | ❔ | ✅ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ✅ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❌ | ✅ |
|
||||||
| [`DESEC`](provider/desec.md) | ❌ | ✅ | ❌ | ✅ | ❔ | ✅ | ✅ | ✅ | ❔ | ✅ | ✅ | ❔ | ✅ | ✅ | ✅ | ✅ | ✅ | ❔ | ❔ | ✅ | ❔ | ✅ | ✅ |
|
| [`DESEC`](provider/desec.md) | ❌ | ✅ | ❌ | ✅ | ❔ | ✅ | ✅ | ✅ | ❔ | ✅ | ✅ | ❔ | ✅ | ✅ | ✅ | ✅ | ✅ | ❔ | ❔ | ✅ | ❔ | ✅ | ✅ |
|
||||||
| [`DIGITALOCEAN`](provider/digitalocean.md) | ❌ | ✅ | ❌ | ✅ | ❔ | ✅ | ❔ | ❔ | ❌ | ❔ | ❔ | ❔ | ✅ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ✅ | ✅ |
|
| [`DIGITALOCEAN`](provider/digitalocean.md) | ❌ | ✅ | ❌ | ✅ | ❔ | ✅ | ❔ | ❔ | ❌ | ❔ | ❔ | ❔ | ✅ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ✅ | ✅ |
|
||||||
|
|
@ -118,6 +118,7 @@ Providers in this category and their maintainers are:
|
||||||
|[`BUNNY_DNS`](provider/bunny_dns.md)|@ppmathis|
|
|[`BUNNY_DNS`](provider/bunny_dns.md)|@ppmathis|
|
||||||
|[`CLOUDFLAREAPI`](provider/cloudflareapi.md)|@tresni|
|
|[`CLOUDFLAREAPI`](provider/cloudflareapi.md)|@tresni|
|
||||||
|[`CLOUDNS`](provider/cloudns.md)|@pragmaton|
|
|[`CLOUDNS`](provider/cloudns.md)|@pragmaton|
|
||||||
|
|[`CNR`](provider/cnr.md)|@KaiSchwarz-cnic|
|
||||||
|[`CSCGLOBAL`](provider/cscglobal.md)|@Air-New-Zealand|
|
|[`CSCGLOBAL`](provider/cscglobal.md)|@Air-New-Zealand|
|
||||||
|[`DESEC`](provider/desec.md)|@D3luxee|
|
|[`DESEC`](provider/desec.md)|@D3luxee|
|
||||||
|[`DIGITALOCEAN`](provider/digitalocean.md)|@Deraen|
|
|[`DIGITALOCEAN`](provider/digitalocean.md)|@Deraen|
|
||||||
|
|
@ -172,7 +173,6 @@ code to support this provider, we'd be glad to help in any way.
|
||||||
* [Infoblox DNS](https://github.com/StackExchange/dnscontrol/issues/1077) (#1077)
|
* [Infoblox DNS](https://github.com/StackExchange/dnscontrol/issues/1077) (#1077)
|
||||||
* [Joker.com](https://github.com/StackExchange/dnscontrol/issues/854) (#854)
|
* [Joker.com](https://github.com/StackExchange/dnscontrol/issues/854) (#854)
|
||||||
* [Plesk](https://github.com/StackExchange/dnscontrol/issues/2261) (#2261)
|
* [Plesk](https://github.com/StackExchange/dnscontrol/issues/2261) (#2261)
|
||||||
* [RRPPRoxy](https://github.com/StackExchange/dnscontrol/issues/1656) (#1656)
|
|
||||||
* [RcodeZero](https://github.com/StackExchange/dnscontrol/issues/884) (#884)
|
* [RcodeZero](https://github.com/StackExchange/dnscontrol/issues/884) (#884)
|
||||||
* [SynergyWholesale](https://github.com/StackExchange/dnscontrol/issues/1605) (#1605)
|
* [SynergyWholesale](https://github.com/StackExchange/dnscontrol/issues/1605) (#1605)
|
||||||
* [UltraDNS by Neustar / CSCGlobal](https://github.com/StackExchange/dnscontrol/issues/1533) (#1533)
|
* [UltraDNS by Neustar / CSCGlobal](https://github.com/StackExchange/dnscontrol/issues/1533) (#1533)
|
||||||
|
|
|
||||||
|
|
@ -25,19 +25,35 @@ type CNRClient struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
var features = providers.DocumentationNotes{
|
var features = providers.DocumentationNotes{
|
||||||
// The default for unlisted capabilities is 'Cannot'.
|
|
||||||
// See providers/capabilities.go for the entire list of capabilities.
|
// See providers/capabilities.go for the entire list of capabilities.
|
||||||
providers.CanGetZones: providers.Can(),
|
// The default for unlisted capabilities is 'Cannot'.
|
||||||
|
// --- Supported Features ---
|
||||||
|
providers.CanAutoDNSSEC: providers.Unimplemented("Ask for this feature."),
|
||||||
providers.CanConcur: providers.Can(),
|
providers.CanConcur: providers.Can(),
|
||||||
providers.CanUseAlias: providers.Cannot("Not supported. You may use CNAME records instead. An Alternative solution is planned."),
|
providers.CanGetZones: providers.Can(),
|
||||||
providers.CanUseCAA: providers.Can(),
|
|
||||||
providers.CanUseLOC: providers.Unimplemented(),
|
|
||||||
providers.CanUsePTR: providers.Can(),
|
|
||||||
providers.CanUseSRV: providers.Can("SRV records with empty targets are not supported"),
|
|
||||||
providers.CanUseTLSA: providers.Can(),
|
|
||||||
providers.DocCreateDomains: providers.Can(),
|
providers.DocCreateDomains: providers.Can(),
|
||||||
providers.DocDualHost: providers.Can(),
|
providers.DocDualHost: providers.Can(),
|
||||||
providers.DocOfficiallySupported: providers.Cannot("Actively maintained provider module."),
|
providers.DocOfficiallySupported: providers.Cannot("Actively maintained provider module."),
|
||||||
|
// --- Supported record types ---
|
||||||
|
// providers.CanUseAKAMAICDN: providers.Cannot(), // can only be supported by Akamai EdgeDns provider
|
||||||
|
providers.CanUseAlias: providers.Cannot("Not supported. You may use CNAME records instead. An Alternative solution is planned."),
|
||||||
|
// providers.CanUseAzureAlias: providers.Cannot(), // can only be supported by Azure provider
|
||||||
|
providers.CanUseCAA: providers.Can(),
|
||||||
|
providers.CanUseDHCID: providers.Cannot("Ask for this feature."),
|
||||||
|
providers.CanUseDNAME: providers.Cannot("Ask for this feature."),
|
||||||
|
providers.CanUseDNSKEY: providers.Unimplemented("Ask for this feature."),
|
||||||
|
providers.CanUseDS: providers.Unimplemented("Ask for this feature."),
|
||||||
|
providers.CanUseDSForChildren: providers.Unimplemented("Ask for this feature."), // CanUseDS implies CanUseDSForChildren
|
||||||
|
providers.CanUseHTTPS: providers.Cannot("Managed via (Query|Add|Modify|Delete)WebFwd API call. Data not accessible via the resource records list. Hard to integrate this into DNSControl by that."),
|
||||||
|
providers.CanUseLOC: providers.Cannot("Ask for this feature."),
|
||||||
|
providers.CanUseNAPTR: providers.Can(),
|
||||||
|
providers.CanUsePTR: providers.Can(),
|
||||||
|
// providers.CanUseRoute53Alias: providers.Cannot(), // can only be supported by AWS Route53 provider
|
||||||
|
providers.CanUseSOA: providers.Cannot("The SOA record is managed on the DNSZone directly. Data only accessible via StatusDNSZone Request, not via the resource records list. Hard to integrate this into DNSControl by that."), // supported by bind, honstingde
|
||||||
|
providers.CanUseSRV: providers.Can("SRV records with empty targets are not supported"),
|
||||||
|
providers.CanUseSSHFP: providers.Can(),
|
||||||
|
providers.CanUseSVCB: providers.Cannot("Ask for this feature."),
|
||||||
|
providers.CanUseTLSA: providers.Can(),
|
||||||
}
|
}
|
||||||
|
|
||||||
func newProvider(conf map[string]string) (*CNRClient, error) {
|
func newProvider(conf map[string]string) (*CNRClient, error) {
|
||||||
|
|
@ -47,7 +63,7 @@ func newProvider(conf map[string]string) (*CNRClient, error) {
|
||||||
}
|
}
|
||||||
api.client.SetUserAgent("DNSControl", version)
|
api.client.SetUserAgent("DNSControl", version)
|
||||||
api.APILogin, api.APIPassword, api.APIEntity = conf["apilogin"], conf["apipassword"], conf["apientity"]
|
api.APILogin, api.APIPassword, api.APIEntity = conf["apilogin"], conf["apipassword"], conf["apientity"]
|
||||||
if conf["debugmode"] == "1" {
|
if conf["debugmode"] == "2" {
|
||||||
api.client.EnableDebugMode()
|
api.client.EnableDebugMode()
|
||||||
}
|
}
|
||||||
if api.APIEntity != "OTE" && api.APIEntity != "LIVE" {
|
if api.APIEntity != "OTE" && api.APIEntity != "LIVE" {
|
||||||
|
|
|
||||||
|
|
@ -195,7 +195,10 @@ func (n *CNRClient) getRecords(domain string) ([]*CNRRecord, error) {
|
||||||
if r.GetCode() == 545 {
|
if r.GetCode() == 545 {
|
||||||
// If dns zone does not exist create a new one automatically
|
// If dns zone does not exist create a new one automatically
|
||||||
if !isNoPopulate() {
|
if !isNoPopulate() {
|
||||||
n.EnsureZoneExists(domain)
|
err := n.EnsureZoneExists(domain)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
// Return specific error if the zone does not exist
|
// Return specific error if the zone does not exist
|
||||||
return nil, n.GetCNRApiError("Use `dnscontrol create-domains` to create not-existing zone", domain, r)
|
return nil, n.GetCNRApiError("Use `dnscontrol create-domains` to create not-existing zone", domain, r)
|
||||||
|
|
@ -293,6 +296,16 @@ func (n *CNRClient) createRecordString(rc *models.RecordConfig, domain string) (
|
||||||
if domain == host {
|
if domain == host {
|
||||||
host = fmt.Sprintf(`%s.`, host)
|
host = fmt.Sprintf(`%s.`, host)
|
||||||
}
|
}
|
||||||
|
case "SSHFP":
|
||||||
|
answer = fmt.Sprintf(`%v %v %s`, rc.SshfpAlgorithm, rc.SshfpFingerprint, rc.GetTargetField())
|
||||||
|
if domain == host {
|
||||||
|
host = fmt.Sprintf(`%s.`, host)
|
||||||
|
}
|
||||||
|
case "NAPTR":
|
||||||
|
answer = fmt.Sprintf(`%v %v "%v" "%v" "%v" %v`, rc.NaptrOrder, rc.NaptrPreference, rc.NaptrFlags, rc.NaptrService, rc.NaptrRegexp, rc.GetTargetField())
|
||||||
|
if domain == host {
|
||||||
|
host = fmt.Sprintf(`%s.`, host)
|
||||||
|
}
|
||||||
case "TLSA":
|
case "TLSA":
|
||||||
answer = fmt.Sprintf(`%v %v %v %s`, rc.TlsaUsage, rc.TlsaSelector, rc.TlsaMatchingType, rc.GetTargetField())
|
answer = fmt.Sprintf(`%v %v %v %s`, rc.TlsaUsage, rc.TlsaSelector, rc.TlsaMatchingType, rc.GetTargetField())
|
||||||
case "CAA":
|
case "CAA":
|
||||||
|
|
@ -363,5 +376,5 @@ func isNoPopulate() bool {
|
||||||
|
|
||||||
// Function to check if debug mode is enabled
|
// Function to check if debug mode is enabled
|
||||||
func (n *CNRClient) isDebugOn() bool {
|
func (n *CNRClient) isDebugOn() bool {
|
||||||
return n.conf["debugmode"] == "1"
|
return n.conf["debugmode"] == "1" || n.conf["debugmode"] == "2"
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue