From 1e042ab67aaeddb09ff6e7afc3654b1d07b00e14 Mon Sep 17 00:00:00 2001 From: Tom Limoncelli Date: Wed, 7 Oct 2026 15:30:54 -0400 Subject: [PATCH] refactor: Stage 6: Adopt SupportedTypes across providers --- REFACTORING_PROJECTS.md | 26 +- .../advanced-features/writing-providers.md | 40 +- documentation/provider/adguardhome.md | 30 +- documentation/provider/akamaiedgedns.md | 12 +- documentation/provider/alidns.md | 18 +- documentation/provider/autodns.md | 18 +- documentation/provider/azuredns.md | 16 +- documentation/provider/azureprivatedns.md | 12 +- documentation/provider/bunnydns.md | 6 +- documentation/provider/cloudflareapi.md | 8 +- documentation/provider/cloudns.md | 2 +- documentation/provider/cscglobal.md | 28 +- documentation/provider/desec.md | 6 +- documentation/provider/dnscale.md | 14 +- documentation/provider/dnsimple.md | 10 +- documentation/provider/dnsmadeeasy.md | 16 +- documentation/provider/dnsoverhttps.md | 32 +- documentation/provider/domainnameshop.md | 12 +- documentation/provider/dynadot.md | 32 +- documentation/provider/dynu.md | 6 +- documentation/provider/easyname.md | 32 +- documentation/provider/exoscale.md | 20 +- documentation/provider/gandiv5.md | 10 +- documentation/provider/gcloud.md | 14 +- documentation/provider/gcore.md | 10 +- documentation/provider/gidinet.md | 2 +- documentation/provider/gigahost.md | 20 +- documentation/provider/hetznerv2.md | 8 +- documentation/provider/hostingde.md | 12 +- documentation/provider/huaweicloud.md | 8 +- documentation/provider/index.md | 398 ++++++++++-------- documentation/provider/infoblox.md | 26 +- documentation/provider/infomaniak.md | 20 +- documentation/provider/internetbs.md | 32 +- documentation/provider/inwx.md | 10 +- documentation/provider/joker.md | 6 +- documentation/provider/linode.md | 26 +- documentation/provider/loopia.md | 4 +- documentation/provider/luadns.md | 16 +- documentation/provider/mikrotik.md | 8 +- documentation/provider/mythicbeasts.md | 18 +- documentation/provider/namecheap.md | 20 +- documentation/provider/namedotcom.md | 24 +- documentation/provider/netcup.md | 22 +- documentation/provider/netlify.md | 14 +- documentation/provider/netnod.md | 2 +- documentation/provider/ns1.md | 8 +- documentation/provider/opensrs.md | 32 +- documentation/provider/openwrt.md | 28 +- documentation/provider/oracle.md | 14 +- documentation/provider/ovh.md | 18 +- documentation/provider/packetframe.md | 28 +- documentation/provider/porkbun.md | 8 +- documentation/provider/powerdns.md | 2 +- documentation/provider/realtimeregister.md | 10 +- documentation/provider/route53.md | 12 +- documentation/provider/rwth.md | 14 +- documentation/provider/sakuracloud.md | 2 +- documentation/provider/scaleway.md | 4 +- documentation/provider/softlayer.md | 28 +- documentation/provider/spaceship.md | 8 +- documentation/provider/tencentdns.md | 24 +- documentation/provider/transip.md | 2 +- documentation/provider/unifi.md | 18 +- documentation/provider/vercel.md | 2 +- documentation/provider/vultr.md | 18 +- documentation/provider/websupport.md | 12 +- pkg/js/parse_tests/019-r53-alias.json | 66 --- pkg/js/parse_tests/026-azure-alias.json | 9 - pkg/js/parse_tests/036-dextendcf.json | 3 - pkg/js/parse_tests/040-cfWorkerRoute.json | 3 - pkg/js/parse_tests/040-r53-zone.json | 3 - pkg/js/parse_tests/061-mikrotik.json | 9 +- pkg/js/parse_tests/063-adguard.json | 6 - pkg/js/parse_tests/064-lua.json | 6 - pkg/js/parse_tests/065-bunny.json | 6 - pkg/js/parse_tests/066-cloudns.json | 3 - pkg/js/parse_tests/067-porkbun.json | 1 - pkg/normalize/provider_alias_test.go | 17 +- pkg/normalize/supported_types_test.go | 132 ++++-- pkg/normalize/validate.go | 93 +--- pkg/privatetypes/register.go | 8 +- pkg/privatetypes/register_test.go | 2 +- pkg/providers/capabilities.go | 8 - pkg/providers/capability_string.go | 57 ++- pkg/providers/definition.go | 3 +- pkg/providers/providers.go | 29 +- pkg/providers/registrations_test.go | 16 + pkg/providers/supported_types.go | 6 +- pkg/providers/supported_types_test.go | 39 +- pkg/providers/type_adoption_test.go | 137 ++++++ providers/adguardhome/adguardHomeProvider.go | 19 +- .../akamaiedgedns/akamaiEdgeDnsProvider.go | 44 +- providers/alidns/aliDnsProvider.go | 21 +- providers/autodns/autoDnsProvider.go | 22 +- providers/axfrddns/axfrddnsProvider.go | 51 +-- providers/azuredns/azureDnsProvider.go | 30 +- .../azurePrivateDnsProvider.go | 32 +- providers/bind/bindProvider.go | 39 +- providers/bind/supported_types_test.go | 7 +- providers/bunnydns/bunnydnsProvider.go | 44 +- providers/cloudflare/cloudflareProvider.go | 44 +- providers/cloudflare/initialize_test.go | 6 +- providers/cloudns/cloudnsProvider.go | 48 +-- providers/cnr/cnrProvider.go | 56 ++- providers/cscglobal/cscglobalProvider.go | 13 +- providers/desec/desecProvider.go | 45 +- .../digitalocean/digitaloceanProvider.go | 45 +- providers/dnscale/dnscaleProvider.go | 26 +- providers/dnsimple/dnsimpleProvider.go | 37 +- providers/dnsimple/initialize_test.go | 6 +- providers/dnsmadeeasy/dnsMadeEasyProvider.go | 26 +- providers/doh/dohProvider.go | 11 +- .../domainnameshop/domainnameshopProvider.go | 37 +- providers/dynadot/dynadotProvider.go | 11 +- providers/dynu/dynuProvider.go | 35 +- providers/easyname/easynameProvider.go | 11 +- providers/exoscale/exoscaleProvider.go | 23 +- providers/fortigate/fortigateProvider.go | 34 +- providers/gandiv5/gandiv5Provider.go | 40 +- providers/gcloud/gcloudProvider.go | 32 +- providers/gcore/gcoreProvider.go | 33 +- providers/gidinet/gidinetProvider.go | 34 +- providers/gigahost/gigahostProvider.go | 18 +- providers/hedns/hednsProvider.go | 43 +- providers/hetznerv2/hetznerv2Provider.go | 34 +- providers/hostingde/hostingdeProvider.go | 32 +- providers/huaweicloud/huaweicloudProvider.go | 25 +- providers/infoblox/infobloxProvider.go | 20 +- providers/infomaniak/infomaniakProvider.go | 16 +- providers/internetbs/internetbsProvider.go | 11 +- providers/inwx/inwxProvider.go | 38 +- providers/joker/jokerProvider.go | 29 +- providers/linode/linodeProvider.go | 19 +- providers/loopia/loopiaProvider.go | 42 +- providers/luadns/luadnsProvider.go | 28 +- providers/mikrotik/mikrotikProvider.go | 37 +- providers/mittwald/mittwaldProvider.go | 35 +- .../mythicbeasts/mythicbeastsProvider.go | 25 +- providers/namecheap/namecheapProvider.go | 32 +- providers/namedotcom/namedotcomProvider.go | 24 +- providers/netbird/netbirdProvider.go | 33 +- providers/netcup/netcupProvider.go | 21 +- providers/netlify/netlifyProvider.go | 35 +- providers/netnod/netnodProvider.go | 40 +- providers/nexdns/nexdnsProvider.go | 42 +- providers/ns1/ns1Provider.go | 38 +- .../openprovider/openproviderProvider.go | 36 +- providers/opensrs/opensrsProvider.go | 11 +- providers/openwrt/openwrtProvider.go | 11 +- providers/oracle/oracleProvider.go | 28 +- providers/ovh/ovhProvider.go | 25 +- providers/packetframe/packetframeProvider.go | 17 +- providers/porkbun/porkbunProvider.go | 43 +- providers/powerdns/powerdnsProvider.go | 54 +-- .../realtimeregisterProvider.go | 35 +- providers/route53/initialize_test.go | 6 +- providers/route53/route53Provider.go | 37 +- providers/rwth/rwthProvider.go | 31 +- providers/sakuracloud/sakuracloudProvider.go | 36 +- providers/scaleway/scalewayProvider.go | 40 +- providers/softlayer/softlayerProvider.go | 12 +- providers/spaceship/spaceshipProvider.go | 37 +- providers/tencentdns/tencentdnsProvider.go | 13 +- providers/transip/transipProvider.go | 39 +- providers/unifi/unifiProvider.go | 22 +- providers/vercel/vercelProvider.go | 36 +- providers/vultr/vultrProvider.go | 21 +- providers/websupport/websupportProvider.go | 30 +- 169 files changed, 1985 insertions(+), 2394 deletions(-) create mode 100644 pkg/providers/type_adoption_test.go diff --git a/REFACTORING_PROJECTS.md b/REFACTORING_PROJECTS.md index a8019dcb30..4637538db1 100644 --- a/REFACTORING_PROJECTS.md +++ b/REFACTORING_PROJECTS.md @@ -3,22 +3,28 @@ Useful refactoring projects. Please feel free to pick up any of these. -## Code that can probably be deleted - -* Retire RegisterCustomRecordType()/GetCustomRecordType() during the Stage 5–6 - SupportedTypes rollout, after replacing their record recognition and - provider-support checks. Legacy validation still depends on them. - -* Remove the "orig_custom_type" metadata with that rollout. It is still read - by target validation and must remain until that dependency is replaced. - - ## Documentation updates * Improved "how to write a provider" docs. The process for creating a DNS or Registrar provider could be improved. We should provide templates to copy instead of asking people to find a similar provider. The doc should start by creating a generic provider, then add features and options over time. The first thing should test credentials and nothing else. Then add a registrar (if needed) and then the "preview" functionality, then "push". ## Rewrites needed +* Rework how metadata is passed to providers and how provider state is owned. + Consider an explicit split between state specific to a `credEntry` (such as + account-wide caches and rate limiters) and state specific to a + `(domain, credEntry)` (such as domain-specific configuration). Revisit client + initialization and reuse as part of that design. Also consider a tiered + metadata system with explicit inheritance and precedence rules, or providers + implemented as external binaries that maintain their own state. Keep this as + a separate future project with appropriate provider testing, rather than + expanding the current configuration-syntax rollout. + +* Future provider concurrency change: default to allowing concurrency and replace + authored `CanConcur` declarations with `ConcurBroken: true` only for providers + that cannot run concurrently. Derive the compatibility `CanConcur` capability + as `!ConcurBroken`, and audit existing `Cannot`/`Unimplemented` notes to + distinguish known limitations from untested providers. Implement in a separate PR. + * PTR() "magic" should be reworked as a builder called PTR(). It will be much more cleaner and more testable. Plus it will consolidate the code into one place instead of being some in LabelFromDnsconfigjs() and other places. diff --git a/documentation/advanced-features/writing-providers.md b/documentation/advanced-features/writing-providers.md index 6fc8c1dfe2..a4ce11ae4c 100644 --- a/documentation/advanced-features/writing-providers.md +++ b/documentation/advanced-features/writing-providers.md @@ -309,36 +309,56 @@ If a provider doesn't advertise a particular capability, the integration test sy Don't feel obligated to implement everything at once. In fact, we'd prefer a few small PRs than one big one. Focus on getting the basic provider working well before adding these extras. -Operational features have names like `providers.CanUseSRV` and `providers.CanUseAlias`. The list of optional "capabilities" are in the file `dnscontrol/pkg/providers/providers.go` (look for `CanUseAlias`). +Operational features such as `CanConcur` and `CanAutoDNSSEC` are named fields in +`providers.Definition`. Record support is declared in `SupportedTypes` and also +exposed through the compatibility capabilities in `pkg/providers/capabilities.go`. Capabilities are processed early by DNSControl. For example if a provider doesn't support SRV records, DNSControl will error out when parsing `dnscontrol.js` rather than waiting until the API fails at the very end. Enable optional capabilities in the `nameProvider.go` file and run the integration tests to see what works and what doesn't. Fix any bugs and repeat, repeat, repeat until you have all the capabilities you want to implement. -Declare supported record types in `providers.Definition.SupportedTypes`, for -example `[]string{"Default", "PTR"}`. This list is exhaustive: -`Default` contains `A`, `AAAA`, `CAA`, `CNAME`, `MX`, `NS`, `SRV`, and `TXT`. -It is a fixed baseline for typical authoritative DNS providers; verify each +Declare supported record types in `providers.Definition.SupportedTypes`, with +each string item on its own line to keep future diffs small: + +```go +SupportedTypes: []string{ + "Basic8", + "PTR", +}, +``` + +This list is exhaustive: +`Basic8` contains `A`, `AAAA`, `CAA`, `CNAME`, `MX`, `NS`, `SRV`, and `TXT`. +Its membership is fixed at these eight types; verify each provider's implementation and declare exceptions such as `NS:Cannot` explicitly. Specialized providers can supply their own complete list. `RFC` includes all ordinary types in DNSControl's record catalog; `*` also includes pseudo-types. Patterns such as `BUNNY_*` match whole type names, with `*` matching zero or more characters. Unknown concrete type names are errors. +`IMPORT_TRANSFORM` is a deferred configuration command, not a record type or +pseudo-type. It works with every provider and must not appear in `SupportedTypes`. +Normalization executes it before providers see records, then checks the copied +records against each provider's declaration. Custom pseudo-types need a parser +registered with `privatetypes.Register` and an entry +in `SupportedTypes`. Multiple providers can support the same pseudo-type. + An entry without a suffix means supported. Use `:Can`, `:Cannot`, or `:Unimplemented` on concrete names or patterns, for example `[]string{"RFC", "CAA:Cannot"}`. Both negative statuses reject records; -`Unimplemented` retains a distinct documentation status. `Default` and `RFC` +`Unimplemented` retains a distinct documentation status. `Basic8` and `RFC` do not take suffixes. Type names are case-insensitive; status suffixes use the spellings shown here. Precedence is: exact entries, patterns with status suffixes, legacy `Features`, then unsuffixed patterns/categories. Conflicting statuses at the winning priority are errors, regardless of order. An exact entry can resolve conflicting -patterns. Nil `SupportedTypes` means `Default`; a non-nil empty slice declares -no support. During migration, legacy `Features` can still supply individual -type statuses, and a non-nil `Features` with nil `SupportedTypes` retains legacy -validation. General `DS` support includes child DS records; `CanUseDSForChildren` +patterns. Nil `SupportedTypes` means `Basic8`; a non-nil empty slice declares +no support beyond `Features`. Built-in providers all declare `SupportedTypes` +explicitly; registrar-only providers use `[]string{}`. `Features` remains a +compatibility input and can retain comments and links for individual types or +interface-derived capabilities. A non-nil `Features` with nil `SupportedTypes` +retains legacy capability validation. General `DS` support includes child DS records; `CanUseDSForChildren` can independently allow child DS records even with `DS:Cannot`. Registration retains selectors until the complete catalog is available. diff --git a/documentation/provider/adguardhome.md b/documentation/provider/adguardhome.md index 560dd43f58..0549337f55 100644 --- a/documentation/provider/adguardhome.md +++ b/documentation/provider/adguardhome.md @@ -69,23 +69,23 @@ D("example.com", REG_NONE, DnsProvider(DSP_ADGUARDHOME), - [get-zones](../commands/get-zones.md): ❌ - DNS extensions - [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md): ✅ - - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❔ - - [`LOC`](../language-reference/domain-modifiers/LOC.md): ❔ - - [`PTR`](../language-reference/domain-modifiers/PTR.md): ❔ - - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❔ + - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❌ + - [`LOC`](../language-reference/domain-modifiers/LOC.md): ❌ + - [`PTR`](../language-reference/domain-modifiers/PTR.md): ❌ + - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❌ - Service discovery - - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❔ - - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❔ - - [`SRV`](../language-reference/domain-modifiers/SRV.md): ❔ - - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❔ + - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❌ + - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❌ + - [`SRV`](../language-reference/domain-modifiers/SRV.md): ❌ + - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❌ - Security - - [`CAA`](../language-reference/domain-modifiers/CAA.md): ❔ - - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❔ - - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❔ - - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ❔ - - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ❔ + - [`CAA`](../language-reference/domain-modifiers/CAA.md): ❌ + - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❌ + - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❌ + - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ❌ + - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ❌ - DNSSEC - [`AUTODNSSEC`](../language-reference/domain-modifiers/AUTODNSSEC_ON.md): ❔ - - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❔ - - [`DS`](../language-reference/domain-modifiers/DS.md): ❔ + - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❌ + - [`DS`](../language-reference/domain-modifiers/DS.md): ❌ diff --git a/documentation/provider/akamaiedgedns.md b/documentation/provider/akamaiedgedns.md index 3fca8e216d..1143166dce 100644 --- a/documentation/provider/akamaiedgedns.md +++ b/documentation/provider/akamaiedgedns.md @@ -377,23 +377,23 @@ Created zone: example_3.com - [get-zones](../commands/get-zones.md): ✅ - DNS extensions - [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md): ✅ - - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❔ + - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❌ - [`LOC`](../language-reference/domain-modifiers/LOC.md): ✅ - [`PTR`](../language-reference/domain-modifiers/PTR.md): ✅ - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❌ - Service discovery - - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❔ + - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❌ - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ✅ - [`SRV`](../language-reference/domain-modifiers/SRV.md): ✅ - - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❔ + - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❌ - Security - [`CAA`](../language-reference/domain-modifiers/CAA.md): ✅ - - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❔ - - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❔ + - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❌ + - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❌ - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ✅ - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ✅ - DNSSEC - [`AUTODNSSEC`](../language-reference/domain-modifiers/AUTODNSSEC_ON.md): ✅ - - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❔ + - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❌ - [`DS`](../language-reference/domain-modifiers/DS.md): ❌ diff --git a/documentation/provider/alidns.md b/documentation/provider/alidns.md index f64aaa616d..df8507618c 100644 --- a/documentation/provider/alidns.md +++ b/documentation/provider/alidns.md @@ -139,23 +139,23 @@ If a domain does not exist in your Alibaba Cloud account, you must create it man - [get-zones](../commands/get-zones.md): ✅ - DNS extensions - [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md): ❌ - - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❔ - - [`LOC`](../language-reference/domain-modifiers/LOC.md): ❔ + - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❌ + - [`LOC`](../language-reference/domain-modifiers/LOC.md): ❌ - [`PTR`](../language-reference/domain-modifiers/PTR.md): ❌ - - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❔ + - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❌ - Service discovery - - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❔ + - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❌ - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❌ - [`SRV`](../language-reference/domain-modifiers/SRV.md): ✅ - - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❔ + - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❌ - Security - [`CAA`](../language-reference/domain-modifiers/CAA.md): ✅ - - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❔ - - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❔ + - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❌ + - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❌ - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ❌ - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ❌ - DNSSEC - [`AUTODNSSEC`](../language-reference/domain-modifiers/AUTODNSSEC_ON.md): ❌ - - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❔ - - [`DS`](../language-reference/domain-modifiers/DS.md): ❔ + - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❌ + - [`DS`](../language-reference/domain-modifiers/DS.md): ❌ diff --git a/documentation/provider/autodns.md b/documentation/provider/autodns.md index 4e262f26fb..f089ffc2d7 100644 --- a/documentation/provider/autodns.md +++ b/documentation/provider/autodns.md @@ -119,23 +119,23 @@ D("example.com", REG_NONE, DnsProvider(DSP_AUTODNS), - [get-zones](../commands/get-zones.md): ✅ - DNS extensions - [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md): ✅ - - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❔ - - [`LOC`](../language-reference/domain-modifiers/LOC.md): ❔ + - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❌ + - [`LOC`](../language-reference/domain-modifiers/LOC.md): ❌ - [`PTR`](../language-reference/domain-modifiers/PTR.md): ✅ - - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❔ + - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❌ - Service discovery - - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❔ - - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❔ + - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❌ + - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❌ - [`SRV`](../language-reference/domain-modifiers/SRV.md): ✅ - - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❔ + - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❌ - Security - [`CAA`](../language-reference/domain-modifiers/CAA.md): ✅ - - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❔ - - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❔ + - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❌ + - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❌ - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ❌ - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ❌ - DNSSEC - [`AUTODNSSEC`](../language-reference/domain-modifiers/AUTODNSSEC_ON.md): ❔ - - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❔ + - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❌ - [`DS`](../language-reference/domain-modifiers/DS.md): ❌ diff --git a/documentation/provider/azuredns.md b/documentation/provider/azuredns.md index 031a6829ed..ed98c6c8bc 100644 --- a/documentation/provider/azuredns.md +++ b/documentation/provider/azuredns.md @@ -228,23 +228,23 @@ The ResourceGroup is case sensitive. - [get-zones](../commands/get-zones.md): ✅ - DNS extensions - [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md): ❌ - - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❔ + - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❌ - [`LOC`](../language-reference/domain-modifiers/LOC.md): ❌ - [`PTR`](../language-reference/domain-modifiers/PTR.md): ✅ - - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❔ + - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❌ - Service discovery - - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❔ + - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❌ - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❌ - [`SRV`](../language-reference/domain-modifiers/SRV.md): ✅ - - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❔ + - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❌ - Security - [`CAA`](../language-reference/domain-modifiers/CAA.md): ✅ - - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❔ - - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❔ + - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❌ + - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❌ - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ❌ - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ❌ - DNSSEC - [`AUTODNSSEC`](../language-reference/domain-modifiers/AUTODNSSEC_ON.md): ❔ - - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❔ - - [`DS`](../language-reference/domain-modifiers/DS.md): ❔ + - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❌ + - [`DS`](../language-reference/domain-modifiers/DS.md): ❌ diff --git a/documentation/provider/azureprivatedns.md b/documentation/provider/azureprivatedns.md index 85afb03a85..4233b7420a 100644 --- a/documentation/provider/azureprivatedns.md +++ b/documentation/provider/azureprivatedns.md @@ -233,20 +233,20 @@ The ResourceGroup is case-insensitive (it is lowercased internally). - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❌ - [`LOC`](../language-reference/domain-modifiers/LOC.md): ❌ - [`PTR`](../language-reference/domain-modifiers/PTR.md): ✅ - - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❔ + - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❌ - Service discovery - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❌ - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❌ - [`SRV`](../language-reference/domain-modifiers/SRV.md): ✅ - - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❔ + - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❌ - Security - [`CAA`](../language-reference/domain-modifiers/CAA.md): ❌ - - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❔ - - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❔ + - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❌ + - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❌ - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ❌ - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ❌ - DNSSEC - [`AUTODNSSEC`](../language-reference/domain-modifiers/AUTODNSSEC_ON.md): ❌ - - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❔ - - [`DS`](../language-reference/domain-modifiers/DS.md): ❔ + - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❌ + - [`DS`](../language-reference/domain-modifiers/DS.md): ❌ diff --git a/documentation/provider/bunnydns.md b/documentation/provider/bunnydns.md index 62afb0e256..42c2604be8 100644 --- a/documentation/provider/bunnydns.md +++ b/documentation/provider/bunnydns.md @@ -205,7 +205,7 @@ You can configure Bunny's Pull Zone type with `BUNNY_DNS_PZ`. The target is the - [get-zones](../commands/get-zones.md): ✅ - DNS extensions - [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md): ✅ - - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❔ + - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❌ - [`LOC`](../language-reference/domain-modifiers/LOC.md): ❌ - [`PTR`](../language-reference/domain-modifiers/PTR.md): ✅ - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❌ @@ -217,11 +217,11 @@ You can configure Bunny's Pull Zone type with `BUNNY_DNS_PZ`. The target is the - Security - [`CAA`](../language-reference/domain-modifiers/CAA.md): ✅ - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ✅ - - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❔ + - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❌ - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ❌ - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ✅ - DNSSEC - [`AUTODNSSEC`](../language-reference/domain-modifiers/AUTODNSSEC_ON.md): ✅ - - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❔ + - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❌ - [`DS`](../language-reference/domain-modifiers/DS.md): ❌ diff --git a/documentation/provider/cloudflareapi.md b/documentation/provider/cloudflareapi.md index 638d1f0dee..c1535dd49c 100644 --- a/documentation/provider/cloudflareapi.md +++ b/documentation/provider/cloudflareapi.md @@ -645,19 +645,19 @@ Some of this is documented on the Cloudflare website's [Time to Live (TTL)](http - [get-zones](../commands/get-zones.md): ✅ - DNS extensions - [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md): ✅ - - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❔ + - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❌ - [`LOC`](../language-reference/domain-modifiers/LOC.md): ✅ - [`PTR`](../language-reference/domain-modifiers/PTR.md): ✅ - - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❔ + - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❌ - Service discovery - - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❔ + - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❌ - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ✅ - [`SRV`](../language-reference/domain-modifiers/SRV.md): ✅ - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ✅ - Security - [`CAA`](../language-reference/domain-modifiers/CAA.md): ✅ - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ✅ - - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❔ + - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❌ - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ✅ - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ✅ - DNSSEC diff --git a/documentation/provider/cloudns.md b/documentation/provider/cloudns.md index 76285cb69c..bb9eeb4dd5 100644 --- a/documentation/provider/cloudns.md +++ b/documentation/provider/cloudns.md @@ -109,7 +109,7 @@ seconds, but 300 seconds would stay 300 seconds. - Security - [`CAA`](../language-reference/domain-modifiers/CAA.md): ✅ - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❌ - - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❔ + - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❌ - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ✅ - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ✅ - DNSSEC diff --git a/documentation/provider/cscglobal.md b/documentation/provider/cscglobal.md index 09e3be974a..916da46f21 100644 --- a/documentation/provider/cscglobal.md +++ b/documentation/provider/cscglobal.md @@ -58,24 +58,24 @@ To get access to the [CSC Global API](https://www.cscglobal.com/cscglobal/docs/d - create-domains: ❌ - [get-zones](../commands/get-zones.md): ✅ - DNS extensions - - [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md): ❔ - - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❔ - - [`LOC`](../language-reference/domain-modifiers/LOC.md): ❔ - - [`PTR`](../language-reference/domain-modifiers/PTR.md): ❔ - - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❔ + - [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md): ❌ + - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❌ + - [`LOC`](../language-reference/domain-modifiers/LOC.md): ❌ + - [`PTR`](../language-reference/domain-modifiers/PTR.md): ❌ + - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❌ - Service discovery - - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❔ - - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❔ + - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❌ + - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❌ - [`SRV`](../language-reference/domain-modifiers/SRV.md): ✅ - - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❔ + - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❌ - Security - [`CAA`](../language-reference/domain-modifiers/CAA.md): ✅ - - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❔ - - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❔ - - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ❔ - - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ❔ + - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❌ + - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❌ + - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ❌ + - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ❌ - DNSSEC - [`AUTODNSSEC`](../language-reference/domain-modifiers/AUTODNSSEC_ON.md): ❔ - - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❔ - - [`DS`](../language-reference/domain-modifiers/DS.md): ❔ + - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❌ + - [`DS`](../language-reference/domain-modifiers/DS.md): ❌ diff --git a/documentation/provider/desec.md b/documentation/provider/desec.md index b72fb3294e..8c6fa11145 100644 --- a/documentation/provider/desec.md +++ b/documentation/provider/desec.md @@ -58,12 +58,12 @@ Upon domain creation, the DNSKEY and DS records needed for DNSSEC setup are prin - [get-zones](../commands/get-zones.md): ✅ - DNS extensions - [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md): ❔ - - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❔ + - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❌ - [`LOC`](../language-reference/domain-modifiers/LOC.md): ✅ - [`PTR`](../language-reference/domain-modifiers/PTR.md): ✅ - - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❔ + - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❌ - Service discovery - - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❔ + - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❌ - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ✅ - [`SRV`](../language-reference/domain-modifiers/SRV.md): ✅ - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ✅ diff --git a/documentation/provider/dnscale.md b/documentation/provider/dnscale.md index d8f157dbcf..49681d58a9 100644 --- a/documentation/provider/dnscale.md +++ b/documentation/provider/dnscale.md @@ -113,23 +113,23 @@ For more information about the DNScale API, see the [DNScale API documentation]( - [get-zones](../commands/get-zones.md): ❌ - DNS extensions - [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md): ✅ - - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❔ + - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❌ - [`LOC`](../language-reference/domain-modifiers/LOC.md): ❌ - [`PTR`](../language-reference/domain-modifiers/PTR.md): ✅ - - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❔ + - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❌ - Service discovery - - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❔ - - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❔ + - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❌ + - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❌ - [`SRV`](../language-reference/domain-modifiers/SRV.md): ✅ - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ✅ - Security - [`CAA`](../language-reference/domain-modifiers/CAA.md): ✅ - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ✅ - - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❔ + - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❌ - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ✅ - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ✅ - DNSSEC - [`AUTODNSSEC`](../language-reference/domain-modifiers/AUTODNSSEC_ON.md): ❔ - - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❔ - - [`DS`](../language-reference/domain-modifiers/DS.md): ❔ + - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❌ + - [`DS`](../language-reference/domain-modifiers/DS.md): ❌ diff --git a/documentation/provider/dnsimple.md b/documentation/provider/dnsimple.md index 093465d2b7..b7b6a3c916 100644 --- a/documentation/provider/dnsimple.md +++ b/documentation/provider/dnsimple.md @@ -75,23 +75,23 @@ Set `DNSIMPLE_DEBUG_HTTP` environment variable to `1` to dump all API calls made - [get-zones](../commands/get-zones.md): ✅ - DNS extensions - [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md): ✅ - - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❔ + - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❌ - [`LOC`](../language-reference/domain-modifiers/LOC.md): ❌ - [`PTR`](../language-reference/domain-modifiers/PTR.md): ✅ - - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❔ + - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❌ - Service discovery - - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❔ + - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❌ - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ✅ - [`SRV`](../language-reference/domain-modifiers/SRV.md): ✅ - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ✅ - Security - [`CAA`](../language-reference/domain-modifiers/CAA.md): ✅ - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ✅ - - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❔ + - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❌ - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ✅ - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ✅ - DNSSEC - [`AUTODNSSEC`](../language-reference/domain-modifiers/AUTODNSSEC_ON.md): ✅ - - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❔ + - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❌ - [`DS`](../language-reference/domain-modifiers/DS.md): ❌ diff --git a/documentation/provider/dnsmadeeasy.md b/documentation/provider/dnsmadeeasy.md index 38f85add59..996b8c8bf4 100644 --- a/documentation/provider/dnsmadeeasy.md +++ b/documentation/provider/dnsmadeeasy.md @@ -103,24 +103,24 @@ go test -v -test.timeout 2h -args -verbose -profile DNSMADEEASY - [get-zones](../commands/get-zones.md): ✅ - DNS extensions - [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md): ✅ - - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❔ + - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❌ - [`LOC`](../language-reference/domain-modifiers/LOC.md): ❌ - [`PTR`](../language-reference/domain-modifiers/PTR.md): ✅ - - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❔ + - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❌ - Service discovery - - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❔ - - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❔ + - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❌ + - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❌ - [`SRV`](../language-reference/domain-modifiers/SRV.md): ✅ - - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❔ + - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❌ - Security - [`CAA`](../language-reference/domain-modifiers/CAA.md): ✅ - - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❔ - - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❔ + - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❌ + - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❌ - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ❌ - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ❌ - DNSSEC - [`AUTODNSSEC`](../language-reference/domain-modifiers/AUTODNSSEC_ON.md): ❔ - - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❔ + - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❌ - [`DS`](../language-reference/domain-modifiers/DS.md): ❌ diff --git a/documentation/provider/dnsoverhttps.md b/documentation/provider/dnsoverhttps.md index 39055201be..856f9200b5 100644 --- a/documentation/provider/dnsoverhttps.md +++ b/documentation/provider/dnsoverhttps.md @@ -71,24 +71,24 @@ these are the same thing but there may be situations where they are not. - create-domains: ❌ - [get-zones](../commands/get-zones.md): ❌ - DNS extensions - - [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md): ❔ - - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❔ - - [`LOC`](../language-reference/domain-modifiers/LOC.md): ❔ - - [`PTR`](../language-reference/domain-modifiers/PTR.md): ❔ - - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❔ + - [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md): ❌ + - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❌ + - [`LOC`](../language-reference/domain-modifiers/LOC.md): ❌ + - [`PTR`](../language-reference/domain-modifiers/PTR.md): ❌ + - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❌ - Service discovery - - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❔ - - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❔ - - [`SRV`](../language-reference/domain-modifiers/SRV.md): ❔ - - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❔ + - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❌ + - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❌ + - [`SRV`](../language-reference/domain-modifiers/SRV.md): ❌ + - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❌ - Security - - [`CAA`](../language-reference/domain-modifiers/CAA.md): ❔ - - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❔ - - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❔ - - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ❔ - - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ❔ + - [`CAA`](../language-reference/domain-modifiers/CAA.md): ❌ + - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❌ + - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❌ + - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ❌ + - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ❌ - DNSSEC - [`AUTODNSSEC`](../language-reference/domain-modifiers/AUTODNSSEC_ON.md): ❔ - - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❔ - - [`DS`](../language-reference/domain-modifiers/DS.md): ❔ + - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❌ + - [`DS`](../language-reference/domain-modifiers/DS.md): ❌ diff --git a/documentation/provider/domainnameshop.md b/documentation/provider/domainnameshop.md index 509b4d7ab1..7d06ba8502 100644 --- a/documentation/provider/domainnameshop.md +++ b/documentation/provider/domainnameshop.md @@ -55,23 +55,23 @@ D("example.com", REG_NONE, DnsProvider(DSP_DOMAINNAMESHOP), - [get-zones](../commands/get-zones.md): ❌ - DNS extensions - [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md): ❔ - - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❔ + - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❌ - [`LOC`](../language-reference/domain-modifiers/LOC.md): ❌ - [`PTR`](../language-reference/domain-modifiers/PTR.md): ❌ - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❌ - Service discovery - - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❔ + - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❌ - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❌ - [`SRV`](../language-reference/domain-modifiers/SRV.md): ✅ - - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❔ + - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❌ - Security - [`CAA`](../language-reference/domain-modifiers/CAA.md): ✅ - - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❔ - - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❔ + - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❌ + - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❌ - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ❌ - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ❔ - DNSSEC - [`AUTODNSSEC`](../language-reference/domain-modifiers/AUTODNSSEC_ON.md): ❌ - - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❔ + - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❌ - [`DS`](../language-reference/domain-modifiers/DS.md): ❔ diff --git a/documentation/provider/dynadot.md b/documentation/provider/dynadot.md index 9a84b511d2..969331897c 100644 --- a/documentation/provider/dynadot.md +++ b/documentation/provider/dynadot.md @@ -53,24 +53,24 @@ You must [enable the Dynadot API](https://www.dynadot.com/account/domain/setting - create-domains: ❌ - [get-zones](../commands/get-zones.md): ❌ - DNS extensions - - [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md): ❔ - - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❔ - - [`LOC`](../language-reference/domain-modifiers/LOC.md): ❔ - - [`PTR`](../language-reference/domain-modifiers/PTR.md): ❔ - - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❔ + - [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md): ❌ + - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❌ + - [`LOC`](../language-reference/domain-modifiers/LOC.md): ❌ + - [`PTR`](../language-reference/domain-modifiers/PTR.md): ❌ + - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❌ - Service discovery - - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❔ - - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❔ - - [`SRV`](../language-reference/domain-modifiers/SRV.md): ❔ - - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❔ + - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❌ + - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❌ + - [`SRV`](../language-reference/domain-modifiers/SRV.md): ❌ + - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❌ - Security - - [`CAA`](../language-reference/domain-modifiers/CAA.md): ❔ - - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❔ - - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❔ - - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ❔ - - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ❔ + - [`CAA`](../language-reference/domain-modifiers/CAA.md): ❌ + - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❌ + - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❌ + - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ❌ + - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ❌ - DNSSEC - [`AUTODNSSEC`](../language-reference/domain-modifiers/AUTODNSSEC_ON.md): ❔ - - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❔ - - [`DS`](../language-reference/domain-modifiers/DS.md): ❔ + - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❌ + - [`DS`](../language-reference/domain-modifiers/DS.md): ❌ diff --git a/documentation/provider/dynu.md b/documentation/provider/dynu.md index a08b6541ee..95d920f954 100644 --- a/documentation/provider/dynu.md +++ b/documentation/provider/dynu.md @@ -125,7 +125,7 @@ MX records with a null target (RFC 7505, priority 0, target `.`) are fully suppo - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ✅ - [`LOC`](../language-reference/domain-modifiers/LOC.md): ✅ - [`PTR`](../language-reference/domain-modifiers/PTR.md): ✅ - - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❔ + - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❌ - Service discovery - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ✅ - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ✅ @@ -139,6 +139,6 @@ MX records with a null target (RFC 7505, priority 0, target `.`) are fully suppo - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ✅ - DNSSEC - [`AUTODNSSEC`](../language-reference/domain-modifiers/AUTODNSSEC_ON.md): ❌ - - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❔ - - [`DS`](../language-reference/domain-modifiers/DS.md): ❔ + - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❌ + - [`DS`](../language-reference/domain-modifiers/DS.md): ❌ diff --git a/documentation/provider/easyname.md b/documentation/provider/easyname.md index d092db359c..1441635bd0 100644 --- a/documentation/provider/easyname.md +++ b/documentation/provider/easyname.md @@ -56,24 +56,24 @@ You must enable API-Access for your account. - create-domains: ❌ - [get-zones](../commands/get-zones.md): ❌ - DNS extensions - - [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md): ❔ - - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❔ - - [`LOC`](../language-reference/domain-modifiers/LOC.md): ❔ - - [`PTR`](../language-reference/domain-modifiers/PTR.md): ❔ - - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❔ + - [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md): ❌ + - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❌ + - [`LOC`](../language-reference/domain-modifiers/LOC.md): ❌ + - [`PTR`](../language-reference/domain-modifiers/PTR.md): ❌ + - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❌ - Service discovery - - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❔ - - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❔ - - [`SRV`](../language-reference/domain-modifiers/SRV.md): ❔ - - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❔ + - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❌ + - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❌ + - [`SRV`](../language-reference/domain-modifiers/SRV.md): ❌ + - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❌ - Security - - [`CAA`](../language-reference/domain-modifiers/CAA.md): ❔ - - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❔ - - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❔ - - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ❔ - - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ❔ + - [`CAA`](../language-reference/domain-modifiers/CAA.md): ❌ + - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❌ + - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❌ + - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ❌ + - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ❌ - DNSSEC - [`AUTODNSSEC`](../language-reference/domain-modifiers/AUTODNSSEC_ON.md): ❔ - - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❔ - - [`DS`](../language-reference/domain-modifiers/DS.md): ❔ + - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❌ + - [`DS`](../language-reference/domain-modifiers/DS.md): ❌ diff --git a/documentation/provider/exoscale.md b/documentation/provider/exoscale.md index b94557f26f..c993c87404 100644 --- a/documentation/provider/exoscale.md +++ b/documentation/provider/exoscale.md @@ -32,23 +32,23 @@ D("example.com", REG_NONE, DnsProvider(DSP_EXOSCALE), - [get-zones](../commands/get-zones.md): ❌ - DNS extensions - [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md): ✅ - - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❔ + - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❌ - [`LOC`](../language-reference/domain-modifiers/LOC.md): ❌ - [`PTR`](../language-reference/domain-modifiers/PTR.md): ❌ - - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❔ + - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❌ - Service discovery - - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❔ - - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❔ + - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❌ + - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❌ - [`SRV`](../language-reference/domain-modifiers/SRV.md): ✅ - - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❔ + - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❌ - Security - [`CAA`](../language-reference/domain-modifiers/CAA.md): ✅ - - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❔ - - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❔ - - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ❔ + - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❌ + - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❌ + - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ❌ - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ❌ - DNSSEC - [`AUTODNSSEC`](../language-reference/domain-modifiers/AUTODNSSEC_ON.md): ❔ - - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❔ - - [`DS`](../language-reference/domain-modifiers/DS.md): ❔ + - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❌ + - [`DS`](../language-reference/domain-modifiers/DS.md): ❌ diff --git a/documentation/provider/gandiv5.md b/documentation/provider/gandiv5.md index c48970863f..4b368c39d3 100644 --- a/documentation/provider/gandiv5.md +++ b/documentation/provider/gandiv5.md @@ -118,23 +118,23 @@ Set `apiurl` key to the endpoint url for the sandbox (https://api.sandbox.gandi. - [get-zones](../commands/get-zones.md): ✅ - DNS extensions - [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md): ✅ - - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❔ + - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❌ - [`LOC`](../language-reference/domain-modifiers/LOC.md): ✅ - [`PTR`](../language-reference/domain-modifiers/PTR.md): ✅ - - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❔ + - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❌ - Service discovery - - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❔ + - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❌ - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ✅ - [`SRV`](../language-reference/domain-modifiers/SRV.md): ✅ - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ✅ - Security - [`CAA`](../language-reference/domain-modifiers/CAA.md): ✅ - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ✅ - - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❔ + - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❌ - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ✅ - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ✅ - DNSSEC - [`AUTODNSSEC`](../language-reference/domain-modifiers/AUTODNSSEC_ON.md): ❔ - - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❔ + - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❌ - [`DS`](../language-reference/domain-modifiers/DS.md): ❌ diff --git a/documentation/provider/gcloud.md b/documentation/provider/gcloud.md index 90a5926787..6d0a985658 100644 --- a/documentation/provider/gcloud.md +++ b/documentation/provider/gcloud.md @@ -177,23 +177,23 @@ You can test your `creds.json` entry with the command: `dnscontrol check-creds f - [get-zones](../commands/get-zones.md): ✅ - DNS extensions - [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md): ✅ - - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❔ + - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❌ - [`LOC`](../language-reference/domain-modifiers/LOC.md): ❌ - [`PTR`](../language-reference/domain-modifiers/PTR.md): ✅ - - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❔ + - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❌ - Service discovery - - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❔ - - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❔ + - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❌ + - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❌ - [`SRV`](../language-reference/domain-modifiers/SRV.md): ✅ - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ✅ - Security - [`CAA`](../language-reference/domain-modifiers/CAA.md): ✅ - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ✅ - - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❔ + - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❌ - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ✅ - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ✅ - DNSSEC - [`AUTODNSSEC`](../language-reference/domain-modifiers/AUTODNSSEC_ON.md): ✅ - - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❔ - - [`DS`](../language-reference/domain-modifiers/DS.md): ❔ + - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❌ + - [`DS`](../language-reference/domain-modifiers/DS.md): ❌ diff --git a/documentation/provider/gcore.md b/documentation/provider/gcore.md index 9ad0cc95cc..f8b6ac954b 100644 --- a/documentation/provider/gcore.md +++ b/documentation/provider/gcore.md @@ -169,23 +169,23 @@ You can obtain your API token on this page: diff --git a/documentation/provider/gidinet.md b/documentation/provider/gidinet.md index 66d181fe59..5a29416b11 100644 --- a/documentation/provider/gidinet.md +++ b/documentation/provider/gidinet.md @@ -209,7 +209,7 @@ The provider does not support concurrent API operations. Changes are applied seq - Security - [`CAA`](../language-reference/domain-modifiers/CAA.md): ❌ - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❌ - - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❔ + - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❌ - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ❌ - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ❌ - DNSSEC diff --git a/documentation/provider/gigahost.md b/documentation/provider/gigahost.md index b03cd71c0f..916ee51c6d 100644 --- a/documentation/provider/gigahost.md +++ b/documentation/provider/gigahost.md @@ -117,22 +117,22 @@ sequentially. - DNS extensions - [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md): ✅ - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ✅ - - [`LOC`](../language-reference/domain-modifiers/LOC.md): ❔ + - [`LOC`](../language-reference/domain-modifiers/LOC.md): ❌ - [`PTR`](../language-reference/domain-modifiers/PTR.md): ✅ - - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❔ + - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❌ - Service discovery - - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❔ + - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❌ - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ✅ - [`SRV`](../language-reference/domain-modifiers/SRV.md): ✅ - - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❔ + - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❌ - Security - [`CAA`](../language-reference/domain-modifiers/CAA.md): ✅ - - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❔ - - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❔ - - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ❔ - - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ❔ + - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❌ + - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❌ + - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ❌ + - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ❌ - DNSSEC - [`AUTODNSSEC`](../language-reference/domain-modifiers/AUTODNSSEC_ON.md): ❔ - - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❔ - - [`DS`](../language-reference/domain-modifiers/DS.md): ❔ + - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❌ + - [`DS`](../language-reference/domain-modifiers/DS.md): ❌ diff --git a/documentation/provider/hetznerv2.md b/documentation/provider/hetznerv2.md index 48eb1bdcd1..29bb71d501 100644 --- a/documentation/provider/hetznerv2.md +++ b/documentation/provider/hetznerv2.md @@ -62,23 +62,23 @@ Hetzner DNS API does not allow changing the SOA record via their API. There is a - [get-zones](../commands/get-zones.md): ✅ - DNS extensions - [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md): ❌ - - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❔ + - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❌ - [`LOC`](../language-reference/domain-modifiers/LOC.md): ❌ - [`PTR`](../language-reference/domain-modifiers/PTR.md): ✅ - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❌ - Service discovery - - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❔ + - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❌ - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❌ - [`SRV`](../language-reference/domain-modifiers/SRV.md): ✅ - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ✅ - Security - [`CAA`](../language-reference/domain-modifiers/CAA.md): ✅ - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ✅ - - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❔ + - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❌ - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ❌ - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ✅ - DNSSEC - [`AUTODNSSEC`](../language-reference/domain-modifiers/AUTODNSSEC_ON.md): ❌ - - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❔ + - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❌ - [`DS`](../language-reference/domain-modifiers/DS.md): ✅ diff --git a/documentation/provider/hostingde.md b/documentation/provider/hostingde.md index 472275359c..7850860662 100644 --- a/documentation/provider/hostingde.md +++ b/documentation/provider/hostingde.md @@ -100,23 +100,23 @@ The address may not end in a period; the API rejects that. - [get-zones](../commands/get-zones.md): ✅ - DNS extensions - [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md): ✅ - - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❔ + - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❌ - [`LOC`](../language-reference/domain-modifiers/LOC.md): ❌ - [`PTR`](../language-reference/domain-modifiers/PTR.md): ✅ - [`SOA`](../language-reference/domain-modifiers/SOA.md): ✅ - Service discovery - - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❔ + - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❌ - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❌ - [`SRV`](../language-reference/domain-modifiers/SRV.md): ✅ - - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❔ + - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❌ - Security - [`CAA`](../language-reference/domain-modifiers/CAA.md): ✅ - - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❔ - - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❔ + - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❌ + - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❌ - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ✅ - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ✅ - DNSSEC - [`AUTODNSSEC`](../language-reference/domain-modifiers/AUTODNSSEC_ON.md): ✅ - - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❔ + - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❌ - [`DS`](../language-reference/domain-modifiers/DS.md): ✅ diff --git a/documentation/provider/huaweicloud.md b/documentation/provider/huaweicloud.md index 79bd23539c..0b4c2502f5 100644 --- a/documentation/provider/huaweicloud.md +++ b/documentation/provider/huaweicloud.md @@ -119,23 +119,23 @@ If a domain does not exist in your Huawei Cloud account, DNSControl will automat - [get-zones](../commands/get-zones.md): ✅ - DNS extensions - [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md): ❌ - - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❔ + - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❌ - [`LOC`](../language-reference/domain-modifiers/LOC.md): ❌ - [`PTR`](../language-reference/domain-modifiers/PTR.md): ❌ - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❌ - Service discovery - - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❔ + - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❌ - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❌ - [`SRV`](../language-reference/domain-modifiers/SRV.md): ✅ - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❌ - Security - [`CAA`](../language-reference/domain-modifiers/CAA.md): ✅ - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❌ - - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❔ + - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❌ - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ❌ - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ❌ - DNSSEC - [`AUTODNSSEC`](../language-reference/domain-modifiers/AUTODNSSEC_ON.md): ✅ - - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❔ + - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❌ - [`DS`](../language-reference/domain-modifiers/DS.md): ❌ diff --git a/documentation/provider/index.md b/documentation/provider/index.md index 7eaf6b9c49..a515f3ec5f 100644 --- a/documentation/provider/index.md +++ b/documentation/provider/index.md @@ -182,272 +182,320 @@ Jump to a table: | Provider name | [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md) | [`DNAME`](../language-reference/domain-modifiers/DNAME.md) | [`LOC`](../language-reference/domain-modifiers/LOC.md) | [`PTR`](../language-reference/domain-modifiers/PTR.md) | [`SOA`](../language-reference/domain-modifiers/SOA.md) | | ------------- | ---------------------------------------------------------- | ---------------------------------------------------------- | ------------------------------------------------------ | ------------------------------------------------------ | ------------------------------------------------------ | -| [`ADGUARDHOME`](adguardhome.md) | ✅ | ❔ | ❔ | ❔ | ❔ | -| [`AKAMAIEDGEDNS`](akamaiedgedns.md) | ✅ | ❔ | ✅ | ✅ | ❌ | -| [`ALIDNS`](alidns.md) | ❌ | ❔ | ❔ | ❌ | ❔ | -| [`AUTODNS`](autodns.md) | ✅ | ❔ | ❔ | ✅ | ❔ | +| [`ADGUARDHOME`](adguardhome.md) | ✅ | ❌ | ❌ | ❌ | ❌ | +| [`AKAMAIEDGEDNS`](akamaiedgedns.md) | ✅ | ❌ | ✅ | ✅ | ❌ | +| [`ALIDNS`](alidns.md) | ❌ | ❌ | ❌ | ❌ | ❌ | +| [`AUTODNS`](autodns.md) | ✅ | ❌ | ❌ | ✅ | ❌ | | [`AXFRDDNS`](axfrddns.md) | ❌ | ✅ | ✅ | ✅ | ❌ | -| [`AZURE_DNS`](azuredns.md) | ❌ | ❔ | ❌ | ✅ | ❔ | -| [`AZURE_PRIVATE_DNS`](azureprivatedns.md) | ❌ | ❌ | ❌ | ✅ | ❔ | +| [`AZURE_DNS`](azuredns.md) | ❌ | ❌ | ❌ | ✅ | ❌ | +| [`AZURE_PRIVATE_DNS`](azureprivatedns.md) | ❌ | ❌ | ❌ | ✅ | ❌ | | [`BIND`](bind.md) | ✅ | ✅ | ✅ | ✅ | ✅ | -| [`BUNNY_DNS`](bunnydns.md) | ✅ | ❔ | ❌ | ✅ | ❌ | -| [`CLOUDFLAREAPI`](cloudflareapi.md) | ✅ | ❔ | ✅ | ✅ | ❔ | +| [`BUNNY_DNS`](bunnydns.md) | ✅ | ❌ | ❌ | ✅ | ❌ | +| [`CLOUDFLAREAPI`](cloudflareapi.md) | ✅ | ❌ | ✅ | ✅ | ❌ | | [`CLOUDNS`](cloudns.md) | ✅ | ✅ | ✅ | ✅ | ❔ | | [`CNR`](cnr.md) | ✅ | ✅ | ✅ | ✅ | ❌ | -| [`DESEC`](desec.md) | ❔ | ❔ | ✅ | ✅ | ❔ | +| [`CSCGLOBAL`](cscglobal.md) | ❌ | ❌ | ❌ | ❌ | ❌ | +| [`DESEC`](desec.md) | ❔ | ❌ | ✅ | ✅ | ❌ | | [`DIGITALOCEAN`](digitalocean.md) | ❌ | ❌ | ❌ | ❌ | ❌ | -| [`DNSCALE`](dnscale.md) | ✅ | ❔ | ❌ | ✅ | ❔ | -| [`DNSIMPLE`](dnsimple.md) | ✅ | ❔ | ❌ | ✅ | ❔ | -| [`DNSMADEEASY`](dnsmadeeasy.md) | ✅ | ❔ | ❌ | ✅ | ❔ | -| [`DOMAINNAMESHOP`](domainnameshop.md) | ❔ | ❔ | ❌ | ❌ | ❌ | -| [`DYNU`](dynu.md) | ❌ | ✅ | ✅ | ✅ | ❔ | -| [`EXOSCALE`](exoscale.md) | ✅ | ❔ | ❌ | ❌ | ❔ | +| [`DNSCALE`](dnscale.md) | ✅ | ❌ | ❌ | ✅ | ❌ | +| [`DNSIMPLE`](dnsimple.md) | ✅ | ❌ | ❌ | ✅ | ❌ | +| [`DNSMADEEASY`](dnsmadeeasy.md) | ✅ | ❌ | ❌ | ✅ | ❌ | +| [`DNSOVERHTTPS`](dnsoverhttps.md) | ❌ | ❌ | ❌ | ❌ | ❌ | +| [`DOMAINNAMESHOP`](domainnameshop.md) | ❔ | ❌ | ❌ | ❌ | ❌ | +| [`DYNADOT`](dynadot.md) | ❌ | ❌ | ❌ | ❌ | ❌ | +| [`DYNU`](dynu.md) | ❌ | ✅ | ✅ | ✅ | ❌ | +| [`EASYNAME`](easyname.md) | ❌ | ❌ | ❌ | ❌ | ❌ | +| [`EXOSCALE`](exoscale.md) | ✅ | ❌ | ❌ | ❌ | ❌ | | [`FORTIGATE`](fortigate.md) | ❌ | ❌ | ❌ | ❌ | ❌ | -| [`GANDI_V5`](gandiv5.md) | ✅ | ❔ | ✅ | ✅ | ❔ | -| [`GCLOUD`](gcloud.md) | ✅ | ❔ | ❌ | ✅ | ❔ | -| [`GCORE`](gcore.md) | ✅ | ❔ | ❌ | ✅ | ❔ | +| [`GANDI_V5`](gandiv5.md) | ✅ | ❌ | ✅ | ✅ | ❌ | +| [`GCLOUD`](gcloud.md) | ✅ | ❌ | ❌ | ✅ | ❌ | +| [`GCORE`](gcore.md) | ✅ | ❌ | ❌ | ✅ | ❌ | | [`GIDINET`](gidinet.md) | ❌ | ❌ | ❌ | ❌ | ❌ | -| [`GIGAHOST`](gigahost.md) | ✅ | ✅ | ❔ | ✅ | ❔ | +| [`GIGAHOST`](gigahost.md) | ✅ | ✅ | ❌ | ✅ | ❌ | | [`HEDNS`](hedns.md) | ✅ | ❌ | ✅ | ✅ | ❌ | -| [`HETZNER_V2`](hetznerv2.md) | ❌ | ❔ | ❌ | ✅ | ❌ | -| [`HOSTINGDE`](hostingde.md) | ✅ | ❔ | ❌ | ✅ | ✅ | -| [`HUAWEICLOUD`](huaweicloud.md) | ❌ | ❔ | ❌ | ❌ | ❌ | -| [`INFOBLOX`](infoblox.md) | ❔ | ❔ | ❔ | ✅ | ❔ | -| [`INFOMANIAK`](infomaniak.md) | ❔ | ✅ | ❔ | ❔ | ❔ | -| [`INWX`](inwx.md) | ✅ | ❔ | ❔ | ✅ | ❔ | -| [`JOKER`](joker.md) | ❌ | ❔ | ❌ | ❌ | ❌ | -| [`LINODE`](linode.md) | ❔ | ❔ | ❌ | ❔ | ❔ | -| [`LOOPIA`](loopia.md) | ❌ | ❔ | ✅ | ❌ | ❌ | -| [`LUADNS`](luadns.md) | ✅ | ❔ | ❌ | ✅ | ❔ | -| [`MIKROTIK`](mikrotik.md) | ❌ | ❔ | ❌ | ❌ | ❌ | +| [`HETZNER_V2`](hetznerv2.md) | ❌ | ❌ | ❌ | ✅ | ❌ | +| [`HOSTINGDE`](hostingde.md) | ✅ | ❌ | ❌ | ✅ | ✅ | +| [`HUAWEICLOUD`](huaweicloud.md) | ❌ | ❌ | ❌ | ❌ | ❌ | +| [`INFOBLOX`](infoblox.md) | ❌ | ❌ | ❌ | ✅ | ❌ | +| [`INFOMANIAK`](infomaniak.md) | ❌ | ✅ | ❌ | ❌ | ❌ | +| [`INTERNETBS`](internetbs.md) | ❌ | ❌ | ❌ | ❌ | ❌ | +| [`INWX`](inwx.md) | ✅ | ❌ | ❔ | ✅ | ❌ | +| [`JOKER`](joker.md) | ❌ | ❌ | ❌ | ❌ | ❌ | +| [`LINODE`](linode.md) | ❌ | ❌ | ❌ | ❌ | ❌ | +| [`LOOPIA`](loopia.md) | ❌ | ❌ | ✅ | ❌ | ❌ | +| [`LUADNS`](luadns.md) | ✅ | ❌ | ❌ | ✅ | ❌ | +| [`MIKROTIK`](mikrotik.md) | ❌ | ❌ | ❌ | ❌ | ❌ | | [`MITTWALD`](mittwald.md) | ❌ | ❌ | ❌ | ❌ | ❌ | -| [`MYTHICBEASTS`](mythicbeasts.md) | ❌ | ❔ | ❌ | ✅ | ❔ | -| [`NAMECHEAP`](namecheap.md) | ✅ | ❔ | ❌ | ❌ | ❔ | -| [`NAMEDOTCOM`](namedotcom.md) | ✅ | ❔ | ❌ | ❌ | ❔ | +| [`MYTHICBEASTS`](mythicbeasts.md) | ❌ | ❌ | ❌ | ✅ | ❌ | +| [`NAMECHEAP`](namecheap.md) | ✅ | ❌ | ❌ | ❌ | ❌ | +| [`NAMEDOTCOM`](namedotcom.md) | ✅ | ❌ | ❌ | ❌ | ❌ | | [`NETBIRD`](netbird.md) | ❌ | ❌ | ❌ | ❌ | ❌ | -| [`NETCUP`](netcup.md) | ❔ | ❔ | ❌ | ❌ | ❔ | -| [`NETLIFY`](netlify.md) | ✅ | ❔ | ❌ | ❌ | ❔ | +| [`NETCUP`](netcup.md) | ❌ | ❌ | ❌ | ❌ | ❌ | +| [`NETLIFY`](netlify.md) | ✅ | ❌ | ❌ | ❌ | ❌ | | [`NETNOD`](netnod.md) | ✅ | ❌ | ❌ | ✅ | ❌ | | [`NEXDNS`](nexdns.md) | ✅ | ✅ | ❌ | ✅ | ❌ | -| [`NS1`](ns1.md) | ✅ | ✅ | ❌ | ✅ | ❔ | +| [`NS1`](ns1.md) | ✅ | ✅ | ❌ | ✅ | ❌ | | [`OPENPROVIDER`](openprovider.md) | ❌ | ❌ | ❌ | ❌ | ❌ | -| [`OPENWRT`](openwrt.md) | ❌ | ❔ | ❔ | ❔ | ❔ | -| [`ORACLE`](oracle.md) | ✅ | ❔ | ❔ | ✅ | ❔ | -| [`OVH`](ovh.md) | ❌ | ❔ | ❔ | ❌ | ❔ | -| [`PACKETFRAME`](packetframe.md) | ❔ | ❔ | ❔ | ✅ | ❔ | -| [`PORKBUN`](porkbun.md) | ✅ | ❔ | ❌ | ❌ | ❌ | +| [`OPENSRS`](opensrs.md) | ❌ | ❌ | ❌ | ❌ | ❌ | +| [`OPENWRT`](openwrt.md) | ❌ | ❌ | ❌ | ❌ | ❌ | +| [`ORACLE`](oracle.md) | ✅ | ❌ | ❔ | ✅ | ❌ | +| [`OVH`](ovh.md) | ❌ | ❌ | ❔ | ❌ | ❌ | +| [`PACKETFRAME`](packetframe.md) | ❌ | ❌ | ❌ | ✅ | ❌ | +| [`PORKBUN`](porkbun.md) | ✅ | ❌ | ❌ | ❌ | ❌ | | [`POWERDNS`](powerdns.md) | ✅ | ✅ | ❔ | ✅ | ✅ | -| [`REALTIMEREGISTER`](realtimeregister.md) | ✅ | ❔ | ✅ | ❌ | ❌ | -| [`ROUTE53`](route53.md) | ❌ | ❔ | ❌ | ✅ | ✅ | -| [`RWTH`](rwth.md) | ❌ | ❔ | ❌ | ✅ | ❔ | +| [`REALTIMEREGISTER`](realtimeregister.md) | ✅ | ❌ | ✅ | ❌ | ❌ | +| [`ROUTE53`](route53.md) | ❌ | ❌ | ❌ | ✅ | ✅ | +| [`RWTH`](rwth.md) | ❌ | ❌ | ❌ | ✅ | ❌ | | [`SAKURACLOUD`](sakuracloud.md) | ✅ | ❌ | ❌ | ✅ | ❌ | | [`SCALEWAY`](scaleway.md) | ✅ | ✅ | ❌ | ❌ | ❌ | -| [`SOFTLAYER`](softlayer.md) | ❔ | ❔ | ❌ | ❔ | ❔ | -| [`SPACESHIP`](spaceship.md) | ✅ | ❔ | ❌ | ✅ | ❌ | -| [`TENCENTDNS`](tencentdns.md) | ❌ | ❔ | ❔ | ❌ | ❔ | +| [`SOFTLAYER`](softlayer.md) | ❌ | ❌ | ❌ | ❌ | ❌ | +| [`SPACESHIP`](spaceship.md) | ✅ | ❌ | ❌ | ✅ | ❌ | +| [`TENCENTDNS`](tencentdns.md) | ❌ | ❌ | ❌ | ❌ | ❌ | | [`TRANSIP`](transip.md) | ✅ | ❌ | ❌ | ❌ | ❌ | -| [`UNIFI`](unifi.md) | ❌ | ❔ | ❌ | ❌ | ❔ | +| [`UNIFI`](unifi.md) | ❌ | ❌ | ❌ | ❌ | ❌ | | [`VERCEL`](vercel.md) | ✅ | ❌ | ❌ | ❌ | ❌ | -| [`VULTR`](vultr.md) | ❌ | ❔ | ❌ | ❌ | ❔ | -| [`WEBSUPPORT`](websupport.md) | ❌ | ❔ | ❌ | ❌ | ❌ | +| [`VULTR`](vultr.md) | ❌ | ❌ | ❌ | ❌ | ❌ | +| [`WEBSUPPORT`](websupport.md) | ❌ | ❌ | ❌ | ❌ | ❌ | ### Service discovery | Provider name | [`DHCID`](../language-reference/domain-modifiers/DHCID.md) | [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md) | [`SRV`](../language-reference/domain-modifiers/SRV.md) | [`SVCB`](../language-reference/domain-modifiers/SVCB.md) | | ------------- | ---------------------------------------------------------- | ---------------------------------------------------------- | ------------------------------------------------------ | -------------------------------------------------------- | -| [`AKAMAIEDGEDNS`](akamaiedgedns.md) | ❔ | ✅ | ✅ | ❔ | -| [`ALIDNS`](alidns.md) | ❔ | ❌ | ✅ | ❔ | -| [`AUTODNS`](autodns.md) | ❔ | ❔ | ✅ | ❔ | +| [`ADGUARDHOME`](adguardhome.md) | ❌ | ❌ | ❌ | ❌ | +| [`AKAMAIEDGEDNS`](akamaiedgedns.md) | ❌ | ✅ | ✅ | ❌ | +| [`ALIDNS`](alidns.md) | ❌ | ❌ | ✅ | ❌ | +| [`AUTODNS`](autodns.md) | ❌ | ❌ | ✅ | ❌ | | [`AXFRDDNS`](axfrddns.md) | ✅ | ✅ | ✅ | ✅ | -| [`AZURE_DNS`](azuredns.md) | ❔ | ❌ | ✅ | ❔ | -| [`AZURE_PRIVATE_DNS`](azureprivatedns.md) | ❌ | ❌ | ✅ | ❔ | +| [`AZURE_DNS`](azuredns.md) | ❌ | ❌ | ✅ | ❌ | +| [`AZURE_PRIVATE_DNS`](azureprivatedns.md) | ❌ | ❌ | ✅ | ❌ | | [`BIND`](bind.md) | ✅ | ✅ | ✅ | ✅ | | [`BUNNY_DNS`](bunnydns.md) | ❌ | ❌ | ✅ | ✅ | -| [`CLOUDFLAREAPI`](cloudflareapi.md) | ❔ | ✅ | ✅ | ✅ | +| [`CLOUDFLAREAPI`](cloudflareapi.md) | ❌ | ✅ | ✅ | ✅ | | [`CLOUDNS`](cloudns.md) | ❌ | ✅ | ✅ | ❌ | | [`CNR`](cnr.md) | ✅ | ✅ | ✅ | ✅ | -| [`CSCGLOBAL`](cscglobal.md) | ❔ | ❔ | ✅ | ❔ | -| [`DESEC`](desec.md) | ❔ | ✅ | ✅ | ✅ | +| [`CSCGLOBAL`](cscglobal.md) | ❌ | ❌ | ✅ | ❌ | +| [`DESEC`](desec.md) | ❌ | ✅ | ✅ | ✅ | | [`DIGITALOCEAN`](digitalocean.md) | ❌ | ❌ | ✅ | ❌ | -| [`DNSCALE`](dnscale.md) | ❔ | ❔ | ✅ | ✅ | -| [`DNSIMPLE`](dnsimple.md) | ❔ | ✅ | ✅ | ✅ | -| [`DNSMADEEASY`](dnsmadeeasy.md) | ❔ | ❔ | ✅ | ❔ | -| [`DOMAINNAMESHOP`](domainnameshop.md) | ❔ | ❌ | ✅ | ❔ | +| [`DNSCALE`](dnscale.md) | ❌ | ❌ | ✅ | ✅ | +| [`DNSIMPLE`](dnsimple.md) | ❌ | ✅ | ✅ | ✅ | +| [`DNSMADEEASY`](dnsmadeeasy.md) | ❌ | ❌ | ✅ | ❌ | +| [`DNSOVERHTTPS`](dnsoverhttps.md) | ❌ | ❌ | ❌ | ❌ | +| [`DOMAINNAMESHOP`](domainnameshop.md) | ❌ | ❌ | ✅ | ❌ | +| [`DYNADOT`](dynadot.md) | ❌ | ❌ | ❌ | ❌ | | [`DYNU`](dynu.md) | ✅ | ✅ | ✅ | ✅ | -| [`EXOSCALE`](exoscale.md) | ❔ | ❔ | ✅ | ❔ | +| [`EASYNAME`](easyname.md) | ❌ | ❌ | ❌ | ❌ | +| [`EXOSCALE`](exoscale.md) | ❌ | ❌ | ✅ | ❌ | | [`FORTIGATE`](fortigate.md) | ❌ | ❌ | ❌ | ❌ | -| [`GANDI_V5`](gandiv5.md) | ❔ | ✅ | ✅ | ✅ | -| [`GCLOUD`](gcloud.md) | ❔ | ❔ | ✅ | ✅ | -| [`GCORE`](gcore.md) | ❔ | ❌ | ✅ | ✅ | +| [`GANDI_V5`](gandiv5.md) | ❌ | ✅ | ✅ | ✅ | +| [`GCLOUD`](gcloud.md) | ❌ | ❌ | ✅ | ✅ | +| [`GCORE`](gcore.md) | ❌ | ❌ | ✅ | ✅ | | [`GIDINET`](gidinet.md) | ❌ | ❌ | ✅ | ❌ | -| [`GIGAHOST`](gigahost.md) | ❔ | ✅ | ✅ | ❔ | +| [`GIGAHOST`](gigahost.md) | ❌ | ✅ | ✅ | ❌ | | [`HEDNS`](hedns.md) | ❌ | ✅ | ✅ | ✅ | -| [`HETZNER_V2`](hetznerv2.md) | ❔ | ❌ | ✅ | ✅ | -| [`HOSTINGDE`](hostingde.md) | ❔ | ❌ | ✅ | ❔ | -| [`HUAWEICLOUD`](huaweicloud.md) | ❔ | ❌ | ✅ | ❌ | -| [`INFOBLOX`](infoblox.md) | ❔ | ❔ | ✅ | ❔ | -| [`INFOMANIAK`](infomaniak.md) | ❔ | ❔ | ✅ | ❔ | -| [`INWX`](inwx.md) | ❔ | ✅ | ✅ | ✅ | -| [`JOKER`](joker.md) | ❔ | ✅ | ✅ | ❌ | -| [`LINODE`](linode.md) | ❔ | ❔ | ✅ | ❔ | +| [`HETZNER_V2`](hetznerv2.md) | ❌ | ❌ | ✅ | ✅ | +| [`HOSTINGDE`](hostingde.md) | ❌ | ❌ | ✅ | ❌ | +| [`HUAWEICLOUD`](huaweicloud.md) | ❌ | ❌ | ✅ | ❌ | +| [`INFOBLOX`](infoblox.md) | ❌ | ❌ | ✅ | ❌ | +| [`INFOMANIAK`](infomaniak.md) | ❌ | ❌ | ✅ | ❌ | +| [`INTERNETBS`](internetbs.md) | ❌ | ❌ | ❌ | ❌ | +| [`INWX`](inwx.md) | ❌ | ✅ | ✅ | ✅ | +| [`JOKER`](joker.md) | ❌ | ✅ | ✅ | ❌ | +| [`LINODE`](linode.md) | ❌ | ❌ | ✅ | ❌ | | [`LOOPIA`](loopia.md) | ❌ | ✅ | ✅ | ❌ | -| [`LUADNS`](luadns.md) | ❔ | ❔ | ✅ | ❔ | -| [`MIKROTIK`](mikrotik.md) | ❔ | ❌ | ✅ | ❌ | +| [`LUADNS`](luadns.md) | ❌ | ❌ | ✅ | ❌ | +| [`MIKROTIK`](mikrotik.md) | ❌ | ❌ | ✅ | ❌ | | [`MITTWALD`](mittwald.md) | ❌ | ❌ | ✅ | ❌ | -| [`MYTHICBEASTS`](mythicbeasts.md) | ❔ | ❔ | ✅ | ❔ | -| [`NAMECHEAP`](namecheap.md) | ❔ | ❔ | ✅ | ❔ | -| [`NAMEDOTCOM`](namedotcom.md) | ❔ | ❔ | ✅ | ❔ | +| [`MYTHICBEASTS`](mythicbeasts.md) | ❌ | ❌ | ✅ | ❌ | +| [`NAMECHEAP`](namecheap.md) | ❌ | ❌ | ✅ | ❌ | +| [`NAMEDOTCOM`](namedotcom.md) | ❌ | ❌ | ✅ | ❌ | | [`NETBIRD`](netbird.md) | ❌ | ❌ | ❌ | ❌ | -| [`NETCUP`](netcup.md) | ❔ | ❔ | ✅ | ❔ | -| [`NETLIFY`](netlify.md) | ❔ | ❌ | ✅ | ❔ | +| [`NETCUP`](netcup.md) | ❌ | ❌ | ✅ | ❌ | +| [`NETLIFY`](netlify.md) | ❌ | ❌ | ✅ | ❌ | | [`NETNOD`](netnod.md) | ❌ | ✅ | ✅ | ✅ | | [`NEXDNS`](nexdns.md) | ❌ | ❌ | ✅ | ❌ | | [`NS1`](ns1.md) | ✅ | ✅ | ✅ | ✅ | | [`OPENPROVIDER`](openprovider.md) | ❌ | ❌ | ✅ | ❌ | -| [`OPENWRT`](openwrt.md) | ❔ | ❔ | ✅ | ❔ | -| [`ORACLE`](oracle.md) | ❔ | ✅ | ✅ | ❔ | -| [`OVH`](ovh.md) | ❔ | ❔ | ✅ | ❔ | -| [`PACKETFRAME`](packetframe.md) | ❔ | ❔ | ✅ | ❔ | -| [`PORKBUN`](porkbun.md) | ❔ | ❌ | ✅ | ✅ | +| [`OPENSRS`](opensrs.md) | ❌ | ❌ | ❌ | ❌ | +| [`OPENWRT`](openwrt.md) | ❌ | ❌ | ✅ | ❌ | +| [`ORACLE`](oracle.md) | ❌ | ✅ | ✅ | ❌ | +| [`OVH`](ovh.md) | ❌ | ❌ | ✅ | ❌ | +| [`PACKETFRAME`](packetframe.md) | ❌ | ❌ | ✅ | ❌ | +| [`PORKBUN`](porkbun.md) | ❌ | ❌ | ✅ | ✅ | | [`POWERDNS`](powerdns.md) | ✅ | ✅ | ✅ | ✅ | -| [`REALTIMEREGISTER`](realtimeregister.md) | ❌ | ✅ | ✅ | ❔ | -| [`ROUTE53`](route53.md) | ❔ | ❔ | ✅ | ✅ | -| [`RWTH`](rwth.md) | ❔ | ❌ | ✅ | ❔ | +| [`REALTIMEREGISTER`](realtimeregister.md) | ❌ | ✅ | ✅ | ❌ | +| [`ROUTE53`](route53.md) | ❌ | ❌ | ✅ | ✅ | +| [`RWTH`](rwth.md) | ❌ | ❌ | ✅ | ❌ | | [`SAKURACLOUD`](sakuracloud.md) | ❌ | ❌ | ✅ | ✅ | | [`SCALEWAY`](scaleway.md) | ❌ | ✅ | ✅ | ✅ | -| [`SOFTLAYER`](softlayer.md) | ❔ | ❔ | ✅ | ❔ | -| [`SPACESHIP`](spaceship.md) | ❔ | ❌ | ✅ | ✅ | -| [`TENCENTDNS`](tencentdns.md) | ❔ | ❔ | ✅ | ❔ | +| [`SOFTLAYER`](softlayer.md) | ❌ | ❌ | ✅ | ❌ | +| [`SPACESHIP`](spaceship.md) | ❌ | ❌ | ✅ | ✅ | +| [`TENCENTDNS`](tencentdns.md) | ❌ | ❌ | ✅ | ❌ | | [`TRANSIP`](transip.md) | ❌ | ✅ | ✅ | ❌ | -| [`UNIFI`](unifi.md) | ❔ | ❔ | ✅ | ❔ | +| [`UNIFI`](unifi.md) | ❌ | ❌ | ✅ | ❌ | | [`VERCEL`](vercel.md) | ❌ | ❌ | ✅ | ❌ | -| [`VULTR`](vultr.md) | ❔ | ❔ | ✅ | ❔ | -| [`WEBSUPPORT`](websupport.md) | ❔ | ❌ | ✅ | ❔ | +| [`VULTR`](vultr.md) | ❌ | ❌ | ✅ | ❌ | +| [`WEBSUPPORT`](websupport.md) | ❌ | ❌ | ✅ | ❌ | ### Security | Provider name | [`CAA`](../language-reference/domain-modifiers/CAA.md) | [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md) | [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md) | [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md) | [`TLSA`](../language-reference/domain-modifiers/TLSA.md) | | ------------- | ------------------------------------------------------ | ---------------------------------------------------------- | ------------------------------------------------------------ | ---------------------------------------------------------- | -------------------------------------------------------- | -| [`AKAMAIEDGEDNS`](akamaiedgedns.md) | ✅ | ❔ | ❔ | ✅ | ✅ | -| [`ALIDNS`](alidns.md) | ✅ | ❔ | ❔ | ❌ | ❌ | -| [`AUTODNS`](autodns.md) | ✅ | ❔ | ❔ | ❌ | ❌ | +| [`ADGUARDHOME`](adguardhome.md) | ❌ | ❌ | ❌ | ❌ | ❌ | +| [`AKAMAIEDGEDNS`](akamaiedgedns.md) | ✅ | ❌ | ❌ | ✅ | ✅ | +| [`ALIDNS`](alidns.md) | ✅ | ❌ | ❌ | ❌ | ❌ | +| [`AUTODNS`](autodns.md) | ✅ | ❌ | ❌ | ❌ | ❌ | | [`AXFRDDNS`](axfrddns.md) | ✅ | ✅ | ✅ | ✅ | ✅ | -| [`AZURE_DNS`](azuredns.md) | ✅ | ❔ | ❔ | ❌ | ❌ | -| [`AZURE_PRIVATE_DNS`](azureprivatedns.md) | ❌ | ❔ | ❔ | ❌ | ❌ | +| [`AZURE_DNS`](azuredns.md) | ✅ | ❌ | ❌ | ❌ | ❌ | +| [`AZURE_PRIVATE_DNS`](azureprivatedns.md) | ❌ | ❌ | ❌ | ❌ | ❌ | | [`BIND`](bind.md) | ✅ | ✅ | ✅ | ✅ | ✅ | -| [`BUNNY_DNS`](bunnydns.md) | ✅ | ✅ | ❔ | ❌ | ✅ | -| [`CLOUDFLAREAPI`](cloudflareapi.md) | ✅ | ✅ | ❔ | ✅ | ✅ | -| [`CLOUDNS`](cloudns.md) | ✅ | ❌ | ❔ | ✅ | ✅ | +| [`BUNNY_DNS`](bunnydns.md) | ✅ | ✅ | ❌ | ❌ | ✅ | +| [`CLOUDFLAREAPI`](cloudflareapi.md) | ✅ | ✅ | ❌ | ✅ | ✅ | +| [`CLOUDNS`](cloudns.md) | ✅ | ❌ | ❌ | ✅ | ✅ | | [`CNR`](cnr.md) | ✅ | ❌ | ✅ | ✅ | ✅ | -| [`CSCGLOBAL`](cscglobal.md) | ✅ | ❔ | ❔ | ❔ | ❔ | +| [`CSCGLOBAL`](cscglobal.md) | ✅ | ❌ | ❌ | ❌ | ❌ | | [`DESEC`](desec.md) | ✅ | ✅ | ✅ | ✅ | ✅ | | [`DIGITALOCEAN`](digitalocean.md) | ✅ | ❌ | ❌ | ❌ | ❌ | -| [`DNSCALE`](dnscale.md) | ✅ | ✅ | ❔ | ✅ | ✅ | -| [`DNSIMPLE`](dnsimple.md) | ✅ | ✅ | ❔ | ✅ | ✅ | -| [`DNSMADEEASY`](dnsmadeeasy.md) | ✅ | ❔ | ❔ | ❌ | ❌ | -| [`DOMAINNAMESHOP`](domainnameshop.md) | ✅ | ❔ | ❔ | ❌ | ❔ | +| [`DNSCALE`](dnscale.md) | ✅ | ✅ | ❌ | ✅ | ✅ | +| [`DNSIMPLE`](dnsimple.md) | ✅ | ✅ | ❌ | ✅ | ✅ | +| [`DNSMADEEASY`](dnsmadeeasy.md) | ✅ | ❌ | ❌ | ❌ | ❌ | +| [`DNSOVERHTTPS`](dnsoverhttps.md) | ❌ | ❌ | ❌ | ❌ | ❌ | +| [`DOMAINNAMESHOP`](domainnameshop.md) | ✅ | ❌ | ❌ | ❌ | ❔ | +| [`DYNADOT`](dynadot.md) | ❌ | ❌ | ❌ | ❌ | ❌ | | [`DYNU`](dynu.md) | ✅ | ✅ | ✅ | ✅ | ✅ | -| [`EXOSCALE`](exoscale.md) | ✅ | ❔ | ❔ | ❔ | ❌ | +| [`EASYNAME`](easyname.md) | ❌ | ❌ | ❌ | ❌ | ❌ | +| [`EXOSCALE`](exoscale.md) | ✅ | ❌ | ❌ | ❌ | ❌ | | [`FORTIGATE`](fortigate.md) | ❌ | ❌ | ❌ | ❌ | ❌ | -| [`GANDI_V5`](gandiv5.md) | ✅ | ✅ | ❔ | ✅ | ✅ | -| [`GCLOUD`](gcloud.md) | ✅ | ✅ | ❔ | ✅ | ✅ | -| [`GCORE`](gcore.md) | ✅ | ✅ | ❔ | ❌ | ❌ | -| [`GIDINET`](gidinet.md) | ❌ | ❌ | ❔ | ❌ | ❌ | -| [`GIGAHOST`](gigahost.md) | ✅ | ❔ | ❔ | ❔ | ❔ | +| [`GANDI_V5`](gandiv5.md) | ✅ | ✅ | ❌ | ✅ | ✅ | +| [`GCLOUD`](gcloud.md) | ✅ | ✅ | ❌ | ✅ | ✅ | +| [`GCORE`](gcore.md) | ✅ | ✅ | ❌ | ❌ | ❌ | +| [`GIDINET`](gidinet.md) | ❌ | ❌ | ❌ | ❌ | ❌ | +| [`GIGAHOST`](gigahost.md) | ✅ | ❌ | ❌ | ❌ | ❌ | | [`HEDNS`](hedns.md) | ✅ | ✅ | ❌ | ✅ | ❌ | -| [`HETZNER_V2`](hetznerv2.md) | ✅ | ✅ | ❔ | ❌ | ✅ | -| [`HOSTINGDE`](hostingde.md) | ✅ | ❔ | ❔ | ✅ | ✅ | -| [`HUAWEICLOUD`](huaweicloud.md) | ✅ | ❌ | ❔ | ❌ | ❌ | -| [`INFOBLOX`](infoblox.md) | ✅ | ❔ | ❔ | ❔ | ❔ | -| [`INFOMANIAK`](infomaniak.md) | ✅ | ❔ | ❔ | ✅ | ✅ | -| [`INWX`](inwx.md) | ✅ | ✅ | ❔ | ✅ | ✅ | -| [`JOKER`](joker.md) | ✅ | ❌ | ❔ | ❌ | ❌ | -| [`LINODE`](linode.md) | ✅ | ❔ | ❔ | ❔ | ❔ | -| [`LOOPIA`](loopia.md) | ✅ | ❌ | ❔ | ✅ | ✅ | -| [`LUADNS`](luadns.md) | ✅ | ✅ | ❔ | ✅ | ✅ | -| [`MIKROTIK`](mikrotik.md) | ❌ | ❌ | ❔ | ❌ | ❌ | +| [`HETZNER_V2`](hetznerv2.md) | ✅ | ✅ | ❌ | ❌ | ✅ | +| [`HOSTINGDE`](hostingde.md) | ✅ | ❌ | ❌ | ✅ | ✅ | +| [`HUAWEICLOUD`](huaweicloud.md) | ✅ | ❌ | ❌ | ❌ | ❌ | +| [`INFOBLOX`](infoblox.md) | ✅ | ❌ | ❌ | ❌ | ❌ | +| [`INFOMANIAK`](infomaniak.md) | ✅ | ❌ | ❌ | ✅ | ✅ | +| [`INTERNETBS`](internetbs.md) | ❌ | ❌ | ❌ | ❌ | ❌ | +| [`INWX`](inwx.md) | ✅ | ✅ | ❌ | ✅ | ✅ | +| [`JOKER`](joker.md) | ✅ | ❌ | ❌ | ❌ | ❌ | +| [`LINODE`](linode.md) | ✅ | ❌ | ❌ | ❌ | ❌ | +| [`LOOPIA`](loopia.md) | ✅ | ❌ | ❌ | ✅ | ✅ | +| [`LUADNS`](luadns.md) | ✅ | ✅ | ❌ | ✅ | ✅ | +| [`MIKROTIK`](mikrotik.md) | ❌ | ❌ | ❌ | ❌ | ❌ | | [`MITTWALD`](mittwald.md) | ✅ | ❌ | ❌ | ❌ | ❌ | -| [`MYTHICBEASTS`](mythicbeasts.md) | ✅ | ❔ | ❔ | ✅ | ✅ | -| [`NAMECHEAP`](namecheap.md) | ✅ | ❔ | ❔ | ❔ | ❌ | +| [`MYTHICBEASTS`](mythicbeasts.md) | ✅ | ❌ | ❌ | ✅ | ✅ | +| [`NAMECHEAP`](namecheap.md) | ✅ | ❌ | ❌ | ❌ | ❌ | +| [`NAMEDOTCOM`](namedotcom.md) | ❌ | ❌ | ❌ | ❌ | ❌ | | [`NETBIRD`](netbird.md) | ❌ | ❌ | ❌ | ❌ | ❌ | -| [`NETCUP`](netcup.md) | ✅ | ❔ | ❔ | ❔ | ✅ | -| [`NETLIFY`](netlify.md) | ✅ | ❔ | ❔ | ❌ | ❌ | -| [`NETNOD`](netnod.md) | ✅ | ✅ | ❔ | ✅ | ✅ | +| [`NETCUP`](netcup.md) | ✅ | ❌ | ❌ | ❌ | ✅ | +| [`NETLIFY`](netlify.md) | ✅ | ❌ | ❌ | ❌ | ❌ | +| [`NETNOD`](netnod.md) | ✅ | ✅ | ❌ | ✅ | ✅ | | [`NEXDNS`](nexdns.md) | ✅ | ❌ | ❌ | ❌ | ✅ | -| [`NS1`](ns1.md) | ✅ | ✅ | ❔ | ❔ | ✅ | +| [`NS1`](ns1.md) | ✅ | ✅ | ❌ | ❌ | ✅ | | [`OPENPROVIDER`](openprovider.md) | ✅ | ❌ | ❌ | ❌ | ✅ | -| [`ORACLE`](oracle.md) | ✅ | ❔ | ❔ | ✅ | ✅ | -| [`OVH`](ovh.md) | ✅ | ❔ | ❔ | ✅ | ✅ | -| [`PORKBUN`](porkbun.md) | ✅ | ✅ | ❔ | ✅ | ✅ | -| [`POWERDNS`](powerdns.md) | ✅ | ✅ | ❔ | ✅ | ✅ | -| [`REALTIMEREGISTER`](realtimeregister.md) | ✅ | ❔ | ❔ | ✅ | ✅ | -| [`ROUTE53`](route53.md) | ✅ | ✅ | ❔ | ✅ | ✅ | -| [`RWTH`](rwth.md) | ✅ | ❔ | ❔ | ✅ | ❌ | -| [`SAKURACLOUD`](sakuracloud.md) | ✅ | ✅ | ❔ | ❌ | ❌ | -| [`SCALEWAY`](scaleway.md) | ✅ | ✅ | ❔ | ✅ | ✅ | -| [`SPACESHIP`](spaceship.md) | ✅ | ✅ | ❔ | ❌ | ✅ | -| [`TENCENTDNS`](tencentdns.md) | ✅ | ❔ | ❔ | ❔ | ❔ | -| [`TRANSIP`](transip.md) | ✅ | ❌ | ❔ | ✅ | ✅ | -| [`UNIFI`](unifi.md) | ❌ | ❔ | ❔ | ❌ | ❌ | -| [`VERCEL`](vercel.md) | ✅ | ✅ | ❔ | ❌ | ❌ | -| [`VULTR`](vultr.md) | ✅ | ❔ | ❔ | ✅ | ❌ | -| [`WEBSUPPORT`](websupport.md) | ❌ | ❔ | ❔ | ❌ | ❌ | +| [`OPENSRS`](opensrs.md) | ❌ | ❌ | ❌ | ❌ | ❌ | +| [`OPENWRT`](openwrt.md) | ❌ | ❌ | ❌ | ❌ | ❌ | +| [`ORACLE`](oracle.md) | ✅ | ❌ | ❌ | ✅ | ✅ | +| [`OVH`](ovh.md) | ✅ | ❌ | ❌ | ✅ | ✅ | +| [`PACKETFRAME`](packetframe.md) | ❌ | ❌ | ❌ | ❌ | ❌ | +| [`PORKBUN`](porkbun.md) | ✅ | ✅ | ❌ | ✅ | ✅ | +| [`POWERDNS`](powerdns.md) | ✅ | ✅ | ❌ | ✅ | ✅ | +| [`REALTIMEREGISTER`](realtimeregister.md) | ✅ | ❌ | ❌ | ✅ | ✅ | +| [`ROUTE53`](route53.md) | ✅ | ✅ | ❌ | ✅ | ✅ | +| [`RWTH`](rwth.md) | ✅ | ❌ | ❌ | ✅ | ❌ | +| [`SAKURACLOUD`](sakuracloud.md) | ✅ | ✅ | ❌ | ❌ | ❌ | +| [`SCALEWAY`](scaleway.md) | ✅ | ✅ | ❌ | ✅ | ✅ | +| [`SOFTLAYER`](softlayer.md) | ❌ | ❌ | ❌ | ❌ | ❌ | +| [`SPACESHIP`](spaceship.md) | ✅ | ✅ | ❌ | ❌ | ✅ | +| [`TENCENTDNS`](tencentdns.md) | ✅ | ❌ | ❌ | ❌ | ❌ | +| [`TRANSIP`](transip.md) | ✅ | ❌ | ❌ | ✅ | ✅ | +| [`UNIFI`](unifi.md) | ❌ | ❌ | ❌ | ❌ | ❌ | +| [`VERCEL`](vercel.md) | ✅ | ✅ | ❌ | ❌ | ❌ | +| [`VULTR`](vultr.md) | ✅ | ❌ | ❌ | ✅ | ❌ | +| [`WEBSUPPORT`](websupport.md) | ❌ | ❌ | ❌ | ❌ | ❌ | ### DNSSEC | Provider name | [`AUTODNSSEC`](../language-reference/domain-modifiers/AUTODNSSEC_ON.md) | [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md) | [`DS`](../language-reference/domain-modifiers/DS.md) | | ------------- | ----------------------------------------------------------------------- | ------------------------------------------------------------ | ---------------------------------------------------- | -| [`AKAMAIEDGEDNS`](akamaiedgedns.md) | ✅ | ❔ | ❌ | -| [`ALIDNS`](alidns.md) | ❌ | ❔ | ❔ | -| [`AUTODNS`](autodns.md) | ❔ | ❔ | ❌ | +| [`ADGUARDHOME`](adguardhome.md) | ❔ | ❌ | ❌ | +| [`AKAMAIEDGEDNS`](akamaiedgedns.md) | ✅ | ❌ | ❌ | +| [`ALIDNS`](alidns.md) | ❌ | ❌ | ❌ | +| [`AUTODNS`](autodns.md) | ❔ | ❌ | ❌ | | [`AXFRDDNS`](axfrddns.md) | ✅ | ❌ | ✅ | -| [`AZURE_PRIVATE_DNS`](azureprivatedns.md) | ❌ | ❔ | ❔ | +| [`AZURE_DNS`](azuredns.md) | ❔ | ❌ | ❌ | +| [`AZURE_PRIVATE_DNS`](azureprivatedns.md) | ❌ | ❌ | ❌ | | [`BIND`](bind.md) | ✅ | ✅ | ✅ | -| [`BUNNY_DNS`](bunnydns.md) | ✅ | ❔ | ❌ | +| [`BUNNY_DNS`](bunnydns.md) | ✅ | ❌ | ❌ | | [`CLOUDFLAREAPI`](cloudflareapi.md) | ❔ | ❌ | ✅ | | [`CLOUDNS`](cloudns.md) | ✅ | ❌ | ❌ | | [`CNR`](cnr.md) | ✅ | ❔ | ❔ | +| [`CSCGLOBAL`](cscglobal.md) | ❔ | ❌ | ❌ | | [`DESEC`](desec.md) | ✅ | ✅ | ❌ | | [`DIGITALOCEAN`](digitalocean.md) | ❌ | ❌ | ❌ | -| [`DNSIMPLE`](dnsimple.md) | ✅ | ❔ | ❌ | -| [`DNSMADEEASY`](dnsmadeeasy.md) | ❔ | ❔ | ❌ | -| [`DOMAINNAMESHOP`](domainnameshop.md) | ❌ | ❔ | ❔ | -| [`DYNU`](dynu.md) | ❌ | ❔ | ❔ | +| [`DNSCALE`](dnscale.md) | ❔ | ❌ | ❌ | +| [`DNSIMPLE`](dnsimple.md) | ✅ | ❌ | ❌ | +| [`DNSMADEEASY`](dnsmadeeasy.md) | ❔ | ❌ | ❌ | +| [`DNSOVERHTTPS`](dnsoverhttps.md) | ❔ | ❌ | ❌ | +| [`DOMAINNAMESHOP`](domainnameshop.md) | ❌ | ❌ | ❔ | +| [`DYNADOT`](dynadot.md) | ❔ | ❌ | ❌ | +| [`DYNU`](dynu.md) | ❌ | ❌ | ❌ | +| [`EASYNAME`](easyname.md) | ❔ | ❌ | ❌ | +| [`EXOSCALE`](exoscale.md) | ❔ | ❌ | ❌ | | [`FORTIGATE`](fortigate.md) | ❌ | ❌ | ❌ | -| [`GANDI_V5`](gandiv5.md) | ❔ | ❔ | ❌ | -| [`GCLOUD`](gcloud.md) | ✅ | ❔ | ❔ | -| [`GCORE`](gcore.md) | ✅ | ❔ | ❌ | +| [`GANDI_V5`](gandiv5.md) | ❔ | ❌ | ❌ | +| [`GCLOUD`](gcloud.md) | ✅ | ❌ | ❌ | +| [`GCORE`](gcore.md) | ✅ | ❌ | ❌ | | [`GIDINET`](gidinet.md) | ❌ | ❌ | ❌ | +| [`GIGAHOST`](gigahost.md) | ❔ | ❌ | ❌ | | [`HEDNS`](hedns.md) | ❌ | ❌ | ❌ | -| [`HETZNER_V2`](hetznerv2.md) | ❌ | ❔ | ✅ | -| [`HOSTINGDE`](hostingde.md) | ✅ | ❔ | ✅ | -| [`HUAWEICLOUD`](huaweicloud.md) | ✅ | ❔ | ❌ | -| [`INFOMANIAK`](infomaniak.md) | ❔ | ❔ | ✅ | -| [`INWX`](inwx.md) | ✅ | ❔ | ❔ | +| [`HETZNER_V2`](hetznerv2.md) | ❌ | ❌ | ✅ | +| [`HOSTINGDE`](hostingde.md) | ✅ | ❌ | ✅ | +| [`HUAWEICLOUD`](huaweicloud.md) | ✅ | ❌ | ❌ | +| [`INFOBLOX`](infoblox.md) | ❔ | ❌ | ❌ | +| [`INFOMANIAK`](infomaniak.md) | ❔ | ❌ | ✅ | +| [`INTERNETBS`](internetbs.md) | ❔ | ❌ | ❌ | +| [`INWX`](inwx.md) | ✅ | ❌ | ❔ | | [`JOKER`](joker.md) | ❔ | ❌ | ❌ | +| [`LINODE`](linode.md) | ❔ | ❌ | ❌ | | [`LOOPIA`](loopia.md) | ❌ | ❌ | ❌ | -| [`MIKROTIK`](mikrotik.md) | ❌ | ❔ | ❌ | +| [`LUADNS`](luadns.md) | ❔ | ❌ | ❌ | +| [`MIKROTIK`](mikrotik.md) | ❌ | ❌ | ❌ | | [`MITTWALD`](mittwald.md) | ❌ | ❌ | ❌ | +| [`MYTHICBEASTS`](mythicbeasts.md) | ❔ | ❌ | ❌ | +| [`NAMECHEAP`](namecheap.md) | ❔ | ❌ | ❌ | +| [`NAMEDOTCOM`](namedotcom.md) | ❔ | ❌ | ❌ | | [`NETBIRD`](netbird.md) | ❌ | ❌ | ❌ | -| [`NETLIFY`](netlify.md) | ❌ | ❔ | ❌ | +| [`NETCUP`](netcup.md) | ❔ | ❌ | ❌ | +| [`NETLIFY`](netlify.md) | ❌ | ❌ | ❌ | | [`NETNOD`](netnod.md) | ❌ | ❌ | ❌ | | [`NEXDNS`](nexdns.md) | ❔ | ❌ | ❌ | -| [`NS1`](ns1.md) | ✅ | ❔ | ✅ | +| [`NS1`](ns1.md) | ✅ | ❌ | ✅ | | [`OPENPROVIDER`](openprovider.md) | ❔ | ❌ | ❌ | -| [`ORACLE`](oracle.md) | ❔ | ❔ | ❌ | -| [`PORKBUN`](porkbun.md) | ❌ | ❔ | ❌ | +| [`OPENSRS`](opensrs.md) | ❔ | ❌ | ❌ | +| [`OPENWRT`](openwrt.md) | ❔ | ❌ | ❌ | +| [`ORACLE`](oracle.md) | ❔ | ❌ | ❌ | +| [`OVH`](ovh.md) | ❔ | ❌ | ❌ | +| [`PACKETFRAME`](packetframe.md) | ❔ | ❌ | ❌ | +| [`PORKBUN`](porkbun.md) | ❌ | ❌ | ❌ | | [`POWERDNS`](powerdns.md) | ✅ | ✅ | ✅ | -| [`REALTIMEREGISTER`](realtimeregister.md) | ✅ | ❔ | ❌ | +| [`REALTIMEREGISTER`](realtimeregister.md) | ✅ | ❌ | ❌ | +| [`ROUTE53`](route53.md) | ❔ | ❌ | ❌ | +| [`RWTH`](rwth.md) | ❔ | ❌ | ❔ | | [`SAKURACLOUD`](sakuracloud.md) | ❌ | ❌ | ❌ | -| [`SCALEWAY`](scaleway.md) | ❌ | ❔ | ❌ | -| [`SPACESHIP`](spaceship.md) | ❌ | ❔ | ❌ | +| [`SCALEWAY`](scaleway.md) | ❌ | ❌ | ❌ | +| [`SOFTLAYER`](softlayer.md) | ❔ | ❌ | ❌ | +| [`SPACESHIP`](spaceship.md) | ❌ | ❌ | ❌ | +| [`TENCENTDNS`](tencentdns.md) | ❔ | ❌ | ❌ | | [`TRANSIP`](transip.md) | ❌ | ❌ | ❌ | +| [`UNIFI`](unifi.md) | ❔ | ❌ | ❌ | | [`VERCEL`](vercel.md) | ❌ | ❌ | ❌ | -| [`VULTR`](vultr.md) | ✅ | ❔ | ❔ | -| [`WEBSUPPORT`](websupport.md) | ❔ | ❔ | ❌ | +| [`VULTR`](vultr.md) | ✅ | ❌ | ❌ | +| [`WEBSUPPORT`](websupport.md) | ❔ | ❌ | ❌ | diff --git a/documentation/provider/infoblox.md b/documentation/provider/infoblox.md index 4335c00600..e717d325cb 100644 --- a/documentation/provider/infoblox.md +++ b/documentation/provider/infoblox.md @@ -101,24 +101,24 @@ DNSControl cannot create new zones in Infoblox. Zones must already exist in the - create-domains: ❌ - [get-zones](../commands/get-zones.md): ❌ - DNS extensions - - [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md): ❔ - - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❔ - - [`LOC`](../language-reference/domain-modifiers/LOC.md): ❔ + - [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md): ❌ + - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❌ + - [`LOC`](../language-reference/domain-modifiers/LOC.md): ❌ - [`PTR`](../language-reference/domain-modifiers/PTR.md): ✅ - - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❔ + - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❌ - Service discovery - - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❔ - - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❔ + - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❌ + - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❌ - [`SRV`](../language-reference/domain-modifiers/SRV.md): ✅ - - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❔ + - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❌ - Security - [`CAA`](../language-reference/domain-modifiers/CAA.md): ✅ - - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❔ - - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❔ - - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ❔ - - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ❔ + - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❌ + - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❌ + - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ❌ + - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ❌ - DNSSEC - [`AUTODNSSEC`](../language-reference/domain-modifiers/AUTODNSSEC_ON.md): ❔ - - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❔ - - [`DS`](../language-reference/domain-modifiers/DS.md): ❔ + - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❌ + - [`DS`](../language-reference/domain-modifiers/DS.md): ❌ diff --git a/documentation/provider/infomaniak.md b/documentation/provider/infomaniak.md index f4e29697dd..404a819953 100644 --- a/documentation/provider/infomaniak.md +++ b/documentation/provider/infomaniak.md @@ -50,24 +50,24 @@ DNSControl depends on a Infomaniak account personal access token. - create-domains: ❌ - [get-zones](../commands/get-zones.md): ❌ - DNS extensions - - [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md): ❔ + - [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md): ❌ - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ✅ - - [`LOC`](../language-reference/domain-modifiers/LOC.md): ❔ - - [`PTR`](../language-reference/domain-modifiers/PTR.md): ❔ - - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❔ + - [`LOC`](../language-reference/domain-modifiers/LOC.md): ❌ + - [`PTR`](../language-reference/domain-modifiers/PTR.md): ❌ + - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❌ - Service discovery - - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❔ - - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❔ + - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❌ + - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❌ - [`SRV`](../language-reference/domain-modifiers/SRV.md): ✅ - - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❔ + - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❌ - Security - [`CAA`](../language-reference/domain-modifiers/CAA.md): ✅ - - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❔ - - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❔ + - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❌ + - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❌ - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ✅ - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ✅ - DNSSEC - [`AUTODNSSEC`](../language-reference/domain-modifiers/AUTODNSSEC_ON.md): ❔ - - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❔ + - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❌ - [`DS`](../language-reference/domain-modifiers/DS.md): ✅ diff --git a/documentation/provider/internetbs.md b/documentation/provider/internetbs.md index 2fe5b700c3..9c134574a0 100644 --- a/documentation/provider/internetbs.md +++ b/documentation/provider/internetbs.md @@ -53,24 +53,24 @@ Pay attention, you need to define white list of IP for API. But you always can c - create-domains: ❌ - [get-zones](../commands/get-zones.md): ❌ - DNS extensions - - [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md): ❔ - - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❔ - - [`LOC`](../language-reference/domain-modifiers/LOC.md): ❔ - - [`PTR`](../language-reference/domain-modifiers/PTR.md): ❔ - - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❔ + - [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md): ❌ + - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❌ + - [`LOC`](../language-reference/domain-modifiers/LOC.md): ❌ + - [`PTR`](../language-reference/domain-modifiers/PTR.md): ❌ + - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❌ - Service discovery - - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❔ - - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❔ - - [`SRV`](../language-reference/domain-modifiers/SRV.md): ❔ - - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❔ + - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❌ + - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❌ + - [`SRV`](../language-reference/domain-modifiers/SRV.md): ❌ + - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❌ - Security - - [`CAA`](../language-reference/domain-modifiers/CAA.md): ❔ - - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❔ - - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❔ - - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ❔ - - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ❔ + - [`CAA`](../language-reference/domain-modifiers/CAA.md): ❌ + - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❌ + - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❌ + - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ❌ + - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ❌ - DNSSEC - [`AUTODNSSEC`](../language-reference/domain-modifiers/AUTODNSSEC_ON.md): ❔ - - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❔ - - [`DS`](../language-reference/domain-modifiers/DS.md): ❔ + - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❌ + - [`DS`](../language-reference/domain-modifiers/DS.md): ❌ diff --git a/documentation/provider/inwx.md b/documentation/provider/inwx.md index fc44f0d1ba..bd906098a8 100644 --- a/documentation/provider/inwx.md +++ b/documentation/provider/inwx.md @@ -128,23 +128,23 @@ INWX enforces the [RFC 7505](https://www.rfc-editor.org/rfc/rfc7505.html#section - [get-zones](../commands/get-zones.md): ✅ - DNS extensions - [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md): ✅ - - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❔ + - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❌ - [`LOC`](../language-reference/domain-modifiers/LOC.md): ❔ - [`PTR`](../language-reference/domain-modifiers/PTR.md): ✅ - - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❔ + - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❌ - Service discovery - - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❔ + - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❌ - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ✅ - [`SRV`](../language-reference/domain-modifiers/SRV.md): ✅ - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ✅ - Security - [`CAA`](../language-reference/domain-modifiers/CAA.md): ✅ - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ✅ - - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❔ + - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❌ - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ✅ - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ✅ - DNSSEC - [`AUTODNSSEC`](../language-reference/domain-modifiers/AUTODNSSEC_ON.md): ✅ - - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❔ + - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❌ - [`DS`](../language-reference/domain-modifiers/DS.md): ❔ diff --git a/documentation/provider/joker.md b/documentation/provider/joker.md index f90682aa82..a57c6a1f79 100644 --- a/documentation/provider/joker.md +++ b/documentation/provider/joker.md @@ -105,19 +105,19 @@ END); - [get-zones](../commands/get-zones.md): ✅ - DNS extensions - [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md): ❌ - - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❔ + - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❌ - [`LOC`](../language-reference/domain-modifiers/LOC.md): ❌ - [`PTR`](../language-reference/domain-modifiers/PTR.md): ❌ - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❌ - Service discovery - - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❔ + - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❌ - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ✅ - [`SRV`](../language-reference/domain-modifiers/SRV.md): ✅ - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❌ - Security - [`CAA`](../language-reference/domain-modifiers/CAA.md): ✅ - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❌ - - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❔ + - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❌ - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ❌ - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ❌ - DNSSEC diff --git a/documentation/provider/linode.md b/documentation/provider/linode.md index 23a467036e..688d366de1 100644 --- a/documentation/provider/linode.md +++ b/documentation/provider/linode.md @@ -88,24 +88,24 @@ correction. All of these caveats only affect invalid inputs. - create-domains: ❌ - [get-zones](../commands/get-zones.md): ❌ - DNS extensions - - [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md): ❔ - - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❔ + - [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md): ❌ + - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❌ - [`LOC`](../language-reference/domain-modifiers/LOC.md): ❌ - - [`PTR`](../language-reference/domain-modifiers/PTR.md): ❔ - - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❔ + - [`PTR`](../language-reference/domain-modifiers/PTR.md): ❌ + - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❌ - Service discovery - - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❔ - - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❔ + - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❌ + - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❌ - [`SRV`](../language-reference/domain-modifiers/SRV.md): ✅ - - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❔ + - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❌ - Security - [`CAA`](../language-reference/domain-modifiers/CAA.md): ✅ - - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❔ - - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❔ - - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ❔ - - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ❔ + - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❌ + - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❌ + - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ❌ + - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ❌ - DNSSEC - [`AUTODNSSEC`](../language-reference/domain-modifiers/AUTODNSSEC_ON.md): ❔ - - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❔ - - [`DS`](../language-reference/domain-modifiers/DS.md): ❔ + - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❌ + - [`DS`](../language-reference/domain-modifiers/DS.md): ❌ diff --git a/documentation/provider/loopia.md b/documentation/provider/loopia.md index 8fd929ebb6..0be3069045 100644 --- a/documentation/provider/loopia.md +++ b/documentation/provider/loopia.md @@ -202,7 +202,7 @@ As shown in the configuration examples above, this can be activated on demand an - [get-zones](../commands/get-zones.md): ✅ - DNS extensions - [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md): ❌ - - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❔ + - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❌ - [`LOC`](../language-reference/domain-modifiers/LOC.md): ✅ - [`PTR`](../language-reference/domain-modifiers/PTR.md): ❌ - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❌ @@ -214,7 +214,7 @@ As shown in the configuration examples above, this can be activated on demand an - Security - [`CAA`](../language-reference/domain-modifiers/CAA.md): ✅ - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❌ - - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❔ + - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❌ - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ✅ - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ✅ - DNSSEC diff --git a/documentation/provider/luadns.md b/documentation/provider/luadns.md index e6979cdc46..05f59e33ee 100644 --- a/documentation/provider/luadns.md +++ b/documentation/provider/luadns.md @@ -57,23 +57,23 @@ This is not the case if you are using vanity nameservers. - [get-zones](../commands/get-zones.md): ✅ - DNS extensions - [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md): ✅ - - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❔ + - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❌ - [`LOC`](../language-reference/domain-modifiers/LOC.md): ❌ - [`PTR`](../language-reference/domain-modifiers/PTR.md): ✅ - - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❔ + - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❌ - Service discovery - - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❔ - - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❔ + - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❌ + - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❌ - [`SRV`](../language-reference/domain-modifiers/SRV.md): ✅ - - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❔ + - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❌ - Security - [`CAA`](../language-reference/domain-modifiers/CAA.md): ✅ - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ✅ - - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❔ + - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❌ - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ✅ - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ✅ - DNSSEC - [`AUTODNSSEC`](../language-reference/domain-modifiers/AUTODNSSEC_ON.md): ❔ - - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❔ - - [`DS`](../language-reference/domain-modifiers/DS.md): ❔ + - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❌ + - [`DS`](../language-reference/domain-modifiers/DS.md): ❌ diff --git a/documentation/provider/mikrotik.md b/documentation/provider/mikrotik.md index 17e699262f..09beae5ea5 100644 --- a/documentation/provider/mikrotik.md +++ b/documentation/provider/mikrotik.md @@ -181,23 +181,23 @@ Records are compared using `diff2.ByRecord()` with custom comparison functions t - [get-zones](../commands/get-zones.md): ✅ - DNS extensions - [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md): ❌ - - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❔ + - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❌ - [`LOC`](../language-reference/domain-modifiers/LOC.md): ❌ - [`PTR`](../language-reference/domain-modifiers/PTR.md): ❌ - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❌ - Service discovery - - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❔ + - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❌ - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❌ - [`SRV`](../language-reference/domain-modifiers/SRV.md): ✅ - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❌ - Security - [`CAA`](../language-reference/domain-modifiers/CAA.md): ❌ - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❌ - - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❔ + - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❌ - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ❌ - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ❌ - DNSSEC - [`AUTODNSSEC`](../language-reference/domain-modifiers/AUTODNSSEC_ON.md): ❌ - - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❔ + - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❌ - [`DS`](../language-reference/domain-modifiers/DS.md): ❌ diff --git a/documentation/provider/mythicbeasts.md b/documentation/provider/mythicbeasts.md index 7d953745ec..1ebfc6efec 100644 --- a/documentation/provider/mythicbeasts.md +++ b/documentation/provider/mythicbeasts.md @@ -52,23 +52,23 @@ D("example.com", REG_NONE, DnsProvider(DSP_MYTHIC), - [get-zones](../commands/get-zones.md): ❌ - DNS extensions - [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md): ❌ - - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❔ + - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❌ - [`LOC`](../language-reference/domain-modifiers/LOC.md): ❌ - [`PTR`](../language-reference/domain-modifiers/PTR.md): ✅ - - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❔ + - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❌ - Service discovery - - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❔ - - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❔ + - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❌ + - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❌ - [`SRV`](../language-reference/domain-modifiers/SRV.md): ✅ - - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❔ + - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❌ - Security - [`CAA`](../language-reference/domain-modifiers/CAA.md): ✅ - - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❔ - - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❔ + - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❌ + - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❌ - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ✅ - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ✅ - DNSSEC - [`AUTODNSSEC`](../language-reference/domain-modifiers/AUTODNSSEC_ON.md): ❔ - - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❔ - - [`DS`](../language-reference/domain-modifiers/DS.md): ❔ + - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❌ + - [`DS`](../language-reference/domain-modifiers/DS.md): ❌ diff --git a/documentation/provider/namecheap.md b/documentation/provider/namecheap.md index 19b11a9742..32b73d19bb 100644 --- a/documentation/provider/namecheap.md +++ b/documentation/provider/namecheap.md @@ -84,23 +84,23 @@ In order to activate API functionality on your Namecheap account, you must enabl - [get-zones](../commands/get-zones.md): ✅ - DNS extensions - [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md): ✅ - - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❔ + - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❌ - [`LOC`](../language-reference/domain-modifiers/LOC.md): ❌ - [`PTR`](../language-reference/domain-modifiers/PTR.md): ❌ - - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❔ + - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❌ - Service discovery - - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❔ - - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❔ + - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❌ + - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❌ - [`SRV`](../language-reference/domain-modifiers/SRV.md): ✅ - - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❔ + - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❌ - Security - [`CAA`](../language-reference/domain-modifiers/CAA.md): ✅ - - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❔ - - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❔ - - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ❔ + - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❌ + - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❌ + - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ❌ - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ❌ - DNSSEC - [`AUTODNSSEC`](../language-reference/domain-modifiers/AUTODNSSEC_ON.md): ❔ - - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❔ - - [`DS`](../language-reference/domain-modifiers/DS.md): ❔ + - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❌ + - [`DS`](../language-reference/domain-modifiers/DS.md): ❌ diff --git a/documentation/provider/namedotcom.md b/documentation/provider/namedotcom.md index 134f363678..416e89e8f5 100644 --- a/documentation/provider/namedotcom.md +++ b/documentation/provider/namedotcom.md @@ -109,23 +109,23 @@ In production, the `apiurl` setting in `creds.json` needs to be adjusted. You ca - [get-zones](../commands/get-zones.md): ✅ - DNS extensions - [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md): ✅ - - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❔ + - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❌ - [`LOC`](../language-reference/domain-modifiers/LOC.md): ❌ - [`PTR`](../language-reference/domain-modifiers/PTR.md): ❌ - - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❔ + - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❌ - Service discovery - - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❔ - - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❔ + - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❌ + - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❌ - [`SRV`](../language-reference/domain-modifiers/SRV.md): ✅ - - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❔ + - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❌ - Security - - [`CAA`](../language-reference/domain-modifiers/CAA.md): ❔ - - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❔ - - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❔ - - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ❔ - - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ❔ + - [`CAA`](../language-reference/domain-modifiers/CAA.md): ❌ + - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❌ + - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❌ + - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ❌ + - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ❌ - DNSSEC - [`AUTODNSSEC`](../language-reference/domain-modifiers/AUTODNSSEC_ON.md): ❔ - - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❔ - - [`DS`](../language-reference/domain-modifiers/DS.md): ❔ + - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❌ + - [`DS`](../language-reference/domain-modifiers/DS.md): ❌ diff --git a/documentation/provider/netcup.md b/documentation/provider/netcup.md index b9e8c6be94..67860d1bc1 100644 --- a/documentation/provider/netcup.md +++ b/documentation/provider/netcup.md @@ -50,24 +50,24 @@ not currently supported. - create-domains: ❌ - [get-zones](../commands/get-zones.md): ❌ - DNS extensions - - [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md): ❔ - - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❔ + - [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md): ❌ + - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❌ - [`LOC`](../language-reference/domain-modifiers/LOC.md): ❌ - [`PTR`](../language-reference/domain-modifiers/PTR.md): ❌ - - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❔ + - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❌ - Service discovery - - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❔ - - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❔ + - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❌ + - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❌ - [`SRV`](../language-reference/domain-modifiers/SRV.md): ✅ - - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❔ + - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❌ - Security - [`CAA`](../language-reference/domain-modifiers/CAA.md): ✅ - - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❔ - - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❔ - - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ❔ + - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❌ + - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❌ + - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ❌ - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ✅ - DNSSEC - [`AUTODNSSEC`](../language-reference/domain-modifiers/AUTODNSSEC_ON.md): ❔ - - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❔ - - [`DS`](../language-reference/domain-modifiers/DS.md): ❔ + - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❌ + - [`DS`](../language-reference/domain-modifiers/DS.md): ❌ diff --git a/documentation/provider/netlify.md b/documentation/provider/netlify.md index 7401133a7b..3432f11242 100644 --- a/documentation/provider/netlify.md +++ b/documentation/provider/netlify.md @@ -55,23 +55,23 @@ Empty MX records are not supported. - [get-zones](../commands/get-zones.md): ✅ - DNS extensions - [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md): ✅ - - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❔ + - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❌ - [`LOC`](../language-reference/domain-modifiers/LOC.md): ❌ - [`PTR`](../language-reference/domain-modifiers/PTR.md): ❌ - - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❔ + - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❌ - Service discovery - - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❔ + - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❌ - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❌ - [`SRV`](../language-reference/domain-modifiers/SRV.md): ✅ - - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❔ + - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❌ - Security - [`CAA`](../language-reference/domain-modifiers/CAA.md): ✅ - - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❔ - - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❔ + - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❌ + - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❌ - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ❌ - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ❌ - DNSSEC - [`AUTODNSSEC`](../language-reference/domain-modifiers/AUTODNSSEC_ON.md): ❌ - - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❔ + - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❌ - [`DS`](../language-reference/domain-modifiers/DS.md): ❌ diff --git a/documentation/provider/netnod.md b/documentation/provider/netnod.md index ca5af70e9c..684a2612a2 100644 --- a/documentation/provider/netnod.md +++ b/documentation/provider/netnod.md @@ -84,7 +84,7 @@ See the [Netnod DNS](https://www.netnod.se/dns/dns-enterprise-services). - Security - [`CAA`](../language-reference/domain-modifiers/CAA.md): ✅ - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ✅ - - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❔ + - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❌ - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ✅ - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ✅ - DNSSEC diff --git a/documentation/provider/ns1.md b/documentation/provider/ns1.md index 277ef58db5..519244c49f 100644 --- a/documentation/provider/ns1.md +++ b/documentation/provider/ns1.md @@ -50,7 +50,7 @@ D("example.com", REG_NONE, DnsProvider(DSP_NS1), - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ✅ - [`LOC`](../language-reference/domain-modifiers/LOC.md): ❌ - [`PTR`](../language-reference/domain-modifiers/PTR.md): ✅ - - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❔ + - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❌ - Service discovery - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ✅ - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ✅ @@ -59,11 +59,11 @@ D("example.com", REG_NONE, DnsProvider(DSP_NS1), - Security - [`CAA`](../language-reference/domain-modifiers/CAA.md): ✅ - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ✅ - - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❔ - - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ❔ + - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❌ + - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ❌ - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ✅ - DNSSEC - [`AUTODNSSEC`](../language-reference/domain-modifiers/AUTODNSSEC_ON.md): ✅ - - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❔ + - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❌ - [`DS`](../language-reference/domain-modifiers/DS.md): ✅ diff --git a/documentation/provider/opensrs.md b/documentation/provider/opensrs.md index cab6394039..53d5443331 100644 --- a/documentation/provider/opensrs.md +++ b/documentation/provider/opensrs.md @@ -31,24 +31,24 @@ D("example.com", REG_NONE, DnsProvider(DSP_OPENSRS), - create-domains: ❌ - [get-zones](../commands/get-zones.md): ❌ - DNS extensions - - [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md): ❔ - - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❔ - - [`LOC`](../language-reference/domain-modifiers/LOC.md): ❔ - - [`PTR`](../language-reference/domain-modifiers/PTR.md): ❔ - - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❔ + - [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md): ❌ + - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❌ + - [`LOC`](../language-reference/domain-modifiers/LOC.md): ❌ + - [`PTR`](../language-reference/domain-modifiers/PTR.md): ❌ + - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❌ - Service discovery - - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❔ - - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❔ - - [`SRV`](../language-reference/domain-modifiers/SRV.md): ❔ - - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❔ + - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❌ + - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❌ + - [`SRV`](../language-reference/domain-modifiers/SRV.md): ❌ + - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❌ - Security - - [`CAA`](../language-reference/domain-modifiers/CAA.md): ❔ - - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❔ - - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❔ - - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ❔ - - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ❔ + - [`CAA`](../language-reference/domain-modifiers/CAA.md): ❌ + - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❌ + - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❌ + - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ❌ + - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ❌ - DNSSEC - [`AUTODNSSEC`](../language-reference/domain-modifiers/AUTODNSSEC_ON.md): ❔ - - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❔ - - [`DS`](../language-reference/domain-modifiers/DS.md): ❔ + - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❌ + - [`DS`](../language-reference/domain-modifiers/DS.md): ❌ diff --git a/documentation/provider/openwrt.md b/documentation/provider/openwrt.md index 5a1ae38930..fabed37567 100644 --- a/documentation/provider/openwrt.md +++ b/documentation/provider/openwrt.md @@ -69,23 +69,23 @@ D("example.com", REG_NONE, DnsProvider(DSP_OPENWRT), - [get-zones](../commands/get-zones.md): ❌ - DNS extensions - [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md): ❌ - - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❔ - - [`LOC`](../language-reference/domain-modifiers/LOC.md): ❔ - - [`PTR`](../language-reference/domain-modifiers/PTR.md): ❔ - - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❔ + - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❌ + - [`LOC`](../language-reference/domain-modifiers/LOC.md): ❌ + - [`PTR`](../language-reference/domain-modifiers/PTR.md): ❌ + - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❌ - Service discovery - - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❔ - - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❔ + - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❌ + - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❌ - [`SRV`](../language-reference/domain-modifiers/SRV.md): ✅ - - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❔ + - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❌ - Security - - [`CAA`](../language-reference/domain-modifiers/CAA.md): ❔ - - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❔ - - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❔ - - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ❔ - - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ❔ + - [`CAA`](../language-reference/domain-modifiers/CAA.md): ❌ + - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❌ + - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❌ + - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ❌ + - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ❌ - DNSSEC - [`AUTODNSSEC`](../language-reference/domain-modifiers/AUTODNSSEC_ON.md): ❔ - - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❔ - - [`DS`](../language-reference/domain-modifiers/DS.md): ❔ + - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❌ + - [`DS`](../language-reference/domain-modifiers/DS.md): ❌ diff --git a/documentation/provider/oracle.md b/documentation/provider/oracle.md index de5aebf046..27fd18c75e 100644 --- a/documentation/provider/oracle.md +++ b/documentation/provider/oracle.md @@ -69,23 +69,23 @@ WARNING: Oracle Cloud forces TTL=86400 for NS records. Ignoring configured TTL o - [get-zones](../commands/get-zones.md): ✅ - DNS extensions - [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md): ✅ - - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❔ + - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❌ - [`LOC`](../language-reference/domain-modifiers/LOC.md): ❔ - [`PTR`](../language-reference/domain-modifiers/PTR.md): ✅ - - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❔ + - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❌ - Service discovery - - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❔ + - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❌ - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ✅ - [`SRV`](../language-reference/domain-modifiers/SRV.md): ✅ - - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❔ + - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❌ - Security - [`CAA`](../language-reference/domain-modifiers/CAA.md): ✅ - - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❔ - - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❔ + - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❌ + - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❌ - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ✅ - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ✅ - DNSSEC - [`AUTODNSSEC`](../language-reference/domain-modifiers/AUTODNSSEC_ON.md): ❔ - - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❔ + - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❌ - [`DS`](../language-reference/domain-modifiers/DS.md): ❌ diff --git a/documentation/provider/ovh.md b/documentation/provider/ovh.md index b46c71d12a..0e9e3b85a5 100644 --- a/documentation/provider/ovh.md +++ b/documentation/provider/ovh.md @@ -157,23 +157,23 @@ OVH now allows to host DNS zone for a domain that is not registered in their reg - [get-zones](../commands/get-zones.md): ✅ - DNS extensions - [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md): ❌ - - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❔ + - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❌ - [`LOC`](../language-reference/domain-modifiers/LOC.md): ❔ - [`PTR`](../language-reference/domain-modifiers/PTR.md): ❌ - - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❔ + - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❌ - Service discovery - - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❔ - - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❔ + - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❌ + - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❌ - [`SRV`](../language-reference/domain-modifiers/SRV.md): ✅ - - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❔ + - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❌ - Security - [`CAA`](../language-reference/domain-modifiers/CAA.md): ✅ - - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❔ - - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❔ + - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❌ + - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❌ - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ✅ - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ✅ - DNSSEC - [`AUTODNSSEC`](../language-reference/domain-modifiers/AUTODNSSEC_ON.md): ❔ - - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❔ - - [`DS`](../language-reference/domain-modifiers/DS.md): ❔ + - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❌ + - [`DS`](../language-reference/domain-modifiers/DS.md): ❌ diff --git a/documentation/provider/packetframe.md b/documentation/provider/packetframe.md index 6abb36969d..f87584bbdb 100644 --- a/documentation/provider/packetframe.md +++ b/documentation/provider/packetframe.md @@ -46,24 +46,24 @@ D("example.com", REG_NONE, DnsProvider(DSP_PACKETFRAME), - create-domains: ❌ - [get-zones](../commands/get-zones.md): ❌ - DNS extensions - - [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md): ❔ - - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❔ - - [`LOC`](../language-reference/domain-modifiers/LOC.md): ❔ + - [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md): ❌ + - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❌ + - [`LOC`](../language-reference/domain-modifiers/LOC.md): ❌ - [`PTR`](../language-reference/domain-modifiers/PTR.md): ✅ - - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❔ + - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❌ - Service discovery - - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❔ - - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❔ + - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❌ + - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❌ - [`SRV`](../language-reference/domain-modifiers/SRV.md): ✅ - - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❔ + - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❌ - Security - - [`CAA`](../language-reference/domain-modifiers/CAA.md): ❔ - - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❔ - - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❔ - - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ❔ - - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ❔ + - [`CAA`](../language-reference/domain-modifiers/CAA.md): ❌ + - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❌ + - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❌ + - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ❌ + - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ❌ - DNSSEC - [`AUTODNSSEC`](../language-reference/domain-modifiers/AUTODNSSEC_ON.md): ❔ - - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❔ - - [`DS`](../language-reference/domain-modifiers/DS.md): ❔ + - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❌ + - [`DS`](../language-reference/domain-modifiers/DS.md): ❌ diff --git a/documentation/provider/porkbun.md b/documentation/provider/porkbun.md index 6a7a57aec1..1bee649dca 100644 --- a/documentation/provider/porkbun.md +++ b/documentation/provider/porkbun.md @@ -116,23 +116,23 @@ D("example.com", REG_PORKBUN, DnsProvider(DSP_PORKBUN), - [get-zones](../commands/get-zones.md): ✅ - DNS extensions - [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md): ✅ - - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❔ + - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❌ - [`LOC`](../language-reference/domain-modifiers/LOC.md): ❌ - [`PTR`](../language-reference/domain-modifiers/PTR.md): ❌ - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❌ - Service discovery - - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❔ + - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❌ - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❌ - [`SRV`](../language-reference/domain-modifiers/SRV.md): ✅ - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ✅ - Security - [`CAA`](../language-reference/domain-modifiers/CAA.md): ✅ - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ✅ - - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❔ + - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❌ - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ✅ - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ✅ - DNSSEC - [`AUTODNSSEC`](../language-reference/domain-modifiers/AUTODNSSEC_ON.md): ❌ - - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❔ + - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❌ - [`DS`](../language-reference/domain-modifiers/DS.md): ❌ diff --git a/documentation/provider/powerdns.md b/documentation/provider/powerdns.md index 1e51f92713..ffcabcb267 100644 --- a/documentation/provider/powerdns.md +++ b/documentation/provider/powerdns.md @@ -155,7 +155,7 @@ be handled with an `if`-statement in the for loop. - Security - [`CAA`](../language-reference/domain-modifiers/CAA.md): ✅ - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ✅ - - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❔ + - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❌ - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ✅ - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ✅ - DNSSEC diff --git a/documentation/provider/realtimeregister.md b/documentation/provider/realtimeregister.md index 94fe34c05f..0bd5e455c1 100644 --- a/documentation/provider/realtimeregister.md +++ b/documentation/provider/realtimeregister.md @@ -61,7 +61,7 @@ D("example.com", REG_RTR, DnsProvider(DSP_RTR), - [get-zones](../commands/get-zones.md): ✅ - DNS extensions - [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md): ✅ - - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❔ + - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❌ - [`LOC`](../language-reference/domain-modifiers/LOC.md): ✅ - [`PTR`](../language-reference/domain-modifiers/PTR.md): ❌ - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❌ @@ -69,15 +69,15 @@ D("example.com", REG_RTR, DnsProvider(DSP_RTR), - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❌ - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ✅ - [`SRV`](../language-reference/domain-modifiers/SRV.md): ✅ - - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❔ + - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❌ - Security - [`CAA`](../language-reference/domain-modifiers/CAA.md): ✅ - - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❔ - - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❔ + - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❌ + - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❌ - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ✅ - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ✅ - DNSSEC - [`AUTODNSSEC`](../language-reference/domain-modifiers/AUTODNSSEC_ON.md): ✅ - - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❔ + - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❌ - [`DS`](../language-reference/domain-modifiers/DS.md): ❌ diff --git a/documentation/provider/route53.md b/documentation/provider/route53.md index b700767db4..6ca8f1f951 100644 --- a/documentation/provider/route53.md +++ b/documentation/provider/route53.md @@ -329,23 +329,23 @@ This means a space is present in one or more of the credential values. - [get-zones](../commands/get-zones.md): ✅ - DNS extensions - [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md): ❌ - - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❔ + - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❌ - [`LOC`](../language-reference/domain-modifiers/LOC.md): ❌ - [`PTR`](../language-reference/domain-modifiers/PTR.md): ✅ - [`SOA`](../language-reference/domain-modifiers/SOA.md): ✅ - Service discovery - - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❔ - - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❔ + - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❌ + - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❌ - [`SRV`](../language-reference/domain-modifiers/SRV.md): ✅ - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ✅ - Security - [`CAA`](../language-reference/domain-modifiers/CAA.md): ✅ - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ✅ - - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❔ + - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❌ - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ✅ - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ✅ - DNSSEC - [`AUTODNSSEC`](../language-reference/domain-modifiers/AUTODNSSEC_ON.md): ❔ - - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❔ - - [`DS`](../language-reference/domain-modifiers/DS.md): ❔ + - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❌ + - [`DS`](../language-reference/domain-modifiers/DS.md): ❌ diff --git a/documentation/provider/rwth.md b/documentation/provider/rwth.md index ec483dbc89..6fd7a48ec5 100644 --- a/documentation/provider/rwth.md +++ b/documentation/provider/rwth.md @@ -54,23 +54,23 @@ The RWTH deploys zones every 15 minutes, so it might take some time for changes - [get-zones](../commands/get-zones.md): ✅ - DNS extensions - [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md): ❌ - - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❔ + - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❌ - [`LOC`](../language-reference/domain-modifiers/LOC.md): ❌ - [`PTR`](../language-reference/domain-modifiers/PTR.md): ✅ - - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❔ + - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❌ - Service discovery - - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❔ + - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❌ - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❌ - [`SRV`](../language-reference/domain-modifiers/SRV.md): ✅ - - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❔ + - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❌ - Security - [`CAA`](../language-reference/domain-modifiers/CAA.md): ✅ - - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❔ - - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❔ + - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❌ + - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❌ - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ✅ - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ❌ - DNSSEC - [`AUTODNSSEC`](../language-reference/domain-modifiers/AUTODNSSEC_ON.md): ❔ - - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❔ + - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❌ - [`DS`](../language-reference/domain-modifiers/DS.md): ❔ diff --git a/documentation/provider/sakuracloud.md b/documentation/provider/sakuracloud.md index fe3a948888..24edfea1ff 100644 --- a/documentation/provider/sakuracloud.md +++ b/documentation/provider/sakuracloud.md @@ -112,7 +112,7 @@ The limitations not described in that manual are: - Security - [`CAA`](../language-reference/domain-modifiers/CAA.md): ✅ - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ✅ - - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❔ + - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❌ - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ❌ - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ❌ - DNSSEC diff --git a/documentation/provider/scaleway.md b/documentation/provider/scaleway.md index 846942f222..06c63a517a 100644 --- a/documentation/provider/scaleway.md +++ b/documentation/provider/scaleway.md @@ -91,11 +91,11 @@ managed by DNSControl. - Security - [`CAA`](../language-reference/domain-modifiers/CAA.md): ✅ - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ✅ - - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❔ + - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❌ - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ✅ - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ✅ - DNSSEC - [`AUTODNSSEC`](../language-reference/domain-modifiers/AUTODNSSEC_ON.md): ❌ - - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❔ + - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❌ - [`DS`](../language-reference/domain-modifiers/DS.md): ❌ diff --git a/documentation/provider/softlayer.md b/documentation/provider/softlayer.md index 938582d5f0..af90450df7 100644 --- a/documentation/provider/softlayer.md +++ b/documentation/provider/softlayer.md @@ -71,24 +71,24 @@ D("example.com", REG_NONE, DnsProvider(SOFTLAYER), - create-domains: ❌ - [get-zones](../commands/get-zones.md): ❌ - DNS extensions - - [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md): ❔ - - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❔ + - [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md): ❌ + - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❌ - [`LOC`](../language-reference/domain-modifiers/LOC.md): ❌ - - [`PTR`](../language-reference/domain-modifiers/PTR.md): ❔ - - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❔ + - [`PTR`](../language-reference/domain-modifiers/PTR.md): ❌ + - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❌ - Service discovery - - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❔ - - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❔ + - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❌ + - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❌ - [`SRV`](../language-reference/domain-modifiers/SRV.md): ✅ - - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❔ + - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❌ - Security - - [`CAA`](../language-reference/domain-modifiers/CAA.md): ❔ - - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❔ - - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❔ - - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ❔ - - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ❔ + - [`CAA`](../language-reference/domain-modifiers/CAA.md): ❌ + - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❌ + - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❌ + - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ❌ + - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ❌ - DNSSEC - [`AUTODNSSEC`](../language-reference/domain-modifiers/AUTODNSSEC_ON.md): ❔ - - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❔ - - [`DS`](../language-reference/domain-modifiers/DS.md): ❔ + - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❌ + - [`DS`](../language-reference/domain-modifiers/DS.md): ❌ diff --git a/documentation/provider/spaceship.md b/documentation/provider/spaceship.md index 6ba27b9f65..5d1c9d8e46 100644 --- a/documentation/provider/spaceship.md +++ b/documentation/provider/spaceship.md @@ -112,23 +112,23 @@ Null MX ([RFC 7505](https://www.rfc-editor.org/rfc/rfc7505.html), `MX("@", 0, ". - [get-zones](../commands/get-zones.md): ✅ - DNS extensions - [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md): ✅ - - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❔ + - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❌ - [`LOC`](../language-reference/domain-modifiers/LOC.md): ❌ - [`PTR`](../language-reference/domain-modifiers/PTR.md): ✅ - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❌ - Service discovery - - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❔ + - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❌ - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❌ - [`SRV`](../language-reference/domain-modifiers/SRV.md): ✅ - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ✅ - Security - [`CAA`](../language-reference/domain-modifiers/CAA.md): ✅ - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ✅ - - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❔ + - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❌ - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ❌ - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ✅ - DNSSEC - [`AUTODNSSEC`](../language-reference/domain-modifiers/AUTODNSSEC_ON.md): ❌ - - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❔ + - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❌ - [`DS`](../language-reference/domain-modifiers/DS.md): ❌ diff --git a/documentation/provider/tencentdns.md b/documentation/provider/tencentdns.md index 751c8187ea..081b52c0b1 100644 --- a/documentation/provider/tencentdns.md +++ b/documentation/provider/tencentdns.md @@ -187,23 +187,23 @@ Reference: https://docs.dnspod.com/dns/faq-dns-resolution/?lang=en - [get-zones](../commands/get-zones.md): ✅ - DNS extensions - [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md): ❌ - - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❔ - - [`LOC`](../language-reference/domain-modifiers/LOC.md): ❔ + - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❌ + - [`LOC`](../language-reference/domain-modifiers/LOC.md): ❌ - [`PTR`](../language-reference/domain-modifiers/PTR.md): ❌ - - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❔ + - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❌ - Service discovery - - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❔ - - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❔ + - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❌ + - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❌ - [`SRV`](../language-reference/domain-modifiers/SRV.md): ✅ - - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❔ + - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❌ - Security - [`CAA`](../language-reference/domain-modifiers/CAA.md): ✅ - - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❔ - - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❔ - - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ❔ - - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ❔ + - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❌ + - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❌ + - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ❌ + - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ❌ - DNSSEC - [`AUTODNSSEC`](../language-reference/domain-modifiers/AUTODNSSEC_ON.md): ❔ - - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❔ - - [`DS`](../language-reference/domain-modifiers/DS.md): ❔ + - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❌ + - [`DS`](../language-reference/domain-modifiers/DS.md): ❌ diff --git a/documentation/provider/transip.md b/documentation/provider/transip.md index e96e711c78..287305454c 100644 --- a/documentation/provider/transip.md +++ b/documentation/provider/transip.md @@ -122,7 +122,7 @@ Done. 2 corrections. - Security - [`CAA`](../language-reference/domain-modifiers/CAA.md): ✅ - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❌ - - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❔ + - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❌ - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ✅ - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ✅ - DNSSEC diff --git a/documentation/provider/unifi.md b/documentation/provider/unifi.md index db09e55472..28b95dcdb7 100644 --- a/documentation/provider/unifi.md +++ b/documentation/provider/unifi.md @@ -201,23 +201,23 @@ The provider does not support concurrent API operations. Changes are applied seq - [get-zones](../commands/get-zones.md): ❌ - DNS extensions - [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md): ❌ - - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❔ + - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❌ - [`LOC`](../language-reference/domain-modifiers/LOC.md): ❌ - [`PTR`](../language-reference/domain-modifiers/PTR.md): ❌ - - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❔ + - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❌ - Service discovery - - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❔ - - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❔ + - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❌ + - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❌ - [`SRV`](../language-reference/domain-modifiers/SRV.md): ✅ - - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❔ + - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❌ - Security - [`CAA`](../language-reference/domain-modifiers/CAA.md): ❌ - - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❔ - - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❔ + - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❌ + - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❌ - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ❌ - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ❌ - DNSSEC - [`AUTODNSSEC`](../language-reference/domain-modifiers/AUTODNSSEC_ON.md): ❔ - - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❔ - - [`DS`](../language-reference/domain-modifiers/DS.md): ❔ + - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❌ + - [`DS`](../language-reference/domain-modifiers/DS.md): ❌ diff --git a/documentation/provider/vercel.md b/documentation/provider/vercel.md index 4454746b7e..82a229ff20 100644 --- a/documentation/provider/vercel.md +++ b/documentation/provider/vercel.md @@ -181,7 +181,7 @@ The detail of Vercel's validation process is unknown, thus we can not support st - Security - [`CAA`](../language-reference/domain-modifiers/CAA.md): ✅ - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ✅ - - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❔ + - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❌ - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ❌ - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ❌ - DNSSEC diff --git a/documentation/provider/vultr.md b/documentation/provider/vultr.md index 212fd3a169..ee67f1cd65 100644 --- a/documentation/provider/vultr.md +++ b/documentation/provider/vultr.md @@ -52,23 +52,23 @@ Vultr depends on a Vultr personal access token. - [get-zones](../commands/get-zones.md): ✅ - DNS extensions - [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md): ❌ - - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❔ + - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❌ - [`LOC`](../language-reference/domain-modifiers/LOC.md): ❌ - [`PTR`](../language-reference/domain-modifiers/PTR.md): ❌ - - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❔ + - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❌ - Service discovery - - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❔ - - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❔ + - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❌ + - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❌ - [`SRV`](../language-reference/domain-modifiers/SRV.md): ✅ - - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❔ + - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❌ - Security - [`CAA`](../language-reference/domain-modifiers/CAA.md): ✅ - - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❔ - - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❔ + - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❌ + - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❌ - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ✅ - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ❌ - DNSSEC - [`AUTODNSSEC`](../language-reference/domain-modifiers/AUTODNSSEC_ON.md): ✅ - - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❔ - - [`DS`](../language-reference/domain-modifiers/DS.md): ❔ + - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❌ + - [`DS`](../language-reference/domain-modifiers/DS.md): ❌ diff --git a/documentation/provider/websupport.md b/documentation/provider/websupport.md index a7fdfbca27..77c4448f7f 100644 --- a/documentation/provider/websupport.md +++ b/documentation/provider/websupport.md @@ -109,23 +109,23 @@ secret itself is never transmitted. - [get-zones](../commands/get-zones.md): ❌ - DNS extensions - [`ALIAS`](../language-reference/domain-modifiers/ALIAS.md): ❌ - - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❔ + - [`DNAME`](../language-reference/domain-modifiers/DNAME.md): ❌ - [`LOC`](../language-reference/domain-modifiers/LOC.md): ❌ - [`PTR`](../language-reference/domain-modifiers/PTR.md): ❌ - [`SOA`](../language-reference/domain-modifiers/SOA.md): ❌ - Service discovery - - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❔ + - [`DHCID`](../language-reference/domain-modifiers/DHCID.md): ❌ - [`NAPTR`](../language-reference/domain-modifiers/NAPTR.md): ❌ - [`SRV`](../language-reference/domain-modifiers/SRV.md): ✅ - - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❔ + - [`SVCB`](../language-reference/domain-modifiers/SVCB.md): ❌ - Security - [`CAA`](../language-reference/domain-modifiers/CAA.md): ❌ - - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❔ - - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❔ + - [`HTTPS`](../language-reference/domain-modifiers/HTTPS.md): ❌ + - [`SMIMEA`](../language-reference/domain-modifiers/SMIMEA.md): ❌ - [`SSHFP`](../language-reference/domain-modifiers/SSHFP.md): ❌ - [`TLSA`](../language-reference/domain-modifiers/TLSA.md): ❌ - DNSSEC - [`AUTODNSSEC`](../language-reference/domain-modifiers/AUTODNSSEC_ON.md): ❔ - - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❔ + - [`DNSKEY`](../language-reference/domain-modifiers/DNSKEY.md): ❌ - [`DS`](../language-reference/domain-modifiers/DS.md): ❌ diff --git a/pkg/js/parse_tests/019-r53-alias.json b/pkg/js/parse_tests/019-r53-alias.json index fcb15740d7..51eb17ff35 100644 --- a/pkg/js/parse_tests/019-r53-alias.json +++ b/pkg/js/parse_tests/019-r53-alias.json @@ -8,9 +8,6 @@ { "comparablev3": "AAAA foo.com. \"\" \"\"", "filepos": "[line:7:5]", - "meta": { - "orig_custom_type": "R53_ALIAS" - }, "name": "aaaatest", "name_unicode": "aaaatest", "rdata": { @@ -26,9 +23,6 @@ { "comparablev3": "AAAA foo.com. false ERERTFGFGF", "filepos": "[line:8:5]", - "meta": { - "orig_custom_type": "R53_ALIAS" - }, "name": "aaaatest", "name_unicode": "aaaatest", "rdata": { @@ -44,9 +38,6 @@ { "comparablev3": "A foo.com. true \"\"", "filepos": "[line:5:5]", - "meta": { - "orig_custom_type": "R53_ALIAS" - }, "name": "aevaltargethealthtest", "name_unicode": "aevaltargethealthtest", "rdata": { @@ -62,9 +53,6 @@ { "comparablev3": "A foo.com. false \"\"", "filepos": "[line:6:5]", - "meta": { - "orig_custom_type": "R53_ALIAS" - }, "name": "aevaltargethealthtest2", "name_unicode": "aevaltargethealthtest2", "rdata": { @@ -80,9 +68,6 @@ { "comparablev3": "A foo.com. \"\" \"\"", "filepos": "[line:3:5]", - "meta": { - "orig_custom_type": "R53_ALIAS" - }, "name": "atest", "name_unicode": "atest", "rdata": { @@ -98,9 +83,6 @@ { "comparablev3": "A foo.com. false Z2FTEDLFRTF", "filepos": "[line:4:5]", - "meta": { - "orig_custom_type": "R53_ALIAS" - }, "name": "atest", "name_unicode": "atest", "rdata": { @@ -116,9 +98,6 @@ { "comparablev3": "CAA foo.com. \"\" \"\"", "filepos": "[line:14:5]", - "meta": { - "orig_custom_type": "R53_ALIAS" - }, "name": "caatest", "name_unicode": "caatest", "rdata": { @@ -134,9 +113,6 @@ { "comparablev3": "A d111111abcdef8.cloudfront.net. \"\" \"\"", "filepos": "[line:23:5]", - "meta": { - "orig_custom_type": "R53_ALIAS" - }, "name": "cftest", "name_unicode": "cftest", "rdata": { @@ -152,9 +128,6 @@ { "comparablev3": "A d222222abcdef8.cloudfront.net. false Z2FDTNDATAQYW2", "filepos": "[line:24:5]", - "meta": { - "orig_custom_type": "R53_ALIAS" - }, "name": "cfzonetest", "name_unicode": "cfzonetest", "rdata": { @@ -170,9 +143,6 @@ { "comparablev3": "CNAME foo.com. \"\" \"\"", "filepos": "[line:9:5]", - "meta": { - "orig_custom_type": "R53_ALIAS" - }, "name": "cnametest", "name_unicode": "cnametest", "rdata": { @@ -188,9 +158,6 @@ { "comparablev3": "DS foo.com. \"\" \"\"", "filepos": "[line:17:5]", - "meta": { - "orig_custom_type": "R53_ALIAS" - }, "name": "dstest", "name_unicode": "dstest", "rdata": { @@ -206,9 +173,6 @@ { "comparablev3": "HTTPS foo.com. \"\" \"\"", "filepos": "[line:21:5]", - "meta": { - "orig_custom_type": "R53_ALIAS" - }, "name": "httpstest", "name_unicode": "httpstest", "rdata": { @@ -224,9 +188,6 @@ { "comparablev3": "MX foo.com. \"\" \"\"", "filepos": "[line:2:5]", - "meta": { - "orig_custom_type": "R53_ALIAS" - }, "name": "mxtest", "name_unicode": "mxtest", "rdata": { @@ -242,9 +203,6 @@ { "comparablev3": "NAPTR foo.com. \"\" \"\"", "filepos": "[line:15:5]", - "meta": { - "orig_custom_type": "R53_ALIAS" - }, "name": "naptrtest", "name_unicode": "naptrtest", "rdata": { @@ -260,9 +218,6 @@ { "comparablev3": "PTR foo.com. \"\" \"\"", "filepos": "[line:10:5]", - "meta": { - "orig_custom_type": "R53_ALIAS" - }, "name": "ptrtest", "name_unicode": "ptrtest", "rdata": { @@ -278,9 +233,6 @@ { "comparablev3": "SOA foo.com. \"\" \"\"", "filepos": "[line:16:5]", - "meta": { - "orig_custom_type": "R53_ALIAS" - }, "name": "soatest", "name_unicode": "soatest", "rdata": { @@ -296,9 +248,6 @@ { "comparablev3": "SPF foo.com. \"\" \"\"", "filepos": "[line:13:5]", - "meta": { - "orig_custom_type": "R53_ALIAS" - }, "name": "spftest", "name_unicode": "spftest", "rdata": { @@ -314,9 +263,6 @@ { "comparablev3": "SRV foo.com. \"\" \"\"", "filepos": "[line:12:5]", - "meta": { - "orig_custom_type": "R53_ALIAS" - }, "name": "srvtest", "name_unicode": "srvtest", "rdata": { @@ -332,9 +278,6 @@ { "comparablev3": "SSHFP foo.com. \"\" \"\"", "filepos": "[line:19:5]", - "meta": { - "orig_custom_type": "R53_ALIAS" - }, "name": "sshfptest", "name_unicode": "sshfptest", "rdata": { @@ -350,9 +293,6 @@ { "comparablev3": "SVCB foo.com. \"\" \"\"", "filepos": "[line:20:5]", - "meta": { - "orig_custom_type": "R53_ALIAS" - }, "name": "svcbtest", "name_unicode": "svcbtest", "rdata": { @@ -368,9 +308,6 @@ { "comparablev3": "TLSA foo.com. \"\" \"\"", "filepos": "[line:18:5]", - "meta": { - "orig_custom_type": "R53_ALIAS" - }, "name": "tlsatest", "name_unicode": "tlsatest", "rdata": { @@ -386,9 +323,6 @@ { "comparablev3": "TXT foo.com. \"\" \"\"", "filepos": "[line:11:5]", - "meta": { - "orig_custom_type": "R53_ALIAS" - }, "name": "txttest", "name_unicode": "txttest", "rdata": { diff --git a/pkg/js/parse_tests/026-azure-alias.json b/pkg/js/parse_tests/026-azure-alias.json index d2fd251225..75ecd9aed6 100644 --- a/pkg/js/parse_tests/026-azure-alias.json +++ b/pkg/js/parse_tests/026-azure-alias.json @@ -8,9 +8,6 @@ { "comparablev3": "AAAA foo.com.", "filepos": "[line:3:5]", - "meta": { - "orig_custom_type": "AZURE_ALIAS" - }, "name": "aaaatest", "name_unicode": "aaaatest", "rdata": { @@ -24,9 +21,6 @@ { "comparablev3": "A foo.com.", "filepos": "[line:2:5]", - "meta": { - "orig_custom_type": "AZURE_ALIAS" - }, "name": "atest", "name_unicode": "atest", "rdata": { @@ -40,9 +34,6 @@ { "comparablev3": "CNAME foo.com.", "filepos": "[line:4:5]", - "meta": { - "orig_custom_type": "AZURE_ALIAS" - }, "name": "cnametest", "name_unicode": "cnametest", "rdata": { diff --git a/pkg/js/parse_tests/036-dextendcf.json b/pkg/js/parse_tests/036-dextendcf.json index 9769e92b28..86d7ccb31c 100644 --- a/pkg/js/parse_tests/036-dextendcf.json +++ b/pkg/js/parse_tests/036-dextendcf.json @@ -15,9 +15,6 @@ { "comparablev3": "test3.foo.com \"test-worker\"", "filepos": "[line:11:5]", - "meta": { - "orig_custom_type": "CF_WORKER_ROUTE" - }, "name": "@", "name_unicode": "@", "rdata": { diff --git a/pkg/js/parse_tests/040-cfWorkerRoute.json b/pkg/js/parse_tests/040-cfWorkerRoute.json index 0456118b12..bd85456dcc 100644 --- a/pkg/js/parse_tests/040-cfWorkerRoute.json +++ b/pkg/js/parse_tests/040-cfWorkerRoute.json @@ -8,9 +8,6 @@ { "comparablev3": "test.foo.com \"test-worker\"", "filepos": "[line:2:5]", - "meta": { - "orig_custom_type": "CF_WORKER_ROUTE" - }, "name": "@", "name_unicode": "@", "rdata": { diff --git a/pkg/js/parse_tests/040-r53-zone.json b/pkg/js/parse_tests/040-r53-zone.json index 444dd64ebd..778679d7f0 100644 --- a/pkg/js/parse_tests/040-r53-zone.json +++ b/pkg/js/parse_tests/040-r53-zone.json @@ -21,9 +21,6 @@ { "comparablev3": "A foo.com. false Z2FTEDLFRTZ", "filepos": "[line:6:5]", - "meta": { - "orig_custom_type": "R53_ALIAS" - }, "name": "atest", "name_unicode": "atest", "rdata": { diff --git a/pkg/js/parse_tests/061-mikrotik.json b/pkg/js/parse_tests/061-mikrotik.json index bef37556b9..05d82bd7e9 100644 --- a/pkg/js/parse_tests/061-mikrotik.json +++ b/pkg/js/parse_tests/061-mikrotik.json @@ -10,8 +10,7 @@ "filepos": "[line:2:5]", "meta": { "address_list": "vpn-list", - "match_subdomain": "true", - "orig_custom_type": "MIKROTIK_FWD" + "match_subdomain": "true" }, "name": "@", "name_unicode": "@", @@ -24,9 +23,6 @@ }, { "filepos": "[line:6:5]", - "meta": { - "orig_custom_type": "MIKROTIK_NXDOMAIN" - }, "name": "blocked", "name_unicode": "blocked", "rdata": {}, @@ -37,9 +33,6 @@ { "comparablev3": "10.0.0.53", "filepos": "[line:7:5]", - "meta": { - "orig_custom_type": "MIKROTIK_FORWARDER" - }, "name": "corp.example.com", "name_unicode": "corp.example.com", "rdata": { diff --git a/pkg/js/parse_tests/063-adguard.json b/pkg/js/parse_tests/063-adguard.json index c18e9d9b8e..69d6d92767 100644 --- a/pkg/js/parse_tests/063-adguard.json +++ b/pkg/js/parse_tests/063-adguard.json @@ -8,9 +8,6 @@ { "comparablev3": "\"\"", "filepos": "[line:2:5]", - "meta": { - "orig_custom_type": "ADGUARDHOME_A_PASSTHROUGH" - }, "name": "a", "name_unicode": "a", "rdata": { @@ -23,9 +20,6 @@ { "comparablev3": "\"\"", "filepos": "[line:3:5]", - "meta": { - "orig_custom_type": "ADGUARDHOME_AAAA_PASSTHROUGH" - }, "name": "aaaa", "name_unicode": "aaaa", "rdata": { diff --git a/pkg/js/parse_tests/064-lua.json b/pkg/js/parse_tests/064-lua.json index bfa9e99763..2153e76659 100644 --- a/pkg/js/parse_tests/064-lua.json +++ b/pkg/js/parse_tests/064-lua.json @@ -8,9 +8,6 @@ { "comparablev3": "TXT \"; return 'ok'\"", "filepos": "[line:5:5]", - "meta": { - "orig_custom_type": "LUA" - }, "name": "_diag", "name_unicode": "_diag", "rdata": { @@ -24,9 +21,6 @@ { "comparablev3": "A \"return_127_0_0_1\"", "filepos": "[line:4:5]", - "meta": { - "orig_custom_type": "LUA" - }, "name": "app", "name_unicode": "app", "rdata": { diff --git a/pkg/js/parse_tests/065-bunny.json b/pkg/js/parse_tests/065-bunny.json index 5542868dc6..91c33d544e 100644 --- a/pkg/js/parse_tests/065-bunny.json +++ b/pkg/js/parse_tests/065-bunny.json @@ -8,9 +8,6 @@ { "comparablev3": "12345", "filepos": "[line:4:5]", - "meta": { - "orig_custom_type": "BUNNY_DNS_PZ" - }, "name": "cdn", "name_unicode": "cdn", "rdata": { @@ -23,9 +20,6 @@ { "comparablev3": "\"https://example.com\"", "filepos": "[line:5:5]", - "meta": { - "orig_custom_type": "BUNNY_DNS_RDR" - }, "name": "go", "name_unicode": "go", "rdata": { diff --git a/pkg/js/parse_tests/066-cloudns.json b/pkg/js/parse_tests/066-cloudns.json index 5a1f420e21..d8f13b4bf7 100644 --- a/pkg/js/parse_tests/066-cloudns.json +++ b/pkg/js/parse_tests/066-cloudns.json @@ -8,9 +8,6 @@ { "comparablev3": "\"https://example.com\"", "filepos": "[line:1:25]", - "meta": { - "orig_custom_type": "CLOUDNS_WR" - }, "name": "www", "name_unicode": "www", "rdata": { diff --git a/pkg/js/parse_tests/067-porkbun.json b/pkg/js/parse_tests/067-porkbun.json index 882b48a51c..13e391cfc5 100644 --- a/pkg/js/parse_tests/067-porkbun.json +++ b/pkg/js/parse_tests/067-porkbun.json @@ -10,7 +10,6 @@ "filepos": "[line:4:5]", "meta": { "includePath": "yes", - "orig_custom_type": "PORKBUN_URLFWD", "type": "permanent", "wildcard": "no" }, diff --git a/pkg/normalize/provider_alias_test.go b/pkg/normalize/provider_alias_test.go index feb1615103..c03bc1f1e4 100644 --- a/pkg/normalize/provider_alias_test.go +++ b/pkg/normalize/provider_alias_test.go @@ -10,23 +10,24 @@ import ( func init() { providers.Register[*validationProvider]("TEST_CUSTOM_PROVIDER", providers.Definition{ FriendlyName: "Custom type test", Aliases: []string{"TEST_CUSTOM_ALIAS"}, - Features: providers.DocumentationNotes{}, // Exercise legacy ownership checks. + SupportedTypes: []string{ + "R53_ALIAS", + "ALIAS", + }, }) - providers.RegisterCustomRecordType("TEST_CUSTOM_TYPE", "TEST_CUSTOM_PROVIDER", "") - providers.RegisterCustomRecordType("TEST_CUSTOM_TYPE_ALIAS_OWNER", "TEST_CUSTOM_ALIAS", "") } func TestCustomRecordProviderAliases(t *testing.T) { - for _, rtype := range []string{"TEST_CUSTOM_TYPE", "TEST_CUSTOM_TYPE_ALIAS_OWNER"} { + for _, rtype := range []string{"R53_ALIAS", "ALIAS"} { for _, providerType := range []string{"TEST_CUSTOM_PROVIDER", "TEST_CUSTOM_ALIAS"} { r := &models.RecordConfig{Type: rtype, Metadata: map[string]string{}} - if err := validateLegacyRecordTypes(r, "example.com", []string{providerType}); err != nil { + if err := validateSupportedRecordTypes(r, "example.com", []string{providerType}); err != nil { t.Fatal(err) } - if r.Metadata["orig_custom_type"] != rtype { - t.Fatal("custom-type validation marker was lost") + if r.Type != rtype { + t.Fatal("validation changed the record type") } - if err := validateLegacyRecordTypes(r, "example.com", []string{providerType, plainProviderType}); err == nil { + if err := validateSupportedRecordTypes(r, "example.com", []string{providerType, "S5_BASIC8"}); err == nil { t.Fatal("custom type accepted by an unrelated provider") } } diff --git a/pkg/normalize/supported_types_test.go b/pkg/normalize/supported_types_test.go index 0da26d16ae..7f82d2601c 100644 --- a/pkg/normalize/supported_types_test.go +++ b/pkg/normalize/supported_types_test.go @@ -17,22 +17,51 @@ func (*supportedTypesAuditor) AuditRecords(models.Records) []error { return []error{errors.New("stage 5 audit ran")} } +type importedRecordsAuditor struct{ validationProvider } + +func (*importedRecordsAuditor) AuditRecords(records models.Records) []error { + for _, record := range records { + if record.Type != "A" { + return []error{fmt.Errorf("auditor received %s instead of a copied A record", record.Type)} + } + } + return nil +} + func init() { for name, def := range map[string]providers.Definition{ - "S5_DEFAULT": {}, - "S5_DEFAULT_EXCEPT": {SupportedTypes: []string{"Default", "NS:Cannot", "CAA:Cannot"}}, - "S5_EMPTY": {SupportedTypes: []string{}}, - "S5_RFC": {SupportedTypes: []string{"RFC"}}, - "S5_ALL": {SupportedTypes: []string{"*"}}, - "S5_CHILD": {SupportedTypes: []string{"DS:Cannot"}, CanUseDSForChildren: providers.Can()}, - "S5_FULL_DS": {SupportedTypes: []string{"DS"}, CanUseDSForChildren: providers.Cannot()}, - "S5_NO_DS": {SupportedTypes: []string{"DS:Cannot"}, CanUseDSForChildren: providers.Cannot()}, - "S5_IMPORT_ONLY": {SupportedTypes: []string{"IMPORT_TRANSFORM"}}, + "S5_BASIC8": {}, + "S5_BASIC8_EXCEPT": {SupportedTypes: []string{ + "Basic8", + "NS:Cannot", + "CAA:Cannot", + }}, + "S5_EMPTY": {SupportedTypes: []string{}}, + "S5_RFC": {SupportedTypes: []string{ + "RFC", + }}, + "S5_ALL": {SupportedTypes: []string{ + "*", + }}, + "S5_CHILD": {SupportedTypes: []string{ + "DS:Cannot", + }, CanUseDSForChildren: providers.Can()}, + "S5_FULL_DS": {SupportedTypes: []string{ + "DS", + }, CanUseDSForChildren: providers.Cannot()}, + "S5_NO_DS": {SupportedTypes: []string{ + "DS:Cannot", + }, CanUseDSForChildren: providers.Cannot()}, } { def.FriendlyName = name providers.Register[*validationProvider](name, def) } - providers.Register[*supportedTypesAuditor]("S5_AUDIT", providers.Definition{FriendlyName: "Auditor", SupportedTypes: []string{"*"}}) + providers.Register[*supportedTypesAuditor]("S5_AUDIT", providers.Definition{FriendlyName: "Auditor", SupportedTypes: []string{ + "*", + }}) + providers.Register[*importedRecordsAuditor]("S6_IMPORT_AUDIT", providers.Definition{FriendlyName: "Import auditor", SupportedTypes: []string{ + "A", + }}) } func TestExhaustiveRecordValidation(t *testing.T) { @@ -40,16 +69,16 @@ func TestExhaustiveRecordValidation(t *testing.T) { provider, label, rtype, data string allowed bool }{ - {"S5_DEFAULT", "@", "A", "192.0.2.1", true}, + {"S5_BASIC8", "@", "A", "192.0.2.1", true}, {"S5_EMPTY", "@", "A", "192.0.2.1", false}, - {"S5_DEFAULT", "@", "TXT", `"text"`, true}, - {"S5_DEFAULT", "child", "NS", "ns.example.net.", true}, - {"S5_DEFAULT", "@", "NS", "ns.example.net.", false}, - {"S5_DEFAULT", "@", "CAA", `0 issue "ca.example.net"`, true}, - {"S5_DEFAULT", "_sip._tcp", "SRV", "0 5 5060 sip.example.net.", true}, - {"S5_DEFAULT_EXCEPT", "child", "NS", "ns.example.net.", false}, - {"S5_DEFAULT_EXCEPT", "@", "CAA", `0 issue "ca.example.net"`, false}, - {"S5_DEFAULT_EXCEPT", "@", "TXT", `"text"`, true}, + {"S5_BASIC8", "@", "TXT", `"text"`, true}, + {"S5_BASIC8", "child", "NS", "ns.example.net.", true}, + {"S5_BASIC8", "@", "NS", "ns.example.net.", false}, + {"S5_BASIC8", "@", "CAA", `0 issue "ca.example.net"`, true}, + {"S5_BASIC8", "_sip._tcp", "SRV", "0 5 5060 sip.example.net.", true}, + {"S5_BASIC8_EXCEPT", "child", "NS", "ns.example.net.", false}, + {"S5_BASIC8_EXCEPT", "@", "CAA", `0 issue "ca.example.net"`, false}, + {"S5_BASIC8_EXCEPT", "@", "TXT", `"text"`, true}, {ProviderNoDS, "@", "TXT", `"text"`, true}, {ProviderNoDS, "child", "NS", "ns.example.net.", true}, {"S5_RFC", "@", "TXT", `"text"`, true}, @@ -59,7 +88,7 @@ func TestExhaustiveRecordValidation(t *testing.T) { {"S5_ALL", "edge", "AKAMAITLC", "A target.example.net.", true}, {"S5_ALL", "edge", "AKAMAITLC", "AAAA target.example.net.", true}, {"S5_ALL", "edge", "AKAMAITLC", "DUAL target.example.net.", true}, - {"S5_DEFAULT", "edge", "AKAMAITLC", "A target.example.net.", false}, + {"S5_BASIC8", "edge", "AKAMAITLC", "A target.example.net.", false}, {"S5_CHILD", "child", "DS", "12345 8 2 ABCD", true}, {"S5_CHILD", "@", "DS", "12345 8 2 ABCD", false}, {"S5_FULL_DS", "@", "DS", "12345 8 2 ABCD", true}, @@ -74,9 +103,6 @@ func TestExhaustiveRecordValidation(t *testing.T) { if (len(errs) == 0) != tc.allowed { t.Fatalf("allowed=%v, errors=%v", tc.allowed, errs) } - if tc.allowed && r.Metadata["orig_custom_type"] != "" { - t.Fatal("exhaustive validation added a legacy custom-type marker") - } }) } } @@ -107,9 +133,9 @@ func TestSupportedTypesRetainsOtherValidation(t *testing.T) { }) t.Run("every provider", func(t *testing.T) { dc := lineDomain("S5_ALL") - dc.DNSProviderInstances = append(dc.DNSProviderInstances, &models.DNSProviderInstance{Name: "second", ProviderType: "S5_DEFAULT"}) + dc.DNSProviderInstances = append(dc.DNSProviderInstances, &models.DNSProviderInstance{Name: "second", ProviderType: "S5_BASIC8"}) dc.AddRecordConfig(dc.MustNewRecordConfigParse("@", 300, "HINFO", `"CPU" "OS"`)) - if errs := validateDomain(t, dc); !strings.Contains(fmt.Sprint(errs), "S5_DEFAULT does not support") { + if errs := validateDomain(t, dc); !strings.Contains(fmt.Sprint(errs), "S5_BASIC8 does not support") { t.Fatalf("errors = %v", errs) } }) @@ -122,12 +148,25 @@ func TestSupportedTypesRetainsOtherValidation(t *testing.T) { }) } -func TestSupportedTypesBeforeAndAfterTransforms(t *testing.T) { - for _, provider := range []string{"S5_DEFAULT", "S5_IMPORT_ONLY", "S5_ALL"} { - t.Run(provider, func(t *testing.T) { +func TestImportTransformChecksCopiedRecords(t *testing.T) { + for _, tc := range []struct { + name, provider string + copyRecord bool + wantError string + }{ + {"implicit Basic8", "S5_BASIC8", true, ""}, + {"RFC", "S5_RFC", true, ""}, + {"wildcard", "S5_ALL", true, ""}, + {"auditor sees only copied records", "S6_IMPORT_AUDIT", true, ""}, + {"empty declaration accepts command", "S5_EMPTY", false, ""}, + {"empty declaration rejects copied records", "S5_EMPTY", true, "uses A records"}, + } { + t.Run(tc.name, func(t *testing.T) { source := models.MustNewDomainConfig("source.example") - source.AddRecordConfig(source.MustNewRecordConfig("www", 300, "A", "192.0.2.1")) - dest := lineDomain(provider) + if tc.copyRecord { + source.AddRecordConfig(source.MustNewRecordConfig("www", 300, "A", "192.0.2.1")) + } + dest := lineDomain(tc.provider) transform := "0.0.0.0~255.255.255.255~~0.0.0.0" r := dest.MustNewRecordConfig("@", 300, privatetypes.TypeIMPORTTRANSFORM, transform, 300, "", source.Name) r.Metadata["transform_table"] = transform @@ -137,20 +176,29 @@ func TestSupportedTypesBeforeAndAfterTransforms(t *testing.T) { t.Fatal(err) } errs := ValidateAndNormalizeConfig(config) - switch provider { - case "S5_DEFAULT": - if !strings.Contains(fmt.Sprint(errs), "uses IMPORT_TRANSFORM records") { - t.Fatalf("original pseudo-type not checked: %v", errs) - } - case "S5_IMPORT_ONLY": - if !strings.Contains(fmt.Sprint(errs), "uses A records") { - t.Fatalf("transformed records not checked: %v", errs) - } - case "S5_ALL": - if len(errs) != 0 || len(dest.Records) != 1 || dest.Records[0].Type != "A" { - t.Fatalf("transform failed: records=%v, errors=%v", dest.Records, errs) + if tc.wantError == "" && len(errs) != 0 || tc.wantError != "" && (len(errs) != 1 || !strings.Contains(errs[0].Error(), tc.wantError)) { + t.Fatalf("want error %q, got %v", tc.wantError, errs) + } + if tc.copyRecord { + if len(dest.Records) != 1 || dest.Records[0].Type != "A" { + t.Fatalf("command did not produce an A record: %v", dest.Records) } + } else if len(dest.Records) != 0 { + t.Fatalf("command was not consumed: %v", dest.Records) } }) } } + +func TestCatalogValidationWithoutResolvedProvider(t *testing.T) { + for _, pTypes := range [][]string{nil, {"-"}, {plainProviderType}} { + r := &models.RecordConfig{Type: "UNKNOWN_TYPE"} + if err := validateSupportedRecordTypes(r, "example.com", pTypes); err == nil || !strings.Contains(err.Error(), "unknown record type") { + t.Fatalf("providers=%v, error=%v", pTypes, err) + } + r.Type = "URL" + if err := validateSupportedRecordTypes(r, "example.com", pTypes); err != nil { + t.Fatalf("providers=%v, error=%v", pTypes, err) + } + } +} diff --git a/pkg/normalize/validate.go b/pkg/normalize/validate.go index 783b937a62..5d4c2a9f0b 100644 --- a/pkg/normalize/validate.go +++ b/pkg/normalize/validate.go @@ -32,83 +32,24 @@ func checkTarget(target string) error { return nil } -// validateSupportedRecordTypes checks original types before transformations and -// resulting types afterwards. The bool reports whether all providers opted in. -func validateSupportedRecordTypes(rec *models.RecordConfig, domain string, pTypes []string) (bool, error) { - allExhaustive := len(pTypes) != 0 +// validateSupportedRecordTypes checks catalog recognition and provider support +// for original types before transformations and resulting types afterwards. +func validateSupportedRecordTypes(rec *models.RecordConfig, domain string, pTypes []string) error { + if _, known := privatetypes.LookupRecordType(rec.Type); !known { + return fmt.Errorf("unknown record type %s in domain %s", rec.Type, domain) + } for _, pType := range pTypes { def, ok := providers.GetDefinition(pType) if !ok || !def.UsesSupportedTypes() { - allExhaustive = false continue } - if _, known := privatetypes.LookupRecordType(rec.Type); !known { - return false, fmt.Errorf("unknown record type %s in domain %s", rec.Type, domain) - } if def.RecordTypeSupport(rec.Type).HasFeature { continue } if rec.Type == "DS" && rec.GetLabel() != "@" && providers.ProviderHasCapability(pType, providers.CanUseDSForChildren) { continue } - return false, fmt.Errorf("domain %s uses %s records, but DNS provider type %s does not support them at %s", domain, rec.Type, pType, rec.GetLabel()) - } - return allExhaustive, nil -} - -// validateLegacyRecordTypes retains legacy recognition, ownership, and conversion for -// providers that have not declared SupportedTypes. -func validateLegacyRecordTypes(rec *models.RecordConfig, domain string, pTypes []string) error { - switch rec.Type { - // RCv3 records do not need this validation step. - case "CLOUDFLAREAPI_SINGLE_REDIRECT", "RP", "DS": - return nil - } - - // #rtype_variations - validTypes := map[string]bool{ - "A": true, - "AAAA": true, - "ALIAS": false, - "CAA": true, - "CNAME": true, - "DHCID": true, - "DNAME": true, - "DS": true, - "DNSKEY": true, - "HTTPS": true, - "IMPORT_TRANSFORM": false, - "LOC": true, - "MX": true, - "NAPTR": true, - "NS": true, - "OPENPGPKEY": true, - "PTR": true, - "SMIMEA": true, - "SOA": true, - "SRV": true, - "SSHFP": true, - "SVCB": true, - "TLSA": true, - "TXT": true, - } - _, ok := validTypes[rec.Type] - if !ok { - - cType := providers.GetCustomRecordType(rec.Type) - if cType == nil { - return fmt.Errorf("unsupported record type (%v) domain=%v name=%v Type=%s TypeNum=%d", rec.Type, domain, rec.GetLabel(), rec.Type, rec.TypeNum) - } - for _, providerType := range pTypes { - if providers.CanonicalName(providerType) != providers.CanonicalName(cType.Provider) { - return fmt.Errorf("custom record type %s is not compatible with provider type %s", rec.Type, providerType) - } - } - // it is ok. Lets replace the type with real type and add metadata to say we checked it - rec.Metadata["orig_custom_type"] = rec.Type - if cType.RealType != "" { - rec.Type = cType.RealType - } + return fmt.Errorf("domain %s uses %s records, but DNS provider type %s does not support them at %s", domain, rec.Type, pType, rec.GetLabel()) } return nil } @@ -260,11 +201,7 @@ func checkTargets(rec *models.RecordConfig, domain string) (errs []error) { default: if _, known := privatetypes.LookupRecordType(rec.Type); known && rec.GetRDATA() != nil { // Catalog records have already been parsed and validated. Provider - // support is checked separately; no ownership marker is needed. - return errs - } - if rec.Metadata["orig_custom_type"] != "" { - // it is a valid custom type. We perform no validation on target + // support is checked separately. return errs } errs = append(errs, fmt.Errorf("checkTargets: Unimplemented record type (%v) domain=%v name=%v", @@ -440,14 +377,10 @@ func ValidateAndNormalizeConfig(config *models.DNSConfig) (errs []error) { } } - // Validate the unmodified inputs: - allExhaustive, err := validateSupportedRecordTypes(rec, domain.Name, pTypes) - if err != nil { - errs = append(errs, err) - } else if !allExhaustive { - // Legacy normalization historically used no ownership filter. - // Retain its coverage until these providers migrate in Stage 6. - if err := validateLegacyRecordTypes(rec, domain.Name, nil); err != nil { + // IMPORT_TRANSFORM is a deferred command, not a provider record. + // It is consumed below; the resulting records are validated afterwards. + if rec.Type != "IMPORT_TRANSFORM" { + if err := validateSupportedRecordTypes(rec, domain.Name, pTypes); err != nil { errs = append(errs, err) } } @@ -959,7 +892,7 @@ func checkProviderCapabilities(dc *models.DomainConfig) error { pTypes = append(pTypes, provider.ProviderType) } for _, rec := range dc.Records { - if _, err := validateSupportedRecordTypes(rec, dc.Name, pTypes); err != nil { + if err := validateSupportedRecordTypes(rec, dc.Name, pTypes); err != nil { return err } } diff --git a/pkg/privatetypes/register.go b/pkg/privatetypes/register.go index f950219a97..ae3194ca56 100644 --- a/pkg/privatetypes/register.go +++ b/pkg/privatetypes/register.go @@ -24,7 +24,8 @@ type MakerRn func(origin string, metadata map[string]string, isEnabled nrc.Flags var TypeToMakeRDATA = make(map[uint16]MakerRn) // pseudoTypes records classification explicitly, independently of names and -// codepoint ranges. Types registered by Register are DNSControl pseudo-types. +// codepoint ranges. Register also handles internal commands, which are excluded +// from the zone record catalog by LookupRecordType. var pseudoTypes = map[uint16]bool{} var catalogVersion uint64 = 1 @@ -38,7 +39,8 @@ type RecordType struct { // Registration must finish before concurrent reads begin. func CatalogVersion() uint64 { return catalogVersion } -// LookupRecordType excludes protocol/query-only types from the zone catalog. +// LookupRecordType excludes protocol/query-only types and internal commands +// from the zone catalog. func LookupRecordType(name string) (RecordType, bool) { code, ok := dnsv2.StringToType[name] if !ok || dnsv2.TypeToRR[code] == nil { @@ -47,6 +49,8 @@ func LookupRecordType(name string) (RecordType, bool) { switch code { case dnsv2.TypeANY, dnsv2.TypeAXFR, dnsv2.TypeIXFR, dnsv2.TypeOPT, dnsv2.TypeTKEY, dnsv2.TypeTSIG: return RecordType{}, false + case TypeIMPORTTRANSFORM: + return RecordType{}, false // Deferred configuration command, never sent to providers. } return RecordType{Name: name, Pseudo: pseudoTypes[code]}, true } diff --git a/pkg/privatetypes/register_test.go b/pkg/privatetypes/register_test.go index 7e04154078..676f532350 100644 --- a/pkg/privatetypes/register_test.go +++ b/pkg/privatetypes/register_test.go @@ -19,7 +19,7 @@ func TestRecordCatalog(t *testing.T) { t.Errorf("pseudo-type %s = %+v, %v", name, typ, ok) } } - for _, name := range []string{"UNRECOGNIZED", "ANY", "AXFR", "IXFR", "OPT", "TKEY", "TSIG"} { + for _, name := range []string{"UNRECOGNIZED", "ANY", "AXFR", "IXFR", "OPT", "TKEY", "TSIG", "IMPORT_TRANSFORM"} { if _, ok := LookupRecordType(name); ok { t.Errorf("non-zone type %s accepted", name) } diff --git a/pkg/providers/capabilities.go b/pkg/providers/capabilities.go index f736b24669..ce8fa14de8 100644 --- a/pkg/providers/capabilities.go +++ b/pkg/providers/capabilities.go @@ -25,14 +25,6 @@ const ( // Reading explicitly named zones does not require this capability. CanGetZones - // CanOnlyDiff1Features indicates the provider has not yet been upgraded to - // use the "diff2" differencing engine. Instead, it uses the the backwards - // compatibility mode. The diff2 engine is required to repliably provide - // IGNORE(), NO_PURGE, and other features. - // Providers using compatibility mode declare Can() in Definition.Features. - // All other values (Unimplemented and Cannot) are equivalent. - CanOnlyDiff1Features - // CanUseAKAMAICDN indicates the provider support the specific AKAMAICDN records that only the Akamai EdgeDns provider supports. CanUseAKAMAICDN diff --git a/pkg/providers/capability_string.go b/pkg/providers/capability_string.go index ac6ca2723a..2e0567e856 100644 --- a/pkg/providers/capability_string.go +++ b/pkg/providers/capability_string.go @@ -11,38 +11,37 @@ func _() { _ = x[CanAutoDNSSEC-0] _ = x[CanConcur-1] _ = x[CanGetZones-2] - _ = x[CanOnlyDiff1Features-3] - _ = x[CanUseAKAMAICDN-4] - _ = x[CanUseAlias-5] - _ = x[CanUseAzureAlias-6] - _ = x[CanUseCAA-7] - _ = x[CanUseDHCID-8] - _ = x[CanUseDNAME-9] - _ = x[CanUseDS-10] - _ = x[CanUseDSForChildren-11] - _ = x[CanUseHTTPS-12] - _ = x[CanUseLOC-13] - _ = x[CanUseNAPTR-14] - _ = x[CanUsePTR-15] - _ = x[CanUseRoute53Alias-16] - _ = x[CanUseRP-17] - _ = x[CanUseSMIMEA-18] - _ = x[CanUseSOA-19] - _ = x[CanUseSRV-20] - _ = x[CanUseSSHFP-21] - _ = x[CanUseSVCB-22] - _ = x[CanUseTLSA-23] - _ = x[CanUseDNSKEY-24] - _ = x[CanUseOPENPGPKEY-25] - _ = x[DocCreateDomains-26] - _ = x[DocDualHost-27] - _ = x[DocOfficiallySupported-28] - _ = x[CanUseAKAMAITLC-29] + _ = x[CanUseAKAMAICDN-3] + _ = x[CanUseAlias-4] + _ = x[CanUseAzureAlias-5] + _ = x[CanUseCAA-6] + _ = x[CanUseDHCID-7] + _ = x[CanUseDNAME-8] + _ = x[CanUseDS-9] + _ = x[CanUseDSForChildren-10] + _ = x[CanUseHTTPS-11] + _ = x[CanUseLOC-12] + _ = x[CanUseNAPTR-13] + _ = x[CanUsePTR-14] + _ = x[CanUseRoute53Alias-15] + _ = x[CanUseRP-16] + _ = x[CanUseSMIMEA-17] + _ = x[CanUseSOA-18] + _ = x[CanUseSRV-19] + _ = x[CanUseSSHFP-20] + _ = x[CanUseSVCB-21] + _ = x[CanUseTLSA-22] + _ = x[CanUseDNSKEY-23] + _ = x[CanUseOPENPGPKEY-24] + _ = x[DocCreateDomains-25] + _ = x[DocDualHost-26] + _ = x[DocOfficiallySupported-27] + _ = x[CanUseAKAMAITLC-28] } -const _Capability_name = "CanAutoDNSSECCanConcurCanGetZonesCanOnlyDiff1FeaturesCanUseAKAMAICDNCanUseAliasCanUseAzureAliasCanUseCAACanUseDHCIDCanUseDNAMECanUseDSCanUseDSForChildrenCanUseHTTPSCanUseLOCCanUseNAPTRCanUsePTRCanUseRoute53AliasCanUseRPCanUseSMIMEACanUseSOACanUseSRVCanUseSSHFPCanUseSVCBCanUseTLSACanUseDNSKEYCanUseOPENPGPKEYDocCreateDomainsDocDualHostDocOfficiallySupportedCanUseAKAMAITLC" +const _Capability_name = "CanAutoDNSSECCanConcurCanGetZonesCanUseAKAMAICDNCanUseAliasCanUseAzureAliasCanUseCAACanUseDHCIDCanUseDNAMECanUseDSCanUseDSForChildrenCanUseHTTPSCanUseLOCCanUseNAPTRCanUsePTRCanUseRoute53AliasCanUseRPCanUseSMIMEACanUseSOACanUseSRVCanUseSSHFPCanUseSVCBCanUseTLSACanUseDNSKEYCanUseOPENPGPKEYDocCreateDomainsDocDualHostDocOfficiallySupportedCanUseAKAMAITLC" -var _Capability_index = [...]uint16{0, 13, 22, 33, 53, 68, 79, 95, 104, 115, 126, 134, 153, 164, 173, 184, 193, 211, 219, 231, 240, 249, 260, 270, 280, 292, 308, 324, 335, 357, 372} +var _Capability_index = [...]uint16{0, 13, 22, 33, 48, 59, 75, 84, 95, 106, 114, 133, 144, 153, 164, 173, 191, 199, 211, 220, 229, 240, 250, 260, 272, 288, 304, 315, 337, 352} func (i Capability) String() string { idx := int(i) - 0 diff --git a/pkg/providers/definition.go b/pkg/providers/definition.go index 56f406531e..31f727925d 100644 --- a/pkg/providers/definition.go +++ b/pkg/providers/definition.go @@ -66,9 +66,10 @@ type Definition struct { Features DocumentationNotes // SupportedTypes is an exhaustive declaration of record support. Nil means - // Default (A, AAAA, CAA, CNAME, MX, NS, SRV, TXT), except that non-nil + // Basic8 (A, AAAA, CAA, CNAME, MX, NS, SRV, TXT), except that non-nil // Features retains legacy validation. A non-nil empty slice declares no // support beyond Features. + // Internal commands such as IMPORT_TRANSFORM do not belong in this list. SupportedTypes []string typeSelectors []typeSelector diff --git a/pkg/providers/providers.go b/pkg/providers/providers.go index 0fe8bc6ffd..2d47400220 100644 --- a/pkg/providers/providers.go +++ b/pkg/providers/providers.go @@ -148,30 +148,9 @@ func (*None) Initialize(map[string]string, json.RawMessage, *CreateOptions) erro func init() { Register[*None]("NONE", Definition{ - FriendlyName: "No registrar", - CanConcur: Can(), - Notes: "Use NONE when you do not want DNSControl to manage nameserver delegation (that is, the nameservers for this domain will be managed manually).", + FriendlyName: "No registrar", + SupportedTypes: []string{}, + CanConcur: Can(), + Notes: "Use NONE when you do not want DNSControl to manage nameserver delegation (that is, the nameservers for this domain will be managed manually).", }) } - -// CustomRType stores an rtype that is only valid for this DSP. -type CustomRType struct { - Name string - Provider string - RealType string -} - -// RegisterCustomRecordType registers a record type that is only valid for one provider. -// provider is the registered type of provider this is valid with -// name is the record type as it will appear in the js. (should be something like $PROVIDER_FOO) -// realType is the record type it will be replaced with after validation. -func RegisterCustomRecordType(name, provider, realType string) { - customRecordTypes[name] = &CustomRType{Name: name, Provider: provider, RealType: realType} -} - -// GetCustomRecordType returns a registered custom record type, or nil if none. -func GetCustomRecordType(rType string) *CustomRType { - return customRecordTypes[rType] -} - -var customRecordTypes = map[string]*CustomRType{} diff --git a/pkg/providers/registrations_test.go b/pkg/providers/registrations_test.go index f14ba236a6..4939160a81 100644 --- a/pkg/providers/registrations_test.go +++ b/pkg/providers/registrations_test.go @@ -14,7 +14,23 @@ func TestAllProvidersUseDefinitions(t *testing.T) { if got, ok := providers.GetDefinition(def.TypeName); !ok || got != def { t.Fatalf("%s: canonical definition lookup failed", def.TypeName) } + if def.SupportedTypes == nil || !def.UsesSupportedTypes() { + t.Errorf("%s: missing exhaustive SupportedTypes declaration", def.TypeName) + } + for capability, note := range def.Features { + switch capability { + case providers.CanAutoDNSSEC, providers.CanConcur, providers.CanUseDSForChildren, + providers.DocDualHost, providers.DocOfficiallySupported: + t.Errorf("%s: %s belongs in its named field", def.TypeName, capability) + } + if note.Comment == "" && note.Link == "" { + t.Errorf("%s: Features[%s] has no annotation to retain", def.TypeName, capability) + } + } if !def.Kind.Has(providers.KindDNS) { + if len(def.SupportedTypes) != 0 { + t.Errorf("%s: registrar-only provider declares record support", def.TypeName) + } continue } t.Run(def.TypeName, func(t *testing.T) { diff --git a/pkg/providers/supported_types.go b/pkg/providers/supported_types.go index ef90fe8144..9e2dc9e32c 100644 --- a/pkg/providers/supported_types.go +++ b/pkg/providers/supported_types.go @@ -34,7 +34,7 @@ type typeSelector struct { func (d *Definition) compileTypeSelectors() error { selectors := d.SupportedTypes if selectors == nil && d.Features == nil { - selectors = []string{"Default"} + selectors = []string{"Basic8"} } for _, source := range selectors { name, status, suffixed := strings.Cut(source, ":") @@ -55,7 +55,7 @@ func (d *Definition) compileTypeSelectors() error { } } switch { - case name == "DEFAULT" || name == "RFC": + case name == "BASIC8" || name == "RFC": if suffixed { return fmt.Errorf("provider %q: category %q cannot have a status suffix", d.TypeName, source) } @@ -76,7 +76,7 @@ func (d *Definition) compileTypeSelectors() error { func (s typeSelector) matches(typ privatetypes.RecordType) bool { switch s.name { - case "DEFAULT": + case "BASIC8": switch typ.Name { case "A", "AAAA", "CAA", "CNAME", "MX", "NS", "SRV", "TXT": return true diff --git a/pkg/providers/supported_types_test.go b/pkg/providers/supported_types_test.go index 3870b3a5ee..0f68a27ac5 100644 --- a/pkg/providers/supported_types_test.go +++ b/pkg/providers/supported_types_test.go @@ -21,7 +21,7 @@ func TestSupportedTypesDefaults(t *testing.T) { allowed []string }{ {"nil", nil, nil, true, []string{"A", "AAAA", "CAA", "CNAME", "MX", "NS", "SRV", "TXT"}}, - {"Default", []string{"Default"}, nil, true, []string{"A", "AAAA", "CAA", "CNAME", "MX", "NS", "SRV", "TXT"}}, + {"Basic8", []string{"Basic8"}, nil, true, []string{"A", "AAAA", "CAA", "CNAME", "MX", "NS", "SRV", "TXT"}}, {"empty", []string{}, nil, true, nil}, {"legacy", nil, DocumentationNotes{CanUseCAA: Can()}, false, []string{"CAA"}}, {"empty with legacy", []string{}, DocumentationNotes{CanUseCAA: Can()}, true, []string{"CAA"}}, @@ -51,18 +51,20 @@ func TestSupportedTypesResolution(t *testing.T) { want *DocumentationNote }{ {"RFC ordinary", []string{"RFC"}, nil, "HINFO", Can()}, + {"lowercase Basic8", []string{"basic8"}, nil, "CAA", Can()}, {"RFC pseudo", []string{"RFC"}, nil, "AKAMAITLC", Cannot()}, {"star pseudo", []string{"*"}, nil, "AKAMAITLC", Can()}, {"unknown", []string{"*"}, nil, "DOES_NOT_EXIST", Cannot()}, {"protocol type", []string{"*"}, nil, "AXFR", Cannot()}, + {"internal command", []string{"*"}, nil, "IMPORT_TRANSFORM", Cannot()}, {"prefix", []string{"BUNNY_*"}, nil, "BUNNY_DNS_PZ", Can()}, {"whole name", []string{"BUNNY*:Can"}, nil, "A", Cannot()}, {"no match", []string{"FUTURE_*"}, nil, "A", Cannot()}, {"lowercase type", []string{"caa:Can"}, nil, "caa", Can()}, {"exact exclusion", []string{"RFC", "CAA:Cannot"}, nil, "CAA", Cannot()}, - {"default exclusion", []string{"Default", "CAA:Cannot"}, nil, "CAA", Cannot()}, - {"default legacy exception", []string{"Default"}, DocumentationNotes{CanUseCAA: Cannot("legacy limit")}, "CAA", Cannot("legacy limit")}, - {"default legacy unimplemented", []string{"Default"}, DocumentationNotes{CanUseSRV: Unimplemented("pending")}, "SRV", Unimplemented("pending")}, + {"Basic8 exclusion", []string{"Basic8", "CAA:Cannot"}, nil, "CAA", Cannot()}, + {"Basic8 legacy exception", []string{"Basic8"}, DocumentationNotes{CanUseCAA: Cannot("legacy limit")}, "CAA", Cannot("legacy limit")}, + {"Basic8 legacy unimplemented", []string{"Basic8"}, DocumentationNotes{CanUseSRV: Unimplemented("pending")}, "SRV", Unimplemented("pending")}, {"pattern exclusion", []string{"*", "BUNNY_*:Cannot"}, nil, "BUNNY_DNS_PZ", Cannot()}, {"exact inclusion", []string{"*:Cannot", "CAA"}, nil, "CAA", Can()}, {"unimplemented pattern", []string{"*", "AKAMAI*:Unimplemented"}, nil, "AKAMAITLC", Unimplemented()}, @@ -100,16 +102,18 @@ func TestSupportedTypesResolution(t *testing.T) { } func TestSupportedTypesErrors(t *testing.T) { - for _, selector := range []string{"", " CAA", "CAA ", "CA?", "[A]", "A,B", "CAA:", "CAA:can", "CAA:cAn", "CAA:Can:Cannot", "RFC:Cannot", "Default:Can"} { + for _, selector := range []string{"", " CAA", "CAA ", "CA?", "[A]", "A,B", "CAA:", "CAA:can", "CAA:cAn", "CAA:Can:Cannot", "RFC:Cannot", "Basic8:Can"} { t.Run(selector, func(t *testing.T) { isolateDefinitions(t) assertRegistrationPanics(t, "provider \"INVALID\"", func() { - Register[*definitionDNS]("INVALID", Definition{FriendlyName: "Invalid", SupportedTypes: []string{selector}}) + Register[*definitionDNS]("INVALID", Definition{FriendlyName: "Invalid", SupportedTypes: []string{ + selector, + }}) }) }) } for _, selectors := range [][]string{ - {"Standard"}, {"UNREGISTERED"}, {"CAA", "CAA:Cannot"}, + {"Standard"}, {"Default"}, {"UNREGISTERED"}, {"IMPORT_TRANSFORM"}, {"CAA", "CAA:Cannot"}, {"CAA:Cannot", "CAA:Unimplemented"}, {"CA*:Cannot", "*AA:Can"}, } { t.Run(strings.Join(selectors, ","), func(t *testing.T) { @@ -135,10 +139,16 @@ func TestSupportedTypesFinalization(t *testing.T) { codepoint++ } lateName := fmt.Sprintf("STAGEFIVELATE%d", codepoint) - Register[*definitionDNS]("WILDCARD", Definition{FriendlyName: "Wildcard", SupportedTypes: []string{"*"}}) - Register[*definitionDNS]("RFC", Definition{FriendlyName: "RFC", SupportedTypes: []string{"RFC"}}) + Register[*definitionDNS]("WILDCARD", Definition{FriendlyName: "Wildcard", SupportedTypes: []string{ + "*", + }}) + Register[*definitionDNS]("RFC", Definition{FriendlyName: "RFC", SupportedTypes: []string{ + "RFC", + }}) wildcard, _ := GetDefinition("WILDCARD") - Register[*definitionDNS]("EXACT", Definition{FriendlyName: "Exact", SupportedTypes: []string{lateName}}) + Register[*definitionDNS]("EXACT", Definition{FriendlyName: "Exact", SupportedTypes: []string{ + lateName, + }}) if err := Finalize(); err == nil { t.Fatal("unknown exact type accepted") } @@ -178,7 +188,10 @@ func TestSupportedTypesFinalization(t *testing.T) { // A later catalog addition can also reveal an overlap between patterns // that previously matched nothing. Finalization must check it again. conflictName := lateName + "CONFLICT" - Register[*definitionDNS]("CONFLICT", Definition{FriendlyName: "Conflict", SupportedTypes: []string{conflictName + "*:Can", "*" + conflictName + ":Cannot"}}) + Register[*definitionDNS]("CONFLICT", Definition{FriendlyName: "Conflict", SupportedTypes: []string{ + conflictName + "*:Can", + "*" + conflictName + ":Cannot", + }}) if err := Finalize(); err != nil { t.Fatal(err) } @@ -190,7 +203,9 @@ func TestSupportedTypesFinalization(t *testing.T) { func TestSupportedTypesOperationalCapabilities(t *testing.T) { isolateDefinitions(t) - Register[*definitionDNS]("ALL", Definition{FriendlyName: "All", SupportedTypes: []string{"*"}, CanUseDSForChildren: Cannot("obsolete")}) + Register[*definitionDNS]("ALL", Definition{FriendlyName: "All", SupportedTypes: []string{ + "*", + }, CanUseDSForChildren: Cannot("obsolete")}) d, _ := GetDefinition("ALL") if !ProviderHasCapability("ALL", CanUseDSForChildren) || d.DerivedFeatures[CanUseDSForChildren].Comment != "" { t.Fatal("general DS support must imply child support without contradictory notes") diff --git a/pkg/providers/type_adoption_test.go b/pkg/providers/type_adoption_test.go new file mode 100644 index 0000000000..e5761ba6c3 --- /dev/null +++ b/pkg/providers/type_adoption_test.go @@ -0,0 +1,137 @@ +package providers_test + +import ( + "fmt" + "strings" + "testing" + + "github.com/DNSControl/dnscontrol/v5/models" + "github.com/DNSControl/dnscontrol/v5/pkg/normalize" + "github.com/DNSControl/dnscontrol/v5/pkg/privatetypes" + "github.com/DNSControl/dnscontrol/v5/pkg/providers" +) + +func providerDomain(name string) *models.DomainConfig { + dc := models.MustNewDomainConfig("example.com") + dc.RegistrarName = "NONE" + dc.DNSProviderInstances = []*models.DNSProviderInstance{{Name: "dns", ProviderType: name}} + return dc +} + +func TestDeclaredBaselinePassesAuditing(t *testing.T) { + // Check declarations against the actual credential-free auditors, including + // their placement and data restrictions, rather than only the old flags. + for _, def := range providers.AllDefinitions() { + if !def.Kind.Has(providers.KindDNS) { + continue + } + for _, record := range []struct{ label, rtype, data string }{ + {"www", "A", "192.0.2.1"}, + {"www", "AAAA", "2001:db8::1"}, + {"@", "CAA", `0 issue "ca.target.test"`}, + {"www", "CNAME", "target.target.test."}, + {"@", "MX", "10 mail.target.test."}, + {"child", "NS", "ns.target.test."}, + {"_sip._tcp", "SRV", "0 5 5060 sip.target.test."}, + {"@", "TXT", `"text"`}, + } { + if !def.RecordTypeSupport(record.rtype).HasFeature { + continue + } + t.Run(def.TypeName+"/"+record.rtype, func(t *testing.T) { + dc := providerDomain(def.TypeName) + dc.AddRecordConfig(dc.MustNewRecordConfigParse(record.label, 3600, record.rtype, record.data)) + if errs := normalize.ValidateAndNormalizeConfig(&models.DNSConfig{Domains: []*models.DomainConfig{dc}}); len(errs) != 0 { + t.Fatal(errs) + } + }) + } + } +} + +func TestBaselineExceptions(t *testing.T) { + // These providers reject or discard types that legacy validation implicitly + // allowed. NS here means a child delegation, not injected apex nameservers. + for name, types := range map[string]string{ + "ADGUARDHOME": "MX NS TXT", "FORTIGATE": "MX NS TXT", "NETBIRD": "MX NS TXT", + "OPENWRT": "NS TXT", "UNIFI": "NS", "AZURE_PRIVATE_DNS": "NS", + "EXOSCALE": "NS", "NETCUP": "NS", "INFOBLOX": "NS", "MITTWALD": "NS", + "WEBSUPPORT": "NS", "OPENPROVIDER": "NS", + } { + for rtype := range strings.FieldsSeq(types) { + t.Run(name+"/"+rtype, func(t *testing.T) { + dc := providerDomain(name) + data := map[string]string{"MX": "10 mail.target.test.", "NS": "ns.target.test.", "TXT": `"text"`}[rtype] + dc.AddRecordConfig(dc.MustNewRecordConfigParse("child", 3600, rtype, data)) + errs := normalize.ValidateAndNormalizeConfig(&models.DNSConfig{Domains: []*models.DomainConfig{dc}}) + if !strings.Contains(fmt.Sprint(errs), "uses "+rtype+" records, but DNS provider type "+name+" does not support") { + t.Fatalf("missing exhaustive type check: %v", errs) + } + }) + } + } +} + +func TestSharedAndProprietaryTypes(t *testing.T) { + for _, tc := range []struct { + provider, rtype, data string + allowed bool + }{ + {"NAMECHEAP", "URL", "https://target.test/", true}, + {"PORKBUN", "URL", "https://target.test/", true}, + {"NAMECHEAP", "URL301", "https://target.test/", true}, + {"PORKBUN", "URL301", "https://target.test/", true}, + {"ROUTE53", "URL", "https://target.test/", false}, + {"ROUTE53", "R53_ALIAS", "A target.target.test. false Z123", true}, + {"CLOUDFLAREAPI", "R53_ALIAS", "A target.target.test. false Z123", false}, + {"CLOUDFLAREAPI", "CF_WORKER_ROUTE", `"example.com/*" "worker"`, true}, + {"ROUTE53", "CF_WORKER_ROUTE", `"example.com/*" "worker"`, false}, + {"NETLIFY", "NETLIFYV6", "", true}, + {"DNSIMPLE", "NETLIFYV6", "", false}, + {"POWERDNS", "LOC", "37 47 0 N 122 23 0 W 10m", false}, + } { + t.Run(tc.provider+"/"+tc.rtype, func(t *testing.T) { + dc := providerDomain(tc.provider) + if tc.rtype == "NETLIFYV6" { + // This pseudo-type has no RDATA arguments, matching its JS builder. + dc.AddRecordConfig(dc.MustNewRecordConfig("www", 3600, tc.rtype)) + } else { + dc.AddRecordConfig(dc.MustNewRecordConfigParse("www", 3600, tc.rtype, tc.data)) + } + errs := normalize.ValidateAndNormalizeConfig(&models.DNSConfig{Domains: []*models.DomainConfig{dc}}) + if (len(errs) == 0) != tc.allowed { + t.Fatalf("allowed=%v, errors=%v", tc.allowed, errs) + } + if !tc.allowed && !strings.Contains(fmt.Sprint(errs), "does not support") { + t.Fatalf("missing exhaustive type check: %v", errs) + } + }) + } +} + +func TestMigratedProvidersImportRecords(t *testing.T) { + for _, def := range providers.AllDefinitions() { + if !def.Kind.Has(providers.KindDNS) { + continue + } + t.Run(def.TypeName, func(t *testing.T) { + source := models.MustNewDomainConfig("source.example") + source.AddRecordConfig(source.MustNewRecordConfig("www", 3600, "A", "192.0.2.1")) + dest := providerDomain(def.TypeName) + transform := "0.0.0.0~255.255.255.255~~192.0.2.2" + r := dest.MustNewRecordConfig("@", 3600, privatetypes.TypeIMPORTTRANSFORM, transform, 3600, source.Name, source.Name) + r.Metadata["transform_table"] = transform + dest.AddRecordConfig(r) + config := &models.DNSConfig{Domains: []*models.DomainConfig{source, dest}} + if err := config.PostProcess(); err != nil { + t.Fatal(err) + } + if errs := normalize.ValidateAndNormalizeConfig(config); len(errs) != 0 { + t.Fatal(errs) + } + if len(dest.Records) != 1 || dest.Records[0].Type != "A" || dest.Records[0].GetLabel() != "www" || dest.Records[0].GetTargetIP().String() != "192.0.2.2" { + t.Fatalf("unexpected transformed records: %v", dest.Records) + } + }) + } +} diff --git a/providers/adguardhome/adguardHomeProvider.go b/providers/adguardhome/adguardHomeProvider.go index a92551bb99..9b62f25e78 100644 --- a/providers/adguardhome/adguardHomeProvider.go +++ b/providers/adguardhome/adguardHomeProvider.go @@ -32,18 +32,19 @@ func (c *adguardHomeProvider) Initialize(m map[string]string, _ json.RawMessage, } func init() { - const providerName = "ADGUARDHOME" - providers.RegisterCustomRecordType("ADGUARDHOME_A_PASSTHROUGH", providerName, "") - providers.RegisterCustomRecordType("ADGUARDHOME_AAAA_PASSTHROUGH", providerName, "") - providers.Register[*adguardHomeProvider](providerName, providers.Definition{ + providers.Register[*adguardHomeProvider]("ADGUARDHOME", providers.Definition{ FriendlyName: "AdGuard Home", Maintainer: "@ishanjain28", - Features: providers.DocumentationNotes{ - providers.CanConcur: providers.Unimplemented(), - providers.CanUseAlias: providers.Can(), - providers.CanGetZones: providers.Cannot(), - providers.DocOfficiallySupported: providers.Cannot(), + SupportedTypes: []string{ + "A", + "AAAA", + "ADGUARDHOME_AAAA_PASSTHROUGH", + "ADGUARDHOME_A_PASSTHROUGH", + "ALIAS", + "CNAME", }, + CanConcur: providers.Unimplemented(), + DocOfficiallySupported: providers.Cannot(), }) } diff --git a/providers/akamaiedgedns/akamaiEdgeDnsProvider.go b/providers/akamaiedgedns/akamaiEdgeDnsProvider.go index 11f665e16c..dcdabdc7bc 100644 --- a/providers/akamaiedgedns/akamaiEdgeDnsProvider.go +++ b/providers/akamaiedgedns/akamaiEdgeDnsProvider.go @@ -36,10 +36,7 @@ func (a *edgeDNSProvider) SetConversionObserver(observer providers.ConversionObs } func init() { - const providerName = "AKAMAIEDGEDNS" - providers.RegisterCustomRecordType("AKAMAICDN", providerName, "") - providers.RegisterCustomRecordType("AKAMAITLC", providerName, "") - providers.Register[*edgeDNSProvider](providerName, providers.Definition{ + providers.Register[*edgeDNSProvider]("AKAMAIEDGEDNS", providers.Definition{ FriendlyName: "Akamai Edge DNS", PortalURL: "https://control.akamai.com/apps/identity-management/", // TODO: Verify CredFields: []providers.CredsField{ @@ -83,28 +80,25 @@ func init() { }, }, Maintainer: "@meghanakudua02", + SupportedTypes: []string{ + "Basic8", + "AKAMAICDN", + "AKAMAITLC", + "ALIAS", + "LOC", + "NAPTR", + "PTR", + "SSHFP", + "TLSA", + }, + CanAutoDNSSEC: providers.Can(), + CanConcur: providers.Unimplemented(), + CanUseDSForChildren: providers.Can(), + DocDualHost: providers.Can(), + DocOfficiallySupported: providers.Cannot(), + // Features retains annotations for record types and interface-derived facts. Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - // See providers/capabilities.go for the entire list of capabilities. - providers.CanAutoDNSSEC: providers.Can(), - providers.CanConcur: providers.Unimplemented(), - providers.CanGetZones: providers.Can(), - providers.CanUseAKAMAICDN: providers.Can(), - providers.CanUseAKAMAITLC: providers.Can(), - providers.CanUseAlias: providers.Can("Akamai Edge DNS does not directly support ALIAS. Apex record will be converted to AKAMAITLC, any others to CNAME."), - providers.CanUseCAA: providers.Can(), - providers.CanUseDS: providers.Cannot(), - providers.CanUseDSForChildren: providers.Can(), - providers.CanUseLOC: providers.Can(), - providers.CanUseNAPTR: providers.Can(), - providers.CanUsePTR: providers.Can(), - providers.CanUseSOA: providers.Cannot(), - providers.CanUseSRV: providers.Can(), - providers.CanUseSSHFP: providers.Can(), - providers.CanUseTLSA: providers.Can(), - providers.DocCreateDomains: providers.Can(), - providers.DocDualHost: providers.Can(), - providers.DocOfficiallySupported: providers.Cannot(), + providers.CanUseAlias: providers.Can("Akamai Edge DNS does not directly support ALIAS. Apex record will be converted to AKAMAITLC, any others to CNAME."), }, }) } diff --git a/providers/alidns/aliDnsProvider.go b/providers/alidns/aliDnsProvider.go index bfd44b90ef..da34eb92e2 100644 --- a/providers/alidns/aliDnsProvider.go +++ b/providers/alidns/aliDnsProvider.go @@ -35,22 +35,13 @@ func init() { }, Maintainer: "@bytemain", DefaultTTL: 600, - Features: providers.DocumentationNotes{ - providers.CanUseAlias: providers.Cannot(), - providers.CanGetZones: providers.Can(), - providers.CanUseCAA: providers.Can(), - providers.CanUsePTR: providers.Cannot(), - providers.CanUseNAPTR: providers.Cannot(), - providers.CanUseSRV: providers.Can(), - providers.CanUseSSHFP: providers.Cannot(), - providers.CanUseTLSA: providers.Cannot(), - providers.CanAutoDNSSEC: providers.Cannot(), - providers.CanConcur: providers.Can(), - providers.DocOfficiallySupported: providers.Cannot(), - providers.DocDualHost: providers.Can("Alibaba Cloud DNS allows full management of apex NS records"), - providers.DocCreateDomains: providers.Cannot(), - providers.CanUseRoute53Alias: providers.Cannot(), + SupportedTypes: []string{ + "Basic8", }, + CanAutoDNSSEC: providers.Cannot(), + CanConcur: providers.Can(), + DocOfficiallySupported: providers.Cannot(), + DocDualHost: providers.Can("Alibaba Cloud DNS allows full management of apex NS records"), }) } diff --git a/providers/autodns/autoDnsProvider.go b/providers/autodns/autoDnsProvider.go index 0dc9f274ed..264e787e5c 100644 --- a/providers/autodns/autoDnsProvider.go +++ b/providers/autodns/autoDnsProvider.go @@ -66,22 +66,14 @@ func init() { }, }, Maintainer: "@arnoschoon", - Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - // See providers/capabilities.go for the entire list of capabilities. - providers.CanGetZones: providers.Can(), - providers.CanConcur: providers.Can(), - providers.CanUseAlias: providers.Can(), - providers.CanUseCAA: providers.Can(), - providers.CanUseDS: providers.Cannot(), - providers.CanUsePTR: providers.Can(), - providers.CanUseSRV: providers.Can(), - providers.CanUseSSHFP: providers.Cannot(), - providers.CanUseTLSA: providers.Cannot(), - providers.DocCreateDomains: providers.Cannot(), - providers.DocDualHost: providers.Cannot(), - providers.DocOfficiallySupported: providers.Cannot(), + SupportedTypes: []string{ + "Basic8", + "ALIAS", + "PTR", }, + CanConcur: providers.Can(), + DocDualHost: providers.Cannot(), + DocOfficiallySupported: providers.Cannot(), }) } diff --git a/providers/axfrddns/axfrddnsProvider.go b/providers/axfrddns/axfrddnsProvider.go index 69c132991e..afc637e093 100644 --- a/providers/axfrddns/axfrddnsProvider.go +++ b/providers/axfrddns/axfrddnsProvider.go @@ -154,40 +154,25 @@ func init() { providers.Register[*axfrddnsProvider]("AXFRDDNS", providers.Definition{ FriendlyName: "AXFR + DDNS", Maintainer: "@hnrgrgr", - Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - // See providers/capabilities.go for the entire list of capabilities. - providers.CanAutoDNSSEC: providers.Can("Just warn when DNSSEC is requested but no RRSIG is found in the AXFR or warn when DNSSEC is not requested but RRSIG are found in the AXFR."), - providers.CanConcur: providers.Can(), - providers.CanUseCAA: providers.Can(), - providers.CanUseDHCID: providers.Can(), - providers.CanUseDNAME: providers.Can(), - providers.CanUseDS: providers.Can(), - providers.CanUseHTTPS: providers.Can(), - providers.CanUseLOC: providers.Can(), - providers.CanUseNAPTR: providers.Can(), - providers.CanUseOPENPGPKEY: providers.Can(), - providers.CanUsePTR: providers.Can(), - providers.CanUseSMIMEA: providers.Can(), - providers.CanUseSRV: providers.Can(), - providers.CanUseSSHFP: providers.Can(), - providers.CanUseSVCB: providers.Can(), - providers.CanUseTLSA: providers.Can(), - providers.DocDualHost: providers.Cannot(), - providers.DocOfficiallySupported: providers.Cannot(), - // Possible to support via catalog zones (RFC 9432), but those are not - // directly supported by DNSControl right now (although nothing is stopping - // you from manually updating a catalog zone using DNSControl if you wish). - providers.CanGetZones: providers.Cannot(), - providers.DocCreateDomains: providers.Cannot(), - // Not a valid RR type, so impossible to encode in an RFC-compliant DNS - // packet. - providers.CanUseAlias: providers.Cannot(), - // These are both supported by RFC 2136 (DDNS), but neither work with - // DNSControl right now. - providers.CanUseSOA: providers.Cannot(), - providers.CanUseDNSKEY: providers.Cannot(), + SupportedTypes: []string{ + "Basic8", + "DHCID", + "DNAME", + "DS", + "HTTPS", + "LOC", + "NAPTR", + "OPENPGPKEY", + "PTR", + "SMIMEA", + "SSHFP", + "SVCB", + "TLSA", }, + CanAutoDNSSEC: providers.Can("Just warn when DNSSEC is requested but no RRSIG is found in the AXFR or warn when DNSSEC is not requested but RRSIG are found in the AXFR."), + CanConcur: providers.Can(), + DocDualHost: providers.Cannot(), + DocOfficiallySupported: providers.Cannot(), }) } diff --git a/providers/azuredns/azureDnsProvider.go b/providers/azuredns/azureDnsProvider.go index 6d3b8f8a38..ad5d736248 100644 --- a/providers/azuredns/azureDnsProvider.go +++ b/providers/azuredns/azureDnsProvider.go @@ -98,9 +98,7 @@ func (a *azurednsProvider) Initialize(m map[string]string, _ json.RawMessage, op } func init() { - const providerName = "AZURE_DNS" - providers.RegisterCustomRecordType("AZURE_ALIAS", providerName, "") - providers.Register[*azurednsProvider](providerName, providers.Definition{ + providers.Register[*azurednsProvider]("AZURE_DNS", providers.Definition{ FriendlyName: "Azure DNS", DocsURL: "https://docs.dnscontrol.org/provider/azuredns", PortalURL: "https://portal.azure.com/#view/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/~/RegisteredApps", @@ -138,23 +136,17 @@ func init() { }, }, Maintainer: "@vatsalyagoel", + SupportedTypes: []string{ + "Basic8", + "AZURE_ALIAS", + "PTR", + }, + CanConcur: providers.Can(), + DocDualHost: providers.Can("Azure does not permit modifying the existing NS records, only adding/removing additional records."), + DocOfficiallySupported: providers.Can(), + // Features retains annotations for record types and interface-derived facts. Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - // See providers/capabilities.go for the entire list of capabilities. - providers.CanGetZones: providers.Can(), - providers.CanConcur: providers.Can(), - providers.CanUseAlias: providers.Cannot("Azure DNS does not provide a generic ALIAS functionality. Use AZURE_ALIAS instead."), - providers.CanUseAzureAlias: providers.Can(), - providers.CanUseCAA: providers.Can(), - providers.CanUseLOC: providers.Cannot(), - providers.CanUseNAPTR: providers.Cannot(), - providers.CanUsePTR: providers.Can(), - providers.CanUseSRV: providers.Can(), - providers.CanUseSSHFP: providers.Cannot(), - providers.CanUseTLSA: providers.Cannot(), - providers.DocCreateDomains: providers.Can(), - providers.DocDualHost: providers.Can("Azure does not permit modifying the existing NS records, only adding/removing additional records."), - providers.DocOfficiallySupported: providers.Can(), + providers.CanUseAlias: providers.Cannot("Azure DNS does not provide a generic ALIAS functionality. Use AZURE_ALIAS instead."), }, }) } diff --git a/providers/azureprivatedns/azurePrivateDnsProvider.go b/providers/azureprivatedns/azurePrivateDnsProvider.go index acd029b14e..ebfe3fdf7c 100644 --- a/providers/azureprivatedns/azurePrivateDnsProvider.go +++ b/providers/azureprivatedns/azurePrivateDnsProvider.go @@ -131,26 +131,20 @@ func init() { }, }, Maintainer: "@matthewmgamble", + SupportedTypes: []string{ + "Basic8", + "PTR", + "CAA:Cannot", + "NS:Cannot", + }, + CanConcur: providers.Can(), + CanAutoDNSSEC: providers.Cannot(), + DocDualHost: providers.Cannot("Private zones can not change NS records"), + DocOfficiallySupported: providers.Can(), + // Features retains annotations for record types and interface-derived facts. Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - // See providers/capabilities.go for the entire list of capabilities. - providers.CanConcur: providers.Can(), - providers.CanGetZones: providers.Can(), - providers.CanAutoDNSSEC: providers.Cannot(), - providers.CanUseAlias: providers.Cannot("Azure DNS does not provide a generic ALIAS functionality. Use AZURE_ALIAS instead."), - providers.CanUseAzureAlias: providers.Cannot(), - providers.CanUseCAA: providers.Cannot("Azure Private DNS does not support CAA records"), - providers.CanUseDHCID: providers.Cannot(), - providers.CanUseDNAME: providers.Cannot(), - providers.CanUseLOC: providers.Cannot(), - providers.CanUseNAPTR: providers.Cannot(), - providers.CanUsePTR: providers.Can(), - providers.CanUseSRV: providers.Can(), - providers.CanUseSSHFP: providers.Cannot(), - providers.CanUseTLSA: providers.Cannot(), - providers.DocCreateDomains: providers.Can(), - providers.DocDualHost: providers.Cannot("Private zones can not change NS records"), - providers.DocOfficiallySupported: providers.Can(), + providers.CanUseAlias: providers.Cannot("Azure DNS does not provide a generic ALIAS functionality. Use AZURE_ALIAS instead."), + providers.CanUseCAA: providers.Cannot("Azure Private DNS does not support CAA records"), }, }) } diff --git a/providers/bind/bindProvider.go b/providers/bind/bindProvider.go index 20a6c8df55..aa0fb60bc7 100644 --- a/providers/bind/bindProvider.go +++ b/providers/bind/bindProvider.go @@ -76,35 +76,18 @@ func (c *bindProvider) Initialize(config map[string]string, providermeta json.Ra func init() { providers.Register[*bindProvider]("BIND", providers.Definition{ - FriendlyName: "ISC BIND", - Maintainer: "@TomOnTime", - SupportedTypes: []string{"*"}, + FriendlyName: "ISC BIND", + Maintainer: "@TomOnTime", + SupportedTypes: []string{ + "*", + }, + CanAutoDNSSEC: providers.Can("Just writes out a comment indicating DNSSEC was requested"), + CanConcur: providers.Can(), + DocDualHost: providers.Can(), + DocOfficiallySupported: providers.Can(), + // Features retains annotations for record types and interface-derived facts. Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - // See providers/capabilities.go for the entire list of capabilities. - providers.CanAutoDNSSEC: providers.Can("Just writes out a comment indicating DNSSEC was requested"), - providers.CanConcur: providers.Can(), - providers.CanGetZones: providers.Can(), - providers.CanUseCAA: providers.Can(), - providers.CanUseDHCID: providers.Can(), - providers.CanUseDNAME: providers.Can(), - providers.CanUseDNSKEY: providers.Can(), - providers.CanUseDS: providers.Can(), - providers.CanUseHTTPS: providers.Can(), - providers.CanUseLOC: providers.Can(), - providers.CanUseNAPTR: providers.Can(), - providers.CanUseOPENPGPKEY: providers.Can(), - providers.CanUsePTR: providers.Can(), - providers.CanUseRP: providers.Can(), - providers.CanUseSMIMEA: providers.Can(), - providers.CanUseSOA: providers.Can(), - providers.CanUseSRV: providers.Can(), - providers.CanUseSSHFP: providers.Can(), - providers.CanUseSVCB: providers.Can(), - providers.CanUseTLSA: providers.Can(), - providers.DocCreateDomains: providers.Can("Driver just maintains list of zone files. It should automatically add missing ones."), - providers.DocDualHost: providers.Can(), - providers.DocOfficiallySupported: providers.Can(), + providers.DocCreateDomains: providers.Can("Driver just maintains list of zone files. It should automatically add missing ones."), }, Notes: "BIND writes zone files to a local directory; no API credentials are needed.", CredFields: []providers.CredsField{ diff --git a/providers/bind/supported_types_test.go b/providers/bind/supported_types_test.go index ad2dffb13e..9c7f13acb1 100644 --- a/providers/bind/supported_types_test.go +++ b/providers/bind/supported_types_test.go @@ -21,7 +21,7 @@ func TestWildcardRecordsRoundTrip(t *testing.T) { dc.RegistrarName = "NONE" dc.DNSProviderInstances = []*models.DNSProviderInstance{{Name: "bind", ProviderType: "BIND"}} // Exercise real parsers, including a type that lacks a legacy capability, - // pseudo-types owned by other providers, and every AKAMAITLC answer mode. + // pseudo-types used by other providers, and every AKAMAITLC answer mode. for _, record := range []struct{ label, rtype, data string }{ {"info", "HINFO", `"CPU" "OS"`}, {"alias", "ALIAS", "target.example.net."}, @@ -37,11 +37,6 @@ func TestWildcardRecordsRoundTrip(t *testing.T) { if errs := normalize.ValidateAndNormalizeConfig(&models.DNSConfig{Domains: []*models.DomainConfig{dc}}); len(errs) != 0 { t.Fatal(errs) } - for _, r := range dc.Records { - if r.Metadata["orig_custom_type"] != "" { - t.Fatal("BIND acquired a legacy ownership marker") - } - } corrections, count, err := p.GetZoneRecordsCorrections(dc, nil) if err != nil || len(corrections) != 1 || count == 0 { t.Fatalf("corrections=%v count=%d error=%v", corrections, count, err) diff --git a/providers/bunnydns/bunnydnsProvider.go b/providers/bunnydns/bunnydnsProvider.go index ff2d39fdfc..260f38bee3 100644 --- a/providers/bunnydns/bunnydnsProvider.go +++ b/providers/bunnydns/bunnydnsProvider.go @@ -19,10 +19,7 @@ func (b *bunnydnsProvider) SetConversionObserver(observer providers.ConversionOb } func init() { - const providerName = "BUNNY_DNS" - providers.RegisterCustomRecordType("BUNNY_DNS_RDR", providerName, "") - providers.RegisterCustomRecordType("BUNNY_DNS_PZ", providerName, "") - providers.Register[*bunnydnsProvider](providerName, providers.Definition{ + providers.Register[*bunnydnsProvider]("BUNNY_DNS", providers.Definition{ FriendlyName: "Bunny DNS", DocsURL: "https://docs.dnscontrol.org/provider/bunnydns", PortalURL: "https://dash.bunny.net/account/api-key", @@ -36,29 +33,24 @@ func init() { }, }, Maintainer: "@ppmathis", + SupportedTypes: []string{ + "Basic8", + "ALIAS", + "BUNNY_DNS_PZ", + "BUNNY_DNS_RDR", + "HTTPS", + "PTR", + "SVCB", + "TLSA", + }, + CanAutoDNSSEC: providers.Can(), + CanConcur: providers.Unimplemented(), + CanUseDSForChildren: providers.Cannot(), + DocDualHost: providers.Cannot(), + DocOfficiallySupported: providers.Cannot(), + // Features retains annotations for record types and interface-derived facts. Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - // See providers/capabilities.go for the entire list of capabilities. - providers.CanAutoDNSSEC: providers.Can(), - providers.CanGetZones: providers.Can(), - providers.CanConcur: providers.Unimplemented(), - providers.CanUseAlias: providers.Can("Bunny flattens CNAME records into A/AAAA records dynamically"), - providers.CanUseCAA: providers.Can(), - providers.CanUseDHCID: providers.Cannot(), - providers.CanUseDS: providers.Cannot(), - providers.CanUseDSForChildren: providers.Cannot(), - providers.CanUseHTTPS: providers.Can(), - providers.CanUseLOC: providers.Cannot(), - providers.CanUseNAPTR: providers.Cannot(), - providers.CanUsePTR: providers.Can(), - providers.CanUseSOA: providers.Cannot(), - providers.CanUseSRV: providers.Can(), - providers.CanUseSSHFP: providers.Cannot(), - providers.CanUseSVCB: providers.Can(), - providers.CanUseTLSA: providers.Can(), - providers.DocCreateDomains: providers.Can(), - providers.DocDualHost: providers.Cannot(), - providers.DocOfficiallySupported: providers.Cannot(), + providers.CanUseAlias: providers.Can("Bunny flattens CNAME records into A/AAAA records dynamically"), }, }) } diff --git a/providers/cloudflare/cloudflareProvider.go b/providers/cloudflare/cloudflareProvider.go index 49953b45b0..04240bbc6f 100644 --- a/providers/cloudflare/cloudflareProvider.go +++ b/providers/cloudflare/cloudflareProvider.go @@ -45,32 +45,30 @@ Domain level metadata available: */ func init() { - const providerName = "CLOUDFLAREAPI" - providers.RegisterCustomRecordType("CF_WORKER_ROUTE", providerName, "") - providers.Register[*cloudflareProvider](providerName, providers.Definition{ + providers.Register[*cloudflareProvider]("CLOUDFLAREAPI", providers.Definition{ FriendlyName: "Cloudflare", Maintainer: "@tresni", + SupportedTypes: []string{ + "Basic8", + "ALIAS", + "CF_WORKER_ROUTE", + "CLOUDFLAREAPI_SINGLE_REDIRECT", + "DS", + "HTTPS", + "LOC", + "NAPTR", + "PTR", + "SSHFP", + "SVCB", + "TLSA", + }, + CanConcur: providers.Can(), + CanUseDSForChildren: providers.Can(), + DocDualHost: providers.Cannot("Cloudflare will not work well in situations where it is not the only DNS server"), + DocOfficiallySupported: providers.Can(), + // Features retains annotations for record types and interface-derived facts. Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - // See providers/capabilities.go for the entire list of capabilities. - providers.CanGetZones: providers.Can(), - providers.CanConcur: providers.Can(), - providers.CanUseAlias: providers.Can("CF automatically flattens CNAME records into A records dynamically"), - providers.CanUseCAA: providers.Can(), - providers.CanUseDNSKEY: providers.Cannot(), - providers.CanUseDS: providers.Can(), - providers.CanUseDSForChildren: providers.Can(), - providers.CanUseHTTPS: providers.Can(), - providers.CanUseLOC: providers.Can(), - providers.CanUseNAPTR: providers.Can(), - providers.CanUsePTR: providers.Can(), - providers.CanUseSRV: providers.Can(), - providers.CanUseSSHFP: providers.Can(), - providers.CanUseSVCB: providers.Can(), - providers.CanUseTLSA: providers.Can(), - providers.DocCreateDomains: providers.Can(), - providers.DocDualHost: providers.Cannot("Cloudflare will not work well in situations where it is not the only DNS server"), - providers.DocOfficiallySupported: providers.Can(), + providers.CanUseAlias: providers.Can("CF automatically flattens CNAME records into A records dynamically"), }, PortalURL: "https://dash.cloudflare.com/profile/api-tokens", // TODO: Verify Notes: "Cloudflare supports two auth methods: a scoped API token (recommended) or the legacy global API key paired with the account email.", diff --git a/providers/cloudflare/initialize_test.go b/providers/cloudflare/initialize_test.go index f958953414..00757534ac 100644 --- a/providers/cloudflare/initialize_test.go +++ b/providers/cloudflare/initialize_test.go @@ -20,8 +20,10 @@ func TestRegisteredDefinition(t *testing.T) { def.DocsURL != "https://docs.dnscontrol.org/provider/cloudflareapi" || !def.CanGetZones || !def.DocCreateDomains { t.Fatalf("Cloudflare definition = %+v", def) } - if !reflect.DeepEqual(def.DerivedFeatures, def.Features) { - t.Fatal("migration changed legacy capabilities") + for capability, note := range def.Features { + if !reflect.DeepEqual(def.DerivedFeatures[capability], note) { + t.Fatalf("migration changed annotation for %s", capability) + } } if errors := providers.AuditRecords("CLOUDFLAREAPI", nil); len(errors) != 0 { t.Fatal(errors) diff --git a/providers/cloudns/cloudnsProvider.go b/providers/cloudns/cloudnsProvider.go index 521f9794b4..58a1f5556a 100644 --- a/providers/cloudns/cloudnsProvider.go +++ b/providers/cloudns/cloudnsProvider.go @@ -39,9 +39,7 @@ func (c *cloudnsProvider) Initialize(m map[string]string, _ json.RawMessage, opt } func init() { - const providerName = "CLOUDNS" - providers.RegisterCustomRecordType("CLOUDNS_WR", providerName, "") - providers.Register[*cloudnsProvider](providerName, providers.Definition{ + providers.Register[*cloudnsProvider]("CLOUDNS", providers.Definition{ FriendlyName: "ClouDNS", PortalURL: "https://www.cloudns.net/api-settings/", Notes: "ClouDNS supports two auth methods: a main API user (auth-id) or a sub-user API account (sub-auth-id). Both use the same auth-password.", @@ -77,31 +75,27 @@ func init() { }, }, Maintainer: "@pragmaton", + SupportedTypes: []string{ + "Basic8", + "ALIAS", + "CLOUDNS_WR", + "DNAME", + "LOC", + "NAPTR", + "PTR", + "SSHFP", + "TLSA", + "SOA:Unimplemented", + }, + CanAutoDNSSEC: providers.Can(), + CanConcur: providers.Can(), + CanUseDSForChildren: providers.Can(), + DocDualHost: providers.Can(), + DocOfficiallySupported: providers.Cannot(), + // Features retains annotations for record types and interface-derived facts. Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - // See providers/capabilities.go for the entire list of capabilities. - providers.CanAutoDNSSEC: providers.Can(), - providers.CanConcur: providers.Can(), - providers.CanGetZones: providers.Can(), - providers.CanUseAlias: providers.Can(), - providers.CanUseCAA: providers.Can(), - providers.CanUseDNAME: providers.Can(), - providers.CanUseDSForChildren: providers.Can(), - providers.CanUseLOC: providers.Can(), - providers.CanUsePTR: providers.Can(), - providers.CanUseSRV: providers.Can(), - providers.CanUseSSHFP: providers.Can(), - providers.CanUseTLSA: providers.Can(), - providers.DocCreateDomains: providers.Can(), - providers.DocDualHost: providers.Can(), - providers.CanUseNAPTR: providers.Can(), - providers.CanUseSOA: providers.Unimplemented("Supported by cloudns at a separate API endpoint (/dns/modify-soa.json), not implemented yet"), - providers.CanUseDS: providers.Cannot("Not supported for root, only for children"), - providers.CanUseDHCID: providers.Cannot(), - providers.CanUseSVCB: providers.Cannot(), - providers.CanUseHTTPS: providers.Cannot(), - providers.CanUseDNSKEY: providers.Cannot(), - providers.DocOfficiallySupported: providers.Cannot(), + providers.CanUseSOA: providers.Unimplemented("Supported by cloudns at a separate API endpoint (/dns/modify-soa.json), not implemented yet"), + providers.CanUseDS: providers.Cannot("Not supported for root, only for children"), }, }) } diff --git a/providers/cnr/cnrProvider.go b/providers/cnr/cnrProvider.go index d06407fcae..7514f33f0c 100644 --- a/providers/cnr/cnrProvider.go +++ b/providers/cnr/cnrProvider.go @@ -84,38 +84,34 @@ func init() { }, }, Maintainer: "@AsifNawaz-cnic", + SupportedTypes: []string{ + "Basic8", + "ALIAS", + "DHCID", + "DNAME", + "LOC", + "NAPTR", + "PTR", + "SMIMEA", + "SSHFP", + "SVCB", + "TLSA", + "DNSKEY:Unimplemented", + "DS:Unimplemented", + }, + CanAutoDNSSEC: providers.Can(), + CanConcur: providers.Can(), + DocDualHost: providers.Can(), + DocOfficiallySupported: providers.Cannot("Actively maintained provider module."), + CanUseDSForChildren: providers.Unimplemented("Ask for this feature."), + // Features retains annotations for record types and interface-derived facts. Features: providers.DocumentationNotes{ - // See providers/capabilities.go for the entire list of capabilities. - // The default for unlisted capabilities is 'Cannot'. - // --- Supported Features --- - providers.CanAutoDNSSEC: providers.Can(), - providers.CanConcur: providers.Can(), - providers.CanGetZones: providers.Can(), - providers.CanOnlyDiff1Features: providers.Can(), - providers.DocCreateDomains: providers.Can(), - providers.DocDualHost: providers.Can(), - 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.Can("ALIAS records require an unsigned zone served through RCodeZero and cannot be used with DNSSEC-signed zones."), - // providers.CanUseAzureAlias: providers.Cannot(), // can only be supported by Azure provider - providers.CanUseCAA: providers.Can(), - providers.CanUseDHCID: providers.Can(), - providers.CanUseDNAME: providers.Can(), - 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.Can(), - providers.CanUseNAPTR: providers.Can(), - providers.CanUsePTR: providers.Can(), - // providers.CanUseRoute53Alias: providers.Cannot(), // can only be supported by AWS Route53 provider - providers.CanUseSMIMEA: providers.Can(), - 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.CanUseAlias: providers.Can("ALIAS records require an unsigned zone served through RCodeZero and cannot be used with DNSSEC-signed zones."), + providers.CanUseDNSKEY: providers.Unimplemented("Ask for this feature."), + providers.CanUseDS: providers.Unimplemented("Ask for this feature."), + 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.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."), providers.CanUseSRV: providers.Can("SRV records with empty targets are not supported"), - providers.CanUseSSHFP: providers.Can(), - providers.CanUseSVCB: providers.Can(), - providers.CanUseTLSA: providers.Can(), }, }) } diff --git a/providers/cscglobal/cscglobalProvider.go b/providers/cscglobal/cscglobalProvider.go index 5d890b575f..c8e4caf29a 100644 --- a/providers/cscglobal/cscglobalProvider.go +++ b/providers/cscglobal/cscglobalProvider.go @@ -45,15 +45,10 @@ func init() { providers.Register[*providerClient]("CSCGLOBAL", providers.Definition{ FriendlyName: "CSC Global", Maintainer: "@mikenz", - Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - // See providers/capabilities.go for the entire list of capabilities. - providers.CanConcur: providers.Can(), - providers.CanGetZones: providers.Can(), - providers.CanOnlyDiff1Features: providers.Can(), - providers.CanUseCAA: providers.Can(), - providers.CanUseSRV: providers.Can(), - providers.DocOfficiallySupported: providers.Can(), + SupportedTypes: []string{ + "Basic8", }, + CanConcur: providers.Can(), + DocOfficiallySupported: providers.Can(), }) } diff --git a/providers/desec/desecProvider.go b/providers/desec/desecProvider.go index ecbc95a2fd..33e73203ea 100644 --- a/providers/desec/desecProvider.go +++ b/providers/desec/desecProvider.go @@ -47,31 +47,28 @@ func init() { }, }, Maintainer: "@D3luxee", + SupportedTypes: []string{ + "Basic8", + "DNSKEY", + "HTTPS", + "LOC", + "NAPTR", + "OPENPGPKEY", + "PTR", + "SMIMEA", + "SSHFP", + "SVCB", + "TLSA", + "ALIAS:Unimplemented", + }, + CanAutoDNSSEC: providers.Can("deSEC always signs all records. When trying to disable, a notice is printed."), + CanConcur: providers.Can(), + CanUseDSForChildren: providers.Can(), + DocDualHost: providers.Unimplemented(), + DocOfficiallySupported: providers.Cannot(), + // Features retains annotations for record types and interface-derived facts. Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - // See providers/capabilities.go for the entire list of capabilities. - providers.CanAutoDNSSEC: providers.Can("deSEC always signs all records. When trying to disable, a notice is printed."), - providers.CanConcur: providers.Can(), - providers.CanGetZones: providers.Can(), - providers.CanOnlyDiff1Features: providers.Can(), - providers.CanUseAlias: providers.Unimplemented("Apex aliasing is supported via new SVCB and HTTPS record types. For details, check the deSEC docs."), - providers.CanUseCAA: providers.Can(), - providers.CanUseDNSKEY: providers.Can(), - providers.CanUseDS: providers.Cannot(), - providers.CanUseDSForChildren: providers.Can(), - providers.CanUseHTTPS: providers.Can(), - providers.CanUseLOC: providers.Can(), - providers.CanUseNAPTR: providers.Can(), - providers.CanUsePTR: providers.Can(), - providers.CanUseSMIMEA: providers.Can(), - providers.CanUseSRV: providers.Can(), - providers.CanUseSSHFP: providers.Can(), - providers.CanUseSVCB: providers.Can(), - providers.CanUseTLSA: providers.Can(), - providers.CanUseOPENPGPKEY: providers.Can(), - providers.DocCreateDomains: providers.Can(), - providers.DocDualHost: providers.Unimplemented(), - providers.DocOfficiallySupported: providers.Cannot(), + providers.CanUseAlias: providers.Unimplemented("Apex aliasing is supported via new SVCB and HTTPS record types. For details, check the deSEC docs."), }, }) } diff --git a/providers/digitalocean/digitaloceanProvider.go b/providers/digitalocean/digitaloceanProvider.go index e786935aad..5183c27fb5 100644 --- a/providers/digitalocean/digitaloceanProvider.go +++ b/providers/digitalocean/digitaloceanProvider.go @@ -92,31 +92,28 @@ func init() { }, }, Maintainer: "@chicks-net", + SupportedTypes: []string{ + "Basic8", + }, + CanAutoDNSSEC: providers.Cannot("Digital Ocean documents that this is not supported."), + CanConcur: providers.Can(), + DocDualHost: providers.Can(), + DocOfficiallySupported: providers.Cannot(), + // Features retains annotations for record types and interface-derived facts. Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - // See providers/capabilities.go for the entire list of capabilities. - providers.CanAutoDNSSEC: providers.Cannot("Digital Ocean documents that this is not supported."), - providers.CanConcur: providers.Can(), - providers.CanGetZones: providers.Can(), - providers.CanUseAlias: providers.Cannot("Digital Ocean documents that this is not supported."), - providers.CanUseCAA: providers.Can(), - providers.CanUseDHCID: providers.Cannot("Digital Ocean documents that this is not supported."), - providers.CanUseDNAME: providers.Cannot("Digital Ocean documents that this is not supported."), - providers.CanUseDNSKEY: providers.Cannot("Digital Ocean documents that this is not supported."), - providers.CanUseDS: providers.Cannot("Digital Ocean documents that this is not supported."), - providers.CanUseHTTPS: providers.Cannot("Digital Ocean documents that this is not supported."), - providers.CanUseLOC: providers.Cannot(), - providers.CanUseNAPTR: providers.Cannot("Digital Ocean documents that this is not supported."), - providers.CanUsePTR: providers.Cannot("Digital Ocean documents that this is not supported."), - providers.CanUseSOA: providers.Cannot("Technically SOA is supported but in reality the API only permits updates to the TTL. That is insufficient for DNSControl to claim 'support'"), - providers.CanUseSRV: providers.Can(), - providers.CanUseSSHFP: providers.Cannot("Digital Ocean documents that this is not supported."), - providers.CanUseSMIMEA: providers.Cannot("Digital Ocean documents that this is not supported."), - providers.CanUseSVCB: providers.Cannot("Digital Ocean documents that this is not supported."), - providers.CanUseTLSA: providers.Cannot("Digital Ocean documents that this is not supported."), - providers.DocCreateDomains: providers.Can(), - providers.DocDualHost: providers.Can(), - providers.DocOfficiallySupported: providers.Cannot(), + providers.CanUseAlias: providers.Cannot("Digital Ocean documents that this is not supported."), + providers.CanUseDHCID: providers.Cannot("Digital Ocean documents that this is not supported."), + providers.CanUseDNAME: providers.Cannot("Digital Ocean documents that this is not supported."), + providers.CanUseDNSKEY: providers.Cannot("Digital Ocean documents that this is not supported."), + providers.CanUseDS: providers.Cannot("Digital Ocean documents that this is not supported."), + providers.CanUseHTTPS: providers.Cannot("Digital Ocean documents that this is not supported."), + providers.CanUseNAPTR: providers.Cannot("Digital Ocean documents that this is not supported."), + providers.CanUsePTR: providers.Cannot("Digital Ocean documents that this is not supported."), + providers.CanUseSOA: providers.Cannot("Technically SOA is supported but in reality the API only permits updates to the TTL. That is insufficient for DNSControl to claim 'support'"), + providers.CanUseSSHFP: providers.Cannot("Digital Ocean documents that this is not supported."), + providers.CanUseSMIMEA: providers.Cannot("Digital Ocean documents that this is not supported."), + providers.CanUseSVCB: providers.Cannot("Digital Ocean documents that this is not supported."), + providers.CanUseTLSA: providers.Cannot("Digital Ocean documents that this is not supported."), }, }) } diff --git a/providers/dnscale/dnscaleProvider.go b/providers/dnscale/dnscaleProvider.go index 355bc74cbb..83f6d2ee49 100644 --- a/providers/dnscale/dnscaleProvider.go +++ b/providers/dnscale/dnscaleProvider.go @@ -42,23 +42,17 @@ func init() { }, }, Maintainer: "@dnscale-ops", - Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - // See providers/capabilities.go for the entire list of capabilities. - providers.CanGetZones: providers.Can(), - providers.CanConcur: providers.Cannot(), - providers.CanUseAlias: providers.Can(), - providers.CanUseCAA: providers.Can(), - providers.CanUseLOC: providers.Cannot(), - providers.CanUsePTR: providers.Can(), - providers.CanUseSRV: providers.Can(), - providers.CanUseSSHFP: providers.Can(), - providers.CanUseTLSA: providers.Can(), - providers.CanUseHTTPS: providers.Can(), - providers.CanUseSVCB: providers.Can(), - providers.DocCreateDomains: providers.Can(), - providers.DocOfficiallySupported: providers.Cannot(), + SupportedTypes: []string{ + "Basic8", + "ALIAS", + "HTTPS", + "PTR", + "SSHFP", + "SVCB", + "TLSA", }, + CanConcur: providers.Cannot(), + DocOfficiallySupported: providers.Cannot(), }) } diff --git a/providers/dnsimple/dnsimpleProvider.go b/providers/dnsimple/dnsimpleProvider.go index 6452e9dfd8..60e46a263e 100644 --- a/providers/dnsimple/dnsimpleProvider.go +++ b/providers/dnsimple/dnsimpleProvider.go @@ -25,29 +25,22 @@ func init() { providers.Register[*dnsimpleProvider]("DNSIMPLE", providers.Definition{ FriendlyName: "DNSimple", Maintainer: "@onlyhavecans", - Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - // See providers/capabilities.go for the entire list of capabilities. - providers.CanAutoDNSSEC: providers.Can(), - providers.CanConcur: providers.Can(), - providers.CanGetZones: providers.Can(), - providers.CanUseAlias: providers.Can(), - providers.CanUseCAA: providers.Can(), - providers.CanUseDS: providers.Cannot(), - providers.CanUseDSForChildren: providers.Cannot(), - providers.CanUseHTTPS: providers.Can(), - providers.CanUseLOC: providers.Cannot(), - providers.CanUseNAPTR: providers.Can(), - providers.CanUsePTR: providers.Can(), - providers.CanUseSRV: providers.Can(), - providers.CanUseSSHFP: providers.Can(), - providers.CanUseSVCB: providers.Can(), - providers.CanUseTLSA: providers.Can(), - providers.DocCreateDomains: providers.Cannot(), - providers.DocDualHost: providers.Cannot("DNSimple does not allow sufficient control over the apex NS records"), - providers.DocOfficiallySupported: providers.Cannot(), + SupportedTypes: []string{ + "Basic8", + "ALIAS", + "HTTPS", + "NAPTR", + "PTR", + "SSHFP", + "SVCB", + "TLSA", }, - PortalURL: "https://dnsimple.com/user", + CanAutoDNSSEC: providers.Can(), + CanConcur: providers.Can(), + CanUseDSForChildren: providers.Cannot(), + DocDualHost: providers.Cannot("DNSimple does not allow sufficient control over the apex NS records"), + DocOfficiallySupported: providers.Cannot(), + PortalURL: "https://dnsimple.com/user", CredFields: []providers.CredsField{ { Key: "token", diff --git a/providers/dnsimple/initialize_test.go b/providers/dnsimple/initialize_test.go index dd0b765c8c..2ddfedd080 100644 --- a/providers/dnsimple/initialize_test.go +++ b/providers/dnsimple/initialize_test.go @@ -12,8 +12,10 @@ func TestRegisteredDefinition(t *testing.T) { if !ok || def.Kind != providers.KindDNS|providers.KindRegistrar || !def.CanGetZones || def.DocCreateDomains { t.Fatalf("DNSimple definition = %+v", def) } - if !reflect.DeepEqual(def.DerivedFeatures, def.Features) { - t.Fatal("migration changed legacy capabilities") + for capability, note := range def.Features { + if !reflect.DeepEqual(def.DerivedFeatures[capability], note) { + t.Fatalf("migration changed annotation for %s", capability) + } } if errors := providers.AuditRecords("DNSIMPLE", nil); len(errors) != 0 { t.Fatal(errors) diff --git a/providers/dnsmadeeasy/dnsMadeEasyProvider.go b/providers/dnsmadeeasy/dnsMadeEasyProvider.go index f1f001619b..0df836d4ea 100644 --- a/providers/dnsmadeeasy/dnsMadeEasyProvider.go +++ b/providers/dnsmadeeasy/dnsMadeEasyProvider.go @@ -39,25 +39,15 @@ func init() { }, }, Maintainer: "@vojtad", - Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - // See providers/capabilities.go for the entire list of capabilities. - providers.CanConcur: providers.Unimplemented(), - providers.CanGetZones: providers.Can(), - providers.CanOnlyDiff1Features: providers.Can(), - providers.CanUseAlias: providers.Can(), - providers.CanUseCAA: providers.Can(), - providers.CanUseDS: providers.Cannot(), - providers.CanUseDSForChildren: providers.Cannot(), - providers.CanUseLOC: providers.Cannot(), - providers.CanUsePTR: providers.Can(), - providers.CanUseSRV: providers.Can(), - providers.CanUseSSHFP: providers.Cannot(), - providers.CanUseTLSA: providers.Cannot(), - providers.DocCreateDomains: providers.Can(), - providers.DocDualHost: providers.Can("System NS records cannot be edited. Custom apex NS records can be added/changed/deleted."), - providers.DocOfficiallySupported: providers.Cannot(), + SupportedTypes: []string{ + "Basic8", + "ALIAS", + "PTR", }, + CanConcur: providers.Unimplemented(), + CanUseDSForChildren: providers.Cannot(), + DocDualHost: providers.Can("System NS records cannot be edited. Custom apex NS records can be added/changed/deleted."), + DocOfficiallySupported: providers.Cannot(), }) } diff --git a/providers/doh/dohProvider.go b/providers/doh/dohProvider.go index e6d9c6e006..0740948291 100644 --- a/providers/doh/dohProvider.go +++ b/providers/doh/dohProvider.go @@ -20,13 +20,10 @@ Info required in `creds.json`: func init() { providers.Register[*dohProvider]("DNSOVERHTTPS", providers.Definition{ - FriendlyName: "DNS over HTTPS", - Maintainer: "@mikenz", - Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - // See providers/capabilities.go for the entire list of capabilities. - providers.CanConcur: providers.Unimplemented(), - }, + FriendlyName: "DNS over HTTPS", + Maintainer: "@mikenz", + SupportedTypes: []string{}, + CanConcur: providers.Unimplemented(), }) } diff --git a/providers/domainnameshop/domainnameshopProvider.go b/providers/domainnameshop/domainnameshopProvider.go index fcd8973185..90d674668c 100644 --- a/providers/domainnameshop/domainnameshopProvider.go +++ b/providers/domainnameshop/domainnameshopProvider.go @@ -26,27 +26,24 @@ func init() { providers.Register[*domainNameShopProvider]("DOMAINNAMESHOP", providers.Definition{ FriendlyName: "Domainnameshop", Maintainer: "@SimenBai", + SupportedTypes: []string{ + "Basic8", + "ALIAS:Unimplemented", + "DS:Unimplemented", + "TLSA:Unimplemented", + }, + CanAutoDNSSEC: providers.Cannot(), + CanConcur: providers.Unimplemented(), + CanUseDSForChildren: providers.Unimplemented(), + DocDualHost: providers.Unimplemented(), + DocOfficiallySupported: providers.Cannot(), + // Features retains annotations for record types and interface-derived facts. Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - // See providers/capabilities.go for the entire list of capabilities. - providers.CanAutoDNSSEC: providers.Cannot(), // Maybe there is support for it - providers.CanConcur: providers.Unimplemented(), - providers.CanGetZones: providers.Unimplemented(), // - providers.CanOnlyDiff1Features: providers.Can(), - providers.CanUseAlias: providers.Unimplemented("Needs custom implementation"), // Can possibly be implemented, needs further research - providers.CanUseCAA: providers.Can(), - providers.CanUseDS: providers.Unimplemented(), // Seems to support but needs to be implemented - providers.CanUseDSForChildren: providers.Unimplemented(), // Seems to support but needs to be implemented - providers.CanUseLOC: providers.Cannot(), - providers.CanUseNAPTR: providers.Cannot("According to Domainnameshop this will probably never be supported"), // Does not seem to support it - providers.CanUsePTR: providers.Cannot("According to Domainnameshop this will probably never be supported"), // Seems to support but needs to be implemented - providers.CanUseSOA: providers.Cannot(), // Does not seem to support it - providers.CanUseSRV: providers.Can(), - providers.CanUseSSHFP: providers.Cannot("Might be supported in the future"), // Does not seem to support it - providers.CanUseTLSA: providers.Unimplemented("Has support but no documentation. Needs to be investigated."), // Seems to support but needs to be implemented - providers.DocCreateDomains: providers.Unimplemented(), // Not tested - providers.DocDualHost: providers.Unimplemented(), // Not tested - providers.DocOfficiallySupported: providers.Cannot(), + providers.CanUseAlias: providers.Unimplemented("Needs custom implementation"), + providers.CanUseNAPTR: providers.Cannot("According to Domainnameshop this will probably never be supported"), + providers.CanUsePTR: providers.Cannot("According to Domainnameshop this will probably never be supported"), + providers.CanUseSSHFP: providers.Cannot("Might be supported in the future"), + providers.CanUseTLSA: providers.Unimplemented("Has support but no documentation. Needs to be investigated."), }, }) } diff --git a/providers/dynadot/dynadotProvider.go b/providers/dynadot/dynadotProvider.go index 497478cac0..8df5a11465 100644 --- a/providers/dynadot/dynadotProvider.go +++ b/providers/dynadot/dynadotProvider.go @@ -22,13 +22,10 @@ Info required in `creds.json`: func init() { providers.Register[*dynadotProvider]("DYNADOT", providers.Definition{ - FriendlyName: "Dynadot", - Maintainer: "@e-im", - Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - // See providers/capabilities.go for the entire list of capabilities. - providers.CanConcur: providers.Unimplemented(), - }, + FriendlyName: "Dynadot", + Maintainer: "@e-im", + SupportedTypes: []string{}, + CanConcur: providers.Unimplemented(), }) } diff --git a/providers/dynu/dynuProvider.go b/providers/dynu/dynuProvider.go index f0dd154940..eefed1f0bf 100644 --- a/providers/dynu/dynuProvider.go +++ b/providers/dynu/dynuProvider.go @@ -26,26 +26,23 @@ func init() { CredFields: []providers.CredsField{ {Key: "api_key", Label: "API Key", Required: true, Secret: true}, }, - Features: providers.DocumentationNotes{ - providers.CanGetZones: providers.Can(), - providers.CanConcur: providers.Cannot(), - providers.CanUseSRV: providers.Can(), - providers.CanUseCAA: providers.Can(), - providers.CanUseDNAME: providers.Can(), - providers.CanUseDHCID: providers.Can(), - providers.CanUseHTTPS: providers.Can(), - providers.CanUseLOC: providers.Can(), - providers.CanUseNAPTR: providers.Can(), - providers.CanUseOPENPGPKEY: providers.Can(), - providers.CanUsePTR: providers.Can(), - providers.CanUseRP: providers.Can(), - providers.CanUseSMIMEA: providers.Can(), - providers.CanUseSVCB: providers.Can(), - providers.CanUseTLSA: providers.Can(), - providers.CanUseSSHFP: providers.Can(), - providers.CanUseAlias: providers.Cannot(), - providers.CanAutoDNSSEC: providers.Cannot(), + SupportedTypes: []string{ + "Basic8", + "DHCID", + "DNAME", + "HTTPS", + "LOC", + "NAPTR", + "OPENPGPKEY", + "PTR", + "RP", + "SMIMEA", + "SSHFP", + "SVCB", + "TLSA", }, + CanConcur: providers.Cannot(), + CanAutoDNSSEC: providers.Cannot(), }) } diff --git a/providers/easyname/easynameProvider.go b/providers/easyname/easynameProvider.go index 423c0b3b32..f9cd87abc8 100644 --- a/providers/easyname/easynameProvider.go +++ b/providers/easyname/easynameProvider.go @@ -20,13 +20,10 @@ type easynameProvider struct { func init() { providers.Register[*easynameProvider]("EASYNAME", providers.Definition{ - FriendlyName: "easyname", - Maintainer: "@tresni", - Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - // See providers/capabilities.go for the entire list of capabilities. - providers.CanConcur: providers.Unimplemented(), - }, + FriendlyName: "easyname", + Maintainer: "@tresni", + SupportedTypes: []string{}, + CanConcur: providers.Unimplemented(), }) } diff --git a/providers/exoscale/exoscaleProvider.go b/providers/exoscale/exoscaleProvider.go index c4a5dcdb25..32937beb8e 100644 --- a/providers/exoscale/exoscaleProvider.go +++ b/providers/exoscale/exoscaleProvider.go @@ -57,20 +57,17 @@ func init() { providers.Register[*exoscaleProvider]("EXOSCALE", providers.Definition{ FriendlyName: "Exoscale", Maintainer: "@Giza", + SupportedTypes: []string{ + "Basic8", + "ALIAS", + "NS:Cannot", + }, + CanConcur: providers.Cannot(), + DocDualHost: providers.Cannot("Exoscale does not allow sufficient control over the apex NS records"), + DocOfficiallySupported: providers.Cannot(), + // Features retains annotations for record types and interface-derived facts. Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - // See providers/capabilities.go for the entire list of capabilities. - providers.CanGetZones: providers.Unimplemented(), - providers.CanConcur: providers.Cannot(), - providers.CanUseAlias: providers.Can(), - providers.CanUseCAA: providers.Can(), - providers.CanUseLOC: providers.Cannot(), - providers.CanUsePTR: providers.Cannot(), - providers.CanUseSRV: providers.Can("SRV records with empty targets are not supported"), - providers.CanUseTLSA: providers.Cannot(), - providers.DocCreateDomains: providers.Cannot(), - providers.DocDualHost: providers.Cannot("Exoscale does not allow sufficient control over the apex NS records"), - providers.DocOfficiallySupported: providers.Cannot(), + providers.CanUseSRV: providers.Can("SRV records with empty targets are not supported"), }, }) } diff --git a/providers/fortigate/fortigateProvider.go b/providers/fortigate/fortigateProvider.go index f5ff06fe64..8dfb33ab6e 100644 --- a/providers/fortigate/fortigateProvider.go +++ b/providers/fortigate/fortigateProvider.go @@ -50,29 +50,19 @@ func init() { }, }, Maintainer: "@KlettIT", + SupportedTypes: []string{ + "A", + "AAAA", + "CNAME", + "PTR:Cannot", + }, + CanAutoDNSSEC: providers.Cannot(), + CanConcur: providers.Unimplemented(), + DocDualHost: providers.Cannot(), + DocOfficiallySupported: providers.Cannot(), + // Features retains annotations for record types and interface-derived facts. Features: providers.DocumentationNotes{ - providers.CanAutoDNSSEC: providers.Cannot(), - providers.CanConcur: providers.Unimplemented(), - providers.CanGetZones: providers.Can(), - providers.CanUseAlias: providers.Cannot(), - providers.CanUseCAA: providers.Cannot(), - providers.CanUseDHCID: providers.Cannot(), - providers.CanUseDNAME: providers.Cannot(), - providers.CanUseDNSKEY: providers.Cannot(), - providers.CanUseDS: providers.Cannot(), - providers.CanUseHTTPS: providers.Cannot(), - providers.CanUseLOC: providers.Cannot(), - providers.CanUseNAPTR: providers.Cannot(), - providers.CanUsePTR: providers.Cannot("does not really support ARPA Zones and handles PTR records weirdly"), - providers.CanUseSMIMEA: providers.Cannot(), - providers.CanUseSOA: providers.Cannot(), - providers.CanUseSRV: providers.Cannot(), - providers.CanUseSSHFP: providers.Cannot(), - providers.CanUseSVCB: providers.Cannot(), - providers.CanUseTLSA: providers.Cannot(), - providers.DocCreateDomains: providers.Can(), - providers.DocDualHost: providers.Cannot(), - providers.DocOfficiallySupported: providers.Cannot(), + providers.CanUsePTR: providers.Cannot("does not really support ARPA Zones and handles PTR records weirdly"), }, }) } diff --git a/providers/gandiv5/gandiv5Provider.go b/providers/gandiv5/gandiv5Provider.go index 1c6fe50129..c29a72ff76 100644 --- a/providers/gandiv5/gandiv5Provider.go +++ b/providers/gandiv5/gandiv5Provider.go @@ -68,27 +68,27 @@ func init() { }, }, Maintainer: "@TomOnTime", + SupportedTypes: []string{ + "Basic8", + "ALIAS", + "HTTPS", + "LOC", + "NAPTR", + "OPENPGPKEY", + "PTR", + "RP", + "SSHFP", + "SVCB", + "TLSA", + }, + CanConcur: providers.Can(), + CanUseDSForChildren: providers.Can(), + DocOfficiallySupported: providers.Cannot(), + // Features retains annotations for record types and interface-derived facts. Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - // See providers/capabilities.go for the entire list of capabilities. - providers.CanConcur: providers.Can(), - providers.CanGetZones: providers.Can(), - providers.CanUseAlias: providers.Can("Only on the bare domain. Otherwise CNAME will be substituted"), - providers.CanUseCAA: providers.Can(), - providers.CanUseDS: providers.Cannot("Only supports DS records at the apex"), - providers.CanUseDSForChildren: providers.Can(), - providers.CanUseHTTPS: providers.Can(), - providers.CanUseLOC: providers.Can(), - providers.CanUseNAPTR: providers.Can(), - providers.CanUseOPENPGPKEY: providers.Can(), - providers.CanUsePTR: providers.Can(), - providers.CanUseRP: providers.Can(), - providers.CanUseSRV: providers.Can(), - providers.CanUseSSHFP: providers.Can(), - providers.CanUseSVCB: providers.Can(), - providers.CanUseTLSA: providers.Can(), - providers.DocCreateDomains: providers.Cannot("Can only manage domains registered through their service"), - providers.DocOfficiallySupported: providers.Cannot(), + providers.CanUseAlias: providers.Can("Only on the bare domain. Otherwise CNAME will be substituted"), + providers.CanUseDS: providers.Cannot("Only supports DS records at the apex"), + providers.DocCreateDomains: providers.Cannot("Can only manage domains registered through their service"), }, }) } diff --git a/providers/gcloud/gcloudProvider.go b/providers/gcloud/gcloudProvider.go index 7c38095aa7..2b0f103237 100644 --- a/providers/gcloud/gcloudProvider.go +++ b/providers/gcloud/gcloudProvider.go @@ -60,26 +60,20 @@ func init() { }, }, Maintainer: "@riyadhalnur", - Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - // See providers/capabilities.go for the entire list of capabilities. - providers.CanAutoDNSSEC: providers.Can(), - providers.CanGetZones: providers.Can(), - providers.CanConcur: providers.Can(), - providers.CanUseAlias: providers.Can(), - providers.CanUseCAA: providers.Can(), - providers.CanUseDSForChildren: providers.Can(), - providers.CanUseHTTPS: providers.Can(), - providers.CanUseLOC: providers.Cannot(), - providers.CanUsePTR: providers.Can(), - providers.CanUseSRV: providers.Can(), - providers.CanUseSSHFP: providers.Can(), - providers.CanUseSVCB: providers.Can(), - providers.CanUseTLSA: providers.Can(), - providers.DocCreateDomains: providers.Can(), - providers.DocDualHost: providers.Can(), - providers.DocOfficiallySupported: providers.Can(), + SupportedTypes: []string{ + "Basic8", + "ALIAS", + "HTTPS", + "PTR", + "SSHFP", + "SVCB", + "TLSA", }, + CanAutoDNSSEC: providers.Can(), + CanConcur: providers.Can(), + CanUseDSForChildren: providers.Can(), + DocDualHost: providers.Can(), + DocOfficiallySupported: providers.Can(), }) } diff --git a/providers/gcore/gcoreProvider.go b/providers/gcore/gcoreProvider.go index 43a929aea9..c00dcb4ce2 100644 --- a/providers/gcore/gcoreProvider.go +++ b/providers/gcore/gcoreProvider.go @@ -66,26 +66,21 @@ func init() { }, }, Maintainer: "@xddxdd", + SupportedTypes: []string{ + "Basic8", + "ALIAS", + "HTTPS", + "PTR", + "SVCB", + }, + CanAutoDNSSEC: providers.Can(), + CanConcur: providers.Can(), + DocDualHost: providers.Can(), + DocOfficiallySupported: providers.Cannot(), + // Features retains annotations for record types and interface-derived facts. Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - // See providers/capabilities.go for the entire list of capabilities. - providers.CanAutoDNSSEC: providers.Can(), - providers.CanGetZones: providers.Can(), - providers.CanConcur: providers.Can(), - providers.CanUseAlias: providers.Can(), - providers.CanUseCAA: providers.Can(), - providers.CanUseDS: providers.Cannot(), - providers.CanUseLOC: providers.Cannot(), - providers.CanUseNAPTR: providers.Cannot(), - providers.CanUsePTR: providers.Can("G-Core supports PTR records only in rDNS zones"), - providers.CanUseSRV: providers.Can("G-Core doesn't support SRV records with empty targets"), - providers.CanUseSSHFP: providers.Cannot(), - providers.CanUseTLSA: providers.Cannot(), - providers.CanUseHTTPS: providers.Can(), - providers.CanUseSVCB: providers.Can(), - providers.DocCreateDomains: providers.Can(), - providers.DocDualHost: providers.Can(), - providers.DocOfficiallySupported: providers.Cannot(), + providers.CanUsePTR: providers.Can("G-Core supports PTR records only in rDNS zones"), + providers.CanUseSRV: providers.Can("G-Core doesn't support SRV records with empty targets"), }, }) } diff --git a/providers/gidinet/gidinetProvider.go b/providers/gidinet/gidinetProvider.go index 4f5f434ddd..70244a7d6f 100644 --- a/providers/gidinet/gidinetProvider.go +++ b/providers/gidinet/gidinetProvider.go @@ -51,30 +51,18 @@ func init() { }, }, Maintainer: "@zupolgec", + SupportedTypes: []string{ + "Basic8", + "CAA:Cannot", + }, + CanAutoDNSSEC: providers.Cannot(), + CanConcur: providers.Can(), + DocDualHost: providers.Can(), + DocOfficiallySupported: providers.Cannot(), + // Features retains annotations for record types and interface-derived facts. Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - // See providers/capabilities.go for the entire list of capabilities. - providers.CanAutoDNSSEC: providers.Cannot(), - providers.CanConcur: providers.Can(), - providers.CanGetZones: providers.Can(), - providers.CanUseAlias: providers.Cannot(), - providers.CanUseCAA: providers.Cannot("Only premium service"), - providers.CanUseDHCID: providers.Cannot(), - providers.CanUseDNAME: providers.Cannot(), - providers.CanUseDNSKEY: providers.Cannot(), - providers.CanUseDS: providers.Cannot(), - providers.CanUseHTTPS: providers.Cannot(), - providers.CanUseLOC: providers.Cannot(), - providers.CanUseNAPTR: providers.Cannot(), - providers.CanUsePTR: providers.Cannot(), - providers.CanUseSOA: providers.Cannot(), - providers.CanUseSRV: providers.Can(), - providers.CanUseSSHFP: providers.Cannot(), - providers.CanUseSVCB: providers.Cannot(), - providers.CanUseTLSA: providers.Cannot(), - providers.DocCreateDomains: providers.Cannot("Must be created via web UI"), - providers.DocDualHost: providers.Can(), - providers.DocOfficiallySupported: providers.Cannot(), + providers.CanUseCAA: providers.Cannot("Only premium service"), + providers.DocCreateDomains: providers.Cannot("Must be created via web UI"), }, }) } diff --git a/providers/gigahost/gigahostProvider.go b/providers/gigahost/gigahostProvider.go index 5761ef433e..44b34e2d91 100644 --- a/providers/gigahost/gigahostProvider.go +++ b/providers/gigahost/gigahostProvider.go @@ -28,18 +28,14 @@ func init() { }, }, Maintainer: "@jochristian", - Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - // See providers/capabilities.go for the entire list of capabilities. - providers.CanGetZones: providers.Can(), - providers.CanConcur: providers.Unimplemented(), - providers.CanUseAlias: providers.Can(), - providers.CanUseCAA: providers.Can(), - providers.CanUseDNAME: providers.Can(), - providers.CanUseNAPTR: providers.Can(), - providers.CanUsePTR: providers.Can(), - providers.CanUseSRV: providers.Can(), + SupportedTypes: []string{ + "Basic8", + "ALIAS", + "DNAME", + "NAPTR", + "PTR", }, + CanConcur: providers.Unimplemented(), }) } diff --git a/providers/hedns/hednsProvider.go b/providers/hedns/hednsProvider.go index 6c49f1904a..b41b60ddd5 100644 --- a/providers/hedns/hednsProvider.go +++ b/providers/hedns/hednsProvider.go @@ -78,35 +78,22 @@ func init() { }, }, Maintainer: "@rblenkinsopp", - Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - // See providers/capabilities.go for the entire list of capabilities. - providers.CanAutoDNSSEC: providers.Cannot(), - providers.CanGetZones: providers.Can(), - providers.CanConcur: providers.Can(), - providers.CanUseAlias: providers.Can(), - providers.CanUseCAA: providers.Can(), - providers.CanUseDHCID: providers.Cannot(), - providers.CanUseDNAME: providers.Cannot(), - providers.CanUseDNSKEY: providers.Cannot(), - providers.CanUseDS: providers.Cannot(), - providers.CanUseDSForChildren: providers.Cannot(), - providers.CanUseHTTPS: providers.Can(), - providers.CanUseLOC: providers.Can(), - providers.CanUseNAPTR: providers.Can(), - providers.CanUseOPENPGPKEY: providers.Cannot(), - providers.CanUsePTR: providers.Can(), - providers.CanUseRP: providers.Can(), - providers.CanUseSMIMEA: providers.Cannot(), - providers.CanUseSOA: providers.Cannot(), - providers.CanUseSRV: providers.Can(), - providers.CanUseSSHFP: providers.Can(), - providers.CanUseSVCB: providers.Can(), - providers.CanUseTLSA: providers.Cannot(), - providers.DocCreateDomains: providers.Can(), - providers.DocDualHost: providers.Can(), - providers.DocOfficiallySupported: providers.Cannot(), + SupportedTypes: []string{ + "Basic8", + "ALIAS", + "HTTPS", + "LOC", + "NAPTR", + "PTR", + "RP", + "SSHFP", + "SVCB", }, + CanAutoDNSSEC: providers.Cannot(), + CanConcur: providers.Can(), + CanUseDSForChildren: providers.Cannot(), + DocDualHost: providers.Can(), + DocOfficiallySupported: providers.Cannot(), }) } diff --git a/providers/hetznerv2/hetznerv2Provider.go b/providers/hetznerv2/hetznerv2Provider.go index 7375ae2876..3d531e463e 100644 --- a/providers/hetznerv2/hetznerv2Provider.go +++ b/providers/hetznerv2/hetznerv2Provider.go @@ -30,30 +30,18 @@ func init() { }, }, Maintainer: "@das7pad", - Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - // See providers/capabilities.go for the entire list of capabilities. - providers.CanAutoDNSSEC: providers.Cannot(), - providers.CanConcur: providers.Can(), - providers.CanGetZones: providers.Can(), - providers.CanOnlyDiff1Features: providers.Can(), - providers.CanUseAlias: providers.Cannot(), - providers.CanUseCAA: providers.Can(), - providers.CanUseDS: providers.Can(), - providers.CanUseDSForChildren: providers.Cannot(), - providers.CanUseLOC: providers.Cannot(), - providers.CanUseNAPTR: providers.Cannot(), - providers.CanUsePTR: providers.Can(), - providers.CanUseSOA: providers.Cannot(), - providers.CanUseSRV: providers.Can(), - providers.CanUseSVCB: providers.Can(), - providers.CanUseHTTPS: providers.Can(), - providers.CanUseSSHFP: providers.Cannot(), - providers.CanUseTLSA: providers.Can(), - providers.DocCreateDomains: providers.Can(), - providers.DocOfficiallySupported: providers.Cannot(), - providers.DocDualHost: providers.Can(), + SupportedTypes: []string{ + "Basic8", + "DS", + "HTTPS", + "PTR", + "SVCB", + "TLSA", }, + CanAutoDNSSEC: providers.Cannot(), + CanConcur: providers.Can(), + DocOfficiallySupported: providers.Cannot(), + DocDualHost: providers.Can(), }) } diff --git a/providers/hostingde/hostingdeProvider.go b/providers/hostingde/hostingdeProvider.go index 5a564d3925..63eb6da40c 100644 --- a/providers/hostingde/hostingdeProvider.go +++ b/providers/hostingde/hostingdeProvider.go @@ -32,27 +32,19 @@ func init() { }, }, Maintainer: "@juliusrickert", - Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - // See providers/capabilities.go for the entire list of capabilities. - providers.CanAutoDNSSEC: providers.Can(), - providers.CanConcur: providers.Unimplemented(), - providers.CanGetZones: providers.Can(), - providers.CanOnlyDiff1Features: providers.Can(), - providers.CanUseAlias: providers.Can(), - providers.CanUseCAA: providers.Can(), - providers.CanUseDS: providers.Can(), - providers.CanUseLOC: providers.Cannot(), - providers.CanUseNAPTR: providers.Cannot(), - providers.CanUsePTR: providers.Can(), - providers.CanUseSOA: providers.Can(), - providers.CanUseSRV: providers.Can(), - providers.CanUseSSHFP: providers.Can(), - providers.CanUseTLSA: providers.Can(), - providers.DocCreateDomains: providers.Can(), - providers.DocDualHost: providers.Can(), - providers.DocOfficiallySupported: providers.Cannot(), + SupportedTypes: []string{ + "Basic8", + "ALIAS", + "DS", + "PTR", + "SOA", + "SSHFP", + "TLSA", }, + CanAutoDNSSEC: providers.Can(), + CanConcur: providers.Unimplemented(), + DocDualHost: providers.Can(), + DocOfficiallySupported: providers.Cannot(), }) } diff --git a/providers/huaweicloud/huaweicloudProvider.go b/providers/huaweicloud/huaweicloudProvider.go index 05985bd92a..a4084b31c9 100644 --- a/providers/huaweicloud/huaweicloudProvider.go +++ b/providers/huaweicloud/huaweicloudProvider.go @@ -114,27 +114,12 @@ func init() { }, }, Maintainer: "@huihuimoe", - Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - // See providers/capabilities.go for the entire list of capabilities. - providers.CanAutoDNSSEC: providers.Can(), - providers.CanGetZones: providers.Can(), - providers.CanUseAlias: providers.Cannot(), - providers.CanUseCAA: providers.Can(), - providers.CanUseDS: providers.Cannot(), - providers.CanUseLOC: providers.Cannot(), - providers.CanUseNAPTR: providers.Cannot(), - providers.CanUsePTR: providers.Cannot(), - providers.CanUseSRV: providers.Can(), - providers.CanUseSSHFP: providers.Cannot(), - providers.CanUseTLSA: providers.Cannot(), - providers.CanUseHTTPS: providers.Cannot(), - providers.CanUseSVCB: providers.Cannot(), - providers.CanUseSOA: providers.Cannot(), - providers.DocCreateDomains: providers.Can(), - providers.DocDualHost: providers.Can(), - providers.DocOfficiallySupported: providers.Cannot(), + SupportedTypes: []string{ + "Basic8", }, + CanAutoDNSSEC: providers.Can(), + DocDualHost: providers.Can(), + DocOfficiallySupported: providers.Cannot(), }) } diff --git a/providers/infoblox/infobloxProvider.go b/providers/infoblox/infobloxProvider.go index 3cc384ebbc..0c379dc8be 100644 --- a/providers/infoblox/infobloxProvider.go +++ b/providers/infoblox/infobloxProvider.go @@ -12,17 +12,17 @@ func init() { providers.Register[*infobloxProvider]("INFOBLOX", providers.Definition{ FriendlyName: "Infoblox", Maintainer: "@matthewmgamble", + SupportedTypes: []string{ + "Basic8", + "PTR", + "NS:Cannot", + }, + CanConcur: providers.Can(), + DocDualHost: providers.Cannot(), + DocOfficiallySupported: providers.Cannot(), + // Features retains annotations for record types and interface-derived facts. Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - // See providers/capabilities.go for the entire list of capabilities. - providers.CanConcur: providers.Can(), - providers.CanGetZones: providers.Cannot(), // MVP: no ListZones - providers.CanUseCAA: providers.Can(), - providers.CanUsePTR: providers.Can(), - providers.CanUseSRV: providers.Can(), - providers.DocCreateDomains: providers.Cannot("zones must be pre-created"), - providers.DocDualHost: providers.Cannot(), - providers.DocOfficiallySupported: providers.Cannot(), + providers.DocCreateDomains: providers.Cannot("zones must be pre-created"), }, }) } diff --git a/providers/infomaniak/infomaniakProvider.go b/providers/infomaniak/infomaniakProvider.go index 65ad0fb959..74c6d0b306 100644 --- a/providers/infomaniak/infomaniakProvider.go +++ b/providers/infomaniak/infomaniakProvider.go @@ -31,16 +31,12 @@ func init() { providers.Register[*infomaniakProvider]("INFOMANIAK", providers.Definition{ FriendlyName: "Infomaniak", Maintainer: "@jbelien", - Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - // See providers/capabilities.go for the entire list of capabilities. - providers.CanUseCAA: providers.Can(), - providers.CanUseDNAME: providers.Can(), - providers.CanUseDS: providers.Can(), - providers.CanUseSSHFP: providers.Can(), - providers.CanUseTLSA: providers.Can(), - providers.CanUseSRV: providers.Can(), - // providers.DocCreateDomains: providers.Can(), + SupportedTypes: []string{ + "Basic8", + "DNAME", + "DS", + "SSHFP", + "TLSA", }, }) } diff --git a/providers/internetbs/internetbsProvider.go b/providers/internetbs/internetbsProvider.go index 857b69738d..0d36ce515a 100644 --- a/providers/internetbs/internetbsProvider.go +++ b/providers/internetbs/internetbsProvider.go @@ -23,13 +23,10 @@ Info required in `creds.json`: func init() { providers.Register[*internetbsProvider]("INTERNETBS", providers.Definition{ - FriendlyName: "Internet.bs", - Maintainer: "@pragmaton", - Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - // See providers/capabilities.go for the entire list of capabilities. - providers.CanConcur: providers.Unimplemented(), - }, + FriendlyName: "Internet.bs", + Maintainer: "@pragmaton", + SupportedTypes: []string{}, + CanConcur: providers.Unimplemented(), }) } diff --git a/providers/inwx/inwxProvider.go b/providers/inwx/inwxProvider.go index bcaca32c77..4d359750d2 100644 --- a/providers/inwx/inwxProvider.go +++ b/providers/inwx/inwxProvider.go @@ -80,26 +80,26 @@ func init() { }, }, Maintainer: "@patschi", + SupportedTypes: []string{ + "Basic8", + "ALIAS", + "HTTPS", + "NAPTR", + "PTR", + "SSHFP", + "SVCB", + "TLSA", + "DS:Unimplemented", + "LOC:Unimplemented", + }, + CanAutoDNSSEC: providers.Can(), + CanConcur: providers.Can(), + DocDualHost: providers.Can(), + DocOfficiallySupported: providers.Cannot(), + // Features retains annotations for record types and interface-derived facts. Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - // See providers/capabilities.go for the entire list of capabilities. - providers.CanAutoDNSSEC: providers.Can(), - providers.CanGetZones: providers.Can(), - providers.CanConcur: providers.Can(), - providers.CanUseAlias: providers.Can(), - providers.CanUseCAA: providers.Can(), - providers.CanUseDS: providers.Unimplemented("DS records are only supported at the apex and require a different API call that hasn't been implemented yet."), - providers.CanUseHTTPS: providers.Can(), - providers.CanUseLOC: providers.Unimplemented(), - providers.CanUseNAPTR: providers.Can(), - providers.CanUsePTR: providers.Can("PTR records with empty targets are not supported"), - providers.CanUseSRV: providers.Can(), - providers.CanUseSSHFP: providers.Can(), - providers.CanUseSVCB: providers.Can(), - providers.CanUseTLSA: providers.Can(), - providers.DocCreateDomains: providers.Can(), - providers.DocDualHost: providers.Can(), - providers.DocOfficiallySupported: providers.Cannot(), + providers.CanUseDS: providers.Unimplemented("DS records are only supported at the apex and require a different API call that hasn't been implemented yet."), + providers.CanUsePTR: providers.Can("PTR records with empty targets are not supported"), }, }) } diff --git a/providers/joker/jokerProvider.go b/providers/joker/jokerProvider.go index 37022daf3f..2c63442f11 100644 --- a/providers/joker/jokerProvider.go +++ b/providers/joker/jokerProvider.go @@ -42,29 +42,14 @@ func init() { }, }, Maintainer: "@atrull", - Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - // See providers/capabilities.go for the entire list of capabilities. - providers.CanGetZones: providers.Can(), - providers.CanConcur: providers.Cannot("Joker API has session-based authentication"), - providers.CanUseAlias: providers.Cannot(), - providers.CanUseCAA: providers.Can(), - providers.CanUseDNSKEY: providers.Cannot(), - providers.CanUseDS: providers.Cannot(), - providers.CanUseDSForChildren: providers.Cannot(), - providers.CanUseHTTPS: providers.Cannot(), - providers.CanUseLOC: providers.Cannot(), - providers.CanUseNAPTR: providers.Can(), - providers.CanUsePTR: providers.Cannot(), - providers.CanUseSOA: providers.Cannot(), - providers.CanUseSRV: providers.Can(), - providers.CanUseSSHFP: providers.Cannot(), - providers.CanUseSVCB: providers.Cannot(), - providers.CanUseTLSA: providers.Cannot(), - providers.DocCreateDomains: providers.Can(), - providers.DocDualHost: providers.Cannot(), - providers.DocOfficiallySupported: providers.Cannot(), + SupportedTypes: []string{ + "Basic8", + "NAPTR", }, + CanConcur: providers.Cannot("Joker API has session-based authentication"), + CanUseDSForChildren: providers.Cannot(), + DocDualHost: providers.Cannot(), + DocOfficiallySupported: providers.Cannot(), }) } diff --git a/providers/linode/linodeProvider.go b/providers/linode/linodeProvider.go index fbe68929e5..2eadca9905 100644 --- a/providers/linode/linodeProvider.go +++ b/providers/linode/linodeProvider.go @@ -102,17 +102,16 @@ func init() { }, }, Maintainer: "@koesie10", + SupportedTypes: []string{ + "Basic8", + }, + CanConcur: providers.Unimplemented(), + DocDualHost: providers.Cannot(), + DocOfficiallySupported: providers.Cannot(), + // Features retains annotations for record types and interface-derived facts. Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - // See providers/capabilities.go for the entire list of capabilities. - providers.CanConcur: providers.Unimplemented(), - providers.CanGetZones: providers.Can(), - providers.CanOnlyDiff1Features: providers.Can(), - providers.CanUseCAA: providers.Can("Linode doesn't support changing the CAA flag"), - providers.CanUseSRV: providers.Can("Linode requires non-zero priority"), - providers.CanUseLOC: providers.Cannot(), - providers.DocDualHost: providers.Cannot(), - providers.DocOfficiallySupported: providers.Cannot(), + providers.CanUseCAA: providers.Can("Linode doesn't support changing the CAA flag"), + providers.CanUseSRV: providers.Can("Linode requires non-zero priority"), }, }) } diff --git a/providers/loopia/loopiaProvider.go b/providers/loopia/loopiaProvider.go index bd5d1b105d..89016b1d7a 100644 --- a/providers/loopia/loopiaProvider.go +++ b/providers/loopia/loopiaProvider.go @@ -51,33 +51,23 @@ func init() { }, }, Maintainer: "@systemcrash", + SupportedTypes: []string{ + "Basic8", + "LOC", + "NAPTR", + "SSHFP", + "TLSA", + }, + CanAutoDNSSEC: providers.Cannot(), + CanConcur: providers.Unimplemented(), + CanUseDSForChildren: providers.Cannot(), + DocDualHost: providers.Can(), + DocOfficiallySupported: providers.Cannot(), + // Features retains annotations for record types and interface-derived facts. Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - // See providers/capabilities.go for the entire list of capabilities. - providers.CanAutoDNSSEC: providers.Cannot(), - providers.CanConcur: providers.Unimplemented(), - providers.CanGetZones: providers.Can(), - providers.CanOnlyDiff1Features: providers.Can(), - providers.CanUseAKAMAICDN: providers.Cannot(), - providers.CanUseAlias: providers.Cannot(), - providers.CanUseAzureAlias: providers.Cannot(), - providers.CanUseCAA: providers.Can(), - providers.CanUseDHCID: providers.Cannot(), // Verified 2025-07-24 - providers.CanUseDNSKEY: providers.Cannot(), // Verified 2025-07-24 - providers.CanUseDS: providers.Cannot("Only supports DS records at the apex, only for .se and .nu domains; done automatically at back-end."), - providers.CanUseDSForChildren: providers.Cannot(), - providers.CanUseHTTPS: providers.Cannot(), // Verified 2025-07-24 - providers.CanUseLOC: providers.Can(), - providers.CanUseNAPTR: providers.Can(), - providers.CanUsePTR: providers.Cannot(), - providers.CanUseSOA: providers.Cannot("💩"), - providers.CanUseSRV: providers.Can(), - providers.CanUseSSHFP: providers.Can(), - providers.CanUseSVCB: providers.Cannot(), // Verified 2025-07-24 - providers.CanUseTLSA: providers.Can(), - providers.DocCreateDomains: providers.Cannot("Can only manage domains registered through their service"), - providers.DocDualHost: providers.Can(), - providers.DocOfficiallySupported: providers.Cannot(), + providers.CanUseDS: providers.Cannot("Only supports DS records at the apex, only for .se and .nu domains; done automatically at back-end."), + providers.CanUseSOA: providers.Cannot("💩"), + providers.DocCreateDomains: providers.Cannot("Can only manage domains registered through their service"), }, }) } diff --git a/providers/luadns/luadnsProvider.go b/providers/luadns/luadnsProvider.go index 4907d66700..359594f46b 100644 --- a/providers/luadns/luadnsProvider.go +++ b/providers/luadns/luadnsProvider.go @@ -45,24 +45,18 @@ func init() { }, }, Maintainer: "@riku22", - Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - // See providers/capabilities.go for the entire list of capabilities. - providers.CanGetZones: providers.Can(), - providers.CanConcur: providers.Can(), - providers.CanUseAlias: providers.Can(), - providers.CanUseCAA: providers.Can(), - providers.CanUseHTTPS: providers.Can(), - providers.CanUseLOC: providers.Cannot(), - providers.CanUseOPENPGPKEY: providers.Can(), - providers.CanUsePTR: providers.Can(), - providers.CanUseSRV: providers.Can(), - providers.CanUseSSHFP: providers.Can(), - providers.CanUseTLSA: providers.Can(), - providers.DocCreateDomains: providers.Can(), - providers.DocDualHost: providers.Can(), - providers.DocOfficiallySupported: providers.Cannot(), + SupportedTypes: []string{ + "Basic8", + "ALIAS", + "HTTPS", + "OPENPGPKEY", + "PTR", + "SSHFP", + "TLSA", }, + CanConcur: providers.Can(), + DocDualHost: providers.Can(), + DocOfficiallySupported: providers.Cannot(), }) } diff --git a/providers/mikrotik/mikrotikProvider.go b/providers/mikrotik/mikrotikProvider.go index 69c3872f96..650dfddb75 100644 --- a/providers/mikrotik/mikrotikProvider.go +++ b/providers/mikrotik/mikrotikProvider.go @@ -34,11 +34,7 @@ forwarding), MIKROTIK_NXDOMAIN, and MIKROTIK_FORWARDER. */ func init() { - const providerName = "MIKROTIK" - providers.RegisterCustomRecordType("MIKROTIK_FWD", providerName, "") - providers.RegisterCustomRecordType("MIKROTIK_NXDOMAIN", providerName, "") - providers.RegisterCustomRecordType("MIKROTIK_FORWARDER", providerName, "") - providers.Register[*mikrotikProvider](providerName, providers.Definition{ + providers.Register[*mikrotikProvider]("MIKROTIK", providers.Definition{ FriendlyName: "MikroTik RouterOS", PortalURL: "", // No portal; managed on-device CredFields: []providers.CredsField{ @@ -63,27 +59,18 @@ func init() { }, }, Maintainer: "@hedger", - Features: providers.DocumentationNotes{ - providers.CanAutoDNSSEC: providers.Cannot(), - providers.CanConcur: providers.Cannot(), - providers.CanGetZones: providers.Can(), - providers.CanUseAlias: providers.Cannot(), - providers.CanUseCAA: providers.Cannot(), - providers.CanUseDS: providers.Cannot(), - providers.CanUseDSForChildren: providers.Cannot(), - providers.CanUseHTTPS: providers.Cannot(), - providers.CanUseLOC: providers.Cannot(), - providers.CanUseNAPTR: providers.Cannot(), - providers.CanUsePTR: providers.Cannot(), - providers.CanUseSOA: providers.Cannot(), - providers.CanUseSRV: providers.Can(), - providers.CanUseSSHFP: providers.Cannot(), - providers.CanUseSVCB: providers.Cannot(), - providers.CanUseTLSA: providers.Cannot(), - providers.DocCreateDomains: providers.Cannot(), - providers.DocDualHost: providers.Cannot(), - providers.DocOfficiallySupported: providers.Cannot(), + SupportedTypes: []string{ + "Basic8", + "MIKROTIK_FORWARDER", + "MIKROTIK_FWD", + "MIKROTIK_NXDOMAIN", + "CAA:Cannot", }, + CanAutoDNSSEC: providers.Cannot(), + CanConcur: providers.Cannot(), + CanUseDSForChildren: providers.Cannot(), + DocDualHost: providers.Cannot(), + DocOfficiallySupported: providers.Cannot(), }) } diff --git a/providers/mittwald/mittwaldProvider.go b/providers/mittwald/mittwaldProvider.go index a3922c17a7..81d9ea9713 100644 --- a/providers/mittwald/mittwaldProvider.go +++ b/providers/mittwald/mittwaldProvider.go @@ -32,32 +32,17 @@ func init() { {Key: "api_token", Label: "API token", Help: "An mStudio API token of a user with access to the projects of the domains.", Required: true, Secret: true}, }, Maintainer: "@twiesing", + SupportedTypes: []string{ + "Basic8", + "NS:Cannot", + }, + CanAutoDNSSEC: providers.Cannot(), + CanConcur: providers.Cannot(), + DocDualHost: providers.Cannot(), + DocOfficiallySupported: providers.Cannot(), + // Features retains annotations for record types and interface-derived facts. Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - // See providers/capabilities.go for the entire list of capabilities. - // The API knows A, AAAA, CNAME, MX, TXT, SRV and CAA only. - providers.CanAutoDNSSEC: providers.Cannot(), - providers.CanConcur: providers.Cannot(), - providers.CanGetZones: providers.Cannot(), - providers.CanUseAlias: providers.Cannot(), - providers.CanUseCAA: providers.Can(), - providers.CanUseDHCID: providers.Cannot(), - providers.CanUseDNAME: providers.Cannot(), - providers.CanUseDNSKEY: providers.Cannot(), - providers.CanUseDS: providers.Cannot(), - providers.CanUseHTTPS: providers.Cannot(), - providers.CanUseLOC: providers.Cannot(), - providers.CanUseNAPTR: providers.Cannot(), - providers.CanUsePTR: providers.Cannot(), - providers.CanUseSMIMEA: providers.Cannot(), - providers.CanUseSOA: providers.Cannot(), - providers.CanUseSRV: providers.Can(), - providers.CanUseSSHFP: providers.Cannot(), - providers.CanUseSVCB: providers.Cannot(), - providers.CanUseTLSA: providers.Cannot(), - providers.DocCreateDomains: providers.Cannot("A domain's zone exists once the domain is in an mStudio project"), - providers.DocDualHost: providers.Cannot(), - providers.DocOfficiallySupported: providers.Cannot(), + providers.DocCreateDomains: providers.Cannot("A domain's zone exists once the domain is in an mStudio project"), }, }) } diff --git a/providers/mythicbeasts/mythicbeastsProvider.go b/providers/mythicbeasts/mythicbeastsProvider.go index 8a2837d36e..f509fb1186 100644 --- a/providers/mythicbeasts/mythicbeastsProvider.go +++ b/providers/mythicbeasts/mythicbeastsProvider.go @@ -52,21 +52,18 @@ func init() { }, }, Maintainer: "@tomfitzhenry", + SupportedTypes: []string{ + "Basic8", + "PTR", + "SSHFP", + "TLSA", + }, + CanConcur: providers.Can(), + DocDualHost: providers.Can(), + DocOfficiallySupported: providers.Cannot(), + // Features retains annotations for record types and interface-derived facts. Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - // See providers/capabilities.go for the entire list of capabilities. - providers.CanGetZones: providers.Can(), - providers.CanConcur: providers.Can(), - providers.CanUseAlias: providers.Cannot(), - providers.CanUseCAA: providers.Can(), - providers.CanUseLOC: providers.Cannot(), - providers.CanUsePTR: providers.Can(), - providers.CanUseSRV: providers.Can(), - providers.CanUseSSHFP: providers.Can(), - providers.CanUseTLSA: providers.Can(), - providers.DocCreateDomains: providers.Cannot("Requires domain registered through Web UI"), - providers.DocDualHost: providers.Can(), - providers.DocOfficiallySupported: providers.Cannot(), + providers.DocCreateDomains: providers.Cannot("Requires domain registered through Web UI"), }, }) } diff --git a/providers/namecheap/namecheapProvider.go b/providers/namecheap/namecheapProvider.go index c6be7a9a61..6ae67882f0 100644 --- a/providers/namecheap/namecheapProvider.go +++ b/providers/namecheap/namecheapProvider.go @@ -58,11 +58,7 @@ func (e domainsGetListResponseError) Error() string { } func init() { - const providerName = "NAMECHEAP" - providers.RegisterCustomRecordType("URL", providerName, "") - providers.RegisterCustomRecordType("URL301", providerName, "") - providers.RegisterCustomRecordType("FRAME", providerName, "") - providers.Register[*namecheapProvider](providerName, providers.Definition{ + providers.Register[*namecheapProvider]("NAMECHEAP", providers.Definition{ FriendlyName: "Namecheap", PortalURL: "https://ap.www.namecheap.com/settings/tools/apiaccess/", CredFields: []providers.CredsField{ @@ -86,21 +82,19 @@ func init() { }, }, Maintainer: "@willpower232", + SupportedTypes: []string{ + "Basic8", + "ALIAS", + "FRAME", + "URL", + "URL301", + }, + CanConcur: providers.Can(), + DocDualHost: providers.Cannot("Doesn't allow control of apex NS records"), + DocOfficiallySupported: providers.Cannot(), + // Features retains annotations for record types and interface-derived facts. Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - // See providers/capabilities.go for the entire list of capabilities. - providers.CanConcur: providers.Can(), - providers.CanGetZones: providers.Can(), - providers.CanOnlyDiff1Features: providers.Can(), // If you remove this, also update not() statements in integrationTest/integration_test.go - providers.CanUseAlias: providers.Can(), - providers.CanUseCAA: providers.Can(), - providers.CanUseLOC: providers.Cannot(), - providers.CanUsePTR: providers.Cannot(), - providers.CanUseSRV: providers.Can(), - providers.CanUseTLSA: providers.Cannot(), - providers.DocCreateDomains: providers.Cannot("Requires domain registered through their service"), - providers.DocDualHost: providers.Cannot("Doesn't allow control of apex NS records"), - providers.DocOfficiallySupported: providers.Cannot(), + providers.DocCreateDomains: providers.Cannot("Requires domain registered through their service"), }, }) } diff --git a/providers/namedotcom/namedotcomProvider.go b/providers/namedotcom/namedotcomProvider.go index 369462b6e1..60eafc5031 100644 --- a/providers/namedotcom/namedotcomProvider.go +++ b/providers/namedotcom/namedotcomProvider.go @@ -53,19 +53,19 @@ func init() { providers.Register[*namedotcomProvider]("NAMEDOTCOM", providers.Definition{ FriendlyName: "Name.com", Maintainer: "NEEDS VOLUNTEER", + SupportedTypes: []string{ + "Basic8", + "ALIAS", + "CAA:Cannot", + }, + CanConcur: providers.Unimplemented(), + DocDualHost: providers.Can(), + DocOfficiallySupported: providers.Cannot(), + // Features retains annotations for record types and interface-derived facts. Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - // See providers/capabilities.go for the entire list of capabilities. - providers.CanConcur: providers.Unimplemented(), - providers.CanGetZones: providers.Can(), - providers.CanOnlyDiff1Features: providers.Can(), - providers.CanUseAlias: providers.Can(), - providers.CanUseLOC: providers.Cannot(), - providers.CanUsePTR: providers.Cannot("PTR records are not supported (See Link)", "https://www.name.com/support/articles/205188508-Reverse-DNS-records"), - providers.CanUseSRV: providers.Can("SRV records with empty targets are not supported"), - providers.DocCreateDomains: providers.Cannot("New domains require registration"), - providers.DocDualHost: providers.Can(), - providers.DocOfficiallySupported: providers.Cannot(), + providers.CanUsePTR: providers.Cannot("PTR records are not supported (See Link)", "https://www.name.com/support/articles/205188508-Reverse-DNS-records"), + providers.CanUseSRV: providers.Can("SRV records with empty targets are not supported"), + providers.DocCreateDomains: providers.Cannot("New domains require registration"), }, }) } diff --git a/providers/netbird/netbirdProvider.go b/providers/netbird/netbirdProvider.go index afd2778d7d..e1a8f63c64 100644 --- a/providers/netbird/netbirdProvider.go +++ b/providers/netbird/netbirdProvider.go @@ -80,32 +80,15 @@ func init() { {Key: "apiurl", Label: "API Url", Default: netbirdAPIURL}, }, Maintainer: "@yzqzss", - Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - // See providers/capabilities.go for the entire list of capabilities. - providers.CanAutoDNSSEC: providers.Cannot(), - providers.CanConcur: providers.Can(), - providers.CanGetZones: providers.Can(), - providers.CanUseAlias: providers.Cannot(), - providers.CanUseCAA: providers.Cannot(), - providers.CanUseDHCID: providers.Cannot(), - providers.CanUseDNAME: providers.Cannot(), - providers.CanUseDNSKEY: providers.Cannot(), - providers.CanUseDS: providers.Cannot(), - providers.CanUseHTTPS: providers.Cannot(), - providers.CanUseLOC: providers.Cannot(), - providers.CanUseNAPTR: providers.Cannot(), - providers.CanUsePTR: providers.Cannot(), - providers.CanUseSOA: providers.Cannot(), - providers.CanUseSRV: providers.Cannot(), - providers.CanUseSSHFP: providers.Cannot(), - providers.CanUseSMIMEA: providers.Cannot(), - providers.CanUseSVCB: providers.Cannot(), - providers.CanUseTLSA: providers.Cannot(), - providers.DocCreateDomains: providers.Can(), - providers.DocDualHost: providers.Cannot(), - providers.DocOfficiallySupported: providers.Cannot(), + SupportedTypes: []string{ + "A", + "AAAA", + "CNAME", }, + CanAutoDNSSEC: providers.Cannot(), + CanConcur: providers.Can(), + DocDualHost: providers.Cannot(), + DocOfficiallySupported: providers.Cannot(), }) } diff --git a/providers/netcup/netcupProvider.go b/providers/netcup/netcupProvider.go index f2be0630e7..dc57aae99e 100644 --- a/providers/netcup/netcupProvider.go +++ b/providers/netcup/netcupProvider.go @@ -15,21 +15,14 @@ func init() { providers.Register[*netcupProvider]("NETCUP", providers.Definition{ FriendlyName: "netcup", Maintainer: "@kordianbruck", - Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - // See providers/capabilities.go for the entire list of capabilities. - providers.CanConcur: providers.Unimplemented(), - providers.CanGetZones: providers.Cannot(), - providers.CanOnlyDiff1Features: providers.Can(), - providers.CanUseCAA: providers.Can(), - providers.CanUseLOC: providers.Cannot(), - providers.CanUsePTR: providers.Cannot(), - providers.CanUseSRV: providers.Can(), - providers.CanUseTLSA: providers.Can(), - providers.DocCreateDomains: providers.Cannot(), - providers.DocDualHost: providers.Cannot(), - providers.DocOfficiallySupported: providers.Cannot(), + SupportedTypes: []string{ + "Basic8", + "TLSA", + "NS:Cannot", }, + CanConcur: providers.Unimplemented(), + DocDualHost: providers.Cannot(), + DocOfficiallySupported: providers.Cannot(), }) } diff --git a/providers/netlify/netlifyProvider.go b/providers/netlify/netlifyProvider.go index 40e3064eb1..e7f0035bee 100644 --- a/providers/netlify/netlifyProvider.go +++ b/providers/netlify/netlifyProvider.go @@ -14,33 +14,20 @@ import ( ) func init() { - const providerName = "NETLIFY" - providers.RegisterCustomRecordType(providerName, providerName, "") - providers.RegisterCustomRecordType("NETLIFYv6", providerName, "") - providers.Register[*netlifyProvider](providerName, providers.Definition{ + providers.Register[*netlifyProvider]("NETLIFY", providers.Definition{ FriendlyName: "Netlify", Maintainer: "@SphericalKat", - Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - // See providers/capabilities.go for the entire list of capabilities. - providers.CanAutoDNSSEC: providers.Cannot(), - providers.CanConcur: providers.Can(), - providers.CanGetZones: providers.Can(), - providers.CanOnlyDiff1Features: providers.Can(), - providers.CanUseAlias: providers.Can(), - providers.CanUseCAA: providers.Can(), - providers.CanUseDS: providers.Cannot(), - providers.CanUseDSForChildren: providers.Cannot(), - providers.CanUseLOC: providers.Cannot(), - providers.CanUseNAPTR: providers.Cannot(), - providers.CanUsePTR: providers.Cannot(), - providers.CanUseSRV: providers.Can(), - providers.CanUseSSHFP: providers.Cannot(), - providers.CanUseTLSA: providers.Cannot(), - providers.DocCreateDomains: providers.Cannot(), - providers.DocDualHost: providers.Cannot("Netlify does not allow sufficient control over the apex NS records"), - providers.DocOfficiallySupported: providers.Cannot(), + SupportedTypes: []string{ + "Basic8", + "ALIAS", + "NETLIFY", + "NETLIFYV6", }, + CanAutoDNSSEC: providers.Cannot(), + CanConcur: providers.Can(), + CanUseDSForChildren: providers.Cannot(), + DocDualHost: providers.Cannot("Netlify does not allow sufficient control over the apex NS records"), + DocOfficiallySupported: providers.Cannot(), }) } diff --git a/providers/netnod/netnodProvider.go b/providers/netnod/netnodProvider.go index 72da84bc06..986cd9b0e7 100644 --- a/providers/netnod/netnodProvider.go +++ b/providers/netnod/netnodProvider.go @@ -30,33 +30,21 @@ func init() { }, }, Maintainer: "@Netnod @vilhelmprytz", - Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - // See providers/capabilities.go for the entire list of capabilities. - providers.CanAutoDNSSEC: providers.Cannot(), - providers.CanGetZones: providers.Can(), - providers.CanConcur: providers.Unimplemented(), - providers.CanUseAlias: providers.Can(), - providers.CanUseCAA: providers.Can(), - providers.CanUseDHCID: providers.Cannot(), - providers.CanUseDNAME: providers.Cannot(), - providers.CanUseDNSKEY: providers.Cannot(), - providers.CanUseDS: providers.Cannot(), - providers.CanUseDSForChildren: providers.Can(), - providers.CanUseHTTPS: providers.Can(), - providers.CanUseLOC: providers.Cannot(), - providers.CanUseNAPTR: providers.Can(), - providers.CanUseOPENPGPKEY: providers.Cannot(), - providers.CanUsePTR: providers.Can(), - providers.CanUseSOA: providers.Cannot(), - providers.CanUseSRV: providers.Can(), - providers.CanUseSSHFP: providers.Can(), - providers.CanUseSVCB: providers.Can(), - providers.CanUseTLSA: providers.Can(), - providers.DocCreateDomains: providers.Can(), - providers.DocDualHost: providers.Can(), - providers.DocOfficiallySupported: providers.Cannot(), + SupportedTypes: []string{ + "Basic8", + "ALIAS", + "HTTPS", + "NAPTR", + "PTR", + "SSHFP", + "SVCB", + "TLSA", }, + CanAutoDNSSEC: providers.Cannot(), + CanConcur: providers.Unimplemented(), + CanUseDSForChildren: providers.Can(), + DocDualHost: providers.Can(), + DocOfficiallySupported: providers.Cannot(), }) } diff --git a/providers/nexdns/nexdnsProvider.go b/providers/nexdns/nexdnsProvider.go index a7cad5c957..3337814986 100644 --- a/providers/nexdns/nexdnsProvider.go +++ b/providers/nexdns/nexdnsProvider.go @@ -55,34 +55,22 @@ func init() { }, Maintainer: "@nexdns", DefaultTTL: defaultTTL, + SupportedTypes: []string{ + "Basic8", + "ALIAS", + "DNAME", + "PTR", + "TLSA", + }, + CanAutoDNSSEC: providers.Unimplemented("DNSSEC is switched on per zone outside of DNSControl"), + CanConcur: providers.Unimplemented(), + CanUseDSForChildren: providers.Can(), + DocDualHost: providers.Cannot("The NS records at the zone apex cannot be changed through the API"), + DocOfficiallySupported: providers.Cannot(), + // Features retains annotations for record types and interface-derived facts. Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - // See providers/capabilities.go for the entire list of capabilities. - providers.CanAutoDNSSEC: providers.Unimplemented("DNSSEC is switched on per zone outside of DNSControl"), - providers.CanConcur: providers.Unimplemented(), - providers.CanGetZones: providers.Can(), - providers.CanUseAlias: providers.Can(), - providers.CanUseCAA: providers.Can(), - providers.CanUseDHCID: providers.Cannot(), - providers.CanUseDNAME: providers.Can(), - providers.CanUseDNSKEY: providers.Cannot(), - providers.CanUseDS: providers.Cannot("DS at the zone apex belongs in the parent zone"), - providers.CanUseDSForChildren: providers.Can(), - providers.CanUseHTTPS: providers.Cannot(), - providers.CanUseLOC: providers.Cannot(), - providers.CanUseNAPTR: providers.Cannot(), - providers.CanUseOPENPGPKEY: providers.Cannot(), - providers.CanUsePTR: providers.Can(), - providers.CanUseRP: providers.Cannot(), - providers.CanUseSMIMEA: providers.Cannot(), - providers.CanUseSOA: providers.Cannot("The SOA record is maintained by the platform"), - providers.CanUseSRV: providers.Can(), - providers.CanUseSSHFP: providers.Cannot(), - providers.CanUseSVCB: providers.Cannot(), - providers.CanUseTLSA: providers.Can(), - providers.DocCreateDomains: providers.Can(), - providers.DocDualHost: providers.Cannot("The NS records at the zone apex cannot be changed through the API"), - providers.DocOfficiallySupported: providers.Cannot(), + providers.CanUseDS: providers.Cannot("DS at the zone apex belongs in the parent zone"), + providers.CanUseSOA: providers.Cannot("The SOA record is maintained by the platform"), }, }) } diff --git a/providers/ns1/ns1Provider.go b/providers/ns1/ns1Provider.go index 40de1dd734..8df53470ef 100644 --- a/providers/ns1/ns1Provider.go +++ b/providers/ns1/ns1Provider.go @@ -26,29 +26,23 @@ func init() { }, }, Maintainer: "@costasd", - Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - // See providers/capabilities.go for the entire list of capabilities. - providers.CanAutoDNSSEC: providers.Can(), - providers.CanGetZones: providers.Can(), - providers.CanConcur: providers.Can(), - providers.CanUseAlias: providers.Can(), - providers.CanUseCAA: providers.Can(), - providers.CanUseDNAME: providers.Can(), - providers.CanUseDS: providers.Can(), - providers.CanUseDSForChildren: providers.Can(), - providers.CanUseDHCID: providers.Can(), - providers.CanUseHTTPS: providers.Can(), - providers.CanUseLOC: providers.Cannot(), - providers.CanUseNAPTR: providers.Can(), - providers.CanUsePTR: providers.Can(), - providers.CanUseSRV: providers.Can(), - providers.CanUseSVCB: providers.Can(), - providers.CanUseTLSA: providers.Can(), - providers.DocCreateDomains: providers.Can(), - providers.DocDualHost: providers.Can(), - providers.DocOfficiallySupported: providers.Cannot(), + SupportedTypes: []string{ + "Basic8", + "ALIAS", + "DHCID", + "DNAME", + "DS", + "HTTPS", + "NAPTR", + "PTR", + "SVCB", + "TLSA", }, + CanAutoDNSSEC: providers.Can(), + CanConcur: providers.Can(), + CanUseDSForChildren: providers.Can(), + DocDualHost: providers.Can(), + DocOfficiallySupported: providers.Cannot(), }) } diff --git a/providers/openprovider/openproviderProvider.go b/providers/openprovider/openproviderProvider.go index 53bb5d8e5f..889bd1cfa2 100644 --- a/providers/openprovider/openproviderProvider.go +++ b/providers/openprovider/openproviderProvider.go @@ -29,31 +29,19 @@ func init() { }, Maintainer: "@nvanlaerebeke", DefaultTTL: minimumTTL, + SupportedTypes: []string{ + "Basic8", + "TLSA", + "NS:Cannot", + }, + CanAutoDNSSEC: providers.Unimplemented("DNSSEC can be enabled outside DNSControl"), + CanConcur: providers.Unimplemented(), + DocDualHost: providers.Cannot("Openprovider manages the authoritative NS records"), + DocOfficiallySupported: providers.Cannot(), + // Features retains annotations for record types and interface-derived facts. Features: providers.DocumentationNotes{ - providers.CanAutoDNSSEC: providers.Unimplemented("DNSSEC can be enabled outside DNSControl"), - providers.CanConcur: providers.Unimplemented(), - providers.CanGetZones: providers.Can(), - providers.CanUseAlias: providers.Cannot(), - providers.CanUseCAA: providers.Can(), - providers.CanUseDHCID: providers.Cannot(), - providers.CanUseDNAME: providers.Cannot(), - providers.CanUseDNSKEY: providers.Cannot("DNSSEC keys are managed by Openprovider"), - providers.CanUseDS: providers.Cannot(), - providers.CanUseHTTPS: providers.Cannot(), - providers.CanUseLOC: providers.Cannot(), - providers.CanUseNAPTR: providers.Cannot(), - providers.CanUseOPENPGPKEY: providers.Cannot(), - providers.CanUsePTR: providers.Cannot(), - providers.CanUseRP: providers.Cannot(), - providers.CanUseSMIMEA: providers.Cannot(), - providers.CanUseSOA: providers.Cannot("The SOA record is managed by Openprovider"), - providers.CanUseSRV: providers.Can(), - providers.CanUseSSHFP: providers.Cannot(), - providers.CanUseSVCB: providers.Cannot(), - providers.CanUseTLSA: providers.Can(), - providers.DocCreateDomains: providers.Can(), - providers.DocDualHost: providers.Cannot("Openprovider manages the authoritative NS records"), - providers.DocOfficiallySupported: providers.Cannot(), + providers.CanUseDNSKEY: providers.Cannot("DNSSEC keys are managed by Openprovider"), + providers.CanUseSOA: providers.Cannot("The SOA record is managed by Openprovider"), }, }) } diff --git a/providers/opensrs/opensrsProvider.go b/providers/opensrs/opensrsProvider.go index c1464f0aa2..929c9d818b 100644 --- a/providers/opensrs/opensrsProvider.go +++ b/providers/opensrs/opensrsProvider.go @@ -14,13 +14,10 @@ import ( func init() { providers.Register[*opensrsProvider]("OPENSRS", providers.Definition{ - FriendlyName: "OpenSRS", - Maintainer: "NEEDS VOLUNTEER", - Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - // See providers/capabilities.go for the entire list of capabilities. - providers.CanConcur: providers.Unimplemented(), - }, + FriendlyName: "OpenSRS", + Maintainer: "NEEDS VOLUNTEER", + SupportedTypes: []string{}, + CanConcur: providers.Unimplemented(), }) } diff --git a/providers/openwrt/openwrtProvider.go b/providers/openwrt/openwrtProvider.go index c88a993561..f104e925ce 100644 --- a/providers/openwrt/openwrtProvider.go +++ b/providers/openwrt/openwrtProvider.go @@ -45,12 +45,13 @@ func init() { providers.Register[*openwrtProvider]("OPENWRT", providers.Definition{ FriendlyName: "OpenWrt", Maintainer: "@huskyistaken", - Features: providers.DocumentationNotes{ - providers.CanGetZones: providers.Can(), - providers.CanUseAlias: providers.Cannot(), - providers.CanUseSRV: providers.Can(), - providers.DocOfficiallySupported: providers.Cannot(), + SupportedTypes: []string{ + "Basic8", + "CAA:Cannot", + "NS:Cannot", + "TXT:Cannot", }, + DocOfficiallySupported: providers.Cannot(), }) } diff --git a/providers/oracle/oracleProvider.go b/providers/oracle/oracleProvider.go index a77327b89c..b43aba9f44 100644 --- a/providers/oracle/oracleProvider.go +++ b/providers/oracle/oracleProvider.go @@ -22,24 +22,18 @@ func init() { providers.Register[*oracleProvider]("ORACLE", providers.Definition{ FriendlyName: "Oracle Cloud Infrastructure", Maintainer: "@kallsyms", - Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - // See providers/capabilities.go for the entire list of capabilities. - providers.CanConcur: providers.Unimplemented(), - providers.CanGetZones: providers.Can(), - providers.CanUseAlias: providers.Can(), - providers.CanUseCAA: providers.Can(), - providers.CanUseDS: providers.Cannot(), // should be supported, but getting 500s in tests - providers.CanUseLOC: providers.Unimplemented(), - providers.CanUseNAPTR: providers.Can(), - providers.CanUsePTR: providers.Can(), - providers.CanUseSRV: providers.Can(), - providers.CanUseSSHFP: providers.Can(), - providers.CanUseTLSA: providers.Can(), - providers.DocCreateDomains: providers.Can(), - providers.DocDualHost: providers.Can(), - providers.DocOfficiallySupported: providers.Cannot(), + SupportedTypes: []string{ + "Basic8", + "ALIAS", + "NAPTR", + "PTR", + "SSHFP", + "TLSA", + "LOC:Unimplemented", }, + CanConcur: providers.Unimplemented(), + DocDualHost: providers.Can(), + DocOfficiallySupported: providers.Cannot(), }) } diff --git a/providers/ovh/ovhProvider.go b/providers/ovh/ovhProvider.go index 945be5dfbd..934c3e96c1 100644 --- a/providers/ovh/ovhProvider.go +++ b/providers/ovh/ovhProvider.go @@ -54,21 +54,18 @@ func init() { providers.Register[*ovhProvider]("OVH", providers.Definition{ FriendlyName: "OVHcloud", Maintainer: "@masterzen", + SupportedTypes: []string{ + "Basic8", + "SSHFP", + "TLSA", + "LOC:Unimplemented", + }, + CanConcur: providers.Unimplemented(), + DocDualHost: providers.Can(), + DocOfficiallySupported: providers.Cannot(), + // Features retains annotations for record types and interface-derived facts. Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - // See providers/capabilities.go for the entire list of capabilities. - providers.CanGetZones: providers.Can(), - providers.CanConcur: providers.Unimplemented(), - providers.CanUseAlias: providers.Cannot(), - providers.CanUseCAA: providers.Can(), - providers.CanUseLOC: providers.Unimplemented(), - providers.CanUsePTR: providers.Cannot(), - providers.CanUseSRV: providers.Can(), - providers.CanUseSSHFP: providers.Can(), - providers.CanUseTLSA: providers.Can(), - providers.DocCreateDomains: providers.Cannot("New domains require registration"), - providers.DocDualHost: providers.Can(), - providers.DocOfficiallySupported: providers.Cannot(), + providers.DocCreateDomains: providers.Cannot("New domains require registration"), }, }) } diff --git a/providers/packetframe/packetframeProvider.go b/providers/packetframe/packetframeProvider.go index 545f3e7393..b222a87087 100644 --- a/providers/packetframe/packetframeProvider.go +++ b/providers/packetframe/packetframeProvider.go @@ -49,17 +49,14 @@ func init() { providers.Register[*packetframeProvider]("PACKETFRAME", providers.Definition{ FriendlyName: "Packetframe", Maintainer: "NEEDS VOLUNTEER", - Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - // See providers/capabilities.go for the entire list of capabilities. - providers.CanConcur: providers.Unimplemented(), - providers.CanGetZones: providers.Unimplemented(), - providers.CanOnlyDiff1Features: providers.Can(), - providers.CanUsePTR: providers.Can(), - providers.CanUseSRV: providers.Can(), - providers.DocDualHost: providers.Cannot(), - providers.DocOfficiallySupported: providers.Cannot(), + SupportedTypes: []string{ + "Basic8", + "PTR", + "CAA:Cannot", }, + CanConcur: providers.Unimplemented(), + DocDualHost: providers.Cannot(), + DocOfficiallySupported: providers.Cannot(), }) } diff --git a/providers/porkbun/porkbunProvider.go b/providers/porkbun/porkbunProvider.go index 34bc0f9b5d..5a9bd94be1 100644 --- a/providers/porkbun/porkbunProvider.go +++ b/providers/porkbun/porkbunProvider.go @@ -71,11 +71,7 @@ func (c *porkbunProvider) Initialize(m map[string]string, _ json.RawMessage, opt } func init() { - const providerName = "PORKBUN" - providers.RegisterCustomRecordType("PORKBUN_URLFWD", providerName, "") - providers.RegisterCustomRecordType("URL", providerName, "") - providers.RegisterCustomRecordType("URL301", providerName, "") - providers.Register[*porkbunProvider](providerName, providers.Definition{ + providers.Register[*porkbunProvider]("PORKBUN", providers.Definition{ FriendlyName: "Porkbun", PortalURL: "https://porkbun.com/account/api", Notes: "Porkbun requires API access to be enabled for each domain before DNSControl can manage it.", @@ -106,29 +102,22 @@ func init() { }, }, Maintainer: "@imlonghao", - Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - // See providers/capabilities.go for the entire list of capabilities. - providers.CanAutoDNSSEC: providers.Cannot(), - providers.CanGetZones: providers.Can(), - providers.CanConcur: providers.Can(), - providers.CanUseAlias: providers.Can(), - providers.CanUseCAA: providers.Can(), - providers.CanUseDS: providers.Cannot(), - providers.CanUseDSForChildren: providers.Cannot(), - providers.CanUseLOC: providers.Cannot(), - providers.CanUseNAPTR: providers.Cannot(), - providers.CanUsePTR: providers.Cannot(), - providers.CanUseSOA: providers.Cannot(), - providers.CanUseSRV: providers.Can(), - providers.CanUseSSHFP: providers.Can(), - providers.CanUseTLSA: providers.Can(), - providers.CanUseHTTPS: providers.Can(), - providers.CanUseSVCB: providers.Can(), - providers.DocCreateDomains: providers.Cannot(), - providers.DocDualHost: providers.Cannot(), - providers.DocOfficiallySupported: providers.Cannot(), + SupportedTypes: []string{ + "Basic8", + "ALIAS", + "HTTPS", + "PORKBUN_URLFWD", + "SSHFP", + "SVCB", + "TLSA", + "URL", + "URL301", }, + CanAutoDNSSEC: providers.Cannot(), + CanConcur: providers.Can(), + CanUseDSForChildren: providers.Cannot(), + DocDualHost: providers.Cannot(), + DocOfficiallySupported: providers.Cannot(), }) } diff --git a/providers/powerdns/powerdnsProvider.go b/providers/powerdns/powerdnsProvider.go index 6fe77a9ff4..a84f44d3bd 100644 --- a/providers/powerdns/powerdnsProvider.go +++ b/providers/powerdns/powerdnsProvider.go @@ -11,36 +11,36 @@ import ( ) func init() { - const providerName = "POWERDNS" - providers.RegisterCustomRecordType("LUA", providerName, "") - providers.Register[*powerdnsProvider](providerName, providers.Definition{ + providers.Register[*powerdnsProvider]("POWERDNS", providers.Definition{ FriendlyName: "PowerDNS", Maintainer: "@jpbede", + SupportedTypes: []string{ + "Basic8", + "ALIAS", + "DHCID", + "DNAME", + "DNSKEY", + "DS", + "HTTPS", + "LUA", + "NAPTR", + "OPENPGPKEY", + "PTR", + "SOA", + "SSHFP", + "SVCB", + "TLSA", + "LOC:Unimplemented", + }, + CanAutoDNSSEC: providers.Can(), + CanConcur: providers.Unimplemented(), + DocDualHost: providers.Can(), + DocOfficiallySupported: providers.Cannot(), + // Features retains annotations for record types and interface-derived facts. Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - // See providers/capabilities.go for the entire list of capabilities. - providers.CanAutoDNSSEC: providers.Can(), - providers.CanGetZones: providers.Can(), - providers.CanConcur: providers.Unimplemented(), - providers.CanUseAlias: providers.Can("Needs to be enabled in PowerDNS first", "https://doc.powerdns.com/authoritative/guides/alias.html"), - providers.CanUseCAA: providers.Can(), - providers.CanUseDS: providers.Can(), - providers.CanUseDHCID: providers.Can(), - providers.CanUseLOC: providers.Unimplemented("Normalization within the PowerDNS API seems to be buggy, so disabled", "https://github.com/PowerDNS/pdns/issues/10558"), - providers.CanUseNAPTR: providers.Can(), - providers.CanUseOPENPGPKEY: providers.Can(), - providers.CanUsePTR: providers.Can(), - providers.CanUseSOA: providers.Can(), - providers.CanUseSRV: providers.Can(), - providers.CanUseSSHFP: providers.Can(), - providers.CanUseTLSA: providers.Can(), - providers.CanUseDNAME: providers.Can("Needs to be enabled in PowerDNS first", "https://doc.powerdns.com/authoritative/settings.html#setting-dname-processing"), - providers.CanUseHTTPS: providers.Can(), - providers.CanUseSVCB: providers.Can(), - providers.CanUseDNSKEY: providers.Can(), - providers.DocCreateDomains: providers.Can(), - providers.DocDualHost: providers.Can(), - providers.DocOfficiallySupported: providers.Cannot(), + providers.CanUseAlias: providers.Can("Needs to be enabled in PowerDNS first", "https://doc.powerdns.com/authoritative/guides/alias.html"), + providers.CanUseLOC: providers.Unimplemented("Normalization within the PowerDNS API seems to be buggy, so disabled", "https://github.com/PowerDNS/pdns/issues/10558"), + providers.CanUseDNAME: providers.Can("Needs to be enabled in PowerDNS first", "https://doc.powerdns.com/authoritative/settings.html#setting-dname-processing"), }, }) } diff --git a/providers/realtimeregister/realtimeregisterProvider.go b/providers/realtimeregister/realtimeregisterProvider.go index 8204c58417..1519472784 100644 --- a/providers/realtimeregister/realtimeregisterProvider.go +++ b/providers/realtimeregister/realtimeregisterProvider.go @@ -30,27 +30,22 @@ func init() { providers.Register[*realtimeregisterAPI]("REALTIMEREGISTER", providers.Definition{ FriendlyName: "Realtime Register", Maintainer: "@PJEilers", + SupportedTypes: []string{ + "Basic8", + "ALIAS", + "LOC", + "NAPTR", + "SSHFP", + "TLSA", + }, + CanAutoDNSSEC: providers.Can(), + CanConcur: providers.Unimplemented(), + CanUseDSForChildren: providers.Can(), + DocDualHost: providers.Cannot(), + DocOfficiallySupported: providers.Cannot(), + // Features retains annotations for record types and interface-derived facts. Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - // See providers/capabilities.go for the entire list of capabilities. - providers.CanAutoDNSSEC: providers.Can(), - providers.CanGetZones: providers.Can(), - providers.CanConcur: providers.Unimplemented(), - providers.CanUseAlias: providers.Can(), - providers.CanUseCAA: providers.Can(), - providers.CanUseDHCID: providers.Cannot(), - providers.CanUseDS: providers.Cannot("Only for subdomains"), - providers.CanUseDSForChildren: providers.Can(), - providers.CanUseLOC: providers.Can(), - providers.CanUseNAPTR: providers.Can(), - providers.CanUsePTR: providers.Cannot(), - providers.CanUseSOA: providers.Cannot(), - providers.CanUseSRV: providers.Can(), - providers.CanUseSSHFP: providers.Can(), - providers.CanUseTLSA: providers.Can(), - providers.DocCreateDomains: providers.Can(), - providers.DocDualHost: providers.Cannot(), - providers.DocOfficiallySupported: providers.Cannot(), + providers.CanUseDS: providers.Cannot("Only for subdomains"), }, }) } diff --git a/providers/route53/initialize_test.go b/providers/route53/initialize_test.go index d126b16f34..01c94f83ec 100644 --- a/providers/route53/initialize_test.go +++ b/providers/route53/initialize_test.go @@ -19,8 +19,10 @@ func TestRegisteredDefinition(t *testing.T) { if !ok || def.Kind != providers.KindDNS|providers.KindRegistrar || !def.CanGetZones || !def.DocCreateDomains { t.Fatalf("Route 53 definition = %+v", def) } - if !reflect.DeepEqual(def.DerivedFeatures, def.Features) { - t.Fatal("migration changed legacy capabilities") + for capability, note := range def.Features { + if !reflect.DeepEqual(def.DerivedFeatures[capability], note) { + t.Fatalf("migration changed annotation for %s", capability) + } } if errors := providers.AuditRecords("ROUTE53", nil); len(errors) != 0 { t.Fatal(errors) diff --git a/providers/route53/route53Provider.go b/providers/route53/route53Provider.go index be4bec7f07..64400e5cad 100644 --- a/providers/route53/route53Provider.go +++ b/providers/route53/route53Provider.go @@ -115,30 +115,25 @@ func (r *route53Provider) initializeAWS(m map[string]string) error { } func init() { - const providerName = "ROUTE53" - providers.RegisterCustomRecordType("R53_ALIAS", providerName, "") - providers.Register[*route53Provider](providerName, providers.Definition{ + providers.Register[*route53Provider]("ROUTE53", providers.Definition{ FriendlyName: "Amazon Route 53", Maintainer: "@tresni", + SupportedTypes: []string{ + "Basic8", + "HTTPS", + "PTR", + "R53_ALIAS", + "SOA", + "SSHFP", + "SVCB", + "TLSA", + }, + CanConcur: providers.Can(), + DocDualHost: providers.Can(), + DocOfficiallySupported: providers.Can(), + // Features retains annotations for record types and interface-derived facts. Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - // See providers/capabilities.go for the entire list of capabilities. - providers.CanGetZones: providers.Can(), - providers.CanConcur: providers.Can(), - providers.CanUseAlias: providers.Cannot("R53 does not provide a generic ALIAS functionality. Use R53_ALIAS instead."), - providers.CanUseCAA: providers.Can(), - providers.CanUseHTTPS: providers.Can(), - providers.CanUseLOC: providers.Cannot(), - providers.CanUsePTR: providers.Can(), - providers.CanUseRoute53Alias: providers.Can(), - providers.CanUseSOA: providers.Can(), - providers.CanUseSRV: providers.Can(), - providers.CanUseSSHFP: providers.Can(), - providers.CanUseSVCB: providers.Can(), - providers.CanUseTLSA: providers.Can(), - providers.DocCreateDomains: providers.Can(), - providers.DocDualHost: providers.Can(), - providers.DocOfficiallySupported: providers.Can(), + providers.CanUseAlias: providers.Cannot("R53 does not provide a generic ALIAS functionality. Use R53_ALIAS instead."), }, PortalURL: "https://console.aws.amazon.com/route53/", Notes: "Route53 supports several auth methods: a named profile from ~/.aws/config (including AWS IAM Identity Center / SSO), static access keys, or the SDK's default credential chain (environment variables, EC2 instance role, etc.). RoleArn can be layered on top of any of these.", diff --git a/providers/rwth/rwthProvider.go b/providers/rwth/rwthProvider.go index db45807148..b4513772d7 100644 --- a/providers/rwth/rwthProvider.go +++ b/providers/rwth/rwthProvider.go @@ -16,24 +16,21 @@ func init() { providers.Register[*rwthProvider]("RWTH", providers.Definition{ FriendlyName: "RWTH Aachen", Maintainer: "@mistererwin", + SupportedTypes: []string{ + "Basic8", + "PTR", + "SSHFP", + "DS:Unimplemented", + }, + CanAutoDNSSEC: providers.Unimplemented("Supported by RWTH but not implemented yet."), + CanConcur: providers.Unimplemented(), + DocDualHost: providers.Cannot(), + DocOfficiallySupported: providers.Cannot(), + // Features retains annotations for record types and interface-derived facts. Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - // See providers/capabilities.go for the entire list of capabilities. - providers.CanAutoDNSSEC: providers.Unimplemented("Supported by RWTH but not implemented yet."), - providers.CanConcur: providers.Unimplemented(), - providers.CanGetZones: providers.Can(), - providers.CanUseAlias: providers.Cannot(), - providers.CanUseCAA: providers.Can(), - providers.CanUseDS: providers.Unimplemented("DS records are only supported at the apex and require a different API call that hasn't been implemented yet."), - providers.CanUseLOC: providers.Cannot(), - providers.CanUseNAPTR: providers.Cannot(), - providers.CanUsePTR: providers.Can("PTR records with empty targets are not supported"), - providers.CanUseSRV: providers.Can("SRV records with empty targets are not supported."), - providers.CanUseSSHFP: providers.Can(), - providers.CanUseTLSA: providers.Cannot(), - providers.DocCreateDomains: providers.Cannot(), - providers.DocDualHost: providers.Cannot(), - providers.DocOfficiallySupported: providers.Cannot(), + providers.CanUseDS: providers.Unimplemented("DS records are only supported at the apex and require a different API call that hasn't been implemented yet."), + providers.CanUsePTR: providers.Can("PTR records with empty targets are not supported"), + providers.CanUseSRV: providers.Can("SRV records with empty targets are not supported."), }, }) } diff --git a/providers/sakuracloud/sakuracloudProvider.go b/providers/sakuracloud/sakuracloudProvider.go index d0340f5f5a..10346c4a29 100644 --- a/providers/sakuracloud/sakuracloudProvider.go +++ b/providers/sakuracloud/sakuracloudProvider.go @@ -15,32 +15,18 @@ func init() { providers.Register[*sakuracloudProvider]("SAKURACLOUD", providers.Definition{ FriendlyName: "Sakura Cloud", Maintainer: "@ttkzw", - Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - // See providers/capabilities.go for the entire list of capabilities. - providers.CanAutoDNSSEC: providers.Cannot(), - providers.CanConcur: providers.Unimplemented(), - providers.CanGetZones: providers.Can(), - providers.CanUseAlias: providers.Can(), - providers.CanUseCAA: providers.Can(), - providers.CanUseDHCID: providers.Cannot(), - providers.CanUseDNAME: providers.Cannot(), - providers.CanUseDS: providers.Cannot(), - providers.CanUseDSForChildren: providers.Cannot(), - providers.CanUseHTTPS: providers.Can(), - providers.CanUseLOC: providers.Cannot(), - providers.CanUseNAPTR: providers.Cannot(), - providers.CanUsePTR: providers.Can(), - providers.CanUseSOA: providers.Cannot(), - providers.CanUseSRV: providers.Can(), - providers.CanUseSSHFP: providers.Cannot(), - providers.CanUseSVCB: providers.Can(), - providers.CanUseTLSA: providers.Cannot(), - providers.CanUseDNSKEY: providers.Cannot(), - providers.DocCreateDomains: providers.Can(), - providers.DocDualHost: providers.Cannot(), - providers.DocOfficiallySupported: providers.Cannot(), + SupportedTypes: []string{ + "Basic8", + "ALIAS", + "HTTPS", + "PTR", + "SVCB", }, + CanAutoDNSSEC: providers.Cannot(), + CanConcur: providers.Unimplemented(), + CanUseDSForChildren: providers.Cannot(), + DocDualHost: providers.Cannot(), + DocOfficiallySupported: providers.Cannot(), }) } diff --git a/providers/scaleway/scalewayProvider.go b/providers/scaleway/scalewayProvider.go index a48bb58ebd..7c698210d5 100644 --- a/providers/scaleway/scalewayProvider.go +++ b/providers/scaleway/scalewayProvider.go @@ -30,30 +30,24 @@ func init() { providers.Register[*scalewayProvider]("SCALEWAY", providers.Definition{ FriendlyName: "Scaleway", Maintainer: "@alessiopcc", + SupportedTypes: []string{ + "Basic8", + "ALIAS", + "DNAME", + "HTTPS", + "NAPTR", + "SSHFP", + "SVCB", + "TLSA", + }, + CanAutoDNSSEC: providers.Cannot(), + CanConcur: providers.Unimplemented(), + CanUseDSForChildren: providers.Cannot(), + DocDualHost: providers.Cannot(), + DocOfficiallySupported: providers.Cannot(), + // Features retains annotations for record types and interface-derived facts. Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - // See providers/capabilities.go for the entire list of capabilities. - providers.CanAutoDNSSEC: providers.Cannot(), - providers.CanConcur: providers.Unimplemented(), - providers.CanGetZones: providers.Can(), - providers.CanUseAlias: providers.Can(), - providers.CanUseCAA: providers.Can(), - providers.CanUseDHCID: providers.Cannot(), - providers.CanUseDNAME: providers.Can(), - providers.CanUseDS: providers.Cannot(), - providers.CanUseDSForChildren: providers.Cannot(), - providers.CanUseHTTPS: providers.Can(), - providers.CanUseLOC: providers.Cannot(), - providers.CanUseNAPTR: providers.Can(), - providers.CanUsePTR: providers.Cannot(), - providers.CanUseSOA: providers.Cannot(), - providers.CanUseSRV: providers.Can(), - providers.CanUseSSHFP: providers.Can(), - providers.CanUseSVCB: providers.Can(), - providers.CanUseTLSA: providers.Can(), - providers.DocCreateDomains: providers.Cannot("Zones must already exist in the Scaleway console."), - providers.DocDualHost: providers.Cannot(), - providers.DocOfficiallySupported: providers.Cannot(), + providers.DocCreateDomains: providers.Cannot("Zones must already exist in the Scaleway console."), }, }) } diff --git a/providers/softlayer/softlayerProvider.go b/providers/softlayer/softlayerProvider.go index 781411dab5..ea9f3ed092 100644 --- a/providers/softlayer/softlayerProvider.go +++ b/providers/softlayer/softlayerProvider.go @@ -27,15 +27,11 @@ func init() { providers.Register[*softlayerProvider]("SOFTLAYER", providers.Definition{ FriendlyName: "SoftLayer", Maintainer: "NEEDS VOLUNTEER", - Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - // See providers/capabilities.go for the entire list of capabilities. - providers.CanConcur: providers.Unimplemented(), - providers.CanGetZones: providers.Unimplemented(), - providers.CanOnlyDiff1Features: providers.Can(), - providers.CanUseLOC: providers.Cannot(), - providers.CanUseSRV: providers.Can(), + SupportedTypes: []string{ + "Basic8", + "CAA:Cannot", }, + CanConcur: providers.Unimplemented(), }) } diff --git a/providers/spaceship/spaceshipProvider.go b/providers/spaceship/spaceshipProvider.go index 1239d30850..a7c699edb0 100644 --- a/providers/spaceship/spaceshipProvider.go +++ b/providers/spaceship/spaceshipProvider.go @@ -44,28 +44,23 @@ func init() { }, }, Maintainer: "@rootful", + SupportedTypes: []string{ + "Basic8", + "ALIAS", + "HTTPS", + "PTR", + "SVCB", + "TLSA", + }, + CanAutoDNSSEC: providers.Cannot("Spaceship does not expose DNSSEC via the public API"), + CanConcur: providers.Can(), + CanUseDSForChildren: providers.Cannot(), + DocDualHost: providers.Cannot(), + DocOfficiallySupported: providers.Cannot(), + // Features retains annotations for record types and interface-derived facts. Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - // See providers/capabilities.go for the entire list of capabilities. - providers.CanAutoDNSSEC: providers.Cannot("Spaceship does not expose DNSSEC via the public API"), - providers.CanConcur: providers.Can(), - providers.CanGetZones: providers.Can(), - providers.CanUseAlias: providers.Can("Apex ALIAS is stored as CNAME; declare an apex CNAME instead"), - providers.CanUseCAA: providers.Can(), - providers.CanUseDS: providers.Cannot(), - providers.CanUseDSForChildren: providers.Cannot(), - providers.CanUseHTTPS: providers.Can(), - providers.CanUseLOC: providers.Cannot(), - providers.CanUseNAPTR: providers.Cannot(), - providers.CanUsePTR: providers.Can(), - providers.CanUseSOA: providers.Cannot(), - providers.CanUseSRV: providers.Can(), - providers.CanUseSSHFP: providers.Cannot(), - providers.CanUseSVCB: providers.Can(), - providers.CanUseTLSA: providers.Can(), - providers.DocCreateDomains: providers.Cannot("The domain must already exist in the Spaceship account"), - providers.DocDualHost: providers.Cannot(), - providers.DocOfficiallySupported: providers.Cannot(), + providers.CanUseAlias: providers.Can("Apex ALIAS is stored as CNAME; declare an apex CNAME instead"), + providers.DocCreateDomains: providers.Cannot("The domain must already exist in the Spaceship account"), }, }) } diff --git a/providers/tencentdns/tencentdnsProvider.go b/providers/tencentdns/tencentdnsProvider.go index 50b5098d88..f07954fe9a 100644 --- a/providers/tencentdns/tencentdnsProvider.go +++ b/providers/tencentdns/tencentdnsProvider.go @@ -57,16 +57,11 @@ func init() { Maintainer: "@cylonchau", DefaultTTL: defaultTTL, RecordIdentity: recordIdentity, - Features: providers.DocumentationNotes{ - providers.CanUseAlias: providers.Cannot(), - providers.CanGetZones: providers.Can(), - providers.CanUseCAA: providers.Can(), - providers.CanUsePTR: providers.Cannot(), - providers.CanUseSRV: providers.Can(), - providers.DocCreateDomains: providers.Can(), - providers.DocDualHost: providers.Can("Tencent Cloud allows full management of apex NS records"), - providers.DocOfficiallySupported: providers.Cannot(), + SupportedTypes: []string{ + "Basic8", }, + DocDualHost: providers.Can("Tencent Cloud allows full management of apex NS records"), + DocOfficiallySupported: providers.Cannot(), }) } diff --git a/providers/transip/transipProvider.go b/providers/transip/transipProvider.go index d62bd3658e..cc4aece288 100644 --- a/providers/transip/transipProvider.go +++ b/providers/transip/transipProvider.go @@ -102,35 +102,18 @@ func init() { }, }, Maintainer: "@blackshadev", - Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - // See providers/capabilities.go for the entire list of capabilities. - providers.CanAutoDNSSEC: providers.Cannot(), - providers.CanGetZones: providers.Can(), - providers.CanConcur: providers.Can(), - providers.CanUseAKAMAICDN: providers.Cannot(), - providers.CanUseAlias: providers.Can(), - providers.CanUseAzureAlias: providers.Cannot(), - providers.CanUseCAA: providers.Can(), - providers.CanUseDHCID: providers.Cannot(), - providers.CanUseDNAME: providers.Cannot(), - providers.CanUseDS: providers.Cannot(), - providers.CanUseDSForChildren: providers.Cannot(), - providers.CanUseHTTPS: providers.Cannot(), - providers.CanUseLOC: providers.Cannot(), - providers.CanUseNAPTR: providers.Can(), - providers.CanUsePTR: providers.Cannot(), - providers.CanUseRoute53Alias: providers.Cannot(), - providers.CanUseSOA: providers.Cannot(), - providers.CanUseSRV: providers.Can(), - providers.CanUseSSHFP: providers.Can(), - providers.CanUseSVCB: providers.Cannot(), - providers.CanUseTLSA: providers.Can(), - providers.CanUseDNSKEY: providers.Cannot(), - providers.DocCreateDomains: providers.Cannot(), - providers.DocDualHost: providers.Cannot(), - providers.DocOfficiallySupported: providers.Cannot(), + SupportedTypes: []string{ + "Basic8", + "ALIAS", + "NAPTR", + "SSHFP", + "TLSA", }, + CanAutoDNSSEC: providers.Cannot(), + CanConcur: providers.Can(), + CanUseDSForChildren: providers.Cannot(), + DocDualHost: providers.Cannot(), + DocOfficiallySupported: providers.Cannot(), }) } diff --git a/providers/unifi/unifiProvider.go b/providers/unifi/unifiProvider.go index e1bc78dc5e..f22fff0041 100644 --- a/providers/unifi/unifiProvider.go +++ b/providers/unifi/unifiProvider.go @@ -21,19 +21,17 @@ func init() { providers.Register[*unifiProvider]("UNIFI", providers.Definition{ FriendlyName: "UniFi", Maintainer: "@zupolgec", + SupportedTypes: []string{ + "Basic8", + "CAA:Cannot", + "NS:Cannot", + }, + CanConcur: providers.Cannot(), + DocOfficiallySupported: providers.Cannot(), + // Features retains annotations for record types and interface-derived facts. Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - providers.CanGetZones: providers.Cannot("UniFi stores records flat, not by zone"), - providers.CanConcur: providers.Cannot(), - providers.CanUseAlias: providers.Cannot(), - providers.CanUseCAA: providers.Cannot(), - providers.CanUseLOC: providers.Cannot(), - providers.CanUsePTR: providers.Cannot(), - providers.CanUseSRV: providers.Can(), - providers.CanUseSSHFP: providers.Cannot(), - providers.CanUseTLSA: providers.Cannot(), - providers.DocOfficiallySupported: providers.Cannot(), - providers.DocCreateDomains: providers.Cannot("UniFi does not have zone concept"), + providers.CanGetZones: providers.Cannot("UniFi stores records flat, not by zone"), + providers.DocCreateDomains: providers.Cannot("UniFi does not have zone concept"), }, }) } diff --git a/providers/vercel/vercelProvider.go b/providers/vercel/vercelProvider.go index ec4cdb441e..5951ecbb36 100644 --- a/providers/vercel/vercelProvider.go +++ b/providers/vercel/vercelProvider.go @@ -44,31 +44,19 @@ func init() { providers.Register[*vercelProvider]("VERCEL", providers.Definition{ FriendlyName: "Vercel", Maintainer: "@SukkaW", + SupportedTypes: []string{ + "Basic8", + "ALIAS", + "HTTPS", + }, + CanAutoDNSSEC: providers.Cannot(), + CanConcur: providers.Unimplemented(), + CanUseDSForChildren: providers.Cannot(), + DocDualHost: providers.Cannot("Vercel does not allow sufficient control over the apex NS records"), + DocOfficiallySupported: providers.Cannot(), + // Features retains annotations for record types and interface-derived facts. Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - // See providers/capabilities.go for the entire list of capabilities. - providers.CanAutoDNSSEC: providers.Cannot(), - providers.CanGetZones: providers.Cannot(), - providers.CanConcur: providers.Unimplemented(), - providers.CanUseDNAME: providers.Cannot(), - providers.CanUseAlias: providers.Can(), - providers.CanUseCAA: providers.Can(), - providers.CanUseDHCID: providers.Cannot(), - providers.CanUseDS: providers.Cannot(), - providers.CanUseDSForChildren: providers.Cannot(), - providers.CanUseLOC: providers.Cannot(), - providers.CanUseNAPTR: providers.Cannot(), - providers.CanUsePTR: providers.Cannot(), - providers.CanUseSOA: providers.Cannot(), - providers.CanUseSRV: providers.Can(), - providers.CanUseSVCB: providers.Cannot(), - providers.CanUseHTTPS: providers.Can(), - providers.CanUseSSHFP: providers.Cannot(), - providers.CanUseTLSA: providers.Cannot(), - providers.CanUseDNSKEY: providers.Cannot(), - providers.DocCreateDomains: providers.Cannot("Vercel requires a domain to be associated with a project before it can be added and managed"), - providers.DocDualHost: providers.Cannot("Vercel does not allow sufficient control over the apex NS records"), - providers.DocOfficiallySupported: providers.Cannot(), + providers.DocCreateDomains: providers.Cannot("Vercel requires a domain to be associated with a project before it can be added and managed"), }, }) } diff --git a/providers/vultr/vultrProvider.go b/providers/vultr/vultrProvider.go index 968653d4ab..a953189be5 100644 --- a/providers/vultr/vultrProvider.go +++ b/providers/vultr/vultrProvider.go @@ -30,22 +30,13 @@ func init() { providers.Register[*vultrProvider]("VULTR", providers.Definition{ FriendlyName: "Vultr", Maintainer: "@pgaskin", - Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - // See providers/capabilities.go for the entire list of capabilities. - providers.CanAutoDNSSEC: providers.Can(), - providers.CanGetZones: providers.Can(), - providers.CanConcur: providers.Can(), - providers.CanUseAlias: providers.Cannot(), - providers.CanUseCAA: providers.Can(), - providers.CanUseLOC: providers.Cannot(), - providers.CanUsePTR: providers.Cannot(), - providers.CanUseSRV: providers.Can(), - providers.CanUseSSHFP: providers.Can(), - providers.CanUseTLSA: providers.Cannot(), - providers.DocCreateDomains: providers.Can(), - providers.DocOfficiallySupported: providers.Cannot(), + SupportedTypes: []string{ + "Basic8", + "SSHFP", }, + CanAutoDNSSEC: providers.Can(), + CanConcur: providers.Can(), + DocOfficiallySupported: providers.Cannot(), }) } diff --git a/providers/websupport/websupportProvider.go b/providers/websupport/websupportProvider.go index 120731ab2e..89762e4e7f 100644 --- a/providers/websupport/websupportProvider.go +++ b/providers/websupport/websupportProvider.go @@ -48,24 +48,20 @@ func init() { }, }, Maintainer: "@mtmn", + SupportedTypes: []string{ + "Basic8", + "CAA:Cannot", + "NS:Cannot", + }, + CanConcur: providers.Unimplemented(), + DocDualHost: providers.Cannot(), + DocOfficiallySupported: providers.Cannot(), + // Features retains annotations for record types and interface-derived facts. Features: providers.DocumentationNotes{ - // The default for unlisted capabilities is 'Cannot'. - // See providers/capabilities.go for the entire list of capabilities. - providers.CanGetZones: providers.Cannot("WebSupport has no list-all-zones endpoint."), - providers.CanConcur: providers.Unimplemented(), - providers.CanUseAlias: providers.Cannot("WebSupport's ANAME is apex-only and conflicts with other apex records."), - providers.CanUseCAA: providers.Cannot("The v2 API does not return CAA tag/flags on read, so records cannot be managed without churn."), - providers.CanUseLOC: providers.Cannot(), - providers.CanUseNAPTR: providers.Cannot(), - providers.CanUsePTR: providers.Cannot(), - providers.CanUseSRV: providers.Can(), - providers.CanUseSSHFP: providers.Cannot(), - providers.CanUseTLSA: providers.Cannot(), - providers.CanUseDS: providers.Cannot(), - providers.CanUseSOA: providers.Cannot(), - providers.DocCreateDomains: providers.Cannot("Zones must be created via the WebSupport portal."), - providers.DocDualHost: providers.Cannot(), - providers.DocOfficiallySupported: providers.Cannot(), + providers.CanGetZones: providers.Cannot("WebSupport has no list-all-zones endpoint."), + providers.CanUseAlias: providers.Cannot("WebSupport's ANAME is apex-only and conflicts with other apex records."), + providers.CanUseCAA: providers.Cannot("The v2 API does not return CAA tag/flags on read, so records cannot be managed without churn."), + providers.DocCreateDomains: providers.Cannot("Zones must be created via the WebSupport portal."), }, }) }