-
Notifications
You must be signed in to change notification settings - Fork 0
/
resolver.go
56 lines (50 loc) · 1.26 KB
/
resolver.go
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
55
56
package main
import (
"fmt"
log "github.com/Sirupsen/logrus"
"github.com/gocql/gocql"
"github.com/miekg/dns"
)
type Resolver struct {
Entries map[string]string
c *gocql.ClusterConfig
s *gocql.Session
}
func NewResolver(entries map[string]string, c *gocql.ClusterConfig, s *gocql.Session) *Resolver {
return &Resolver{Entries: entries, c: c, s: s}
}
func (res *Resolver) lookupAnswer(name, qtype string) ([]*dns.RR, error) {
var answers []*dns.RR
var qanswer string
iter := res.s.Query("SELECT answer FROM qanswer WHERE question = ?", fmt.Sprintf("%s-%s", qtype, name)).Iter()
for iter.Scan(&qanswer) {
rra, err := dns.NewRR(qanswer)
if err != nil {
log.Println("Malformed answer:", err)
} else {
answers = append(answers, &rra)
}
}
if err := iter.Close(); err != nil {
log.Println(err)
}
if len(answers) != 0 {
return answers, nil
} else {
return answers, fmt.Errorf("no entries")
}
}
func (res *Resolver) handleRequest(w dns.ResponseWriter, r *dns.Msg) {
m := new(dns.Msg)
m.SetReply(r)
ar, err := res.lookupAnswer(r.Question[0].Name, dns.TypeToString[r.Question[0].Qtype])
if err != nil {
log.Println(err)
dns.HandleFailed(w, r)
return
}
for k, _ := range ar {
m.Answer = append(m.Answer, *ar[k])
}
w.WriteMsg(m)
}