Documentation ¶
Index ¶
- Constants
- func CanonicalizeTargets(recs []*RecordConfig, origin string)
- func Downcase(recs []*RecordConfig)
- func MakeUnknown(rc *RecordConfig, rtype string, contents string, origin string) error
- func NameserversToStrings(nss []*Nameserver) (s []string)
- func ParseQuotedFields(s string) ([]string, error)
- func ParseQuotedTxt(s string) []string
- func PostProcessRecords(recs []*RecordConfig)
- func StripQuotes(s string) string
- func WarnNameserverDot(p, w string)
- type Correction
- type DNSConfig
- type DNSProvider
- type DNSProviderConfig
- type DNSProviderInstance
- type DomainConfig
- func (dc *DomainConfig) Copy() (*DomainConfig, error)
- func (dc *DomainConfig) Filter(f func(r *RecordConfig) bool)
- func (dc *DomainConfig) GetCorrections(providerName string) []*Correction
- func (dc *DomainConfig) GetSplitHorizonNames() (name, uniquename, tag string)
- func (dc *DomainConfig) GetUniqueName() (uniquename string)
- func (dc *DomainConfig) Punycode() error
- func (dc *DomainConfig) StoreCorrections(providerName string, corrections []*Correction)
- func (dc *DomainConfig) UpdateSplitHorizonNames()
- type Nameserver
- type ProviderBase
- type RecordConfig
- func (rc *RecordConfig) Copy() (*RecordConfig, error)
- func (rc *RecordConfig) GetDependencies() []string
- func (rc *RecordConfig) GetLabel() string
- func (rc *RecordConfig) GetLabelFQDN() string
- func (rc *RecordConfig) GetSVCBValue() []dns.SVCBKeyValue
- func (rc *RecordConfig) GetTargetCombined() string
- func (rc *RecordConfig) GetTargetCombinedFunc(encodeFn func(s string) string) string
- func (rc *RecordConfig) GetTargetDebug() string
- func (rc *RecordConfig) GetTargetField() string
- func (rc *RecordConfig) GetTargetIP() net.IP
- func (rc *RecordConfig) GetTargetRFC1035Quoted() string
- func (rc *RecordConfig) GetTargetTXTJoined() string
- func (rc *RecordConfig) GetTargetTXTSegmentCount() int
- func (rc *RecordConfig) GetTargetTXTSegmented() []string
- func (rc *RecordConfig) HasFormatIdenticalToTXT() bool
- func (rc *RecordConfig) Key() RecordKey
- func (rc *RecordConfig) MarshalJSON() ([]byte, error)
- func (rc *RecordConfig) PopulateFromString(rtype, contents, origin string) error
- func (rc *RecordConfig) PopulateFromStringFunc(rtype, contents, origin string, txtFn func(s string) (string, error)) error
- func (rc *RecordConfig) SetLOCParams(d1 uint8, m1 uint8, s1 float32, ns string, d2 uint8, m2 uint8, s2 float32, ...) error
- func (rc *RecordConfig) SetLabel(short, origin string)
- func (rc *RecordConfig) SetLabelFromFQDN(fqdn, origin string)
- func (rc *RecordConfig) SetTarget(target string) error
- func (rc *RecordConfig) SetTargetCAA(flag uint8, tag string, target string) error
- func (rc *RecordConfig) SetTargetCAAString(s string) error
- func (rc *RecordConfig) SetTargetCAAStrings(flag, tag, target string) error
- func (rc *RecordConfig) SetTargetDNSKEY(flags uint16, protocol, algorithm uint8, publicKey string) error
- func (rc *RecordConfig) SetTargetDNSKEYString(s string) error
- func (rc *RecordConfig) SetTargetDNSKEYStrings(flags, protocol, algorithm, publicKey string) error
- func (rc *RecordConfig) SetTargetDS(keytag uint16, algorithm, digesttype uint8, digest string) error
- func (rc *RecordConfig) SetTargetDSString(s string) error
- func (rc *RecordConfig) SetTargetDSStrings(keytag, algorithm, digesttype, digest string) error
- func (rc *RecordConfig) SetTargetIP(ip net.IP) error
- func (rc *RecordConfig) SetTargetLOC(ver uint8, lat uint32, lon uint32, alt uint32, siz uint8, hzp uint8, vtp uint8) error
- func (rc *RecordConfig) SetTargetLOCString(origin string, contents string) error
- func (rc *RecordConfig) SetTargetMX(pref uint16, target string) error
- func (rc *RecordConfig) SetTargetMXString(s string) error
- func (rc *RecordConfig) SetTargetMXStrings(pref, target string) error
- func (rc *RecordConfig) SetTargetNAPTR(order uint16, preference uint16, flags string, service string, regexp string, ...) error
- func (rc *RecordConfig) SetTargetNAPTRString(s string) error
- func (rc *RecordConfig) SetTargetNAPTRStrings(order, preference, flags string, service string, regexp string, target string) error
- func (rc *RecordConfig) SetTargetSOA(ns, mbox string, serial, refresh, retry, expire, minttl uint32) error
- func (rc *RecordConfig) SetTargetSOAString(s string) error
- func (rc *RecordConfig) SetTargetSOAStrings(ns, mbox, serial, refresh, retry, expire, minttl string) error
- func (rc *RecordConfig) SetTargetSRV(priority, weight, port uint16, target string) error
- func (rc *RecordConfig) SetTargetSRVPriorityString(priority uint16, s string) error
- func (rc *RecordConfig) SetTargetSRVString(s string) error
- func (rc *RecordConfig) SetTargetSRVStrings(priority, weight, port, target string) (err error)
- func (rc *RecordConfig) SetTargetSSHFP(algorithm uint8, fingerprint uint8, target string) error
- func (rc *RecordConfig) SetTargetSSHFPString(s string) error
- func (rc *RecordConfig) SetTargetSSHFPStrings(algorithm, fingerprint, target string) error
- func (rc *RecordConfig) SetTargetSVCB(priority uint16, target string, params []dns.SVCBKeyValue) error
- func (rc *RecordConfig) SetTargetSVCBString(origin, contents string) error
- func (rc *RecordConfig) SetTargetTLSA(usage, selector, matchingtype uint8, target string) error
- func (rc *RecordConfig) SetTargetTLSAString(s string) error
- func (rc *RecordConfig) SetTargetTLSAStrings(usage, selector, matchingtype, target string) (err error)
- func (rc *RecordConfig) SetTargetTXT(s string) error
- func (rc *RecordConfig) SetTargetTXTs(s []string) error
- func (rc *RecordConfig) String() string
- func (rc *RecordConfig) ToComparableNoTTL() string
- func (rc *RecordConfig) ToRR() dns.RR
- func (rc *RecordConfig) UnmarshalJSON(b []byte) error
- type RecordDB
- type RecordKey
- type Records
- type Registrar
- type RegistrarConfig
- type RegistrarInstance
- type UnmanagedConfig
Constants ¶
const ( // DomainUniqueName is the full `example.com!tag` name` DomainUniqueName = "dnscontrol_uniquename" // DomainTag is the tag part of `example.com!tag` name DomainTag = "dnscontrol_tag" )
const DefaultTTL = uint32(300)
DefaultTTL is applied to any DNS record without an explicit TTL.
Variables ¶
This section is empty.
Functions ¶
func CanonicalizeTargets ¶ added in v4.1.1
func CanonicalizeTargets(recs []*RecordConfig, origin string)
CanonicalizeTargets turns Targets into FQDNs
func Downcase ¶
func Downcase(recs []*RecordConfig)
Downcase converts all labels and targets to lowercase in a list of RecordConfig.
func MakeUnknown ¶ added in v4.8.1
func MakeUnknown(rc *RecordConfig, rtype string, contents string, origin string) error
func NameserversToStrings ¶
func NameserversToStrings(nss []*Nameserver) (s []string)
NameserversToStrings constructs a list of strings from *Nameserver structs
func ParseQuotedFields ¶
ParseQuotedFields is like strings.Fields except individual fields might be quoted using `"`.
func ParseQuotedTxt ¶
ParseQuotedTxt returns the individual strings of a combined quoted string.
`foo` -> []string{"foo"} `"foo"` -> []string{"foo"} `"foo" "bar"` -> []string{"foo", "bar"} `"f"oo" "bar"` -> []string{`f"oo`, "bar"}
NOTE: It is assumed there is exactly one space between the quotes. NOTE: This doesn't handle escaped quotes. NOTE: You probably want to use ParseQuotedFields() for RFC 1035-compliant quoting.
func PostProcessRecords ¶
func PostProcessRecords(recs []*RecordConfig)
PostProcessRecords does any post-processing of the downloaded DNS records. Deprecated. zonerecords.CorrectZoneRecords() calls Downcase directly.
func StripQuotes ¶
StripQuotes returns the string with the starting and ending quotes removed. If it is not quoted, the original string is returned.
func WarnNameserverDot ¶
func WarnNameserverDot(p, w string)
WarnNameserverDot prints a warning about issue 491 never more than once.
Types ¶
type Correction ¶
Correction is anything that can be run. Implementation is up to the specific provider.
type DNSConfig ¶
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:"-"` SkipRecordAudit bool `json:"skiprecordaudit,omitempty"` }
DNSConfig describes the desired DNS configuration, usually loaded from dnsconfig.js.
func (*DNSConfig) DomainContainingFQDN ¶
func (config *DNSConfig) DomainContainingFQDN(fqdn string) *DomainConfig
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 (*DNSConfig) FindDomain ¶
func (config *DNSConfig) FindDomain(query string) *DomainConfig
FindDomain returns the *DomainConfig for domain query in config.
type DNSProvider ¶
type DNSProvider interface { GetNameservers(domain string) ([]*Nameserver, error) GetZoneRecords(domain string, meta map[string]string) (Records, error) GetZoneRecordsCorrections(dc *DomainConfig, existing Records) ([]*Correction, error) }
DNSProvider is an interface for DNS Provider plug-ins.
type DNSProviderConfig ¶
type DNSProviderConfig struct { Name string `json:"name"` Type string `json:"type"` Metadata json.RawMessage `json:"meta,omitempty"` }
DNSProviderConfig describes a DNS service provider.
type DNSProviderInstance ¶
type DNSProviderInstance struct { ProviderBase Driver DNSProvider NumberOfNameservers int }
DNSProviderInstance is a single DNS provider.
type DomainConfig ¶
type DomainConfig struct { Name string `json:"name"` // NO trailing "." RegistrarName string `json:"registrar"` DNSProviderNames map[string]int `json:"dnsProviders"` // Metadata[DomainUniqueName] // .Name + "!" + .Tag // Metadata[DomainTag] // split horizon tag Metadata map[string]string `json:"meta,omitempty"` Records Records `json:"records"` Nameservers []*Nameserver `json:"nameservers,omitempty"` NameserversMutex sync.Mutex `json:"-"` EnsureAbsent Records `json:"recordsabsent,omitempty"` // ENSURE_ABSENT KeepUnknown bool `json:"keepunknown,omitempty"` // NO_PURGE Unmanaged []*UnmanagedConfig `json:"unmanaged,omitempty"` // IGNORE() UnmanagedUnsafe bool `json:"unmanaged_disable_safety_check,omitempty"` // DISABLE_IGNORE_SAFETY_CHECK AutoDNSSEC string `json:"auto_dnssec,omitempty"` // "", "on", "off" // These fields contain instantiated provider instances once everything is linked up. // This linking is in two phases: // 1. Metadata (name/type) is available just from the dnsconfig. Validation can use that. // 2. Final driver instances are loaded after we load credentials. Any actual provider interaction requires that. RegistrarInstance *RegistrarInstance `json:"-"` DNSProviderInstances []*DNSProviderInstance `json:"-"` // contains filtered or unexported fields }
DomainConfig describes a DNS domain (technically a DNS zone).
func (*DomainConfig) Copy ¶
func (dc *DomainConfig) Copy() (*DomainConfig, error)
Copy returns a deep copy of the DomainConfig.
func (*DomainConfig) Filter ¶
func (dc *DomainConfig) Filter(f func(r *RecordConfig) bool)
Filter removes all records that don't match the filter f.
func (*DomainConfig) GetCorrections ¶ added in v4.9.0
func (dc *DomainConfig) GetCorrections(providerName string) []*Correction
func (*DomainConfig) GetSplitHorizonNames ¶
func (dc *DomainConfig) GetSplitHorizonNames() (name, uniquename, tag string)
GetSplitHorizonNames returns the domain's name, uniquename, and tag.
func (*DomainConfig) GetUniqueName ¶
func (dc *DomainConfig) GetUniqueName() (uniquename string)
GetUniqueName returns the domain's uniquename.
func (*DomainConfig) Punycode ¶
func (dc *DomainConfig) Punycode() error
Punycode will convert all records to punycode format. It will encode: - Name - NameFQDN - Target (CNAME and MX only)
func (*DomainConfig) StoreCorrections ¶ added in v4.9.0
func (dc *DomainConfig) StoreCorrections(providerName string, corrections []*Correction)
func (*DomainConfig) UpdateSplitHorizonNames ¶
func (dc *DomainConfig) UpdateSplitHorizonNames()
UpdateSplitHorizonNames updates the split horizon fields (uniquename and tag) based on name.
type Nameserver ¶
type Nameserver struct {
Name string `json:"name"` // Normalized to a FQDN with NO trailing "."
}
Nameserver describes a nameserver.
func ToNameservers ¶
func ToNameservers(nss []string) ([]*Nameserver, error)
ToNameservers turns a list of strings into a list of Nameservers. It is an error if any string has a trailing dot. Either remove the trailing dot before you call this or (much preferred) use ToNameserversStripTD.
func ToNameserversStripTD ¶
func ToNameserversStripTD(nss []string) ([]*Nameserver, error)
ToNameserversStripTD is like ToNameservers but strips the trailing dot from each item. It is an error if there is no trailing dot.
func (*Nameserver) String ¶
func (n *Nameserver) String() string
type ProviderBase ¶
ProviderBase describes providers.
type RecordConfig ¶
type RecordConfig struct { Type string `json:"type"` // All caps rtype name. Name string `json:"name"` // The short name. See above. SubDomain string `json:"subdomain,omitempty"` NameFQDN string `json:"-"` // Must end with ".$origin". See above. TTL uint32 `json:"ttl,omitempty"` Metadata map[string]string `json:"meta,omitempty"` Original interface{} `json:"-"` // Store pointer to provider-specific record object. Used in diffing. // If you add a field to this struct, also add it to the list in the UnmarshalJSON function. MxPreference uint16 `json:"mxpreference,omitempty"` SrvPriority uint16 `json:"srvpriority,omitempty"` SrvWeight uint16 `json:"srvweight,omitempty"` SrvPort uint16 `json:"srvport,omitempty"` CaaTag string `json:"caatag,omitempty"` CaaFlag uint8 `json:"caaflag,omitempty"` DsKeyTag uint16 `json:"dskeytag,omitempty"` DsAlgorithm uint8 `json:"dsalgorithm,omitempty"` DsDigestType uint8 `json:"dsdigesttype,omitempty"` DsDigest string `json:"dsdigest,omitempty"` DnskeyFlags uint16 `json:"dnskeyflags,omitempty"` DnskeyProtocol uint8 `json:"dnskeyprotocol,omitempty"` DnskeyAlgorithm uint8 `json:"dnskeyalgorithm,omitempty"` DnskeyPublicKey string `json:"dnskeypublickey,omitempty"` LocVersion uint8 `json:"locversion,omitempty"` LocSize uint8 `json:"locsize,omitempty"` LocHorizPre uint8 `json:"lochorizpre,omitempty"` LocVertPre uint8 `json:"locvertpre,omitempty"` LocLatitude uint32 `json:"loclatitude,omitempty"` LocLongitude uint32 `json:"loclongitude,omitempty"` LocAltitude uint32 `json:"localtitude,omitempty"` NaptrOrder uint16 `json:"naptrorder,omitempty"` NaptrPreference uint16 `json:"naptrpreference,omitempty"` NaptrFlags string `json:"naptrflags,omitempty"` NaptrService string `json:"naptrservice,omitempty"` NaptrRegexp string `json:"naptrregexp,omitempty"` SshfpAlgorithm uint8 `json:"sshfpalgorithm,omitempty"` SshfpFingerprint uint8 `json:"sshfpfingerprint,omitempty"` SoaMbox string `json:"soambox,omitempty"` SoaSerial uint32 `json:"soaserial,omitempty"` SoaRefresh uint32 `json:"soarefresh,omitempty"` SoaRetry uint32 `json:"soaretry,omitempty"` SoaExpire uint32 `json:"soaexpire,omitempty"` SoaMinttl uint32 `json:"soaminttl,omitempty"` SvcPriority uint16 `json:"svcpriority,omitempty"` SvcParams string `json:"svcparams,omitempty"` TlsaUsage uint8 `json:"tlsausage,omitempty"` TlsaSelector uint8 `json:"tlsaselector,omitempty"` TlsaMatchingType uint8 `json:"tlsamatchingtype,omitempty"` R53Alias map[string]string `json:"r53_alias,omitempty"` AzureAlias map[string]string `json:"azure_alias,omitempty"` UnknownTypeName string `json:"unknown_type_name,omitempty"` // contains filtered or unexported fields }
RecordConfig stores a DNS record. Valid types:
Official: (alphabetical) A AAAA ANAME // Technically not an official rtype yet. CAA CNAME HTTPS LOC MX NAPTR NS PTR SOA SRV SSHFP SVCB TLSA TXT Pseudo-Types: (alphabetical) ALIAS CF_REDIRECT CF_TEMP_REDIRECT CF_WORKER_ROUTE CLOUDNS_WR FRAME IMPORT_TRANSFORM NAMESERVER NO_PURGE NS1_URLFWD PAGE_RULE PURGE URL URL301 WORKER_ROUTE
Notes about the fields:
Name:
This is the shortname i.e. the NameFQDN without the origin suffix. It should never have a trailing "." It should never be null. The apex (naked domain) is stored as "@". If the origin is "foo.com." and Name is "foo.com", this means the intended FQDN is "foo.com.foo.com." (which may look odd)
NameFQDN:
This is the FQDN version of Name. It should never have a trailing ".".
NOTE: Eventually we will unexport Name/NameFQDN. Please start using the setters (SetLabel/SetLabelFromFQDN) and getters (GetLabel/GetLabelFQDN). as they will always work.
target:
This is the host or IP address of the record, with the other related parameters (weight, priority, etc.) stored in individual fields.
NOTE: Eventually we will unexport Target. Please start using the setters (SetTarget*) and getters (GetTarget*) as they will always work.
SubDomain:
This is the subdomain path, if any, imported from the configuration. If present at the time of canonicalization it is inserted between the Name and origin when constructing a canonical (FQDN) target.
Idioms:
rec.Label() == "@" // Is this record at the apex?
func RRtoRC ¶
func RRtoRC(rr dns.RR, origin string) (RecordConfig, error)
RRtoRC converts dns.RR to RecordConfig
func RRtoRCTxtBug ¶ added in v4.7.0
func RRtoRCTxtBug(rr dns.RR, origin string) (RecordConfig, error)
RRtoRCTxtBug converts dns.RR to RecordConfig. Compensates for the backslash bug in github.com/miekg/dns/issues/1384.
func (*RecordConfig) Copy ¶
func (rc *RecordConfig) Copy() (*RecordConfig, error)
Copy returns a deep copy of a RecordConfig.
func (*RecordConfig) GetDependencies ¶ added in v4.3.0
func (rc *RecordConfig) GetDependencies() []string
GetDependencies returns the FQDNs on which this record dependents
func (*RecordConfig) GetLabel ¶
func (rc *RecordConfig) GetLabel() string
GetLabel returns the shortname of the label associated with this RecordConfig. It will never end with ".". It does not need further shortening (i.e. if it returns "foo.com" and the domain is "foo.com" then the FQDN is actually "foo.com.foo.com"). It will never be "" (the apex is returned as "@").
func (*RecordConfig) GetLabelFQDN ¶
func (rc *RecordConfig) GetLabelFQDN() string
GetLabelFQDN returns the FQDN of the label associated with this RecordConfig. It will not end with ".".
func (*RecordConfig) GetSVCBValue ¶ added in v4.10.0
func (rc *RecordConfig) GetSVCBValue() []dns.SVCBKeyValue
func (*RecordConfig) GetTargetCombined ¶
func (rc *RecordConfig) GetTargetCombined() string
GetTargetCombined returns a string with the various fields combined. For example, an MX record might output `10 mx10.example.tld`. WARNING: How TXT records are handled is buggy but we can't change it because code depends on the bugs. Use Get GetTargetCombinedFunc() instead.
func (*RecordConfig) GetTargetCombinedFunc ¶ added in v4.7.0
func (rc *RecordConfig) GetTargetCombinedFunc(encodeFn func(s string) string) string
GetTargetCombinedFunc returns all the rdata fields of a RecordConfig as one string. How TXT records are encoded is defined by encodeFn. If encodeFn is nil the TXT data is returned unaltered.
func (*RecordConfig) GetTargetDebug ¶
func (rc *RecordConfig) GetTargetDebug() string
GetTargetDebug returns a string with the various fields spelled out.
func (*RecordConfig) GetTargetField ¶
func (rc *RecordConfig) GetTargetField() string
GetTargetField returns the target. There may be other fields, but they are not included. For example, the .MxPreference field of an MX record isn't included.
func (*RecordConfig) GetTargetIP ¶
func (rc *RecordConfig) GetTargetIP() net.IP
GetTargetIP returns the net.IP stored in .target.
func (*RecordConfig) GetTargetRFC1035Quoted ¶
func (rc *RecordConfig) GetTargetRFC1035Quoted() string
GetTargetRFC1035Quoted returns the target as it would be in an RFC1035-style zonefile. Do not use this function if RecordConfig might be a pseudo-rtype such as R53_ALIAS. Use GetTargetCombined() instead.
func (*RecordConfig) GetTargetTXTJoined ¶
func (rc *RecordConfig) GetTargetTXTJoined() string
GetTargetTXTJoined returns the TXT target as one string.
func (*RecordConfig) GetTargetTXTSegmentCount ¶ added in v4.6.1
func (rc *RecordConfig) GetTargetTXTSegmentCount() int
GetTargetTXTSegmentCount returns the number of 255-octet segments required to store TXT target.
func (*RecordConfig) GetTargetTXTSegmented ¶ added in v4.6.1
func (rc *RecordConfig) GetTargetTXTSegmented() []string
GetTargetTXTSegmented returns the TXT target as 255-octet segments, with the remainder in the last segment.
func (*RecordConfig) HasFormatIdenticalToTXT ¶
func (rc *RecordConfig) HasFormatIdenticalToTXT() bool
HasFormatIdenticalToTXT returns if a RecordConfig has a format which is identical to TXT, such as SPF. For more details, read https://tools.ietf.org/html/rfc4408#section-3.1.1
func (*RecordConfig) Key ¶
func (rc *RecordConfig) Key() RecordKey
Key converts a RecordConfig into a RecordKey.
func (*RecordConfig) MarshalJSON ¶
func (rc *RecordConfig) MarshalJSON() ([]byte, error)
MarshalJSON marshals RecordConfig.
func (*RecordConfig) PopulateFromString ¶
func (rc *RecordConfig) PopulateFromString(rtype, contents, origin string) error
PopulateFromString populates a RecordConfig given a type and string. Many providers give all the parameters of a resource record in one big string. This helper function lets you not re-invent the wheel.
NOTE: You almost always want to special-case TXT records. Every provider seems to quote them differently.
Recommended calling convention: Process the exceptions first, then use the PopulateFromString function for everything else.
rtype := FILL_IN_TYPE var err error rc := &models.RecordConfig{Type: rtype} rc.SetLabelFromFQDN(FILL_IN_NAME, origin) rc.TTL = uint32(FILL_IN_TTL) rc.Original = FILL_IN_ORIGINAL // The raw data received from provider (if needed later) switch rtype { case "MX": // MX priority in a separate field. err = rc.SetTargetMX(cr.Priority, target) case "TXT": // TXT records are stored verbatim; no quoting/escaping to parse. err = rc.SetTargetTXT(target) default: err = rc.PopulateFromString(rtype, target, origin) } if err != nil { return nil, fmt.Errorf("unparsable record type=%q received from PROVDER_NAME: %w", rtype, err) } return rc, nil
func (*RecordConfig) PopulateFromStringFunc ¶ added in v4.7.0
func (rc *RecordConfig) PopulateFromStringFunc(rtype, contents, origin string, txtFn func(s string) (string, error)) error
PopulateFromStringFunc populates a RecordConfig by parsing a common RFC1035-like format.
rtype: the resource record type (rtype) contents: a string that contains all parameters of the record's rdata (see below) txtFn: If rtype == "TXT", this function is used to parse contents, or nil if no parsing is needed.
The "contents" field is the format used in RFC1035 zonefiles. It is the text after the rtype. For example, in the line: foo IN MX 10 mx.example.com. contents stores everything after the "MX" (not including the space).
Typical values for txtFn include:
nil: no parsing required. txtutil.ParseQuoted: Parse via Tom's interpretation of RFC1035. txtutil.ParseCombined: Backwards compatible with Parse via miekg's interpretation of RFC1035.
Many providers deliver record data in this format or something close to it. This function is provided to reduce the amount of duplicate code across providers. If a particular rtype is not handled as a particular provider expects, simply handle it beforehand as a special case.
Example 1: Normal use.
rtype := FILL_IN_RTYPE rc := &models.RecordConfig{Type: rtype, TTL: FILL_IN_TTL} rc.SetLabelFromFQDN(FILL_IN_NAME, origin) rc.Original = FILL_IN_ORIGINAL // The raw data received from provider (if needed later) if err = rc.PopulateFromStringFunc(rtype, target, origin, nil); err != nil { return nil, fmt.Errorf("unparsable record type=%q received from PROVDER_NAME: %w", rtype, err) } return rc, nil
Example 2: Use your own MX parser.
rtype := FILL_IN_RTYPE rc := &models.RecordConfig{Type: rtype, TTL: FILL_IN_TTL} rc.SetLabelFromFQDN(FILL_IN_NAME, origin) rc.Original = FILL_IN_ORIGINAL // The raw data received from provider (if needed later) switch rtype { case "MX": // MX priority in a separate field. err = rc.SetTargetMX(cr.Priority, target) default: err = rc.PopulateFromString(rtype, target, origin) } if err != nil { return nil, fmt.Errorf("unparsable record type=%q received from PROVDER_NAME: %w", rtype, err) } return rc, nil
func (*RecordConfig) SetLOCParams ¶
func (rc *RecordConfig) SetLOCParams(d1 uint8, m1 uint8, s1 float32, ns string, d2 uint8, m2 uint8, s2 float32, ew string, al int32, sz float32, hp float32, vp float32) error
SetLOCParams is an intermediate function which passes the 12 input parameters for further processing to the LOC native 7 input binary format: LocVersion (0), LocLatitude, LocLongitude, LocAltitude, LocSize, LocVertPre, LocHorizPre
func (*RecordConfig) SetLabel ¶
func (rc *RecordConfig) SetLabel(short, origin string)
SetLabel sets the .Name/.NameFQDN fields given a short name and origin. origin must not have a trailing dot: The entire code base maintains dc.Name without the trailig dot. Finding a dot here means something is very wrong.
short must not have a training dot: That would mean you have a FQDN, and shouldn't be using SetLabel(). Maybe SetLabelFromFQDN()?
func (*RecordConfig) SetLabelFromFQDN ¶
func (rc *RecordConfig) SetLabelFromFQDN(fqdn, origin string)
SetLabelFromFQDN sets the .Name/.NameFQDN fields given a FQDN and origin. fqdn may have a trailing "." but it is not required. origin may not have a trailing dot.
func (*RecordConfig) SetTarget ¶
func (rc *RecordConfig) SetTarget(target string) error
SetTarget sets the target, assuming that the rtype is appropriate.
func (*RecordConfig) SetTargetCAA ¶
func (rc *RecordConfig) SetTargetCAA(flag uint8, tag string, target string) error
SetTargetCAA sets the CAA fields.
func (*RecordConfig) SetTargetCAAString ¶
func (rc *RecordConfig) SetTargetCAAString(s string) error
SetTargetCAAString is like SetTargetCAA but accepts one big string. Ex: `0 issue "letsencrypt.org"`
func (*RecordConfig) SetTargetCAAStrings ¶
func (rc *RecordConfig) SetTargetCAAStrings(flag, tag, target string) error
SetTargetCAAStrings is like SetTargetCAA but accepts strings.
func (*RecordConfig) SetTargetDNSKEY ¶ added in v4.10.0
func (rc *RecordConfig) SetTargetDNSKEY(flags uint16, protocol, algorithm uint8, publicKey string) error
SetTargetDNSKEY sets the DNSKEY fields.
func (*RecordConfig) SetTargetDNSKEYString ¶ added in v4.10.0
func (rc *RecordConfig) SetTargetDNSKEYString(s string) error
SetTargetDNSKEYString is like SetTargetDNSKEY but accepts one big string.
func (*RecordConfig) SetTargetDNSKEYStrings ¶ added in v4.10.0
func (rc *RecordConfig) SetTargetDNSKEYStrings(flags, protocol, algorithm, publicKey string) error
SetTargetDNSKEYStrings is like SetTargetDNSKEY but accepts strings.
func (*RecordConfig) SetTargetDS ¶
func (rc *RecordConfig) SetTargetDS(keytag uint16, algorithm, digesttype uint8, digest string) error
SetTargetDS sets the DS fields.
func (*RecordConfig) SetTargetDSString ¶
func (rc *RecordConfig) SetTargetDSString(s string) error
SetTargetDSString is like SetTargetDS but accepts one big string.
func (*RecordConfig) SetTargetDSStrings ¶
func (rc *RecordConfig) SetTargetDSStrings(keytag, algorithm, digesttype, digest string) error
SetTargetDSStrings is like SetTargetDS but accepts strings.
func (*RecordConfig) SetTargetIP ¶
func (rc *RecordConfig) SetTargetIP(ip net.IP) error
SetTargetIP sets the target to an IP, verifying this is an appropriate rtype.
func (*RecordConfig) SetTargetLOC ¶
func (rc *RecordConfig) SetTargetLOC(ver uint8, lat uint32, lon uint32, alt uint32, siz uint8, hzp uint8, vtp uint8) error
SetTargetLOC sets the LOC fields from the rr.LOC type properties.
func (*RecordConfig) SetTargetLOCString ¶
func (rc *RecordConfig) SetTargetLOCString(origin string, contents string) error
SetTargetLOCString is like SetTargetLOC but accepts one big string and origin Normally this is used when we receive a record string from provider records because e.g. the provider API passed rc.PopulateFromString()
func (*RecordConfig) SetTargetMX ¶
func (rc *RecordConfig) SetTargetMX(pref uint16, target string) error
SetTargetMX sets the MX fields.
func (*RecordConfig) SetTargetMXString ¶
func (rc *RecordConfig) SetTargetMXString(s string) error
SetTargetMXString is like SetTargetMX but accepts one big string.
func (*RecordConfig) SetTargetMXStrings ¶
func (rc *RecordConfig) SetTargetMXStrings(pref, target string) error
SetTargetMXStrings is like SetTargetMX but accepts strings.
func (*RecordConfig) SetTargetNAPTR ¶
func (rc *RecordConfig) SetTargetNAPTR(order uint16, preference uint16, flags string, service string, regexp string, target string) error
SetTargetNAPTR sets the NAPTR fields.
func (*RecordConfig) SetTargetNAPTRString ¶
func (rc *RecordConfig) SetTargetNAPTRString(s string) error
SetTargetNAPTRString is like SetTargetNAPTR but accepts one big string.
func (*RecordConfig) SetTargetNAPTRStrings ¶
func (rc *RecordConfig) SetTargetNAPTRStrings(order, preference, flags string, service string, regexp string, target string) error
SetTargetNAPTRStrings is like SetTargetNAPTR but accepts strings.
func (*RecordConfig) SetTargetSOA ¶
func (rc *RecordConfig) SetTargetSOA(ns, mbox string, serial, refresh, retry, expire, minttl uint32) error
SetTargetSOA sets the SOA fields.
func (*RecordConfig) SetTargetSOAString ¶
func (rc *RecordConfig) SetTargetSOAString(s string) error
SetTargetSOAString is like SetTargetSOA but accepts one big string.
func (*RecordConfig) SetTargetSOAStrings ¶
func (rc *RecordConfig) SetTargetSOAStrings(ns, mbox, serial, refresh, retry, expire, minttl string) error
SetTargetSOAStrings is like SetTargetSOA but accepts strings.
func (*RecordConfig) SetTargetSRV ¶
func (rc *RecordConfig) SetTargetSRV(priority, weight, port uint16, target string) error
SetTargetSRV sets the SRV fields.
func (*RecordConfig) SetTargetSRVPriorityString ¶
func (rc *RecordConfig) SetTargetSRVPriorityString(priority uint16, s string) error
SetTargetSRVPriorityString is like SetTargetSRV but accepts priority as an uint16 and the rest of the values joined in a string that needs to be parsed. This is a helper function that comes in handy when a provider re-uses the MX preference field as the SRV priority.
func (*RecordConfig) SetTargetSRVString ¶
func (rc *RecordConfig) SetTargetSRVString(s string) error
SetTargetSRVString is like SetTargetSRV but accepts one big string to be parsed.
func (*RecordConfig) SetTargetSRVStrings ¶
func (rc *RecordConfig) SetTargetSRVStrings(priority, weight, port, target string) (err error)
SetTargetSRVStrings is like SetTargetSRV but accepts all parameters as strings.
func (*RecordConfig) SetTargetSSHFP ¶
func (rc *RecordConfig) SetTargetSSHFP(algorithm uint8, fingerprint uint8, target string) error
SetTargetSSHFP sets the SSHFP fields.
func (*RecordConfig) SetTargetSSHFPString ¶
func (rc *RecordConfig) SetTargetSSHFPString(s string) error
SetTargetSSHFPString is like SetTargetSSHFP but accepts one big string.
func (*RecordConfig) SetTargetSSHFPStrings ¶
func (rc *RecordConfig) SetTargetSSHFPStrings(algorithm, fingerprint, target string) error
SetTargetSSHFPStrings is like SetTargetSSHFP but accepts strings.
func (*RecordConfig) SetTargetSVCB ¶ added in v4.10.0
func (rc *RecordConfig) SetTargetSVCB(priority uint16, target string, params []dns.SVCBKeyValue) error
SetTargetSVCB sets the SVCB fields.
func (*RecordConfig) SetTargetSVCBString ¶ added in v4.10.0
func (rc *RecordConfig) SetTargetSVCBString(origin, contents string) error
SetTargetSVCBString is like SetTargetSVCB but accepts one big string and the origin so parsing can be done using miekg/dns.
func (*RecordConfig) SetTargetTLSA ¶
func (rc *RecordConfig) SetTargetTLSA(usage, selector, matchingtype uint8, target string) error
SetTargetTLSA sets the TLSA fields.
func (*RecordConfig) SetTargetTLSAString ¶
func (rc *RecordConfig) SetTargetTLSAString(s string) error
SetTargetTLSAString is like SetTargetTLSA but accepts one big string.
func (*RecordConfig) SetTargetTLSAStrings ¶
func (rc *RecordConfig) SetTargetTLSAStrings(usage, selector, matchingtype, target string) (err error)
SetTargetTLSAStrings is like SetTargetTLSA but accepts strings.
func (*RecordConfig) SetTargetTXT ¶
func (rc *RecordConfig) SetTargetTXT(s string) error
SetTargetTXT sets the TXT fields when there is 1 string.
func (*RecordConfig) SetTargetTXTs ¶
func (rc *RecordConfig) SetTargetTXTs(s []string) error
SetTargetTXTs sets the TXT fields when there are many strings. They are stored concatenated.
func (*RecordConfig) String ¶
func (rc *RecordConfig) String() string
String returns the text representation of the resource record.
func (*RecordConfig) ToComparableNoTTL ¶
func (rc *RecordConfig) ToComparableNoTTL() string
ToComparableNoTTL returns a comparison string. If you need to compare two RecordConfigs, you can simply compare the string returned by this function. The comparison includes all fields except TTL and any provider-specific metafields. Provider-specific metafields like CF_PROXY are not the same as pseudo-records like ANAME or R53_ALIAS
func (*RecordConfig) ToRR ¶
func (rc *RecordConfig) ToRR() dns.RR
ToRR converts a RecordConfig to a dns.RR.
func (*RecordConfig) UnmarshalJSON ¶
func (rc *RecordConfig) UnmarshalJSON(b []byte) error
UnmarshalJSON unmarshals RecordConfig.
type RecordDB ¶
type RecordDB struct {
// contains filtered or unexported fields
}
RecordDB is a container of many RecordConfig, queryable by various methods. The first to be implemented is as a hash with label:type as the index.
func NewRecordDBFromRecords ¶
NewRecordDBFromRecords creates a RecordDB from a list of RecordConfig.
func (*RecordDB) ContainsLT ¶
func (recdb *RecordDB) ContainsLT(rec *RecordConfig) bool
ContainsLT returns true if recdb contains rec. Matching is done on the record's label and type (i.e. the RecordKey)
type Records ¶
type Records []*RecordConfig
Records is a list of *RecordConfig.
func (Records) GetAllDependencies ¶ added in v4.3.0
GetAllDependencies concatinates all dependencies of all records
func (Records) GroupedByFQDN ¶
GroupedByFQDN returns a map of keys to records, grouped by FQDN.
func (Records) GroupedByKey ¶
GroupedByKey returns a map of keys to records.
func (Records) HasRecordTypeName ¶
HasRecordTypeName returns True if there is a record with this rtype and name.
type Registrar ¶
type Registrar interface {
GetRegistrarCorrections(dc *DomainConfig) ([]*Correction, error)
}
Registrar is an interface for Registrar plug-ins.
type RegistrarConfig ¶
type RegistrarConfig struct { Name string `json:"name"` Type string `json:"type"` Metadata json.RawMessage `json:"meta,omitempty"` }
RegistrarConfig describes a registrar.
type RegistrarInstance ¶
type RegistrarInstance struct { ProviderBase Driver Registrar }
RegistrarInstance is a single registrar.
type UnmanagedConfig ¶
type UnmanagedConfig struct { // Glob pattern for matching labels. LabelPattern string `json:"label_pattern,omitempty"` LabelGlob glob.Glob `json:"-"` // Compiled version // Comma-separated list of DNS Resource Types. RTypePattern string `json:"rType_pattern,omitempty"` RTypeMap map[string]struct{} `json:"-"` // map of RTypes or len()=0 for all // Glob pattern for matching targets. TargetPattern string `json:"target_pattern,omitempty"` TargetGlob glob.Glob `json:"-"` // Compiled version }
UnmanagedConfig describes an IGNORE() rule. NB(tlim): This is called "Unmanaged" because the original design was to call this function UNMANAGED(). However we then realized that we could repurpose IGNORE() without any compatibility issues. NB(tlim): TechDebt: UnmanagedConfig and DebugUnmanagedConfig should be moved to pkg/diff2/handsoff.go and the following fields could be unexported: LabelGlob, RTypeMap, and TargetGlob