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

Attempt to add NAPTR support.

This commit is contained in:
Peter Dunaskin
2019-03-28 15:40:13 +01:00
parent 963bd32e20
commit 7566c0428e
15 changed files with 251 additions and 87 deletions

View File

@ -32,6 +32,7 @@ func generateFeatureMatrix() error {
{"ALIAS", "Provider supports some kind of ALIAS, ANAME or flattened CNAME record type"},
{"CAA", "Provider can manage CAA records"},
{"PTR", "Provider supports adding PTR records for reverse lookup zones"},
{"NAPTR", "Provider can manage NAPTR records"},
{"SRV", "Driver has explicitly implemented SRV record management"},
{"SSHFP", "Provider can manage SSHFP records"},
{"TLSA", "Provider can manage TLSA records"},
@ -74,6 +75,7 @@ func generateFeatureMatrix() error {
setCap("ALIAS", providers.CanUseAlias)
setCap("CAA", providers.CanUseCAA)
setCap("PTR", providers.CanUsePTR)
setCap("NAPTR", providers.CanUseNAPTR)
setCap("SRV", providers.CanUseSRV)
setCap("SSHFP", providers.CanUseSSHFP)
setCap("TLSA", providers.CanUseTLSA)

View File

@ -254,6 +254,16 @@ func ptr(name, target string) *rec {
return makeRec(name, target, "PTR")
}
func naptr(name string, order uint16, preference uint16, flags string, service string, regexp string, target string) *rec {
r := makeRec(name, target, "NAPTR")
r.NaptrOrder = order
r.NaptrPreference = preference
r.NaptrFlags = flags
r.NaptrService = service
r.NaptrRegexp = regexp
return r
}
func srv(name string, priority, weight, port uint16, target string) *rec {
r := makeRec(name, target, "SRV")
r.SrvPriority = priority
@ -417,6 +427,23 @@ func makeTests(t *testing.T) []*TestCase {
)
}
// NAPTR
if !providers.ProviderHasCabability(*providerToRun, providers.CanUseNAPTR) {
t.Log("Skipping NAPTR Tests because provider does not support them")
} else {
tests = append(tests, tc("Empty"),
tc("NAPTR record", naptr("example", 100, 10, "U", "E2U+sip", "!^.*$!sip:customer-service@example.com!", "foo.com")),
tc("NAPTR second record", naptr("example", 102, 10, "U", "E2U+email", "!^.*$!mailto:information@example.com!", "foo.com.")),
tc("NAPTR delete record", naptr("example", 102, 10, "U", "E2U+email", "!^.*$!mailto:information@example.com!", "foo.com.")),
tc("NAPTR change target", naptr("example", 102, 10, "U", "E2U+email", "!^.*$!mailto:information@example.com!", "foo2.com.")),
tc("NAPTR change order", naptr("example", 103, 10, "U", "E2U+email", "!^.*$!mailto:information@example.com!", "foo2.com.")),
tc("NAPTR change preference", naptr("example", 103, 20, "U", "E2U+email", "!^.*$!mailto:information@example.com!", "foo2.com.")),
tc("NAPTR change flags", naptr("example", 103, 20, "A", "E2U+email", "!^.*$!mailto:information@example.com!", "foo2.com.")),
tc("NAPTR change service", naptr("example", 103, 20, "A", "E2U+sip", "!^.*$!mailto:information@example.com!", "foo2.com.")),
tc("NAPTR change regexp", naptr("example", 103, 20, "A", "E2U+sip", "!^.*$!sip:customer-service@example.com!", "foo2.com.")),
)
}
// SRV
if !providers.ProviderHasCabability(*providerToRun, providers.CanUseSRV) {
t.Log("Skipping SRV Tests because provider does not support them")
@ -433,7 +460,7 @@ func makeTests(t *testing.T) []*TestCase {
)
}
// SSHFP
// SSHFP
if !providers.ProviderHasCabability(*providerToRun, providers.CanUseSSHFP) {
t.Log("Skipping SSHFP Tests because provider does not support them")
} else {

BIN
models/.record.go.swp Normal file

Binary file not shown.

View File

@ -80,7 +80,7 @@ func (dc *DomainConfig) Punycode() error {
}
rec.SetLabelFromFQDN(t, dc.Name)
switch rec.Type { // #rtype_variations
case "ALIAS", "MX", "NS", "CNAME", "PTR", "SRV", "URL", "URL301", "FRAME", "R53_ALIAS":
case "ALIAS", "MX", "NS", "CNAME", "PTR", "NAPTR", "SRV", "URL", "URL301", "FRAME", "R53_ALIAS":
// These rtypes are hostnames, therefore need to be converted (unlike, for example, an AAAA record)
t, err := idna.ToASCII(rec.GetTargetField())
rec.SetTarget(t)

View File

@ -21,6 +21,7 @@ import (
// MX
// NS
// PTR
// NAPTR
// SRV
// SSHFP
// TLSA
@ -75,6 +76,13 @@ type RecordConfig struct {
SrvPort uint16 `json:"srvport,omitempty"`
CaaTag string `json:"caatag,omitempty"`
CaaFlag uint8 `json:"caaflag,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"`
//NaptrReplacement string `json:"naptrreplacement,omitempty"`
NaptrReplacement string `json:"target"`
SshfpAlgorithm uint8 `json:"sshfpalgorithm,omitempty"`
SshfpFingerprint uint8 `json:"sshfpfingerprint,omitempty"`
TlsaUsage uint8 `json:"tlsausage,omitempty"`
@ -201,6 +209,14 @@ func (rc *RecordConfig) ToRR() dns.RR {
rr.(*dns.CNAME).Target = rc.GetTargetField()
case dns.TypePTR:
rr.(*dns.PTR).Ptr = rc.GetTargetField()
case dns.TypeNAPTR:
rr.(*dns.NAPTR).Order = rc.NaptrOrder
rr.(*dns.NAPTR).Preference = rc.NaptrPreference
rr.(*dns.NAPTR).Flags = rc.NaptrFlags
rr.(*dns.NAPTR).Service = rc.NaptrService
rr.(*dns.NAPTR).Regexp = rc.NaptrRegexp
//rr.(*dns.NAPTR).Replacement = rc.GetTargetField()
rr.(*dns.NAPTR).Replacement = rc.NaptrReplacement
case dns.TypeMX:
rr.(*dns.MX).Preference = rc.MxPreference
rr.(*dns.MX).Mx = rc.GetTargetField()
@ -300,7 +316,7 @@ func downcase(recs []*RecordConfig) {
r.Name = strings.ToLower(r.Name)
r.NameFQDN = strings.ToLower(r.NameFQDN)
switch r.Type { // #rtype_variations
case "ANAME", "CNAME", "MX", "NS", "PTR", "SRV":
case "ANAME", "CNAME", "MX", "NS", "PTR", "NAPTR", "SRV":
// These record types have a target that is case insensitive, so we downcase it.
r.Target = strings.ToLower(r.Target)
case "A", "AAAA", "ALIAS", "CAA", "IMPORT_TRANSFORM", "TLSA", "TXT", "SOA", "SSHFP", "CF_REDIRECT", "CF_TEMP_REDIRECT":

48
models/t_naptr.go Normal file
View File

@ -0,0 +1,48 @@
package models
import (
"strconv"
"strings"
"github.com/pkg/errors"
)
// SetTargetNAPTR sets the NAPTR fields.
func (rc *RecordConfig) SetTargetNAPTR(order uint16, preference uint16, flags string, service string, regexp string, target string) error {
rc.NaptrOrder = order
rc.NaptrPreference = preference
rc.NaptrFlags = flags
rc.NaptrService = service
rc.NaptrRegexp = regexp
rc.NaptrReplacement = target
if rc.Type == "" {
rc.Type = "NAPTR"
}
if rc.Type != "NAPTR" {
panic("assertion failed: SetTargetNAPTR called when .Type is not NAPTR")
}
return nil
}
// SetTargetNAPTRStrings is like SetTargetNAPTR but accepts strings.
func (rc *RecordConfig) SetTargetNAPTRStrings(order, preference, flags string, service string, regexp string, target string) error {
i64order, err := strconv.ParseUint(order, 10, 16)
if err != nil {
return errors.Wrap(err, "NAPTR order does not fit in 16 bits")
}
i64preference, err := strconv.ParseUint(preference, 10, 16)
if err != nil {
return errors.Wrap(err, "NAPTR preference does not fit in 16 bits")
}
return rc.SetTargetNAPTR(uint16(i64order), uint16(i64preference), flags, service, regexp, target)
}
// SetTargetNAPTRString is like SetTargetNAPTR but accepts one big string.
func (rc *RecordConfig) SetTargetNAPTRString(s string) error {
part := strings.Fields(s)
if len(part) != 6 {
return errors.Errorf("NAPTR value does not contain 6 fields: (%#v)", s)
}
return rc.SetTargetNAPTRStrings(part[0], part[1], part[2], part[3], part[4], StripQuotes(part[5]))
}

View File

@ -38,6 +38,8 @@ func (r *RecordConfig) PopulateFromString(rtype, contents, origin string) error
return r.SetTarget(contents)
case "CAA":
return r.SetTargetCAAString(contents)
case "NAPTR":
return r.SetTargetNAPTRString(contents)
case "MX":
return r.SetTargetMXString(contents)
case "SRV":

View File

@ -77,6 +77,8 @@ func (rc *RecordConfig) GetTargetDebug() string {
switch rc.Type { // #rtype_variations
case "A", "AAAA", "CNAME", "NS", "PTR", "TXT":
// Nothing special.
case "NAPTR":
content += fmt.Sprintf(" naptrorder=%d naptrpreference=%d naptrflags=%s naptrservice=%s naptrregexp=%s naptrreplacement=%s", rc.NaptrOrder, rc.NaptrPreference, rc.NaptrFlags, rc.NaptrService, rc.NaptrRegexp, rc.NaptrReplacement)
case "MX":
content += fmt.Sprintf(" pref=%d", rc.MxPreference)
case "SOA":

View File

@ -217,6 +217,28 @@ var CNAME = recordBuilder('CNAME');
// PTR(name,target, recordModifiers...)
var PTR = recordBuilder('PTR');
// NAPTR(name,order,preference,flags,service,regexp,target, recordModifiers...)
var NAPTR = recordBuilder('NAPTR', {
args: [
['name', _.isString],
['order', _.isNumber],
['preference', _.isNumber],
['flags', _.isString],
['service', _.isString],
['regexp', _.isString],
['target', _.isString],
],
transform: function(record, args, modifiers) {
record.name = args.name;
record.naptrorder = args.order;
record.naptrpreference = args.preference;
record.naptrflags = args.flags;
record.naptrservice = args.service;
record.naptrregexp = args.regexp;
record.target = args.target;
},
});
// SRV(name,priority,weight,port,target, recordModifiers...)
var SRV = recordBuilder('SRV', {
args: [

View File

@ -0,0 +1,4 @@
D("foo.com","none",
NAPTR("foo.com",100,10,"U","E2U+sip","!^.*$!sip:customer-service@example.com!","example"),
NAPTR("foo.com",102,10,"U","E2U+email","!^.*$!mailto:information@example.com!","example")
);

View File

@ -0,0 +1,31 @@
{
"registrars": [],
"dns_providers": [],
"domains": [
{
"name": "foo.com",
"registrar": "none",
"dnsProviders": {},
"records": [
{
"type": "NAPTR",
"order": 100,
"preference": 10,
"flags": "U",
"service": "E2U+sip",
"regexp": "!^.*$!sip:customer-service@example.com!",
"target": "example"
},
{
"type": "NAPTR",
"order": 102,
"preference": 10,
"flags": "U",
"service": "E2U+email",
"regexp": "!^.*$!mailto:information@example.com!",
"target": "example"
}
]
}
]
}

View File

@ -192,92 +192,95 @@ var _escData = map[string]*_escFile{
"/helpers.js": {
local: "pkg/js/helpers.js",
size: 18516,
size: 19673,
modtime: 0,
compressed: `
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
`,
},

View File

@ -62,6 +62,7 @@ func validateRecordTypes(rec *models.RecordConfig, domain string, pTypes []strin
"TXT": true,
"NS": true,
"PTR": true,
"NAPTR": true,
"ALIAS": false,
}
_, ok := validTypes[rec.Type]
@ -170,6 +171,8 @@ func checkTargets(rec *models.RecordConfig, domain string) (errs []error) {
}
case "PTR":
check(checkTarget(target))
case "NAPTR":
check(checkTarget(target))
case "ALIAS":
check(checkTarget(target))
case "SRV":

View File

@ -33,6 +33,7 @@ import (
var features = providers.DocumentationNotes{
providers.CanUseCAA: providers.Can(),
providers.CanUsePTR: providers.Can(),
providers.CanUseNAPTR: providers.Can(),
providers.CanUseSRV: providers.Can(),
providers.CanUseSSHFP: providers.Can(),
providers.CanUseTLSA: providers.Can(),

View File

@ -19,6 +19,9 @@ const (
// CanUsePTR indicates the provider can handle PTR records
CanUsePTR
// CanUseNAPTR indicates the provider can handle PTR records
CanUseNAPTR
// CanUseSRV indicates the provider can handle SRV records
CanUseSRV