Merge pull request #2 in DNS/adguard-internal-dns from move_plugin to master

* commit '6bf1e2f7b5532190c38afed68d4e897ac6890f85':
  Lookup replacement -- do it only for A and AAAA, and keep only respective types in.
This commit is contained in:
Eugene Bujak 2018-12-03 19:05:35 +03:00
commit 4dd90363f7

View File

@ -285,34 +285,40 @@ func (p *plug) Collect(ch chan<- prometheus.Metric) {
p.doStats(ch, doMetric) p.doStats(ch, doMetric)
} }
// lookup host, but return answer as if it was a result of origname lookup // lookup host, but return answer as if it was a result of different lookup
func lookupReplaced(host string, origname string) ([]dns.RR, error) { // TODO: works only on A and AAAA, the go stdlib resolver can't do arbitrary types
func lookupReplaced(host string, question dns.Question) ([]dns.RR, error) {
var records []dns.RR var records []dns.RR
var res *net.Resolver // nil resolver is default resolver var res *net.Resolver // nil resolver is default resolver
addrs, err := res.LookupIPAddr(context.TODO(), host) switch question.Qtype {
if err != nil { case dns.TypeA:
return nil, err addrs, err := res.LookupIPAddr(context.TODO(), host)
} if err != nil {
for _, addr := range addrs { return nil, err
ip := addr.IP }
var rr dns.RR for _, addr := range addrs {
var err error if addr.IP.To4() != nil {
if ip.To4() != nil { rr, err := dns.NewRR(fmt.Sprintf("%s A %s", question.Name, addr.IP.String()))
// ipv4 -> A if err != nil {
rr, err = dns.NewRR(fmt.Sprintf("%s A %s", origname, ip.String())) return nil, err // fail entire request, TODO: return partial request?
if err != nil { }
return nil, err // fail entire request records = append(records, rr)
// TODO: return only successful answers? }
} }
} else { case dns.TypeAAAA:
// ipv6 -> AAAA addrs, err := res.LookupIPAddr(context.TODO(), host)
rr, err = dns.NewRR(fmt.Sprintf("%s AAAA %s", origname, ip.String())) if err != nil {
if err != nil { return nil, err
return nil, err // fail entire request }
// TODO: return only successful answers? for _, addr := range addrs {
if addr.IP.To4() == nil {
rr, err := dns.NewRR(fmt.Sprintf("%s AAAA %s", question.Name, addr.IP.String()))
if err != nil {
return nil, err // fail entire request, TODO: return partial request?
}
records = append(records, rr)
} }
} }
records = append(records, rr)
} }
return records, nil return records, nil
} }
@ -333,7 +339,7 @@ func (p *plug) replaceHostWithValAndReply(ctx context.Context, w dns.ResponseWri
} else { } else {
// this is a domain name, need to look it up // this is a domain name, need to look it up
var err error var err error
records, err = lookupReplaced(dns.Fqdn(val), question.Name) records, err = lookupReplaced(dns.Fqdn(val), question)
if err != nil { if err != nil {
log.Printf("Got error %s\n", err) log.Printf("Got error %s\n", err)
return dns.RcodeServerFailure, fmt.Errorf("plugin/dnsfilter: %s", err) return dns.RcodeServerFailure, fmt.Errorf("plugin/dnsfilter: %s", err)