mirror of
https://github.com/cgrates/cgrates.git
synced 2026-02-21 23:28:44 +05:00
Removed LowBalanceAnnFile config from AsteriskAgent
This commit is contained in:
committed by
Dan Christian Bogos
parent
1e6b5848e3
commit
1833c1e10d
@@ -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
|
||||
}
|
||||
|
||||
@@ -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}
|
||||
],
|
||||
|
||||
@@ -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"),
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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},
|
||||
},
|
||||
|
||||
@@ -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}
|
||||
// ],
|
||||
|
||||
Reference in New Issue
Block a user