Skip to content

Commit

Permalink
Merge pull request #17 from simar7/add-ns1-bindings
Browse files Browse the repository at this point in the history
dns: Support DNS with NS1
  • Loading branch information
simar7 committed Dec 20, 2017
2 parents 581db53 + ca74dba commit 1fe37ed
Show file tree
Hide file tree
Showing 62 changed files with 5,170 additions and 12 deletions.
8 changes: 7 additions & 1 deletion Gopkg.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

50 changes: 39 additions & 11 deletions dns.go
Expand Up @@ -4,16 +4,24 @@ import (
"fmt"

"github.com/miekg/dns"
"math/rand"
log "github.com/sirupsen/logrus"
ns1 "gopkg.in/ns1/ns1-go.v2/rest"
"net/http"
"time"
"os"
"strings"
)

var ns1Client *ns1.Client

type dnsServerHandler struct {
ds *dns.Server
}

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

func parseQuery(m *dns.Msg) {
Expand All @@ -22,16 +30,29 @@ func parseQuery(m *dns.Msg) {
for _, q := range m.Question {
switch q.Qtype {
case dns.TypeA:
rl.Info("Query for: ", q.Name)
ip := records[q.Name]
if ip != "" {
rr, err := dns.NewRR(fmt.Sprintf("%s A %s", q.Name, ip))
zone := q.Name[strings.IndexAny(q.Name, ".")+1:len(q.Name)-1]
domain := q.Name[:strings.LastIndex(q.Name, ".")]

rl.Info("Query for > ", "domain: ", domain, " zone: ", zone, " type: ", q.Qtype)
record, _, err := ns1Client.Records.Get(zone, domain, "A")
if err != nil {
rl.Error("Record: ", q.Name, err)
} else {
rl.Info(record.Answers)
var answers []string
for _, answer := range record.Answers {
answers = append(answers, answer.String())
}
// TODO: Implement RR answer retrieval
rr, err := dns.NewRR(fmt.Sprintf("%s A %s", q.Name, answers[getRandomAnswer(len(answers))]))
if err == nil {
m.Answer = append(m.Answer, rr)
} else {
rl.Error(err)
}
} else {
rl.Error("Record: ", q.Name, " not found")
}

// TODO: Add IPv6 support
default:
rl.Info("Query type: ", q.Qtype, " is currently not supported")
}
Expand Down Expand Up @@ -63,12 +84,19 @@ func newDefaultDNSServerHandler() *dnsServerHandler {
ds: newDNSServerHandler(DNS_SERVER_ADDR, DNS_SERVER_PORT, "udp"),
}
}
func init() {
k := os.Getenv("NS1_APIKEY")
if k == "" {
fmt.Println("NS1_APIKEY environment variable is not set, stopping DNS server")
}
httpClient := &http.Client{Timeout: time.Second * 10}
ns1Client = ns1.NewClient(httpClient, ns1.SetAPIKey(k))
}

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

// TODO: Add more domains to the serving list
dns.HandleFunc("com.", serve)
dns.HandleFunc(".", serve)
err := h.ds.ListenAndServe()
if err != nil {
rl.Error("Failed to start DNS server", err)
Expand Down
1 change: 1 addition & 0 deletions vendor/gopkg.in/ns1/ns1-go.v2/.gitignore

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions vendor/gopkg.in/ns1/ns1-go.v2/.travis.yml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit 1fe37ed

Please sign in to comment.