diff --git a/nameserver/server.go b/nameserver/server.go index 896f9e26..61540836 100644 --- a/nameserver/server.go +++ b/nameserver/server.go @@ -9,12 +9,8 @@ import ( const ( LOCAL_DOMAIN = "weave.local." - RDNS_DOMAIN = "in-addr.arpa." ) -// +1 to also exclude a dot -var rdnsDomainLen = len(RDNS_DOMAIN) + 1 - func checkFatal(e error) { if e != nil { Error.Fatal(e) @@ -77,19 +73,14 @@ func rdnsHandler(zone Zone, mdnsClient *MDNSClient) dns.HandlerFunc { q := r.Question[0] Debug.Printf("Local rdns query: %+v", q) if q.Qtype == dns.TypePTR { - if ip := net.ParseIP(q.Name[:len(q.Name)-rdnsDomainLen]); ip != nil { - ip4 := ip.To4() - revIP := []byte{ip4[3], ip4[2], ip4[1], ip4[0]} - Debug.Printf("Looking for address: %+v", revIP) - if name, err := zone.ReverseLookupLocal(revIP); err == nil { - Debug.Printf("Found name: %s", name) - m := makePTRReply(r, &q, []string{name}) - w.WriteMsg(m) - } else { - Debug.Printf("Failed lookup for %s; sending mDNS query", q.Name) - // We don't know the answer; see if someone else does - // TODO - } + if name, err := zone.ReverseLookupLocal(q.Name); err == nil { + Debug.Printf("Found name: %s", name) + m := makePTRReply(r, &q, []string{name}) + w.WriteMsg(m) + } else { + Debug.Printf("Failed lookup for %s; sending mDNS query", q.Name) + // We don't know the answer; see if someone else does + // TODO } } } diff --git a/nameserver/zone.go b/nameserver/zone.go index 44c194b9..82f28f38 100644 --- a/nameserver/zone.go +++ b/nameserver/zone.go @@ -2,16 +2,24 @@ package nameserver import ( "github.com/miekg/dns" + . "github.com/zettio/weave/common" "net" "sync" ) +const ( + RDNS_DOMAIN = "in-addr.arpa." +) + +// +1 to also exclude a dot +var rdnsDomainLen = len(RDNS_DOMAIN) + 1 + type Zone interface { AddRecord(ident string, name string, ip net.IP) error DeleteRecord(ident string, ip net.IP) error DeleteRecordsFor(ident string) error LookupLocal(name string) (net.IP, error) - ReverseLookupLocal(ip net.IP) (string, error) + ReverseLookupLocal(inaddr string) (string, error) } type Record struct { @@ -60,15 +68,23 @@ func (zone *ZoneDb) LookupLocal(name string) (net.IP, error) { return nil, LookupError(name) } -func (zone *ZoneDb) ReverseLookupLocal(ip net.IP) (string, error) { - zone.mx.RLock() - defer zone.mx.RUnlock() - for _, r := range zone.recs { - if r.IP.Equal(ip) { - return r.Name, nil +func (zone *ZoneDb) ReverseLookupLocal(inaddr string) (string, error) { + if revIP := net.ParseIP(inaddr[:len(inaddr)-rdnsDomainLen]); revIP != nil { + revIP4 := revIP.To4() + ip := []byte{revIP4[3], revIP4[2], revIP4[1], revIP4[0]} + Debug.Printf("Looking for address: %+v", ip) + zone.mx.RLock() + defer zone.mx.RUnlock() + for _, r := range zone.recs { + if r.IP.Equal(ip) { + return r.Name, nil + } } + return "", LookupError(inaddr) + } else { + Warning.Printf("Asked to reverse lookup %s", inaddr) + return "", LookupError(inaddr) } - return "", LookupError(ip.String()) } func (zone *ZoneDb) AddRecord(ident string, name string, ip net.IP) error { diff --git a/nameserver/zone_test.go b/nameserver/zone_test.go index 6d99cf2a..86db36ec 100644 --- a/nameserver/zone_test.go +++ b/nameserver/zone_test.go @@ -35,7 +35,7 @@ func TestZone(t *testing.T) { } // See if we can find the address by IP. - foundName, err := zone.ReverseLookupLocal(ip) + foundName, err := zone.ReverseLookupLocal("1.2.0.10.in-addr.arpa.") wt.AssertNoErr(t, err) if foundName != successTestName {