72 lines
1.1 KiB
Go
72 lines
1.1 KiB
Go
|
package dns
|
||
|
|
||
|
import (
|
||
|
"errors"
|
||
|
"fmt"
|
||
|
"math/rand"
|
||
|
"net"
|
||
|
"strings"
|
||
|
|
||
|
"github.com/miekg/dns"
|
||
|
)
|
||
|
|
||
|
// Query AAAA record (ipv6)
|
||
|
func (q *Query) AAAA() {
|
||
|
for {
|
||
|
// Create result
|
||
|
result := &Result{
|
||
|
Domain: q.Domain,
|
||
|
Subdomain: q.Subdomain,
|
||
|
}
|
||
|
|
||
|
// Create message
|
||
|
message := new(dns.Msg)
|
||
|
|
||
|
// Set question
|
||
|
message.SetQuestion(dns.Fqdn(q.Subdomain), dns.TypeAAAA)
|
||
|
|
||
|
// Choose random resolver
|
||
|
resolver := q.Resolvers[rand.Intn(len(q.Resolvers))]
|
||
|
|
||
|
// Query response
|
||
|
resp, _, err := q.Client.Exchange(message, resolver)
|
||
|
if err != nil {
|
||
|
// Ratelimited
|
||
|
if strings.ContainsAny(err.Error(), "i/o timeout") {
|
||
|
continue
|
||
|
}
|
||
|
|
||
|
result.Error = err
|
||
|
q.Results <- result
|
||
|
return
|
||
|
}
|
||
|
|
||
|
// Store IPs
|
||
|
var ips []net.IP
|
||
|
|
||
|
// Go through answers
|
||
|
for _, answer := range resp.Answer {
|
||
|
// Map record
|
||
|
record, ok := answer.(*dns.AAAA)
|
||
|
if !ok {
|
||
|
continue
|
||
|
}
|
||
|
|
||
|
// Append IPv6
|
||
|
ips = append(ips, record.AAAA)
|
||
|
}
|
||
|
|
||
|
// No IPs found
|
||
|
if len(ips) < 1 {
|
||
|
result.Error = errors.New(fmt.Sprintf("No IPv6s found for %s", q.Domain))
|
||
|
q.Results <- result
|
||
|
return
|
||
|
}
|
||
|
|
||
|
// Send result
|
||
|
result.IPv6 = ips
|
||
|
q.Results <- result
|
||
|
return
|
||
|
}
|
||
|
}
|