mirror of
https://github.com/StackExchange/dnscontrol.git
synced 2024-05-11 05:55:12 +00:00
Support ALIAS records with Cloudflare (#89)
* simple facility for registering provider capabilities * support for cloudflare. tests. * js and docs * docs * generate
This commit is contained in:
@ -6,6 +6,7 @@ import (
|
||||
"strings"
|
||||
|
||||
"github.com/StackExchange/dnscontrol/models"
|
||||
"github.com/StackExchange/dnscontrol/providers"
|
||||
"github.com/StackExchange/dnscontrol/transform"
|
||||
"github.com/miekg/dns"
|
||||
"github.com/miekg/dns/dnsutil"
|
||||
@ -52,6 +53,7 @@ func validateRecordTypes(rec *models.RecordConfig, domain string) error {
|
||||
"MX": true,
|
||||
"TXT": true,
|
||||
"NS": true,
|
||||
"ALIAS": false,
|
||||
}
|
||||
|
||||
if _, ok := validTypes[rec.Type]; !ok {
|
||||
@ -112,6 +114,9 @@ func checkTargets(rec *models.RecordConfig, domain string) (errs []error) {
|
||||
check(checkIPv6(target))
|
||||
case "CNAME":
|
||||
check(checkTarget(target))
|
||||
if label == "@" {
|
||||
check(fmt.Errorf("cannot create CNAME record for bare domain"))
|
||||
}
|
||||
case "MX":
|
||||
check(checkTarget(target))
|
||||
case "NS":
|
||||
@ -119,6 +124,8 @@ func checkTargets(rec *models.RecordConfig, domain string) (errs []error) {
|
||||
if label == "@" {
|
||||
check(fmt.Errorf("cannot create NS record for bare domain. Use NAMESERVER instead"))
|
||||
}
|
||||
case "ALIAS":
|
||||
check(checkTarget(target))
|
||||
case "TXT", "IMPORT_TRANSFORM":
|
||||
default:
|
||||
errs = append(errs, fmt.Errorf("Unimplemented record type (%v) domain=%v name=%v",
|
||||
@ -260,9 +267,20 @@ func NormalizeAndValidateConfig(config *models.DNSConfig) (errs []error) {
|
||||
errs = append(errs, err)
|
||||
}
|
||||
}
|
||||
|
||||
//Check that CNAMES don't have to co-exist with any other records
|
||||
for _, d := range config.Domains {
|
||||
errs = append(errs, checkCNAMEs(d)...)
|
||||
}
|
||||
|
||||
//Check that if any aliases are used in a domain, every provider for that domain supports them
|
||||
for _, d := range config.Domains {
|
||||
err := checkALIASes(d, config.DNSProviders)
|
||||
if err != nil {
|
||||
errs = append(errs, nil)
|
||||
}
|
||||
}
|
||||
|
||||
return errs
|
||||
}
|
||||
|
||||
@ -284,6 +302,30 @@ func checkCNAMEs(dc *models.DomainConfig) (errs []error) {
|
||||
return
|
||||
}
|
||||
|
||||
func checkALIASes(dc *models.DomainConfig, pList []*models.DNSProviderConfig) error {
|
||||
hasAlias := false
|
||||
for _, r := range dc.Records {
|
||||
if r.Type == "ALIAS" {
|
||||
hasAlias = true
|
||||
break
|
||||
}
|
||||
}
|
||||
if !hasAlias {
|
||||
return nil
|
||||
}
|
||||
for pName := range dc.DNSProviders {
|
||||
for _, p := range pList {
|
||||
if p.Name == pName {
|
||||
if !providers.ProviderHasCabability(p.Type, providers.CanUseAlias) {
|
||||
return fmt.Errorf("Domain %s uses ALIAS records, but DNS provider type %s does not support them", dc.Name, p.Type)
|
||||
}
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func applyRecordTransforms(domain *models.DomainConfig) error {
|
||||
for _, rec := range domain.Records {
|
||||
if rec.Type != "A" {
|
||||
|
Reference in New Issue
Block a user