mirror of
https://github.com/cgrates/cgrates.git
synced 2026-02-11 18:16:24 +05:00
Adding CDRS configuration, better handling and testing of the defaults
This commit is contained in:
10
cdrs/cdrs.go
10
cdrs/cdrs.go
@@ -22,12 +22,14 @@ import (
|
||||
"fmt"
|
||||
"github.com/cgrates/cgrates/mediator"
|
||||
"github.com/cgrates/cgrates/rater"
|
||||
"github.com/cgrates/cgrates/config"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
var (
|
||||
Logger = rater.Logger
|
||||
cfg *config.CGRConfig // Share the configuration with the rest of the package
|
||||
)
|
||||
|
||||
type CDRS struct {
|
||||
@@ -49,7 +51,9 @@ func New(storage rater.DataStorage, mediator *mediator.Mediator) *CDRS {
|
||||
return &CDRS{storage, mediator}
|
||||
}
|
||||
|
||||
func (cdrs *CDRS) StartCaptiuringCDRs() {
|
||||
http.HandleFunc("/cdr", cdrs.cdrHandler)
|
||||
http.ListenAndServe(":8080", nil)
|
||||
func (cdrs *CDRS) StartCapturingCDRs() {
|
||||
if cfg.CDRSfsJSONEnabled {
|
||||
http.HandleFunc("/freeswitch_json", cdrs.cdrHandler)
|
||||
}
|
||||
http.ListenAndServe(cfg.CDRSListen, nil)
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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!")
|
||||
|
||||
165
config/config.go
165
config/config.go
@@ -50,31 +50,31 @@ type CGRConfig struct {
|
||||
LogDBName string // The name of the database to connect to.
|
||||
LogDBUser string // The user to sign in as.
|
||||
LogDBPass string // The user's password.
|
||||
RPCEncoding string // RPC encoding used on APIs: <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")
|
||||
}
|
||||
|
||||
@@ -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!")
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user