checker: fix GLUE search for external domains
This commit is contained in:
parent
c7a1812c9f
commit
31f871ba67
@ -22,7 +22,10 @@ const (
|
||||
year68 = 1 << 31 // For RFC1982 (Serial Arithmetic) calculations in 32 bits. Taken from miekg/dns
|
||||
)
|
||||
|
||||
var verbose = false
|
||||
var (
|
||||
verbose = false
|
||||
domainsHostingMap = map[string]string{}
|
||||
)
|
||||
|
||||
// ICMP
|
||||
|
||||
@ -48,13 +51,82 @@ func check_ping(ip string, cb func(pkt *ping.Packet)) (err error) {
|
||||
func get_GLUE(domain string) (aaaa net.IP, err error) {
|
||||
client := dns.Client{Net: "tcp", Timeout: time.Second * 5}
|
||||
|
||||
dnssrv := "[2a01:e0a:2b:2250::b]:53"
|
||||
if strings.HasSuffix(domain, adlin.DelegatedDomainSuffix) {
|
||||
dnssrv = "[2a01:e0a:2b:2250::b]:53"
|
||||
} else if v, ok := domainsHostingMap[domain]; ok {
|
||||
dnssrv = v
|
||||
} else {
|
||||
// Looking for root NS
|
||||
m := new(dns.Msg)
|
||||
m.SetQuestion(".", dns.TypeNS)
|
||||
m.RecursionDesired = false
|
||||
m.SetEdns0(4096, true)
|
||||
|
||||
var r *dns.Msg
|
||||
r, _, err = client.Exchange(m, dnssrv)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
if r == nil {
|
||||
return nil, errors.New("response is nil during initial recursion")
|
||||
}
|
||||
if r.Rcode != dns.RcodeSuccess {
|
||||
return nil, errors.New("failed to get a valid answer during initial recursion")
|
||||
}
|
||||
|
||||
for _, answer := range r.Answer {
|
||||
if t, ok := answer.(*dns.NS); ok {
|
||||
dnssrv = t.Ns + ":53"
|
||||
}
|
||||
}
|
||||
// Do casual recursion
|
||||
i := 0
|
||||
recursion:
|
||||
for i = 0; i < 10; i++ {
|
||||
m := new(dns.Msg)
|
||||
m.SetQuestion(domain, dns.TypeNS)
|
||||
m.RecursionDesired = false
|
||||
m.SetEdns0(4096, true)
|
||||
|
||||
var r *dns.Msg
|
||||
r, _, err = client.Exchange(m, "[2a01:e0a:2b:2250::b]:53")
|
||||
r, _, err = client.Exchange(m, dnssrv)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
if r == nil {
|
||||
return nil, errors.New("response is nil during recursion")
|
||||
}
|
||||
if r.Rcode != dns.RcodeSuccess {
|
||||
return nil, errors.New("failed to get a valid answer during recursion")
|
||||
}
|
||||
|
||||
for _, answer := range r.Ns {
|
||||
if t, ok := answer.(*dns.NS); ok {
|
||||
dnssrv = t.Ns + ":53"
|
||||
if t.Header().Name == domain {
|
||||
break recursion
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if i >= 10 {
|
||||
return nil, fmt.Errorf("too much name recursions")
|
||||
} else {
|
||||
domainsHostingMap[domain] = dnssrv
|
||||
}
|
||||
}
|
||||
|
||||
m := new(dns.Msg)
|
||||
m.SetQuestion(domain, dns.TypeNS)
|
||||
m.RecursionDesired = false
|
||||
m.SetEdns0(4096, true)
|
||||
|
||||
var r *dns.Msg
|
||||
r, _, err = client.Exchange(m, dnssrv)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
Reference in New Issue
Block a user