aboutsummaryrefslogtreecommitdiff
path: root/middleware/backend_lookup.go
diff options
context:
space:
mode:
Diffstat (limited to 'middleware/backend_lookup.go')
-rw-r--r--middleware/backend_lookup.go143
1 files changed, 43 insertions, 100 deletions
diff --git a/middleware/backend_lookup.go b/middleware/backend_lookup.go
index 7ad011b98..9e451feed 100644
--- a/middleware/backend_lookup.go
+++ b/middleware/backend_lookup.go
@@ -14,10 +14,10 @@ import (
)
// A returns A records from Backend or an error.
-func A(b ServiceBackend, zone string, state request.Request, previousRecords []dns.RR, opt Options) (records []dns.RR, debug []msg.Service, err error) {
- services, debug, err := b.Services(state, false, opt)
+func A(b ServiceBackend, zone string, state request.Request, previousRecords []dns.RR, opt Options) (records []dns.RR, err error) {
+ services, err := b.Services(state, false, opt)
if err != nil {
- return nil, debug, err
+ return nil, err
}
for _, serv := range services {
@@ -41,14 +41,13 @@ func A(b ServiceBackend, zone string, state request.Request, previousRecords []d
}
state1 := state.NewWithQuestion(serv.Host, state.QType())
- nextRecords, nextDebug, err := A(b, zone, state1, append(previousRecords, newRecord), opt)
+ nextRecords, err := A(b, zone, state1, append(previousRecords, newRecord), opt)
if err == nil {
// Not only have we found something we should add the CNAME and the IP addresses.
if len(nextRecords) > 0 {
records = append(records, newRecord)
records = append(records, nextRecords...)
- debug = append(debug, nextDebug...)
}
continue
}
@@ -61,8 +60,6 @@ func A(b ServiceBackend, zone string, state request.Request, previousRecords []d
// Lookup
m1, e1 := b.Lookup(state, target, state.QType())
if e1 != nil {
- debugMsg := msg.Service{Key: msg.Path(target, b.Debug()), Host: target, Text: " IN " + state.Type() + ": " + e1.Error()}
- debug = append(debug, debugMsg)
continue
}
// Len(m1.Answer) > 0 here is well?
@@ -77,14 +74,14 @@ func A(b ServiceBackend, zone string, state request.Request, previousRecords []d
// nodata?
}
}
- return records, debug, nil
+ return records, nil
}
// AAAA returns AAAA records from Backend or an error.
-func AAAA(b ServiceBackend, zone string, state request.Request, previousRecords []dns.RR, opt Options) (records []dns.RR, debug []msg.Service, err error) {
- services, debug, err := b.Services(state, false, opt)
+func AAAA(b ServiceBackend, zone string, state request.Request, previousRecords []dns.RR, opt Options) (records []dns.RR, err error) {
+ services, err := b.Services(state, false, opt)
if err != nil {
- return nil, debug, err
+ return nil, err
}
for _, serv := range services {
@@ -109,14 +106,13 @@ func AAAA(b ServiceBackend, zone string, state request.Request, previousRecords
}
state1 := state.NewWithQuestion(serv.Host, state.QType())
- nextRecords, nextDebug, err := AAAA(b, zone, state1, append(previousRecords, newRecord), opt)
+ nextRecords, err := AAAA(b, zone, state1, append(previousRecords, newRecord), opt)
if err == nil {
// Not only have we found something we should add the CNAME and the IP addresses.
if len(nextRecords) > 0 {
records = append(records, newRecord)
records = append(records, nextRecords...)
- debug = append(debug, nextDebug...)
}
continue
}
@@ -128,8 +124,6 @@ func AAAA(b ServiceBackend, zone string, state request.Request, previousRecords
}
m1, e1 := b.Lookup(state, target, state.QType())
if e1 != nil {
- debugMsg := msg.Service{Key: msg.Path(target, b.Debug()), Host: target, Text: " IN " + state.Type() + ": " + e1.Error()}
- debug = append(debug, debugMsg)
continue
}
// Len(m1.Answer) > 0 here is well?
@@ -145,15 +139,15 @@ func AAAA(b ServiceBackend, zone string, state request.Request, previousRecords
records = append(records, serv.NewAAAA(state.QName(), ip))
}
}
- return records, debug, nil
+ return records, nil
}
// SRV returns SRV records from the Backend.
// If the Target is not a name but an IP address, a name is created on the fly.
-func SRV(b ServiceBackend, zone string, state request.Request, opt Options) (records, extra []dns.RR, debug []msg.Service, err error) {
- services, debug, err := b.Services(state, false, opt)
+func SRV(b ServiceBackend, zone string, state request.Request, opt Options) (records, extra []dns.RR, err error) {
+ services, err := b.Services(state, false, opt)
if err != nil {
- return nil, nil, nil, err
+ return nil, nil, err
}
// Looping twice to get the right weight vs priority
@@ -196,9 +190,6 @@ func SRV(b ServiceBackend, zone string, state request.Request, opt Options) (rec
m1, e1 := b.Lookup(state, srv.Target, dns.TypeA)
if e1 == nil {
extra = append(extra, m1.Answer...)
- } else {
- debugMsg := msg.Service{Key: msg.Path(srv.Target, b.Debug()), Host: srv.Target, Text: " IN A: " + e1.Error()}
- debug = append(debug, debugMsg)
}
m1, e1 = b.Lookup(state, srv.Target, dns.TypeAAAA)
@@ -209,19 +200,15 @@ func SRV(b ServiceBackend, zone string, state request.Request, opt Options) (rec
extra = append(extra, a)
}
}
- } else {
- debugMsg := msg.Service{Key: msg.Path(srv.Target, b.Debug()), Host: srv.Target, Text: " IN AAAA: " + e1.Error()}
- debug = append(debug, debugMsg)
}
break
}
// Internal name, we should have some info on them, either v4 or v6
// Clients expect a complete answer, because we are a recursor in their view.
state1 := state.NewWithQuestion(srv.Target, dns.TypeA)
- addr, debugAddr, e1 := A(b, zone, state1, nil, opt)
+ addr, e1 := A(b, zone, state1, nil, opt)
if e1 == nil {
extra = append(extra, addr...)
- debug = append(debug, debugAddr...)
}
// IPv6 lookups here as well? AAAA(zone, state1, nil).
@@ -233,14 +220,14 @@ func SRV(b ServiceBackend, zone string, state request.Request, opt Options) (rec
extra = append(extra, newAddress(serv, srv.Target, ip, what))
}
}
- return records, extra, debug, nil
+ return records, extra, nil
}
// MX returns MX records from the Backend. If the Target is not a name but an IP address, a name is created on the fly.
-func MX(b ServiceBackend, zone string, state request.Request, opt Options) (records, extra []dns.RR, debug []msg.Service, err error) {
- services, debug, err := b.Services(state, false, opt)
+func MX(b ServiceBackend, zone string, state request.Request, opt Options) (records, extra []dns.RR, err error) {
+ services, err := b.Services(state, false, opt)
if err != nil {
- return nil, nil, debug, err
+ return nil, nil, err
}
lookup := make(map[string]bool)
@@ -263,10 +250,8 @@ func MX(b ServiceBackend, zone string, state request.Request, opt Options) (reco
m1, e1 := b.Lookup(state, mx.Mx, dns.TypeA)
if e1 == nil {
extra = append(extra, m1.Answer...)
- } else {
- debugMsg := msg.Service{Key: msg.Path(mx.Mx, b.Debug()), Host: mx.Mx, Text: " IN A: " + e1.Error()}
- debug = append(debug, debugMsg)
}
+
m1, e1 = b.Lookup(state, mx.Mx, dns.TypeAAAA)
if e1 == nil {
// If we have seen CNAME's we *assume* that they are already added.
@@ -275,18 +260,14 @@ func MX(b ServiceBackend, zone string, state request.Request, opt Options) (reco
extra = append(extra, a)
}
}
- } else {
- debugMsg := msg.Service{Key: msg.Path(mx.Mx, b.Debug()), Host: mx.Mx, Text: " IN AAAA: " + e1.Error()}
- debug = append(debug, debugMsg)
}
break
}
// Internal name
state1 := state.NewWithQuestion(mx.Mx, dns.TypeA)
- addr, debugAddr, e1 := A(b, zone, state1, nil, opt)
+ addr, e1 := A(b, zone, state1, nil, opt)
if e1 == nil {
extra = append(extra, addr...)
- debug = append(debug, debugAddr...)
}
// e.AAAA as well
@@ -296,14 +277,14 @@ func MX(b ServiceBackend, zone string, state request.Request, opt Options) (reco
extra = append(extra, newAddress(serv, serv.Host, ip, what))
}
}
- return records, extra, debug, nil
+ return records, extra, nil
}
// CNAME returns CNAME records from the backend or an error.
-func CNAME(b ServiceBackend, zone string, state request.Request, opt Options) (records []dns.RR, debug []msg.Service, err error) {
- services, debug, err := b.Services(state, true, opt)
+func CNAME(b ServiceBackend, zone string, state request.Request, opt Options) (records []dns.RR, err error) {
+ services, err := b.Services(state, true, opt)
if err != nil {
- return nil, debug, err
+ return nil, err
}
if len(services) > 0 {
@@ -312,14 +293,14 @@ func CNAME(b ServiceBackend, zone string, state request.Request, opt Options) (r
records = append(records, serv.NewCNAME(state.QName(), serv.Host))
}
}
- return records, debug, nil
+ return records, nil
}
// TXT returns TXT records from Backend or an error.
-func TXT(b ServiceBackend, zone string, state request.Request, opt Options) (records []dns.RR, debug []msg.Service, err error) {
- services, debug, err := b.Services(state, false, opt)
+func TXT(b ServiceBackend, zone string, state request.Request, opt Options) (records []dns.RR, err error) {
+ services, err := b.Services(state, false, opt)
if err != nil {
- return nil, debug, err
+ return nil, err
}
for _, serv := range services {
@@ -328,14 +309,14 @@ func TXT(b ServiceBackend, zone string, state request.Request, opt Options) (rec
}
records = append(records, serv.NewTXT(state.QName()))
}
- return records, debug, nil
+ return records, nil
}
// PTR returns the PTR records from the backend, only services that have a domain name as host are included.
-func PTR(b ServiceBackend, zone string, state request.Request, opt Options) (records []dns.RR, debug []msg.Service, err error) {
- services, debug, err := b.Reverse(state, true, opt)
+func PTR(b ServiceBackend, zone string, state request.Request, opt Options) (records []dns.RR, err error) {
+ services, err := b.Reverse(state, true, opt)
if err != nil {
- return nil, debug, err
+ return nil, err
}
for _, serv := range services {
@@ -343,20 +324,20 @@ func PTR(b ServiceBackend, zone string, state request.Request, opt Options) (rec
records = append(records, serv.NewPTR(state.QName(), serv.Host))
}
}
- return records, debug, nil
+ return records, nil
}
// NS returns NS records from the backend
-func NS(b ServiceBackend, zone string, state request.Request, opt Options) (records, extra []dns.RR, debug []msg.Service, err error) {
+func NS(b ServiceBackend, zone string, state request.Request, opt Options) (records, extra []dns.RR, err error) {
// NS record for this zone live in a special place, ns.dns.<zone>. Fake our lookup.
// only a tad bit fishy...
old := state.QName()
state.Clear()
state.Req.Question[0].Name = "ns.dns." + zone
- services, debug, err := b.Services(state, false, opt)
+ services, err := b.Services(state, false, opt)
if err != nil {
- return nil, nil, debug, err
+ return nil, nil, err
}
// ... and reset
state.Req.Question[0].Name = old
@@ -365,7 +346,7 @@ func NS(b ServiceBackend, zone string, state request.Request, opt Options) (reco
what, ip := serv.HostType()
switch what {
case dns.TypeCNAME:
- return nil, nil, debug, fmt.Errorf("NS record must be an IP address: %s", serv.Host)
+ return nil, nil, fmt.Errorf("NS record must be an IP address: %s", serv.Host)
case dns.TypeA, dns.TypeAAAA:
serv.Host = msg.Domain(serv.Key)
@@ -373,11 +354,11 @@ func NS(b ServiceBackend, zone string, state request.Request, opt Options) (reco
extra = append(extra, newAddress(serv, serv.Host, ip, what))
}
}
- return records, extra, debug, nil
+ return records, extra, nil
}
// SOA returns a SOA record from the backend.
-func SOA(b ServiceBackend, zone string, state request.Request, opt Options) ([]dns.RR, []msg.Service, error) {
+func SOA(b ServiceBackend, zone string, state request.Request, opt Options) ([]dns.RR, error) {
header := dns.RR_Header{Name: zone, Rrtype: dns.TypeSOA, Ttl: 300, Class: dns.ClassINET}
Mbox := hostmaster + "."
@@ -396,60 +377,22 @@ func SOA(b ServiceBackend, zone string, state request.Request, opt Options) ([]d
Expire: 86400,
Minttl: minTTL,
}
- return []dns.RR{soa}, nil, nil
+ return []dns.RR{soa}, nil
}
// BackendError writes an error response to the client.
-func BackendError(b ServiceBackend, zone string, rcode int, state request.Request, debug []msg.Service, err error, opt Options) (int, error) {
+func BackendError(b ServiceBackend, zone string, rcode int, state request.Request, err error, opt Options) (int, error) {
m := new(dns.Msg)
m.SetRcode(state.Req, rcode)
m.Authoritative, m.RecursionAvailable, m.Compress = true, true, true
- m.Ns, _, _ = SOA(b, zone, state, opt)
- if opt.Debug != "" {
- m.Extra = ServicesToTxt(debug)
- txt := ErrorToTxt(err)
- if txt != nil {
- m.Extra = append(m.Extra, ErrorToTxt(err))
- }
- }
+ m.Ns, _ = SOA(b, zone, state, opt)
+
state.SizeAndDo(m)
state.W.WriteMsg(m)
// Return success as the rcode to signal we have written to the client.
return dns.RcodeSuccess, err
}
-// ServicesToTxt puts debug in TXT RRs.
-func ServicesToTxt(debug []msg.Service) []dns.RR {
- if debug == nil {
- return nil
- }
-
- rr := make([]dns.RR, len(debug))
- for i, d := range debug {
- rr[i] = d.RR()
- }
- return rr
-}
-
-// ErrorToTxt puts in error's text into an TXT RR.
-func ErrorToTxt(err error) dns.RR {
- if err == nil {
- return nil
- }
- msg := err.Error()
- if len(msg) > 255 {
- msg = msg[:255]
- }
- t := new(dns.TXT)
- t.Hdr.Class = dns.ClassCHAOS
- t.Hdr.Ttl = 0
- t.Hdr.Rrtype = dns.TypeTXT
- t.Hdr.Name = "."
-
- t.Txt = []string{msg}
- return t
-}
-
func newAddress(s msg.Service, name string, ip net.IP, what uint16) dns.RR {
hdr := dns.RR_Header{Name: name, Rrtype: what, Class: dns.ClassINET, Ttl: s.TTL}