Add protection in case of disconnect from terminateSession fixes #1531

This commit is contained in:
TeoV
2019-05-06 12:46:17 +03:00
committed by Dan Christian Bogos
parent cfad8290ae
commit c8db8f2798
5 changed files with 37 additions and 5 deletions

View File

@@ -42,7 +42,7 @@ var (
var sTestsDNS = []func(t *testing.T){
testDNSitResetDB,
//testDNSitStartEngine,
testDNSitStartEngine,
testDNSitApierRpcConn,
testDNSitTPFromFolder,
testDNSitClntConn,

View File

@@ -150,6 +150,7 @@ func (sm *FSsessions) onChannelPark(fsev FSEvent, connId string) {
}
fsev[VarCGROriginHost] = sm.conns[connId].cfg.Alias
authArgs := fsev.V1AuthorizeArgs()
authArgs.CGREvent.Event[FsConnID] = connId // Attach the connection ID
var authReply sessions.V1AuthorizeReply
if err := sm.sS.Call(utils.SessionSv1AuthorizeEvent, authArgs, &authReply); err != nil {
utils.Logger.Err(
@@ -254,8 +255,10 @@ func (sm *FSsessions) onChannelHangupComplete(fsev FSEvent, connId string) {
var reply string
fsev[VarCGROriginHost] = sm.conns[connId].cfg.Alias
if fsev[VarAnswerEpoch] != "0" { // call was answered
terminateSessionArgs := fsev.V1TerminateSessionArgs()
terminateSessionArgs.CGREvent.Event[FsConnID] = connId // Attach the connection ID in case we need to create a session and disconnect it
if err := sm.sS.Call(utils.SessionSv1TerminateSession,
fsev.V1TerminateSessionArgs(), &reply); err != nil {
terminateSessionArgs, &reply); err != nil {
utils.Logger.Err(
fmt.Sprintf("<%s> Could not terminate session with event %s, error: %s",
utils.FreeSWITCHAgent, fsev.GetUUID(), err.Error()))
@@ -374,11 +377,18 @@ func (sm *FSsessions) Call(serviceMethod string, args interface{}, reply interfa
return utils.RPCCall(sm, serviceMethod, args, reply)
}
// Internal method to disconnect session in asterisk
// Internal method to disconnect session in FreeSWITCH
func (fsa *FSsessions) V1DisconnectSession(args utils.AttrDisconnectSession, reply *string) (err error) {
ev := engine.NewMapEvent(args.EventStart)
channelID := ev.GetStringIgnoreErrors(utils.OriginID)
if err = fsa.disconnectSession(ev.GetStringIgnoreErrors(FsConnID), channelID,
connID, err := ev.GetString(FsConnID)
if err != nil {
utils.Logger.Err(
fmt.Sprintf("<%s> error: <%s:%s> when attempting to disconnect channelID: <%s>",
utils.FreeSWITCHAgent, err.Error(), FsConnID, channelID))
return
}
if err = fsa.disconnectSession(connID, channelID,
utils.FirstNonEmpty(ev.GetStringIgnoreErrors(CALL_DEST_NR), ev.GetStringIgnoreErrors(SIP_REQ_USER)),
utils.ErrInsufficientCredit.Error()); err != nil {
return

View File

@@ -118,6 +118,7 @@ func (ka *KamailioAgent) onCgrAuth(evData []byte, connID string) {
return
}
authArgs.CGREvent.Event[utils.OriginHost] = 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)
if kar, err := kev.AsKamAuthReply(authArgs, &authReply, err); err != nil {
@@ -190,6 +191,7 @@ func (ka *KamailioAgent) onCallEnd(evData []byte, connID string) {
}
var reply string
tsArgs.CGREvent.Event[utils.OriginHost] = ka.conns[connID].RemoteAddr().String()
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 {
utils.Logger.Err(
@@ -251,7 +253,15 @@ func (ka *KamailioAgent) V1DisconnectSession(args utils.AttrDisconnectSession, r
if err != nil {
return err
}
connID, err := utils.IfaceAsString(args.EventStart[EvapiConnID])
connIDIface, has := args.EventStart[EvapiConnID]
if !has {
utils.Logger.Err(
fmt.Sprintf("<%s> error: <%s:%s> when attempting to disconnect <%s:%s> and <%s:%s>",
utils.KamailioAgent, utils.ErrNotFound.Error(), EvapiConnID,
KamHashEntry, hEntry, KamHashID, hID))
return
}
connID, err := utils.IfaceAsString(connIDIface)
if err != nil {
return err
}

View File

@@ -42,6 +42,9 @@
"stats_conns": [
{"address": "127.0.0.1:2012", "transport": "*json"},
],
"chargers_conns": [
{"address": "*internal"}
],
"sessions_cost_retries": 5,
},
@@ -77,6 +80,9 @@
"thresholds_conns": [
{"address": "127.0.0.1:2012", "transport": "*json"},
],
"chargers_conns": [
{"address": "*internal"}
],
"store_session_costs": true,
"debit_interval": "5s",
"channel_sync_interval":"7s",

View File

@@ -41,6 +41,9 @@
"stats_conns": [
{"address": "*internal"}
],
"chargers_conns": [
{"address": "*internal"}
],
"sessions_cost_retries": 5,
},
@@ -77,6 +80,9 @@
"thresholds_conns": [
{"address": "*internal"}
],
"chargers_conns": [
{"address": "*internal"}
],
"store_session_costs": true,
"debit_interval": "10s",
"channel_sync_interval":"7s",