Updated dns agent

This commit is contained in:
Trial97
2021-10-01 17:10:51 +03:00
committed by Dan Christian Bogos
parent 37e8f358b7
commit 295167c5f0

View File

@@ -85,24 +85,53 @@ func (da *DNSAgent) Reload() (err error) {
// requests are reaching here asynchronously
func (da *DNSAgent) handleMessage(w dns.ResponseWriter, req *dns.Msg) {
dnsDP := newDnsDP(req)
rply := new(dns.Msg)
rply.SetReply(req)
rmtAddr := w.RemoteAddr().String()
for _, q := range req.Question {
if processed, err := da.handleQuestion(dnsDP, rply, &q, rmtAddr); err != nil ||
!processed {
rply.Rcode = dns.RcodeServerFailure
rply = new(dns.Msg)
rply.SetReply(req)
dnsWriteMsg(w, rply)
return
}
}
if err := dnsWriteMsg(w, rply); err != nil { // failed sending, most probably content issue
rply = new(dns.Msg)
rply.SetReply(req)
rply.Rcode = dns.RcodeServerFailure
dnsWriteMsg(w, rply)
}
}
// Shutdown stops the DNS server
func (da *DNSAgent) Shutdown() error {
return da.server.Shutdown()
}
// handleMessage is the entry point of all DNS requests
// requests are reaching here asynchronously
func (da *DNSAgent) handleQuestion(dnsDP utils.DataProvider, rply *dns.Msg, q *dns.Question, rmtAddr string) (processed bool, err error) {
reqVars := &utils.DataNode{
Type: utils.NMMapType,
Map: map[string]*utils.DataNode{
QueryType: utils.NewLeafNode(dns.TypeToString[req.Question[0].Qtype]),
utils.RemoteHost: utils.NewLeafNode(w.RemoteAddr().String()),
QueryType: utils.NewLeafNode(dns.TypeToString[q.Qtype]),
QueryName: utils.NewLeafNode(q.Name),
utils.RemoteHost: utils.NewLeafNode(rmtAddr),
},
}
rply := new(dns.Msg)
rply.SetReply(req)
// message preprocesing
cgrRplyNM := &utils.DataNode{Type: utils.NMMapType, Map: make(map[string]*utils.DataNode)}
rplyNM := utils.NewOrderedNavigableMap() // share it among different processors
opts := utils.MapStorage{}
var processed bool
var err error
for _, reqProcessor := range da.cgrCfg.DNSAgentCfg().RequestProcessors {
var lclProcessed bool
lclProcessed, err = processRequest(
if lclProcessed, err = processRequest(
context.TODO(),
reqProcessor,
NewAgentRequest(
@@ -114,48 +143,27 @@ func (da *DNSAgent) handleMessage(w dns.ResponseWriter, req *dns.Msg) {
da.fltrS, nil),
utils.DNSAgent, da.connMgr,
da.cgrCfg.DNSAgentCfg().SessionSConns,
da.fltrS)
if lclProcessed {
processed = lclProcessed
da.fltrS); err != nil {
utils.Logger.Warning(
fmt.Sprintf("<%s> error: %s processing message: %s from %s",
utils.DNSAgent, err.Error(), dnsDP, rmtAddr))
return
}
if err != nil ||
(lclProcessed && !reqProcessor.Flags.GetBool(utils.MetaContinue)) {
processed = processed || lclProcessed
if lclProcessed && !reqProcessor.Flags.GetBool(utils.MetaContinue) {
break
}
}
if err != nil {
utils.Logger.Warning(
fmt.Sprintf("<%s> error: %s processing message: %s from %s",
utils.DNSAgent, err.Error(), req, w.RemoteAddr()))
rply.Rcode = dns.RcodeServerFailure
dnsWriteMsg(w, rply)
return
} else if !processed {
if !processed {
utils.Logger.Warning(
fmt.Sprintf("<%s> no request processor enabled, ignoring message %s from %s",
utils.DNSAgent, req, w.RemoteAddr()))
rply.Rcode = dns.RcodeServerFailure
dnsWriteMsg(w, rply)
utils.DNSAgent, dnsDP, rmtAddr))
return
}
if err = updateDNSMsgFromNM(rply, rplyNM, q.Qtype, q.Name); err != nil {
utils.Logger.Warning(
fmt.Sprintf("<%s> error: %s updating answer: %s from NM %s",
utils.DNSAgent, err.Error(), utils.ToJSON(rply), utils.ToJSON(rplyNM)))
rply.Rcode = dns.RcodeServerFailure
dnsWriteMsg(w, rply)
return
}
if err = dnsWriteMsg(w, rply); err != nil { // failed sending, most probably content issue
rply = new(dns.Msg)
rply.SetReply(req)
rply.Rcode = dns.RcodeServerFailure
dnsWriteMsg(w, rply)
}
return
}
// Shutdown stops the DNS server
func (da *DNSAgent) Shutdown() error {
return da.server.Shutdown()
}