package dns import ( "errors" "fmt" "math/rand" "net" "strings" "github.com/miekg/dns" ) // Query A record (ipv4) func (q *Query) A() { 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.TypeA) // 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.A) if !ok { continue } // Append IPv4 ips = append(ips, record.A) } // No IPs found if len(ips) < 1 { result.Error = errors.New(fmt.Sprintf("No IPv4s found for %s", q.Domain)) q.Results <- result return } // Send result result.IPv4 = ips q.Results <- result return } }