diff --git a/agents/astagent.go b/agents/astagent.go index 514d7c8e3..0f9d21c9c 100644 --- a/agents/astagent.go +++ b/agents/astagent.go @@ -103,7 +103,8 @@ func (sma *AsteriskAgent) ListenAndServe() (err error) { return case astRawEv := <-sma.astEvChan: smAsteriskEvent := NewSMAsteriskEvent(astRawEv, - strings.Split(sma.cgrCfg.AsteriskAgentCfg().AsteriskConns[sma.astConnIdx].Address, ":")[0]) + strings.Split(sma.cgrCfg.AsteriskAgentCfg().AsteriskConns[sma.astConnIdx].Address, ":")[0], + sma.cgrCfg.AsteriskAgentCfg().AsteriskConns[sma.astConnIdx].Alias) switch smAsteriskEvent.EventType() { case ARIStasisStart: diff --git a/agents/asterisk_event.go b/agents/asterisk_event.go index 8dced0575..2b3987039 100644 --- a/agents/asterisk_event.go +++ b/agents/asterisk_event.go @@ -27,16 +27,17 @@ import ( "github.com/cgrates/cgrates/utils" ) -func NewSMAsteriskEvent(ariEv map[string]interface{}, asteriskIP string) *SMAsteriskEvent { +func NewSMAsteriskEvent(ariEv map[string]interface{}, asteriskIP, asteriskAlias string) *SMAsteriskEvent { smsmaEv := &SMAsteriskEvent{ariEv: ariEv, asteriskIP: asteriskIP, cachedFields: make(map[string]string)} smsmaEv.parseStasisArgs() // Populate appArgs return smsmaEv } type SMAsteriskEvent struct { // Standalone struct so we can cache the fields while we parse them - ariEv map[string]interface{} // stasis event - asteriskIP string - cachedFields map[string]string // Cache replies here + ariEv map[string]interface{} // stasis event + asteriskIP string + asteriskAlias string + cachedFields map[string]string // Cache replies here } // parseStasisArgs will convert the args passed to Stasis into CGRateS attribute/value pairs understood by CGRateS and store them in cachedFields @@ -239,7 +240,7 @@ func (smaEv *SMAsteriskEvent) AsMapStringInterface() (mp map[string]interface{}) if smaEv.Subject() != "" { mp[utils.Subject] = smaEv.Subject() } - mp[utils.OriginHost] = utils.FirstNonEmpty(smaEv.OriginHost(), smaEv.OriginatorIP()) + mp[utils.OriginHost] = utils.FirstNonEmpty(smaEv.OriginHost(), smaEv.asteriskAlias, smaEv.OriginatorIP()) mp[utils.Account] = smaEv.Account() mp[utils.Destination] = smaEv.Destination() mp[utils.SetupTime] = smaEv.SetupTime() diff --git a/agents/asterisk_event_test.go b/agents/asterisk_event_test.go index e231c8143..9b30b5aee 100644 --- a/agents/asterisk_event_test.go +++ b/agents/asterisk_event_test.go @@ -40,7 +40,7 @@ func TestSMAParseStasisArgs(t *testing.T) { if err := json.Unmarshal([]byte(stasisStart), &ev); err != nil { t.Error(err) } - smaEv := NewSMAsteriskEvent(ev, "127.0.0.1") + smaEv := NewSMAsteriskEvent(ev, "127.0.0.1", "") expAppArgs := map[string]string{"cgr_reqtype": "*prepaid", "cgr_supplier": "supplier1", "extra1": "val1", "extra2": "val2"} if !reflect.DeepEqual(smaEv.cachedFields, expAppArgs) { t.Errorf("Expecting: %+v, received: %+v", smaEv.cachedFields, expAppArgs) @@ -49,7 +49,7 @@ func TestSMAParseStasisArgs(t *testing.T) { if err := json.Unmarshal([]byte("{}"), &ev); err != nil { t.Error(err) } - smaEv = NewSMAsteriskEvent(ev, "127.0.0.1") + smaEv = NewSMAsteriskEvent(ev, "127.0.0.1", "") expAppArgs = map[string]string{} if !reflect.DeepEqual(smaEv.cachedFields, expAppArgs) { t.Errorf("Expecting: %+v, received: %+v", smaEv.cachedFields, expAppArgs) @@ -61,7 +61,7 @@ func TestSMAEventType(t *testing.T) { if err := json.Unmarshal([]byte(stasisStart), &ev); err != nil { t.Error(err) } - smaEv := NewSMAsteriskEvent(ev, "127.0.0.1") + smaEv := NewSMAsteriskEvent(ev, "127.0.0.1", "") if smaEv.EventType() != "StasisStart" { t.Error("Received:", smaEv.EventType()) } @@ -69,7 +69,7 @@ func TestSMAEventType(t *testing.T) { if err := json.Unmarshal([]byte("{}"), &ev); err != nil { t.Error(err) } - smaEv = NewSMAsteriskEvent(ev, "127.0.0.1") + smaEv = NewSMAsteriskEvent(ev, "127.0.0.1", "") if smaEv.EventType() != "" { t.Error("Received:", smaEv.EventType()) } @@ -80,7 +80,7 @@ func TestSMAEventChannelID(t *testing.T) { if err := json.Unmarshal([]byte(stasisStart), &ev); err != nil { t.Error(err) } - smaEv := NewSMAsteriskEvent(ev, "127.0.0.1") + smaEv := NewSMAsteriskEvent(ev, "127.0.0.1", "") if smaEv.ChannelID() != "1473681228.6" { t.Error("Received:", smaEv.ChannelID()) } @@ -88,7 +88,7 @@ func TestSMAEventChannelID(t *testing.T) { if err := json.Unmarshal([]byte("{}"), &ev); err != nil { t.Error(err) } - smaEv = NewSMAsteriskEvent(ev, "127.0.0.1") + smaEv = NewSMAsteriskEvent(ev, "127.0.0.1", "") if smaEv.ChannelID() != "" { t.Error("Received:", smaEv.ChannelID()) } @@ -99,7 +99,7 @@ func TestSMAEventOriginatorIP(t *testing.T) { if err := json.Unmarshal([]byte(stasisStart), &ev); err != nil { t.Error(err) } - smaEv := NewSMAsteriskEvent(ev, "127.0.0.1") + smaEv := NewSMAsteriskEvent(ev, "127.0.0.1", "") if smaEv.OriginatorIP() != "127.0.0.1" { t.Error("Received:", smaEv.OriginatorIP()) } @@ -110,7 +110,7 @@ func TestSMAEventAccount(t *testing.T) { if err := json.Unmarshal([]byte(stasisStart), &ev); err != nil { t.Error(err) } - smaEv := NewSMAsteriskEvent(ev, "127.0.0.1") + smaEv := NewSMAsteriskEvent(ev, "127.0.0.1", "") if smaEv.Account() != "1001" { t.Error("Received:", smaEv.Account()) } @@ -118,7 +118,7 @@ func TestSMAEventAccount(t *testing.T) { if err := json.Unmarshal([]byte("{}"), &ev); err != nil { t.Error(err) } - smaEv = NewSMAsteriskEvent(ev, "127.0.0.1") + smaEv = NewSMAsteriskEvent(ev, "127.0.0.1", "") if smaEv.Account() != "" { t.Error("Received:", smaEv.Account()) } @@ -129,7 +129,7 @@ func TestSMAEventDestination(t *testing.T) { if err := json.Unmarshal([]byte(stasisStart), &ev); err != nil { t.Error(err) } - smaEv := NewSMAsteriskEvent(ev, "127.0.0.1") + smaEv := NewSMAsteriskEvent(ev, "127.0.0.1", "") if smaEv.Destination() != "1002" { t.Error("Received:", smaEv.Destination()) } @@ -137,7 +137,7 @@ func TestSMAEventDestination(t *testing.T) { if err := json.Unmarshal([]byte("{}"), &ev); err != nil { t.Error(err) } - smaEv = NewSMAsteriskEvent(ev, "127.0.0.1") + smaEv = NewSMAsteriskEvent(ev, "127.0.0.1", "") if smaEv.Destination() != "" { t.Error("Received:", smaEv.Destination()) } @@ -148,7 +148,7 @@ func TestSMAEventTimestamp(t *testing.T) { if err := json.Unmarshal([]byte(stasisStart), &ev); err != nil { t.Error(err) } - smaEv := NewSMAsteriskEvent(ev, "127.0.0.1") + smaEv := NewSMAsteriskEvent(ev, "127.0.0.1", "") if smaEv.Timestamp() != "2016-09-12T13:53:48.919+0200" { t.Error("Received:", smaEv.Timestamp()) } @@ -156,7 +156,7 @@ func TestSMAEventTimestamp(t *testing.T) { if err := json.Unmarshal([]byte("{}"), &ev); err != nil { t.Error(err) } - smaEv = NewSMAsteriskEvent(ev, "127.0.0.1") + smaEv = NewSMAsteriskEvent(ev, "127.0.0.1", "") if smaEv.Timestamp() != "" { t.Error("Received:", smaEv.Timestamp()) } @@ -167,7 +167,7 @@ func TestSMAEventChannelState(t *testing.T) { if err := json.Unmarshal([]byte(channelStateChange), &ev); err != nil { t.Error(err) } - smaEv := NewSMAsteriskEvent(ev, "127.0.0.1") + smaEv := NewSMAsteriskEvent(ev, "127.0.0.1", "") if smaEv.ChannelState() != "Up" { t.Error("Received:", smaEv.ChannelState()) } @@ -175,7 +175,7 @@ func TestSMAEventChannelState(t *testing.T) { if err := json.Unmarshal([]byte("{}"), &ev); err != nil { t.Error(err) } - smaEv = NewSMAsteriskEvent(ev, "127.0.0.1") + smaEv = NewSMAsteriskEvent(ev, "127.0.0.1", "") if smaEv.ChannelState() != "" { t.Error("Received:", smaEv.ChannelState()) } @@ -186,7 +186,7 @@ func TestSMASetupTime(t *testing.T) { if err := json.Unmarshal([]byte(channelStateChange), &ev); err != nil { t.Error(err) } - smaEv := NewSMAsteriskEvent(ev, "127.0.0.1") + smaEv := NewSMAsteriskEvent(ev, "127.0.0.1", "") if smaEv.SetupTime() != "2016-09-12T13:53:48.918+0200" { t.Error("Received:", smaEv.SetupTime()) } @@ -194,7 +194,7 @@ func TestSMASetupTime(t *testing.T) { if err := json.Unmarshal([]byte("{}"), &ev); err != nil { t.Error(err) } - smaEv = NewSMAsteriskEvent(ev, "127.0.0.1") + smaEv = NewSMAsteriskEvent(ev, "127.0.0.1", "") if smaEv.SetupTime() != "" { t.Error("Received:", smaEv.SetupTime()) } @@ -205,12 +205,12 @@ func TestSMAEventRequestType(t *testing.T) { if err := json.Unmarshal([]byte(stasisStart), &ev); err != nil { t.Error(err) } - smaEv := NewSMAsteriskEvent(ev, "127.0.0.1") + smaEv := NewSMAsteriskEvent(ev, "127.0.0.1", "") if smaEv.RequestType() != "*prepaid" { t.Error("Received:", smaEv.RequestType()) } ev = make(map[string]interface{}) // Clear previous data - smaEv = NewSMAsteriskEvent(ev, "127.0.0.1") + smaEv = NewSMAsteriskEvent(ev, "127.0.0.1", "") if smaEv.RequestType() != "" { t.Error("Received:", smaEv.RequestType()) } @@ -221,12 +221,12 @@ func TestSMAEventTenant(t *testing.T) { if err := json.Unmarshal([]byte(stasisStart), &ev); err != nil { t.Error(err) } - smaEv := NewSMAsteriskEvent(ev, "127.0.0.1") + smaEv := NewSMAsteriskEvent(ev, "127.0.0.1", "") if smaEv.Tenant() != "" { t.Error("Received:", smaEv.Tenant()) } ev = map[string]interface{}{"args": []interface{}{"cgr_tenant=cgrates.org"}} // Clear previous data - smaEv = NewSMAsteriskEvent(ev, "127.0.0.1") + smaEv = NewSMAsteriskEvent(ev, "127.0.0.1", "") if smaEv.Tenant() != "cgrates.org" { t.Error("Received:", smaEv.Tenant()) } @@ -237,12 +237,12 @@ func TestSMAEventCategory(t *testing.T) { if err := json.Unmarshal([]byte(stasisStart), &ev); err != nil { t.Error(err) } - smaEv := NewSMAsteriskEvent(ev, "127.0.0.1") + smaEv := NewSMAsteriskEvent(ev, "127.0.0.1", "") if smaEv.Category() != "" { t.Error("Received:", smaEv.Category()) } ev = map[string]interface{}{"args": []interface{}{"cgr_category=premium_call"}} // Clear previous data - smaEv = NewSMAsteriskEvent(ev, "127.0.0.1") + smaEv = NewSMAsteriskEvent(ev, "127.0.0.1", "") if smaEv.Category() != "premium_call" { t.Error("Received:", smaEv.Category()) } @@ -253,12 +253,12 @@ func TestSMAEventSubject(t *testing.T) { if err := json.Unmarshal([]byte(stasisStart), &ev); err != nil { t.Error(err) } - smaEv := NewSMAsteriskEvent(ev, "127.0.0.1") + smaEv := NewSMAsteriskEvent(ev, "127.0.0.1", "") if smaEv.Subject() != "" { t.Error("Received:", smaEv.Subject()) } ev = map[string]interface{}{"args": []interface{}{"cgr_subject=dan"}} // Clear previous data - smaEv = NewSMAsteriskEvent(ev, "127.0.0.1") + smaEv = NewSMAsteriskEvent(ev, "127.0.0.1", "") if smaEv.Subject() != "dan" { t.Error("Received:", smaEv.Subject()) } @@ -269,12 +269,12 @@ func TestSMAEventPDD(t *testing.T) { if err := json.Unmarshal([]byte(stasisStart), &ev); err != nil { t.Error(err) } - smaEv := NewSMAsteriskEvent(ev, "127.0.0.1") + smaEv := NewSMAsteriskEvent(ev, "127.0.0.1", "") if smaEv.PDD() != "" { t.Error("Received:", smaEv.PDD()) } ev = map[string]interface{}{"args": []interface{}{"cgr_pdd=2.1"}} // Clear previous data - smaEv = NewSMAsteriskEvent(ev, "127.0.0.1") + smaEv = NewSMAsteriskEvent(ev, "127.0.0.1", "") if smaEv.PDD() != "2.1" { t.Error("Received:", smaEv.PDD()) } @@ -285,12 +285,12 @@ func TestSMAEventSupplier(t *testing.T) { if err := json.Unmarshal([]byte(stasisStart), &ev); err != nil { t.Error(err) } - smaEv := NewSMAsteriskEvent(ev, "127.0.0.1") + smaEv := NewSMAsteriskEvent(ev, "127.0.0.1", "") if smaEv.Supplier() != "supplier1" { t.Error("Received:", smaEv.Supplier()) } ev = map[string]interface{}{"args": []interface{}{"cgr_supplier=supplier1"}} // Clear previous data - smaEv = NewSMAsteriskEvent(ev, "127.0.0.1") + smaEv = NewSMAsteriskEvent(ev, "127.0.0.1", "") if smaEv.Supplier() != "supplier1" { t.Error("Received:", smaEv.Supplier()) } @@ -301,12 +301,12 @@ func TestSMAEventDisconnectCause(t *testing.T) { if err := json.Unmarshal([]byte(stasisStart), &ev); err != nil { t.Error(err) } - smaEv := NewSMAsteriskEvent(ev, "127.0.0.1") + smaEv := NewSMAsteriskEvent(ev, "127.0.0.1", "") if smaEv.DisconnectCause() != "" { t.Error("Received:", smaEv.DisconnectCause()) } ev = map[string]interface{}{"args": []interface{}{"cgr_disconnectcause=NORMAL_DISCONNECT"}} // Clear previous data - smaEv = NewSMAsteriskEvent(ev, "127.0.0.1") + smaEv = NewSMAsteriskEvent(ev, "127.0.0.1", "") if smaEv.DisconnectCause() != "NORMAL_DISCONNECT" { t.Error("Received:", smaEv.DisconnectCause()) } @@ -321,7 +321,7 @@ func TestSMAEventExtraParameters(t *testing.T) { if err := json.Unmarshal([]byte(stasisStart), &ev); err != nil { t.Error(err) } - smaEv := NewSMAsteriskEvent(ev, "127.0.0.1") + smaEv := NewSMAsteriskEvent(ev, "127.0.0.1", "") if smaEv.PDD() != "" { t.Error("Received:", smaEv.PDD()) } @@ -336,7 +336,7 @@ func TestSMAEventV1AuthorizeArgs(t *testing.T) { if err := json.Unmarshal([]byte(stasisStart), &ev); err != nil { t.Error(err) } - smaEv := NewSMAsteriskEvent(ev, "127.0.0.1") + smaEv := NewSMAsteriskEvent(ev, "127.0.0.1", "") cgrEv, err := smaEv.AsCGREvent(timezone) if err != nil { t.Error(err) @@ -354,7 +354,7 @@ func TestSMAEventV1AuthorizeArgs(t *testing.T) { if err := json.Unmarshal([]byte(stasisStart2), &ev2); err != nil { t.Error(err) } - smaEv2 := NewSMAsteriskEvent(ev2, "127.0.0.1") + smaEv2 := NewSMAsteriskEvent(ev2, "127.0.0.1", "") smaEv2.parseStasisArgs() cgrEv2, err := smaEv2.AsCGREvent(timezone) if err != nil { @@ -399,7 +399,7 @@ func TestSMAEventV1InitSessionArgs(t *testing.T) { if err := json.Unmarshal([]byte(stasisStart), &ev); err != nil { t.Error(err) } - smaEv := NewSMAsteriskEvent(ev, "127.0.0.1") + smaEv := NewSMAsteriskEvent(ev, "127.0.0.1", "") if rcv := smaEv.V1InitSessionArgs(utils.CGREventWithArgDispatcher{CGREvent: cgrEv}); !reflect.DeepEqual(exp, rcv) { t.Errorf("Expecting: %+v, received: %+v", utils.ToJSON(exp), utils.ToJSON(rcv)) } @@ -432,7 +432,7 @@ func TestSMAEventV1TerminateSessionArgs(t *testing.T) { if err := json.Unmarshal([]byte(stasisStart), &ev); err != nil { t.Error(err) } - smaEv := NewSMAsteriskEvent(ev, "127.0.0.1") + smaEv := NewSMAsteriskEvent(ev, "127.0.0.1", "") if rcv := smaEv.V1TerminateSessionArgs(utils.CGREventWithArgDispatcher{CGREvent: cgrEv}); !reflect.DeepEqual(exp, rcv) { t.Errorf("Expecting: %+v, received: %+v", utils.ToJSON(exp), utils.ToJSON(rcv)) } diff --git a/agents/kamagent.go b/agents/kamagent.go index 66aa720a2..4aa3c568a 100644 --- a/agents/kamagent.go +++ b/agents/kamagent.go @@ -50,6 +50,7 @@ func NewKamailioAgent(kaCfg *config.KamAgentCfg, timezone: timezone, conns: make(map[string]*kamevapi.KamEvapi), activeSessionIDs: make(chan []*sessions.SessionID), + connAliases: make(map[string]string), } return } @@ -59,6 +60,7 @@ type KamailioAgent struct { sessionS rpcclient.RpcClientConnection timezone string conns map[string]*kamevapi.KamEvapi + connAliases map[string]string activeSessionIDs chan []*sessions.SessionID } @@ -74,6 +76,7 @@ func (self *KamailioAgent) Connect() error { errChan := make(chan error) for _, connCfg := range self.cfg.EvapiConns { connID := utils.GenUUID() + self.connAliases[connID] = connCfg.Alias logger := log.New(utils.Logger, "kamevapi:", 2) if self.conns[connID], err = kamevapi.NewKamEvapi(connCfg.Address, connID, connCfg.Reconnects, eventHandlers, logger); err != nil { return err @@ -124,11 +127,7 @@ func (ka *KamailioAgent) onCgrAuth(evData []byte, connID string) { utils.KamailioAgent, kev[utils.OriginID])) return } - originHost := ka.conns[connID].RemoteAddr().String() - if oHIf, has := authArgs.CGREvent.Event[utils.OriginHost]; has { - originHost = oHIf.(string) - } - authArgs.CGREvent.Event[utils.OriginHost] = originHost + authArgs.CGREvent.Event[utils.OriginHost] = utils.FirstNonEmpty(authArgs.CGREvent.Event[utils.OriginHost].(string), ka.connAliases[connID], ka.conns[connID].RemoteAddr().String()) authArgs.CGREvent.Event[EvapiConnID] = connID // Attach the connection ID var authReply sessions.V1AuthorizeReply err = ka.sessionS.Call(utils.SessionSv1AuthorizeEvent, authArgs, &authReply) @@ -164,11 +163,7 @@ func (ka *KamailioAgent) onCallStart(evData []byte, connID string) { return } initSessionArgs.CGREvent.Event[EvapiConnID] = connID // Attach the connection ID so we can properly disconnect later - originHost := ka.conns[connID].RemoteAddr().String() - if oHIf, has := initSessionArgs.CGREvent.Event[utils.OriginHost]; has { - originHost = oHIf.(string) - } - initSessionArgs.CGREvent.Event[utils.OriginHost] = originHost + var initReply sessions.V1InitSessionReply if err := ka.sessionS.Call(utils.SessionSv1InitiateSession, @@ -205,11 +200,7 @@ func (ka *KamailioAgent) onCallEnd(evData []byte, connID string) { return } var reply string - originHost := ka.conns[connID].RemoteAddr().String() - if oHIf, has := tsArgs.CGREvent.Event[utils.OriginHost]; has { - originHost = oHIf.(string) - } - tsArgs.CGREvent.Event[utils.OriginHost] = originHost + tsArgs.CGREvent.Event[EvapiConnID] = connID // Attach the connection ID in case we need to create a session and disconnect it if err := ka.sessionS.Call(utils.SessionSv1TerminateSession, tsArgs, &reply); err != nil { @@ -223,7 +214,7 @@ func (ka *KamailioAgent) onCallEnd(evData []byte, connID string) { if err != nil { return } - cgrEv.Event[utils.OriginHost] = originHost + cgrArgs := cgrEv.ConsumeArgs(strings.Index(kev[utils.CGRSubsystems], utils.MetaDispatchers) != -1, false) if err := ka.sessionS.Call(utils.SessionSv1ProcessCDR, &utils.CGREventWithArgDispatcher{CGREvent: cgrEv, ArgDispatcher: cgrArgs.ArgDispatcher}, &reply); err != nil { diff --git a/config/kamagentcfg.go b/config/kamagentcfg.go index f61aab558..9cf703370 100644 --- a/config/kamagentcfg.go +++ b/config/kamagentcfg.go @@ -20,6 +20,7 @@ package config // Represents one connection instance towards Kamailio type KamConnCfg struct { + Alias string Address string Reconnects int } @@ -31,6 +32,9 @@ func (self *KamConnCfg) loadFromJsonCfg(jsnCfg *KamConnJsonCfg) error { if jsnCfg.Address != nil { self.Address = *jsnCfg.Address } + if jsnCfg.Alias != nil { + self.Alias = *jsnCfg.Alias + } if jsnCfg.Reconnects != nil { self.Reconnects = *jsnCfg.Reconnects } diff --git a/config/libconfig_json.go b/config/libconfig_json.go index d8ad01f2a..ea0abd1aa 100755 --- a/config/libconfig_json.go +++ b/config/libconfig_json.go @@ -226,6 +226,7 @@ type RemoteHostJson struct { } type AstConnJsonCfg struct { + Alias *string Address *string User *string Password *string @@ -259,6 +260,7 @@ type KamAgentJsonCfg struct { // Represents one connection instance towards Kamailio type KamConnJsonCfg struct { + Alias *string Address *string Reconnects *int } diff --git a/config/smconfig.go b/config/smconfig.go index 86a304f3b..397bae717 100644 --- a/config/smconfig.go +++ b/config/smconfig.go @@ -410,6 +410,7 @@ func NewDefaultAsteriskConnCfg() *AsteriskConnCfg { } type AsteriskConnCfg struct { + Alias string Address string User string Password string @@ -424,6 +425,9 @@ func (aConnCfg *AsteriskConnCfg) loadFromJsonCfg(jsnCfg *AstConnJsonCfg) error { if jsnCfg.Address != nil { aConnCfg.Address = *jsnCfg.Address } + if jsnCfg.Alias != nil { + aConnCfg.Alias = *jsnCfg.Alias + } if jsnCfg.User != nil { aConnCfg.User = *jsnCfg.User }