Add .meship protocol support (#7)
This commit is contained in:
parent
b2082295c2
commit
61c74e0568
@ -64,9 +64,11 @@ func (s *MeshnameServer) Start() error {
|
|||||||
NotifyStartedFunc: func(){ close(waitStarted) },
|
NotifyStartedFunc: func(){ close(waitStarted) },
|
||||||
}
|
}
|
||||||
for tld, subnet := range s.networks {
|
for tld, subnet := range s.networks {
|
||||||
dns.HandleFunc(tld, s.handleRequest)
|
dns.HandleFunc(tld, s.handleMeshnameRequest)
|
||||||
s.log.Debugln("Handling:", tld, subnet)
|
s.log.Debugln("Handling:", tld, subnet)
|
||||||
}
|
}
|
||||||
|
dns.HandleFunc("meship", s.handleMeshIPRequest)
|
||||||
|
s.log.Debugln("Handling: meship ::/0")
|
||||||
go func(){
|
go func(){
|
||||||
if err := s.dnsServer.ListenAndServe(); err != nil {
|
if err := s.dnsServer.ListenAndServe(); err != nil {
|
||||||
s.log.Fatalln("MeshnameServer failed to start:", err)
|
s.log.Fatalln("MeshnameServer failed to start:", err)
|
||||||
@ -88,7 +90,7 @@ func (s *MeshnameServer) ConfigureDNSRecords(dnsRecords map[string][]dns.RR) {
|
|||||||
s.dnsRecordsLock.Unlock()
|
s.dnsRecordsLock.Unlock()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *MeshnameServer) handleRequest(w dns.ResponseWriter, r *dns.Msg) {
|
func (s *MeshnameServer) handleMeshnameRequest(w dns.ResponseWriter, r *dns.Msg) {
|
||||||
var remoteLookups = make(map[string][]dns.Question)
|
var remoteLookups = make(map[string][]dns.Question)
|
||||||
m := new(dns.Msg)
|
m := new(dns.Msg)
|
||||||
m.SetReply(r)
|
m.SetReply(r)
|
||||||
@ -146,6 +148,35 @@ func (s *MeshnameServer) handleRequest(w dns.ResponseWriter, r *dns.Msg) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *MeshnameServer) handleMeshIPRequest(w dns.ResponseWriter, r *dns.Msg) {
|
||||||
|
m := new(dns.Msg)
|
||||||
|
m.SetReply(r)
|
||||||
|
|
||||||
|
for _, q := range r.Question {
|
||||||
|
labels := dns.SplitDomainName(q.Name)
|
||||||
|
// resolve only 2nd level domains and AAAA type
|
||||||
|
if len(labels) != 2 || q.Qtype != dns.TypeAAAA || q.Qclass != dns.ClassINET {
|
||||||
|
s.log.Debugln("Error: invalid resource requested")
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
subDomain := labels[len(labels)-2]
|
||||||
|
|
||||||
|
if resolvedAddr, err := IPFromDomain(&subDomain); err == nil {
|
||||||
|
answer := new(dns.AAAA)
|
||||||
|
answer.Hdr = dns.RR_Header{Name: q.Name, Rrtype: dns.TypeAAAA, Class: dns.ClassINET, Ttl: 3600}
|
||||||
|
answer.AAAA = resolvedAddr
|
||||||
|
|
||||||
|
m.Answer = append(m.Answer, answer)
|
||||||
|
} else {
|
||||||
|
s.log.Debugln(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := w.WriteMsg(m); err != nil {
|
||||||
|
s.log.Debugln("Error writing response:", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (s *MeshnameServer) isRemoteLookupAllowed(addr net.Addr) bool {
|
func (s *MeshnameServer) isRemoteLookupAllowed(addr net.Addr) bool {
|
||||||
// TODO prefix whitelists ?
|
// TODO prefix whitelists ?
|
||||||
if s.allowRemote {
|
if s.allowRemote {
|
||||||
|
Loading…
Reference in New Issue
Block a user