mirror of
https://github.com/StackExchange/dnscontrol.git
synced 2024-05-11 05:55:12 +00:00
NEW RECORD TYPE: DNAME (#2893)
This commit is contained in:
@ -89,6 +89,7 @@ func matrixData() *FeatureMatrix {
|
|||||||
DomainModifierTlsa = "[`TLSA`](functions/domain/TLSA.md)"
|
DomainModifierTlsa = "[`TLSA`](functions/domain/TLSA.md)"
|
||||||
DomainModifierDs = "[`DS`](functions/domain/DS.md)"
|
DomainModifierDs = "[`DS`](functions/domain/DS.md)"
|
||||||
DomainModifierDhcid = "[`DHCID`](functions/domain/DHCID.md)"
|
DomainModifierDhcid = "[`DHCID`](functions/domain/DHCID.md)"
|
||||||
|
DomainModifierDname = "[`DNAME`](functions/domain/DNAME.md)"
|
||||||
DualHost = "dual host"
|
DualHost = "dual host"
|
||||||
CreateDomains = "create-domains"
|
CreateDomains = "create-domains"
|
||||||
GetZones = "get-zones"
|
GetZones = "get-zones"
|
||||||
@ -113,6 +114,7 @@ func matrixData() *FeatureMatrix {
|
|||||||
DomainModifierTlsa,
|
DomainModifierTlsa,
|
||||||
DomainModifierDs,
|
DomainModifierDs,
|
||||||
DomainModifierDhcid,
|
DomainModifierDhcid,
|
||||||
|
DomainModifierDname,
|
||||||
DualHost,
|
DualHost,
|
||||||
CreateDomains,
|
CreateDomains,
|
||||||
//NoPurge,
|
//NoPurge,
|
||||||
@ -191,6 +193,10 @@ func matrixData() *FeatureMatrix {
|
|||||||
DomainModifierDhcid,
|
DomainModifierDhcid,
|
||||||
providers.CanUseDHCID,
|
providers.CanUseDHCID,
|
||||||
)
|
)
|
||||||
|
setCapability(
|
||||||
|
DomainModifierDname,
|
||||||
|
providers.CanUseDNAME,
|
||||||
|
)
|
||||||
setCapability(
|
setCapability(
|
||||||
DomainModifierDs,
|
DomainModifierDs,
|
||||||
providers.CanUseDS,
|
providers.CanUseDS,
|
||||||
|
15
commands/types/dnscontrol.d.ts
vendored
15
commands/types/dnscontrol.d.ts
vendored
@ -820,6 +820,21 @@ declare const DISABLE_IGNORE_SAFETY_CHECK: DomainModifier;
|
|||||||
*/
|
*/
|
||||||
declare function DMARC_BUILDER(opts: { label?: string; version?: string; policy: 'none' | 'quarantine' | 'reject'; subdomainPolicy?: 'none' | 'quarantine' | 'reject'; alignmentSPF?: 'strict' | 's' | 'relaxed' | 'r'; alignmentDKIM?: 'strict' | 's' | 'relaxed' | 'r'; percent?: number; rua?: string[]; ruf?: string[]; failureOptions?: { SPF: boolean, DKIM: boolean } | string; failureFormat?: string; reportInterval?: Duration; ttl?: Duration }): DomainModifier;
|
declare function DMARC_BUILDER(opts: { label?: string; version?: string; policy: 'none' | 'quarantine' | 'reject'; subdomainPolicy?: 'none' | 'quarantine' | 'reject'; alignmentSPF?: 'strict' | 's' | 'relaxed' | 'r'; alignmentDKIM?: 'strict' | 's' | 'relaxed' | 'r'; percent?: number; rua?: string[]; ruf?: string[]; failureOptions?: { SPF: boolean, DKIM: boolean } | string; failureFormat?: string; reportInterval?: Duration; ttl?: Duration }): DomainModifier;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* DNAME adds a DNAME record to the domain.
|
||||||
|
*
|
||||||
|
* Target should be a string.
|
||||||
|
*
|
||||||
|
* ```javascript
|
||||||
|
* D("example.com", REG_MY_PROVIDER, DnsProvider(DSP_MY_PROVIDER),
|
||||||
|
* DNAME("sub", "example.net.")
|
||||||
|
* );
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* @see https://docs.dnscontrol.org/language-reference/domain-modifiers/dname
|
||||||
|
*/
|
||||||
|
declare function DNAME(name: string, target: string, ...modifiers: RecordModifier[]): DomainModifier;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* `DOMAIN_ELSEWHERE()` is a helper macro that lets you easily indicate that
|
* `DOMAIN_ELSEWHERE()` is a helper macro that lets you easily indicate that
|
||||||
* a domain's zones are managed elsewhere. That is, it permits you easily delegate
|
* a domain's zones are managed elsewhere. That is, it permits you easily delegate
|
||||||
|
@ -37,6 +37,7 @@
|
|||||||
* [CAA_BUILDER](functions/domain/CAA_BUILDER.md)
|
* [CAA_BUILDER](functions/domain/CAA_BUILDER.md)
|
||||||
* [CNAME](functions/domain/CNAME.md)
|
* [CNAME](functions/domain/CNAME.md)
|
||||||
* [DHCID](functions/domain/DHCID.md)
|
* [DHCID](functions/domain/DHCID.md)
|
||||||
|
* [DNAME](functions/domain/DNAME.md)
|
||||||
* [DISABLE_IGNORE_SAFETY_CHECK](functions/domain/DISABLE_IGNORE_SAFETY_CHECK.md)
|
* [DISABLE_IGNORE_SAFETY_CHECK](functions/domain/DISABLE_IGNORE_SAFETY_CHECK.md)
|
||||||
* [DMARC_BUILDER](functions/domain/DMARC_BUILDER.md)
|
* [DMARC_BUILDER](functions/domain/DMARC_BUILDER.md)
|
||||||
* [DS](functions/domain/DS.md)
|
* [DS](functions/domain/DS.md)
|
||||||
|
23
documentation/functions/domain/DNAME.md
Normal file
23
documentation/functions/domain/DNAME.md
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
---
|
||||||
|
name: DNAME
|
||||||
|
parameters:
|
||||||
|
- name
|
||||||
|
- target
|
||||||
|
- modifiers...
|
||||||
|
parameter_types:
|
||||||
|
name: string
|
||||||
|
target: string
|
||||||
|
"modifiers...": RecordModifier[]
|
||||||
|
---
|
||||||
|
|
||||||
|
DNAME adds a DNAME record to the domain.
|
||||||
|
|
||||||
|
Target should be a string.
|
||||||
|
|
||||||
|
{% code title="dnsconfig.js" %}
|
||||||
|
```javascript
|
||||||
|
D("example.com", REG_MY_PROVIDER, DnsProvider(DSP_MY_PROVIDER),
|
||||||
|
DNAME("sub", "example.net.")
|
||||||
|
);
|
||||||
|
```
|
||||||
|
{% endcode %}
|
@ -12,58 +12,58 @@ a provider that supports it, we'd love your contribution to ensure it works corr
|
|||||||
If a feature is definitively not supported for whatever reason, we would also like a PR to clarify why it is not supported, and fill in this entire matrix.
|
If a feature is definitively not supported for whatever reason, we would also like a PR to clarify why it is not supported, and fill in this entire matrix.
|
||||||
|
|
||||||
<!-- provider-matrix-start -->
|
<!-- provider-matrix-start -->
|
||||||
| Provider name | Official Support | DNS Provider | Registrar | Concurrency Verified | [`ALIAS`](functions/domain/ALIAS.md) | [`CAA`](functions/domain/CAA.md) | [`AUTODNSSEC`](functions/domain/AUTODNSSEC_ON.md) | [`LOC`](functions/domain/LOC.md) | [`NAPTR`](functions/domain/NAPTR.md) | [`PTR`](functions/domain/PTR.md) | [`SOA`](functions/domain/SOA.md) | [`SRV`](functions/domain/SRV.md) | [`SSHFP`](functions/domain/SSHFP.md) | [`TLSA`](functions/domain/TLSA.md) | [`DS`](functions/domain/DS.md) | [`DHCID`](functions/domain/DHCID.md) | dual host | create-domains | get-zones |
|
| Provider name | Official Support | DNS Provider | Registrar | Concurrency Verified | [`ALIAS`](functions/domain/ALIAS.md) | [`CAA`](functions/domain/CAA.md) | [`AUTODNSSEC`](functions/domain/AUTODNSSEC_ON.md) | [`LOC`](functions/domain/LOC.md) | [`NAPTR`](functions/domain/NAPTR.md) | [`PTR`](functions/domain/PTR.md) | [`SOA`](functions/domain/SOA.md) | [`SRV`](functions/domain/SRV.md) | [`SSHFP`](functions/domain/SSHFP.md) | [`TLSA`](functions/domain/TLSA.md) | [`DS`](functions/domain/DS.md) | [`DHCID`](functions/domain/DHCID.md) | [`DNAME`](functions/domain/DNAME.md) | dual host | create-domains | get-zones |
|
||||||
| ------------- | ---------------- | ------------ | --------- | -------------------- | ------------------------------------ | -------------------------------- | ------------------------------------------------- | -------------------------------- | ------------------------------------ | -------------------------------- | -------------------------------- | -------------------------------- | ------------------------------------ | ---------------------------------- | ------------------------------ | ------------------------------------ | --------- | -------------- | --------- |
|
| ------------- | ---------------- | ------------ | --------- | -------------------- | ------------------------------------ | -------------------------------- | ------------------------------------------------- | -------------------------------- | ------------------------------------ | -------------------------------- | -------------------------------- | -------------------------------- | ------------------------------------ | ---------------------------------- | ------------------------------ | ------------------------------------ | ------------------------------------ | --------- | -------------- | --------- |
|
||||||
| [`AKAMAIEDGEDNS`](providers/akamaiedgedns.md) | ❌ | ✅ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ❌ | ❔ | ✅ | ✅ | ✅ |
|
| [`AKAMAIEDGEDNS`](providers/akamaiedgedns.md) | ❌ | ✅ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ❌ | ❔ | ❔ | ✅ | ✅ | ✅ |
|
||||||
| [`AUTODNS`](providers/autodns.md) | ❌ | ✅ | ❌ | ❌ | ✅ | ✅ | ❔ | ❔ | ❔ | ❌ | ❔ | ✅ | ❌ | ❌ | ❌ | ❔ | ❌ | ❌ | ✅ |
|
| [`AUTODNS`](providers/autodns.md) | ❌ | ✅ | ❌ | ❌ | ✅ | ✅ | ❔ | ❔ | ❔ | ❌ | ❔ | ✅ | ❌ | ❌ | ❌ | ❔ | ❔ | ❌ | ❌ | ✅ |
|
||||||
| [`AXFRDDNS`](providers/axfrddns.md) | ❌ | ✅ | ❌ | ❌ | ❔ | ✅ | ✅ | ❔ | ✅ | ✅ | ❔ | ✅ | ✅ | ✅ | ❔ | ✅ | ❌ | ❌ | ❌ |
|
| [`AXFRDDNS`](providers/axfrddns.md) | ❌ | ✅ | ❌ | ❌ | ❔ | ✅ | ✅ | ❔ | ✅ | ✅ | ❔ | ✅ | ✅ | ✅ | ❔ | ✅ | ❔ | ❌ | ❌ | ❌ |
|
||||||
| [`AZURE_DNS`](providers/azure_dns.md) | ✅ | ✅ | ❌ | ✅ | ❌ | ✅ | ❔ | ❌ | ❌ | ✅ | ❔ | ✅ | ❌ | ❌ | ❔ | ❔ | ✅ | ✅ | ✅ |
|
| [`AZURE_DNS`](providers/azure_dns.md) | ✅ | ✅ | ❌ | ✅ | ❌ | ✅ | ❔ | ❌ | ❌ | ✅ | ❔ | ✅ | ❌ | ❌ | ❔ | ❔ | ❔ | ✅ | ✅ | ✅ |
|
||||||
| [`AZURE_PRIVATE_DNS`](providers/azure_private_dns.md) | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❔ | ❌ | ❌ | ✅ | ❔ | ✅ | ❌ | ❌ | ❔ | ❔ | ✅ | ✅ | ✅ |
|
| [`AZURE_PRIVATE_DNS`](providers/azure_private_dns.md) | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❔ | ❌ | ❌ | ✅ | ❔ | ✅ | ❌ | ❌ | ❔ | ❔ | ❔ | ✅ | ✅ | ✅ |
|
||||||
| [`BIND`](providers/bind.md) | ✅ | ✅ | ❌ | ❌ | ❔ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
|
| [`BIND`](providers/bind.md) | ✅ | ✅ | ❌ | ❌ | ❔ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
|
||||||
| [`BUNNY_DNS`](providers/bunny_dns.md) | ❌ | ✅ | ❌ | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ |
|
| [`BUNNY_DNS`](providers/bunny_dns.md) | ❌ | ✅ | ❌ | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | ❔ | ❌ | ✅ | ✅ |
|
||||||
| [`CLOUDFLAREAPI`](providers/cloudflareapi.md) | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ❔ | ❌ | ✅ | ✅ | ❔ | ✅ | ✅ | ✅ | ❔ | ❔ | ❌ | ✅ | ✅ |
|
| [`CLOUDFLAREAPI`](providers/cloudflareapi.md) | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ❔ | ❌ | ✅ | ✅ | ❔ | ✅ | ✅ | ✅ | ❔ | ❔ | ❔ | ❌ | ✅ | ✅ |
|
||||||
| [`CLOUDNS`](providers/cloudns.md) | ❌ | ✅ | ❌ | ❌ | ✅ | ✅ | ❔ | ❌ | ❔ | ✅ | ❔ | ✅ | ✅ | ✅ | ❔ | ❔ | ❔ | ✅ | ✅ |
|
| [`CLOUDNS`](providers/cloudns.md) | ❌ | ✅ | ❌ | ❌ | ✅ | ✅ | ❔ | ❌ | ❔ | ✅ | ❔ | ✅ | ✅ | ✅ | ❔ | ❔ | ✅ | ❔ | ✅ | ✅ |
|
||||||
| [`CSCGLOBAL`](providers/cscglobal.md) | ✅ | ✅ | ✅ | ✅ | ❔ | ✅ | ❔ | ❔ | ❔ | ❔ | ❔ | ✅ | ❔ | ❔ | ❔ | ❔ | ❔ | ❌ | ✅ |
|
| [`CSCGLOBAL`](providers/cscglobal.md) | ✅ | ✅ | ✅ | ✅ | ❔ | ✅ | ❔ | ❔ | ❔ | ❔ | ❔ | ✅ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❌ | ✅ |
|
||||||
| [`DESEC`](providers/desec.md) | ❌ | ✅ | ❌ | ❌ | ❔ | ✅ | ✅ | ❔ | ✅ | ✅ | ❔ | ✅ | ✅ | ✅ | ✅ | ❔ | ❔ | ✅ | ✅ |
|
| [`DESEC`](providers/desec.md) | ❌ | ✅ | ❌ | ❌ | ❔ | ✅ | ✅ | ❔ | ✅ | ✅ | ❔ | ✅ | ✅ | ✅ | ✅ | ❔ | ❔ | ❔ | ✅ | ✅ |
|
||||||
| [`DIGITALOCEAN`](providers/digitalocean.md) | ❌ | ✅ | ❌ | ❌ | ❔ | ✅ | ❔ | ❌ | ❔ | ❔ | ❔ | ✅ | ❔ | ❔ | ❔ | ❔ | ❔ | ✅ | ✅ |
|
| [`DIGITALOCEAN`](providers/digitalocean.md) | ❌ | ✅ | ❌ | ❌ | ❔ | ✅ | ❔ | ❌ | ❔ | ❔ | ❔ | ✅ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ✅ | ✅ |
|
||||||
| [`DNSIMPLE`](providers/dnsimple.md) | ❌ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❔ | ✅ | ✅ | ❌ | ❌ | ❔ | ❌ | ❌ | ✅ |
|
| [`DNSIMPLE`](providers/dnsimple.md) | ❌ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❔ | ✅ | ✅ | ❌ | ❌ | ❔ | ❔ | ❌ | ❌ | ✅ |
|
||||||
| [`DNSMADEEASY`](providers/dnsmadeeasy.md) | ❌ | ✅ | ❌ | ❌ | ✅ | ✅ | ❔ | ❌ | ❔ | ✅ | ❔ | ✅ | ❌ | ❌ | ❌ | ❔ | ✅ | ✅ | ✅ |
|
| [`DNSMADEEASY`](providers/dnsmadeeasy.md) | ❌ | ✅ | ❌ | ❌ | ✅ | ✅ | ❔ | ❌ | ❔ | ✅ | ❔ | ✅ | ❌ | ❌ | ❌ | ❔ | ❔ | ✅ | ✅ | ✅ |
|
||||||
| [`DNSOVERHTTPS`](providers/dnsoverhttps.md) | ❌ | ❌ | ✅ | ❌ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❌ | ❔ |
|
| [`DNSOVERHTTPS`](providers/dnsoverhttps.md) | ❌ | ❌ | ✅ | ❌ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❌ | ❔ |
|
||||||
| [`DOMAINNAMESHOP`](providers/domainnameshop.md) | ❌ | ✅ | ❌ | ❌ | ❔ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ |
|
| [`DOMAINNAMESHOP`](providers/domainnameshop.md) | ❌ | ✅ | ❌ | ❌ | ❔ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ |
|
||||||
| [`DYNADOT`](providers/dynadot.md) | ❌ | ❌ | ✅ | ❌ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❌ | ❔ |
|
| [`DYNADOT`](providers/dynadot.md) | ❌ | ❌ | ✅ | ❌ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❌ | ❔ |
|
||||||
| [`EASYNAME`](providers/easyname.md) | ❌ | ❌ | ✅ | ❌ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❌ | ❔ |
|
| [`EASYNAME`](providers/easyname.md) | ❌ | ❌ | ✅ | ❌ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❌ | ❔ |
|
||||||
| [`EXOSCALE`](providers/exoscale.md) | ❌ | ✅ | ❌ | ❌ | ✅ | ✅ | ❔ | ❌ | ❔ | ✅ | ❔ | ✅ | ❔ | ❌ | ❔ | ❔ | ❌ | ❌ | ❔ |
|
| [`EXOSCALE`](providers/exoscale.md) | ❌ | ✅ | ❌ | ❌ | ✅ | ✅ | ❔ | ❌ | ❔ | ✅ | ❔ | ✅ | ❔ | ❌ | ❔ | ❔ | ❔ | ❌ | ❌ | ❔ |
|
||||||
| [`GANDI_V5`](providers/gandi_v5.md) | ❌ | ✅ | ✅ | ❌ | ✅ | ✅ | ❔ | ❌ | ❔ | ✅ | ❔ | ✅ | ✅ | ✅ | ❌ | ❔ | ❔ | ❌ | ✅ |
|
| [`GANDI_V5`](providers/gandi_v5.md) | ❌ | ✅ | ✅ | ❌ | ✅ | ✅ | ❔ | ❌ | ❔ | ✅ | ❔ | ✅ | ✅ | ✅ | ❌ | ❔ | ❔ | ❔ | ❌ | ✅ |
|
||||||
| [`GCLOUD`](providers/gcloud.md) | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ❔ | ❌ | ❔ | ✅ | ❔ | ✅ | ✅ | ✅ | ❔ | ❔ | ✅ | ✅ | ✅ |
|
| [`GCLOUD`](providers/gcloud.md) | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ❔ | ❌ | ❔ | ✅ | ❔ | ✅ | ✅ | ✅ | ❔ | ❔ | ❔ | ✅ | ✅ | ✅ |
|
||||||
| [`GCORE`](providers/gcore.md) | ❌ | ✅ | ❌ | ❌ | ✅ | ✅ | ❌ | ❌ | ❌ | ✅ | ❔ | ✅ | ❌ | ❌ | ❌ | ❔ | ✅ | ✅ | ✅ |
|
| [`GCORE`](providers/gcore.md) | ❌ | ✅ | ❌ | ❌ | ✅ | ✅ | ❌ | ❌ | ❌ | ✅ | ❔ | ✅ | ❌ | ❌ | ❌ | ❔ | ❔ | ✅ | ✅ | ✅ |
|
||||||
| [`HEDNS`](providers/hedns.md) | ❌ | ✅ | ❌ | ❌ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ | ❌ | ❔ | ✅ | ✅ | ✅ |
|
| [`HEDNS`](providers/hedns.md) | ❌ | ✅ | ❌ | ❌ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ | ❌ | ❔ | ❔ | ✅ | ✅ | ✅ |
|
||||||
| [`HETZNER`](providers/hetzner.md) | ❌ | ✅ | ❌ | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ | ✅ | ✅ | ❔ | ✅ | ✅ | ✅ |
|
| [`HETZNER`](providers/hetzner.md) | ❌ | ✅ | ❌ | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ | ✅ | ✅ | ❔ | ❔ | ✅ | ✅ | ✅ |
|
||||||
| [`HEXONET`](providers/hexonet.md) | ❌ | ✅ | ✅ | ❌ | ❌ | ✅ | ❔ | ❔ | ❔ | ✅ | ❔ | ✅ | ❔ | ✅ | ❔ | ❔ | ✅ | ✅ | ❔ |
|
| [`HEXONET`](providers/hexonet.md) | ❌ | ✅ | ✅ | ❌ | ❌ | ✅ | ❔ | ❔ | ❔ | ✅ | ❔ | ✅ | ❔ | ✅ | ❔ | ❔ | ❔ | ✅ | ✅ | ❔ |
|
||||||
| [`HOSTINGDE`](providers/hostingde.md) | ❌ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❔ | ✅ | ✅ | ✅ |
|
| [`HOSTINGDE`](providers/hostingde.md) | ❌ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❔ | ❔ | ✅ | ✅ | ✅ |
|
||||||
| [`INTERNETBS`](providers/internetbs.md) | ❌ | ❌ | ✅ | ❌ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❌ | ❔ |
|
| [`INTERNETBS`](providers/internetbs.md) | ❌ | ❌ | ✅ | ❌ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❌ | ❔ |
|
||||||
| [`INWX`](providers/inwx.md) | ❌ | ✅ | ✅ | ❌ | ❌ | ✅ | ❔ | ❔ | ✅ | ✅ | ❔ | ✅ | ✅ | ✅ | ❔ | ❔ | ✅ | ✅ | ✅ |
|
| [`INWX`](providers/inwx.md) | ❌ | ✅ | ✅ | ❌ | ❌ | ✅ | ❔ | ❔ | ✅ | ✅ | ❔ | ✅ | ✅ | ✅ | ❔ | ❔ | ❔ | ✅ | ✅ | ✅ |
|
||||||
| [`LINODE`](providers/linode.md) | ❌ | ✅ | ❌ | ❌ | ❔ | ✅ | ❔ | ❌ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❌ | ❌ | ✅ |
|
| [`LINODE`](providers/linode.md) | ❌ | ✅ | ❌ | ❌ | ❔ | ✅ | ❔ | ❌ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❌ | ❌ | ✅ |
|
||||||
| [`LOOPIA`](providers/loopia.md) | ❌ | ✅ | ✅ | ❌ | ❌ | ✅ | ❌ | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ | ❌ | ❔ | ✅ | ❌ | ✅ |
|
| [`LOOPIA`](providers/loopia.md) | ❌ | ✅ | ✅ | ❌ | ❌ | ✅ | ❌ | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ | ❌ | ❔ | ❔ | ✅ | ❌ | ✅ |
|
||||||
| [`LUADNS`](providers/luadns.md) | ❌ | ✅ | ❌ | ❌ | ✅ | ✅ | ❔ | ❌ | ❔ | ✅ | ❔ | ✅ | ✅ | ✅ | ❔ | ❔ | ✅ | ✅ | ✅ |
|
| [`LUADNS`](providers/luadns.md) | ❌ | ✅ | ❌ | ❌ | ✅ | ✅ | ❔ | ❌ | ❔ | ✅ | ❔ | ✅ | ✅ | ✅ | ❔ | ❔ | ❔ | ✅ | ✅ | ✅ |
|
||||||
| [`MSDNS`](providers/msdns.md) | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❔ | ❌ | ✅ | ✅ | ❔ | ✅ | ❔ | ❔ | ❔ | ❔ | ❌ | ❌ | ✅ |
|
| [`MSDNS`](providers/msdns.md) | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❔ | ❌ | ✅ | ✅ | ❔ | ✅ | ❔ | ❔ | ❔ | ❔ | ❔ | ❌ | ❌ | ✅ |
|
||||||
| [`MYTHICBEASTS`](providers/mythicbeasts.md) | ❌ | ✅ | ❌ | ❌ | ❌ | ✅ | ❔ | ❌ | ❔ | ✅ | ❔ | ✅ | ✅ | ✅ | ❔ | ❔ | ✅ | ❌ | ✅ |
|
| [`MYTHICBEASTS`](providers/mythicbeasts.md) | ❌ | ✅ | ❌ | ❌ | ❌ | ✅ | ❔ | ❌ | ❔ | ✅ | ❔ | ✅ | ✅ | ✅ | ❔ | ❔ | ❔ | ✅ | ❌ | ✅ |
|
||||||
| [`NAMECHEAP`](providers/namecheap.md) | ❌ | ✅ | ✅ | ❌ | ✅ | ✅ | ❔ | ❌ | ❔ | ❌ | ❔ | ❌ | ❔ | ❌ | ❔ | ❔ | ❌ | ❌ | ✅ |
|
| [`NAMECHEAP`](providers/namecheap.md) | ❌ | ✅ | ✅ | ❌ | ✅ | ✅ | ❔ | ❌ | ❔ | ❌ | ❔ | ❌ | ❔ | ❌ | ❔ | ❔ | ❔ | ❌ | ❌ | ✅ |
|
||||||
| [`NAMEDOTCOM`](providers/namedotcom.md) | ❌ | ✅ | ✅ | ❌ | ✅ | ❔ | ❔ | ❌ | ❔ | ❌ | ❔ | ✅ | ❔ | ❔ | ❔ | ❔ | ✅ | ❌ | ✅ |
|
| [`NAMEDOTCOM`](providers/namedotcom.md) | ❌ | ✅ | ✅ | ❌ | ✅ | ❔ | ❔ | ❌ | ❔ | ❌ | ❔ | ✅ | ❔ | ❔ | ❔ | ❔ | ❔ | ✅ | ❌ | ✅ |
|
||||||
| [`NETCUP`](providers/netcup.md) | ❌ | ✅ | ❌ | ❌ | ❔ | ✅ | ❔ | ❌ | ❔ | ❌ | ❔ | ✅ | ❔ | ❔ | ❔ | ❔ | ❌ | ❌ | ❌ |
|
| [`NETCUP`](providers/netcup.md) | ❌ | ✅ | ❌ | ❌ | ❔ | ✅ | ❔ | ❌ | ❔ | ❌ | ❔ | ✅ | ❔ | ❔ | ❔ | ❔ | ❔ | ❌ | ❌ | ❌ |
|
||||||
| [`NETLIFY`](providers/netlify.md) | ❌ | ✅ | ❌ | ❌ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❔ | ✅ | ❌ | ❌ | ❌ | ❔ | ❌ | ❌ | ✅ |
|
| [`NETLIFY`](providers/netlify.md) | ❌ | ✅ | ❌ | ❌ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❔ | ✅ | ❌ | ❌ | ❌ | ❔ | ❔ | ❌ | ❌ | ✅ |
|
||||||
| [`NS1`](providers/ns1.md) | ❌ | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❔ | ✅ | ❔ | ❔ | ✅ | ❔ | ✅ | ✅ | ✅ |
|
| [`NS1`](providers/ns1.md) | ❌ | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❔ | ✅ | ❔ | ❔ | ✅ | ❔ | ❔ | ✅ | ✅ | ✅ |
|
||||||
| [`OPENSRS`](providers/opensrs.md) | ❌ | ❌ | ✅ | ❌ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❌ | ❔ |
|
| [`OPENSRS`](providers/opensrs.md) | ❌ | ❌ | ✅ | ❌ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❌ | ❔ |
|
||||||
| [`ORACLE`](providers/oracle.md) | ❌ | ✅ | ❌ | ❌ | ✅ | ✅ | ❔ | ❔ | ✅ | ✅ | ❔ | ✅ | ✅ | ✅ | ❌ | ❔ | ✅ | ✅ | ✅ |
|
| [`ORACLE`](providers/oracle.md) | ❌ | ✅ | ❌ | ❌ | ✅ | ✅ | ❔ | ❔ | ✅ | ✅ | ❔ | ✅ | ✅ | ✅ | ❌ | ❔ | ❔ | ✅ | ✅ | ✅ |
|
||||||
| [`OVH`](providers/ovh.md) | ❌ | ✅ | ✅ | ❌ | ❌ | ✅ | ❔ | ❔ | ❔ | ❌ | ❔ | ✅ | ✅ | ✅ | ❔ | ❔ | ✅ | ❌ | ✅ |
|
| [`OVH`](providers/ovh.md) | ❌ | ✅ | ✅ | ❌ | ❌ | ✅ | ❔ | ❔ | ❔ | ❌ | ❔ | ✅ | ✅ | ✅ | ❔ | ❔ | ❔ | ✅ | ❌ | ✅ |
|
||||||
| [`PACKETFRAME`](providers/packetframe.md) | ❌ | ✅ | ❌ | ❌ | ❔ | ❔ | ❔ | ❔ | ❔ | ✅ | ❔ | ✅ | ❔ | ❔ | ❔ | ❔ | ❌ | ❌ | ❔ |
|
| [`PACKETFRAME`](providers/packetframe.md) | ❌ | ✅ | ❌ | ❌ | ❔ | ❔ | ❔ | ❔ | ❔ | ✅ | ❔ | ✅ | ❔ | ❔ | ❔ | ❔ | ❔ | ❌ | ❌ | ❔ |
|
||||||
| [`PORKBUN`](providers/porkbun.md) | ❌ | ✅ | ✅ | ❌ | ✅ | ❔ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ | ✅ | ❌ | ❔ | ❌ | ❌ | ✅ |
|
| [`PORKBUN`](providers/porkbun.md) | ❌ | ✅ | ✅ | ❌ | ✅ | ❔ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ | ✅ | ❌ | ❔ | ❔ | ❌ | ❌ | ✅ |
|
||||||
| [`POWERDNS`](providers/powerdns.md) | ❌ | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ | ❔ | ✅ | ✅ | ❔ | ✅ | ✅ | ✅ | ✅ | ❔ | ✅ | ✅ | ✅ |
|
| [`POWERDNS`](providers/powerdns.md) | ❌ | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ | ❔ | ✅ | ✅ | ❔ | ✅ | ✅ | ✅ | ✅ | ❔ | ❔ | ✅ | ✅ | ✅ |
|
||||||
| [`REALTIMEREGISTER`](providers/realtimeregister.md) | ❌ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ✅ | ✅ |
|
| [`REALTIMEREGISTER`](providers/realtimeregister.md) | ❌ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ | ✅ | ❌ | ❌ | ❔ | ❌ | ✅ | ✅ |
|
||||||
| [`ROUTE53`](providers/route53.md) | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ❔ | ❌ | ❔ | ✅ | ❔ | ✅ | ❔ | ❔ | ❔ | ❔ | ✅ | ✅ | ✅ |
|
| [`ROUTE53`](providers/route53.md) | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ❔ | ❌ | ❔ | ✅ | ❔ | ✅ | ❔ | ❔ | ❔ | ❔ | ❔ | ✅ | ✅ | ✅ |
|
||||||
| [`RWTH`](providers/rwth.md) | ❌ | ✅ | ❌ | ❌ | ❌ | ✅ | ❔ | ❌ | ❌ | ✅ | ❔ | ✅ | ✅ | ❌ | ❔ | ❔ | ❌ | ❌ | ✅ |
|
| [`RWTH`](providers/rwth.md) | ❌ | ✅ | ❌ | ❌ | ❌ | ✅ | ❔ | ❌ | ❌ | ✅ | ❔ | ✅ | ✅ | ❌ | ❔ | ❔ | ❔ | ❌ | ❌ | ✅ |
|
||||||
| [`SOFTLAYER`](providers/softlayer.md) | ❌ | ✅ | ❌ | ❌ | ❔ | ❔ | ❔ | ❌ | ❔ | ❔ | ❔ | ✅ | ❔ | ❔ | ❔ | ❔ | ❔ | ❌ | ❔ |
|
| [`SOFTLAYER`](providers/softlayer.md) | ❌ | ✅ | ❌ | ❌ | ❔ | ❔ | ❔ | ❌ | ❔ | ❔ | ❔ | ✅ | ❔ | ❔ | ❔ | ❔ | ❔ | ❔ | ❌ | ❔ |
|
||||||
| [`TRANSIP`](providers/transip.md) | ❌ | ✅ | ❌ | ❌ | ✅ | ✅ | ❌ | ❌ | ✅ | ❔ | ❔ | ✅ | ✅ | ✅ | ❌ | ❔ | ❔ | ❌ | ✅ |
|
| [`TRANSIP`](providers/transip.md) | ❌ | ✅ | ❌ | ❌ | ✅ | ✅ | ❌ | ❌ | ✅ | ❔ | ❔ | ✅ | ✅ | ✅ | ❌ | ❔ | ❔ | ❔ | ❌ | ✅ |
|
||||||
| [`VULTR`](providers/vultr.md) | ❌ | ✅ | ❌ | ❌ | ❌ | ✅ | ❔ | ❌ | ❔ | ❌ | ❔ | ✅ | ✅ | ❌ | ❔ | ❔ | ❔ | ✅ | ✅ |
|
| [`VULTR`](providers/vultr.md) | ❌ | ✅ | ❌ | ❌ | ❌ | ✅ | ❔ | ❌ | ❔ | ❌ | ❔ | ✅ | ✅ | ❌ | ❔ | ❔ | ❔ | ❔ | ✅ | ✅ |
|
||||||
<!-- provider-matrix-end -->
|
<!-- provider-matrix-end -->
|
||||||
|
|
||||||
### Providers with "official support"
|
### Providers with "official support"
|
||||||
|
@ -512,6 +512,10 @@ func dhcid(name, target string) *models.RecordConfig {
|
|||||||
return makeRec(name, target, "DHCID")
|
return makeRec(name, target, "DHCID")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func dname(name, target string) *models.RecordConfig {
|
||||||
|
return makeRec(name, target, "DNAME")
|
||||||
|
}
|
||||||
|
|
||||||
func ds(name string, keyTag uint16, algorithm, digestType uint8, digest string) *models.RecordConfig {
|
func ds(name string, keyTag uint16, algorithm, digestType uint8, digest string) *models.RecordConfig {
|
||||||
r := makeRec(name, "", "DS")
|
r := makeRec(name, "", "DS")
|
||||||
r.SetTargetDS(keyTag, algorithm, digestType, digest)
|
r.SetTargetDS(keyTag, algorithm, digestType, digest)
|
||||||
@ -1601,6 +1605,13 @@ func makeTests() []*TestGroup {
|
|||||||
tc("Modify DHCID record", dhcid("test", "Test/AuCccgoJbsaxcQc9TUapptP69lOjxfNuVAA2kjEA=")),
|
tc("Modify DHCID record", dhcid("test", "Test/AuCccgoJbsaxcQc9TUapptP69lOjxfNuVAA2kjEA=")),
|
||||||
),
|
),
|
||||||
|
|
||||||
|
testgroup("DNAME",
|
||||||
|
requires(providers.CanUseDNAME),
|
||||||
|
tc("Create DNAME record", dname("test", "example.com.")),
|
||||||
|
tc("Modify DNAME record", dname("test", "example.net.")),
|
||||||
|
tc("Create DNAME record in non-FQDN", dname("a", "b")),
|
||||||
|
),
|
||||||
|
|
||||||
//// Vendor-specific record types
|
//// Vendor-specific record types
|
||||||
|
|
||||||
// Narrative: DNSControl supports DNS records that don't exist!
|
// Narrative: DNSControl supports DNS records that don't exist!
|
||||||
|
@ -48,6 +48,8 @@ func helperRRtoRC(rr dns.RR, origin string, fixBug bool) (RecordConfig, error) {
|
|||||||
err = rc.SetTarget(v.Target)
|
err = rc.SetTarget(v.Target)
|
||||||
case *dns.DHCID:
|
case *dns.DHCID:
|
||||||
err = rc.SetTarget(v.Digest)
|
err = rc.SetTarget(v.Digest)
|
||||||
|
case *dns.DNAME:
|
||||||
|
err = rc.SetTarget(v.Target)
|
||||||
case *dns.DS:
|
case *dns.DS:
|
||||||
err = rc.SetTargetDS(v.KeyTag, v.Algorithm, v.DigestType, v.Digest)
|
err = rc.SetTargetDS(v.KeyTag, v.Algorithm, v.DigestType, v.Digest)
|
||||||
case *dns.LOC:
|
case *dns.LOC:
|
||||||
|
@ -132,7 +132,7 @@ func (dc *DomainConfig) Punycode() error {
|
|||||||
|
|
||||||
// Set the target:
|
// Set the target:
|
||||||
switch rec.Type { // #rtype_variations
|
switch rec.Type { // #rtype_variations
|
||||||
case "ALIAS", "MX", "NS", "CNAME", "PTR", "SRV", "URL", "URL301", "FRAME", "R53_ALIAS", "NS1_URLFWD", "AKAMAICDN", "CLOUDNS_WR":
|
case "ALIAS", "MX", "NS", "CNAME", "DNAME", "PTR", "SRV", "URL", "URL301", "FRAME", "R53_ALIAS", "NS1_URLFWD", "AKAMAICDN", "CLOUDNS_WR":
|
||||||
// These rtypes are hostnames, therefore need to be converted (unlike, for example, an AAAA record)
|
// These rtypes are hostnames, therefore need to be converted (unlike, for example, an AAAA record)
|
||||||
t, err := idna.ToASCII(rec.GetTargetField())
|
t, err := idna.ToASCII(rec.GetTargetField())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -361,6 +361,8 @@ func (rc *RecordConfig) ToRR() dns.RR {
|
|||||||
rr.(*dns.CNAME).Target = rc.GetTargetField()
|
rr.(*dns.CNAME).Target = rc.GetTargetField()
|
||||||
case dns.TypeDHCID:
|
case dns.TypeDHCID:
|
||||||
rr.(*dns.DHCID).Digest = rc.GetTargetField()
|
rr.(*dns.DHCID).Digest = rc.GetTargetField()
|
||||||
|
case dns.TypeDNAME:
|
||||||
|
rr.(*dns.DNAME).Target = rc.GetTargetField()
|
||||||
case dns.TypeDS:
|
case dns.TypeDS:
|
||||||
rr.(*dns.DS).Algorithm = rc.DsAlgorithm
|
rr.(*dns.DS).Algorithm = rc.DsAlgorithm
|
||||||
rr.(*dns.DS).DigestType = rc.DsDigestType
|
rr.(*dns.DS).DigestType = rc.DsDigestType
|
||||||
@ -537,7 +539,7 @@ func Downcase(recs []*RecordConfig) {
|
|||||||
r.Name = strings.ToLower(r.Name)
|
r.Name = strings.ToLower(r.Name)
|
||||||
r.NameFQDN = strings.ToLower(r.NameFQDN)
|
r.NameFQDN = strings.ToLower(r.NameFQDN)
|
||||||
switch r.Type { // #rtype_variations
|
switch r.Type { // #rtype_variations
|
||||||
case "AKAMAICDN", "ALIAS", "AAAA", "ANAME", "CNAME", "DS", "MX", "NS", "NAPTR", "PTR", "SRV", "TLSA":
|
case "AKAMAICDN", "ALIAS", "AAAA", "ANAME", "CNAME", "DNAME", "DS", "MX", "NS", "NAPTR", "PTR", "SRV", "TLSA":
|
||||||
// Target is case insensitive. Downcase it.
|
// Target is case insensitive. Downcase it.
|
||||||
r.target = strings.ToLower(r.target)
|
r.target = strings.ToLower(r.target)
|
||||||
// BUGFIX(tlim): isn't ALIAS in the wrong case statement?
|
// BUGFIX(tlim): isn't ALIAS in the wrong case statement?
|
||||||
@ -562,7 +564,7 @@ func CanonicalizeTargets(recs []*RecordConfig, origin string) {
|
|||||||
|
|
||||||
for _, r := range recs {
|
for _, r := range recs {
|
||||||
switch r.Type { // #rtype_variations
|
switch r.Type { // #rtype_variations
|
||||||
case "ALIAS", "ANAME", "CNAME", "DS", "MX", "NS", "NAPTR", "PTR", "SRV":
|
case "ALIAS", "ANAME", "CNAME", "DNAME", "DS", "MX", "NS", "NAPTR", "PTR", "SRV":
|
||||||
// Target is a hostname that might be a shortname. Turn it into a FQDN.
|
// Target is a hostname that might be a shortname. Turn it into a FQDN.
|
||||||
r.target = dnsutil.AddOrigin(r.target, originFQDN)
|
r.target = dnsutil.AddOrigin(r.target, originFQDN)
|
||||||
case "A", "AKAMAICDN", "CAA", "DHCID", "CF_REDIRECT", "CF_TEMP_REDIRECT", "CF_WORKER_ROUTE", "IMPORT_TRANSFORM", "LOC", "SSHFP", "TLSA", "TXT":
|
case "A", "AKAMAICDN", "CAA", "DHCID", "CF_REDIRECT", "CF_TEMP_REDIRECT", "CF_WORKER_ROUTE", "IMPORT_TRANSFORM", "LOC", "SSHFP", "TLSA", "TXT":
|
||||||
|
@ -80,6 +80,8 @@ func (rc *RecordConfig) PopulateFromStringFunc(rtype, contents, origin string, t
|
|||||||
return rc.SetTargetDSString(contents)
|
return rc.SetTargetDSString(contents)
|
||||||
case "DHCID":
|
case "DHCID":
|
||||||
return rc.SetTarget(contents)
|
return rc.SetTarget(contents)
|
||||||
|
case "DNAME":
|
||||||
|
return rc.SetTarget(contents)
|
||||||
case "LOC":
|
case "LOC":
|
||||||
return rc.SetTargetLOCString(origin, contents)
|
return rc.SetTargetLOCString(origin, contents)
|
||||||
case "MX":
|
case "MX":
|
||||||
@ -164,6 +166,8 @@ func (rc *RecordConfig) PopulateFromString(rtype, contents, origin string) error
|
|||||||
return rc.SetTargetDSString(contents)
|
return rc.SetTargetDSString(contents)
|
||||||
case "DHCID":
|
case "DHCID":
|
||||||
return rc.SetTarget(contents)
|
return rc.SetTarget(contents)
|
||||||
|
case "DNAME":
|
||||||
|
return rc.SetTarget(contents)
|
||||||
case "LOC":
|
case "LOC":
|
||||||
return rc.SetTargetLOCString(origin, contents)
|
return rc.SetTargetLOCString(origin, contents)
|
||||||
case "MX":
|
case "MX":
|
||||||
|
@ -427,6 +427,9 @@ var DS = recordBuilder('DS', {
|
|||||||
// DHCID(name,target, recordModifiers...)
|
// DHCID(name,target, recordModifiers...)
|
||||||
var DHCID = recordBuilder('DHCID');
|
var DHCID = recordBuilder('DHCID');
|
||||||
|
|
||||||
|
// DNAME(name,target, recordModifiers...)
|
||||||
|
var DNAME = recordBuilder('DNAME');
|
||||||
|
|
||||||
// PTR(name,target, recordModifiers...)
|
// PTR(name,target, recordModifiers...)
|
||||||
var PTR = recordBuilder('PTR');
|
var PTR = recordBuilder('PTR');
|
||||||
|
|
||||||
|
3
pkg/js/parse_tests/047-DNAME.js
Normal file
3
pkg/js/parse_tests/047-DNAME.js
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
D("foo.com","none",
|
||||||
|
DNAME("@", "bar.com.")
|
||||||
|
);
|
18
pkg/js/parse_tests/047-DNAME.json
Normal file
18
pkg/js/parse_tests/047-DNAME.json
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
"registrars": [],
|
||||||
|
"dns_providers": [],
|
||||||
|
"domains": [
|
||||||
|
{
|
||||||
|
"name": "foo.com",
|
||||||
|
"registrar": "none",
|
||||||
|
"dnsProviders": {},
|
||||||
|
"records": [
|
||||||
|
{
|
||||||
|
"type": "DNAME",
|
||||||
|
"name": "@",
|
||||||
|
"target": "bar.com."
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -60,6 +60,7 @@ func validateRecordTypes(rec *models.RecordConfig, domain string, pTypes []strin
|
|||||||
"CAA": true,
|
"CAA": true,
|
||||||
"CNAME": true,
|
"CNAME": true,
|
||||||
"DHCID": true,
|
"DHCID": true,
|
||||||
|
"DNAME": true,
|
||||||
"DS": true,
|
"DS": true,
|
||||||
"IMPORT_TRANSFORM": false,
|
"IMPORT_TRANSFORM": false,
|
||||||
"LOC": true,
|
"LOC": true,
|
||||||
@ -194,6 +195,8 @@ func checkTargets(rec *models.RecordConfig, domain string) (errs []error) {
|
|||||||
if labelFQDN == targetFQDN {
|
if labelFQDN == targetFQDN {
|
||||||
check(fmt.Errorf("CNAME loop (target points at itself)"))
|
check(fmt.Errorf("CNAME loop (target points at itself)"))
|
||||||
}
|
}
|
||||||
|
case "DNAME":
|
||||||
|
check(checkTarget(target))
|
||||||
case "LOC":
|
case "LOC":
|
||||||
case "MX":
|
case "MX":
|
||||||
check(checkTarget(target))
|
check(checkTarget(target))
|
||||||
@ -679,6 +682,7 @@ var providerCapabilityChecks = []pairTypeCapability{
|
|||||||
capabilityCheck("AZURE_ALIAS", providers.CanUseAzureAlias),
|
capabilityCheck("AZURE_ALIAS", providers.CanUseAzureAlias),
|
||||||
capabilityCheck("CAA", providers.CanUseCAA),
|
capabilityCheck("CAA", providers.CanUseCAA),
|
||||||
capabilityCheck("DHCID", providers.CanUseDHCID),
|
capabilityCheck("DHCID", providers.CanUseDHCID),
|
||||||
|
capabilityCheck("DNAME", providers.CanUseDNAME),
|
||||||
capabilityCheck("LOC", providers.CanUseLOC),
|
capabilityCheck("LOC", providers.CanUseLOC),
|
||||||
capabilityCheck("NAPTR", providers.CanUseNAPTR),
|
capabilityCheck("NAPTR", providers.CanUseNAPTR),
|
||||||
capabilityCheck("PTR", providers.CanUsePTR),
|
capabilityCheck("PTR", providers.CanUsePTR),
|
||||||
|
@ -338,6 +338,7 @@ func TestWriteZoneFileEach(t *testing.T) {
|
|||||||
d = append(d, mustNewRR(`sub.bosun.org. 300 IN NS bosun.org.`)) // Must be a label with no other records.
|
d = append(d, mustNewRR(`sub.bosun.org. 300 IN NS bosun.org.`)) // Must be a label with no other records.
|
||||||
d = append(d, mustNewRR(`x.bosun.org. 300 IN CNAME bosun.org.`)) // Must be a label with no other records.
|
d = append(d, mustNewRR(`x.bosun.org. 300 IN CNAME bosun.org.`)) // Must be a label with no other records.
|
||||||
d = append(d, mustNewRR(`bosun.org. 300 IN DHCID AAIBY2/AuCccgoJbsaxcQc9TUapptP69lOjxfNuVAA2kjEA=`))
|
d = append(d, mustNewRR(`bosun.org. 300 IN DHCID AAIBY2/AuCccgoJbsaxcQc9TUapptP69lOjxfNuVAA2kjEA=`))
|
||||||
|
d = append(d, mustNewRR(`dname.bosun.org. 300 IN DNAME example.com.`))
|
||||||
buf := &bytes.Buffer{}
|
buf := &bytes.Buffer{}
|
||||||
writeZoneFileRR(buf, d, "bosun.org")
|
writeZoneFileRR(buf, d, "bosun.org")
|
||||||
if buf.String() != testdataZFEach {
|
if buf.String() != testdataZFEach {
|
||||||
@ -360,6 +361,7 @@ var testdataZFEach = `$TTL 300
|
|||||||
_443._tcp IN TLSA 3 1 1 abcdef0
|
_443._tcp IN TLSA 3 1 1 abcdef0
|
||||||
sub IN NS bosun.org.
|
sub IN NS bosun.org.
|
||||||
x IN CNAME bosun.org.
|
x IN CNAME bosun.org.
|
||||||
|
dname IN DNAME example.com.
|
||||||
`
|
`
|
||||||
|
|
||||||
func TestWriteZoneFileSynth(t *testing.T) {
|
func TestWriteZoneFileSynth(t *testing.T) {
|
||||||
|
@ -37,6 +37,7 @@ var features = providers.DocumentationNotes{
|
|||||||
providers.CanConcur: providers.Cannot(),
|
providers.CanConcur: providers.Cannot(),
|
||||||
providers.CanUseCAA: providers.Can(),
|
providers.CanUseCAA: providers.Can(),
|
||||||
providers.CanUseDHCID: providers.Can(),
|
providers.CanUseDHCID: providers.Can(),
|
||||||
|
providers.CanUseDNAME: providers.Can(),
|
||||||
providers.CanUseDS: providers.Can(),
|
providers.CanUseDS: providers.Can(),
|
||||||
providers.CanUseLOC: providers.Can(),
|
providers.CanUseLOC: providers.Can(),
|
||||||
providers.CanUseNAPTR: providers.Can(),
|
providers.CanUseNAPTR: providers.Can(),
|
||||||
|
@ -43,6 +43,9 @@ const (
|
|||||||
// CanUseDHCID indicates the provider can handle DHCID records
|
// CanUseDHCID indicates the provider can handle DHCID records
|
||||||
CanUseDHCID
|
CanUseDHCID
|
||||||
|
|
||||||
|
// CanUseDNAME indicates the provider can handle DNAME records
|
||||||
|
CanUseDNAME
|
||||||
|
|
||||||
// CanUseDS indicates that the provider can handle DS record types. This
|
// CanUseDS indicates that the provider can handle DS record types. This
|
||||||
// implies CanUseDSForChildren without specifying the latter explicitly.
|
// implies CanUseDSForChildren without specifying the latter explicitly.
|
||||||
CanUseDS
|
CanUseDS
|
||||||
|
@ -16,24 +16,25 @@ func _() {
|
|||||||
_ = x[CanUseAzureAlias-5]
|
_ = x[CanUseAzureAlias-5]
|
||||||
_ = x[CanUseCAA-6]
|
_ = x[CanUseCAA-6]
|
||||||
_ = x[CanUseDHCID-7]
|
_ = x[CanUseDHCID-7]
|
||||||
_ = x[CanUseDS-8]
|
_ = x[CanUseDNAME-8]
|
||||||
_ = x[CanUseDSForChildren-9]
|
_ = x[CanUseDS-9]
|
||||||
_ = x[CanUseLOC-10]
|
_ = x[CanUseDSForChildren-10]
|
||||||
_ = x[CanUseNAPTR-11]
|
_ = x[CanUseLOC-11]
|
||||||
_ = x[CanUsePTR-12]
|
_ = x[CanUseNAPTR-12]
|
||||||
_ = x[CanUseRoute53Alias-13]
|
_ = x[CanUsePTR-13]
|
||||||
_ = x[CanUseSOA-14]
|
_ = x[CanUseRoute53Alias-14]
|
||||||
_ = x[CanUseSRV-15]
|
_ = x[CanUseSOA-15]
|
||||||
_ = x[CanUseSSHFP-16]
|
_ = x[CanUseSRV-16]
|
||||||
_ = x[CanUseTLSA-17]
|
_ = x[CanUseSSHFP-17]
|
||||||
_ = x[DocCreateDomains-18]
|
_ = x[CanUseTLSA-18]
|
||||||
_ = x[DocDualHost-19]
|
_ = x[DocCreateDomains-19]
|
||||||
_ = x[DocOfficiallySupported-20]
|
_ = x[DocDualHost-20]
|
||||||
|
_ = x[DocOfficiallySupported-21]
|
||||||
}
|
}
|
||||||
|
|
||||||
const _Capability_name = "CanAutoDNSSECCanConcurCanGetZonesCanUseAKAMAICDNCanUseAliasCanUseAzureAliasCanUseCAACanUseDHCIDCanUseDSCanUseDSForChildrenCanUseLOCCanUseNAPTRCanUsePTRCanUseRoute53AliasCanUseSOACanUseSRVCanUseSSHFPCanUseTLSADocCreateDomainsDocDualHostDocOfficiallySupported"
|
const _Capability_name = "CanAutoDNSSECCanConcurCanGetZonesCanUseAKAMAICDNCanUseAliasCanUseAzureAliasCanUseCAACanUseDHCIDCanUseDNAMECanUseDSCanUseDSForChildrenCanUseLOCCanUseNAPTRCanUsePTRCanUseRoute53AliasCanUseSOACanUseSRVCanUseSSHFPCanUseTLSADocCreateDomainsDocDualHostDocOfficiallySupported"
|
||||||
|
|
||||||
var _Capability_index = [...]uint16{0, 13, 22, 33, 48, 59, 75, 84, 95, 103, 122, 131, 142, 151, 169, 178, 187, 198, 208, 224, 235, 257}
|
var _Capability_index = [...]uint16{0, 13, 22, 33, 48, 59, 75, 84, 95, 106, 114, 133, 142, 153, 162, 180, 189, 198, 209, 219, 235, 246, 268}
|
||||||
|
|
||||||
func (i Capability) String() string {
|
func (i Capability) String() string {
|
||||||
if i >= Capability(len(_Capability_index)-1) {
|
if i >= Capability(len(_Capability_index)-1) {
|
||||||
|
@ -44,6 +44,7 @@ var features = providers.DocumentationNotes{
|
|||||||
providers.CanConcur: providers.Cannot(),
|
providers.CanConcur: providers.Cannot(),
|
||||||
providers.CanUseAlias: providers.Can(),
|
providers.CanUseAlias: providers.Can(),
|
||||||
providers.CanUseCAA: providers.Can(),
|
providers.CanUseCAA: providers.Can(),
|
||||||
|
providers.CanUseDNAME: providers.Can(),
|
||||||
providers.CanUseDSForChildren: providers.Can(),
|
providers.CanUseDSForChildren: providers.Can(),
|
||||||
providers.CanUseLOC: providers.Cannot(),
|
providers.CanUseLOC: providers.Cannot(),
|
||||||
providers.CanUsePTR: providers.Can(),
|
providers.CanUsePTR: providers.Can(),
|
||||||
@ -268,7 +269,7 @@ func toRc(domain string, r *domainRecord) *models.RecordConfig {
|
|||||||
switch rtype := r.Type; rtype { // #rtype_variations
|
switch rtype := r.Type; rtype { // #rtype_variations
|
||||||
case "TXT":
|
case "TXT":
|
||||||
rc.SetTargetTXT(r.Target)
|
rc.SetTargetTXT(r.Target)
|
||||||
case "CNAME", "MX", "NS", "SRV", "ALIAS", "PTR":
|
case "CNAME", "DNAME", "MX", "NS", "SRV", "ALIAS", "PTR":
|
||||||
rc.SetTarget(dnsutil.AddOrigin(r.Target+".", domain))
|
rc.SetTarget(dnsutil.AddOrigin(r.Target+".", domain))
|
||||||
case "CAA":
|
case "CAA":
|
||||||
caaFlag, _ := strconv.ParseUint(r.CaaFlag, 10, 8)
|
caaFlag, _ := strconv.ParseUint(r.CaaFlag, 10, 8)
|
||||||
@ -323,7 +324,7 @@ func toReq(rc *models.RecordConfig) (requestParams, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch rc.Type { // #rtype_variations
|
switch rc.Type { // #rtype_variations
|
||||||
case "A", "AAAA", "NS", "PTR", "TXT", "SOA", "ALIAS", "CNAME", "WR":
|
case "A", "AAAA", "NS", "PTR", "TXT", "SOA", "ALIAS", "CNAME", "WR", "DNAME":
|
||||||
// Nothing special.
|
// Nothing special.
|
||||||
case "CLOUDNS_WR":
|
case "CLOUDNS_WR":
|
||||||
req["record-type"] = "WR"
|
req["record-type"] = "WR"
|
||||||
|
Reference in New Issue
Block a user