Updated config reload

This commit is contained in:
Trial97
2019-09-11 17:49:25 +03:00
committed by Dan Christian Bogos
parent c39454c31b
commit 4ef7200df5
2 changed files with 80 additions and 36 deletions

View File

@@ -19,6 +19,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
package agents
import (
"crypto/tls"
"fmt"
"strings"
@@ -42,31 +43,64 @@ type DNSAgent struct {
cgrCfg *config.CGRConfig // loaded CGRateS configuration
fltrS *engine.FilterS // connection towards FilterS
sS rpcclient.RpcClientConnection // connection towards CGR-SessionS component
server *dns.Server
}
func (da *DNSAgent) newDNSServer() (err error) {
handler := dns.HandlerFunc(func(w dns.ResponseWriter, m *dns.Msg) {
go da.handleMessage(w, m)
})
if strings.HasSuffix(da.cgrCfg.DNSAgentCfg().ListenNet, utils.TLSNoCaps) {
cert, err := tls.LoadX509KeyPair(da.cgrCfg.TlsCfg().ServerCerificate, da.cgrCfg.TlsCfg().ServerKey)
if err != nil {
return err
}
config := tls.Config{
Certificates: []tls.Certificate{cert},
}
da.server = &dns.Server{
Addr: da.cgrCfg.DNSAgentCfg().Listen,
Net: "tcp-tls",
TLSConfig: &config,
Handler: handler,
}
} else {
da.server = &dns.Server{Addr: da.cgrCfg.DNSAgentCfg().Listen, Net: da.cgrCfg.DNSAgentCfg().ListenNet, Handler: handler}
}
return
}
// ListenAndServe will run the DNS handler doing also the connection to listen address
func (da *DNSAgent) ListenAndServe() error {
func (da *DNSAgent) ListenAndServe() (err error) {
utils.Logger.Info(fmt.Sprintf("<%s> start listening on <%s:%s>",
utils.DNSAgent, da.cgrCfg.DNSAgentCfg().ListenNet, da.cgrCfg.DNSAgentCfg().Listen))
if strings.HasSuffix(da.cgrCfg.DNSAgentCfg().ListenNet, utils.TLSNoCaps) {
return dns.ListenAndServeTLS(
da.cgrCfg.DNSAgentCfg().Listen,
da.cgrCfg.TlsCfg().ServerCerificate,
da.cgrCfg.TlsCfg().ServerKey,
dns.HandlerFunc(
func(w dns.ResponseWriter, m *dns.Msg) {
go da.handleMessage(w, m)
}),
)
errChan := make(chan error, 1)
rldChan := da.cgrCfg.GetReloadChan(config.DNSAgentJson)
if err = da.newDNSServer(); err != nil {
return
}
lisenAndServe := func() {
errChan <- da.server.ListenAndServe()
}
go lisenAndServe()
for {
select {
case err = <-errChan:
return
case <-rldChan:
if err = da.Shutdown(); err != nil {
return
}
if err = da.newDNSServer(); err != nil {
return
}
go lisenAndServe() //restart the gorutine
}
}
return dns.ListenAndServe(
da.cgrCfg.DNSAgentCfg().Listen,
da.cgrCfg.DNSAgentCfg().ListenNet,
dns.HandlerFunc(
func(w dns.ResponseWriter, m *dns.Msg) {
go da.handleMessage(w, m)
}),
)
}
// handleMessage is the entry point of all DNS requests
@@ -321,3 +355,8 @@ func (da *DNSAgent) processRequest(reqProcessor *config.RequestProcessor,
}
return true, nil
}
// Shutdown stops the DNS server
func (da *DNSAgent) Shutdown() error {
return da.server.Shutdown()
}

View File

@@ -179,8 +179,6 @@ func NewDefaultCGRConfig() (cfg *CGRConfig, err error) {
cfg.ConfigReloads[utils.CDRC] <- struct{}{} // Unlock the channel
cfg.ConfigReloads[utils.CDRE] = make(chan struct{}, 1)
cfg.ConfigReloads[utils.CDRE] <- struct{}{} // Unlock the channel
cfg.ConfigReloads[utils.SURETAX] = make(chan struct{}, 1)
cfg.ConfigReloads[utils.SURETAX] <- struct{}{} // Unlock the channel
cfg.ConfigReloads[utils.DIAMETER_AGENT] = make(chan struct{}, 1)
cfg.ConfigReloads[utils.DIAMETER_AGENT] <- struct{}{} // Unlock the channel
cfg.ConfigReloads[utils.SMAsterisk] = make(chan struct{}, 1)
@@ -1122,25 +1120,32 @@ func (cfg *CGRConfig) loadErsCfg(jsnCfg *CgrJsonCfg) (err error) {
return cfg.ersCfg.loadFromJsonCfg(jsnERsCfg, cfg.GeneralCfg().RSRSep, cfg.dfltEvRdr)
}
// Use locking to retrieve the configuration, possibility later for runtime reload
func (self *CGRConfig) SureTaxCfg() *SureTaxCfg {
cfgChan := <-self.ConfigReloads[utils.SURETAX] // Lock config for read or reloads
defer func() { self.ConfigReloads[utils.SURETAX] <- cfgChan }()
return self.sureTaxCfg
// SureTaxCfg use locking to retrieve the configuration, possibility later for runtime reload
func (cfg *CGRConfig) SureTaxCfg() *SureTaxCfg {
cfg.lks[SURETAX_JSON].Lock()
defer cfg.lks[SURETAX_JSON].Unlock()
return cfg.sureTaxCfg
}
func (self *CGRConfig) DiameterAgentCfg() *DiameterAgentCfg {
cfgChan := <-self.ConfigReloads[utils.DIAMETER_AGENT] // Lock config for read or reloads
defer func() { self.ConfigReloads[utils.DIAMETER_AGENT] <- cfgChan }()
return self.diameterAgentCfg
// DiameterAgentCfg returns the config for Diameter Agent
func (cfg *CGRConfig) DiameterAgentCfg() *DiameterAgentCfg {
cfg.lks[DA_JSN].Lock()
defer cfg.lks[DA_JSN].Unlock()
return cfg.diameterAgentCfg
}
func (self *CGRConfig) RadiusAgentCfg() *RadiusAgentCfg {
return self.radiusAgentCfg
// RadiusAgentCfg returns the config for Radius Agent
func (cfg *CGRConfig) RadiusAgentCfg() *RadiusAgentCfg {
cfg.lks[RA_JSN].Lock()
defer cfg.lks[RA_JSN].Unlock()
return cfg.radiusAgentCfg
}
func (self *CGRConfig) DNSAgentCfg() *DNSAgentCfg {
return self.dnsAgentCfg
// DNSAgentCfg returns the config for DNS Agent
func (cfg *CGRConfig) DNSAgentCfg() *DNSAgentCfg {
cfg.lks[DNSAgentJson].Lock()
defer cfg.lks[DNSAgentJson].Unlock()
return cfg.dnsAgentCfg
}
func (cfg *CGRConfig) AttributeSCfg() *AttributeSCfg {
@@ -1534,6 +1539,7 @@ func (cfg *CGRConfig) reloadSection(section string) (err error) {
}
fallthrough
case DNSAgentJson:
cfg.rldChans[DNSAgentJson] <- struct{}{}
if !fall {
break
}
@@ -1578,7 +1584,7 @@ func (cfg *CGRConfig) reloadSection(section string) (err error) {
break
}
fallthrough
case SURETAX_JSON:
case SURETAX_JSON: // doesn't need to be reloaded
if !fall {
break
}
@@ -1607,7 +1613,6 @@ func (cfg *CGRConfig) reloadSection(section string) (err error) {
if !fall {
break
}
fallthrough
}
return
}