summaryrefslogblamecommitdiff
path: root/dns/main.go
blob: b3adfca35c9254018d7d0ea502a147267658cdda (plain) (tree)





















































                                                                                              
package dns

import (
	"log"
	"net"

	"github.com/miekg/dns"
)

type Dns struct {
	server dns.Server
	config *dns.ClientConfig
}

func (d *Dns) ServeDNS(w dns.ResponseWriter, req *dns.Msg) {
	var resp *dns.Msg
	var err error
	client := new(dns.Client)

	req.RecursionDesired = true;
	for _, upstream := range d.config.Servers {
		resp, _, err = client.Exchange(req, net.JoinHostPort(upstream, d.config.Port))
		if err == nil {
			break
		}

		log.Printf("dns query: %s", err)
	}

	w.WriteMsg(resp)
}

func New() (*Dns, error) {
	var d Dns
	var err error

	d.server = dns.Server{
		Net: "udp",
		ReusePort: true,
		Handler: &d,
	}

	d.config, err = dns.ClientConfigFromFile("/etc/resolv.conf")
	if err != nil {
		log.Printf("reading resolve.conf: %s", err)
		return nil, err
	}

	return &d, nil
}

func (d *Dns) Run() {
	d.server.ListenAndServe()
}