From cbff5d5e906a1bb52bc15044bd5ad08d2473ba8b Mon Sep 17 00:00:00 2001 From: DanB Date: Sun, 31 Mar 2013 15:03:29 +0200 Subject: [PATCH] Refactored config parser to avoid overwriting defaults if options not in configuration file, added reconnects config parameter to session manager --- cmd/cgr-rater/cgr-rater.go | 56 +--------- cmd/cgr-rater/config.go | 160 +++++++++++++++++++++++++++++ copyright_header.txt | 2 +- sessionmanager/fssessionmanager.go | 6 +- sessionmanager/sessionmanager.go | 2 +- 5 files changed, 168 insertions(+), 58 deletions(-) create mode 100644 cmd/cgr-rater/config.go diff --git a/cmd/cgr-rater/cgr-rater.go b/cmd/cgr-rater/cgr-rater.go index 26ba424c4..5ce353c46 100644 --- a/cmd/cgr-rater/cgr-rater.go +++ b/cmd/cgr-rater/cgr-rater.go @@ -103,6 +103,7 @@ var ( freeswitch_time_start = "" freeswitch_duration = "" freeswitch_uuid = "" + freeswitch_reconnects = 5 cfgParseErr error @@ -111,58 +112,7 @@ var ( sm sessionmanager.SessionManager ) -// this function will reset to zero values the variables that are not present -func readConfig(c *conf.ConfigFile) { - data_db_type, _ = c.GetString("global", "datadb_type") - data_db_host, _ = c.GetString("global", "datadb_host") - data_db_port, _ = c.GetString("global", "datadb_port") - data_db_name, _ = c.GetString("global", "datadb_name") - data_db_user, _ = c.GetString("global", "datadb_user") - data_db_pass, _ = c.GetString("global", "datadb_passwd") - log_db_type, _ = c.GetString("global", "logdb_type") - log_db_host, _ = c.GetString("global", "logdb_host") - log_db_port, _ = c.GetString("global", "logdb_port") - log_db_name, _ = c.GetString("global", "logdb_name") - log_db_user, _ = c.GetString("global", "logdb_user") - log_db_pass, _ = c.GetString("global", "logdb_passwd") - rater_enabled, _ = c.GetBool("rater", "enabled") - rater_balancer, _ = c.GetString("rater", "balancer") - rater_listen, _ = c.GetString("rater", "listen") - rater_rpc_encoding, _ = c.GetString("rater", "rpc_encoding") - - balancer_enabled, _ = c.GetBool("balancer", "enabled") - balancer_listen, _ = c.GetString("balancer", "listen") - balancer_rpc_encoding, _ = c.GetString("balancer", "rpc_encoding") - - scheduler_enabled, _ = c.GetBool("scheduler", "enabled") - - sm_enabled, _ = c.GetBool("session_manager", "enabled") - sm_switch_type, _ = c.GetString("session_manager", "switch_type") - sm_rater, _ = c.GetString("session_manager", "rater") - sm_debit_period, _ = c.GetInt("session_manager", "debit_period") - sm_rpc_encoding, _ = c.GetString("session_manager", "rpc_encoding") - - mediator_enabled, _ = c.GetBool("mediator", "enabled") - mediator_cdr_path, _ = c.GetString("mediator", "cdr_path") - mediator_cdr_out_path, _ = c.GetString("mediator", "cdr_out_path") - mediator_rater, _ = c.GetString("mediator", "rater") - mediator_rpc_encoding, _ = c.GetString("mediator", "rpc_encoding") - mediator_skipdb, _ = c.GetBool("mediator", "skipdb") - mediator_pseudo_prepaid, _ = c.GetBool("mediator", "pseudo_prepaid") - - freeswitch_server, _ = c.GetString("freeswitch", "server") - freeswitch_pass, _ = c.GetString("freeswitch", "pass") - freeswitch_tor, _ = c.GetString("freeswitch", "tor_index") - freeswitch_tenant, _ = c.GetString("freeswitch", "tenant_index") - freeswitch_direction, _ = c.GetString("freeswitch", "direction_index") - freeswitch_subject, _ = c.GetString("freeswitch", "subject_index") - freeswitch_account, _ = c.GetString("freeswitch", "account_index") - freeswitch_destination, _ = c.GetString("freeswitch", "destination_index") - freeswitch_time_start, _ = c.GetString("freeswitch", "time_start_index") - freeswitch_duration, _ = c.GetString("freeswitch", "duration_index") - freeswitch_uuid, _ = c.GetString("freeswitch", "uuid_index") -} func listenToRPCRequests(rpcResponder interface{}, rpcAddress string, rpc_encoding string) { l, err := net.Listen("tcp", rpcAddress) @@ -258,12 +208,12 @@ func startSessionManager(responder *rater.Responder, loggerDb rater.DataStorage) case FS: dp, _ := time.ParseDuration(fmt.Sprintf("%vs", sm_debit_period)) sm = sessionmanager.NewFSSessionManager(loggerDb, connector, dp) - errConn := sm.Connect(freeswitch_server, freeswitch_pass) + errConn := sm.Connect(freeswitch_server, freeswitch_pass, freeswitch_reconnects) if errConn != nil { rater.Logger.Err(fmt.Sprintf(" error: %s!", errConn)) } default: - rater.Logger.Err(fmt.Sprintf(" Unknown session manger type: %s!", sm_switch_type)) + rater.Logger.Err(fmt.Sprintf(" Unsupported session manger type: %s!", sm_switch_type)) exitChan <- true } exitChan <-true diff --git a/cmd/cgr-rater/config.go b/cmd/cgr-rater/config.go new file mode 100644 index 000000000..703033b2b --- /dev/null +++ b/cmd/cgr-rater/config.go @@ -0,0 +1,160 @@ +/* +Rating system designed to be used in VoIP Carriers World +Copyright (C) 2013 ITsysCOM + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see +*/ + +package main + +import ( + "code.google.com/p/goconf/conf" +) + +// 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") + } +} diff --git a/copyright_header.txt b/copyright_header.txt index 69d8706bd..ca4bc317e 100644 --- a/copyright_header.txt +++ b/copyright_header.txt @@ -1,6 +1,6 @@ /* Rating system designed to be used in VoIP Carriers World -Copyright (C) 2012 Radu Ioan Fericean +Copyright (C) 2013 ITsysCOM This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/sessionmanager/fssessionmanager.go b/sessionmanager/fssessionmanager.go index b7b7bd903..29b76d35a 100644 --- a/sessionmanager/fssessionmanager.go +++ b/sessionmanager/fssessionmanager.go @@ -47,15 +47,15 @@ func NewFSSessionManager(storage rater.DataStorage, connector rater.Connector, d // Connects to the freeswitch mod_event_socket server and starts // listening for events. -func (sm *FSSessionManager) Connect(address, pass string) (err error) { +func (sm *FSSessionManager) Connect(address, pass string, reconnects int) (err error) { eventFilters := map[string]string{"Call-Direction": "inbound"} - if fsock.FS, err = fsock.NewFSock(address, pass, 5, sm.createHandlers(), eventFilters, rater.Logger.(*syslog.Writer)); err != nil { + if fsock.FS, err = fsock.NewFSock(address, pass, reconnects, sm.createHandlers(), eventFilters, rater.Logger.(*syslog.Writer)); err != nil { return err } else if !fsock.FS.Connected() { return errors.New("Cannot connect to FreeSWITCH") } fsock.FS.ReadEvents() - return errors.New("Stopped reading events") + return errors.New("stopped reading events") } func (sm *FSSessionManager) createHandlers() (handlers map[string][]func(string)) { diff --git a/sessionmanager/sessionmanager.go b/sessionmanager/sessionmanager.go index b508f44ef..bb62a3433 100644 --- a/sessionmanager/sessionmanager.go +++ b/sessionmanager/sessionmanager.go @@ -24,7 +24,7 @@ import ( ) type SessionManager interface { - Connect(address, pass string) error + Connect(address, pass string, reconnects int) error DisconnectSession(*Session, string) RemoveSession(*Session) LoopAction(*Session, *rater.CallDescriptor)