From 83ef5b6d6f5190af5d45c5d4bd66927353d57271 Mon Sep 17 00:00:00 2001 From: DanB Date: Wed, 22 May 2013 12:32:30 +0200 Subject: [PATCH] Adding CDRS configuration, better handling and testing of the defaults --- cdrs/cdrs.go | 10 ++- cdrs/fscdr.go | 8 +- cmd/cgr-rater/cgr-rater.go | 50 ++--------- config/config.go | 165 +++++++++++++++++++------------------ config/config_test.go | 97 ++++++++++++++++++++-- config/test_data.txt | 5 +- data/conf/cgrates.cfg | 16 ++-- sessionmanager/fsevent.go | 6 +- 8 files changed, 204 insertions(+), 153 deletions(-) diff --git a/cdrs/cdrs.go b/cdrs/cdrs.go index 1533741d1..f5ee379eb 100644 --- a/cdrs/cdrs.go +++ b/cdrs/cdrs.go @@ -22,12 +22,14 @@ import ( "fmt" "github.com/cgrates/cgrates/mediator" "github.com/cgrates/cgrates/rater" + "github.com/cgrates/cgrates/config" "io/ioutil" "net/http" ) var ( Logger = rater.Logger + cfg *config.CGRConfig // Share the configuration with the rest of the package ) type CDRS struct { @@ -49,7 +51,9 @@ func New(storage rater.DataStorage, mediator *mediator.Mediator) *CDRS { return &CDRS{storage, mediator} } -func (cdrs *CDRS) StartCaptiuringCDRs() { - http.HandleFunc("/cdr", cdrs.cdrHandler) - http.ListenAndServe(":8080", nil) +func (cdrs *CDRS) StartCapturingCDRs() { + if cfg.CDRSfsJSONEnabled { + http.HandleFunc("/freeswitch_json", cdrs.cdrHandler) + } + http.ListenAndServe(cfg.CDRSListen, nil) } diff --git a/cdrs/fscdr.go b/cdrs/fscdr.go index fd3ff3944..4672d3867 100644 --- a/cdrs/fscdr.go +++ b/cdrs/fscdr.go @@ -20,14 +20,12 @@ package cdrs import ( "encoding/json" - "github.com/cgrates/cgrates/config" "github.com/cgrates/cgrates/rater" "github.com/cgrates/cgrates/utils" "strconv" "time" ) -var cfg *config.CGRConfig // Share the configuration with the rest of the package const ( // Freswitch event property names @@ -97,13 +95,13 @@ func (fsCdr FSCdr) GetCallDestNr() string { return fsCdr[CALL_DEST_NR] } func (fsCdr FSCdr) GetTOR() string { - return utils.FirstNonEmpty(fsCdr[TOR], cfg.SMDefaultTOR) + return utils.FirstNonEmpty(fsCdr[TOR], cfg.DefaultTOR) } func (fsCdr FSCdr) GetUUID() string { return fsCdr[UUID] } func (fsCdr FSCdr) GetTenant() string { - return utils.FirstNonEmpty(fsCdr[CSTMID], cfg.SMDefaultTenant) + return utils.FirstNonEmpty(fsCdr[CSTMID], cfg.DefaultTenant) } func (fsCdr FSCdr) GetReqType() string { return utils.FirstNonEmpty(fsCdr[REQTYPE], cfg.SMDefaultReqType) @@ -112,7 +110,7 @@ func (fsCdr FSCdr) GetExtraParameters() string { return "" } func (fsCdr FSCdr) GetFallbackSubj() string { - return cfg.SMDefaultSubject + return cfg.DefaultSubject } func (fsCdr FSCdr) GetStartTime(field string) (t time.Time, err error) { st, err := strconv.ParseInt(fsCdr[field], 0, 64) diff --git a/cmd/cgr-rater/cgr-rater.go b/cmd/cgr-rater/cgr-rater.go index 9b4d93a8f..480b8773c 100644 --- a/cmd/cgr-rater/cgr-rater.go +++ b/cmd/cgr-rater/cgr-rater.go @@ -36,7 +36,6 @@ import ( "os" "runtime" "strconv" - "strings" "time" ) @@ -99,7 +98,7 @@ func startMediator(responder *rater.Responder, loggerDb rater.DataStorage) { } else { var client *rpc.Client var err error - if cfg.MediatorRPCEncoding == JSON { + if cfg.RPCEncoding == JSON { for i := 0; i < cfg.MediatorRaterReconnects; i++ { client, err = jsonrpc.Dial("tcp", cfg.MediatorRater) if err == nil { //Connected so no need to reiterate @@ -130,12 +129,6 @@ func startMediator(responder *rater.Responder, loggerDb rater.DataStorage) { rater.Logger.Crit(fmt.Sprintf("The output path for mediator does not exist: %v", cfg.MediatorCDROutDir)) exitChan <- true } - // ToDo: Why is here - // Check parsing errors - //if cfgParseErr != nil { - // rater.Logger.Crit(fmt.Sprintf("Errors on config parsing: <%v>", cfgParseErr)) - // exitChan <- true - //} var err error medi, err = mediator.NewMediator(connector, loggerDb, cfg.MediatorSkipDB, cfg.MediatorCDROutDir, cfg.MediatorPseudoprepaid, cfg.FreeswitchDirectionIdx, cfg.FreeswitchTORIdx, cfg.FreeswitchTenantIdx, cfg.FreeswitchSubjectIdx, cfg.FreeswitchAccountIdx, @@ -155,7 +148,7 @@ func startSessionManager(responder *rater.Responder, loggerDb rater.DataStorage) } else { var client *rpc.Client var err error - if cfg.SMRPCEncoding == JSON { + if cfg.RPCEncoding == JSON { // We attempt to reconnect more times for i := 0; i < cfg.SMRaterReconnects; i++ { client, err = jsonrpc.Dial("tcp", cfg.SMRater) @@ -205,38 +198,6 @@ func checkConfigSanity() error { return errors.New("Improperly configured balancer") } - // check if the session manager or mediator is connectting via loopback - // if they are using the same encoding as the rater/balancer - // this scenariou should be used for debug puropses only (it is racy anyway) - // and it might be forbidden in the future - if strings.Contains(cfg.SMRater, "localhost") || strings.Contains(cfg.SMRater, "127.0.0.1") { - if cfg.BalancerEnabled { - if cfg.BalancerRPCEncoding != cfg.SMRPCEncoding { - rater.Logger.Crit("If you are connecting the session manager via the loopback to the balancer use the same type of rpc encoding!") - return errors.New("Balancer and SessionManager using different encoding") - } - } - if cfg.RaterEnabled { - if cfg.RaterRPCEncoding != cfg.SMRPCEncoding { - rater.Logger.Crit("If you are connecting the session manager via the loopback to the arter use the same type of rpc encoding!") - return errors.New("Rater and SessionManager using different encoding") - } - } - } - if strings.Contains(cfg.MediatorRater, "localhost") || strings.Contains(cfg.MediatorRater, "127.0.0.1") { - if cfg.BalancerEnabled { - if cfg.BalancerRPCEncoding != cfg.MediatorRPCEncoding { - rater.Logger.Crit("If you are connecting the mediator via the loopback to the balancer use the same type of rpc encoding!") - return errors.New("Balancer and Mediator using different encoding") - } - } - if cfg.RaterEnabled { - if cfg.RaterRPCEncoding != cfg.MediatorRPCEncoding { - rater.Logger.Crit("If you are connecting the mediator via the loopback to the arter use the same type of rpc encoding!") - return errors.New("Rater and Mediator using different encoding") - } - } - } return nil } @@ -322,13 +283,13 @@ func main() { responder := &rater.Responder{ExitChan: exitChan} if cfg.RaterEnabled && !cfg.BalancerEnabled && cfg.RaterListen != INTERNAL { rater.Logger.Info(fmt.Sprintf("Starting CGRateS Rater on %s.", cfg.RaterListen)) - go listenToRPCRequests(responder, cfg.RaterListen, cfg.RaterRPCEncoding) + go listenToRPCRequests(responder, cfg.RaterListen, cfg.RPCEncoding) } if cfg.BalancerEnabled { rater.Logger.Info(fmt.Sprintf("Starting CGRateS Balancer on %s.", cfg.BalancerListen)) go stopBalancerSingnalHandler() responder.Bal = bal - go listenToRPCRequests(responder, cfg.BalancerListen, cfg.BalancerRPCEncoding) + go listenToRPCRequests(responder, cfg.BalancerListen, cfg.RPCEncoding) if cfg.RaterEnabled { rater.Logger.Info("Starting internal rater.") bal.AddClient("local", new(rater.ResponderWorker)) @@ -356,10 +317,11 @@ func main() { rater.Logger.Info("Starting CGRateS Mediator.") go startMediator(responder, loggerDb) } + if cfg.CDRServerEnabled { rater.Logger.Info("Starting CGRateS CDR Server.") cs := cdrs.New(loggerDb, medi) - go cs.StartCaptiuringCDRs() + go cs.StartCapturingCDRs() } <-exitChan rater.Logger.Info("Stopped all components. CGRateS shutdown!") diff --git a/config/config.go b/config/config.go index db86514aa..cb866d02b 100644 --- a/config/config.go +++ b/config/config.go @@ -50,31 +50,31 @@ type CGRConfig struct { LogDBName string // The name of the database to connect to. LogDBUser string // The user to sign in as. LogDBPass string // The user's password. + RPCEncoding string // RPC encoding used on APIs: . + DefaultTOR string // set default type of record + DefaultTenant string // set default tenant + DefaultSubject string // set default rating subject, useful in case of fallback RaterEnabled bool // start standalone server (no balancer) RaterBalancer string // balancer address host:port RaterListen string // listening address host:port - RaterRPCEncoding string // use JSON for RPC encoding BalancerEnabled bool BalancerListen string // Json RPC server address - BalancerRPCEncoding string // use JSON for RPC encoding SchedulerEnabled bool + CDRSListen string // CDRS's listening interface: . + CDRSfsJSONEnabled bool // Enable the handler for FreeSWITCH JSON CDRs: . SMEnabled bool SMSwitchType string SMRater string // address where to access rater. Can be internal, direct rater address or the address of a balancer SMRaterReconnects int // Number of reconnect attempts to rater SMDebitInterval int // the period to be debited in advanced during a call (in seconds) - SMRPCEncoding string // use JSON for RPC encoding SMDefaultReqType string // Use this request type if not defined on top - SMDefaultTOR string // set default type of record - SMDefaultTenant string // set default tenant - SMDefaultSubject string // set default rating subject, useful in case of fallback MediatorEnabled bool + MediatorListen string // listening address host:port MediatorCDRType string // sets the type of cdrs we are processing. MediatorCDRInDir string // Freeswitch Master CSV CDR path. MediatorCDROutDir string // Freeswitch Master CSV CDR output path. MediatorRater string // address where to access rater. Can be internal, direct rater address or the address of a balancer MediatorRaterReconnects int // Number of reconnect attempts to rater - MediatorRPCEncoding string // use JSON for RPC encoding MediatorSkipDB bool MediatorPseudoprepaid bool FreeswitchServer string // freeswitch address host:port @@ -92,6 +92,63 @@ type CGRConfig struct { CDRServerEnabled bool } +func ( self *CGRConfig ) setDefaults() error { + self.DataDBType = REDIS + self.DataDBHost = "127.0.0.1" + self.DataDBPort = "6379" + self.DataDBName = "10" + self.DataDBUser = "" + self.DataDBPass = "" + self.LogDBType = MONGO + self.LogDBHost = "localhost" + self.LogDBPort = "27017" + self.LogDBName = "cgrates" + self.LogDBUser = "" + self.LogDBPass = "" + self.RPCEncoding = GOB + self.DefaultTOR = "0" + self.DefaultTenant = "0" + self.DefaultSubject = "0" + self.RaterEnabled = false + self.RaterBalancer = DISABLED + self.RaterListen = "127.0.0.1:2012" + self.BalancerEnabled = false + self.BalancerListen = "127.0.0.1:2013" + self.SchedulerEnabled = false + self.CDRSListen = "127.0.0.1:2022" + self.CDRSfsJSONEnabled = false + self.MediatorEnabled = false + self.MediatorListen = "127.0.0.1:2032" + self.MediatorCDRInDir = "/var/log/freeswitch/cdr-csv" + self.MediatorCDROutDir = "/var/log/cgrates/cdr_out" + self.MediatorRater = "127.0.0.1:2012" + self.MediatorRaterReconnects = 3 + self.MediatorSkipDB = false + self.MediatorPseudoprepaid = false + self.MediatorCDRType = "freeswitch_csv" + self.SMEnabled = false + self.SMSwitchType = FS + self.SMRater = "127.0.0.1:2012" + self.SMRaterReconnects = 3 + self.SMDebitInterval = 10 + self.SMDefaultReqType = "" + self.FreeswitchServer = "127.0.0.1:8021" + self.FreeswitchPass = "ClueCon" + self.FreeswitchReconnects = 5 + self.FreeswitchUUIDIdx = "10" + self.FreeswitchTORIdx = "-1" + self.FreeswitchTenantIdx = "-1" + self.FreeswitchDirectionIdx = "-1" + self.FreeswitchSubjectIdx = "-1" + self.FreeswitchAccountIdx = "-1" + self.FreeswitchDestIdx = "-1" + self.FreeswitchTimeStartIdx = "-1" + self.FreeswitchDurationIdx = "-1" + + return nil +} + + // Instantiate a new CGRConfig setting defaults or reading from file func NewCGRConfig(cfgPath *string) (*CGRConfig, error) { c, err := conf.ReadConfigFile(*cfgPath) @@ -111,208 +168,158 @@ func NewCGRConfigBytes(data []byte) (*CGRConfig, error) { func loadConfig(c *conf.ConfigFile) (*CGRConfig, error) { cfg := &CGRConfig{} + cfg.setDefaults() var hasOpt bool - cfg.DataDBType = REDIS if hasOpt = c.HasOption("global", "datadb_type"); hasOpt { cfg.DataDBType, _ = c.GetString("global", "datadb_type") } - cfg.DataDBHost = "127.0.0.1" if hasOpt = c.HasOption("global", "datadb_host"); hasOpt { cfg.DataDBHost, _ = c.GetString("global", "datadb_host") } - cfg.DataDBPort = "6379" if hasOpt = c.HasOption("global", "datadb_port"); hasOpt { cfg.DataDBPort, _ = c.GetString("global", "datadb_port") } - cfg.DataDBName = "10" if hasOpt = c.HasOption("global", "datadb_name"); hasOpt { cfg.DataDBName, _ = c.GetString("global", "datadb_name") } - cfg.DataDBUser = "" if hasOpt = c.HasOption("global", "datadb_user"); hasOpt { cfg.DataDBUser, _ = c.GetString("global", "datadb_user") } - cfg.DataDBPass = "" if hasOpt = c.HasOption("global", "datadb_passwd"); hasOpt { cfg.DataDBPass, _ = c.GetString("global", "datadb_passwd") } - cfg.LogDBType = MONGO if hasOpt = c.HasOption("global", "logdb_type"); hasOpt { cfg.LogDBType, _ = c.GetString("global", "logdb_type") } - cfg.LogDBHost = "localhost" if hasOpt = c.HasOption("global", "logdb_host"); hasOpt { cfg.LogDBHost, _ = c.GetString("global", "logdb_host") } - cfg.LogDBPort = "27017" if hasOpt = c.HasOption("global", "logdb_port"); hasOpt { cfg.LogDBPort, _ = c.GetString("global", "logdb_port") } - cfg.LogDBName = "cgrates" if hasOpt = c.HasOption("global", "logdb_name"); hasOpt { cfg.LogDBName, _ = c.GetString("global", "logdb_name") } - cfg.LogDBUser = "" if hasOpt = c.HasOption("global", "logdb_user"); hasOpt { cfg.LogDBUser, _ = c.GetString("global", "logdb_user") } - cfg.LogDBPass = "" if hasOpt = c.HasOption("global", "logdb_passwd"); hasOpt { cfg.LogDBPass, _ = c.GetString("global", "logdb_passwd") } - cfg.RaterEnabled = false + if hasOpt = c.HasOption("global", "rpc_encoding"); hasOpt { + cfg.RPCEncoding, _ = c.GetString("global", "rpc_encoding") + } + if hasOpt = c.HasOption("global", "default_tor"); hasOpt { + cfg.DefaultTOR, _ = c.GetString("global", "default_tor") + } + if hasOpt = c.HasOption("global", "default_tenant"); hasOpt { + cfg.DefaultTenant, _ = c.GetString("global", "default_tenant") + } + if hasOpt = c.HasOption("global", "default_subject"); hasOpt { + cfg.DefaultSubject, _ = c.GetString("global", "default_subject") + } if hasOpt = c.HasOption("rater", "enabled"); hasOpt { cfg.RaterEnabled, _ = c.GetBool("rater", "enabled") } - cfg.RaterBalancer = DISABLED if hasOpt = c.HasOption("rater", "balancer"); hasOpt { cfg.RaterBalancer, _ = c.GetString("rater", "balancer") } - cfg.RaterListen = "127.0.0.1:2012" if hasOpt = c.HasOption("rater", "listen"); hasOpt { cfg.RaterListen, _ = c.GetString("rater", "listen") } - cfg.RaterRPCEncoding = GOB - if hasOpt = c.HasOption("rater", "rpc_encoding"); hasOpt { - cfg.RaterRPCEncoding, _ = c.GetString("rater", "rpc_encoding") - } - cfg.BalancerEnabled = false if hasOpt = c.HasOption("balancer", "enabled"); hasOpt { cfg.BalancerEnabled, _ = c.GetBool("balancer", "enabled") } - cfg.BalancerListen = "127.0.0.1:2013" if hasOpt = c.HasOption("balancer", "listen"); hasOpt { cfg.BalancerListen, _ = c.GetString("balancer", "listen") } - cfg.BalancerRPCEncoding = GOB - if hasOpt = c.HasOption("balancer", "rpc_encoding"); hasOpt { - cfg.BalancerRPCEncoding, _ = c.GetString("balancer", "rpc_encoding") - } - cfg.SchedulerEnabled = false if hasOpt = c.HasOption("scheduler", "enabled"); hasOpt { cfg.SchedulerEnabled, _ = c.GetBool("scheduler", "enabled") } - cfg.MediatorEnabled = false + if hasOpt = c.HasOption("cdrs", "listen"); hasOpt { + cfg.CDRSListen, _ = c.GetString("cdrs", "listen") + } + if hasOpt = c.HasOption("cdrs", "enabled"); hasOpt { + cfg.CDRSfsJSONEnabled, _ = c.GetBool("cdrs", "enabled") + } if hasOpt = c.HasOption("mediator", "enabled"); hasOpt { cfg.MediatorEnabled, _ = c.GetBool("mediator", "enabled") } - cfg.MediatorCDRInDir = "/var/log/freeswitch/cdr-csv" + if hasOpt = c.HasOption("mediator", "listen"); hasOpt { + cfg.MediatorListen, _ = c.GetString("mediator", "listen") + } if hasOpt = c.HasOption("mediator", "cdr_in_dir"); hasOpt { cfg.MediatorCDRInDir, _ = c.GetString("mediator", "cdr_in_dir") } - cfg.MediatorCDROutDir = "/var/log/cgrates/cdr_out" if hasOpt = c.HasOption("mediator", "cdr_out_dir"); hasOpt { cfg.MediatorCDROutDir, _ = c.GetString("mediator", "cdr_out_dir") } - cfg.MediatorRater = "127.0.0.1:2012" if hasOpt = c.HasOption("mediator", "rater"); hasOpt { cfg.MediatorRater, _ = c.GetString("mediator", "rater") } - cfg.MediatorRaterReconnects = 3 if hasOpt = c.HasOption("mediator", "rater_reconnects"); hasOpt { cfg.MediatorRaterReconnects, _ = c.GetInt("mediator", "rater_reconnects") } - cfg.MediatorRPCEncoding = GOB - if hasOpt = c.HasOption("mediator", "rpc_encoding"); hasOpt { - cfg.MediatorRPCEncoding, _ = c.GetString("mediator", "rpc_encoding") - } - cfg.MediatorSkipDB = false if hasOpt = c.HasOption("mediator", "skipdb"); hasOpt { cfg.MediatorSkipDB, _ = c.GetBool("mediator", "skipdb") } - cfg.MediatorPseudoprepaid = false if hasOpt = c.HasOption("mediator", "pseudoprepaid"); hasOpt { cfg.MediatorPseudoprepaid, _ = c.GetBool("mediator", "pseudoprepaid") } - cfg.MediatorCDRType = "freeswitch_csv" if hasOpt = c.HasOption("mediator", "cdr_type"); hasOpt { cfg.MediatorCDRType, _ = c.GetString("mediator", "cdr_type") } - cfg.SMEnabled = false if hasOpt = c.HasOption("session_manager", "enabled"); hasOpt { cfg.SMEnabled, _ = c.GetBool("session_manager", "enabled") } - cfg.SMSwitchType = FS if hasOpt = c.HasOption("session_manager", "switch_type"); hasOpt { cfg.SMSwitchType, _ = c.GetString("session_manager", "switch_type") } - cfg.SMRater = "127.0.0.1:2012" if hasOpt = c.HasOption("session_manager", "rater"); hasOpt { cfg.SMRater, _ = c.GetString("session_manager", "rater") } - cfg.SMRaterReconnects = 3 if hasOpt = c.HasOption("session_manager", "rater_reconnects"); hasOpt { cfg.SMRaterReconnects, _ = c.GetInt("session_manager", "rater_reconnects") } - cfg.SMDebitInterval = 10 if hasOpt = c.HasOption("session_manager", "debit_interval"); hasOpt { cfg.SMDebitInterval, _ = c.GetInt("session_manager", "debit_interval") } - cfg.SMRPCEncoding = GOB - if hasOpt = c.HasOption("session_manager", "rpc_encoding"); hasOpt { - cfg.SMRPCEncoding, _ = c.GetString("session_manager", "rpc_encoding") - } - cfg.SMDefaultReqType = "" // By default CGRateS is inactive, customer should activate when he feels he is ready if hasOpt = c.HasOption("session_manager", "default_reqtype"); hasOpt { cfg.SMDefaultReqType, _ = c.GetString("session_manager", "default_reqtype") } - cfg.SMDefaultTOR = "0" - if hasOpt = c.HasOption("session_manager", "default_tor"); hasOpt { - cfg.SMDefaultTOR, _ = c.GetString("session_manager", "default_tor") - } - cfg.SMDefaultTenant = "0" - if hasOpt = c.HasOption("session_manager", "default_tenant"); hasOpt { - cfg.SMDefaultTenant, _ = c.GetString("session_manager", "default_tenant") - } - cfg.SMDefaultSubject = "0" - if hasOpt = c.HasOption("session_manager", "default_subject"); hasOpt { - cfg.SMDefaultSubject, _ = c.GetString("session_manager", "default_subject") - } - cfg.FreeswitchServer = "127.0.0.1:8021" if hasOpt = c.HasOption("freeswitch", "server"); hasOpt { cfg.FreeswitchServer, _ = c.GetString("freeswitch", "server") } - cfg.FreeswitchPass = "ClueCon" if hasOpt = c.HasOption("freeswitch", "passwd"); hasOpt { cfg.FreeswitchPass, _ = c.GetString("freeswitch", "passwd") } - cfg.FreeswitchReconnects = 5 if hasOpt = c.HasOption("freeswitch", "reconnects"); hasOpt { cfg.FreeswitchReconnects, _ = c.GetInt("freeswitch", "reconnects") } - cfg.FreeswitchUUIDIdx = "10" if hasOpt = c.HasOption("freeswitch", "uuid_index"); hasOpt { cfg.FreeswitchUUIDIdx, _ = c.GetString("freeswitch", "uuid_index") } - cfg.FreeswitchTORIdx = "-1" if hasOpt = c.HasOption("freeswitch", "tor_index"); hasOpt { cfg.FreeswitchTORIdx, _ = c.GetString("freeswitch", "tor_index") } - cfg.FreeswitchTenantIdx = "-1" if hasOpt = c.HasOption("freeswitch", "tenant_index"); hasOpt { cfg.FreeswitchTenantIdx, _ = c.GetString("freeswitch", "tenant_index") } - cfg.FreeswitchDirectionIdx = "-1" if hasOpt = c.HasOption("freeswitch", "direction_index"); hasOpt { cfg.FreeswitchDirectionIdx, _ = c.GetString("freeswitch", "direction_index") } - cfg.FreeswitchSubjectIdx = "-1" if hasOpt = c.HasOption("freeswitch", "subject_index"); hasOpt { cfg.FreeswitchSubjectIdx, _ = c.GetString("freeswitch", "subject_index") } - cfg.FreeswitchAccountIdx = "-1" if hasOpt = c.HasOption("freeswitch", "account_index"); hasOpt { cfg.FreeswitchAccountIdx, _ = c.GetString("freeswitch", "account_index") } - cfg.FreeswitchDestIdx = "-1" if hasOpt = c.HasOption("freeswitch", "destination_index"); hasOpt { cfg.FreeswitchDestIdx, _ = c.GetString("freeswitch", "destination_index") } - cfg.FreeswitchTimeStartIdx = "-1" if hasOpt = c.HasOption("freeswitch", "time_start_index"); hasOpt { cfg.FreeswitchTimeStartIdx, _ = c.GetString("freeswitch", "time_start_index") } - cfg.FreeswitchDurationIdx = "-1" if hasOpt = c.HasOption("freeswitch", "duration_index"); hasOpt { cfg.FreeswitchDurationIdx, _ = c.GetString("freeswitch", "duration_index") } diff --git a/config/config_test.go b/config/config_test.go index 708dd7cc6..421ce7204 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -42,24 +42,21 @@ func TestConfig(t *testing.T) { cfg.LogDBName != "test" || cfg.LogDBUser != "test" || cfg.LogDBPass != "test" || + cfg.RPCEncoding != "test" || cfg.RaterEnabled != true || cfg.RaterBalancer != "test" || cfg.RaterListen != "test" || - cfg.RaterRPCEncoding != "test" || cfg.BalancerEnabled != true || cfg.BalancerListen != "test" || - cfg.BalancerRPCEncoding != "test" || cfg.SchedulerEnabled != true || cfg.SMEnabled != true || cfg.SMSwitchType != "test" || cfg.SMRater != "test" || cfg.SMDebitInterval != 11 || - cfg.SMRPCEncoding != "test" || cfg.MediatorEnabled != true || cfg.MediatorCDRInDir != "test" || cfg.MediatorCDROutDir != "test" || cfg.MediatorRater != "test" || - cfg.MediatorRPCEncoding != "test" || cfg.MediatorSkipDB != true || cfg.MediatorPseudoprepaid != true || cfg.FreeswitchServer != "test" || @@ -85,24 +82,21 @@ func TestConfig(t *testing.T) { t.Log(cfg.LogDBName) t.Log(cfg.LogDBUser) t.Log(cfg.LogDBPass) + t.Log(cfg.RPCEncoding) t.Log(cfg.RaterEnabled) t.Log(cfg.RaterBalancer) t.Log(cfg.RaterListen) - t.Log(cfg.RaterRPCEncoding) t.Log(cfg.BalancerEnabled) t.Log(cfg.BalancerListen) - t.Log(cfg.BalancerRPCEncoding) t.Log(cfg.SchedulerEnabled) t.Log(cfg.SMEnabled) t.Log(cfg.SMSwitchType) t.Log(cfg.SMRater) t.Log(cfg.SMDebitInterval) - t.Log(cfg.SMRPCEncoding) t.Log(cfg.MediatorEnabled) t.Log(cfg.MediatorCDRInDir) t.Log(cfg.MediatorCDROutDir) t.Log(cfg.MediatorRater) - t.Log(cfg.MediatorRPCEncoding) t.Log(cfg.MediatorSkipDB) t.Log(cfg.MediatorPseudoprepaid) t.Log(cfg.FreeswitchServer) @@ -133,3 +127,90 @@ func TestParamOverwrite(t *testing.T) { t.Errorf("scheduler_enabled set == %d, expect true", cfg.SchedulerEnabled) } } + +// Make sure defaults did not change by mistake +func TestDefaults(t *testing.T) { + cfg := &CGRConfig{} + errSet := cfg.setDefaults() + if errSet != nil { + t.Log(fmt.Sprintf("Coud not set defaults: %s!", errSet.Error())) + t.FailNow() + } + if cfg.DataDBType != REDIS || + cfg.DataDBHost != "127.0.0.1" || + cfg.DataDBPort != "6379" || + cfg.DataDBName != "10" || + cfg.DataDBUser != "" || + cfg.DataDBPass != "" || + cfg.LogDBType != MONGO || + cfg.LogDBHost != "localhost" || + cfg.LogDBPort != "27017" || + cfg.LogDBName != "cgrates" || + cfg.LogDBUser != "" || + cfg.LogDBPass != "" || + cfg.RPCEncoding != GOB || + cfg.DefaultTOR != "0" || + cfg.DefaultTenant != "0" || + cfg.DefaultSubject != "0" || + cfg.RaterEnabled != false || + cfg.RaterBalancer != DISABLED || + cfg.RaterListen != "127.0.0.1:2012" || + cfg.BalancerEnabled != false || + cfg.BalancerListen != "127.0.0.1:2013" || + cfg.SchedulerEnabled != false || + cfg.CDRSListen != "127.0.0.1:2022" || + cfg.CDRSfsJSONEnabled != false || + cfg.MediatorEnabled != false || + cfg.MediatorListen != "127.0.0.1:2032" || + cfg.MediatorCDRInDir != "/var/log/freeswitch/cdr-csv" || + cfg.MediatorCDROutDir != "/var/log/cgrates/cdr_out" || + cfg.MediatorRater != "127.0.0.1:2012" || + cfg.MediatorRaterReconnects != 3 || + cfg.MediatorSkipDB != false || + cfg.MediatorPseudoprepaid != false || + cfg.MediatorCDRType != "freeswitch_csv" || + cfg.SMEnabled != false || + cfg.SMSwitchType != FS || + cfg.SMRater != "127.0.0.1:2012" || + cfg.SMRaterReconnects != 3 || + cfg.SMDebitInterval != 10 || + cfg.SMDefaultReqType != "" || + cfg.FreeswitchServer != "127.0.0.1:8021" || + cfg.FreeswitchPass != "ClueCon" || + cfg.FreeswitchReconnects != 5 || + cfg.FreeswitchUUIDIdx != "10" || + cfg.FreeswitchTORIdx != "-1" || + cfg.FreeswitchTenantIdx != "-1" || + cfg.FreeswitchDirectionIdx != "-1" || + cfg.FreeswitchSubjectIdx != "-1" || + cfg.FreeswitchAccountIdx != "-1" || + cfg.FreeswitchDestIdx != "-1" || + cfg.FreeswitchTimeStartIdx != "-1" || + cfg.FreeswitchDurationIdx != "-1" { + t.Error("Defaults different than expected!") + } + +} + +// Make sure defaults did not change by mistake +func TestDefaultsSanity(t *testing.T) { + cfg := &CGRConfig{} + errSet := cfg.setDefaults() + if errSet != nil { + t.Log(fmt.Sprintf("Coud not set defaults: %s!", errSet.Error())) + t.FailNow() + } + if cfg.RaterListen == cfg.BalancerListen || + cfg.RaterListen == cfg.CDRSListen || + cfg.RaterListen == cfg.MediatorListen || + cfg.BalancerListen == cfg.CDRSListen || + cfg.BalancerListen == cfg.MediatorListen || + cfg.CDRSListen == cfg.MediatorListen { + t.Error("Listen defaults on the same port!") + } +} + + + + + diff --git a/config/test_data.txt b/config/test_data.txt index 72aa61c70..737d12017 100644 --- a/config/test_data.txt +++ b/config/test_data.txt @@ -14,24 +14,22 @@ logdb_port = test # The port to bind to. logdb_name = test # The name of the database to connect to. logdb_user = test # The user to sign in as. logdb_passwd = test # The user's password.root +rpc_encoding = test # The RPC encoding used in APIs [balancer] enabled = true # Start balancer server listen = test # Balancer listen interface -rpc_encoding = test # use JSON for RPC encoding [rater] enabled = true listen = test # listening address host:port, internal for internal communication only balancer = test # if defined it will register to balancer as worker -rpc_encoding = test # use JSON for RPC encoding [mediator] enabled = true cdr_in_dir = test # Freeswitch Master CSV CDR path. cdr_out_dir = test rater = test #address where to access rater. Can be internal, direct rater address or the address of a balancer -rpc_encoding = test # use JSON for RPC encoding skipdb = true pseudoprepaid = true @@ -43,7 +41,6 @@ enabled = true switch_type = test rater = test #address where to access rater. Can be internal, direct rater address or the address of a balancer debit_interval = 11 -rpc_encoding = test # use JSON for RPC encoding [freeswitch] server = test # freeswitch address host:port diff --git a/data/conf/cgrates.cfg b/data/conf/cgrates.cfg index 8ad86999b..f92edcd0d 100644 --- a/data/conf/cgrates.cfg +++ b/data/conf/cgrates.cfg @@ -17,26 +17,32 @@ # logdb_name = cgrates # The name of the log database to connect to. # logdb_user = # Username to use when connecting to logdb. # logdb_passwd = # Password to use when connecting to logdb. +# rpc_encoding = gob # RPC encoding used on APIs: . +# default_tor = 0 # Default Type of Record to consider when missing from requests. +# default_tenant = 0 # Default Tenant to consider when missing from requests. +# default_subject = 0 # Default rating Subject to consider when missing from requests. [balancer] # enabled = false # Start Balancer service: . # listen = 127.0.0.1:2012 # Balancer listen interface: . -# rpc_encoding = gob # RPC encoding used: . [rater] # enabled = false # Enable Rater service: . # balancer = disabled # Register to Balancer as worker: . # listen = 127.0.0.1:2012 # Rater's listening interface: . -# rpc_encoding = gob # RPC encoding used: . [scheduler] # enabled = false # Starts Scheduler service: . +[cdrs] +#listen=127.0.0.1:2022 # CDRS's listening interface: . +#freeswitch_json=enabled # Enable the handler for FreeSWITCH JSON CDRs: . + [mediator] # enabled = false # Starts Mediator service: . +# listen=127.0.0.1:2032 # Mediator's listening interface: . # rater = 127.0.0.1:2012 # Address where to reach the Rater. # rater_reconnects = 3 # Number of reconnects to rater before giving up. -# rpc_encoding = gob # RPC encoding used when talking to Rater: . # skipdb = false # Skips database checks for previous recorded prices: . # pseudoprepaid = false # Execute debits together with pricing: . # cdr_type = freeswitch_cdr # CDR type . @@ -49,11 +55,7 @@ # rater = 127.0.0.1:2012 # Address where to reach the Rater. # rater_reconnects = 3 # Number of reconnects to rater before giving up. # debit_interval = 5 # Interval to perform debits on. -# rpc_encoding = gob # RPC encoding used when talking to Rater: . # default_reqtype = # Default request type to consider when missing from requests: <""|prepaid|postpaid>. -# default_tor = 0 # Default Type of Record to consider when missing from requests. -# default_tenant = 0 # Default Tenant to consider when missing from requests. -# default_subject = 0 # Default rating Subject to consider when missing from requests. [freeswitch] # server = 127.0.0.1:8021 # Adress where to connect to FreeSWITCH socket. diff --git a/sessionmanager/fsevent.go b/sessionmanager/fsevent.go index 6559d6c68..8d418436f 100644 --- a/sessionmanager/fsevent.go +++ b/sessionmanager/fsevent.go @@ -105,13 +105,13 @@ func (fsev FSEvent) GetCallDestNr() string { return fsev[CALL_DEST_NR] } func (fsev FSEvent) GetTOR() string { - return utils.FirstNonEmpty(fsev[TOR], cfg.SMDefaultTOR) + return utils.FirstNonEmpty(fsev[TOR], cfg.DefaultTOR) } func (fsev FSEvent) GetUUID() string { return fsev[UUID] } func (fsev FSEvent) GetTenant() string { - return utils.FirstNonEmpty(fsev[CSTMID], cfg.SMDefaultTenant) + return utils.FirstNonEmpty(fsev[CSTMID], cfg.DefaultTenant) } func (fsev FSEvent) GetReqType() string { return utils.FirstNonEmpty(fsev[REQTYPE], cfg.SMDefaultReqType) @@ -128,7 +128,7 @@ func (fsev FSEvent) MissingParameter() bool { strings.TrimSpace(fsev.GetCallDestNr()) == "" } func (fsev FSEvent) GetFallbackSubj() string { - return cfg.SMDefaultSubject + return cfg.DefaultSubject } func (fsev FSEvent) GetStartTime(field string) (t time.Time, err error) { st, err := strconv.ParseInt(fsev[field], 0, 64)