1
0
mirror of https://github.com/StackExchange/dnscontrol.git synced 2024-05-11 05:55:12 +00:00

generalize capability validation

This commit is contained in:
Craig Peterson
2017-07-06 10:24:21 -04:00
parent aa92817116
commit 152892f62a
2 changed files with 46 additions and 37 deletions

View File

@ -312,9 +312,9 @@ func NormalizeAndValidateConfig(config *models.DNSConfig) (errs []error) {
errs = append(errs, checkCNAMEs(d)...) 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 { for _, d := range config.Domains {
err := checkALIASes(d, config.DNSProviders) err := checkProviderCapabilities(d, config.DNSProviders)
if err != nil { if err != nil {
errs = append(errs, err) errs = append(errs, err)
} }
@ -341,26 +341,35 @@ func checkCNAMEs(dc *models.DomainConfig) (errs []error) {
return return
} }
func checkALIASes(dc *models.DomainConfig, pList []*models.DNSProviderConfig) error { func checkProviderCapabilities(dc *models.DomainConfig, pList []*models.DNSProviderConfig) error {
hasAlias := false types := []struct {
for _, r := range dc.Records { rType string
if r.Type == "ALIAS" { cap providers.Capability
hasAlias = true }{
break {"ALIAS", providers.CanUseAlias},
} {"PTR", providers.CanUsePTR},
} }
if !hasAlias { for _, ty := range types {
return nil hasAny := false
} for _, r := range dc.Records {
for pName := range dc.DNSProviders { if r.Type == ty.rType {
for _, p := range pList { hasAny = true
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 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 return nil
} }

View File

@ -31,6 +31,25 @@ import (
"github.com/StackExchange/dnscontrol/providers/diff" "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 { type SoaInfo struct {
Ns string `json:"master"` Ns string `json:"master"`
Mbox string `json:"mbox"` Mbox string `json:"mbox"`
@ -256,22 +275,3 @@ func (c *Bind) GetDomainCorrections(dc *models.DomainConfig) ([]*models.Correcti
return corrections, nil 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)
}