Adding CDRS configuration, better handling and testing of the defaults

This commit is contained in:
DanB
2013-05-22 12:32:30 +02:00
parent 08184114ab
commit 83ef5b6d6f
8 changed files with 204 additions and 153 deletions

View File

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

View File

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

View File

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

View File

@@ -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: <gob|json>.
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: <x.y.z.y:1234>.
CDRSfsJSONEnabled bool // Enable the handler for FreeSWITCH JSON CDRs: <enabled|disabled>.
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")
}

View File

@@ -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!")
}
}

View File

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

View File

@@ -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: <gob|json>.
# 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: <true|false>.
# listen = 127.0.0.1:2012 # Balancer listen interface: <disabled|x.y.z.y:1234>.
# rpc_encoding = gob # RPC encoding used: <gob|json>.
[rater]
# enabled = false # Enable Rater service: <true|false>.
# balancer = disabled # Register to Balancer as worker: <enabled|disabled>.
# listen = 127.0.0.1:2012 # Rater's listening interface: <internal|x.y.z.y:1234>.
# rpc_encoding = gob # RPC encoding used: <gob|json>.
[scheduler]
# enabled = false # Starts Scheduler service: <true|false>.
[cdrs]
#listen=127.0.0.1:2022 # CDRS's listening interface: <x.y.z.y:1234>.
#freeswitch_json=enabled # Enable the handler for FreeSWITCH JSON CDRs: <enabled|disabled>.
[mediator]
# enabled = false # Starts Mediator service: <true|false>.
# listen=127.0.0.1:2032 # Mediator's listening interface: <internal|x.y.z.y:1234>.
# 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: <gob|json>.
# skipdb = false # Skips database checks for previous recorded prices: <true|false>.
# pseudoprepaid = false # Execute debits together with pricing: <true|false>.
# cdr_type = freeswitch_cdr # CDR type <freeswitch_cdr>.
@@ -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: <gob|json>.
# 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.

View File

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