blink/v1/pkg/dns/aaaa.go
2024-07-08 02:04:54 +01:00

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
}
}