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:
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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)
|
|
||||||
}
|
|
||||||
|
Reference in New Issue
Block a user