mirror of
https://github.com/cgrates/cgrates.git
synced 2026-02-13 11:06:25 +05:00
Refactored configuration file to include cluster connections everywhere, renamed old rater into RALs, fixes #389
This commit is contained in:
@@ -27,7 +27,7 @@ import (
|
||||
type CdrcConfig struct {
|
||||
Enabled bool // Enable/Disable the profile
|
||||
DryRun bool // Do not post CDRs to the server
|
||||
Cdrs string // The address where CDRs can be reached
|
||||
CdrsConns []*HaPoolConfig // The address where CDRs can be reached
|
||||
CdrFormat string // The type of CDR file to process <csv|opensips_flatstore>
|
||||
FieldSeparator rune // The separator to use when reading csvs
|
||||
DataUsageMultiplyFactor float64 // Conversion factor for data usage
|
||||
@@ -57,8 +57,12 @@ func (self *CdrcConfig) loadFromJsonCfg(jsnCfg *CdrcJsonCfg) error {
|
||||
if jsnCfg.Dry_run != nil {
|
||||
self.DryRun = *jsnCfg.Dry_run
|
||||
}
|
||||
if jsnCfg.Cdrs != nil {
|
||||
self.Cdrs = *jsnCfg.Cdrs
|
||||
if jsnCfg.Cdrs_conns != nil {
|
||||
self.CdrsConns = make([]*HaPoolConfig, len(*jsnCfg.Cdrs_conns))
|
||||
for idx, jsnHaCfg := range *jsnCfg.Cdrs_conns {
|
||||
self.CdrsConns[idx] = NewDfltHaPoolConfig()
|
||||
self.CdrsConns[idx].loadFromJsonCfg(jsnHaCfg)
|
||||
}
|
||||
}
|
||||
if jsnCfg.Cdr_format != nil {
|
||||
self.CdrFormat = *jsnCfg.Cdr_format
|
||||
@@ -126,7 +130,11 @@ func (self *CdrcConfig) loadFromJsonCfg(jsnCfg *CdrcJsonCfg) error {
|
||||
func (self *CdrcConfig) Clone() *CdrcConfig {
|
||||
clnCdrc := new(CdrcConfig)
|
||||
clnCdrc.Enabled = self.Enabled
|
||||
clnCdrc.Cdrs = self.Cdrs
|
||||
clnCdrc.CdrsConns = make([]*HaPoolConfig, len(self.CdrsConns))
|
||||
for idx, cdrConn := range self.CdrsConns {
|
||||
clonedVal := *cdrConn
|
||||
clnCdrc.CdrsConns[idx] = &clonedVal
|
||||
}
|
||||
clnCdrc.CdrFormat = self.CdrFormat
|
||||
clnCdrc.FieldSeparator = self.FieldSeparator
|
||||
clnCdrc.DataUsageMultiplyFactor = self.DataUsageMultiplyFactor
|
||||
|
||||
@@ -7,14 +7,14 @@
|
||||
// This is what you get when you load CGRateS with an empty configuration file.
|
||||
|
||||
"general": {
|
||||
"default_reqtype": "*pseudoprepaid", // default request type to consider when missing from requests: <""|*prepaid|*postpaid|*pseudoprepaid|*rated>
|
||||
"default_request_type": "*pseudoprepaid", // default request type to consider when missing from requests: <""|*prepaid|*postpaid|*pseudoprepaid|*rated>
|
||||
},
|
||||
|
||||
"cdrs": {
|
||||
"enabled": true, // start the CDR Server service: <true|false>
|
||||
},
|
||||
|
||||
"rater": {
|
||||
"rals": {
|
||||
"enabled": true, // enable Rater service: <true|false>
|
||||
},
|
||||
|
||||
@@ -42,9 +42,9 @@
|
||||
|
||||
"sm_freeswitch": {
|
||||
"enabled": true, // starts SessionManager service: <true|false>
|
||||
"connections":[ // instantiate connections to multiple FreeSWITCH servers
|
||||
{"server": "1.2.3.4:8021", "password": "ClueCon", "reconnects": 5},
|
||||
{"server": "2.3.4.5:8021", "password": "ClueCon", "reconnects": 5},
|
||||
"event_socket_conns":[ // instantiate connections to multiple FreeSWITCH servers
|
||||
{"address": "1.2.3.4:8021", "password": "ClueCon", "reconnects": 5},
|
||||
{"address": "2.3.4.5:8021", "password": "ClueCon", "reconnects": 5},
|
||||
],
|
||||
},
|
||||
|
||||
|
||||
@@ -22,8 +22,8 @@
|
||||
|
||||
"sm_freeswitch": {
|
||||
"enabled": true, // starts SessionManager service: <true|false>
|
||||
"connections":[ // instantiate connections to multiple FreeSWITCH servers
|
||||
{"server": "2.3.4.5:8021", "password": "ClueCon", "reconnects": 5},
|
||||
"event_socket_conns":[ // instantiate connections to multiple FreeSWITCH servers
|
||||
{"address": "2.3.4.5:8021", "password": "ClueCon", "reconnects": 5},
|
||||
],
|
||||
},
|
||||
|
||||
|
||||
300
config/config.go
300
config/config.go
@@ -86,8 +86,8 @@ func NewDefaultCGRConfig() (*CGRConfig, error) {
|
||||
}
|
||||
cfg.dfltCdreProfile = cfg.CdreProfiles[utils.META_DEFAULT].Clone() // So default will stay unique, will have nil pointer in case of no defaults loaded which is an extra check
|
||||
cfg.dfltCdrcProfile = cfg.CdrcProfiles["/var/log/cgrates/cdrc/in"][utils.META_DEFAULT].Clone()
|
||||
dfltFsConnConfig = cfg.SmFsConfig.Connections[0] // We leave it crashing here on purpose if no Connection defaults defined
|
||||
dfltKamConnConfig = cfg.SmKamConfig.Connections[0]
|
||||
dfltFsConnConfig = cfg.SmFsConfig.EventSocketConns[0] // We leave it crashing here on purpose if no Connection defaults defined
|
||||
dfltKamConnConfig = cfg.SmKamConfig.EvapiConns[0]
|
||||
if err := cfg.checkConfigSanity(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -191,31 +191,30 @@ type CGRConfig struct {
|
||||
StorDBMaxOpenConns int // Maximum database connections opened
|
||||
StorDBMaxIdleConns int // Maximum idle connections to keep opened
|
||||
StorDBCDRSIndexes []string
|
||||
DBDataEncoding string // The encoding used to store object data in strings: <msgpack|json>
|
||||
RPCJSONListen string // RPC JSON listening address
|
||||
RPCGOBListen string // RPC GOB listening address
|
||||
HTTPListen string // HTTP listening address
|
||||
DefaultReqType string // Use this request type if not defined on top
|
||||
DefaultCategory string // set default type of record
|
||||
DefaultTenant string // set default tenant
|
||||
DefaultSubject string // set default rating subject, useful in case of fallback
|
||||
DefaultTimezone string // default timezone for timestamps where not specified <""|UTC|Local|$IANA_TZ_DB>
|
||||
Reconnects int // number of recconect attempts in case of connection lost <-1 for infinite | nb>
|
||||
ConnectAttempts int // number of initial connection attempts before giving up
|
||||
ResponseCacheTTL time.Duration // the life span of a cached response
|
||||
InternalTtl time.Duration // maximum duration to wait for internal connections before giving up
|
||||
RoundingDecimals int // Number of decimals to round end prices at
|
||||
HttpSkipTlsVerify bool // If enabled Http Client will accept any TLS certificate
|
||||
TpExportPath string // Path towards export folder for offline Tariff Plans
|
||||
HttpFailedDir string // Directory path where we store failed http requests
|
||||
MaxCallDuration time.Duration // The maximum call duration (used by responder when querying DerivedCharging) // ToDo: export it in configuration file
|
||||
RaterEnabled bool // start standalone server (no balancer)
|
||||
RaterBalancer string // balancer address host:port
|
||||
RaterCdrStats string // address where to reach the cdrstats service. Empty to disable stats gathering <""|internal|x.y.z.y:1234>
|
||||
RaterHistoryServer string
|
||||
RaterPubSubServer string
|
||||
RaterUserServer string
|
||||
RaterAliasesServer string
|
||||
DBDataEncoding string // The encoding used to store object data in strings: <msgpack|json>
|
||||
RPCJSONListen string // RPC JSON listening address
|
||||
RPCGOBListen string // RPC GOB listening address
|
||||
HTTPListen string // HTTP listening address
|
||||
DefaultReqType string // Use this request type if not defined on top
|
||||
DefaultCategory string // set default type of record
|
||||
DefaultTenant string // set default tenant
|
||||
DefaultTimezone string // default timezone for timestamps where not specified <""|UTC|Local|$IANA_TZ_DB>
|
||||
Reconnects int // number of recconect attempts in case of connection lost <-1 for infinite | nb>
|
||||
ConnectAttempts int // number of initial connection attempts before giving up
|
||||
ResponseCacheTTL time.Duration // the life span of a cached response
|
||||
InternalTtl time.Duration // maximum duration to wait for internal connections before giving up
|
||||
RoundingDecimals int // Number of decimals to round end prices at
|
||||
HttpSkipTlsVerify bool // If enabled Http Client will accept any TLS certificate
|
||||
TpExportPath string // Path towards export folder for offline Tariff Plans
|
||||
HttpFailedDir string // Directory path where we store failed http requests
|
||||
MaxCallDuration time.Duration // The maximum call duration (used by responder when querying DerivedCharging) // ToDo: export it in configuration file
|
||||
RALsEnabled bool // start standalone server (no balancer)
|
||||
RALsBalancer string // balancer address host:port
|
||||
RALsCDRStatSConns []*HaPoolConfig // address where to reach the cdrstats service. Empty to disable stats gathering <""|internal|x.y.z.y:1234>
|
||||
RALsHistorySConns []*HaPoolConfig
|
||||
RALsPubSubSConns []*HaPoolConfig
|
||||
RALsUserSConns []*HaPoolConfig
|
||||
RALsAliasSConns []*HaPoolConfig
|
||||
RpSubjectPrefixMatching bool // enables prefix matching for the rating profile subject
|
||||
LcrSubjectPrefixMatching bool // enables prefix matching for the lcr subject
|
||||
BalancerEnabled bool
|
||||
@@ -234,9 +233,9 @@ type CGRConfig struct {
|
||||
CdreProfiles map[string]*CdreConfig
|
||||
CdrcProfiles map[string]map[string]*CdrcConfig // Number of CDRC instances running imports, format map[dirPath]map[instanceName]{Configs}
|
||||
SmGenericConfig *SmGenericConfig
|
||||
SmFsConfig *SmFsConfig // SM-FreeSWITCH configuration
|
||||
SmFsConfig *SmFsConfig // SMFreeSWITCH configuration
|
||||
SmKamConfig *SmKamConfig // SM-Kamailio Configuration
|
||||
SmOsipsConfig *SmOsipsConfig // SM-OpenSIPS Configuration
|
||||
SmOsipsConfig *SmOsipsConfig // SMOpenSIPS Configuration
|
||||
diameterAgentCfg *DiameterAgentCfg // DiameterAgent configuration
|
||||
HistoryServer string // Address where to reach the master history server: <internal|x.y.z.y:1234>
|
||||
HistoryServerEnabled bool // Starts History as server: <true|false>.
|
||||
@@ -260,64 +259,77 @@ type CGRConfig struct {
|
||||
|
||||
func (self *CGRConfig) checkConfigSanity() error {
|
||||
// Rater checks
|
||||
if self.RaterEnabled {
|
||||
if self.RaterBalancer == utils.INTERNAL && !self.BalancerEnabled {
|
||||
if self.RALsEnabled {
|
||||
if self.RALsBalancer == utils.MetaInternal && !self.BalancerEnabled {
|
||||
return errors.New("Balancer not enabled but requested by Rater component.")
|
||||
}
|
||||
if self.RaterCdrStats == utils.INTERNAL && !self.CDRStatsEnabled {
|
||||
return errors.New("CDRStats not enabled but requested by Rater component.")
|
||||
for _, connCfg := range self.RALsCDRStatSConns {
|
||||
if connCfg.Address == utils.MetaInternal && !self.CDRStatsEnabled {
|
||||
return errors.New("CDRStats not enabled but requested by Rater component.")
|
||||
}
|
||||
}
|
||||
if self.RaterHistoryServer == utils.INTERNAL && !self.HistoryServerEnabled {
|
||||
return errors.New("History server not enabled but requested by Rater component.")
|
||||
for _, connCfg := range self.RALsHistorySConns {
|
||||
if connCfg.Address == utils.MetaInternal && !self.HistoryServerEnabled {
|
||||
return errors.New("History server not enabled but requested by Rater component.")
|
||||
}
|
||||
}
|
||||
if self.RaterPubSubServer == utils.INTERNAL && !self.PubSubServerEnabled {
|
||||
return errors.New("PubSub server not enabled but requested by Rater component.")
|
||||
for _, connCfg := range self.RALsPubSubSConns {
|
||||
if connCfg.Address == utils.MetaInternal && !self.PubSubServerEnabled {
|
||||
return errors.New("PubSub server not enabled but requested by Rater component.")
|
||||
}
|
||||
}
|
||||
if self.RaterAliasesServer == utils.INTERNAL && !self.AliasesServerEnabled {
|
||||
return errors.New("Aliases server not enabled but requested by Rater component.")
|
||||
for _, connCfg := range self.RALsAliasSConns {
|
||||
if connCfg.Address == utils.MetaInternal && !self.AliasesServerEnabled {
|
||||
return errors.New("Alias server not enabled but requested by Rater component.")
|
||||
}
|
||||
}
|
||||
if self.RaterUserServer == utils.INTERNAL && !self.UserServerEnabled {
|
||||
return errors.New("Users service not enabled but requested by Rater component.")
|
||||
for _, connCfg := range self.RALsUserSConns {
|
||||
if connCfg.Address == utils.MetaInternal && !self.UserServerEnabled {
|
||||
return errors.New("User service not enabled but requested by Rater component.")
|
||||
}
|
||||
}
|
||||
}
|
||||
// CDRServer checks
|
||||
if self.CDRSEnabled {
|
||||
for _, cdrsRaterConn := range self.CDRSRaterConns {
|
||||
if cdrsRaterConn.Server == utils.INTERNAL && !self.RaterEnabled {
|
||||
return errors.New("Rater not enabled but requested by CDRS component.")
|
||||
if cdrsRaterConn.Address == utils.MetaInternal && !self.RALsEnabled {
|
||||
return errors.New("RALs not enabled but requested by CDRS component.")
|
||||
}
|
||||
}
|
||||
for _, connCfg := range self.CDRSPubSubSConns {
|
||||
if connCfg.Server == utils.INTERNAL && !self.PubSubServerEnabled {
|
||||
if connCfg.Address == utils.MetaInternal && !self.PubSubServerEnabled {
|
||||
return errors.New("PubSubS not enabled but requested by CDRS component.")
|
||||
}
|
||||
}
|
||||
for _, connCfg := range self.CDRSUserSConns {
|
||||
if connCfg.Server == utils.INTERNAL && !self.UserServerEnabled {
|
||||
if connCfg.Address == utils.MetaInternal && !self.UserServerEnabled {
|
||||
return errors.New("UserS not enabled but requested by CDRS component.")
|
||||
}
|
||||
}
|
||||
for _, connCfg := range self.CDRSAliaseSConns {
|
||||
if connCfg.Server == utils.INTERNAL && !self.AliasesServerEnabled {
|
||||
if connCfg.Address == utils.MetaInternal && !self.AliasesServerEnabled {
|
||||
return errors.New("AliaseS not enabled but requested by CDRS component.")
|
||||
}
|
||||
}
|
||||
for _, connCfg := range self.CDRSStatSConns {
|
||||
if connCfg.Server == utils.INTERNAL && !self.CDRStatsEnabled {
|
||||
if connCfg.Address == utils.MetaInternal && !self.CDRStatsEnabled {
|
||||
return errors.New("CDRStatS not enabled but requested by CDRS component.")
|
||||
}
|
||||
}
|
||||
}
|
||||
// CDRC sanity checks
|
||||
for _, cdrcCfgs := range self.CdrcProfiles {
|
||||
for _, cdrcInst := range cdrcCfgs {
|
||||
for instID, cdrcInst := range cdrcCfgs {
|
||||
if !cdrcInst.Enabled {
|
||||
continue
|
||||
}
|
||||
if len(cdrcInst.Cdrs) == 0 {
|
||||
return errors.New("CdrC enabled but no CDRS defined!")
|
||||
} else if cdrcInst.Cdrs == utils.INTERNAL && !self.CDRSEnabled {
|
||||
return errors.New("CDRS not enabled but referenced from CDRC")
|
||||
if len(cdrcInst.CdrsConns) == 0 {
|
||||
return fmt.Errorf("<CDRC> Instance: %s, CdrC enabled but no CDRS defined!", instID)
|
||||
}
|
||||
for _, conn := range cdrcInst.CdrsConns {
|
||||
if conn.Address == utils.MetaInternal && !self.CDRSEnabled {
|
||||
return errors.New("CDRS not enabled but referenced from CDRC")
|
||||
}
|
||||
}
|
||||
if len(cdrcInst.ContentFields) == 0 {
|
||||
return errors.New("CdrC enabled but no fields to be processed defined!")
|
||||
@@ -333,86 +345,87 @@ func (self *CGRConfig) checkConfigSanity() error {
|
||||
}
|
||||
}
|
||||
}
|
||||
// SM-Generic checks
|
||||
// SMGeneric checks
|
||||
if self.SmGenericConfig.Enabled {
|
||||
if len(self.SmGenericConfig.RaterConns) == 0 {
|
||||
return errors.New("Rater definition is mandatory!")
|
||||
if len(self.SmGenericConfig.RALsConns) == 0 {
|
||||
return errors.New("<SMGeneric> RALs definition is mandatory!")
|
||||
}
|
||||
if len(self.SmGenericConfig.CdrsConns) == 0 {
|
||||
return errors.New("Cdrs definition is mandatory!")
|
||||
}
|
||||
for _, smgRaterConn := range self.SmGenericConfig.RaterConns {
|
||||
if smgRaterConn.Server == utils.INTERNAL && !self.RaterEnabled {
|
||||
return errors.New("Rater not enabled but requested by SM-Generic component.")
|
||||
for _, smgRALsConn := range self.SmGenericConfig.RALsConns {
|
||||
if smgRALsConn.Address == utils.MetaInternal && !self.RALsEnabled {
|
||||
return errors.New("<SMGeneric> RALs not enabled but requested by SMGeneric component.")
|
||||
}
|
||||
}
|
||||
for _, smgCDRSConn := range self.SmGenericConfig.CdrsConns {
|
||||
if smgCDRSConn.Server == utils.INTERNAL && !self.CDRSEnabled {
|
||||
return errors.New("CDRS not enabled but referenced by SM-Generic component")
|
||||
if len(self.SmGenericConfig.CDRsConns) == 0 {
|
||||
return errors.New("<SMGeneric> CDRs definition is mandatory!")
|
||||
}
|
||||
for _, smgCDRSConn := range self.SmGenericConfig.CDRsConns {
|
||||
if smgCDRSConn.Address == utils.MetaInternal && !self.CDRSEnabled {
|
||||
return errors.New("<SMGeneric> CDRS not enabled but referenced by SMGeneric component")
|
||||
}
|
||||
}
|
||||
}
|
||||
// SM-FreeSWITCH checks
|
||||
// SMFreeSWITCH checks
|
||||
if self.SmFsConfig.Enabled {
|
||||
if len(self.SmFsConfig.RaterConns) == 0 {
|
||||
return errors.New("Rater definition is mandatory!")
|
||||
if len(self.SmFsConfig.RALsConns) == 0 {
|
||||
return errors.New("<SMFreeSWITCH> RALs definition is mandatory!")
|
||||
}
|
||||
if len(self.SmFsConfig.CdrsConns) == 0 {
|
||||
return errors.New("CDRS definition is mandatory!")
|
||||
}
|
||||
for _, smFSRaterConn := range self.SmFsConfig.RaterConns {
|
||||
if smFSRaterConn.Server == utils.INTERNAL && !self.RaterEnabled {
|
||||
return errors.New("Rater not enabled but requested by SM-FreeSWITCH component.")
|
||||
for _, smFSRaterConn := range self.SmFsConfig.RALsConns {
|
||||
if smFSRaterConn.Address == utils.MetaInternal && !self.RALsEnabled {
|
||||
return errors.New("<SMFreeSWITCH> RALs not enabled but requested by SMFreeSWITCH component.")
|
||||
}
|
||||
}
|
||||
for _, smFSCDRSConn := range self.SmFsConfig.CdrsConns {
|
||||
if smFSCDRSConn.Server == utils.INTERNAL && !self.CDRSEnabled {
|
||||
return errors.New("CDRS not enabled but referenced by SM-FreeSWITCH component")
|
||||
if len(self.SmFsConfig.CDRsConns) == 0 {
|
||||
return errors.New("<SMFreeSWITCH> CDRS definition is mandatory!")
|
||||
}
|
||||
for _, smFSCDRSConn := range self.SmFsConfig.CDRsConns {
|
||||
if smFSCDRSConn.Address == utils.MetaInternal && !self.CDRSEnabled {
|
||||
return errors.New("CDRS not enabled but referenced by SMFreeSWITCH component")
|
||||
}
|
||||
}
|
||||
}
|
||||
// SM-Kamailio checks
|
||||
if self.SmKamConfig.Enabled {
|
||||
if len(self.SmKamConfig.RaterConns) == 0 {
|
||||
if len(self.SmKamConfig.RALsConns) == 0 {
|
||||
return errors.New("Rater definition is mandatory!")
|
||||
}
|
||||
if len(self.SmKamConfig.CdrsConns) == 0 {
|
||||
return errors.New("Cdrs definition is mandatory!")
|
||||
}
|
||||
for _, smKamRaterConn := range self.SmKamConfig.RaterConns {
|
||||
if smKamRaterConn.Server == utils.INTERNAL && !self.RaterEnabled {
|
||||
for _, smKamRaterConn := range self.SmKamConfig.RALsConns {
|
||||
if smKamRaterConn.Address == utils.MetaInternal && !self.RALsEnabled {
|
||||
return errors.New("Rater not enabled but requested by SM-Kamailio component.")
|
||||
}
|
||||
}
|
||||
for _, smKamCDRSConn := range self.SmKamConfig.CdrsConns {
|
||||
if smKamCDRSConn.Server == utils.INTERNAL && !self.CDRSEnabled {
|
||||
if len(self.SmKamConfig.CDRsConns) == 0 {
|
||||
return errors.New("Cdrs definition is mandatory!")
|
||||
}
|
||||
for _, smKamCDRSConn := range self.SmKamConfig.CDRsConns {
|
||||
if smKamCDRSConn.Address == utils.MetaInternal && !self.CDRSEnabled {
|
||||
return errors.New("CDRS not enabled but referenced by SM-Kamailio component")
|
||||
}
|
||||
}
|
||||
}
|
||||
// SM-OpenSIPS checks
|
||||
// SMOpenSIPS checks
|
||||
if self.SmOsipsConfig.Enabled {
|
||||
if len(self.SmOsipsConfig.RaterConns) == 0 {
|
||||
return errors.New("Rater definition is mandatory!")
|
||||
if len(self.SmOsipsConfig.RALsConns) == 0 {
|
||||
return errors.New("<SMOpenSIPS> Rater definition is mandatory!")
|
||||
}
|
||||
if len(self.SmOsipsConfig.CdrsConns) == 0 {
|
||||
return errors.New("Cdrs definition is mandatory!")
|
||||
}
|
||||
for _, smOsipsRaterConn := range self.SmOsipsConfig.RaterConns {
|
||||
if smOsipsRaterConn.Server == utils.INTERNAL && !self.RaterEnabled {
|
||||
return errors.New("Rater not enabled but requested by SM-OpenSIPS component.")
|
||||
for _, smOsipsRaterConn := range self.SmOsipsConfig.RALsConns {
|
||||
if smOsipsRaterConn.Address == utils.MetaInternal && !self.RALsEnabled {
|
||||
return errors.New("<SMOpenSIPS> RALs not enabled but requested by SMOpenSIPS component.")
|
||||
}
|
||||
}
|
||||
for _, smOsipsCDRSConn := range self.SmOsipsConfig.CdrsConns {
|
||||
if smOsipsCDRSConn.Server == utils.INTERNAL && !self.CDRSEnabled {
|
||||
return errors.New("CDRS not enabled but referenced by SM-OpenSIPS component")
|
||||
if len(self.SmOsipsConfig.CDRsConns) == 0 {
|
||||
return errors.New("<SMOpenSIPS> CDRs definition is mandatory!")
|
||||
}
|
||||
|
||||
for _, smOsipsCDRSConn := range self.SmOsipsConfig.CDRsConns {
|
||||
if smOsipsCDRSConn.Address == utils.MetaInternal && !self.CDRSEnabled {
|
||||
return errors.New("<SMOpenSIPS> CDRS not enabled but referenced by SMOpenSIPS component")
|
||||
}
|
||||
}
|
||||
}
|
||||
// DAgent checks
|
||||
if self.diameterAgentCfg.Enabled {
|
||||
for _, daSMGConn := range self.diameterAgentCfg.SMGenericConns {
|
||||
if daSMGConn.Server == utils.INTERNAL && !self.SmGenericConfig.Enabled {
|
||||
if daSMGConn.Address == utils.MetaInternal && !self.SmGenericConfig.Enabled {
|
||||
return errors.New("SMGeneric not enabled but referenced by DiameterAgent component")
|
||||
}
|
||||
}
|
||||
@@ -454,7 +467,7 @@ func (self *CGRConfig) loadFromJsonCfg(jsnCfg *CgrJsonCfg) error {
|
||||
return err
|
||||
}
|
||||
|
||||
jsnRaterCfg, err := jsnCfg.RaterJsonCfg()
|
||||
jsnRALsCfg, err := jsnCfg.RalsJsonCfg()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -556,8 +569,8 @@ func (self *CGRConfig) loadFromJsonCfg(jsnCfg *CgrJsonCfg) error {
|
||||
if jsnTpDbCfg.Db_user != nil {
|
||||
self.TpDbUser = *jsnTpDbCfg.Db_user
|
||||
}
|
||||
if jsnTpDbCfg.Db_passwd != nil {
|
||||
self.TpDbPass = *jsnTpDbCfg.Db_passwd
|
||||
if jsnTpDbCfg.Db_password != nil {
|
||||
self.TpDbPass = *jsnTpDbCfg.Db_password
|
||||
}
|
||||
}
|
||||
|
||||
@@ -577,8 +590,8 @@ func (self *CGRConfig) loadFromJsonCfg(jsnCfg *CgrJsonCfg) error {
|
||||
if jsnDataDbCfg.Db_user != nil {
|
||||
self.DataDbUser = *jsnDataDbCfg.Db_user
|
||||
}
|
||||
if jsnDataDbCfg.Db_passwd != nil {
|
||||
self.DataDbPass = *jsnDataDbCfg.Db_passwd
|
||||
if jsnDataDbCfg.Db_password != nil {
|
||||
self.DataDbPass = *jsnDataDbCfg.Db_password
|
||||
}
|
||||
if jsnDataDbCfg.Load_history_size != nil {
|
||||
self.LoadHistorySize = *jsnDataDbCfg.Load_history_size
|
||||
@@ -601,8 +614,8 @@ func (self *CGRConfig) loadFromJsonCfg(jsnCfg *CgrJsonCfg) error {
|
||||
if jsnStorDbCfg.Db_user != nil {
|
||||
self.StorDBUser = *jsnStorDbCfg.Db_user
|
||||
}
|
||||
if jsnStorDbCfg.Db_passwd != nil {
|
||||
self.StorDBPass = *jsnStorDbCfg.Db_passwd
|
||||
if jsnStorDbCfg.Db_password != nil {
|
||||
self.StorDBPass = *jsnStorDbCfg.Db_password
|
||||
}
|
||||
if jsnStorDbCfg.Max_open_conns != nil {
|
||||
self.StorDBMaxOpenConns = *jsnStorDbCfg.Max_open_conns
|
||||
@@ -619,8 +632,8 @@ func (self *CGRConfig) loadFromJsonCfg(jsnCfg *CgrJsonCfg) error {
|
||||
if jsnGeneralCfg.Dbdata_encoding != nil {
|
||||
self.DBDataEncoding = *jsnGeneralCfg.Dbdata_encoding
|
||||
}
|
||||
if jsnGeneralCfg.Default_reqtype != nil {
|
||||
self.DefaultReqType = *jsnGeneralCfg.Default_reqtype
|
||||
if jsnGeneralCfg.Default_request_type != nil {
|
||||
self.DefaultReqType = *jsnGeneralCfg.Default_request_type
|
||||
}
|
||||
if jsnGeneralCfg.Default_category != nil {
|
||||
self.DefaultCategory = *jsnGeneralCfg.Default_category
|
||||
@@ -628,9 +641,6 @@ func (self *CGRConfig) loadFromJsonCfg(jsnCfg *CgrJsonCfg) error {
|
||||
if jsnGeneralCfg.Default_tenant != nil {
|
||||
self.DefaultTenant = *jsnGeneralCfg.Default_tenant
|
||||
}
|
||||
if jsnGeneralCfg.Default_subject != nil {
|
||||
self.DefaultSubject = *jsnGeneralCfg.Default_subject
|
||||
}
|
||||
if jsnGeneralCfg.Connect_attempts != nil {
|
||||
self.ConnectAttempts = *jsnGeneralCfg.Connect_attempts
|
||||
}
|
||||
@@ -676,33 +686,53 @@ func (self *CGRConfig) loadFromJsonCfg(jsnCfg *CgrJsonCfg) error {
|
||||
}
|
||||
}
|
||||
|
||||
if jsnRaterCfg != nil {
|
||||
if jsnRaterCfg.Enabled != nil {
|
||||
self.RaterEnabled = *jsnRaterCfg.Enabled
|
||||
if jsnRALsCfg != nil {
|
||||
if jsnRALsCfg.Enabled != nil {
|
||||
self.RALsEnabled = *jsnRALsCfg.Enabled
|
||||
}
|
||||
if jsnRaterCfg.Balancer != nil {
|
||||
self.RaterBalancer = *jsnRaterCfg.Balancer
|
||||
if jsnRALsCfg.Balancer != nil {
|
||||
self.RALsBalancer = *jsnRALsCfg.Balancer
|
||||
}
|
||||
if jsnRaterCfg.Cdrstats != nil {
|
||||
self.RaterCdrStats = *jsnRaterCfg.Cdrstats
|
||||
if jsnRALsCfg.Cdrstats_conns != nil {
|
||||
self.RALsCDRStatSConns = make([]*HaPoolConfig, len(*jsnRALsCfg.Cdrstats_conns))
|
||||
for idx, jsnHaCfg := range *jsnRALsCfg.Cdrstats_conns {
|
||||
self.RALsCDRStatSConns[idx] = NewDfltHaPoolConfig()
|
||||
self.RALsCDRStatSConns[idx].loadFromJsonCfg(jsnHaCfg)
|
||||
}
|
||||
}
|
||||
if jsnRaterCfg.Historys != nil {
|
||||
self.RaterHistoryServer = *jsnRaterCfg.Historys
|
||||
if jsnRALsCfg.Historys_conns != nil {
|
||||
self.RALsHistorySConns = make([]*HaPoolConfig, len(*jsnRALsCfg.Historys_conns))
|
||||
for idx, jsnHaCfg := range *jsnRALsCfg.Historys_conns {
|
||||
self.RALsHistorySConns[idx] = NewDfltHaPoolConfig()
|
||||
self.RALsHistorySConns[idx].loadFromJsonCfg(jsnHaCfg)
|
||||
}
|
||||
}
|
||||
if jsnRaterCfg.Pubsubs != nil {
|
||||
self.RaterPubSubServer = *jsnRaterCfg.Pubsubs
|
||||
if jsnRALsCfg.Pubsubs_conns != nil {
|
||||
self.RALsPubSubSConns = make([]*HaPoolConfig, len(*jsnRALsCfg.Pubsubs_conns))
|
||||
for idx, jsnHaCfg := range *jsnRALsCfg.Pubsubs_conns {
|
||||
self.RALsPubSubSConns[idx] = NewDfltHaPoolConfig()
|
||||
self.RALsPubSubSConns[idx].loadFromJsonCfg(jsnHaCfg)
|
||||
}
|
||||
}
|
||||
if jsnRaterCfg.Aliases != nil {
|
||||
self.RaterAliasesServer = *jsnRaterCfg.Aliases
|
||||
if jsnRALsCfg.Aliases_conns != nil {
|
||||
self.RALsAliasSConns = make([]*HaPoolConfig, len(*jsnRALsCfg.Aliases_conns))
|
||||
for idx, jsnHaCfg := range *jsnRALsCfg.Aliases_conns {
|
||||
self.RALsAliasSConns[idx] = NewDfltHaPoolConfig()
|
||||
self.RALsAliasSConns[idx].loadFromJsonCfg(jsnHaCfg)
|
||||
}
|
||||
}
|
||||
if jsnRaterCfg.Users != nil {
|
||||
self.RaterUserServer = *jsnRaterCfg.Users
|
||||
if jsnRALsCfg.Users_conns != nil {
|
||||
self.RALsUserSConns = make([]*HaPoolConfig, len(*jsnRALsCfg.Users_conns))
|
||||
for idx, jsnHaCfg := range *jsnRALsCfg.Users_conns {
|
||||
self.RALsUserSConns[idx] = NewDfltHaPoolConfig()
|
||||
self.RALsUserSConns[idx].loadFromJsonCfg(jsnHaCfg)
|
||||
}
|
||||
}
|
||||
if jsnRaterCfg.Rp_subject_prefix_matching != nil {
|
||||
self.RpSubjectPrefixMatching = *jsnRaterCfg.Rp_subject_prefix_matching
|
||||
if jsnRALsCfg.Rp_subject_prefix_matching != nil {
|
||||
self.RpSubjectPrefixMatching = *jsnRALsCfg.Rp_subject_prefix_matching
|
||||
}
|
||||
if jsnRaterCfg.Lcr_subject_prefix_matching != nil {
|
||||
self.LcrSubjectPrefixMatching = *jsnRaterCfg.Lcr_subject_prefix_matching
|
||||
if jsnRALsCfg.Lcr_subject_prefix_matching != nil {
|
||||
self.LcrSubjectPrefixMatching = *jsnRALsCfg.Lcr_subject_prefix_matching
|
||||
}
|
||||
}
|
||||
|
||||
@@ -726,9 +756,9 @@ func (self *CGRConfig) loadFromJsonCfg(jsnCfg *CgrJsonCfg) error {
|
||||
if jsnCdrsCfg.Store_cdrs != nil {
|
||||
self.CDRSStoreCdrs = *jsnCdrsCfg.Store_cdrs
|
||||
}
|
||||
if jsnCdrsCfg.Rater_conns != nil {
|
||||
self.CDRSRaterConns = make([]*HaPoolConfig, len(*jsnCdrsCfg.Rater_conns))
|
||||
for idx, jsnHaCfg := range *jsnCdrsCfg.Rater_conns {
|
||||
if jsnCdrsCfg.Rals_conns != nil {
|
||||
self.CDRSRaterConns = make([]*HaPoolConfig, len(*jsnCdrsCfg.Rals_conns))
|
||||
for idx, jsnHaCfg := range *jsnCdrsCfg.Rals_conns {
|
||||
self.CDRSRaterConns[idx] = NewDfltHaPoolConfig()
|
||||
self.CDRSRaterConns[idx].loadFromJsonCfg(jsnHaCfg)
|
||||
}
|
||||
@@ -768,8 +798,8 @@ func (self *CGRConfig) loadFromJsonCfg(jsnCfg *CgrJsonCfg) error {
|
||||
if rplJsonCfg.Transport != nil {
|
||||
self.CDRSCdrReplication[idx].Transport = *rplJsonCfg.Transport
|
||||
}
|
||||
if rplJsonCfg.Server != nil {
|
||||
self.CDRSCdrReplication[idx].Server = *rplJsonCfg.Server
|
||||
if rplJsonCfg.Address != nil {
|
||||
self.CDRSCdrReplication[idx].Address = *rplJsonCfg.Address
|
||||
}
|
||||
if rplJsonCfg.Synchronous != nil {
|
||||
self.CDRSCdrReplication[idx].Synchronous = *rplJsonCfg.Synchronous
|
||||
@@ -907,8 +937,8 @@ func (self *CGRConfig) loadFromJsonCfg(jsnCfg *CgrJsonCfg) error {
|
||||
if jsnMailerCfg.Auth_user != nil {
|
||||
self.MailerAuthUser = *jsnMailerCfg.Auth_user
|
||||
}
|
||||
if jsnMailerCfg.Auth_passwd != nil {
|
||||
self.MailerAuthPass = *jsnMailerCfg.Auth_passwd
|
||||
if jsnMailerCfg.Auth_password != nil {
|
||||
self.MailerAuthPass = *jsnMailerCfg.Auth_password
|
||||
}
|
||||
if jsnMailerCfg.From_address != nil {
|
||||
self.MailerFromAddr = *jsnMailerCfg.From_address
|
||||
|
||||
@@ -29,14 +29,13 @@ const CGRATES_CFG_JSON = `
|
||||
|
||||
"general": {
|
||||
"http_skip_tls_verify": false, // if enabled Http Client will accept any TLS certificate
|
||||
"rounding_decimals": 5, // system level precision for floats
|
||||
"rounding_decimals": 5, // system level precision for floats
|
||||
"dbdata_encoding": "msgpack", // encoding used to store object data in strings: <msgpack|json>
|
||||
"tpexport_dir": "/var/log/cgrates/tpe", // path towards export folder for offline Tariff Plans
|
||||
"http_failed_dir": "/var/log/cgrates/http_failed", // directory path where we store failed http requests
|
||||
"default_reqtype": "*rated", // default request type to consider when missing from requests: <""|*prepaid|*postpaid|*pseudoprepaid|*rated>
|
||||
"default_category": "call", // default Type of Record to consider when missing from requests
|
||||
"default_tenant": "cgrates.org", // default Tenant to consider when missing from requests
|
||||
"default_subject": "cgrates", // default rating Subject to consider when missing from requests
|
||||
"default_request_type": "*rated", // default request type to consider when missing from requests: <""|*prepaid|*postpaid|*pseudoprepaid|*rated>
|
||||
"default_category": "call", // default category to consider when missing from requests
|
||||
"default_tenant": "cgrates.org", // default tenant to consider when missing from requests
|
||||
"default_timezone": "Local", // default timezone for timestamps where not specified <""|UTC|Local|$IANA_TZ_DB>
|
||||
"connect_attempts": 3, // initial server connect attempts
|
||||
"reconnects": -1, // number of retries in case of connection lost
|
||||
@@ -58,7 +57,7 @@ const CGRATES_CFG_JSON = `
|
||||
"db_port": 6379, // port to reach the tariffplan_db
|
||||
"db_name": "10", // tariffplan_db name to connect to
|
||||
"db_user": "", // sername to use when connecting to tariffplan_db
|
||||
"db_passwd": "", // password to use when connecting to tariffplan_db
|
||||
"db_password": "", // password to use when connecting to tariffplan_db
|
||||
},
|
||||
|
||||
|
||||
@@ -68,7 +67,7 @@ const CGRATES_CFG_JSON = `
|
||||
"db_port": 6379, // data_db port to reach the database
|
||||
"db_name": "11", // data_db database name to connect to
|
||||
"db_user": "", // username to use when connecting to data_db
|
||||
"db_passwd": "", // password to use when connecting to data_db
|
||||
"db_password": "", // password to use when connecting to data_db
|
||||
"load_history_size": 10, // Number of records in the load history
|
||||
},
|
||||
|
||||
@@ -79,7 +78,7 @@ const CGRATES_CFG_JSON = `
|
||||
"db_port": 3306, // the port to reach the stordb
|
||||
"db_name": "cgrates", // stor database name
|
||||
"db_user": "cgrates", // username to use when connecting to stordb
|
||||
"db_passwd": "CGRateS.org", // password to use when connecting to stordb
|
||||
"db_password": "CGRateS.org", // password to use when connecting to stordb
|
||||
"max_open_conns": 100, // maximum database connections opened
|
||||
"max_idle_conns": 10, // maximum database connections idle
|
||||
"cdrs_indexes": [], // indexes on cdrs table to speed up queries, used only in case of mongo
|
||||
@@ -91,16 +90,16 @@ const CGRATES_CFG_JSON = `
|
||||
},
|
||||
|
||||
|
||||
"rater": {
|
||||
"rals": {
|
||||
"enabled": false, // enable Rater service: <true|false>
|
||||
"balancer": "", // register to balancer as worker: <""|internal|x.y.z.y:1234>
|
||||
"cdrstats": "", // address where to reach the cdrstats service, empty to disable stats functionality: <""|internal|x.y.z.y:1234>
|
||||
"historys": "", // address where to reach the history service, empty to disable history functionality: <""|internal|x.y.z.y:1234>
|
||||
"pubsubs": "", // address where to reach the pubusb service, empty to disable pubsub functionality: <""|internal|x.y.z.y:1234>
|
||||
"users": "", // address where to reach the user service, empty to disable user profile functionality: <""|internal|x.y.z.y:1234>
|
||||
"aliases": "", // address where to reach the aliases service, empty to disable aliases functionality: <""|internal|x.y.z.y:1234>
|
||||
"rp_subject_prefix_matching": false, // enables prefix matching for the rating profile subject
|
||||
"lcr_subject_prefix_matching": false // enables prefix matching for the lcr subject
|
||||
"balancer": "", // register to balancer as worker: <""|*internal|x.y.z.y:1234>
|
||||
"cdrstats_conns": [], // address where to reach the cdrstats service, empty to disable stats functionality: <""|*internal|x.y.z.y:1234>
|
||||
"historys_conns": [], // address where to reach the history service, empty to disable history functionality: <""|*internal|x.y.z.y:1234>
|
||||
"pubsubs_conns": [], // address where to reach the pubusb service, empty to disable pubsub functionality: <""|*internal|x.y.z.y:1234>
|
||||
"users_conns": [], // address where to reach the user service, empty to disable user profile functionality: <""|*internal|x.y.z.y:1234>
|
||||
"aliases_conns": [], // address where to reach the aliases service, empty to disable aliases functionality: <""|*internal|x.y.z.y:1234>
|
||||
"rp_subject_prefix_matching": false, // enables prefix matching for the rating profile subject
|
||||
"lcr_subject_prefix_matching": false // enables prefix matching for the lcr subject
|
||||
},
|
||||
|
||||
|
||||
@@ -113,13 +112,13 @@ const CGRATES_CFG_JSON = `
|
||||
"enabled": false, // start the CDR Server service: <true|false>
|
||||
"extra_fields": [], // extra fields to store in CDRs for non-generic CDRs
|
||||
"store_cdrs": true, // store cdrs in storDb
|
||||
"rater_conns": [
|
||||
{"server": "internal"} // address where to reach the Rater for cost calculation, empty to disable functionality: <""|internal|x.y.z.y:1234>
|
||||
"rals_conns": [
|
||||
{"address": "*internal"} // address where to reach the Rater for cost calculation, empty to disable functionality: <""|*internal|x.y.z.y:1234>
|
||||
],
|
||||
"pubsubs_conns": [], // address where to reach the pubusb service, empty to disable pubsub functionality: <""|internal|x.y.z.y:1234>
|
||||
"users_conns": [], // address where to reach the user service, empty to disable user profile functionality: <""|internal|x.y.z.y:1234>
|
||||
"aliases_conns": [], // address where to reach the aliases service, empty to disable aliases functionality: <""|internal|x.y.z.y:1234>
|
||||
"cdrstats_conns": [], // address where to reach the cdrstats service, empty to disable stats functionality<""|internal|x.y.z.y:1234>
|
||||
"pubsubs_conns": [], // address where to reach the pubusb service, empty to disable pubsub functionality: <""|*internal|x.y.z.y:1234>
|
||||
"users_conns": [], // address where to reach the user service, empty to disable user profile functionality: <""|*internal|x.y.z.y:1234>
|
||||
"aliases_conns": [], // address where to reach the aliases service, empty to disable aliases functionality: <""|*internal|x.y.z.y:1234>
|
||||
"cdrstats_conns": [], // address where to reach the cdrstats service, empty to disable stats functionality<""|*internal|x.y.z.y:1234>
|
||||
"cdr_replication":[] // replicate the raw CDR to a number of servers
|
||||
},
|
||||
|
||||
@@ -171,7 +170,9 @@ const CGRATES_CFG_JSON = `
|
||||
"*default": {
|
||||
"enabled": false, // enable CDR client functionality
|
||||
"dry_run": false, // do not send the CDRs to CDRS, just parse them
|
||||
"cdrs": "internal", // address where to reach CDR server. <internal|x.y.z.y:1234>
|
||||
"cdrs_conns": [
|
||||
{"address": "*internal"} // address where to reach CDR server. <*internal|x.y.z.y:1234>
|
||||
],
|
||||
"cdr_format": "csv", // CDR file format <csv|freeswitch_csv|fwv|opensips_flatstore>
|
||||
"field_separator": ",", // separator used in case of csv files
|
||||
"timezone": "", // timezone for timestamps where not specified <""|UTC|Local|$IANA_TZ_DB>
|
||||
@@ -207,61 +208,61 @@ const CGRATES_CFG_JSON = `
|
||||
"sm_generic": {
|
||||
"enabled": false, // starts SessionManager service: <true|false>
|
||||
"listen_bijson": "127.0.0.1:2014", // address where to listen for bidirectional JSON-RPC requests
|
||||
"rater_conns": [
|
||||
{"server": "internal"} // address where to reach the Rater <""|internal|127.0.0.1:2013>
|
||||
],
|
||||
"rals_conns": [
|
||||
{"address": "*internal"} // address where to reach the Rater <""|*internal|127.0.0.1:2013>
|
||||
],
|
||||
"cdrs_conns": [
|
||||
{"server": "internal"} // address where to reach CDR Server, empty to disable CDR capturing <internal|x.y.z.y:1234>
|
||||
],
|
||||
{"address": "*internal"} // address where to reach CDR Server, empty to disable CDR capturing <*internal|x.y.z.y:1234>
|
||||
],
|
||||
"debit_interval": "0s", // interval to perform debits on.
|
||||
"min_call_duration": "0s", // only authorize calls with allowed duration higher than this
|
||||
"max_call_duration": "3h", // maximum call duration a prepaid call can last
|
||||
"session_ttl": "0s", // time after a session with no updates is terminated, not defined by default
|
||||
//"session_ttl_last_used": "", // tweak LastUsed for sessions timing-out, not defined by default
|
||||
//"session_ttl_usage": "", // tweak Usage for sessions timing-out, not defined by default
|
||||
"session_ttl": "0s", // time after a session with no updates is terminated, not defined by default
|
||||
//"session_ttl_last_used": "", // tweak LastUsed for sessions timing-out, not defined by default
|
||||
//"session_ttl_usage": "", // tweak Usage for sessions timing-out, not defined by default
|
||||
},
|
||||
|
||||
|
||||
"sm_freeswitch": {
|
||||
"enabled": false, // starts SessionManager service: <true|false>
|
||||
"rater_conns": [
|
||||
{"server": "internal"} // address where to reach the Rater <""|internal|127.0.0.1:2013>
|
||||
"rals_conns": [
|
||||
{"address": "*internal"} // address where to reach the Rater <""|*internal|127.0.0.1:2013>
|
||||
],
|
||||
"cdrs_conns": [
|
||||
{"server": "internal"} // address where to reach CDR Server, empty to disable CDR capturing <internal|x.y.z.y:1234>
|
||||
{"address": "*internal"} // address where to reach CDR Server, empty to disable CDR capturing <*internal|x.y.z.y:1234>
|
||||
],
|
||||
"create_cdr": false, // create CDR out of events and sends them to CDRS component
|
||||
"extra_fields": [], // extra fields to store in auth/CDRs when creating them
|
||||
"debit_interval": "10s", // interval to perform debits on.
|
||||
"min_call_duration": "0s", // only authorize calls with allowed duration higher than this
|
||||
"max_call_duration": "3h", // maximum call duration a prepaid call can last
|
||||
"min_dur_low_balance": "5s", // threshold which will trigger low balance warnings for prepaid calls (needs to be lower than debit_interval)
|
||||
"low_balance_ann_file": "", // file to be played when low balance is reached for prepaid calls
|
||||
"empty_balance_context": "", // if defined, prepaid calls will be transfered to this context on empty balance
|
||||
"empty_balance_ann_file": "", // file to be played before disconnecting prepaid calls on empty balance (applies only if no context defined)
|
||||
"subscribe_park": true, // subscribe via fsock to receive park events
|
||||
"channel_sync_interval": "5m", // sync channels with freeswitch regularly
|
||||
"max_wait_connection": "2s", // maximum duration to wait for a connection to be retrieved from the pool
|
||||
"connections":[ // instantiate connections to multiple FreeSWITCH servers
|
||||
{"server": "127.0.0.1:8021", "password": "ClueCon", "reconnects": 5}
|
||||
"create_cdr": false, // create CDR out of events and sends them to CDRS component
|
||||
"extra_fields": [], // extra fields to store in auth/CDRs when creating them
|
||||
"debit_interval": "10s", // interval to perform debits on.
|
||||
"min_call_duration": "0s", // only authorize calls with allowed duration higher than this
|
||||
"max_call_duration": "3h", // maximum call duration a prepaid call can last
|
||||
"min_dur_low_balance": "5s", // threshold which will trigger low balance warnings for prepaid calls (needs to be lower than debit_interval)
|
||||
"low_balance_ann_file": "", // file to be played when low balance is reached for prepaid calls
|
||||
"empty_balance_context": "", // if defined, prepaid calls will be transfered to this context on empty balance
|
||||
"empty_balance_ann_file": "", // file to be played before disconnecting prepaid calls on empty balance (applies only if no context defined)
|
||||
"subscribe_park": true, // subscribe via fsock to receive park events
|
||||
"channel_sync_interval": "5m", // sync channels with freeswitch regularly
|
||||
"max_wait_connection": "2s", // maximum duration to wait for a connection to be retrieved from the pool
|
||||
"event_socket_conns":[ // instantiate connections to multiple FreeSWITCH servers
|
||||
{"address": "127.0.0.1:8021", "password": "ClueCon", "reconnects": 5}
|
||||
],
|
||||
},
|
||||
|
||||
|
||||
"sm_kamailio": {
|
||||
"enabled": false, // starts SessionManager service: <true|false>
|
||||
"rater_conns": [
|
||||
{"server": "internal"} // address where to reach the Rater <""|internal|127.0.0.1:2013>
|
||||
"enabled": false, // starts SessionManager service: <true|false>
|
||||
"rals_conns": [
|
||||
{"address": "*internal"} // address where to reach the Rater <""|*internal|127.0.0.1:2013>
|
||||
],
|
||||
"cdrs_conns": [
|
||||
{"server": "internal"} // address where to reach CDR Server, empty to disable CDR capturing <internal|x.y.z.y:1234>
|
||||
{"address": "*internal"} // address where to reach CDR Server, empty to disable CDR capturing <*internal|x.y.z.y:1234>
|
||||
],
|
||||
"create_cdr": false, // create CDR out of events and sends them to CDRS component
|
||||
"debit_interval": "10s", // interval to perform debits on.
|
||||
"min_call_duration": "0s", // only authorize calls with allowed duration higher than this
|
||||
"max_call_duration": "3h", // maximum call duration a prepaid call can last
|
||||
"connections":[ // instantiate connections to multiple Kamailio servers
|
||||
{"evapi_addr": "127.0.0.1:8448", "reconnects": 5}
|
||||
"create_cdr": false, // create CDR out of events and sends them to CDRS component
|
||||
"debit_interval": "10s", // interval to perform debits on.
|
||||
"min_call_duration": "0s", // only authorize calls with allowed duration higher than this
|
||||
"max_call_duration": "3h", // maximum call duration a prepaid call can last
|
||||
"evapi_conns":[ // instantiate connections to multiple Kamailio servers
|
||||
{"address": "127.0.0.1:8448", "reconnects": 5}
|
||||
],
|
||||
},
|
||||
|
||||
@@ -269,11 +270,11 @@ const CGRATES_CFG_JSON = `
|
||||
"sm_opensips": {
|
||||
"enabled": false, // starts SessionManager service: <true|false>
|
||||
"listen_udp": "127.0.0.1:2020", // address where to listen for datagram events coming from OpenSIPS
|
||||
"rater_conns": [
|
||||
{"server": "internal"} // address where to reach the Rater <""|internal|127.0.0.1:2013>
|
||||
"rals_conns": [
|
||||
{"address": "*internal"} // address where to reach the Rater <""|*internal|127.0.0.1:2013>
|
||||
],
|
||||
"cdrs_conns": [
|
||||
{"server": "internal"} // address where to reach CDR Server, empty to disable CDR capturing <internal|x.y.z.y:1234>
|
||||
{"address": "*internal"} // address where to reach CDR Server, empty to disable CDR capturing <*internal|x.y.z.y:1234>
|
||||
],
|
||||
"reconnects": 5, // number of reconnects if connection is lost
|
||||
"create_cdr": false, // create CDR out of events and sends it to CDRS component
|
||||
@@ -290,9 +291,9 @@ const CGRATES_CFG_JSON = `
|
||||
"listen": "127.0.0.1:3868", // address where to listen for diameter requests <x.y.z.y:1234>
|
||||
"dictionaries_dir": "/usr/share/cgrates/diameter/dict/", // path towards directory holding additional dictionaries to load
|
||||
"sm_generic_conns": [
|
||||
{"server": "internal"} // connection towards SMG component for session management
|
||||
],
|
||||
"pubsubs": [], // address where to reach the pubusb service, empty to disable pubsub functionality: <""|internal|x.y.z.y:1234>
|
||||
{"address": "*internal"} // connection towards SMG component for session management
|
||||
],
|
||||
"pubsubs_conns": [], // address where to reach the pubusb service, empty to disable pubsub functionality: <""|*internal|x.y.z.y:1234>
|
||||
"create_cdr": true, // create CDR out of CCR terminate and send it to SMG component
|
||||
"debit_interval": "5m", // interval for CCR updates
|
||||
"timezone": "", // timezone for timestamps where not specified, empty for general defaults <""|UTC|Local|$IANA_TZ_DB>
|
||||
@@ -359,7 +360,7 @@ const CGRATES_CFG_JSON = `
|
||||
"mailer": {
|
||||
"server": "localhost", // the server to use when sending emails out
|
||||
"auth_user": "cgrates", // authenticate to email server using this user
|
||||
"auth_passwd": "CGRateS.org", // authenticate to email server with this password
|
||||
"auth_password": "CGRateS.org", // authenticate to email server with this password
|
||||
"from_address": "cgr-mailer@localhost.localdomain" // from address used when sending emails out
|
||||
},
|
||||
|
||||
|
||||
@@ -33,7 +33,7 @@ const (
|
||||
DATADB_JSN = "data_db"
|
||||
STORDB_JSN = "stor_db"
|
||||
BALANCER_JSN = "balancer"
|
||||
RATER_JSN = "rater"
|
||||
RALS_JSN = "rals"
|
||||
SCHEDULER_JSN = "scheduler"
|
||||
CDRS_JSN = "cdrs"
|
||||
MEDIATOR_JSN = "mediator"
|
||||
@@ -128,12 +128,12 @@ func (self CgrJsonCfg) BalancerJsonCfg() (*BalancerJsonCfg, error) {
|
||||
return cfg, nil
|
||||
}
|
||||
|
||||
func (self CgrJsonCfg) RaterJsonCfg() (*RaterJsonCfg, error) {
|
||||
rawCfg, hasKey := self[RATER_JSN]
|
||||
func (self CgrJsonCfg) RalsJsonCfg() (*RalsJsonCfg, error) {
|
||||
rawCfg, hasKey := self[RALS_JSN]
|
||||
if !hasKey {
|
||||
return nil, nil
|
||||
}
|
||||
cfg := new(RaterJsonCfg)
|
||||
cfg := new(RalsJsonCfg)
|
||||
if err := json.Unmarshal(*rawCfg, cfg); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -44,10 +44,9 @@ func TestDfGeneralJsonCfg(t *testing.T) {
|
||||
Dbdata_encoding: utils.StringPointer("msgpack"),
|
||||
Tpexport_dir: utils.StringPointer("/var/log/cgrates/tpe"),
|
||||
Http_failed_dir: utils.StringPointer("/var/log/cgrates/http_failed"),
|
||||
Default_reqtype: utils.StringPointer(utils.META_RATED),
|
||||
Default_request_type: utils.StringPointer(utils.META_RATED),
|
||||
Default_category: utils.StringPointer("call"),
|
||||
Default_tenant: utils.StringPointer("cgrates.org"),
|
||||
Default_subject: utils.StringPointer("cgrates"),
|
||||
Default_timezone: utils.StringPointer("Local"),
|
||||
Connect_attempts: utils.IntPointer(3),
|
||||
Reconnects: utils.IntPointer(-1),
|
||||
@@ -74,12 +73,12 @@ func TestDfListenJsonCfg(t *testing.T) {
|
||||
|
||||
func TestDfDbJsonCfg(t *testing.T) {
|
||||
eCfg := &DbJsonCfg{
|
||||
Db_type: utils.StringPointer("redis"),
|
||||
Db_host: utils.StringPointer("127.0.0.1"),
|
||||
Db_port: utils.IntPointer(6379),
|
||||
Db_name: utils.StringPointer("10"),
|
||||
Db_user: utils.StringPointer(""),
|
||||
Db_passwd: utils.StringPointer(""),
|
||||
Db_type: utils.StringPointer("redis"),
|
||||
Db_host: utils.StringPointer("127.0.0.1"),
|
||||
Db_port: utils.IntPointer(6379),
|
||||
Db_name: utils.StringPointer("10"),
|
||||
Db_user: utils.StringPointer(""),
|
||||
Db_password: utils.StringPointer(""),
|
||||
}
|
||||
if cfg, err := dfCgrJsonCfg.DbJsonCfg(TPDB_JSN); err != nil {
|
||||
t.Error(err)
|
||||
@@ -92,7 +91,7 @@ func TestDfDbJsonCfg(t *testing.T) {
|
||||
Db_port: utils.IntPointer(6379),
|
||||
Db_name: utils.StringPointer("11"),
|
||||
Db_user: utils.StringPointer(""),
|
||||
Db_passwd: utils.StringPointer(""),
|
||||
Db_password: utils.StringPointer(""),
|
||||
Load_history_size: utils.IntPointer(10),
|
||||
}
|
||||
if cfg, err := dfCgrJsonCfg.DbJsonCfg(DATADB_JSN); err != nil {
|
||||
@@ -106,7 +105,7 @@ func TestDfDbJsonCfg(t *testing.T) {
|
||||
Db_port: utils.IntPointer(3306),
|
||||
Db_name: utils.StringPointer("cgrates"),
|
||||
Db_user: utils.StringPointer("cgrates"),
|
||||
Db_passwd: utils.StringPointer("CGRateS.org"),
|
||||
Db_password: utils.StringPointer("CGRateS.org"),
|
||||
Max_open_conns: utils.IntPointer(100),
|
||||
Max_idle_conns: utils.IntPointer(10),
|
||||
Cdrs_indexes: utils.StringSlicePointer([]string{}),
|
||||
@@ -127,10 +126,11 @@ func TestDfBalancerJsonCfg(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestDfRaterJsonCfg(t *testing.T) {
|
||||
eCfg := &RaterJsonCfg{Enabled: utils.BoolPointer(false), Balancer: utils.StringPointer(""), Cdrstats: utils.StringPointer(""),
|
||||
Historys: utils.StringPointer(""), Pubsubs: utils.StringPointer(""), Users: utils.StringPointer(""), Aliases: utils.StringPointer(""), Rp_subject_prefix_matching: utils.BoolPointer(false), Lcr_subject_prefix_matching: utils.BoolPointer(false)}
|
||||
if cfg, err := dfCgrJsonCfg.RaterJsonCfg(); err != nil {
|
||||
func TestDfRalsJsonCfg(t *testing.T) {
|
||||
eCfg := &RalsJsonCfg{Enabled: utils.BoolPointer(false), Balancer: utils.StringPointer(""), Cdrstats_conns: &[]*HaPoolJsonCfg{},
|
||||
Historys_conns: &[]*HaPoolJsonCfg{}, Pubsubs_conns: &[]*HaPoolJsonCfg{}, Users_conns: &[]*HaPoolJsonCfg{}, Aliases_conns: &[]*HaPoolJsonCfg{},
|
||||
Rp_subject_prefix_matching: utils.BoolPointer(false), Lcr_subject_prefix_matching: utils.BoolPointer(false)}
|
||||
if cfg, err := dfCgrJsonCfg.RalsJsonCfg(); err != nil {
|
||||
t.Error(err)
|
||||
} else if !reflect.DeepEqual(eCfg, cfg) {
|
||||
t.Errorf("Received: %+v", cfg)
|
||||
@@ -151,9 +151,9 @@ func TestDfCdrsJsonCfg(t *testing.T) {
|
||||
Enabled: utils.BoolPointer(false),
|
||||
Extra_fields: utils.StringSlicePointer([]string{}),
|
||||
Store_cdrs: utils.BoolPointer(true),
|
||||
Rater_conns: &[]*HaPoolJsonCfg{
|
||||
Rals_conns: &[]*HaPoolJsonCfg{
|
||||
&HaPoolJsonCfg{
|
||||
Server: utils.StringPointer("internal"),
|
||||
Address: utils.StringPointer("*internal"),
|
||||
}},
|
||||
Pubsubs_conns: &[]*HaPoolJsonCfg{},
|
||||
Users_conns: &[]*HaPoolJsonCfg{},
|
||||
@@ -304,9 +304,11 @@ func TestDfCdrcJsonCfg(t *testing.T) {
|
||||
}
|
||||
eCfg := map[string]*CdrcJsonCfg{
|
||||
"*default": &CdrcJsonCfg{
|
||||
Enabled: utils.BoolPointer(false),
|
||||
Dry_run: utils.BoolPointer(false),
|
||||
Cdrs: utils.StringPointer("internal"),
|
||||
Enabled: utils.BoolPointer(false),
|
||||
Dry_run: utils.BoolPointer(false),
|
||||
Cdrs_conns: &[]*HaPoolJsonCfg{&HaPoolJsonCfg{
|
||||
Address: utils.StringPointer(utils.MetaInternal),
|
||||
}},
|
||||
Cdr_format: utils.StringPointer("csv"),
|
||||
Field_separator: utils.StringPointer(","),
|
||||
Timezone: utils.StringPointer(""),
|
||||
@@ -336,13 +338,13 @@ func TestSmGenericJsonCfg(t *testing.T) {
|
||||
eCfg := &SmGenericJsonCfg{
|
||||
Enabled: utils.BoolPointer(false),
|
||||
Listen_bijson: utils.StringPointer("127.0.0.1:2014"),
|
||||
Rater_conns: &[]*HaPoolJsonCfg{
|
||||
Rals_conns: &[]*HaPoolJsonCfg{
|
||||
&HaPoolJsonCfg{
|
||||
Server: utils.StringPointer("internal"),
|
||||
Address: utils.StringPointer(utils.MetaInternal),
|
||||
}},
|
||||
Cdrs_conns: &[]*HaPoolJsonCfg{
|
||||
&HaPoolJsonCfg{
|
||||
Server: utils.StringPointer("internal"),
|
||||
Address: utils.StringPointer(utils.MetaInternal),
|
||||
}},
|
||||
Debit_interval: utils.StringPointer("0s"),
|
||||
Min_call_duration: utils.StringPointer("0s"),
|
||||
@@ -359,13 +361,13 @@ func TestSmGenericJsonCfg(t *testing.T) {
|
||||
func TestSmFsJsonCfg(t *testing.T) {
|
||||
eCfg := &SmFsJsonCfg{
|
||||
Enabled: utils.BoolPointer(false),
|
||||
Rater_conns: &[]*HaPoolJsonCfg{
|
||||
Rals_conns: &[]*HaPoolJsonCfg{
|
||||
&HaPoolJsonCfg{
|
||||
Server: utils.StringPointer("internal"),
|
||||
Address: utils.StringPointer(utils.MetaInternal),
|
||||
}},
|
||||
Cdrs_conns: &[]*HaPoolJsonCfg{
|
||||
&HaPoolJsonCfg{
|
||||
Server: utils.StringPointer("internal"),
|
||||
Address: utils.StringPointer(utils.MetaInternal),
|
||||
}},
|
||||
Create_cdr: utils.BoolPointer(false),
|
||||
Extra_fields: utils.StringSlicePointer([]string{}),
|
||||
@@ -379,9 +381,9 @@ func TestSmFsJsonCfg(t *testing.T) {
|
||||
Subscribe_park: utils.BoolPointer(true),
|
||||
Channel_sync_interval: utils.StringPointer("5m"),
|
||||
Max_wait_connection: utils.StringPointer("2s"),
|
||||
Connections: &[]*FsConnJsonCfg{
|
||||
Event_socket_conns: &[]*FsConnJsonCfg{
|
||||
&FsConnJsonCfg{
|
||||
Server: utils.StringPointer("127.0.0.1:8021"),
|
||||
Address: utils.StringPointer("127.0.0.1:8021"),
|
||||
Password: utils.StringPointer("ClueCon"),
|
||||
Reconnects: utils.IntPointer(5),
|
||||
}},
|
||||
@@ -396,21 +398,21 @@ func TestSmFsJsonCfg(t *testing.T) {
|
||||
func TestSmKamJsonCfg(t *testing.T) {
|
||||
eCfg := &SmKamJsonCfg{
|
||||
Enabled: utils.BoolPointer(false),
|
||||
Rater_conns: &[]*HaPoolJsonCfg{
|
||||
Rals_conns: &[]*HaPoolJsonCfg{
|
||||
&HaPoolJsonCfg{
|
||||
Server: utils.StringPointer("internal"),
|
||||
Address: utils.StringPointer(utils.MetaInternal),
|
||||
}},
|
||||
Cdrs_conns: &[]*HaPoolJsonCfg{
|
||||
&HaPoolJsonCfg{
|
||||
Server: utils.StringPointer("internal"),
|
||||
Address: utils.StringPointer(utils.MetaInternal),
|
||||
}},
|
||||
Create_cdr: utils.BoolPointer(false),
|
||||
Debit_interval: utils.StringPointer("10s"),
|
||||
Min_call_duration: utils.StringPointer("0s"),
|
||||
Max_call_duration: utils.StringPointer("3h"),
|
||||
Connections: &[]*KamConnJsonCfg{
|
||||
Evapi_conns: &[]*KamConnJsonCfg{
|
||||
&KamConnJsonCfg{
|
||||
Evapi_addr: utils.StringPointer("127.0.0.1:8448"),
|
||||
Address: utils.StringPointer("127.0.0.1:8448"),
|
||||
Reconnects: utils.IntPointer(5),
|
||||
},
|
||||
},
|
||||
@@ -426,13 +428,13 @@ func TestSmOsipsJsonCfg(t *testing.T) {
|
||||
eCfg := &SmOsipsJsonCfg{
|
||||
Enabled: utils.BoolPointer(false),
|
||||
Listen_udp: utils.StringPointer("127.0.0.1:2020"),
|
||||
Rater_conns: &[]*HaPoolJsonCfg{
|
||||
Rals_conns: &[]*HaPoolJsonCfg{
|
||||
&HaPoolJsonCfg{
|
||||
Server: utils.StringPointer("internal"),
|
||||
Address: utils.StringPointer(utils.MetaInternal),
|
||||
}},
|
||||
Cdrs_conns: &[]*HaPoolJsonCfg{
|
||||
&HaPoolJsonCfg{
|
||||
Server: utils.StringPointer("internal"),
|
||||
Address: utils.StringPointer(utils.MetaInternal),
|
||||
}},
|
||||
Create_cdr: utils.BoolPointer(false),
|
||||
Debit_interval: utils.StringPointer("10s"),
|
||||
@@ -455,7 +457,7 @@ func TestDiameterAgentJsonCfg(t *testing.T) {
|
||||
Dictionaries_dir: utils.StringPointer("/usr/share/cgrates/diameter/dict/"),
|
||||
Sm_generic_conns: &[]*HaPoolJsonCfg{
|
||||
&HaPoolJsonCfg{
|
||||
Server: utils.StringPointer("internal"),
|
||||
Address: utils.StringPointer(utils.MetaInternal),
|
||||
}},
|
||||
Pubsub_conns: nil,
|
||||
Create_cdr: utils.BoolPointer(true),
|
||||
@@ -567,10 +569,10 @@ func TestDfUserServJsonCfg(t *testing.T) {
|
||||
|
||||
func TestDfMailerJsonCfg(t *testing.T) {
|
||||
eCfg := &MailerJsonCfg{
|
||||
Server: utils.StringPointer("localhost"),
|
||||
Auth_user: utils.StringPointer("cgrates"),
|
||||
Auth_passwd: utils.StringPointer("CGRateS.org"),
|
||||
From_address: utils.StringPointer("cgr-mailer@localhost.localdomain"),
|
||||
Server: utils.StringPointer("localhost"),
|
||||
Auth_user: utils.StringPointer("cgrates"),
|
||||
Auth_password: utils.StringPointer("CGRateS.org"),
|
||||
From_address: utils.StringPointer("cgr-mailer@localhost.localdomain"),
|
||||
}
|
||||
if cfg, err := dfCgrJsonCfg.MailerJsonCfg(); err != nil {
|
||||
t.Error(err)
|
||||
@@ -620,11 +622,11 @@ func TestNewCgrJsonCfgFromFile(t *testing.T) {
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
eCfg := &GeneralJsonCfg{Default_reqtype: utils.StringPointer(utils.META_PSEUDOPREPAID)}
|
||||
eCfg := &GeneralJsonCfg{Default_request_type: utils.StringPointer(utils.META_PSEUDOPREPAID)}
|
||||
if gCfg, err := cgrJsonCfg.GeneralJsonCfg(); err != nil {
|
||||
t.Error(err)
|
||||
} else if !reflect.DeepEqual(eCfg, gCfg) {
|
||||
t.Error("Received: ", gCfg)
|
||||
t.Errorf("Expecting: %+v, received: ", eCfg, gCfg)
|
||||
}
|
||||
cdrFields := []*CdrFieldJsonCfg{
|
||||
&CdrFieldJsonCfg{Field_id: utils.StringPointer(utils.TOR), Value: utils.StringPointer("~7:s/^(voice|data|sms|mms|generic)$/*$1/")},
|
||||
@@ -651,18 +653,19 @@ func TestNewCgrJsonCfgFromFile(t *testing.T) {
|
||||
if cfg, err := cgrJsonCfg.CdrcJsonCfg(); err != nil {
|
||||
t.Error(err)
|
||||
} else if !reflect.DeepEqual(eCfgCdrc, cfg) {
|
||||
t.Error("Received: ", utils.ToIJSON(cfg["CDRC-CSV2"]))
|
||||
key := "CDRC-CSV2"
|
||||
t.Errorf("Expecting:\n %+v\n received:\n %+v\n", utils.ToIJSON(eCfgCdrc[key]), utils.ToIJSON(cfg[key]))
|
||||
}
|
||||
eCfgSmFs := &SmFsJsonCfg{
|
||||
Enabled: utils.BoolPointer(true),
|
||||
Connections: &[]*FsConnJsonCfg{
|
||||
Event_socket_conns: &[]*FsConnJsonCfg{
|
||||
&FsConnJsonCfg{
|
||||
Server: utils.StringPointer("1.2.3.4:8021"),
|
||||
Address: utils.StringPointer("1.2.3.4:8021"),
|
||||
Password: utils.StringPointer("ClueCon"),
|
||||
Reconnects: utils.IntPointer(5),
|
||||
},
|
||||
&FsConnJsonCfg{
|
||||
Server: utils.StringPointer("2.3.4.5:8021"),
|
||||
Address: utils.StringPointer("2.3.4.5:8021"),
|
||||
Password: utils.StringPointer("ClueCon"),
|
||||
Reconnects: utils.IntPointer(5),
|
||||
},
|
||||
|
||||
@@ -39,18 +39,18 @@ func TestLoadCgrCfgWithDefaults(t *testing.T) {
|
||||
{
|
||||
"sm_freeswitch": {
|
||||
"enabled": true, // starts SessionManager service: <true|false>
|
||||
"connections":[ // instantiate connections to multiple FreeSWITCH servers
|
||||
{"server": "1.2.3.4:8021", "password": "ClueCon", "reconnects": 3},
|
||||
{"server": "1.2.3.5:8021", "password": "ClueCon", "reconnects": 5}
|
||||
"event_socket_conns":[ // instantiate connections to multiple FreeSWITCH servers
|
||||
{"address": "1.2.3.4:8021", "password": "ClueCon", "reconnects": 3},
|
||||
{"address": "1.2.3.5:8021", "password": "ClueCon", "reconnects": 5}
|
||||
],
|
||||
},
|
||||
|
||||
}`
|
||||
eCgrCfg, _ := NewDefaultCGRConfig()
|
||||
eCgrCfg.SmFsConfig.Enabled = true
|
||||
eCgrCfg.SmFsConfig.Connections = []*FsConnConfig{
|
||||
&FsConnConfig{Server: "1.2.3.4:8021", Password: "ClueCon", Reconnects: 3},
|
||||
&FsConnConfig{Server: "1.2.3.5:8021", Password: "ClueCon", Reconnects: 5},
|
||||
eCgrCfg.SmFsConfig.EventSocketConns = []*FsConnConfig{
|
||||
&FsConnConfig{Address: "1.2.3.4:8021", Password: "ClueCon", Reconnects: 3},
|
||||
&FsConnConfig{Address: "1.2.3.5:8021", Password: "ClueCon", Reconnects: 5},
|
||||
}
|
||||
if cgrCfg, err := NewCGRConfigFromJsonStringWithDefaults(JSN_CFG); err != nil {
|
||||
t.Error(err)
|
||||
|
||||
@@ -37,7 +37,7 @@ func TestLoadCdrcConfigMultipleFiles(t *testing.T) {
|
||||
eCgrCfg.CdrcProfiles["/var/log/cgrates/cdrc/in"] = map[string]*CdrcConfig{
|
||||
"*default": &CdrcConfig{
|
||||
Enabled: false,
|
||||
Cdrs: "internal",
|
||||
CdrsConns: []*HaPoolConfig{&HaPoolConfig{Address: utils.MetaInternal}},
|
||||
CdrFormat: "csv",
|
||||
FieldSeparator: ',',
|
||||
DataUsageMultiplyFactor: 1024,
|
||||
@@ -82,7 +82,7 @@ func TestLoadCdrcConfigMultipleFiles(t *testing.T) {
|
||||
eCgrCfg.CdrcProfiles["/tmp/cgrates/cdrc1/in"] = map[string]*CdrcConfig{
|
||||
"CDRC-CSV1": &CdrcConfig{
|
||||
Enabled: true,
|
||||
Cdrs: "internal",
|
||||
CdrsConns: []*HaPoolConfig{&HaPoolConfig{Address: utils.MetaInternal}},
|
||||
CdrFormat: "csv",
|
||||
FieldSeparator: ',',
|
||||
DataUsageMultiplyFactor: 1024,
|
||||
@@ -125,7 +125,7 @@ func TestLoadCdrcConfigMultipleFiles(t *testing.T) {
|
||||
eCgrCfg.CdrcProfiles["/tmp/cgrates/cdrc2/in"] = map[string]*CdrcConfig{
|
||||
"CDRC-CSV2": &CdrcConfig{
|
||||
Enabled: true,
|
||||
Cdrs: "internal",
|
||||
CdrsConns: []*HaPoolConfig{&HaPoolConfig{Address: utils.MetaInternal}},
|
||||
CdrFormat: "csv",
|
||||
FieldSeparator: ',',
|
||||
DataUsageMultiplyFactor: 0.000976563,
|
||||
@@ -148,7 +148,7 @@ func TestLoadCdrcConfigMultipleFiles(t *testing.T) {
|
||||
eCgrCfg.CdrcProfiles["/tmp/cgrates/cdrc3/in"] = map[string]*CdrcConfig{
|
||||
"CDRC-CSV3": &CdrcConfig{
|
||||
Enabled: true,
|
||||
Cdrs: "internal",
|
||||
CdrsConns: []*HaPoolConfig{&HaPoolConfig{Address: utils.MetaInternal}},
|
||||
CdrFormat: "csv",
|
||||
FieldSeparator: ',',
|
||||
DataUsageMultiplyFactor: 1024,
|
||||
|
||||
@@ -26,12 +26,12 @@ import (
|
||||
|
||||
type CdrReplicationCfg struct {
|
||||
Transport string
|
||||
Server string
|
||||
Address string
|
||||
Synchronous bool
|
||||
Attempts int // Number of attempts if not success
|
||||
CdrFilter utils.RSRFields // Only replicate if the filters here are matching
|
||||
}
|
||||
|
||||
func (rplCfg CdrReplicationCfg) FallbackFileName() string {
|
||||
return fmt.Sprintf("cdr_%s_%s_%s.form", rplCfg.Transport, url.QueryEscape(rplCfg.Server), utils.GenUUID())
|
||||
return fmt.Sprintf("cdr_%s_%s_%s.form", rplCfg.Transport, url.QueryEscape(rplCfg.Address), utils.GenUUID())
|
||||
}
|
||||
|
||||
@@ -25,10 +25,9 @@ type GeneralJsonCfg struct {
|
||||
Dbdata_encoding *string
|
||||
Tpexport_dir *string
|
||||
Http_failed_dir *string
|
||||
Default_reqtype *string
|
||||
Default_request_type *string
|
||||
Default_category *string
|
||||
Default_tenant *string
|
||||
Default_subject *string
|
||||
Default_timezone *string
|
||||
Connect_attempts *int
|
||||
Reconnects *int
|
||||
@@ -50,7 +49,7 @@ type DbJsonCfg struct {
|
||||
Db_port *int
|
||||
Db_name *string
|
||||
Db_user *string
|
||||
Db_passwd *string
|
||||
Db_password *string
|
||||
Max_open_conns *int // Used only in case of storDb
|
||||
Max_idle_conns *int
|
||||
Load_history_size *int // Used in case of dataDb to limit the length of the loads history
|
||||
@@ -63,14 +62,14 @@ type BalancerJsonCfg struct {
|
||||
}
|
||||
|
||||
// Rater config section
|
||||
type RaterJsonCfg struct {
|
||||
type RalsJsonCfg struct {
|
||||
Enabled *bool
|
||||
Balancer *string
|
||||
Cdrstats *string
|
||||
Historys *string
|
||||
Pubsubs *string
|
||||
Aliases *string
|
||||
Users *string
|
||||
Cdrstats_conns *[]*HaPoolJsonCfg
|
||||
Historys_conns *[]*HaPoolJsonCfg
|
||||
Pubsubs_conns *[]*HaPoolJsonCfg
|
||||
Aliases_conns *[]*HaPoolJsonCfg
|
||||
Users_conns *[]*HaPoolJsonCfg
|
||||
Rp_subject_prefix_matching *bool
|
||||
Lcr_subject_prefix_matching *bool
|
||||
}
|
||||
@@ -85,7 +84,7 @@ type CdrsJsonCfg struct {
|
||||
Enabled *bool
|
||||
Extra_fields *[]string
|
||||
Store_cdrs *bool
|
||||
Rater_conns *[]*HaPoolJsonCfg
|
||||
Rals_conns *[]*HaPoolJsonCfg
|
||||
Pubsubs_conns *[]*HaPoolJsonCfg
|
||||
Users_conns *[]*HaPoolJsonCfg
|
||||
Aliases_conns *[]*HaPoolJsonCfg
|
||||
@@ -95,7 +94,7 @@ type CdrsJsonCfg struct {
|
||||
|
||||
type CdrReplicationJsonCfg struct {
|
||||
Transport *string
|
||||
Server *string
|
||||
Address *string
|
||||
Synchronous *bool
|
||||
Attempts *int
|
||||
Cdr_filter *string
|
||||
@@ -146,7 +145,7 @@ type CdreJsonCfg struct {
|
||||
type CdrcJsonCfg struct {
|
||||
Enabled *bool
|
||||
Dry_run *bool
|
||||
Cdrs *string
|
||||
Cdrs_conns *[]*HaPoolJsonCfg
|
||||
Cdr_format *string
|
||||
Field_separator *string
|
||||
Timezone *string
|
||||
@@ -169,7 +168,7 @@ type CdrcJsonCfg struct {
|
||||
type SmGenericJsonCfg struct {
|
||||
Enabled *bool
|
||||
Listen_bijson *string
|
||||
Rater_conns *[]*HaPoolJsonCfg
|
||||
Rals_conns *[]*HaPoolJsonCfg
|
||||
Cdrs_conns *[]*HaPoolJsonCfg
|
||||
Debit_interval *string
|
||||
Min_call_duration *string
|
||||
@@ -182,7 +181,7 @@ type SmGenericJsonCfg struct {
|
||||
// SM-FreeSWITCH config section
|
||||
type SmFsJsonCfg struct {
|
||||
Enabled *bool
|
||||
Rater_conns *[]*HaPoolJsonCfg
|
||||
Rals_conns *[]*HaPoolJsonCfg
|
||||
Cdrs_conns *[]*HaPoolJsonCfg
|
||||
Create_cdr *bool
|
||||
Extra_fields *[]string
|
||||
@@ -196,17 +195,17 @@ type SmFsJsonCfg struct {
|
||||
Subscribe_park *bool
|
||||
Channel_sync_interval *string
|
||||
Max_wait_connection *string
|
||||
Connections *[]*FsConnJsonCfg
|
||||
Event_socket_conns *[]*FsConnJsonCfg
|
||||
}
|
||||
|
||||
// Represents one connection instance towards a rater/cdrs server
|
||||
type HaPoolJsonCfg struct {
|
||||
Server *string
|
||||
Address *string
|
||||
}
|
||||
|
||||
// Represents one connection instance towards FreeSWITCH
|
||||
type FsConnJsonCfg struct {
|
||||
Server *string
|
||||
Address *string
|
||||
Password *string
|
||||
Reconnects *int
|
||||
}
|
||||
@@ -214,18 +213,18 @@ type FsConnJsonCfg struct {
|
||||
// SM-Kamailio config section
|
||||
type SmKamJsonCfg struct {
|
||||
Enabled *bool
|
||||
Rater_conns *[]*HaPoolJsonCfg
|
||||
Rals_conns *[]*HaPoolJsonCfg
|
||||
Cdrs_conns *[]*HaPoolJsonCfg
|
||||
Create_cdr *bool
|
||||
Debit_interval *string
|
||||
Min_call_duration *string
|
||||
Max_call_duration *string
|
||||
Connections *[]*KamConnJsonCfg
|
||||
Evapi_conns *[]*KamConnJsonCfg
|
||||
}
|
||||
|
||||
// Represents one connection instance towards Kamailio
|
||||
type KamConnJsonCfg struct {
|
||||
Evapi_addr *string
|
||||
Address *string
|
||||
Reconnects *int
|
||||
}
|
||||
|
||||
@@ -233,7 +232,7 @@ type KamConnJsonCfg struct {
|
||||
type SmOsipsJsonCfg struct {
|
||||
Enabled *bool
|
||||
Listen_udp *string
|
||||
Rater_conns *[]*HaPoolJsonCfg
|
||||
Rals_conns *[]*HaPoolJsonCfg
|
||||
Cdrs_conns *[]*HaPoolJsonCfg
|
||||
Create_cdr *bool
|
||||
Debit_interval *string
|
||||
@@ -305,10 +304,10 @@ type UserServJsonCfg struct {
|
||||
|
||||
// Mailer config section
|
||||
type MailerJsonCfg struct {
|
||||
Server *string
|
||||
Auth_user *string
|
||||
Auth_passwd *string
|
||||
From_address *string
|
||||
Server *string
|
||||
Auth_user *string
|
||||
Auth_password *string
|
||||
From_address *string
|
||||
}
|
||||
|
||||
// SureTax config section
|
||||
|
||||
@@ -35,15 +35,15 @@ func NewDfltHaPoolConfig() *HaPoolConfig {
|
||||
|
||||
// One connection to Rater
|
||||
type HaPoolConfig struct {
|
||||
Server string
|
||||
Address string
|
||||
}
|
||||
|
||||
func (self *HaPoolConfig) loadFromJsonCfg(jsnCfg *HaPoolJsonCfg) error {
|
||||
if jsnCfg == nil {
|
||||
return nil
|
||||
}
|
||||
if jsnCfg.Server != nil {
|
||||
self.Server = *jsnCfg.Server
|
||||
if jsnCfg.Address != nil {
|
||||
self.Address = *jsnCfg.Address
|
||||
}
|
||||
return nil
|
||||
}
|
||||
@@ -59,7 +59,7 @@ func NewDfltFsConnConfig() *FsConnConfig {
|
||||
|
||||
// One connection to FreeSWITCH server
|
||||
type FsConnConfig struct {
|
||||
Server string
|
||||
Address string
|
||||
Password string
|
||||
Reconnects int
|
||||
}
|
||||
@@ -68,8 +68,8 @@ func (self *FsConnConfig) loadFromJsonCfg(jsnCfg *FsConnJsonCfg) error {
|
||||
if jsnCfg == nil {
|
||||
return nil
|
||||
}
|
||||
if jsnCfg.Server != nil {
|
||||
self.Server = *jsnCfg.Server
|
||||
if jsnCfg.Address != nil {
|
||||
self.Address = *jsnCfg.Address
|
||||
}
|
||||
if jsnCfg.Password != nil {
|
||||
self.Password = *jsnCfg.Password
|
||||
@@ -83,8 +83,8 @@ func (self *FsConnConfig) loadFromJsonCfg(jsnCfg *FsConnJsonCfg) error {
|
||||
type SmGenericConfig struct {
|
||||
Enabled bool
|
||||
ListenBijson string
|
||||
RaterConns []*HaPoolConfig
|
||||
CdrsConns []*HaPoolConfig
|
||||
RALsConns []*HaPoolConfig
|
||||
CDRsConns []*HaPoolConfig
|
||||
DebitInterval time.Duration
|
||||
MinCallDuration time.Duration
|
||||
MaxCallDuration time.Duration
|
||||
@@ -104,18 +104,18 @@ func (self *SmGenericConfig) loadFromJsonCfg(jsnCfg *SmGenericJsonCfg) error {
|
||||
if jsnCfg.Listen_bijson != nil {
|
||||
self.ListenBijson = *jsnCfg.Listen_bijson
|
||||
}
|
||||
if jsnCfg.Rater_conns != nil {
|
||||
self.RaterConns = make([]*HaPoolConfig, len(*jsnCfg.Rater_conns))
|
||||
for idx, jsnHaCfg := range *jsnCfg.Rater_conns {
|
||||
self.RaterConns[idx] = NewDfltHaPoolConfig()
|
||||
self.RaterConns[idx].loadFromJsonCfg(jsnHaCfg)
|
||||
if jsnCfg.Rals_conns != nil {
|
||||
self.RALsConns = make([]*HaPoolConfig, len(*jsnCfg.Rals_conns))
|
||||
for idx, jsnHaCfg := range *jsnCfg.Rals_conns {
|
||||
self.RALsConns[idx] = NewDfltHaPoolConfig()
|
||||
self.RALsConns[idx].loadFromJsonCfg(jsnHaCfg)
|
||||
}
|
||||
}
|
||||
if jsnCfg.Cdrs_conns != nil {
|
||||
self.CdrsConns = make([]*HaPoolConfig, len(*jsnCfg.Cdrs_conns))
|
||||
self.CDRsConns = make([]*HaPoolConfig, len(*jsnCfg.Cdrs_conns))
|
||||
for idx, jsnHaCfg := range *jsnCfg.Cdrs_conns {
|
||||
self.CdrsConns[idx] = NewDfltHaPoolConfig()
|
||||
self.CdrsConns[idx].loadFromJsonCfg(jsnHaCfg)
|
||||
self.CDRsConns[idx] = NewDfltHaPoolConfig()
|
||||
self.CDRsConns[idx].loadFromJsonCfg(jsnHaCfg)
|
||||
}
|
||||
}
|
||||
if jsnCfg.Debit_interval != nil {
|
||||
@@ -157,8 +157,8 @@ func (self *SmGenericConfig) loadFromJsonCfg(jsnCfg *SmGenericJsonCfg) error {
|
||||
|
||||
type SmFsConfig struct {
|
||||
Enabled bool
|
||||
RaterConns []*HaPoolConfig
|
||||
CdrsConns []*HaPoolConfig
|
||||
RALsConns []*HaPoolConfig
|
||||
CDRsConns []*HaPoolConfig
|
||||
CreateCdr bool
|
||||
ExtraFields []*utils.RSRField
|
||||
DebitInterval time.Duration
|
||||
@@ -171,7 +171,7 @@ type SmFsConfig struct {
|
||||
SubscribePark bool
|
||||
ChannelSyncInterval time.Duration
|
||||
MaxWaitConnection time.Duration
|
||||
Connections []*FsConnConfig
|
||||
EventSocketConns []*FsConnConfig
|
||||
}
|
||||
|
||||
func (self *SmFsConfig) loadFromJsonCfg(jsnCfg *SmFsJsonCfg) error {
|
||||
@@ -182,18 +182,18 @@ func (self *SmFsConfig) loadFromJsonCfg(jsnCfg *SmFsJsonCfg) error {
|
||||
if jsnCfg.Enabled != nil {
|
||||
self.Enabled = *jsnCfg.Enabled
|
||||
}
|
||||
if jsnCfg.Rater_conns != nil {
|
||||
self.RaterConns = make([]*HaPoolConfig, len(*jsnCfg.Rater_conns))
|
||||
for idx, jsnHaCfg := range *jsnCfg.Rater_conns {
|
||||
self.RaterConns[idx] = NewDfltHaPoolConfig()
|
||||
self.RaterConns[idx].loadFromJsonCfg(jsnHaCfg)
|
||||
if jsnCfg.Rals_conns != nil {
|
||||
self.RALsConns = make([]*HaPoolConfig, len(*jsnCfg.Rals_conns))
|
||||
for idx, jsnHaCfg := range *jsnCfg.Rals_conns {
|
||||
self.RALsConns[idx] = NewDfltHaPoolConfig()
|
||||
self.RALsConns[idx].loadFromJsonCfg(jsnHaCfg)
|
||||
}
|
||||
}
|
||||
if jsnCfg.Cdrs_conns != nil {
|
||||
self.CdrsConns = make([]*HaPoolConfig, len(*jsnCfg.Cdrs_conns))
|
||||
self.CDRsConns = make([]*HaPoolConfig, len(*jsnCfg.Cdrs_conns))
|
||||
for idx, jsnHaCfg := range *jsnCfg.Cdrs_conns {
|
||||
self.CdrsConns[idx] = NewDfltHaPoolConfig()
|
||||
self.CdrsConns[idx].loadFromJsonCfg(jsnHaCfg)
|
||||
self.CDRsConns[idx] = NewDfltHaPoolConfig()
|
||||
self.CDRsConns[idx].loadFromJsonCfg(jsnHaCfg)
|
||||
}
|
||||
}
|
||||
if jsnCfg.Create_cdr != nil {
|
||||
@@ -246,11 +246,11 @@ func (self *SmFsConfig) loadFromJsonCfg(jsnCfg *SmFsJsonCfg) error {
|
||||
return err
|
||||
}
|
||||
}
|
||||
if jsnCfg.Connections != nil {
|
||||
self.Connections = make([]*FsConnConfig, len(*jsnCfg.Connections))
|
||||
for idx, jsnConnCfg := range *jsnCfg.Connections {
|
||||
self.Connections[idx] = NewDfltFsConnConfig()
|
||||
self.Connections[idx].loadFromJsonCfg(jsnConnCfg)
|
||||
if jsnCfg.Event_socket_conns != nil {
|
||||
self.EventSocketConns = make([]*FsConnConfig, len(*jsnCfg.Event_socket_conns))
|
||||
for idx, jsnConnCfg := range *jsnCfg.Event_socket_conns {
|
||||
self.EventSocketConns[idx] = NewDfltFsConnConfig()
|
||||
self.EventSocketConns[idx].loadFromJsonCfg(jsnConnCfg)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
@@ -267,7 +267,7 @@ func NewDfltKamConnConfig() *KamConnConfig {
|
||||
|
||||
// Represents one connection instance towards Kamailio
|
||||
type KamConnConfig struct {
|
||||
EvapiAddr string
|
||||
Address string
|
||||
Reconnects int
|
||||
}
|
||||
|
||||
@@ -275,8 +275,8 @@ func (self *KamConnConfig) loadFromJsonCfg(jsnCfg *KamConnJsonCfg) error {
|
||||
if jsnCfg == nil {
|
||||
return nil
|
||||
}
|
||||
if jsnCfg.Evapi_addr != nil {
|
||||
self.EvapiAddr = *jsnCfg.Evapi_addr
|
||||
if jsnCfg.Address != nil {
|
||||
self.Address = *jsnCfg.Address
|
||||
}
|
||||
if jsnCfg.Reconnects != nil {
|
||||
self.Reconnects = *jsnCfg.Reconnects
|
||||
@@ -287,13 +287,13 @@ func (self *KamConnConfig) loadFromJsonCfg(jsnCfg *KamConnJsonCfg) error {
|
||||
// SM-Kamailio config section
|
||||
type SmKamConfig struct {
|
||||
Enabled bool
|
||||
RaterConns []*HaPoolConfig
|
||||
CdrsConns []*HaPoolConfig
|
||||
RALsConns []*HaPoolConfig
|
||||
CDRsConns []*HaPoolConfig
|
||||
CreateCdr bool
|
||||
DebitInterval time.Duration
|
||||
MinCallDuration time.Duration
|
||||
MaxCallDuration time.Duration
|
||||
Connections []*KamConnConfig
|
||||
EvapiConns []*KamConnConfig
|
||||
}
|
||||
|
||||
func (self *SmKamConfig) loadFromJsonCfg(jsnCfg *SmKamJsonCfg) error {
|
||||
@@ -304,18 +304,18 @@ func (self *SmKamConfig) loadFromJsonCfg(jsnCfg *SmKamJsonCfg) error {
|
||||
if jsnCfg.Enabled != nil {
|
||||
self.Enabled = *jsnCfg.Enabled
|
||||
}
|
||||
if jsnCfg.Rater_conns != nil {
|
||||
self.RaterConns = make([]*HaPoolConfig, len(*jsnCfg.Rater_conns))
|
||||
for idx, jsnHaCfg := range *jsnCfg.Rater_conns {
|
||||
self.RaterConns[idx] = NewDfltHaPoolConfig()
|
||||
self.RaterConns[idx].loadFromJsonCfg(jsnHaCfg)
|
||||
if jsnCfg.Rals_conns != nil {
|
||||
self.RALsConns = make([]*HaPoolConfig, len(*jsnCfg.Rals_conns))
|
||||
for idx, jsnHaCfg := range *jsnCfg.Rals_conns {
|
||||
self.RALsConns[idx] = NewDfltHaPoolConfig()
|
||||
self.RALsConns[idx].loadFromJsonCfg(jsnHaCfg)
|
||||
}
|
||||
}
|
||||
if jsnCfg.Cdrs_conns != nil {
|
||||
self.CdrsConns = make([]*HaPoolConfig, len(*jsnCfg.Cdrs_conns))
|
||||
self.CDRsConns = make([]*HaPoolConfig, len(*jsnCfg.Cdrs_conns))
|
||||
for idx, jsnHaCfg := range *jsnCfg.Cdrs_conns {
|
||||
self.CdrsConns[idx] = NewDfltHaPoolConfig()
|
||||
self.CdrsConns[idx].loadFromJsonCfg(jsnHaCfg)
|
||||
self.CDRsConns[idx] = NewDfltHaPoolConfig()
|
||||
self.CDRsConns[idx].loadFromJsonCfg(jsnHaCfg)
|
||||
}
|
||||
}
|
||||
if jsnCfg.Create_cdr != nil {
|
||||
@@ -336,11 +336,11 @@ func (self *SmKamConfig) loadFromJsonCfg(jsnCfg *SmKamJsonCfg) error {
|
||||
return err
|
||||
}
|
||||
}
|
||||
if jsnCfg.Connections != nil {
|
||||
self.Connections = make([]*KamConnConfig, len(*jsnCfg.Connections))
|
||||
for idx, jsnConnCfg := range *jsnCfg.Connections {
|
||||
self.Connections[idx] = NewDfltKamConnConfig()
|
||||
self.Connections[idx].loadFromJsonCfg(jsnConnCfg)
|
||||
if jsnCfg.Evapi_conns != nil {
|
||||
self.EvapiConns = make([]*KamConnConfig, len(*jsnCfg.Evapi_conns))
|
||||
for idx, jsnConnCfg := range *jsnCfg.Evapi_conns {
|
||||
self.EvapiConns[idx] = NewDfltKamConnConfig()
|
||||
self.EvapiConns[idx].loadFromJsonCfg(jsnConnCfg)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
@@ -366,8 +366,8 @@ func (self *OsipsConnConfig) loadFromJsonCfg(jsnCfg *OsipsConnJsonCfg) error {
|
||||
type SmOsipsConfig struct {
|
||||
Enabled bool
|
||||
ListenUdp string
|
||||
RaterConns []*HaPoolConfig
|
||||
CdrsConns []*HaPoolConfig
|
||||
RALsConns []*HaPoolConfig
|
||||
CDRsConns []*HaPoolConfig
|
||||
CreateCdr bool
|
||||
DebitInterval time.Duration
|
||||
MinCallDuration time.Duration
|
||||
@@ -384,18 +384,18 @@ func (self *SmOsipsConfig) loadFromJsonCfg(jsnCfg *SmOsipsJsonCfg) error {
|
||||
if jsnCfg.Listen_udp != nil {
|
||||
self.ListenUdp = *jsnCfg.Listen_udp
|
||||
}
|
||||
if jsnCfg.Rater_conns != nil {
|
||||
self.RaterConns = make([]*HaPoolConfig, len(*jsnCfg.Rater_conns))
|
||||
for idx, jsnHaCfg := range *jsnCfg.Rater_conns {
|
||||
self.RaterConns[idx] = NewDfltHaPoolConfig()
|
||||
self.RaterConns[idx].loadFromJsonCfg(jsnHaCfg)
|
||||
if jsnCfg.Rals_conns != nil {
|
||||
self.RALsConns = make([]*HaPoolConfig, len(*jsnCfg.Rals_conns))
|
||||
for idx, jsnHaCfg := range *jsnCfg.Rals_conns {
|
||||
self.RALsConns[idx] = NewDfltHaPoolConfig()
|
||||
self.RALsConns[idx].loadFromJsonCfg(jsnHaCfg)
|
||||
}
|
||||
}
|
||||
if jsnCfg.Cdrs_conns != nil {
|
||||
self.CdrsConns = make([]*HaPoolConfig, len(*jsnCfg.Cdrs_conns))
|
||||
self.CDRsConns = make([]*HaPoolConfig, len(*jsnCfg.Cdrs_conns))
|
||||
for idx, jsnHaCfg := range *jsnCfg.Cdrs_conns {
|
||||
self.CdrsConns[idx] = NewDfltHaPoolConfig()
|
||||
self.CdrsConns[idx].loadFromJsonCfg(jsnHaCfg)
|
||||
self.CDRsConns[idx] = NewDfltHaPoolConfig()
|
||||
self.CDRsConns[idx].loadFromJsonCfg(jsnHaCfg)
|
||||
}
|
||||
}
|
||||
if jsnCfg.Create_cdr != nil {
|
||||
|
||||
@@ -29,14 +29,14 @@ func TesSmFsConfigLoadFromJsonCfg(t *testing.T) {
|
||||
Enabled: utils.BoolPointer(true),
|
||||
Create_cdr: utils.BoolPointer(true),
|
||||
Subscribe_park: utils.BoolPointer(true),
|
||||
Connections: &[]*FsConnJsonCfg{
|
||||
Event_socket_conns: &[]*FsConnJsonCfg{
|
||||
&FsConnJsonCfg{
|
||||
Server: utils.StringPointer("1.2.3.4:8021"),
|
||||
Address: utils.StringPointer("1.2.3.4:8021"),
|
||||
Password: utils.StringPointer("ClueCon"),
|
||||
Reconnects: utils.IntPointer(5),
|
||||
},
|
||||
&FsConnJsonCfg{
|
||||
Server: utils.StringPointer("2.3.4.5:8021"),
|
||||
Address: utils.StringPointer("2.3.4.5:8021"),
|
||||
Password: utils.StringPointer("ClueCon"),
|
||||
Reconnects: utils.IntPointer(5),
|
||||
},
|
||||
@@ -45,9 +45,9 @@ func TesSmFsConfigLoadFromJsonCfg(t *testing.T) {
|
||||
eSmFsConfig := &SmFsConfig{Enabled: true,
|
||||
CreateCdr: true,
|
||||
SubscribePark: true,
|
||||
Connections: []*FsConnConfig{
|
||||
&FsConnConfig{Server: "1.2.3.4:8021", Password: "ClueCon", Reconnects: 5},
|
||||
&FsConnConfig{Server: "1.2.3.4:8021", Password: "ClueCon", Reconnects: 5},
|
||||
EventSocketConns: []*FsConnConfig{
|
||||
&FsConnConfig{Address: "1.2.3.4:8021", Password: "ClueCon", Reconnects: 5},
|
||||
&FsConnConfig{Address: "1.2.3.4:8021", Password: "ClueCon", Reconnects: 5},
|
||||
},
|
||||
}
|
||||
smFsCfg := new(SmFsConfig)
|
||||
|
||||
@@ -144,6 +144,7 @@ const (
|
||||
DRYRUN = "dry_run"
|
||||
META_COMBIMED = "*combimed"
|
||||
INTERNAL = "internal"
|
||||
MetaInternal = "*internal"
|
||||
ZERO_RATING_SUBJECT_PREFIX = "*zero"
|
||||
OK = "OK"
|
||||
CDRE_FIXED_WIDTH = "fwv"
|
||||
|
||||
Reference in New Issue
Block a user