Files
worker/checks/cdns/local_query.go
Gleb Tv 579a14b403
Все проверки выполнены успешно
CI / test (push) Successful in 2m32s
Docker / Build and publish worker image (push) Successful in 20m9s
fix(dns): retry configurable resolvers
Treat resolver transport failures as inconclusive checks so they do not open outage alerts.
2026-07-16 19:30:02 +03:00

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
}