diff options
Diffstat (limited to 'plugin/backend_lookup.go')
-rw-r--r-- | plugin/backend_lookup.go | 67 |
1 files changed, 34 insertions, 33 deletions
diff --git a/plugin/backend_lookup.go b/plugin/backend_lookup.go index 0649ccfa5..096cf806b 100644 --- a/plugin/backend_lookup.go +++ b/plugin/backend_lookup.go @@ -1,6 +1,7 @@ package plugin import ( + "context" "fmt" "math" "net" @@ -13,8 +14,8 @@ 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, err error) { - services, err := checkForApex(b, zone, state, opt) +func A(ctx context.Context, b ServiceBackend, zone string, state request.Request, previousRecords []dns.RR, opt Options) (records []dns.RR, err error) { + services, err := checkForApex(ctx, b, zone, state, opt) if err != nil { return nil, err } @@ -43,7 +44,7 @@ func A(b ServiceBackend, zone string, state request.Request, previousRecords []d if dns.IsSubDomain(zone, dns.Fqdn(serv.Host)) { state1 := state.NewWithQuestion(serv.Host, state.QType()) state1.Zone = zone - nextRecords, err := A(b, zone, state1, append(previousRecords, newRecord), opt) + nextRecords, err := A(ctx, 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. @@ -57,7 +58,7 @@ func A(b ServiceBackend, zone string, state request.Request, previousRecords []d // This means we can not complete the CNAME, try to look else where. target := newRecord.Target // Lookup - m1, e1 := b.Lookup(state, target, state.QType()) + m1, e1 := b.Lookup(ctx, state, target, state.QType()) if e1 != nil { continue } @@ -80,8 +81,8 @@ func A(b ServiceBackend, zone string, state request.Request, previousRecords []d } // 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, err error) { - services, err := checkForApex(b, zone, state, opt) +func AAAA(ctx context.Context, b ServiceBackend, zone string, state request.Request, previousRecords []dns.RR, opt Options) (records []dns.RR, err error) { + services, err := checkForApex(ctx, b, zone, state, opt) if err != nil { return nil, err } @@ -111,7 +112,7 @@ func AAAA(b ServiceBackend, zone string, state request.Request, previousRecords if dns.IsSubDomain(zone, dns.Fqdn(serv.Host)) { state1 := state.NewWithQuestion(serv.Host, state.QType()) state1.Zone = zone - nextRecords, err := AAAA(b, zone, state1, append(previousRecords, newRecord), opt) + nextRecords, err := AAAA(ctx, 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. @@ -124,7 +125,7 @@ func AAAA(b ServiceBackend, zone string, state request.Request, previousRecords } // This means we can not complete the CNAME, try to look else where. target := newRecord.Target - m1, e1 := b.Lookup(state, target, state.QType()) + m1, e1 := b.Lookup(ctx, state, target, state.QType()) if e1 != nil { continue } @@ -149,8 +150,8 @@ func AAAA(b ServiceBackend, zone string, state request.Request, previousRecords // 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, err error) { - services, err := b.Services(state, false, opt) +func SRV(ctx context.Context, b ServiceBackend, zone string, state request.Request, opt Options) (records, extra []dns.RR, err error) { + services, err := b.Services(ctx, state, false, opt) if err != nil { return nil, nil, err } @@ -199,12 +200,12 @@ func SRV(b ServiceBackend, zone string, state request.Request, opt Options) (rec lookup[srv.Target] = struct{}{} if !dns.IsSubDomain(zone, srv.Target) { - m1, e1 := b.Lookup(state, srv.Target, dns.TypeA) + m1, e1 := b.Lookup(ctx, state, srv.Target, dns.TypeA) if e1 == nil { extra = append(extra, m1.Answer...) } - m1, e1 = b.Lookup(state, srv.Target, dns.TypeAAAA) + m1, e1 = b.Lookup(ctx, state, srv.Target, dns.TypeAAAA) if e1 == nil { // If we have seen CNAME's we *assume* that they are already added. for _, a := range m1.Answer { @@ -218,7 +219,7 @@ func SRV(b ServiceBackend, zone string, state request.Request, opt Options) (rec // 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, e1 := A(b, zone, state1, nil, opt) + addr, e1 := A(ctx, b, zone, state1, nil, opt) if e1 == nil { extra = append(extra, addr...) } @@ -242,8 +243,8 @@ func SRV(b ServiceBackend, zone string, state request.Request, opt Options) (rec } // 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, err error) { - services, err := b.Services(state, false, opt) +func MX(ctx context.Context, b ServiceBackend, zone string, state request.Request, opt Options) (records, extra []dns.RR, err error) { + services, err := b.Services(ctx, state, false, opt) if err != nil { return nil, nil, err } @@ -266,12 +267,12 @@ func MX(b ServiceBackend, zone string, state request.Request, opt Options) (reco lookup[mx.Mx] = struct{}{} if !dns.IsSubDomain(zone, mx.Mx) { - m1, e1 := b.Lookup(state, mx.Mx, dns.TypeA) + m1, e1 := b.Lookup(ctx, state, mx.Mx, dns.TypeA) if e1 == nil { extra = append(extra, m1.Answer...) } - m1, e1 = b.Lookup(state, mx.Mx, dns.TypeAAAA) + m1, e1 = b.Lookup(ctx, state, mx.Mx, dns.TypeAAAA) if e1 == nil { // If we have seen CNAME's we *assume* that they are already added. for _, a := range m1.Answer { @@ -284,7 +285,7 @@ func MX(b ServiceBackend, zone string, state request.Request, opt Options) (reco } // Internal name state1 := state.NewWithQuestion(mx.Mx, dns.TypeA) - addr, e1 := A(b, zone, state1, nil, opt) + addr, e1 := A(ctx, b, zone, state1, nil, opt) if e1 == nil { extra = append(extra, addr...) } @@ -308,8 +309,8 @@ func MX(b ServiceBackend, zone string, state request.Request, opt Options) (reco } // CNAME returns CNAME records from the backend or an error. -func CNAME(b ServiceBackend, zone string, state request.Request, opt Options) (records []dns.RR, err error) { - services, err := b.Services(state, true, opt) +func CNAME(ctx context.Context, b ServiceBackend, zone string, state request.Request, opt Options) (records []dns.RR, err error) { + services, err := b.Services(ctx, state, true, opt) if err != nil { return nil, err } @@ -324,8 +325,8 @@ func CNAME(b ServiceBackend, zone string, state request.Request, opt Options) (r } // TXT returns TXT records from Backend or an error. -func TXT(b ServiceBackend, zone string, state request.Request, opt Options) (records []dns.RR, err error) { - services, err := b.Services(state, false, opt) +func TXT(ctx context.Context, b ServiceBackend, zone string, state request.Request, opt Options) (records []dns.RR, err error) { + services, err := b.Services(ctx, state, false, opt) if err != nil { return nil, err } @@ -337,8 +338,8 @@ func TXT(b ServiceBackend, zone string, state request.Request, opt Options) (rec } // 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, err error) { - services, err := b.Reverse(state, true, opt) +func PTR(ctx context.Context, b ServiceBackend, zone string, state request.Request, opt Options) (records []dns.RR, err error) { + services, err := b.Reverse(ctx, state, true, opt) if err != nil { return nil, err } @@ -357,14 +358,14 @@ func PTR(b ServiceBackend, zone string, state request.Request, opt Options) (rec } // NS returns NS records from the backend -func NS(b ServiceBackend, zone string, state request.Request, opt Options) (records, extra []dns.RR, err error) { +func NS(ctx context.Context, 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, err := b.Services(state, false, opt) + services, err := b.Services(ctx, state, false, opt) if err != nil { return nil, nil, err } @@ -387,7 +388,7 @@ func NS(b ServiceBackend, zone string, state request.Request, opt Options) (reco } // SOA returns a SOA record from the backend. -func SOA(b ServiceBackend, zone string, state request.Request, opt Options) ([]dns.RR, error) { +func SOA(ctx context.Context, b ServiceBackend, zone string, state request.Request, opt Options) ([]dns.RR, error) { minTTL := b.MinTTL(state) ttl := uint32(300) if minTTL < ttl { @@ -416,11 +417,11 @@ func SOA(b ServiceBackend, zone string, state request.Request, opt Options) ([]d } // BackendError writes an error response to the client. -func BackendError(b ServiceBackend, zone string, rcode int, state request.Request, err error, opt Options) (int, error) { +func BackendError(ctx context.Context, 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 = true - m.Ns, _ = SOA(b, zone, state, opt) + m.Ns, _ = SOA(ctx, b, zone, state, opt) state.W.WriteMsg(m) // Return success as the rcode to signal we have written to the client. @@ -439,9 +440,9 @@ func newAddress(s msg.Service, name string, ip net.IP, what uint16) dns.RR { } // checkForApex checks the special apex.dns directory for records that will be returned as A or AAAA. -func checkForApex(b ServiceBackend, zone string, state request.Request, opt Options) ([]msg.Service, error) { +func checkForApex(ctx context.Context, b ServiceBackend, zone string, state request.Request, opt Options) ([]msg.Service, error) { if state.Name() != zone { - return b.Services(state, false, opt) + return b.Services(ctx, state, false, opt) } // If the zone name itself is queried we fake the query to search for a special entry @@ -450,14 +451,14 @@ func checkForApex(b ServiceBackend, zone string, state request.Request, opt Opti state.Clear() state.Req.Question[0].Name = dnsutil.Join("apex.dns", zone) - services, err := b.Services(state, false, opt) + services, err := b.Services(ctx, state, false, opt) if err == nil { state.Req.Question[0].Name = old return services, err } state.Req.Question[0].Name = old - return b.Services(state, false, opt) + return b.Services(ctx, state, false, opt) } // item holds records. |