Refactored config parser to avoid overwriting defaults if options not in configuration file, added reconnects config parameter to session manager

This commit is contained in:
DanB
2013-03-31 15:03:29 +02:00
parent 6639d17322
commit cbff5d5e90
5 changed files with 168 additions and 58 deletions

View File

@@ -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("<SessionManager> error: %s!", errConn))
}
default:
rater.Logger.Err(fmt.Sprintf("<SessionManager> Unknown session manger type: %s!", sm_switch_type))
rater.Logger.Err(fmt.Sprintf("<SessionManager> Unsupported session manger type: %s!", sm_switch_type))
exitChan <- true
}
exitChan <-true

160
cmd/cgr-rater/config.go Normal file
View File

@@ -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 <http://www.gnu.org/licenses/>
*/
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")
}
}

View File

@@ -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

View File

@@ -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)) {

View File

@@ -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)