From 361ed1b4a6ba5dc3db488b4a22253d1508a7ac77 Mon Sep 17 00:00:00 2001 From: Tom Wilkie Date: Tue, 14 Jul 2015 13:51:29 +0000 Subject: [PATCH] Resolve unqualified domains in the weave.local domain. --- nameserver/dns.go | 24 +++++++++++++++++++----- test/230_dns_unqualified_test.sh | 12 ++++++------ test/config.sh | 9 +++------ 3 files changed, 28 insertions(+), 17 deletions(-) diff --git a/nameserver/dns.go b/nameserver/dns.go index af437897..c2868aa2 100644 --- a/nameserver/dns.go +++ b/nameserver/dns.go @@ -129,7 +129,11 @@ func (d *DNSServer) handleLocal(defaultMaxResponseSize int) func(dns.ResponseWri return } - hostname := req.Question[0].Name + hostname := dns.Fqdn(req.Question[0].Name) + if strings.Count(hostname, ".") == 1 { + hostname = hostname + d.domain + } + addrs := d.ns.Lookup(hostname) response := dns.Msg{} @@ -139,7 +143,7 @@ func (d *DNSServer) handleLocal(defaultMaxResponseSize int) func(dns.ResponseWri response.Answer = make([]dns.RR, len(addrs)) header := dns.RR_Header{ - Name: hostname, + Name: req.Question[0].Name, Rrtype: dns.TypeA, Class: dns.ClassINET, Ttl: d.ttl, @@ -211,15 +215,25 @@ func (d *DNSServer) handleReverse(client *dns.Client, defaultMaxResponseSize int func (d *DNSServer) handleRecursive(client *dns.Client, defaultMaxResponseSize int) func(dns.ResponseWriter, *dns.Msg) { return func(w dns.ResponseWriter, req *dns.Msg) { - d.ns.debugf("recursive cdrequest: %+v", *req) + d.ns.debugf("recursive request: %+v", *req) + + // Resolve unqualified names locally + if len(req.Question) == 1 && req.Question[0].Qtype == dns.TypeA { + hostname := dns.Fqdn(req.Question[0].Name) + if strings.Count(hostname, ".") == 1 { + d.handleLocal(defaultMaxResponseSize)(w, req) + return + } + } + for _, server := range d.upstream.Servers { response, _, err := client.Exchange(req, fmt.Sprintf("%s:%s", server, d.upstream.Port)) if err != nil || response == nil { - d.ns.debugf("network error trying %s (%s)", server, err) + d.ns.debugf("error trying %s: %v", server, err) continue } if response.Rcode != dns.RcodeSuccess && !response.Authoritative { - d.ns.debugf("network error trying %s (%s)", server, err) + d.ns.debugf("non-authoritative error trying %s: %v", server, response.Rcode) continue } d.ns.debugf("response: %+v", response) diff --git a/test/230_dns_unqualified_test.sh b/test/230_dns_unqualified_test.sh index 146af9c3..0283d73f 100755 --- a/test/230_dns_unqualified_test.sh +++ b/test/230_dns_unqualified_test.sh @@ -18,12 +18,12 @@ start_container_with_dns $HOST1 $C2/24 --name=c2 -h seetwo.$DOMAIN start_container_with_dns $HOST1 $C3/24 --name=c3 --dns-search=$DOMAIN container=$(start_container_with_dns $HOST1 $C4/24) -check() { - assert "exec_on $HOST1 $1 getent hosts seeone | tr -s ' '" "$C1 $NAME" -} +assert_dns_a_record $HOST1 c2 seeone $C1 $NAME +assert_dns_a_record $HOST1 c3 seeone $C1 $NAME +assert_dns_a_record $HOST1 "$container" seeone $C1 $NAME -check c2 -check c3 -check "$container" +# check that unqualified names are automatically qualified for broken resolvers +weave_on $HOST1 dns-add $C1 c1 -h mysql.weave.local +assert_dns_a_record $HOST1 c1 mysql $C1 end_suite diff --git a/test/config.sh b/test/config.sh index e9e4a49b..ffdfe652 100644 --- a/test/config.sh +++ b/test/config.sh @@ -43,10 +43,6 @@ CHECK_ETHWE_UP="grep ^1$ /sys/class/net/ethwe/carrier" DOCKER_PORT=2375 -WEAVEDNS_ARGS="--no-cache" -[ -n "$DEBUG" ] && WEAVEDNS_ARGS="$WEAVEDNS_ARGS --log-level=debug" - - upload_executable() { host=$1 file=$2 @@ -182,9 +178,10 @@ assert_no_dns_record() { assert_raises "exec_on $host $container getent hosts $name" 2 } -# assert_dns_a_record +# assert_dns_a_record [] assert_dns_a_record() { - assert "exec_on $1 $2 getent hosts $3 | tr -s ' '" "$4 $3" + exp_name=${5:-$3} + assert "exec_on $1 $2 getent hosts $3 | tr -s ' ' | cut -d ' ' -f 1,2" "$4 $exp_name" } # assert_dns_ptr_record