Removed LowBalanceAnnFile config from AsteriskAgent

This commit is contained in:
Trial97
2020-10-16 13:45:16 +03:00
committed by Dan Christian Bogos
parent 1e6b5848e3
commit 1833c1e10d
7 changed files with 32 additions and 148 deletions

View File

@@ -57,11 +57,10 @@ const (
func NewAsteriskAgent(cgrCfg *config.CGRConfig, astConnIdx int,
connMgr *engine.ConnManager) (*AsteriskAgent, error) {
sma := &AsteriskAgent{
cgrCfg: cgrCfg,
astConnIdx: astConnIdx,
connMgr: connMgr,
eventsCache: make(map[string]*utils.CGREventWithOpts),
astTerminateEv: make(map[string]chan struct{}),
cgrCfg: cgrCfg,
astConnIdx: astConnIdx,
connMgr: connMgr,
eventsCache: make(map[string]*utils.CGREventWithOpts),
}
return sma, nil
}
@@ -76,9 +75,6 @@ type AsteriskAgent struct {
astErrChan chan error
eventsCache map[string]*utils.CGREventWithOpts // used to gather information about events during various phases
evCacheMux sync.RWMutex // Protect eventsCache
astTerminateEv map[string]chan struct{}
astTerminateEvMux sync.RWMutex
}
func (sma *AsteriskAgent) connectAsterisk() (err error) {
@@ -203,7 +199,8 @@ func (sma *AsteriskAgent) handleStasisStart(ev *SMAsteriskEvent) {
return
}
// Set absolute timeout for non-postpaid calls
if !sma.setMaxCallDuration(ev.ChannelID(), *authReply.MaxUsage) {
if !sma.setChannelVar(ev.ChannelID(), CGRMaxSessionTime,
strconv.Itoa(int(authReply.MaxUsage.Seconds()*1000))) {
return
}
}
@@ -284,14 +281,6 @@ func (sma *AsteriskAgent) handleChannelStateChange(ev *SMAsteriskEvent) {
// Channel disconnect
func (sma *AsteriskAgent) handleChannelDestroyed(ev *SMAsteriskEvent) {
chID := ev.ChannelID()
// astTerminateEv map[/string]chan struct{}
sma.astTerminateEvMux.Lock()
if end, has := sma.astTerminateEv[chID]; has {
delete(sma.astTerminateEv, chID)
close(end)
}
sma.astTerminateEvMux.Unlock()
sma.evCacheMux.RLock()
cgrEvDisp, hasIt := sma.eventsCache[chID]
sma.evCacheMux.RUnlock()
@@ -392,70 +381,5 @@ func (*AsteriskAgent) V1DisconnectPeer(args *utils.DPRArgs, reply *string) (err
// V1WarnDisconnect is used to implement the sessions.BiRPClient interface
func (sma *AsteriskAgent) V1WarnDisconnect(args map[string]interface{}, reply *string) (err error) {
channelID := engine.NewMapEvent(args).GetStringIgnoreErrors(utils.OriginID)
if err = sma.playFileOnChannel(channelID, sma.cgrCfg.AsteriskAgentCfg().LowBalanceAnnFile); err != nil {
utils.Logger.Warning(
fmt.Sprintf("<%s> failed play file <%s> on channel <%s> because: %s",
utils.AsteriskAgent, sma.cgrCfg.AsteriskAgentCfg().LowBalanceAnnFile,
channelID, err.Error()))
return
}
*reply = utils.OK
return
}
// hangupChannel will disconnect from CGRateS side with congestion reason
func (sma *AsteriskAgent) playFileOnChannel(channelID, file string) (err error) {
if file == utils.EmptyString {
return
}
_, err = sma.astConn.Call(aringo.HTTP_POST, fmt.Sprintf("http://%s/ari/channels/%s/play",
sma.cgrCfg.AsteriskAgentCfg().AsteriskConns[sma.astConnIdx].Address, channelID),
url.Values{"media": {file}})
return
}
// Sets the call timeout valid of starting of the call
func (sma *AsteriskAgent) setMaxCallDuration(channelID string, maxDur time.Duration) (success bool) {
if len(sma.cgrCfg.AsteriskAgentCfg().EmptyBalanceContext) == 0 &&
len(sma.cgrCfg.AsteriskAgentCfg().EmptyBalanceAnnFile) == 0 {
// Set absolute timeout for non-postpaid calls
return sma.setChannelVar(channelID, CGRMaxSessionTime,
strconv.Itoa(int(maxDur.Seconds()*1000)))
}
end := make(chan struct{})
sma.astTerminateEvMux.Lock()
sma.astTerminateEv[channelID] = end
sma.astTerminateEvMux.Unlock()
go func(channelID string, dur time.Duration, end chan struct{}) {
select {
case <-end:
case <-time.After(dur):
sma.doOnMaxCallDuration(channelID)
}
}(channelID, maxDur, end)
return true
}
func (sma *AsteriskAgent) doOnMaxCallDuration(channelID string) (err error) {
if len(sma.cgrCfg.AsteriskAgentCfg().EmptyBalanceContext) != 0 {
if _, err = sma.astConn.Call(aringo.HTTP_POST, fmt.Sprintf("http://%s/ari/channels/%s/continue",
sma.cgrCfg.AsteriskAgentCfg().AsteriskConns[sma.astConnIdx].Address, channelID),
url.Values{"context": {sma.cgrCfg.AsteriskAgentCfg().EmptyBalanceContext}}); err != nil {
utils.Logger.Err(
fmt.Sprintf("<%s> Could not transfer the call to empty balance context, error: <%s>, channelID: %v",
utils.AsteriskAgent, err.Error(), channelID))
}
return
}
if len(sma.cgrCfg.AsteriskAgentCfg().EmptyBalanceAnnFile) != 0 {
if err = sma.playFileOnChannel(channelID, sma.cgrCfg.AsteriskAgentCfg().EmptyBalanceAnnFile); err != nil {
utils.Logger.Warning(
fmt.Sprintf("<%s> failed play file <%s> on channel <%s> because: %s",
utils.AsteriskAgent, sma.cgrCfg.AsteriskAgentCfg().EmptyBalanceAnnFile,
channelID, err.Error()))
}
return
}
return
return utils.ErrNotImplemented
}

View File

@@ -468,9 +468,6 @@ const CGRATES_CFG_JSON = `
"enabled": false, // starts the Asterisk agent: <true|false>
"sessions_conns": ["*internal"],
"create_cdr": false, // create CDR out of events and sends it to CDRS component
"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 transferred 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)
"asterisk_conns":[ // instantiate connections to multiple Asterisk servers
{"address": "127.0.0.1:8088", "user": "cgrates", "password": "CGRateS.org", "connect_attempts": 3,"reconnects": 5}
],

View File

@@ -729,12 +729,9 @@ func TestKamAgentJsonCfg(t *testing.T) {
func TestAsteriskAgentJsonCfg(t *testing.T) {
eCfg := &AsteriskAgentJsonCfg{
Enabled: utils.BoolPointer(false),
Sessions_conns: &[]string{utils.MetaInternal},
Create_cdr: utils.BoolPointer(false),
Empty_balance_ann_file: utils.StringPointer(""),
Empty_balance_context: utils.StringPointer(""),
Low_balance_ann_file: utils.StringPointer(""),
Enabled: utils.BoolPointer(false),
Sessions_conns: &[]string{utils.MetaInternal},
Create_cdr: utils.BoolPointer(false),
Asterisk_conns: &[]*AstConnJsonCfg{
{
Address: utils.StringPointer("127.0.0.1:8088"),

View File

@@ -286,13 +286,10 @@ type AstConnJsonCfg struct {
}
type AsteriskAgentJsonCfg struct {
Enabled *bool
Sessions_conns *[]string
Create_cdr *bool
Low_balance_ann_file *string
Empty_balance_context *string
Empty_balance_ann_file *string
Asterisk_conns *[]*AstConnJsonCfg
Enabled *bool
Sessions_conns *[]string
Create_cdr *bool
Asterisk_conns *[]*AstConnJsonCfg
}
type CacheParamJsonCfg struct {

View File

@@ -636,13 +636,10 @@ func (aConnCfg *AsteriskConnCfg) AsMapInterface() map[string]interface{} {
}
type AsteriskAgentCfg struct {
Enabled bool
SessionSConns []string
CreateCDR bool
LowBalanceAnnFile string
EmptyBalanceContext string
EmptyBalanceAnnFile string
AsteriskConns []*AsteriskConnCfg
Enabled bool
SessionSConns []string
CreateCDR bool
AsteriskConns []*AsteriskConnCfg
}
func (aCfg *AsteriskAgentCfg) loadFromJsonCfg(jsnCfg *AsteriskAgentJsonCfg) (err error) {
@@ -666,16 +663,6 @@ func (aCfg *AsteriskAgentCfg) loadFromJsonCfg(jsnCfg *AsteriskAgentJsonCfg) (err
if jsnCfg.Create_cdr != nil {
aCfg.CreateCDR = *jsnCfg.Create_cdr
}
if jsnCfg.Low_balance_ann_file != nil {
aCfg.LowBalanceAnnFile = *jsnCfg.Low_balance_ann_file
}
if jsnCfg.Empty_balance_context != nil {
aCfg.EmptyBalanceContext = *jsnCfg.Empty_balance_context
}
if jsnCfg.Empty_balance_ann_file != nil {
aCfg.EmptyBalanceAnnFile = *jsnCfg.Empty_balance_ann_file
}
if jsnCfg.Asterisk_conns != nil {
aCfg.AsteriskConns = make([]*AsteriskConnCfg, len(*jsnCfg.Asterisk_conns))
@@ -689,11 +676,8 @@ func (aCfg *AsteriskAgentCfg) loadFromJsonCfg(jsnCfg *AsteriskAgentJsonCfg) (err
func (aCfg *AsteriskAgentCfg) AsMapInterface() (initialMP map[string]interface{}) {
initialMP = map[string]interface{}{
utils.EnabledCfg: aCfg.Enabled,
utils.CreateCDRCfg: aCfg.CreateCDR,
utils.LowBalanceAnnFileCfg: aCfg.LowBalanceAnnFile,
utils.EmptyBalanceContext: aCfg.EmptyBalanceContext,
utils.EmptyBalanceAnnFileCfg: aCfg.EmptyBalanceAnnFile,
utils.EnabledCfg: aCfg.Enabled,
utils.CreateCDRCfg: aCfg.CreateCDR,
}
if aCfg.AsteriskConns != nil {
conns := make([]map[string]interface{}, len(aCfg.AsteriskConns))

View File

@@ -698,12 +698,9 @@ func TestRemoteHostloadFromJsonCfg(t *testing.T) {
func TestAsteriskAgentCfgloadFromJsonCfg(t *testing.T) {
cfgJSON := &AsteriskAgentJsonCfg{
Enabled: utils.BoolPointer(true),
Sessions_conns: &[]string{utils.MetaInternal},
Create_cdr: utils.BoolPointer(true),
Low_balance_ann_file: utils.StringPointer("randomFile"),
Empty_balance_context: utils.StringPointer("randomContext"),
Empty_balance_ann_file: utils.StringPointer("randomAnnFile"),
Enabled: utils.BoolPointer(true),
Sessions_conns: &[]string{utils.MetaInternal},
Create_cdr: utils.BoolPointer(true),
Asterisk_conns: &[]*AstConnJsonCfg{
{
Alias: utils.StringPointer("127.0.0.1:8448"),
@@ -716,12 +713,9 @@ func TestAsteriskAgentCfgloadFromJsonCfg(t *testing.T) {
},
}
expected := &AsteriskAgentCfg{
Enabled: true,
SessionSConns: []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaSessionS)},
CreateCDR: true,
LowBalanceAnnFile: "randomFile",
EmptyBalanceContext: "randomContext",
EmptyBalanceAnnFile: "randomAnnFile",
Enabled: true,
SessionSConns: []string{utils.ConcatenatedKey(utils.MetaInternal, utils.MetaSessionS)},
CreateCDR: true,
AsteriskConns: []*AsteriskConnCfg{{
Alias: "127.0.0.1:8448",
Address: "127.0.0.1:8088",
@@ -745,12 +739,9 @@ func TestAsteriskAgentCfgAsMapInterface(t *testing.T) {
"asterisk_agent": {},
}`
eMap := map[string]interface{}{
utils.EnabledCfg: false,
utils.SessionSConnsCfg: []string{"*internal"},
utils.CreateCdrCfg: false,
utils.LowBalanceAnnFileCfg: utils.EmptyString,
utils.EmptyBalanceContext: utils.EmptyString,
utils.EmptyBalanceAnnFileCfg: utils.EmptyString,
utils.EnabledCfg: false,
utils.SessionSConnsCfg: []string{"*internal"},
utils.CreateCdrCfg: false,
utils.AsteriskConnsCfg: []map[string]interface{}{
{utils.AliasCfg: "", utils.AddressCfg: "127.0.0.1:8088", utils.UserCf: "cgrates", utils.Password: "CGRateS.org", utils.ConnectAttemptsCfg: 3, utils.ReconnectsCfg: 5},
},
@@ -774,12 +765,9 @@ func TestAsteriskAgentCfgAsMapInterface1(t *testing.T) {
},
}`
eMap := map[string]interface{}{
utils.EnabledCfg: true,
utils.SessionSConnsCfg: []string{"*conn1", "*conn2"},
utils.CreateCdrCfg: true,
utils.LowBalanceAnnFileCfg: utils.EmptyString,
utils.EmptyBalanceContext: utils.EmptyString,
utils.EmptyBalanceAnnFileCfg: utils.EmptyString,
utils.EnabledCfg: true,
utils.SessionSConnsCfg: []string{"*conn1", "*conn2"},
utils.CreateCdrCfg: true,
utils.AsteriskConnsCfg: []map[string]interface{}{
{utils.AliasCfg: "", utils.AddressCfg: "127.0.0.1:8089", utils.UserCf: "cgrates", utils.Password: "CGRateS.org", utils.ConnectAttemptsCfg: 5, utils.ReconnectsCfg: 8},
},

View File

@@ -447,9 +447,6 @@
// "enabled": false, // starts the Asterisk agent: <true|false>
// "sessions_conns": ["*internal"],
// "create_cdr": false, // create CDR out of events and sends it to CDRS component
// "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 transferred 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)
// "asterisk_conns":[ // instantiate connections to multiple Asterisk servers
// {"address": "127.0.0.1:8088", "user": "cgrates", "password": "CGRateS.org", "connect_attempts": 3,"reconnects": 5}
// ],