Updated dns agent

This commit is contained in:
Trial97
2021-10-01 17:10:51 +03:00
committed by Dan Christian Bogos
parent 051e52ac21
commit 1ecf6f4030

View File

@@ -84,70 +84,23 @@ func (da *DNSAgent) Reload() (err error) {
// requests are reaching here asynchronously
func (da *DNSAgent) handleMessage(w dns.ResponseWriter, req *dns.Msg) {
dnsDP := newDnsDP(req)
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()),
},
}
rply := new(dns.Msg)
rply.SetReply(req)
// message preprocesing
if req.Question[0].Qtype == dns.TypeNAPTR {
reqVars.Map[QueryName] = utils.NewLeafNode(req.Question[0].Name)
}
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(
reqProcessor,
NewAgentRequest(
dnsDP, reqVars, cgrRplyNM, rplyNM,
opts, reqProcessor.Tenant,
da.cgrCfg.GeneralCfg().DefaultTenant,
utils.FirstNonEmpty(da.cgrCfg.DNSAgentCfg().Timezone,
da.cgrCfg.GeneralCfg().DefaultTimezone),
da.fltrS, nil),
utils.DNSAgent, da.connMgr,
da.cgrCfg.DNSAgentCfg().SessionSConns,
nil, da.fltrS)
if lclProcessed {
processed = lclProcessed
}
if err != nil ||
(lclProcessed && !reqProcessor.Flags.GetBool(utils.MetaContinue)) {
break
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 != 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 {
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)
return
}
if err = updateDNSMsgFromNM(rply, rplyNM); 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
if err := dnsWriteMsg(w, rply); err != nil { // failed sending, most probably content issue
rply = new(dns.Msg)
rply.SetReply(req)
rply.Rcode = dns.RcodeServerFailure
@@ -159,3 +112,71 @@ func (da *DNSAgent) handleMessage(w dns.ResponseWriter, req *dns.Msg) {
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[q.Qtype]),
QueryName: utils.NewLeafNode(q.Name),
utils.RemoteHost: utils.NewLeafNode(rmtAddr),
},
}
// message preprocesing
if q.Qtype == dns.TypeNAPTR {
/*
e164, err := e164FromNAPTR(req.Question[0].Name)
if err != nil {
utils.Logger.Warning(
fmt.Sprintf("<%s> decoding NAPTR query: <%s>, err: %s",
utils.DNSAgent, req.Question[0].Name, err.Error()))
rply.Rcode = dns.RcodeServerFailure
dnsWriteMsg(w, rply)
return
}
reqVars.Map[E164Address] = utils.NewLeafNode(e164)
reqVars.Map[DomainName] = utils.NewLeafNode(domainNameFromNAPTR(req.Question[0].Name))
*/
}
cgrRplyNM := &utils.DataNode{Type: utils.NMMapType, Map: make(map[string]*utils.DataNode)}
rplyNM := utils.NewOrderedNavigableMap() // share it among different processors
opts := utils.MapStorage{}
for _, reqProcessor := range da.cgrCfg.DNSAgentCfg().RequestProcessors {
var lclProcessed bool
if lclProcessed, err = processRequest(
reqProcessor,
NewAgentRequest(
dnsDP, reqVars, cgrRplyNM, rplyNM,
opts, reqProcessor.Tenant,
da.cgrCfg.GeneralCfg().DefaultTenant,
utils.FirstNonEmpty(da.cgrCfg.DNSAgentCfg().Timezone,
da.cgrCfg.GeneralCfg().DefaultTimezone),
da.fltrS, nil),
utils.DNSAgent, da.connMgr,
da.cgrCfg.DNSAgentCfg().SessionSConns,
nil, da.fltrS); err != nil {
utils.Logger.Warning(
fmt.Sprintf("<%s> error: %s processing message: %s from %s",
utils.DNSAgent, err.Error(), dnsDP, rmtAddr))
return
}
processed = processed || lclProcessed
if lclProcessed && !reqProcessor.Flags.GetBool(utils.MetaContinue) {
break
}
}
if !processed {
utils.Logger.Warning(
fmt.Sprintf("<%s> no request processor enabled, ignoring message %s from %s",
utils.DNSAgent, dnsDP, rmtAddr))
return
}
if err = updateDNSMsgFromNM(rply, rplyNM); 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)))
}
return
}