Все проверки выполнены успешно
CI / test (push) Successful in 2m32s
Docker / Build and publish worker image (push) Successful in 20m9s
Treat resolver transport failures as inconclusive checks so they do not open outage alerts.
54 строки
1.4 KiB
Go
54 строки
1.4 KiB
Go
package cdns
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"log"
|
|
|
|
"github.com/miekg/dns"
|
|
)
|
|
|
|
func localQuery(mychan chan DNSreply, qname string, qtype uint16) {
|
|
if debug {
|
|
fmt.Printf("DEBUG: start of DNS request \"%s\" / %d\n", qname, qtype)
|
|
}
|
|
var result DNSreply
|
|
result.qname = qname
|
|
result.qtype = qtype
|
|
result.r = nil
|
|
result.err = errors.New("no name server to answer the question")
|
|
localm := new(dns.Msg)
|
|
localm.Id = dns.Id()
|
|
localm.RecursionDesired = true
|
|
localm.Question = make([]dns.Question, 1)
|
|
localm.SetEdns0(bufsize, false) // Even if no EDNS requested, see #9 May be we should retry without it if timeout?
|
|
localm.Question[0] = dns.Question{Name: qname, Qtype: qtype, Qclass: dns.ClassINET}
|
|
for _, server := range conf.Servers {
|
|
result.nameserver = server
|
|
localc := &dns.Client{ReadTimeout: timeout}
|
|
// Brackets are required for IPv6; do not use net.JoinHostPort (see check-soa commit 3e4edb1).
|
|
r, rtt, err := localc.Exchange(localm, "["+server+"]:"+conf.Port)
|
|
if err != nil || r == nil {
|
|
result.r = nil
|
|
result.err = err
|
|
if err != nil {
|
|
log.Println(err)
|
|
}
|
|
continue
|
|
}
|
|
result.rtt = rtt
|
|
if r.Rcode == dns.RcodeSuccess {
|
|
result.r = r
|
|
result.err = nil
|
|
break
|
|
}
|
|
result.r = r
|
|
result.err = errors.New(dns.RcodeToString[r.Rcode])
|
|
break
|
|
}
|
|
if debug {
|
|
fmt.Printf("DEBUG: end of DNS request \"%s\" / %d\n", qname, qtype)
|
|
}
|
|
mychan <- result
|
|
}
|