diff --git a/cmd/cgr-rater/cgr-rater.go b/cmd/cgr-rater/cgr-rater.go index 5ce353c46..d5dbd0b54 100644 --- a/cmd/cgr-rater/cgr-rater.go +++ b/cmd/cgr-rater/cgr-rater.go @@ -19,7 +19,6 @@ along with this program. If not, see package main import ( - "code.google.com/p/goconf/conf" "errors" "flag" "fmt" @@ -52,68 +51,15 @@ const ( ) var ( - config = flag.String("config", "/etc/cgrates/cgrates.cfg", "Configuration file location.") - version = flag.Bool("version", false, "Prints the application version.") - data_db_type = REDIS - data_db_host = "localhost" // The host to connect to. Values that start with / are for UNIX domain sockets. - data_db_port = "" // The port to bind to. - data_db_name = "10" // The name of the database to connect to. - data_db_user = "" // The user to sign in as. - data_db_pass = "" // The user's password. - log_db_type = MONGO - log_db_host = "localhost" // The host to connect to. Values that start with / are for UNIX domain sockets. - log_db_port = "" // The port to bind to. - log_db_name = "cgrates" // The name of the database to connect to. - log_db_user = "" // The user to sign in as. - log_db_pass = "" // The user's password. - - rater_enabled = false // start standalone server (no balancer) - rater_balancer = DISABLED // balancer address host:port - rater_listen = "127.0.0.1:1234" // listening address host:port - rater_rpc_encoding = GOB // use JSON for RPC encoding - - balancer_enabled = false - balancer_listen = "127.0.0.1:2001" // Json RPC server address - balancer_rpc_encoding = GOB // use JSON for RPC encoding - - scheduler_enabled = false - - sm_enabled = false - sm_switch_type = FS - sm_rater = INTERNAL // address where to access rater. Can be internal, direct rater address or the address of a balancer - sm_debit_period = 10 // the period to be debited in advanced during a call (in seconds) - sm_rpc_encoding = GOB // use JSON for RPC encoding - - mediator_enabled = false - mediator_cdr_path = "" // Freeswitch Master CSV CDR path. - mediator_cdr_out_path = "" // Freeswitch Master CSV CDR output path. - mediator_rater = INTERNAL // address where to access rater. Can be internal, direct rater address or the address of a balancer - mediator_rpc_encoding = GOB // use JSON for RPC encoding - mediator_skipdb = false - mediator_pseudo_prepaid = false - - freeswitch_server = "localhost:8021" // freeswitch address host:port - freeswitch_pass = "ClueCon" // reeswitch address host:port - freeswitch_direction = "" - freeswitch_tor = "" - freeswitch_tenant = "" - freeswitch_subject = "" - freeswitch_account = "" - freeswitch_destination = "" - freeswitch_time_start = "" - freeswitch_duration = "" - freeswitch_uuid = "" - freeswitch_reconnects = 5 - - cfgParseErr error - + cfgPath = flag.String("config", "/etc/cgrates/cgrates.cfg", "Configuration file location.") + version = flag.Bool("version", false, "Prints the application version.") bal = balancer2go.NewBalancer() exitChan = make(chan bool) sm sessionmanager.SessionManager + cfg *CGRConfig + err error ) - - func listenToRPCRequests(rpcResponder interface{}, rpcAddress string, rpc_encoding string) { l, err := net.Listen("tcp", rpcAddress) if err != nil { @@ -145,15 +91,15 @@ func listenToRPCRequests(rpcResponder interface{}, rpcAddress string, rpc_encodi func startMediator(responder *rater.Responder, loggerDb rater.DataStorage) { var connector rater.Connector - if mediator_rater == INTERNAL { + if cfg.mediator_rater == INTERNAL { connector = responder } else { var client *rpc.Client var err error - if mediator_rpc_encoding == JSON { - client, err = jsonrpc.Dial("tcp", mediator_rater) + if cfg.mediator_rpc_encoding == JSON { + client, err = jsonrpc.Dial("tcp", cfg.mediator_rater) } else { - client, err = rpc.Dial("tcp", mediator_rater) + client, err = rpc.Dial("tcp", cfg.mediator_rater) } if err != nil { rater.Logger.Crit(fmt.Sprintf("Could not connect to rater: %v", err)) @@ -161,42 +107,43 @@ func startMediator(responder *rater.Responder, loggerDb rater.DataStorage) { } connector = &rater.RPCClientConnector{Client: client} } - if _, err := os.Stat(mediator_cdr_path); err != nil { - rater.Logger.Crit(fmt.Sprintf("The input path for mediator does not exist: %v", mediator_cdr_path)) + if _, err := os.Stat(cfg.mediator_cdr_path); err != nil { + rater.Logger.Crit(fmt.Sprintf("The input path for mediator does not exist: %v", cfg.mediator_cdr_path)) exitChan <- true } - if _, err := os.Stat(mediator_cdr_out_path); err != nil { - rater.Logger.Crit(fmt.Sprintf("The output path for mediator does not exist: %v", mediator_cdr_out_path)) + if _, err := os.Stat(cfg.mediator_cdr_out_path); err != nil { + rater.Logger.Crit(fmt.Sprintf("The output path for mediator does not exist: %v", cfg.mediator_cdr_out_path)) 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 - } + //if cfgParseErr != nil { + // rater.Logger.Crit(fmt.Sprintf("Errors on config parsing: <%v>", cfgParseErr)) + // exitChan <- true + //} - m, err := mediator.NewMediator(connector, loggerDb, mediator_skipdb, mediator_cdr_out_path, mediator_pseudo_prepaid, freeswitch_direction, - freeswitch_tor, freeswitch_tenant, freeswitch_subject, freeswitch_account, freeswitch_destination, - freeswitch_time_start, freeswitch_duration, freeswitch_uuid) + m, err := mediator.NewMediator(connector, loggerDb, cfg.mediator_skipdb, cfg.mediator_cdr_out_path, cfg.mediator_pseudo_prepaid, + cfg.freeswitch_direction, cfg.freeswitch_tor, cfg.freeswitch_tenant, cfg.freeswitch_subject, cfg.freeswitch_account, + cfg.freeswitch_destination, cfg.freeswitch_time_start, cfg.freeswitch_duration, cfg.freeswitch_uuid) if err != nil { rater.Logger.Crit(fmt.Sprintf("Mediator config parsing error: %v", err)) exitChan <- true } - m.TrackCDRFiles(mediator_cdr_path) + m.TrackCDRFiles(cfg.mediator_cdr_path) } func startSessionManager(responder *rater.Responder, loggerDb rater.DataStorage) { var connector rater.Connector - if sm_rater == INTERNAL { + if cfg.sm_rater == INTERNAL { connector = responder } else { var client *rpc.Client var err error - if sm_rpc_encoding == JSON { - client, err = jsonrpc.Dial("tcp", sm_rater) + if cfg.sm_rpc_encoding == JSON { + client, err = jsonrpc.Dial("tcp", cfg.sm_rater) } else { - client, err = rpc.Dial("tcp", sm_rater) + client, err = rpc.Dial("tcp", cfg.sm_rater) } if err != nil { rater.Logger.Crit(fmt.Sprintf("Could not connect to rater: %v", err)) @@ -204,27 +151,27 @@ func startSessionManager(responder *rater.Responder, loggerDb rater.DataStorage) } connector = &rater.RPCClientConnector{Client: client} } - switch sm_switch_type { + switch cfg.sm_switch_type { case FS: - dp, _ := time.ParseDuration(fmt.Sprintf("%vs", sm_debit_period)) + dp, _ := time.ParseDuration(fmt.Sprintf("%vs", cfg.sm_debit_period)) sm = sessionmanager.NewFSSessionManager(loggerDb, connector, dp) - errConn := sm.Connect(freeswitch_server, freeswitch_pass, freeswitch_reconnects) + errConn := sm.Connect(cfg.freeswitch_server, cfg.freeswitch_pass, cfg.freeswitch_reconnects) if errConn != nil { rater.Logger.Err(fmt.Sprintf(" error: %s!", errConn)) } default: - rater.Logger.Err(fmt.Sprintf(" Unsupported session manger type: %s!", sm_switch_type)) + rater.Logger.Err(fmt.Sprintf(" Unsupported session manger type: %s!", cfg.sm_switch_type)) exitChan <- true } - exitChan <-true + exitChan <- true } func checkConfigSanity() { - if sm_enabled && rater_enabled && rater_balancer != DISABLED { + if cfg.sm_enabled && cfg.rater_enabled && cfg.rater_balancer != DISABLED { rater.Logger.Crit("The session manager must not be enabled on a worker rater (change [rater]/balancer to disabled)!") exitChan <- true } - if balancer_enabled && rater_enabled && rater_balancer != DISABLED { + if cfg.balancer_enabled && cfg.rater_enabled && cfg.rater_balancer != DISABLED { rater.Logger.Crit("The balancer is enabled so it cannot connect to anatoher balancer (change [rater]/balancer to disabled)!") exitChan <- true } @@ -233,29 +180,29 @@ func checkConfigSanity() { // 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(sm_rater, "localhost") || strings.Contains(sm_rater, "127.0.0.1") { - if balancer_enabled { - if balancer_rpc_encoding != sm_rpc_encoding { + if strings.Contains(cfg.sm_rater, "localhost") || strings.Contains(cfg.sm_rater, "127.0.0.1") { + if cfg.balancer_enabled { + if cfg.balancer_rpc_encoding != cfg.sm_rpc_encoding { rater.Logger.Crit("If you are connecting the session manager via the loopback to the balancer use the same type of rpc encoding!") exitChan <- true } } - if rater_enabled { - if rater_rpc_encoding != sm_rpc_encoding { + if cfg.rater_enabled { + if cfg.rater_rpc_encoding != cfg.sm_rpc_encoding { rater.Logger.Crit("If you are connecting the session manager via the loopback to the arter use the same type of rpc encoding!") exitChan <- true } } } - if strings.Contains(mediator_rater, "localhost") || strings.Contains(mediator_rater, "127.0.0.1") { - if balancer_enabled { - if balancer_rpc_encoding != mediator_rpc_encoding { + if strings.Contains(cfg.mediator_rater, "localhost") || strings.Contains(cfg.mediator_rater, "127.0.0.1") { + if cfg.balancer_enabled { + if cfg.balancer_rpc_encoding != cfg.mediator_rpc_encoding { rater.Logger.Crit("If you are connecting the mediator via the loopback to the balancer use the same type of rpc encoding!") exitChan <- true } } - if rater_enabled { - if rater_rpc_encoding != mediator_rpc_encoding { + if cfg.rater_enabled { + if cfg.rater_rpc_encoding != cfg.mediator_rpc_encoding { rater.Logger.Crit("If you are connecting the mediator via the loopback to the arter use the same type of rpc encoding!") exitChan <- true } @@ -299,60 +246,60 @@ func main() { return } runtime.GOMAXPROCS(runtime.NumCPU()) - c, err := conf.ReadConfigFile(*config) + + cfg, err = NewCGRConfig( cfgPath ) if err != nil { - rater.Logger.Err(fmt.Sprintf("Could not open the configuration file: %v", err)) + rater.Logger.Crit(fmt.Sprintf("Could not parse config: %s exiting!", err)) return } - readConfig(c) // some consitency checks go checkConfigSanity() var getter, loggerDb rater.DataStorage - getter, err = configureDatabase(data_db_type, data_db_host, data_db_port, data_db_name, data_db_user, data_db_pass) + getter, err = configureDatabase(cfg.data_db_type, cfg.data_db_host, cfg.data_db_port, cfg.data_db_name, cfg.data_db_user, cfg.data_db_pass) if err == nil { defer getter.Close() rater.SetDataStorage(getter) } - if log_db_type == SAME { + if cfg.log_db_type == SAME { loggerDb = getter } else { - loggerDb, err = configureDatabase(log_db_type, log_db_host, log_db_port, log_db_name, log_db_user, log_db_pass) + loggerDb, err = configureDatabase(cfg.log_db_type, cfg.log_db_host, cfg.log_db_port, cfg.log_db_name, cfg.log_db_user, cfg.log_db_pass) } if err == nil { defer loggerDb.Close() rater.SetStorageLogger(loggerDb) } - if sm_debit_period > 0 { - if dp, err := time.ParseDuration(fmt.Sprintf("%vs", sm_debit_period)); err == nil { + if cfg.sm_debit_period > 0 { + if dp, err := time.ParseDuration(fmt.Sprintf("%vs", cfg.sm_debit_period)); err == nil { rater.SetDebitPeriod(dp) } } - if rater_enabled && rater_balancer != DISABLED && !balancer_enabled { + if cfg.rater_enabled && cfg.rater_balancer != DISABLED && !cfg.balancer_enabled { go registerToBalancer() go stopRaterSingnalHandler() } responder := &rater.Responder{ExitChan: exitChan} - if rater_enabled && !balancer_enabled && rater_listen != INTERNAL { - rater.Logger.Info(fmt.Sprintf("Starting CGRateS Rater on %s.", rater_listen)) - go listenToRPCRequests(responder, rater_listen, rater_rpc_encoding) + if cfg.rater_enabled && !cfg.balancer_enabled && cfg.rater_listen != INTERNAL { + rater.Logger.Info(fmt.Sprintf("Starting CGRateS Rater on %s.", cfg.rater_listen)) + go listenToRPCRequests(responder, cfg.rater_listen, cfg.rater_rpc_encoding) } - if balancer_enabled { - rater.Logger.Info(fmt.Sprintf("Starting CGRateS Balancer on %s.", balancer_listen)) + if cfg.balancer_enabled { + rater.Logger.Info(fmt.Sprintf("Starting CGRateS Balancer on %s.", cfg.balancer_listen)) go stopBalancerSingnalHandler() responder.Bal = bal - go listenToRPCRequests(responder, balancer_listen, balancer_rpc_encoding) - if rater_enabled { + go listenToRPCRequests(responder, cfg.balancer_listen, cfg.balancer_rpc_encoding) + if cfg.rater_enabled { rater.Logger.Info("Starting internal rater.") bal.AddClient("local", new(rater.ResponderWorker)) } } - if scheduler_enabled { + if cfg.scheduler_enabled { rater.Logger.Info("Starting CGRateS Scheduler.") go func() { sched := scheduler.NewScheduler() @@ -362,14 +309,14 @@ func main() { }() } - if sm_enabled { + if cfg.sm_enabled { rater.Logger.Info("Starting CGRateS SessionManager.") go startSessionManager(responder, loggerDb) // close all sessions on shutdown go shutdownSessionmanagerSingnalHandler() } - if mediator_enabled { + if cfg.mediator_enabled { rater.Logger.Info("Starting CGRateS Mediator.") go startMediator(responder, loggerDb) } diff --git a/cmd/cgr-rater/config.go b/cmd/cgr-rater/config.go index 703033b2b..e5902bbca 100644 --- a/cmd/cgr-rater/config.go +++ b/cmd/cgr-rater/config.go @@ -20,141 +20,258 @@ package main import ( "code.google.com/p/goconf/conf" + "errors" + "fmt" ) -// this function will overwrite default values with the ones present in the config file -func readConfig(c *conf.ConfigFile) { - var hasOpt bool - if hasOpt = c.HasOption("global", "datadb_type"); hasOpt { - data_db_type, _ = c.GetString("global", "datadb_type") - } - if hasOpt = c.HasOption("global", "datadb_host"); hasOpt { - data_db_host, _ = c.GetString("global", "datadb_host") - } - if hasOpt = c.HasOption("global", "datadb_port"); hasOpt { - data_db_port, _ = c.GetString("global", "datadb_port") - } - if hasOpt = c.HasOption("global", "datadb_name"); hasOpt { - data_db_name, _ = c.GetString("global", "datadb_name") - } - if hasOpt = c.HasOption("global", "datadb_user"); hasOpt { - data_db_user, _ = c.GetString("global", "datadb_user") - } - if hasOpt = c.HasOption("global", "datadb_passwd"); hasOpt { - data_db_pass, _ = c.GetString("global", "datadb_passwd") - } - if hasOpt = c.HasOption("global", "logdb_type"); hasOpt { - log_db_type, _ = c.GetString("global", "logdb_type") - } - if hasOpt = c.HasOption("global", "logdb_host"); hasOpt { - log_db_host, _ = c.GetString("global", "logdb_host") - } - if hasOpt = c.HasOption("global", "logdb_port"); hasOpt { - log_db_port, _ = c.GetString("global", "logdb_port") - } - if hasOpt = c.HasOption("global", "logdb_name"); hasOpt { - log_db_name, _ = c.GetString("global", "logdb_name") - } - if hasOpt = c.HasOption("global", "logdb_user"); hasOpt { - log_db_user, _ = c.GetString("global", "logdb_user") - } - if hasOpt = c.HasOption("global", "logdb_passwd"); hasOpt { - log_db_pass, _ = c.GetString("global", "logdb_passwd") - } - if hasOpt = c.HasOption("rater", "enabled"); hasOpt { - rater_enabled, _ = c.GetBool("rater", "enabled") - } - if hasOpt = c.HasOption("rater", "balancer"); hasOpt { - rater_balancer, _ = c.GetString("rater", "balancer") - } - if hasOpt = c.HasOption("rater", "listen"); hasOpt { - rater_listen, _ = c.GetString("rater", "listen") - } - if hasOpt = c.HasOption("rater", "rpc_encoding"); hasOpt { - rater_rpc_encoding, _ = c.GetString("rater", "rpc_encoding") - } - if hasOpt = c.HasOption("balancer", "enabled"); hasOpt { - balancer_enabled, _ = c.GetBool("balancer", "enabled") - } - if hasOpt = c.HasOption("balancer", "listen"); hasOpt { - balancer_listen, _ = c.GetString("balancer", "listen") - } - if hasOpt = c.HasOption("balancer", "rpc_encoding"); hasOpt { - balancer_rpc_encoding, _ = c.GetString("balancer", "rpc_encoding") - } - if hasOpt = c.HasOption("scheduler", "enabled"); hasOpt { - scheduler_enabled, _ = c.GetBool("scheduler", "enabled") - } - if hasOpt = c.HasOption("session_manager", "enabled"); hasOpt { - sm_enabled, _ = c.GetBool("session_manager", "enabled") - } - if hasOpt = c.HasOption("session_manager", "switch_type"); hasOpt { - sm_switch_type, _ = c.GetString("session_manager", "switch_type") - } - if hasOpt = c.HasOption("session_manager", "rater"); hasOpt { - sm_rater, _ = c.GetString("session_manager", "rater") - } - if hasOpt = c.HasOption("session_manager", "debit_period"); hasOpt { - sm_debit_period, _ = c.GetInt("session_manager", "debit_period") - } - if hasOpt = c.HasOption("session_manager", "rpc_encoding"); hasOpt { - sm_rpc_encoding, _ = c.GetString("session_manager", "rpc_encoding") - } - if hasOpt = c.HasOption("mediator", "enabled"); hasOpt { - mediator_enabled, _ = c.GetBool("mediator", "enabled") - } - if hasOpt = c.HasOption("mediator", "cdr_path"); hasOpt { - mediator_cdr_path, _ = c.GetString("mediator", "cdr_path") - } - if hasOpt = c.HasOption("mediator", "cdr_out_path"); hasOpt { - mediator_cdr_out_path, _ = c.GetString("mediator", "cdr_out_path") - } - if hasOpt = c.HasOption("mediator", "rater"); hasOpt { - mediator_rater, _ = c.GetString("mediator", "rater") - } - if hasOpt = c.HasOption("mediator", "rpc_encoding"); hasOpt { - mediator_rpc_encoding, _ = c.GetString("mediator", "rpc_encoding") - } - if hasOpt = c.HasOption("mediator", "skipdb"); hasOpt { - mediator_skipdb, _ = c.GetBool("mediator", "skipdb") - } - if hasOpt = c.HasOption("mediator", "pseudo_prepaid"); hasOpt { - mediator_pseudo_prepaid, _ = c.GetBool("mediator", "pseudo_prepaid") - } - if hasOpt = c.HasOption("freeswitch", "server"); hasOpt { - freeswitch_server, _ = c.GetString("freeswitch", "server") - } - if hasOpt = c.HasOption("freeswitch", "pass"); hasOpt { - freeswitch_pass, _ = c.GetString("freeswitch", "pass") - } - if hasOpt = c.HasOption("freeswitch", "tor_index"); hasOpt { - freeswitch_tor, _ = c.GetString("freeswitch", "tor_index") - } - if hasOpt = c.HasOption("freeswitch", "tenant_index"); hasOpt { - freeswitch_tenant, _ = c.GetString("freeswitch", "tenant_index") - } - if hasOpt = c.HasOption("freeswitch", "direction_index"); hasOpt { - freeswitch_direction, _ = c.GetString("freeswitch", "direction_index") - } - if hasOpt = c.HasOption("freeswitch", "subject_index"); hasOpt { - freeswitch_subject, _ = c.GetString("freeswitch", "subject_index") - } - if hasOpt = c.HasOption("freeswitch", "account_index"); hasOpt { - freeswitch_account, _ = c.GetString("freeswitch", "account_index") - } - if hasOpt = c.HasOption("freeswitch", "destination_index"); hasOpt { - freeswitch_destination, _ = c.GetString("freeswitch", "destination_index") - } - if hasOpt = c.HasOption("freeswitch", "time_start_index"); hasOpt { - freeswitch_time_start, _ = c.GetString("freeswitch", "time_start_index") - } - if hasOpt = c.HasOption("freeswitch", "duration_index"); hasOpt { - freeswitch_duration, _ = c.GetString("freeswitch", "duration_index") - } - if hasOpt = c.HasOption("freeswitch", "uuid_index"); hasOpt { - freeswitch_uuid, _ = c.GetString("freeswitch", "uuid_index") - } - if hasOpt = c.HasOption("freeswitch", "reconnects"); hasOpt { - freeswitch_reconnects, _ = c.GetInt("freeswitch", "reconnects") - } +// Holds system configuration, defaults are overwritten with values from config file if found +type CGRConfig struct { + data_db_type string + data_db_host string // The host to connect to. Values that start with / are for UNIX domain sockets. + data_db_port string // The port to bind to. + data_db_name string // The name of the database to connect to. + data_db_user string // The user to sign in as. + data_db_pass string // The user's password. + log_db_type string // Should reflect the database type used to store logs + log_db_host string // The host to connect to. Values that start with / are for UNIX domain sockets. + log_db_port string // The port to bind to. + log_db_name string // The name of the database to connect to. + log_db_user string // The user to sign in as. + log_db_pass string // The user's password. + rater_enabled bool // start standalone server (no balancer) + rater_balancer string // balancer address host:port + rater_listen string // listening address host:port + rater_rpc_encoding string // use JSON for RPC encoding + balancer_enabled bool + balancer_listen string // Json RPC server address + balancer_rpc_encoding string // use JSON for RPC encoding + scheduler_enabled bool + sm_enabled bool + sm_switch_type string + sm_rater string // address where to access rater. Can be internal, direct rater address or the address of a balancer + sm_debit_period int // the period to be debited in advanced during a call (in seconds) + sm_rpc_encoding string // use JSON for RPC encoding + sm_default_tor string // set default type of record label to 0 + sm_default_tenant string // set default tenant to 0 + sm_default_subject string // set default rating subject to 0 + mediator_enabled bool + mediator_cdr_path string // Freeswitch Master CSV CDR path. + mediator_cdr_out_path string // Freeswitch Master CSV CDR output path. + mediator_rater string // address where to access rater. Can be internal, direct rater address or the address of a balancer + mediator_rpc_encoding string // use JSON for RPC encoding + mediator_skipdb bool + mediator_pseudo_prepaid bool + freeswitch_server string // freeswitch address host:port + freeswitch_pass string // reeswitch address host:port + freeswitch_direction string + freeswitch_tor string + freeswitch_tenant string + freeswitch_subject string + freeswitch_account string + freeswitch_destination string + freeswitch_time_start string + freeswitch_duration string + freeswitch_uuid string + freeswitch_reconnects int +} + +// Instantiate a new CGRConfig setting defaults or reading from file +func NewCGRConfig(cfgPath *string) (*CGRConfig, error) { + c, err := conf.ReadConfigFile(*cfgPath) + if err != nil { + return nil, errors.New(fmt.Sprintf("Could not open the configuration file: %s", err)) + } + cfg := &CGRConfig{} + var hasOpt bool + cfg.data_db_type = REDIS + if hasOpt = c.HasOption("global", "datadb_type"); hasOpt { + cfg.data_db_type, _ = c.GetString("global", "datadb_type") + } + cfg.data_db_host = "localhost" + if hasOpt = c.HasOption("global", "datadb_host"); hasOpt { + cfg.data_db_host, _ = c.GetString("global", "datadb_host") + } + cfg.data_db_port = "" + if hasOpt = c.HasOption("global", "datadb_port"); hasOpt { + cfg.data_db_port, _ = c.GetString("global", "datadb_port") + } + cfg.data_db_name = "10" + if hasOpt = c.HasOption("global", "datadb_name"); hasOpt { + cfg.data_db_name, _ = c.GetString("global", "datadb_name") + } + cfg.data_db_user = "" + if hasOpt = c.HasOption("global", "datadb_user"); hasOpt { + cfg.data_db_user, _ = c.GetString("global", "datadb_user") + } + cfg.data_db_pass = "" + if hasOpt = c.HasOption("global", "datadb_passwd"); hasOpt { + cfg.data_db_pass, _ = c.GetString("global", "datadb_passwd") + } + cfg.log_db_type = MONGO + if hasOpt = c.HasOption("global", "logdb_type"); hasOpt { + cfg.log_db_type, _ = c.GetString("global", "logdb_type") + } + cfg.log_db_host = "localhost" + if hasOpt = c.HasOption("global", "logdb_host"); hasOpt { + cfg.log_db_host, _ = c.GetString("global", "logdb_host") + } + cfg.log_db_port = "" + if hasOpt = c.HasOption("global", "logdb_port"); hasOpt { + cfg.log_db_port, _ = c.GetString("global", "logdb_port") + } + cfg.log_db_name = "cgrates" + if hasOpt = c.HasOption("global", "logdb_name"); hasOpt { + cfg.log_db_name, _ = c.GetString("global", "logdb_name") + } + cfg.log_db_user = "" + if hasOpt = c.HasOption("global", "logdb_user"); hasOpt { + cfg.log_db_user, _ = c.GetString("global", "logdb_user") + } + cfg.log_db_pass = "" + if hasOpt = c.HasOption("global", "logdb_passwd"); hasOpt { + cfg.log_db_pass, _ = c.GetString("global", "logdb_passwd") + } + cfg.rater_enabled = false + if hasOpt = c.HasOption("rater", "enabled"); hasOpt { + cfg.rater_enabled, _ = c.GetBool("rater", "enabled") + } + cfg.rater_balancer = DISABLED + if hasOpt = c.HasOption("rater", "balancer"); hasOpt { + cfg.rater_balancer, _ = c.GetString("rater", "balancer") + } + cfg.rater_listen = "127.0.0.1:1234" + if hasOpt = c.HasOption("rater", "listen"); hasOpt { + cfg.rater_listen, _ = c.GetString("rater", "listen") + } + cfg.rater_rpc_encoding = GOB + if hasOpt = c.HasOption("rater", "rpc_encoding"); hasOpt { + cfg.rater_rpc_encoding, _ = c.GetString("rater", "rpc_encoding") + } + cfg.balancer_enabled = false + if hasOpt = c.HasOption("balancer", "enabled"); hasOpt { + cfg.balancer_enabled, _ = c.GetBool("balancer", "enabled") + } + cfg.balancer_listen = "127.0.0.1:2001" + if hasOpt = c.HasOption("balancer", "listen"); hasOpt { + cfg.balancer_listen, _ = c.GetString("balancer", "listen") + } + cfg.balancer_rpc_encoding = GOB + if hasOpt = c.HasOption("balancer", "rpc_encoding"); hasOpt { + cfg.balancer_rpc_encoding, _ = c.GetString("balancer", "rpc_encoding") + } + cfg.scheduler_enabled = false + if hasOpt = c.HasOption("scheduler", "enabled"); hasOpt { + cfg.scheduler_enabled, _ = c.GetBool("scheduler", "enabled") + } + cfg.mediator_enabled = false + if hasOpt = c.HasOption("mediator", "enabled"); hasOpt { + cfg.mediator_enabled, _ = c.GetBool("mediator", "enabled") + } + cfg.mediator_cdr_path = "" + if hasOpt = c.HasOption("mediator", "cdr_path"); hasOpt { + cfg.mediator_cdr_path, _ = c.GetString("mediator", "cdr_path") + } + cfg.mediator_cdr_out_path = "" + if hasOpt = c.HasOption("mediator", "cdr_out_path"); hasOpt { + cfg.mediator_cdr_out_path, _ = c.GetString("mediator", "cdr_out_path") + } + cfg.mediator_rater = INTERNAL + if hasOpt = c.HasOption("mediator", "rater"); hasOpt { + cfg.mediator_rater, _ = c.GetString("mediator", "rater") + } + cfg.mediator_rpc_encoding = GOB + if hasOpt = c.HasOption("mediator", "rpc_encoding"); hasOpt { + cfg.mediator_rpc_encoding, _ = c.GetString("mediator", "rpc_encoding") + } + cfg.mediator_skipdb = false + if hasOpt = c.HasOption("mediator", "skipdb"); hasOpt { + cfg.mediator_skipdb, _ = c.GetBool("mediator", "skipdb") + } + cfg.mediator_pseudo_prepaid = false + if hasOpt = c.HasOption("mediator", "pseudo_prepaid"); hasOpt { + cfg.mediator_pseudo_prepaid, _ = c.GetBool("mediator", "pseudo_prepaid") + } + cfg.sm_enabled = false + if hasOpt = c.HasOption("session_manager", "enabled"); hasOpt { + cfg.sm_enabled, _ = c.GetBool("session_manager", "enabled") + } + cfg.sm_switch_type = FS + if hasOpt = c.HasOption("session_manager", "switch_type"); hasOpt { + cfg.sm_switch_type, _ = c.GetString("session_manager", "switch_type") + } + cfg.sm_rater = INTERNAL + if hasOpt = c.HasOption("session_manager", "rater"); hasOpt { + cfg.sm_rater, _ = c.GetString("session_manager", "rater") + } + cfg.sm_debit_period = 10 + if hasOpt = c.HasOption("session_manager", "debit_period"); hasOpt { + cfg.sm_debit_period, _ = c.GetInt("session_manager", "debit_period") + } + cfg.sm_rpc_encoding = GOB + if hasOpt = c.HasOption("session_manager", "rpc_encoding"); hasOpt { + cfg.sm_rpc_encoding, _ = c.GetString("session_manager", "rpc_encoding") + } + cfg.sm_default_tor = "0" + if hasOpt = c.HasOption("session_manager", "default_tor"); hasOpt { + cfg.sm_default_tor, _ = c.GetString("session_manager", "default_tor") + } + cfg.sm_default_tenant = "0" + if hasOpt = c.HasOption("session_manager", "default_tenant"); hasOpt { + cfg.sm_default_tenant, _ = c.GetString("session_manager", "default_tenant") + } + cfg.sm_default_subject = "0" + if hasOpt = c.HasOption("session_manager", "default_subject"); hasOpt { + cfg.sm_default_subject, _ = c.GetString("session_manager", "default_subject") + } + cfg.freeswitch_server = "localhost:8021" + if hasOpt = c.HasOption("freeswitch", "server"); hasOpt { + cfg.freeswitch_server, _ = c.GetString("freeswitch", "server") + } + cfg.freeswitch_pass = "ClueCon" + if hasOpt = c.HasOption("freeswitch", "pass"); hasOpt { + cfg.freeswitch_pass, _ = c.GetString("freeswitch", "pass") + } + cfg.freeswitch_reconnects = 5 + if hasOpt = c.HasOption("freeswitch", "reconnects"); hasOpt { + cfg.freeswitch_reconnects, _ = c.GetInt("freeswitch", "reconnects") + } + cfg.freeswitch_tor = "" + if hasOpt = c.HasOption("freeswitch", "tor_index"); hasOpt { + cfg.freeswitch_tor, _ = c.GetString("freeswitch", "tor_index") + } + cfg.freeswitch_tenant = "" + if hasOpt = c.HasOption("freeswitch", "tenant_index"); hasOpt { + cfg.freeswitch_tenant, _ = c.GetString("freeswitch", "tenant_index") + } + cfg.freeswitch_direction = "" + if hasOpt = c.HasOption("freeswitch", "direction_index"); hasOpt { + cfg.freeswitch_direction, _ = c.GetString("freeswitch", "direction_index") + } + cfg.freeswitch_subject = "" + if hasOpt = c.HasOption("freeswitch", "subject_index"); hasOpt { + cfg.freeswitch_subject, _ = c.GetString("freeswitch", "subject_index") + } + cfg.freeswitch_account = "" + if hasOpt = c.HasOption("freeswitch", "account_index"); hasOpt { + cfg.freeswitch_account, _ = c.GetString("freeswitch", "account_index") + } + cfg.freeswitch_destination = "" + if hasOpt = c.HasOption("freeswitch", "destination_index"); hasOpt { + cfg.freeswitch_destination, _ = c.GetString("freeswitch", "destination_index") + } + cfg.freeswitch_time_start = "" + if hasOpt = c.HasOption("freeswitch", "time_start_index"); hasOpt { + cfg.freeswitch_time_start, _ = c.GetString("freeswitch", "time_start_index") + } + cfg.freeswitch_duration = "" + if hasOpt = c.HasOption("freeswitch", "duration_index"); hasOpt { + cfg.freeswitch_duration, _ = c.GetString("freeswitch", "duration_index") + } + cfg.freeswitch_uuid = "" + if hasOpt = c.HasOption("freeswitch", "uuid_index"); hasOpt { + cfg.freeswitch_uuid, _ = c.GetString("freeswitch", "uuid_index") + } + + return cfg, nil + } diff --git a/cmd/cgr-rater/rater_test.go b/cmd/cgr-rater/rater_test.go index 58afc207b..e3f893132 100644 --- a/cmd/cgr-rater/rater_test.go +++ b/cmd/cgr-rater/rater_test.go @@ -19,170 +19,103 @@ along with this program. If not, see package main import ( - "code.google.com/p/goconf/conf" "net/rpc" + "fmt" "testing" ) -const ( - configText = ` -[global] -datadb_type = test # -datadb_host = test # The host to connect to. Values that start with / are for UNIX domain sockets. -datadb_port = test # The port to bind to. -datadb_name = test # The name of the database to connect to. -datadb_user = test # The user to sign in as. -datadb_passwd = test # The user's password.root -logdb_type = test # -logdb_host = test # The host to connect to. Values that start with / are for UNIX domain sockets. -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 - -[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_path = test # Freeswitch Master CSV CDR path. -cdr_out_path = 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 -pseudo_prepaid = true - -[scheduler] -enabled = true - -[session_manager] -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_period = 11 -rpc_encoding = test # use JSON for RPC encoding - -[freeswitch] -server = test # freeswitch address host:port -pass = test # freeswitch address host:port -direction_index = test -tor_index = test -tenant_index = test -subject_index = test -account_index = test -destination_index = test -time_start_index = test -duration_index = test -uuid_index = test -` -) - func TestConfig(t *testing.T) { - c, err := conf.ReadConfigBytes([]byte(configText)) + cfgPth := "test_data.txt" + cfg, err = NewCGRConfig( &cfgPth ) if err != nil { - t.Log("Could not parse configuration!") + t.Log(fmt.Sprintf("Could not parse config: %s!", err)) t.FailNow() } - readConfig(c) - if data_db_type != "test" || - data_db_host != "test" || - data_db_port != "test" || - data_db_name != "test" || - data_db_user != "test" || - data_db_pass != "test" || - log_db_type != "test" || - log_db_host != "test" || - log_db_port != "test" || - log_db_name != "test" || - log_db_user != "test" || - log_db_pass != "test" || - - rater_enabled != true || - rater_balancer != "test" || - rater_listen != "test" || - rater_rpc_encoding != "test" || - - balancer_enabled != true || - balancer_listen != "test" || - balancer_rpc_encoding != "test" || - - scheduler_enabled != true || - - sm_enabled != true || - sm_switch_type != "test" || - sm_rater != "test" || - sm_debit_period != 11 || - sm_rpc_encoding != "test" || - - mediator_enabled != true || - mediator_cdr_path != "test" || - mediator_cdr_out_path != "test" || - mediator_rater != "test" || - mediator_rpc_encoding != "test" || - mediator_skipdb != true || - mediator_pseudo_prepaid != true || - - freeswitch_server != "test" || - freeswitch_pass != "test" || - freeswitch_direction != "test" || - freeswitch_tor != "test" || - freeswitch_tenant != "test" || - freeswitch_subject != "test" || - freeswitch_account != "test" || - freeswitch_destination != "test" || - freeswitch_time_start != "test" || - freeswitch_duration != "test" || - freeswitch_uuid != "test" { - t.Log(data_db_type) - t.Log(data_db_host) - t.Log(data_db_port) - t.Log(data_db_name) - t.Log(data_db_user) - t.Log(data_db_pass) - t.Log(log_db_type) - t.Log(log_db_host) - t.Log(log_db_port) - t.Log(log_db_name) - t.Log(log_db_user) - t.Log(log_db_pass) - t.Log(rater_enabled) - t.Log(rater_balancer) - t.Log(rater_listen) - t.Log(rater_rpc_encoding) - t.Log(balancer_enabled) - t.Log(balancer_listen) - t.Log(balancer_rpc_encoding) - t.Log(scheduler_enabled) - t.Log(sm_enabled) - t.Log(sm_switch_type) - t.Log(sm_rater) - t.Log(sm_debit_period) - t.Log(sm_rpc_encoding) - t.Log(mediator_enabled) - t.Log(mediator_cdr_path) - t.Log(mediator_cdr_out_path) - t.Log(mediator_rater) - t.Log(mediator_skipdb) - t.Log(mediator_pseudo_prepaid) - t.Log(freeswitch_server) - t.Log(freeswitch_pass) - t.Log(freeswitch_direction) - t.Log(freeswitch_tor) - t.Log(freeswitch_tenant) - t.Log(freeswitch_subject) - t.Log(freeswitch_account) - t.Log(freeswitch_destination) - t.Log(freeswitch_time_start) - t.Log(freeswitch_duration) - t.Log(freeswitch_uuid) + if cfg.data_db_type != "test" || + cfg.data_db_host != "test" || + cfg.data_db_port != "test" || + cfg.data_db_name != "test" || + cfg.data_db_user != "test" || + cfg.data_db_pass != "test" || + cfg.log_db_type != "test" || + cfg.log_db_host != "test" || + cfg.log_db_port != "test" || + cfg.log_db_name != "test" || + cfg.log_db_user != "test" || + cfg.log_db_pass != "test" || + cfg.rater_enabled != true || + cfg.rater_balancer != "test" || + cfg.rater_listen != "test" || + cfg.rater_rpc_encoding != "test" || + cfg.balancer_enabled != true || + cfg.balancer_listen != "test" || + cfg.balancer_rpc_encoding != "test" || + cfg.scheduler_enabled != true || + cfg.sm_enabled != true || + cfg.sm_switch_type != "test" || + cfg.sm_rater != "test" || + cfg.sm_debit_period != 11 || + cfg.sm_rpc_encoding != "test" || + cfg.mediator_enabled != true || + cfg.mediator_cdr_path != "test" || + cfg.mediator_cdr_out_path != "test" || + cfg.mediator_rater != "test" || + cfg.mediator_rpc_encoding != "test" || + cfg.mediator_skipdb != true || + cfg.mediator_pseudo_prepaid != true || + cfg.freeswitch_server != "test" || + cfg.freeswitch_pass != "test" || + cfg.freeswitch_direction != "test" || + cfg.freeswitch_tor != "test" || + cfg.freeswitch_tenant != "test" || + cfg.freeswitch_subject != "test" || + cfg.freeswitch_account != "test" || + cfg.freeswitch_destination != "test" || + cfg.freeswitch_time_start != "test" || + cfg.freeswitch_duration != "test" || + cfg.freeswitch_uuid != "test" { + t.Log(cfg.data_db_type) + t.Log(cfg.data_db_host) + t.Log(cfg.data_db_port) + t.Log(cfg.data_db_name) + t.Log(cfg.data_db_user) + t.Log(cfg.data_db_pass) + t.Log(cfg.log_db_type) + t.Log(cfg.log_db_host) + t.Log(cfg.log_db_port) + t.Log(cfg.log_db_name) + t.Log(cfg.log_db_user) + t.Log(cfg.log_db_pass) + t.Log(cfg.rater_enabled) + t.Log(cfg.rater_balancer) + t.Log(cfg.rater_listen) + t.Log(cfg.rater_rpc_encoding) + t.Log(cfg.balancer_enabled) + t.Log(cfg.balancer_listen) + t.Log(cfg.balancer_rpc_encoding) + t.Log(cfg.scheduler_enabled) + t.Log(cfg.sm_enabled) + t.Log(cfg.sm_switch_type) + t.Log(cfg.sm_rater) + t.Log(cfg.sm_debit_period) + t.Log(cfg.sm_rpc_encoding) + t.Log(cfg.mediator_enabled) + t.Log(cfg.mediator_cdr_path) + t.Log(cfg.mediator_cdr_out_path) + t.Log(cfg.mediator_rater) + t.Log(cfg.mediator_skipdb) + t.Log(cfg.mediator_pseudo_prepaid) + t.Log(cfg.freeswitch_server) + t.Log(cfg.freeswitch_pass) + t.Log(cfg.freeswitch_direction) + t.Log(cfg.freeswitch_tor) + t.Log(cfg.freeswitch_tenant) + t.Log(cfg.freeswitch_subject) + t.Log(cfg.freeswitch_account) + t.Log(cfg.freeswitch_destination) + t.Log(cfg.freeswitch_time_start) + t.Log(cfg.freeswitch_duration) + t.Log(cfg.freeswitch_uuid) t.Error("Config file read failed!") } } @@ -201,27 +134,17 @@ func TestConfig(t *testing.T) { } }*/ -func TestVarReset(t *testing.T) { - c, err := conf.ReadConfigBytes([]byte(configText)) +func TestParamOverwrite(t *testing.T) { + cfgPth := "test_data.txt" + cfg, err = NewCGRConfig( &cfgPth ) if err != nil { - t.Log("Could not parse configuration!") + t.Log(fmt.Sprintf("Could not parse config: %s!", err)) t.FailNow() } - myString := "default" - myString, err = c.GetString("default", "non_existing") - if err == nil { - t.Error("Reding non exitsing variable did not issue error!") - } - if myString != "" { - t.Error("Variable has not been reseted") - } - myBool := true - myBool, err = c.GetBool("default", "non_existing") - if err == nil { - t.Error("Reding non exitsing variable did not issue error!") - } - if myBool { - t.Error("Variable has not been reseted") + if cfg.freeswitch_reconnects != 5 { // one default which is not overwritten in test data + t.Errorf("freeswitch_reconnects set == %d, expect 5",cfg.freeswitch_reconnects) + } else if cfg.scheduler_enabled != true { // one parameter which should be overwritten in test data + t.Errorf("scheduler_enabled set == %d, expect true",cfg.freeswitch_reconnects) } } diff --git a/cmd/cgr-rater/registration.go b/cmd/cgr-rater/registration.go index e87b6201f..f57379552 100644 --- a/cmd/cgr-rater/registration.go +++ b/cmd/cgr-rater/registration.go @@ -58,15 +58,15 @@ func stopRaterSingnalHandler() { Connects to the balancer and calls unregister RPC method. */ func unregisterFromBalancer() { - client, err := rpc.Dial("tcp", rater_balancer) + client, err := rpc.Dial("tcp", cfg.rater_balancer) if err != nil { rater.Logger.Crit("Cannot contact the balancer!") exitChan <- true return } var reply int - rater.Logger.Info(fmt.Sprintf("Unregistering from balancer %s", rater_balancer)) - client.Call("Responder.UnRegisterRater", rater_listen, &reply) + rater.Logger.Info(fmt.Sprintf("Unregistering from balancer %s", cfg.rater_balancer)) + client.Call("Responder.UnRegisterRater", cfg.rater_listen, &reply) if err := client.Close(); err != nil { rater.Logger.Crit("Could not close balancer unregistration!") exitChan <- true @@ -77,15 +77,15 @@ func unregisterFromBalancer() { Connects to the balancer and rehisters the rater to the server. */ func registerToBalancer() { - client, err := rpc.Dial("tcp", rater_balancer) + client, err := rpc.Dial("tcp", cfg.rater_balancer) if err != nil { rater.Logger.Crit(fmt.Sprintf("Cannot contact the balancer: %v", err)) exitChan <- true return } var reply int - rater.Logger.Info(fmt.Sprintf("Registering to balancer %s", rater_balancer)) - client.Call("Responder.RegisterRater", rater_listen, &reply) + rater.Logger.Info(fmt.Sprintf("Registering to balancer %s", cfg.rater_balancer)) + client.Call("Responder.RegisterRater", cfg.rater_listen, &reply) if err := client.Close(); err != nil { rater.Logger.Crit("Could not close balancer registration!") exitChan <- true @@ -115,7 +115,7 @@ func shutdownSessionmanagerSingnalHandler() { signal.Notify(c, syscall.SIGHUP, syscall.SIGTERM, syscall.SIGINT, syscall.SIGQUIT) <-c - if err := sm.Shutdown(); err!=nil { + if err := sm.Shutdown(); err != nil { rater.Logger.Warning(fmt.Sprintf(" %s", err)) } exitChan <- true diff --git a/cmd/cgr-rater/test_data.txt b/cmd/cgr-rater/test_data.txt new file mode 100644 index 000000000..493886d4f --- /dev/null +++ b/cmd/cgr-rater/test_data.txt @@ -0,0 +1,60 @@ + +### Test data, not for production usage + +[global] +datadb_type = test # +datadb_host = test # The host to connect to. Values that start with / are for UNIX domain sockets. +datadb_port = test # The port to bind to. +datadb_name = test # The name of the database to connect to. +datadb_user = test # The user to sign in as. +datadb_passwd = test # The user's password.root +logdb_type = test # +logdb_host = test # The host to connect to. Values that start with / are for UNIX domain sockets. +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 + +[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_path = test # Freeswitch Master CSV CDR path. +cdr_out_path = 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 +pseudo_prepaid = true + +[scheduler] +enabled = true + +[session_manager] +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_period = 11 +rpc_encoding = test # use JSON for RPC encoding + +[freeswitch] +server = test # freeswitch address host:port +pass = test # freeswitch address host:port +direction_index = test +tor_index = test +tenant_index = test +subject_index = test +account_index = test +destination_index = test +time_start_index = test +duration_index = test +uuid_index = test +