diff --git a/pkg/normalize/validate.go b/pkg/normalize/validate.go index 0af9ffcdf..48b3ac93f 100644 --- a/pkg/normalize/validate.go +++ b/pkg/normalize/validate.go @@ -312,9 +312,9 @@ func NormalizeAndValidateConfig(config *models.DNSConfig) (errs []error) { errs = append(errs, checkCNAMEs(d)...) } - //Check that if any aliases are used in a domain, every provider for that domain supports them + //Check that if any aliases / ptr / etc.. are used in a domain, every provider for that domain supports them for _, d := range config.Domains { - err := checkALIASes(d, config.DNSProviders) + err := checkProviderCapabilities(d, config.DNSProviders) if err != nil { errs = append(errs, err) } @@ -341,26 +341,35 @@ 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 - } +func checkProviderCapabilities(dc *models.DomainConfig, pList []*models.DNSProviderConfig) error { + types := []struct { + rType string + cap providers.Capability + }{ + {"ALIAS", providers.CanUseAlias}, + {"PTR", providers.CanUsePTR}, } - 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) - } + for _, ty := range types { + hasAny := false + for _, r := range dc.Records { + if r.Type == ty.rType { + hasAny = true break } } + if !hasAny { + continue + } + for pName := range dc.DNSProviders { + for _, p := range pList { + if p.Name == pName { + if !providers.ProviderHasCabability(p.Type, ty.cap) { + return fmt.Errorf("Domain %s uses %s records, but DNS provider type %s does not support them", dc.Name, ty.rType, p.Type) + } + break + } + } + } } return nil } diff --git a/providers/bind/bindProvider.go b/providers/bind/bindProvider.go index 2a47792a9..0086778bb 100644 --- a/providers/bind/bindProvider.go +++ b/providers/bind/bindProvider.go @@ -31,6 +31,25 @@ import ( "github.com/StackExchange/dnscontrol/providers/diff" ) +func initBind(config map[string]string, providermeta json.RawMessage) (providers.DNSServiceProvider, error) { + // config -- the key/values from creds.json + // meta -- the json blob from NewReq('name', 'TYPE', meta) + + api := &Bind{} + if len(providermeta) != 0 { + err := json.Unmarshal(providermeta, api) + if err != nil { + return nil, err + } + } + api.nameservers = models.StringsToNameservers(api.DefaultNS) + return api, nil +} + +func init() { + providers.RegisterDomainServiceProviderType("BIND", initBind, providers.CanUsePTR) +} + type SoaInfo struct { Ns string `json:"master"` Mbox string `json:"mbox"` @@ -256,22 +275,3 @@ func (c *Bind) GetDomainCorrections(dc *models.DomainConfig) ([]*models.Correcti return corrections, nil } - -func initBind(config map[string]string, providermeta json.RawMessage) (providers.DNSServiceProvider, error) { - // config -- the key/values from creds.json - // meta -- the json blob from NewReq('name', 'TYPE', meta) - - api := &Bind{} - if len(providermeta) != 0 { - err := json.Unmarshal(providermeta, api) - if err != nil { - return nil, err - } - } - api.nameservers = models.StringsToNameservers(api.DefaultNS) - return api, nil -} - -func init() { - providers.RegisterDomainServiceProviderType("BIND", initBind) -}