2013-07-23 11:10:38 +00:00
|
|
|
|
package main
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"github.com/miekg/dns"
|
|
|
|
|
// "log"
|
2013-07-23 16:37:38 +00:00
|
|
|
|
// "fmt"
|
2013-07-23 11:10:38 +00:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
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) {
|
|
|
|
|
|
2013-07-23 16:37:38 +00:00
|
|
|
|
q := req.Question[0]
|
|
|
|
|
Q := Question{q.Name, dns.TypeToString[q.Qtype], dns.ClassToString[q.Qclass]}
|
2013-07-23 11:10:38 +00:00
|
|
|
|
|
2013-07-23 16:37:38 +00:00
|
|
|
|
Debug("Question: %s", Q.String())
|
2013-07-23 11:10:38 +00:00
|
|
|
|
|
2013-07-23 16:37:38 +00:00
|
|
|
|
mesg, err := h.resolver.Lookup(net, req)
|
2013-07-23 11:10:38 +00:00
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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)
|
|
|
|
|
}
|
2013-07-23 16:37:38 +00:00
|
|
|
|
|
|
|
|
|
type Question struct {
|
|
|
|
|
qname string
|
|
|
|
|
qtype string
|
|
|
|
|
qclass string
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (q *Question) String() string {
|
|
|
|
|
return q.qname + " " + q.qclass + " " + q.qtype
|
|
|
|
|
}
|