package dns import ( "errors" "fmt" "math/rand" "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 []string // 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.String()) } // 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 } }