|
@@ -6,13 +6,23 @@ import (
|
|
"log"
|
|
"log"
|
|
"os"
|
|
"os"
|
|
"os/signal"
|
|
"os/signal"
|
|
|
|
+ "strings"
|
|
)
|
|
)
|
|
|
|
|
|
|
|
+func getQuestionName(z *Zone, req *dns.Msg) string {
|
|
|
|
+ lx := dns.SplitLabels(req.Question[0].Name)
|
|
|
|
+ ql := lx[0 : len(lx)-z.LenLabels-1]
|
|
|
|
+ //fmt.Println("LX:", ql, lx, z.LenLabels)
|
|
|
|
+ return strings.Join(ql, ".")
|
|
|
|
+}
|
|
|
|
+
|
|
func serve(w dns.ResponseWriter, req *dns.Msg, z *Zone, opt *Options) {
|
|
func serve(w dns.ResponseWriter, req *dns.Msg, z *Zone, opt *Options) {
|
|
logPrintf("[zone %s] incoming %s %s %d from %s\n", z.Origin, req.Question[0].Name, dns.Rr_str[req.Question[0].Qtype], req.MsgHdr.Id, w.RemoteAddr())
|
|
logPrintf("[zone %s] incoming %s %s %d from %s\n", z.Origin, req.Question[0].Name, dns.Rr_str[req.Question[0].Qtype], req.MsgHdr.Id, w.RemoteAddr())
|
|
|
|
|
|
fmt.Println("Got request", req)
|
|
fmt.Println("Got request", req)
|
|
|
|
|
|
|
|
+ label := getQuestionName(z, req)
|
|
|
|
+
|
|
raddr := w.RemoteAddr()
|
|
raddr := w.RemoteAddr()
|
|
|
|
|
|
gi := setupGeoIP()
|
|
gi := setupGeoIP()
|
|
@@ -24,25 +34,32 @@ func serve(w dns.ResponseWriter, req *dns.Msg, z *Zone, opt *Options) {
|
|
m.MsgHdr.Authoritative = true
|
|
m.MsgHdr.Authoritative = true
|
|
|
|
|
|
// TODO: Function to find appropriate label with records
|
|
// TODO: Function to find appropriate label with records
|
|
- if region, ok := z.Labels[""]; ok {
|
|
|
|
- fmt.Println("REG", region)
|
|
|
|
- if region_rr := region.Records[req.Question[0].Qtype]; region_rr != nil {
|
|
|
|
- //fmt.Printf("REGION_RR %T %v\n", region_rr, region_rr)
|
|
|
|
- max := len(region_rr)
|
|
|
|
- if max > 4 {
|
|
|
|
- max = 4
|
|
|
|
- }
|
|
|
|
- servers := region_rr[0:max]
|
|
|
|
- var rrs []dns.RR
|
|
|
|
- for _, record := range servers {
|
|
|
|
- rr := record.RR
|
|
|
|
- fmt.Println("RR", rr)
|
|
|
|
- rr.Header().Name = req.Question[0].Name
|
|
|
|
- fmt.Println(rr)
|
|
|
|
- rrs = append(rrs, rr)
|
|
|
|
- }
|
|
|
|
- m.Answer = rrs
|
|
|
|
|
|
+ labels := z.findLabels(label)
|
|
|
|
+ if labels == nil {
|
|
|
|
+ // return NXDOMAIN
|
|
|
|
+ m.SetRcode(req, dns.RcodeNameError)
|
|
|
|
+ ednsFromRequest(req, m)
|
|
|
|
+ w.Write(m)
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //fmt.Println("REG", region)
|
|
|
|
+ if region_rr := labels.Records[req.Question[0].Qtype]; region_rr != nil {
|
|
|
|
+ //fmt.Printf("REGION_RR %T %v\n", region_rr, region_rr)
|
|
|
|
+ max := len(region_rr)
|
|
|
|
+ if max > 4 {
|
|
|
|
+ max = 4
|
|
|
|
+ }
|
|
|
|
+ servers := region_rr[0:max]
|
|
|
|
+ var rrs []dns.RR
|
|
|
|
+ for _, record := range servers {
|
|
|
|
+ rr := record.RR
|
|
|
|
+ fmt.Println("RR", rr)
|
|
|
|
+ rr.Header().Name = req.Question[0].Name
|
|
|
|
+ fmt.Println(rr)
|
|
|
|
+ rrs = append(rrs, rr)
|
|
}
|
|
}
|
|
|
|
+ m.Answer = rrs
|
|
}
|
|
}
|
|
|
|
|
|
ednsFromRequest(req, m)
|
|
ednsFromRequest(req, m)
|