2 Commits

Author SHA1 Message Date
f147fb47bb Add JSON tags 2020-06-17 06:13:07 -07:00
b6dfdcd5ef DNS changes
go mod tidy
2020-06-17 06:13:07 -07:00

View File

@ -172,40 +172,43 @@ func (m measurement) String() string {
} }
func (s *Server) probeUpstreamLatency() { func (s *Server) probeUpstreamLatency() {
upstreams := s.upstreams() if !s.once {
results := make([]measurement, len(upstreams)) s.once = true
var wg sync.WaitGroup upstreams := s.upstreams()
for idx, u := range upstreams { results := make([]measurement, len(upstreams))
wg.Add(1) var wg sync.WaitGroup
go func(idx int, u string) { for idx, u := range upstreams {
defer wg.Done() wg.Add(1)
// resolve a most-definitely cached record go func(idx int, u string) {
m := new(dns.Msg) defer wg.Done()
m.SetQuestion("google.ch.", dns.TypeA) // resolve a most-definitely cached record
start := time.Now() m := new(dns.Msg)
_, _, err := s.client.Exchange(m, u) m.SetQuestion("google.ch.", dns.TypeA)
rtt := time.Since(start) start := time.Now()
if err != nil { _, _, err := s.client.Exchange(m, u)
// including unresponsive upstreams in results makes the update rtt := time.Since(start)
// code simpler: if err != nil {
results[idx] = measurement{u, time.Duration(math.MaxInt64)} // including unresponsive upstreams in results makes the update
return // code simpler:
} results[idx] = measurement{u, time.Duration(math.MaxInt64)}
results[idx] = measurement{u, rtt} return
}(idx, u) }
results[idx] = measurement{u, rtt}
}(idx, u)
}
wg.Wait()
// Re-order by resolving latency:
sort.Slice(results, func(i, j int) bool {
return results[i].rtt < results[j].rtt
})
log.Printf("probe results: %v %v", s.once, results)
for idx, result := range results {
upstreams[idx] = result.upstream
}
s.upstreamMu.Lock()
defer s.upstreamMu.Unlock()
s.upstream = upstreams
} }
wg.Wait()
// Re-order by resolving latency:
sort.Slice(results, func(i, j int) bool {
return results[i].rtt < results[j].rtt
})
log.Printf("probe results: %v", results)
for idx, result := range results {
upstreams[idx] = result.upstream
}
s.upstreamMu.Lock()
defer s.upstreamMu.Unlock()
s.upstream = upstreams
} }
func (s *Server) hostByName(n lcHostname) (string, bool) { func (s *Server) hostByName(n lcHostname) (string, bool) {
@ -477,7 +480,6 @@ func (s *Server) handleInternal(w dns.ResponseWriter, r *dns.Msg) {
if err == errEmpty { if err == errEmpty {
m := new(dns.Msg) m := new(dns.Msg)
m.SetReply(r) m.SetReply(r)
m.RecursionAvailable = true
w.WriteMsg(m) w.WriteMsg(m)
return return
} }
@ -486,7 +488,6 @@ func (s *Server) handleInternal(w dns.ResponseWriter, r *dns.Msg) {
if rr != nil { if rr != nil {
m := new(dns.Msg) m := new(dns.Msg)
m.SetReply(r) m.SetReply(r)
m.RecursionAvailable = true
m.Answer = append(m.Answer, rr) m.Answer = append(m.Answer, rr)
w.WriteMsg(m) w.WriteMsg(m)
return return
@ -494,7 +495,6 @@ func (s *Server) handleInternal(w dns.ResponseWriter, r *dns.Msg) {
// Send an authoritative NXDOMAIN for local: // Send an authoritative NXDOMAIN for local:
m := new(dns.Msg) m := new(dns.Msg)
m.SetReply(r) m.SetReply(r)
m.RecursionAvailable = true
m.SetRcode(r, dns.RcodeNameError) m.SetRcode(r, dns.RcodeNameError)
w.WriteMsg(m) w.WriteMsg(m)
} }
@ -550,7 +550,6 @@ func (s *Server) resolveSubname(domain string, q dns.Question) (dns.RR, error) {
name := strings.TrimSuffix(q.Name, ".") name := strings.TrimSuffix(q.Name, ".")
name = strings.TrimSuffix(name, "."+string(s.domain)) // trim server domain name = strings.TrimSuffix(name, "."+string(s.domain)) // trim server domain
name = strings.TrimSuffix(name, "."+strings.TrimSuffix(domain, "."+string(s.domain))) // trim function domain name = strings.TrimSuffix(name, "."+strings.TrimSuffix(domain, "."+string(s.domain))) // trim function domain
name = strings.TrimSuffix(name, ".lan") // trim function domain
if ip, ok := s.subname(domain, name); ok { if ip, ok := s.subname(domain, name); ok {
if q.Qtype == dns.TypeA && ip.IPv4.To4() != nil { if q.Qtype == dns.TypeA && ip.IPv4.To4() != nil {
return dns.NewRR(q.Name + " 3600 IN A " + ip.IPv4.String()) return dns.NewRR(q.Name + " 3600 IN A " + ip.IPv4.String())
@ -583,7 +582,6 @@ func (s *Server) subnameHandler(hostname lcHostname) func(w dns.ResponseWriter,
if err == errEmpty { if err == errEmpty {
m := new(dns.Msg) m := new(dns.Msg)
m.SetReply(r) m.SetReply(r)
m.RecursionAvailable = true
w.WriteMsg(m) w.WriteMsg(m)
return return
} }
@ -593,7 +591,6 @@ func (s *Server) subnameHandler(hostname lcHostname) func(w dns.ResponseWriter,
s.promInc("local", r) s.promInc("local", r)
m := new(dns.Msg) m := new(dns.Msg)
m.SetReply(r) m.SetReply(r)
m.RecursionAvailable = true
m.Answer = append(m.Answer, rr) m.Answer = append(m.Answer, rr)
w.WriteMsg(m) w.WriteMsg(m)
return return
@ -604,7 +601,6 @@ func (s *Server) subnameHandler(hostname lcHostname) func(w dns.ResponseWriter,
s.promInc("local", r) s.promInc("local", r)
m := new(dns.Msg) m := new(dns.Msg)
m.SetReply(r) m.SetReply(r)
m.RecursionAvailable = true
m.SetRcode(r, dns.RcodeNameError) m.SetRcode(r, dns.RcodeNameError)
w.WriteMsg(m) w.WriteMsg(m)
return return