func (s *DNSServer) handlePTRRequest(r *dns.Msg, m *dns.Msg) { m.Answer = make([]dns.RR, 0, 2) query := r.Question[0].Name if query[len(query)-1] == '.' { query = query[:len(query)-1] } for service := range s.queryIp(query) { var ttl int if service.Ttl != -1 { ttl = service.Ttl } else { ttl = s.config.ttl } for domain := range s.listDomains(service) { rr := new(dns.PTR) rr.Hdr = dns.RR_Header{ Name: r.Question[0].Name, Rrtype: dns.TypePTR, Class: dns.ClassINET, Ttl: uint32(ttl), } rr.Ptr = domain m.Answer = append(m.Answer, rr) } } }
func (r *resolver) handlePTRQuery(ptr string, query *dns.Msg) (*dns.Msg, error) { parts := []string{} if strings.HasSuffix(ptr, ptrIPv4domain) { parts = strings.Split(ptr, ptrIPv4domain) } else if strings.HasSuffix(ptr, ptrIPv6domain) { parts = strings.Split(ptr, ptrIPv6domain) } else { return nil, fmt.Errorf("invalid PTR query, %v", ptr) } host := r.backend.ResolveIP(parts[0]) if len(host) == 0 { return nil, nil } logrus.Debugf("Lookup for IP %s: name %s", parts[0], host) fqdn := dns.Fqdn(host) resp := new(dns.Msg) resp.SetReply(query) setCommonFlags(resp) rr := new(dns.PTR) rr.Hdr = dns.RR_Header{Name: ptr, Rrtype: dns.TypePTR, Class: dns.ClassINET, Ttl: respTTL} rr.Ptr = fqdn resp.Answer = append(resp.Answer, rr) return resp, nil }
func PtrRecord(pv *usage.ProjectVersion) *dns.PTR { latest := usage.FormatV1(&usage.ProjectVersion{pv.Project, "latest"}) rr := new(dns.PTR) rr.Hdr = dns.RR_Header{Name: latest, Rrtype: dns.TypePTR, Ttl: 0} rr.Ptr = usage.FormatV1(pv) return rr }
func (s *DNSServer) handleReverseRequest(w dns.ResponseWriter, r *dns.Msg) { m := new(dns.Msg) m.SetReply(r) // Send empty response for empty requests if len(r.Question) == 0 { m.Ns = s.createSOA() w.WriteMsg(m) return } m.Answer = make([]dns.RR, 0, 2) query := r.Question[0].Name // trim off any trailing dot if query[len(query)-1] == '.' { query = query[:len(query)-1] } for service := range s.queryIp(query) { if r.Question[0].Qtype != dns.TypePTR { m.Ns = s.createSOA() w.WriteMsg(m) return } var ttl int if service.Ttl != -1 { ttl = service.Ttl } else { ttl = s.config.ttl } for domain := range s.listDomains(service) { rr := new(dns.PTR) rr.Hdr = dns.RR_Header{ Name: r.Question[0].Name, Rrtype: dns.TypePTR, Class: dns.ClassINET, Ttl: uint32(ttl), } rr.Ptr = domain m.Answer = append(m.Answer, rr) } } if len(m.Answer) != 0 { w.WriteMsg(m) } else { // We didn't find a record corresponding to the query, // try forwarding s.handleForward(w, r) } }
func dnsPtrRecord(query *dns.Msg, name string, hosts []string) *dns.Msg { resp := new(dns.Msg) resp.SetReply(query) for _, host := range hosts { rr := new(dns.PTR) rr.Hdr = dns.RR_Header{Name: name, Rrtype: dns.TypePTR, Class: dns.ClassINET, Ttl: 0} rr.Ptr = host resp.Answer = append(resp.Answer, rr) } return resp }
func (s *server) PTRRecords(q dns.Question) (records []dns.RR, err error) { name := strings.ToLower(q.Name) result, err := s.hosts.FindReverse(name) if err != nil { return nil, err } if result != "" { r := new(dns.PTR) r.Hdr = dns.RR_Header{Name: q.Name, Rrtype: dns.TypePTR, Class: dns.ClassINET, Ttl: s.config.HostsTtl} r.Ptr = result records = append(records, r) } return records, nil }
func answerPTR(q *dns.Question, v *DNSValue) dns.RR { answer := new(dns.PTR) answer.Header().Name = q.Name answer.Header().Rrtype = dns.TypePTR answer.Header().Class = dns.ClassINET answer.Ptr = strings.TrimSuffix(v.Value, ".") + "." return answer }