libnetwork: some minor refactoring / cleanup
- don't pass the query's quetion.name separately, as we're already passing the query itself. - remove a "fallthrough" in favor of combining the cases in the switch Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
This commit is contained in:
parent
d86a331fa4
commit
79d6e935ad
|
@ -228,7 +228,8 @@ func createRespMsg(query *dns.Msg) *dns.Msg {
|
||||||
return resp
|
return resp
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *resolver) handleMXQuery(name string, query *dns.Msg) (*dns.Msg, error) {
|
func (r *resolver) handleMXQuery(query *dns.Msg) (*dns.Msg, error) {
|
||||||
|
name := query.Question[0].Name
|
||||||
addrv4, _ := r.backend.ResolveName(name, types.IPv4)
|
addrv4, _ := r.backend.ResolveName(name, types.IPv4)
|
||||||
addrv6, _ := r.backend.ResolveName(name, types.IPv6)
|
addrv6, _ := r.backend.ResolveName(name, types.IPv6)
|
||||||
|
|
||||||
|
@ -244,9 +245,12 @@ func (r *resolver) handleMXQuery(name string, query *dns.Msg) (*dns.Msg, error)
|
||||||
return resp, nil
|
return resp, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *resolver) handleIPQuery(name string, query *dns.Msg, ipType int) (*dns.Msg, error) {
|
func (r *resolver) handleIPQuery(query *dns.Msg, ipType int) (*dns.Msg, error) {
|
||||||
var addr []net.IP
|
var (
|
||||||
var ipv6Miss bool
|
addr []net.IP
|
||||||
|
ipv6Miss bool
|
||||||
|
name = query.Question[0].Name
|
||||||
|
)
|
||||||
addr, ipv6Miss = r.backend.ResolveName(name, ipType)
|
addr, ipv6Miss = r.backend.ResolveName(name, ipType)
|
||||||
|
|
||||||
if addr == nil && ipv6Miss {
|
if addr == nil && ipv6Miss {
|
||||||
|
@ -283,8 +287,11 @@ func (r *resolver) handleIPQuery(name string, query *dns.Msg, ipType int) (*dns.
|
||||||
return resp, nil
|
return resp, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *resolver) handlePTRQuery(ptr string, query *dns.Msg) (*dns.Msg, error) {
|
func (r *resolver) handlePTRQuery(query *dns.Msg) (*dns.Msg, error) {
|
||||||
var parts []string
|
var (
|
||||||
|
parts []string
|
||||||
|
ptr = query.Question[0].Name
|
||||||
|
)
|
||||||
|
|
||||||
if strings.HasSuffix(ptr, ptrIPv4domain) {
|
if strings.HasSuffix(ptr, ptrIPv4domain) {
|
||||||
parts = strings.Split(ptr, ptrIPv4domain)
|
parts = strings.Split(ptr, ptrIPv4domain)
|
||||||
|
@ -314,8 +321,8 @@ func (r *resolver) handlePTRQuery(ptr string, query *dns.Msg) (*dns.Msg, error)
|
||||||
return resp, nil
|
return resp, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *resolver) handleSRVQuery(svc string, query *dns.Msg) (*dns.Msg, error) {
|
func (r *resolver) handleSRVQuery(query *dns.Msg) (*dns.Msg, error) {
|
||||||
|
svc := query.Question[0].Name
|
||||||
srv, ip := r.backend.ResolveService(svc)
|
srv, ip := r.backend.ResolveService(svc)
|
||||||
|
|
||||||
if len(srv) == 0 {
|
if len(srv) == 0 {
|
||||||
|
@ -371,25 +378,26 @@ func (r *resolver) ServeDNS(w dns.ResponseWriter, query *dns.Msg) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
name := query.Question[0].Name
|
queryName := query.Question[0].Name
|
||||||
switch query.Question[0].Qtype {
|
queryType := query.Question[0].Qtype
|
||||||
|
|
||||||
|
switch queryType {
|
||||||
case dns.TypeA:
|
case dns.TypeA:
|
||||||
resp, err = r.handleIPQuery(name, query, types.IPv4)
|
resp, err = r.handleIPQuery(query, types.IPv4)
|
||||||
case dns.TypeAAAA:
|
case dns.TypeAAAA:
|
||||||
resp, err = r.handleIPQuery(name, query, types.IPv6)
|
resp, err = r.handleIPQuery(query, types.IPv6)
|
||||||
case dns.TypeMX:
|
case dns.TypeMX:
|
||||||
resp, err = r.handleMXQuery(name, query)
|
resp, err = r.handleMXQuery(query)
|
||||||
case dns.TypePTR:
|
case dns.TypePTR:
|
||||||
resp, err = r.handlePTRQuery(name, query)
|
resp, err = r.handlePTRQuery(query)
|
||||||
case dns.TypeSRV:
|
case dns.TypeSRV:
|
||||||
resp, err = r.handleSRVQuery(name, query)
|
resp, err = r.handleSRVQuery(query)
|
||||||
default:
|
default:
|
||||||
queryType := dns.TypeToString[query.Question[0].Qtype]
|
logrus.Debugf("[resolver] query type %s is not supported by the embedded DNS and will be forwarded to external DNS", dns.TypeToString[queryType])
|
||||||
logrus.Debugf("[resolver] query type %s is not supported by the embedded DNS and will be forwarded to external DNS", queryType)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logrus.WithError(err).Errorf("[resolver] failed to handle query: %s (%s) from %s", name, dns.TypeToString[query.Question[0].Qtype], extConn.LocalAddr().String())
|
logrus.WithError(err).Errorf("[resolver] failed to handle query: %s (%s) from %s", queryName, dns.TypeToString[queryType], extConn.LocalAddr().String())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -409,11 +417,9 @@ func (r *resolver) ServeDNS(w dns.ResponseWriter, query *dns.Msg) {
|
||||||
// in the root domain don't forward it out. We will return
|
// in the root domain don't forward it out. We will return
|
||||||
// failure and let the client retry with the search domain
|
// failure and let the client retry with the search domain
|
||||||
// attached
|
// attached
|
||||||
switch query.Question[0].Qtype {
|
switch queryType {
|
||||||
case dns.TypeA:
|
case dns.TypeA, dns.TypeAAAA:
|
||||||
fallthrough
|
if r.backend.NdotsSet() && !strings.Contains(strings.TrimSuffix(queryName, "."), ".") {
|
||||||
case dns.TypeAAAA:
|
|
||||||
if r.backend.NdotsSet() && !strings.Contains(strings.TrimSuffix(name, "."), ".") {
|
|
||||||
resp = createRespMsg(query)
|
resp = createRespMsg(query)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -461,8 +467,7 @@ func (r *resolver) ServeDNS(w dns.ResponseWriter, query *dns.Msg) {
|
||||||
logrus.WithField("retries", i).Warnf("[resolver] connect failed: %s", err)
|
logrus.WithField("retries", i).Warnf("[resolver] connect failed: %s", err)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
queryType := dns.TypeToString[query.Question[0].Qtype]
|
logrus.Debugf("[resolver] query %s (%s) from %s, forwarding to %s:%s", queryName, dns.TypeToString[queryType],
|
||||||
logrus.Debugf("[resolver] query %s (%s) from %s, forwarding to %s:%s", name, queryType,
|
|
||||||
extConn.LocalAddr().String(), proto, extDNS.IPStr)
|
extConn.LocalAddr().String(), proto, extDNS.IPStr)
|
||||||
|
|
||||||
// Timeout has to be set for every IO operation.
|
// Timeout has to be set for every IO operation.
|
||||||
|
@ -503,18 +508,18 @@ func (r *resolver) ServeDNS(w dns.ResponseWriter, query *dns.Msg) {
|
||||||
r.forwardQueryEnd()
|
r.forwardQueryEnd()
|
||||||
|
|
||||||
if resp == nil {
|
if resp == nil {
|
||||||
logrus.Debugf("[resolver] external DNS %s:%s returned empty response for %q", proto, extDNS.IPStr, name)
|
logrus.Debugf("[resolver] external DNS %s:%s returned empty response for %q", proto, extDNS.IPStr, queryName)
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
switch resp.Rcode {
|
switch resp.Rcode {
|
||||||
case dns.RcodeServerFailure, dns.RcodeRefused:
|
case dns.RcodeServerFailure, dns.RcodeRefused:
|
||||||
// Server returned FAILURE: continue with the next external DNS server
|
// Server returned FAILURE: continue with the next external DNS server
|
||||||
// Server returned REFUSED: this can be a transitional status, so continue with the next external DNS server
|
// Server returned REFUSED: this can be a transitional status, so continue with the next external DNS server
|
||||||
logrus.Debugf("[resolver] external DNS %s:%s responded with %s for %q", proto, extDNS.IPStr, statusString(resp.Rcode), name)
|
logrus.Debugf("[resolver] external DNS %s:%s responded with %s for %q", proto, extDNS.IPStr, statusString(resp.Rcode), queryName)
|
||||||
continue
|
continue
|
||||||
case dns.RcodeNameError:
|
case dns.RcodeNameError:
|
||||||
// Server returned NXDOMAIN. Stop resolution if it's an authoritative answer (see RFC 8020: https://tools.ietf.org/html/rfc8020#section-2)
|
// Server returned NXDOMAIN. Stop resolution if it's an authoritative answer (see RFC 8020: https://tools.ietf.org/html/rfc8020#section-2)
|
||||||
logrus.Debugf("[resolver] external DNS %s:%s responded with %s for %q", proto, extDNS.IPStr, statusString(resp.Rcode), name)
|
logrus.Debugf("[resolver] external DNS %s:%s responded with %s for %q", proto, extDNS.IPStr, statusString(resp.Rcode), queryName)
|
||||||
if resp.Authoritative {
|
if resp.Authoritative {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
@ -523,7 +528,7 @@ func (r *resolver) ServeDNS(w dns.ResponseWriter, query *dns.Msg) {
|
||||||
// All is well
|
// All is well
|
||||||
default:
|
default:
|
||||||
// Server gave some error. Log the error, and continue with the next external DNS server
|
// Server gave some error. Log the error, and continue with the next external DNS server
|
||||||
logrus.Debugf("[resolver] external DNS %s:%s responded with %s (code %d) for %q", proto, extDNS.IPStr, statusString(resp.Rcode), resp.Rcode, name)
|
logrus.Debugf("[resolver] external DNS %s:%s responded with %s (code %d) for %q", proto, extDNS.IPStr, statusString(resp.Rcode), resp.Rcode, queryName)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
answers := 0
|
answers := 0
|
||||||
|
@ -543,7 +548,7 @@ func (r *resolver) ServeDNS(w dns.ResponseWriter, query *dns.Msg) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if resp.Answer == nil || answers == 0 {
|
if resp.Answer == nil || answers == 0 {
|
||||||
logrus.Debugf("[resolver] external DNS %s:%s did not return any %s records for %q", proto, extDNS.IPStr, queryType, name)
|
logrus.Debugf("[resolver] external DNS %s:%s did not return any %s records for %q", proto, extDNS.IPStr, dns.TypeToString[queryType], queryName)
|
||||||
}
|
}
|
||||||
resp.Compress = true
|
resp.Compress = true
|
||||||
break
|
break
|
||||||
|
@ -554,7 +559,7 @@ func (r *resolver) ServeDNS(w dns.ResponseWriter, query *dns.Msg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if err = w.WriteMsg(resp); err != nil {
|
if err = w.WriteMsg(resp); err != nil {
|
||||||
logrus.WithError(err).Errorf("[resolver] failed to write resolver response")
|
logrus.WithError(err).Errorf("[resolver] failed to write response")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue