summaryrefslogtreecommitdiff
path: root/dns/main.go
blob: b3adfca35c9254018d7d0ea502a147267658cdda (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
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()
}