diff --git a/agents/fsagent.go b/agents/fsagent.go index e5f8ae30d..6e4b741ba 100644 --- a/agents/fsagent.go +++ b/agents/fsagent.go @@ -259,6 +259,7 @@ func (sm *FSSessionManager) Connect() error { } else { sm.conns[connId] = fSock } + utils.Logger.Info(fmt.Sprintf("<%s> successfully connected to FreeSWITCH at: <%s>", utils.FreeSWITCHAgent, connCfg.Address)) go func() { // Start reading in own goroutine, return on error if err := sm.conns[connId].ReadEvents(); err != nil { errChan <- err diff --git a/apier/v1/sessions.go b/apier/v1/sessions.go index 45028d13a..575f24f08 100644 --- a/apier/v1/sessions.go +++ b/apier/v1/sessions.go @@ -19,6 +19,7 @@ along with this program. If not, see package v1 import ( + "github.com/cenk/rpc2" "github.com/cgrates/cgrates/sessionmanager" "github.com/cgrates/cgrates/utils" ) @@ -35,12 +36,12 @@ type SessionSv1 struct { // Publishes BiJSONRPC methods exported by SessionSv1 func (ssv1 *SessionSv1) Handlers() map[string]interface{} { return map[string]interface{}{ - utils.SessionSv1AuthorizeEvent: ssv1.SMG.BiRPCv1AuthorizeEvent, - utils.SessionSv1InitiateSession: ssv1.SMG.BiRPCv1InitiateSession, - utils.SessionSv1UpdateSession: ssv1.SMG.BiRPCv1UpdateSession, - utils.SessionSv1TerminateSession: ssv1.SMG.BiRPCv1TerminateSession, - utils.SessionSv1ProcessCDR: ssv1.SMG.BiRPCv1ProcessCDR, - utils.SessionSv1ProcessEvent: ssv1.SMG.BiRPCv1ProcessEvent, + utils.SessionSv1AuthorizeEvent: ssv1.BiRpcAuthorizeEvent, + utils.SessionSv1InitiateSession: ssv1.BiRpcInitiateSession, + utils.SessionSv1UpdateSession: ssv1.BiRpcUpdateSession, + utils.SessionSv1TerminateSession: ssv1.BiRpcTerminateSession, + utils.SessionSv1ProcessCDR: ssv1.BiRpcProcessCDR, + utils.SessionSv1ProcessEvent: ssv1.BiRpcProcessEvent, } } @@ -72,3 +73,32 @@ func (ssv1 *SessionSv1) ProcessEvent(args *sessionmanager.V1ProcessEventArgs, rply *sessionmanager.V1ProcessEventReply) error { return ssv1.SMG.BiRPCv1ProcessEvent(nil, args, rply) } + +func (ssv1 *SessionSv1) BiRpcAuthorizeEvent(clnt *rpc2.Client, args *sessionmanager.V1AuthorizeArgs, + rply *sessionmanager.V1AuthorizeReply) error { + return ssv1.SMG.BiRPCv1AuthorizeEvent(clnt, args, rply) +} + +func (ssv1 *SessionSv1) BiRpcInitiateSession(clnt *rpc2.Client, args *sessionmanager.V1InitSessionArgs, + rply *sessionmanager.V1InitSessionReply) error { + return ssv1.SMG.BiRPCv1InitiateSession(clnt, args, rply) +} + +func (ssv1 *SessionSv1) BiRpcUpdateSession(clnt *rpc2.Client, args *sessionmanager.V1UpdateSessionArgs, + rply *sessionmanager.V1UpdateSessionReply) error { + return ssv1.SMG.BiRPCv1UpdateSession(clnt, args, rply) +} + +func (ssv1 *SessionSv1) BiRpcTerminateSession(clnt *rpc2.Client, args *sessionmanager.V1TerminateSessionArgs, + rply *string) error { + return ssv1.SMG.BiRPCv1TerminateSession(clnt, args, rply) +} + +func (ssv1 *SessionSv1) BiRpcProcessCDR(clnt *rpc2.Client, cgrEv utils.CGREvent, rply *string) error { + return ssv1.SMG.BiRPCv1ProcessCDR(clnt, cgrEv, rply) +} + +func (ssv1 *SessionSv1) BiRpcProcessEvent(clnt *rpc2.Client, args *sessionmanager.V1ProcessEventArgs, + rply *sessionmanager.V1ProcessEventReply) error { + return ssv1.SMG.BiRPCv1ProcessEvent(clnt, args, rply) +} diff --git a/cmd/cgr-engine/cgr-engine.go b/cmd/cgr-engine/cgr-engine.go index 61322b97c..d4b631f01 100644 --- a/cmd/cgr-engine/cgr-engine.go +++ b/cmd/cgr-engine/cgr-engine.go @@ -130,16 +130,16 @@ func startCdrc(internalCdrSChan, internalRaterChan chan rpcclient.RpcClientConne } } -func startSmGeneric(internalSMGChan, internalRaterChan, internalResourceSChan, internalSupplierSChan, +func startSessionS(internalSMGChan, internalRaterChan, internalResourceSChan, internalSupplierSChan, internalAttrSChan, internalCDRSChan chan rpcclient.RpcClientConnection, server *utils.Server, exitChan chan bool) { - utils.Logger.Info("Starting CGRateS SMGeneric service.") + utils.Logger.Info("Starting CGRateS Session service.") var err error var ralsConns, resSConns, suplSConns, attrSConns, cdrsConn *rpcclient.RpcClientPool if len(cfg.SessionSCfg().RALsConns) != 0 { ralsConns, err = engine.NewRPCPool(rpcclient.POOL_FIRST, cfg.ConnectAttempts, cfg.Reconnects, cfg.ConnectTimeout, cfg.ReplyTimeout, cfg.SessionSCfg().RALsConns, internalRaterChan, cfg.InternalTtl) if err != nil { - utils.Logger.Crit(fmt.Sprintf(" Could not connect to RALs: %s", err.Error())) + utils.Logger.Crit(fmt.Sprintf("<%s> Could not connect to RALs: %s", utils.SessionS, err.Error())) exitChan <- true return } @@ -148,7 +148,7 @@ func startSmGeneric(internalSMGChan, internalRaterChan, internalResourceSChan, i resSConns, err = engine.NewRPCPool(rpcclient.POOL_FIRST, cfg.ConnectAttempts, cfg.Reconnects, cfg.ConnectTimeout, cfg.ReplyTimeout, cfg.SessionSCfg().ResSConns, internalResourceSChan, cfg.InternalTtl) if err != nil { - utils.Logger.Crit(fmt.Sprintf(" Could not connect to ResourceS: %s", err.Error())) + utils.Logger.Crit(fmt.Sprintf("<%s> Could not connect to ResourceS: %s", utils.SessionS, err.Error())) exitChan <- true return } @@ -157,7 +157,7 @@ func startSmGeneric(internalSMGChan, internalRaterChan, internalResourceSChan, i suplSConns, err = engine.NewRPCPool(rpcclient.POOL_FIRST, cfg.ConnectAttempts, cfg.Reconnects, cfg.ConnectTimeout, cfg.ReplyTimeout, cfg.SessionSCfg().SupplSConns, internalSupplierSChan, cfg.InternalTtl) if err != nil { - utils.Logger.Crit(fmt.Sprintf(" Could not connect to SupplierS: %s", err.Error())) + utils.Logger.Crit(fmt.Sprintf("<%s> Could not connect to SupplierS: %s", utils.SessionS, err.Error())) exitChan <- true return } @@ -166,7 +166,7 @@ func startSmGeneric(internalSMGChan, internalRaterChan, internalResourceSChan, i attrSConns, err = engine.NewRPCPool(rpcclient.POOL_FIRST, cfg.ConnectAttempts, cfg.Reconnects, cfg.ConnectTimeout, cfg.ReplyTimeout, cfg.SessionSCfg().AttrSConns, internalAttrSChan, cfg.InternalTtl) if err != nil { - utils.Logger.Crit(fmt.Sprintf(" Could not connect to AttributeS: %s", err.Error())) + utils.Logger.Crit(fmt.Sprintf("<%s> Could not connect to AttributeS: %s", utils.SessionS, err.Error())) exitChan <- true return } @@ -175,21 +175,21 @@ func startSmGeneric(internalSMGChan, internalRaterChan, internalResourceSChan, i cdrsConn, err = engine.NewRPCPool(rpcclient.POOL_FIRST, cfg.ConnectAttempts, cfg.Reconnects, cfg.ConnectTimeout, cfg.ReplyTimeout, cfg.SessionSCfg().CDRsConns, internalCDRSChan, cfg.InternalTtl) if err != nil { - utils.Logger.Crit(fmt.Sprintf(" Could not connect to RALs: %s", err.Error())) + utils.Logger.Crit(fmt.Sprintf("<%s> Could not connect to RALs: %s", utils.SessionS, err.Error())) exitChan <- true return } } smgReplConns, err := sessionmanager.NewSessionReplicationConns(cfg.SessionSCfg().SessionReplicationConns, cfg.Reconnects, cfg.ConnectTimeout, cfg.ReplyTimeout) if err != nil { - utils.Logger.Crit(fmt.Sprintf(" Could not connect to SMGReplicationConnection error: <%s>", err.Error())) + utils.Logger.Crit(fmt.Sprintf("<%s> Could not connect to SMGReplicationConnection error: <%s>", utils.SessionS, err.Error())) exitChan <- true return } sm := sessionmanager.NewSMGeneric(cfg, ralsConns, resSConns, suplSConns, attrSConns, cdrsConn, smgReplConns, cfg.DefaultTimezone) if err = sm.Connect(); err != nil { - utils.Logger.Err(fmt.Sprintf(" error: %s!", err)) + utils.Logger.Err(fmt.Sprintf("<%s> error: %s!", utils.SessionS, err)) } // Pass internal connection via BiRPCClient internalSMGChan <- sm @@ -213,8 +213,8 @@ func startSmGeneric(internalSMGChan, internalRaterChan, internalResourceSChan, i } } -func startSMAsterisk(internalSMGChan chan rpcclient.RpcClientConnection, exitChan chan bool) { - utils.Logger.Info("Starting CGRateS SM-Asterisk service.") +func startAsteriskAgent(internalSMGChan chan rpcclient.RpcClientConnection, exitChan chan bool) { + utils.Logger.Info("Starting Asterisk agent") smgRpcConn := <-internalSMGChan internalSMGChan <- smgRpcConn birpcClnt := utils.NewBiRPCInternalClient(smgRpcConn.(*sessionmanager.SMGeneric)) @@ -292,15 +292,15 @@ func startRadiusAgent(internalSMGChan chan rpcclient.RpcClientConnection, exitCh exitChan <- true } -func startSmFreeSWITCH(internalSMGChan chan rpcclient.RpcClientConnection, exitChan chan bool) { +func startFsAgent(internalSMGChan chan rpcclient.RpcClientConnection, exitChan chan bool) { var err error - utils.Logger.Info("Starting CGRateS SM-FreeSWITCH service") + utils.Logger.Info("Starting FreeSWITCH agent") smgRpcConn := <-internalSMGChan internalSMGChan <- smgRpcConn birpcClnt := utils.NewBiRPCInternalClient(smgRpcConn.(*sessionmanager.SMGeneric)) sm := agents.NewFSSessionManager(cfg.FsAgentCfg(), birpcClnt, cfg.DefaultTimezone) if err = sm.Connect(); err != nil { - utils.Logger.Err(fmt.Sprintf(" error: %s!", err)) + utils.Logger.Err(fmt.Sprintf("<%s> error: %s!", utils.FreeSWITCHAgent, err)) } exitChan <- true } @@ -921,12 +921,12 @@ func main() { // Start SM-Generic if cfg.SessionSCfg().Enabled { - go startSmGeneric(internalSMGChan, internalRaterChan, internalRsChan, + go startSessionS(internalSMGChan, internalRaterChan, internalRsChan, internalSupplierSChan, internalAttributeSChan, internalCdrSChan, server, exitChan) } // Start SM-FreeSWITCH if cfg.FsAgentCfg().Enabled { - go startSmFreeSWITCH(internalSMGChan, exitChan) + go startFsAgent(internalSMGChan, exitChan) // close all sessions on shutdown go shutdownSessionmanagerSingnalHandler(exitChan) } @@ -942,7 +942,7 @@ func main() { } if cfg.AsteriskAgentCfg().Enabled { - go startSMAsterisk(internalSMGChan, exitChan) + go startAsteriskAgent(internalSMGChan, exitChan) } if cfg.DiameterAgentCfg().Enabled { diff --git a/config/config.go b/config/config.go index 8acdb8e5f..11fe60893 100755 --- a/config/config.go +++ b/config/config.go @@ -323,7 +323,7 @@ func (self *CGRConfig) checkConfigSanity() error { } } for _, connCfg := range self.RALsThresholdSConns { - if connCfg.Address == utils.MetaInternal && !self.UserServerEnabled { + if connCfg.Address == utils.MetaInternal && !self.thresholdSCfg.Enabled { return errors.New("ThresholdS not enabled but requested by RALs component.") } } diff --git a/data/tutorials/fs_evsock/cgrates/etc/cgrates/cdrc_fs.json b/data/tutorials/fs_evsock/cgrates/etc/cgrates/cdrc_fs.json deleted file mode 100644 index 61956da54..000000000 --- a/data/tutorials/fs_evsock/cgrates/etc/cgrates/cdrc_fs.json +++ /dev/null @@ -1,30 +0,0 @@ -{ -// Contains CDRC template for FreeSWITCH CDR - -"cdrc": [ - { - "id": "CDRC-FS", - "enabled": true, // enable CDR client functionality - "cdr_in_dir": "/tmp/cgr_fsevsock/cgrates/cdrc/in", // absolute path towards the directory where the CDRs are stored - "cdr_out_dir": "/tmp/cgr_fsevsock/cgrates/cdrc/out", // absolute path towards the directory where processed CDRs will be moved - "cdr_source_id": "fs_csv", // free form field, tag identifying the source of the CDRs within CDRS database - "content_fields":[ // import template, tag will match internally CDR field, in case of .csv value will be represented by index of the field value - {"tag": "tor", "field_id": "ToR", "type": "*composed", "value": "^*voice", "mandatory": true}, - {"tag": "accid", "field_id": "OriginID", "type": "*composed", "value": "10", "mandatory": true}, - {"tag": "reqtype", "field_id": "RequestType", "type": "*composed", "value": "^*pseudoprepaid", "mandatory": true}, - {"tag": "direction", "field_id": "Direction", "type": "*composed", "value": "^*out", "mandatory": true}, - {"tag": "tenant", "field_id": "Tenant", "type": "*composed", "value": "^cgrates.org", "mandatory": true}, - {"tag": "category", "field_id": "Category", "type": "*composed", "value": "^call", "mandatory": true}, - {"tag": "account", "field_id": "Account", "type": "*composed", "value": "12", "mandatory": true}, - {"tag": "subject", "field_id": "Subject", "type": "*composed", "value": "12", "mandatory": true}, - {"tag": "destination", "field_id": "Destination", "type": "*composed", "value": "2", "mandatory": true}, - {"tag": "setup_time", "field_id": "SetupTime", "type": "*composed", "value": "4", "mandatory": true}, - {"tag": "answer_time", "field_id": "AnswerTime", "type": "*composed", "value": "5", "mandatory": true}, - {"tag": "usage", "field_id": "Usage", "type": "*composed", "value": "~8:s/^(\\d+)$/${1}s/", "mandatory": true}, - - ], - }, -], - -} - diff --git a/data/tutorials/fs_evsock/cgrates/etc/cgrates/cgrates.json b/data/tutorials/fs_evsock/cgrates/etc/cgrates/cgrates.json index a6b570600..5d7d880b0 100644 --- a/data/tutorials/fs_evsock/cgrates/etc/cgrates/cgrates.json +++ b/data/tutorials/fs_evsock/cgrates/etc/cgrates/cgrates.json @@ -7,141 +7,120 @@ // This is what you get when you load CGRateS with an empty configuration file. +"listen": { + "rpc_json": ":2012", + "rpc_gob": ":2013", + "http": ":2080", +}, + + +"stor_db": { + "db_password": "CGRateS.org", +}, + + +"scheduler": { + "enabled": true, +}, + + "rals": { - "enabled": true, // enable Rater service: - "cdrstats_conns": [ + "enabled": true, + "thresholds_conns": [ + {"address": "*internal"} + ], + "stats_conns": [ {"address": "*internal"} ], "pubsubs_conns": [ {"address": "*internal"} ], - "users_conns": [ + "attributes_conns": [ {"address": "*internal"} ], - "aliases_conns": [ - {"address": "*internal"} - ], -}, - -"stor_db": { // database used to store offline tariff plans and CDRs - "db_password": "CGRateS.org", // password to use when connecting to stordb -}, - -"scheduler": { - "enabled": true, // start Scheduler service: }, "cdrs": { - "enabled": true, // start the CDR Server service: - "cdrstats_conns": [ + "enabled": true, +}, + + +"sessions": { + "enabled": true, + "rals_conns": [ {"address": "*internal"} ], + "cdrs_conns": [ + {"address": "*internal"} + ], + "resources_conns": [ + {"address": "*internal"} + ], + "suppliers_conns": [ + {"address": "*internal"} + ], + "attributes_conns": [ + {"address": "*internal"} + ], + "debit_interval": "10s", }, -"cdrstats": { - "enabled": true, // starts the cdrstats service: -}, - - -//"rls": { -// "enabled": true, // starts ResourceLimiter service: . -// "cdrstats_conns": [ -// {"address": "*internal"} -// ], -//}, - - -"cdre": { - "*default": { - "cdr_format": "csv", // exported CDRs format - "field_separator": ",", - "data_usage_multiply_factor": 1, // multiply data usage before export (eg: convert from KBytes to Bytes) - "sms_usage_multiply_factor": 1, // multiply data usage before export (eg: convert from SMS unit to call duration in some billing systems) - "generic_usage_multiply_factor": 1, // multiply data usage before export (eg: convert from GENERIC unit to call duration in some billing systems) - "cost_multiply_factor": 1, // multiply cost before export, eg: add VAT - "cost_rounding_decimals": -1, // rounding decimals for Cost values. -1 to disable rounding - "cost_shift_digits": 0, // shift digits in the cost on export (eg: convert from EUR to cents) - "mask_destination_id": "MASKED_DESTINATIONS", // destination id containing called addresses to be masked on export - "mask_length": 0, // length of the destination suffix to be masked - "export_dir": "/tmp/cgr_fsevsock/cgrates/cdre", // path where the exported CDRs will be placed - "header_fields": [], // template of the exported header fields - "content_fields": [ // template of the exported content fields - {"tag": "CgrId", "type": "*composed", "value": "CGRID"}, - {"tag":"RunId", "type": "*composed", "value": "RunID"}, - {"tag":"Tor", "type": "cdrfield", "value": "ToR"}, - {"tag":"AccId", "type": "*composed", "value": "OriginID"}, - {"tag":"ReqType", "type": "*composed", "value": "RequestType"}, - {"tag":"Direction", "type": "*composed", "value": "Direction"}, - {"tag":"Tenant", "type": "*composed", "value": "Tenant"}, - {"tag":"Category", "type": "*composed", "value": "Category"}, - {"tag":"Account", "type": "*composed", "value": "Account"}, - {"tag":"Subject", "type": "*composed", "value": "Subject"}, - {"tag":"Destination", "type": "*composed", "value": "Destination"}, - {"tag":"SetupTime", "type": "*datetime", "value": "SetupTime", "layout": "2006-01-02T15:04:05Z07:00"}, - {"tag":"AnswerTime", "type": "*datetime", "value": "AnswerTime", "layout": "2006-01-02T15:04:05Z07:00"}, - {"tag":"Usage", "type": "*datetime", "value": "Usage"}, - {"tag":"Cost", "type": "*composed", "value": "Cost"}, - ], - "trailer_fields": [], // template of the exported trailer fields - }, - "customer_tpl": { - "cdr_format": "csv", // exported CDRs format - "field_separator": ";", - "data_usage_multiply_factor": 1, // multiply data usage before export (eg: convert from KBytes to Bytes) - "sms_usage_multiply_factor": 1, // multiply data usage before export (eg: convert from SMS unit to call duration in some billing systems) - "generic_usage_multiply_factor": 1, // multiply data usage before export (eg: convert from GENERIC unit to call duration in some billing systems) - "cost_multiply_factor": 1, // multiply cost before export, eg: add VAT - "cost_rounding_decimals": -1, // rounding decimals for Cost values. -1 to disable rounding - "cost_shift_digits": 0, // shift digits in the cost on export (eg: convert from EUR to cents) - "mask_destination_id": "MASKED_DESTINATIONS", // destination id containing called addresses to be masked on export - "mask_length": 0, // length of the destination suffix to be masked - "export_dir": "/tmp/cgr_fsevsock/cgrates/cdre", // path where the exported CDRs will be placed - "header_fields": [], // template of the exported header fields - "content_fields": [ // template of the exported content fields - {"tag": "CgrId", "type": "*composed", "value": "CGRID"}, - {"tag":"AccId", "type": "*composed", "value": "OriginID"}, - {"tag":"ReqType", "type": "*composed", "value": "RequestType"}, - {"tag":"Tenant", "type": "*composed", "value": "Tenant"}, - {"tag":"Category", "type": "*composed", "value": "Category"}, - {"tag":"Subject", "type": "*composed", "value": "Account"}, - {"tag":"Destination", "type": "*composed", "value": "~Destination:s/^1(\\d+)/+$1/:s/^\\+(\\d+)/00$1/"}, - {"tag":"AnswerTime", "type": "*datetime", "value": "AnswerTIme", "layout": "2006-01-02T15:04:05Z07:00"}, - {"tag":"Usage", "type": "*composed", "value": "Usage"}, - {"tag":"Cost", "type": "*composed", "value": "Cost"}, - ], - "trailer_fields": [], - }, -}, - - -"sm_freeswitch": { - "enabled": true, // starts SessionManager service: - "debit_interval": "5s", // interval to perform debits on. - //"rls_conns": [ - // {"address": "*internal"} - //], - "channel_sync_interval": "10s", - "event_socket_conns":[ // instantiate connections to multiple FreeSWITCH servers - {"address": "127.0.0.1:8021", "password": "ClueCon", "reconnects": 5} +"freeswitch_agent": { + "enabled": true, + "sessions_conns": [ + {"address": "*internal"} + ], + "event_socket_conns":[ + {"address": "10.10.10.204:8021", "password": "ClueCon", "reconnects": 5} ], }, "pubsubs": { - "enabled": true, // starts PubSub service: . -}, - - -"users": { - "enabled": true, // starts User service: . - "indexes": ["Uuid"], // user profile field indexes -}, - -"aliases": { "enabled": true, -} +}, + + +"attributes": { + "enabled": true, +}, + + +"resources": { + "enabled": true, + "thresholds_conns": [ + {"address": "*internal"} + ], +}, + + +"stats": { + "enabled": true, + "thresholds_conns": [ + {"address": "*internal"} + ], +}, + + +"thresholds": { + "enabled": true, +}, + + +"suppliers": { + "enabled": true, + "rals_conns": [ + {"address": "*internal"} + ], + "resources_conns": [ + {"address": "*internal"} + ], + "stats_conns": [ + {"address": "*internal"} + ], +}, } diff --git a/sessionmanager/smgeneric.go b/sessionmanager/smgeneric.go index 5c97a72aa..ff9d7a107 100644 --- a/sessionmanager/smgeneric.go +++ b/sessionmanager/smgeneric.go @@ -26,7 +26,6 @@ import ( "sync" "time" - "github.com/cenk/rpc2" "github.com/cgrates/cgrates/cache" "github.com/cgrates/cgrates/config" "github.com/cgrates/cgrates/engine" @@ -1040,6 +1039,7 @@ func (smg *SMGeneric) CallBiRPC(clnt rpcclient.RpcClientConnection, } params := []reflect.Value{clntVal, reflect.ValueOf(args), reflect.ValueOf(reply)} + fmt.Printf("serviceMethod: %s, args: %+v\n", serviceMethod, args) ret := method.Call(params) if len(ret) != 1 { return utils.ErrServerError @@ -1334,7 +1334,7 @@ type V1AuthorizeReply struct { } // BiRPCV1Authorize performs authorization for CGREvent based on specific components -func (smg *SMGeneric) BiRPCv1AuthorizeEvent(clnt *rpc2.Client, +func (smg *SMGeneric) BiRPCv1AuthorizeEvent(clnt rpcclient.RpcClientConnection, args *V1AuthorizeArgs, authReply *V1AuthorizeReply) (err error) { if args.GetMaxUsage { if smg.rals == nil { @@ -1410,7 +1410,7 @@ type V1InitSessionReply struct { } // BiRPCV2InitiateSession initiates a new session, returns the maximum duration the session can last -func (smg *SMGeneric) BiRPCv1InitiateSession(clnt *rpc2.Client, +func (smg *SMGeneric) BiRPCv1InitiateSession(clnt rpcclient.RpcClientConnection, args *V1InitSessionArgs, rply *V1InitSessionReply) (err error) { if args.AllocateResources { if smg.resS == nil { @@ -1469,7 +1469,7 @@ type V1UpdateSessionReply struct { } // BiRPCV1UpdateSession updates an existing session, returning the duration which the session can still last -func (smg *SMGeneric) BiRPCv1UpdateSession(clnt *rpc2.Client, +func (smg *SMGeneric) BiRPCv1UpdateSession(clnt rpcclient.RpcClientConnection, args *V1UpdateSessionArgs, rply *V1UpdateSessionReply) (err error) { if args.UpdateSession { if smg.rals == nil { @@ -1513,7 +1513,7 @@ type V1TerminateSessionArgs struct { } // BiRPCV1TerminateSession will stop debit loops as well as release any used resources -func (smg *SMGeneric) BiRPCv1TerminateSession(clnt *rpc2.Client, +func (smg *SMGeneric) BiRPCv1TerminateSession(clnt rpcclient.RpcClientConnection, args *V1TerminateSessionArgs, rply *string) (err error) { if args.TerminateSession { if smg.rals == nil { @@ -1547,7 +1547,7 @@ func (smg *SMGeneric) BiRPCv1TerminateSession(clnt *rpc2.Client, } // Called on session end, should send the CDR to CDRS -func (smg *SMGeneric) BiRPCv1ProcessCDR(clnt *rpc2.Client, +func (smg *SMGeneric) BiRPCv1ProcessCDR(clnt rpcclient.RpcClientConnection, cgrEv utils.CGREvent, reply *string) error { if err := smg.ProcessCDR(cgrEv.Event); err != nil { return utils.NewErrServerError(err) @@ -1570,7 +1570,7 @@ type V1ProcessEventReply struct { } // Called on session end, should send the CDR to CDRS -func (smg *SMGeneric) BiRPCv1ProcessEvent(clnt *rpc2.Client, +func (smg *SMGeneric) BiRPCv1ProcessEvent(clnt rpcclient.RpcClientConnection, args *V1ProcessEventArgs, rply *V1ProcessEventReply) (err error) { if args.AllocateResources { if smg.resS == nil { diff --git a/utils/consts.go b/utils/consts.go index 876f69306..de60d067f 100755 --- a/utils/consts.go +++ b/utils/consts.go @@ -531,6 +531,7 @@ const ( AttributeS = "AttributeS" MetaSessionS = "*sessions" FreeSWITCHAgent = "FreeSWITCHAgent" + SessionS = "SessionS" ) //Meta