mirror of
https://github.com/StackExchange/dnscontrol.git
synced 2025-01-11 09:59:59 +08:00
2f83aa9302
* Switched to v2 go.mod Also set GO111MODULE=on in build stuff to always use Go modules even when in GOPATH. * Ensure go.mod, go.sum, and vendor are up to date * Attempt to fix Azure pipelines * Add set -e to properly fail on exit (it didn't seem to be propagating properly before). * Set workingDirectory for GoFmt and GoGen (this might be why it fails unlike compile and unitests). * Another attempt to fix Azure Pipelines * Use the Go env template for all go-related jobs. * Completely fixed Azure Pipelines * Added a display name to GoFmt for consistency. * Fixed diffs for GoFmt and GoGen. * Show git status for checks. * Drop GOPATH for tests TODO: Do the same for integration tests. * Drop GOPATH for integration tests * Show more diffs * Regenerate provider support matrix This wasn't done in #590...
94 lines
2.8 KiB
Go
94 lines
2.8 KiB
Go
package models
|
|
|
|
import (
|
|
"encoding/json"
|
|
"strings"
|
|
)
|
|
|
|
// DefaultTTL is applied to any DNS record without an explicit TTL.
|
|
const DefaultTTL = uint32(300)
|
|
|
|
// DNSConfig describes the desired DNS configuration, usually loaded from dnsconfig.js.
|
|
type DNSConfig struct {
|
|
Registrars []*RegistrarConfig `json:"registrars"`
|
|
DNSProviders []*DNSProviderConfig `json:"dns_providers"`
|
|
Domains []*DomainConfig `json:"domains"`
|
|
RegistrarsByName map[string]*RegistrarConfig `json:"-"`
|
|
DNSProvidersByName map[string]*DNSProviderConfig `json:"-"`
|
|
}
|
|
|
|
// FindDomain returns the *DomainConfig for domain query in config.
|
|
func (config *DNSConfig) FindDomain(query string) *DomainConfig {
|
|
for _, b := range config.Domains {
|
|
if b.Name == query {
|
|
return b
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// RegistrarConfig describes a registrar.
|
|
type RegistrarConfig struct {
|
|
Name string `json:"name"`
|
|
Type string `json:"type"`
|
|
Metadata json.RawMessage `json:"meta,omitempty"`
|
|
}
|
|
|
|
// DNSProviderConfig describes a DNS service provider.
|
|
type DNSProviderConfig struct {
|
|
Name string `json:"name"`
|
|
Type string `json:"type"`
|
|
Metadata json.RawMessage `json:"meta,omitempty"`
|
|
}
|
|
|
|
// FIXME(tal): In hindsight, the Nameserver struct is overkill. We
|
|
// could have just used []string. Now every provider calls StringsToNameservers
|
|
// and ever user calls StringsToNameservers. We should refactor this
|
|
// some day. https://github.com/StackExchange/dnscontrol/v2/issues/577
|
|
|
|
// Nameserver describes a nameserver.
|
|
type Nameserver struct {
|
|
Name string `json:"name"` // Normalized to a FQDN with NO trailing "."
|
|
}
|
|
|
|
func (n *Nameserver) String() string {
|
|
return n.Name
|
|
}
|
|
|
|
// StringsToNameservers constructs a list of *Nameserver structs using a list of FQDNs.
|
|
func StringsToNameservers(nss []string) []*Nameserver {
|
|
nservers := []*Nameserver{}
|
|
for _, ns := range nss {
|
|
nservers = append(nservers, &Nameserver{Name: ns})
|
|
}
|
|
return nservers
|
|
}
|
|
|
|
// NameserversToStrings constructs a list of lists from *Nameserver structs
|
|
func NameserversToStrings(nss []*Nameserver) (s []string) {
|
|
for _, ns := range nss {
|
|
s = append(s, ns.Name)
|
|
}
|
|
return s
|
|
}
|
|
|
|
// Correction is anything that can be run. Implementation is up to the specific provider.
|
|
type Correction struct {
|
|
F func() error `json:"-"`
|
|
Msg string
|
|
}
|
|
|
|
// DomainContainingFQDN finds the best domain from the dns config for the given record fqdn.
|
|
// It will chose the domain whose name is the longest suffix match for the fqdn.
|
|
func (config *DNSConfig) DomainContainingFQDN(fqdn string) *DomainConfig {
|
|
fqdn = strings.TrimSuffix(fqdn, ".")
|
|
longestLength := 0
|
|
var d *DomainConfig
|
|
for _, dom := range config.Domains {
|
|
if (dom.Name == fqdn || strings.HasSuffix(fqdn, "."+dom.Name)) && len(dom.Name) > longestLength {
|
|
longestLength = len(dom.Name)
|
|
d = dom
|
|
}
|
|
}
|
|
return d
|
|
}
|