You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
gserver/dns.go

128 lines
2.1 KiB
Go

// +build unix
8 years ago
package main
import (
"fmt"
"github.com/miekg/dns"
"log"
"time"
)
var clientConfig *dns.ClientConfig
var dnsClient *dns.Client
func lookupHost(host string) ([]string, error) {
var result = []string{}
var err error
ret, err1 := getAAAA(host)
if err1 == nil {
result = append(result, ret...)
} else {
err = err1
}
ret1, err2 := getA(host)
if err2 == nil {
result = append(result, ret1...)
} else {
err = err2
}
if len(result) > 0 {
return result, nil
}
if err == nil {
return nil, fmt.Errorf("dns lookup failed for %s", host)
}
return nil, err
}
func getA(host string) ([]string, error) {
var err error
var msg *dns.Msg
var result = []string{}
m := new(dns.Msg)
m.SetQuestion(dns.Fqdn(host), dns.TypeA)
for _, srv := range clientConfig.Servers {
dnsserver := fmt.Sprintf("%s:%s", srv, clientConfig.Port)
msg, _, err = dnsClient.Exchange(m, dnsserver)
if err == nil {
break
} else {
log.Println(err)
}
}
if err != nil {
return result, err
}
for _, rr := range msg.Answer {
if a, ok := rr.(*dns.A); ok {
result = append(result, a.A.String())
}
}
return result, nil
}
func getAAAA(host string) ([]string, error) {
var err error
var msg *dns.Msg
var result = []string{}
m := new(dns.Msg)
m.SetQuestion(dns.Fqdn(host), dns.TypeAAAA)
for _, srv := range clientConfig.Servers {
dnsserver := fmt.Sprintf("%s:%s", srv, clientConfig.Port)
msg, _, err = dnsClient.Exchange(m, dnsserver)
if err == nil {
break
} else {
log.Println(err)
}
}
if err != nil {
return result, err
}
for _, rr := range msg.Answer {
if aaaa, ok := rr.(*dns.AAAA); ok {
result = append(result, aaaa.AAAA.String())
}
}
return result, nil
}
func init() {
var err error
clientConfig, err = dns.ClientConfigFromFile("/etc/resolv.conf")
if err != nil {
clientConfig = &dns.ClientConfig{
Servers: []string{"8.8.8.8", "4.2.2.2"},
Port: "53",
Ndots: 1,
Timeout: 2,
Attempts: 3,
}
}
//clientConfig.Port = "53"
dnsClient = &dns.Client{
Net: "udp",
Timeout: time.Duration(clientConfig.Timeout) * time.Second,
UDPSize: 4096,
}
}