Skip to content

Commit 1fe37ed

Browse files
authored
Merge pull request #17 from simar7/add-ns1-bindings
dns: Support DNS with NS1
2 parents 581db53 + ca74dba commit 1fe37ed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

62 files changed

+5170
-12
lines changed

Gopkg.lock

+7-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dns.go

+39-11
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,24 @@ import (
44
"fmt"
55

66
"github.com/miekg/dns"
7+
"math/rand"
78
log "github.com/sirupsen/logrus"
9+
ns1 "gopkg.in/ns1/ns1-go.v2/rest"
10+
"net/http"
11+
"time"
12+
"os"
13+
"strings"
814
)
915

16+
var ns1Client *ns1.Client
17+
1018
type dnsServerHandler struct {
1119
ds *dns.Server
1220
}
1321

14-
// TODO: Move in-memory mapping toa real datastore
15-
var records = map[string]string{
16-
"foo.com.": "192.168.0.1",
22+
func getRandomAnswer(max int) int {
23+
rand.Seed(time.Now().Unix())
24+
return rand.Intn(max - 0) + 0
1725
}
1826

1927
func parseQuery(m *dns.Msg) {
@@ -22,16 +30,29 @@ func parseQuery(m *dns.Msg) {
2230
for _, q := range m.Question {
2331
switch q.Qtype {
2432
case dns.TypeA:
25-
rl.Info("Query for: ", q.Name)
26-
ip := records[q.Name]
27-
if ip != "" {
28-
rr, err := dns.NewRR(fmt.Sprintf("%s A %s", q.Name, ip))
33+
zone := q.Name[strings.IndexAny(q.Name, ".")+1:len(q.Name)-1]
34+
domain := q.Name[:strings.LastIndex(q.Name, ".")]
35+
36+
rl.Info("Query for > ", "domain: ", domain, " zone: ", zone, " type: ", q.Qtype)
37+
record, _, err := ns1Client.Records.Get(zone, domain, "A")
38+
if err != nil {
39+
rl.Error("Record: ", q.Name, err)
40+
} else {
41+
rl.Info(record.Answers)
42+
var answers []string
43+
for _, answer := range record.Answers {
44+
answers = append(answers, answer.String())
45+
}
46+
// TODO: Implement RR answer retrieval
47+
rr, err := dns.NewRR(fmt.Sprintf("%s A %s", q.Name, answers[getRandomAnswer(len(answers))]))
2948
if err == nil {
3049
m.Answer = append(m.Answer, rr)
50+
} else {
51+
rl.Error(err)
3152
}
32-
} else {
33-
rl.Error("Record: ", q.Name, " not found")
3453
}
54+
55+
// TODO: Add IPv6 support
3556
default:
3657
rl.Info("Query type: ", q.Qtype, " is currently not supported")
3758
}
@@ -63,12 +84,19 @@ func newDefaultDNSServerHandler() *dnsServerHandler {
6384
ds: newDNSServerHandler(DNS_SERVER_ADDR, DNS_SERVER_PORT, "udp"),
6485
}
6586
}
87+
func init() {
88+
k := os.Getenv("NS1_APIKEY")
89+
if k == "" {
90+
fmt.Println("NS1_APIKEY environment variable is not set, stopping DNS server")
91+
}
92+
httpClient := &http.Client{Timeout: time.Second * 10}
93+
ns1Client = ns1.NewClient(httpClient, ns1.SetAPIKey(k))
94+
}
6695

6796
func (h *dnsServerHandler) RouteDNS() error {
6897
rl := NewLogger(log.New().Writer())
6998

70-
// TODO: Add more domains to the serving list
71-
dns.HandleFunc("com.", serve)
99+
dns.HandleFunc(".", serve)
72100
err := h.ds.ListenAndServe()
73101
if err != nil {
74102
rl.Error("Failed to start DNS server", err)

vendor/gopkg.in/ns1/ns1-go.v2/.gitignore

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/gopkg.in/ns1/ns1-go.v2/.travis.yml

+8
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)