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)...)
}
//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
}

View File

@ -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)
}