From b9843605484d239c3ebb4ac566f93a53f2a84624 Mon Sep 17 00:00:00 2001 From: DanB Date: Thu, 11 Jun 2015 19:15:04 +0200 Subject: [PATCH] Adding subscribe_park configuration in sm-freeswitch --- cdrc/cdrc_test.go | 41 ++++++++++++++++-------------- config/config_defaults.go | 1 + config/config_json_test.go | 1 + config/libconfig_json.go | 1 + config/smconfig.go | 4 +++ config/smconfig_test.go | 8 +++--- data/conf/cgrates/cgrates.json | 1 + sessionmanager/fssessionmanager.go | 17 ++++++++----- 8 files changed, 45 insertions(+), 29 deletions(-) diff --git a/cdrc/cdrc_test.go b/cdrc/cdrc_test.go index 3df10de4f..fbf467716 100644 --- a/cdrc/cdrc_test.go +++ b/cdrc/cdrc_test.go @@ -32,6 +32,8 @@ func TestRecordForkCdr(t *testing.T) { cgrConfig, _ := config.NewDefaultCGRConfig() cdrcConfig := cgrConfig.CdrcProfiles["/var/log/cgrates/cdrc/in"][utils.META_DEFAULT] cdrcConfig.CdrFields = append(cdrcConfig.CdrFields, &config.CfgCdrField{Tag: "SupplierTest", Type: utils.CDRFIELD, CdrFieldId: "supplier", Value: []*utils.RSRField{&utils.RSRField{Id: "14"}}}) + cdrcConfig.CdrFields = append(cdrcConfig.CdrFields, &config.CfgCdrField{Tag: "DisconnectCauseTest", Type: utils.CDRFIELD, CdrFieldId: utils.DISCONNECT_CAUSE, + Value: []*utils.RSRField{&utils.RSRField{Id: "16"}}}) cdrc := &Cdrc{CdrFormat: CSV, cdrSourceIds: []string{"TEST_CDRC"}, cdrFields: [][]*config.CfgCdrField{cdrcConfig.CdrFields}} cdrRow := []string{"firstField", "secondField"} _, err := cdrc.recordToStoredCdr(cdrRow, 0) @@ -39,30 +41,31 @@ func TestRecordForkCdr(t *testing.T) { t.Error("Failed to corectly detect missing fields from record") } cdrRow = []string{"ignored", "ignored", utils.VOICE, "acc1", utils.META_PREPAID, "*out", "cgrates.org", "call", "1001", "1001", "+4986517174963", - "2013-02-03 19:50:00", "2013-02-03 19:54:00", "62", "supplier1", "172.16.1.1"} + "2013-02-03 19:50:00", "2013-02-03 19:54:00", "62", "supplier1", "172.16.1.1", "NORMAL_DISCONNECT"} rtCdr, err := cdrc.recordToStoredCdr(cdrRow, 0) if err != nil { t.Error("Failed to parse CDR in rated cdr", err) } expectedCdr := &engine.StoredCdr{ - CgrId: utils.Sha1(cdrRow[3], time.Date(2013, 2, 3, 19, 50, 0, 0, time.UTC).String()), - TOR: cdrRow[2], - AccId: cdrRow[3], - CdrHost: "0.0.0.0", // Got it over internal interface - CdrSource: "TEST_CDRC", - ReqType: cdrRow[4], - Direction: cdrRow[5], - Tenant: cdrRow[6], - Category: cdrRow[7], - Account: cdrRow[8], - Subject: cdrRow[9], - Destination: cdrRow[10], - SetupTime: time.Date(2013, 2, 3, 19, 50, 0, 0, time.UTC), - AnswerTime: time.Date(2013, 2, 3, 19, 54, 0, 0, time.UTC), - Usage: time.Duration(62) * time.Second, - Supplier: "supplier1", - ExtraFields: map[string]string{}, - Cost: -1, + CgrId: utils.Sha1(cdrRow[3], time.Date(2013, 2, 3, 19, 50, 0, 0, time.UTC).String()), + TOR: cdrRow[2], + AccId: cdrRow[3], + CdrHost: "0.0.0.0", // Got it over internal interface + CdrSource: "TEST_CDRC", + ReqType: cdrRow[4], + Direction: cdrRow[5], + Tenant: cdrRow[6], + Category: cdrRow[7], + Account: cdrRow[8], + Subject: cdrRow[9], + Destination: cdrRow[10], + SetupTime: time.Date(2013, 2, 3, 19, 50, 0, 0, time.UTC), + AnswerTime: time.Date(2013, 2, 3, 19, 54, 0, 0, time.UTC), + Usage: time.Duration(62) * time.Second, + Supplier: "supplier1", + DisconnectCause: "NORMAL_DISCONNECT", + ExtraFields: map[string]string{}, + Cost: -1, } if !reflect.DeepEqual(expectedCdr, rtCdr) { t.Errorf("Expected: \n%v, \nreceived: \n%v", expectedCdr, rtCdr) diff --git a/config/config_defaults.go b/config/config_defaults.go index a7092ced9..0162026b8 100644 --- a/config/config_defaults.go +++ b/config/config_defaults.go @@ -191,6 +191,7 @@ const CGRATES_CFG_JSON = ` "low_balance_ann_file": "", // file to be played when low balance is reached for prepaid calls "empty_balance_context": "", // if defined, prepaid calls will be transfered to this context on empty balance "empty_balance_ann_file": "", // file to be played before disconnecting prepaid calls on empty balance (applies only if no context defined) + "subscribe_park": true, // subscribe via fsock to receive park events "connections":[ // instantiate connections to multiple FreeSWITCH servers {"server": "127.0.0.1:8021", "password": "ClueCon", "reconnects": 5} ], diff --git a/config/config_json_test.go b/config/config_json_test.go index 5f8fc7252..a16e69e4e 100644 --- a/config/config_json_test.go +++ b/config/config_json_test.go @@ -319,6 +319,7 @@ func TestSmFsJsonCfg(t *testing.T) { Low_balance_ann_file: utils.StringPointer(""), Empty_balance_context: utils.StringPointer(""), Empty_balance_ann_file: utils.StringPointer(""), + Subscribe_park: utils.BoolPointer(true), Connections: &[]*FsConnJsonCfg{ &FsConnJsonCfg{ Server: utils.StringPointer("127.0.0.1:8021"), diff --git a/config/libconfig_json.go b/config/libconfig_json.go index 2a4cd0094..9b00ee879 100644 --- a/config/libconfig_json.go +++ b/config/libconfig_json.go @@ -151,6 +151,7 @@ type SmFsJsonCfg struct { Low_balance_ann_file *string Empty_balance_context *string Empty_balance_ann_file *string + Subscribe_park *bool Connections *[]*FsConnJsonCfg } diff --git a/config/smconfig.go b/config/smconfig.go index 6da21dce4..62fc30ad9 100644 --- a/config/smconfig.go +++ b/config/smconfig.go @@ -69,6 +69,7 @@ type SmFsConfig struct { LowBalanceAnnFile string EmptyBalanceContext string EmptyBalanceAnnFile string + SubscribePark bool Connections []*FsConnConfig } @@ -126,6 +127,9 @@ func (self *SmFsConfig) loadFromJsonCfg(jsnCfg *SmFsJsonCfg) error { if jsnCfg.Empty_balance_ann_file != nil { self.EmptyBalanceAnnFile = *jsnCfg.Empty_balance_ann_file } + if jsnCfg.Subscribe_park != nil { + self.SubscribePark = *jsnCfg.Subscribe_park + } if jsnCfg.Connections != nil { self.Connections = make([]*FsConnConfig, len(*jsnCfg.Connections)) for idx, jsnConnCfg := range *jsnCfg.Connections { diff --git a/config/smconfig_test.go b/config/smconfig_test.go index 1f486867d..4276f9089 100644 --- a/config/smconfig_test.go +++ b/config/smconfig_test.go @@ -26,8 +26,9 @@ import ( func TesSmFsConfigLoadFromJsonCfg(t *testing.T) { smFsJsnCfg := &SmFsJsonCfg{ - Enabled: utils.BoolPointer(true), - Create_cdr: utils.BoolPointer(true), + Enabled: utils.BoolPointer(true), + Create_cdr: utils.BoolPointer(true), + Subscribe_park: utils.BoolPointer(true), Connections: &[]*FsConnJsonCfg{ &FsConnJsonCfg{ Server: utils.StringPointer("1.2.3.4:8021"), @@ -42,7 +43,8 @@ func TesSmFsConfigLoadFromJsonCfg(t *testing.T) { }, } eSmFsConfig := &SmFsConfig{Enabled: true, - CreateCdr: true, + CreateCdr: true, + SubscribePark: true, Connections: []*FsConnConfig{ &FsConnConfig{Server: "1.2.3.4:8021", Password: "ClueCon", Reconnects: 5}, &FsConnConfig{Server: "1.2.3.4:8021", Password: "ClueCon", Reconnects: 5}, diff --git a/data/conf/cgrates/cgrates.json b/data/conf/cgrates/cgrates.json index 328d61044..8486315d2 100644 --- a/data/conf/cgrates/cgrates.json +++ b/data/conf/cgrates/cgrates.json @@ -171,6 +171,7 @@ // "low_balance_ann_file": "", // file to be played when low balance is reached for prepaid calls // "empty_balance_context": "", // if defined, prepaid calls will be transfered to this context on empty balance // "empty_balance_ann_file": "", // file to be played before disconnecting prepaid calls on empty balance (applies only if no context defined) +// "subscribe_park": true, // subscribe via fsock to receive park events // "connections":[ // instantiate connections to multiple FreeSWITCH servers // {"server": "127.0.0.1:8021", "password": "ClueCon", "reconnects": 5} // ], diff --git a/sessionmanager/fssessionmanager.go b/sessionmanager/fssessionmanager.go index c2b65a5f4..6db569dc6 100644 --- a/sessionmanager/fssessionmanager.go +++ b/sessionmanager/fssessionmanager.go @@ -74,11 +74,7 @@ func (sm *FSSessionManager) Connect() error { return err } -func (sm *FSSessionManager) createHandlers() (handlers map[string][]func(string, string)) { - cp := func(body, connId string) { - ev := new(FSEvent).AsEvent(body) - sm.onChannelPark(ev, connId) - } +func (sm *FSSessionManager) createHandlers() map[string][]func(string, string) { ca := func(body, connId string) { ev := new(FSEvent).AsEvent(body) sm.onChannelAnswer(ev, connId) @@ -87,11 +83,18 @@ func (sm *FSSessionManager) createHandlers() (handlers map[string][]func(string, ev := new(FSEvent).AsEvent(body) sm.onChannelHangupComplete(ev) } - return map[string][]func(string, string){ - "CHANNEL_PARK": []func(string, string){cp}, + handlers := map[string][]func(string, string){ "CHANNEL_ANSWER": []func(string, string){ca}, "CHANNEL_HANGUP_COMPLETE": []func(string, string){ch}, } + if sm.cfg.SubscribePark { + cp := func(body, connId string) { + ev := new(FSEvent).AsEvent(body) + sm.onChannelPark(ev, connId) + } + handlers["CHANNEL_PARK"] = []func(string, string){cp} + } + return handlers } // Searches and return the session with the specifed uuid