func RecursiveNS(hostname string) (string, error) { fulldomain := dns.Fqdn(hostname) c := &dns.Client{Net: "udp"} labels := dns.SplitLabels(fulldomain) return recurseNS(c, fulldomain, labels) }
func serve(w dns.ResponseWriter, req *dns.Msg, z *dns.Zone) { if z == nil { panic("fksd: no zone") } m := new(dns.Msg) // Just NACK ANYs if req.Question[0].Qtype == dns.TypeANY { m.SetRcode(req, dns.RcodeServerFailure) ednsFromRequest(req, m) w.WriteMsg(m) return } logPrintf("[zone %s] incoming %s %s %d from %s\n", z.Origin, req.Question[0].Name, dns.TypeToString[req.Question[0].Qtype], req.MsgHdr.Id, w.RemoteAddr()) node, exact, ref := z.FindFunc(req.Question[0].Name, func(n interface{}) bool { return n.(*dns.ZoneData).NonAuth }) if ref { logPrintf("[zone %s] referral due\n", z.Origin) m.SetReply(req) m.Ns = node.RR[dns.TypeNS] for _, n := range m.Ns { if dns.IsSubDomain(n.(*dns.NS).Ns, n.Header().Name) { findGlue(m, z, n.(*dns.NS).Ns) } } ednsFromRequest(req, m) w.WriteMsg(m) return } if exact { exactMatch(w, req, m, z, node) return } // Not an exact match nor an referral if z.Wildcard > 0 { lx := dns.SplitLabels(req.Question[0].Name) wc := "*." + strings.Join(lx[1:], ".") node, exact = z.Find(wc) if exact { logPrintf("[zone %s] wildcard answer\n", z.Origin) // as exact,but not complete -- only the last part } } nameerror(w, m, req) return }
func getQuestionName(z *Zone, req *dns.Msg) string { lx := dns.SplitLabels(req.Question[0].Name) ql := lx[0 : len(lx)-z.LenLabels] return strings.ToLower(strings.Join(ql, ".")) }