55 lines
1.1 KiB
Go
55 lines
1.1 KiB
Go
|
package main
|
|||
|
|
|||
|
import (
|
|||
|
"github.com/miekg/dns"
|
|||
|
// "log"
|
|||
|
)
|
|||
|
|
|||
|
type GODNSHandler struct {
|
|||
|
resolver *Resolver
|
|||
|
cache *Cache
|
|||
|
}
|
|||
|
|
|||
|
func NewHandler() *GODNSHandler {
|
|||
|
|
|||
|
var (
|
|||
|
clientConfig *dns.ClientConfig
|
|||
|
cacheConfig CacheSettings
|
|||
|
)
|
|||
|
|
|||
|
resolvConfig := settings.ResolvConfig
|
|||
|
clientConfig, err := dns.ClientConfigFromFile(resolvConfig.ResolvFile)
|
|||
|
if err != nil {
|
|||
|
logger.Printf(":%s is not a valid resolv.conf file\n", resolvConfig.ResolvFile)
|
|||
|
logger.Println(err)
|
|||
|
panic(err)
|
|||
|
}
|
|||
|
clientConfig.Timeout = resolvConfig.Timeout
|
|||
|
resolver := &Resolver{clientConfig}
|
|||
|
|
|||
|
cacheConfig = settings.Cache
|
|||
|
cache := &Cache{cacheConfig}
|
|||
|
|
|||
|
return &GODNSHandler{resolver, cache}
|
|||
|
}
|
|||
|
|
|||
|
func (h *GODNSHandler) do(net string, w dns.ResponseWriter, req *dns.Msg) {
|
|||
|
|
|||
|
qname := req.Question[0].Name
|
|||
|
qtype := req.Question[0].Qtype
|
|||
|
qclass := req.Question[0].Qclass
|
|||
|
|
|||
|
Debug("Question: %s %s %s", qname, dns.ClassToString[qclass], dns.TypeToString[qtype])
|
|||
|
|
|||
|
h.resolver.Lookup(net, req)
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
func (h *GODNSHandler) DoTCP(w dns.ResponseWriter, req *dns.Msg) {
|
|||
|
h.do("tcp", w, req)
|
|||
|
}
|
|||
|
|
|||
|
func (h *GODNSHandler) DoUDP(w dns.ResponseWriter, req *dns.Msg) {
|
|||
|
h.do("udp", w, req)
|
|||
|
}
|