mirror of
https://github.com/cgrates/cgrates.git
synced 2026-02-11 18:16:24 +05:00
SMAsterisk - configuration cleanup, processCDR option introduced
This commit is contained in:
@@ -337,10 +337,7 @@ const CGRATES_CFG_JSON = `
|
||||
"sm_generic_conns": [
|
||||
{"address": "*internal"} // connection towards SMG component for session management
|
||||
],
|
||||
"session_terminate_subscriber": {"address": "*internal"}, // handler for session_terminate events generated by SMG
|
||||
"debit_interval": "10s", // interval to perform debits on.
|
||||
"min_call_duration": "0s", // only authorize calls with allowed duration higher than this
|
||||
"max_call_duration": "3h", // maximum call duration a prepaid call can last
|
||||
"create_cdr": false, // create CDR out of events and sends it to CDRS component
|
||||
"asterisk_conns":[ // instantiate connections to multiple Asterisk servers
|
||||
{"address": "127.0.0.1:8088", "user": "cgrates", "password": "CGRateS.org", "connect_attempts": 3,"reconnects": 5}
|
||||
],
|
||||
|
||||
@@ -524,10 +524,7 @@ func TestSmAsteriskJsonCfg(t *testing.T) {
|
||||
&HaPoolJsonCfg{
|
||||
Address: utils.StringPointer(utils.MetaInternal),
|
||||
}},
|
||||
Session_terminate_subscriber: &HaPoolJsonCfg{Address: utils.StringPointer(utils.MetaInternal)},
|
||||
Debit_interval: utils.StringPointer("10s"),
|
||||
Min_call_duration: utils.StringPointer("0s"),
|
||||
Max_call_duration: utils.StringPointer("3h"),
|
||||
Create_cdr: utils.BoolPointer(false),
|
||||
Asterisk_conns: &[]*AstConnJsonCfg{
|
||||
&AstConnJsonCfg{
|
||||
Address: utils.StringPointer("127.0.0.1:8088"),
|
||||
|
||||
@@ -224,13 +224,10 @@ type AstConnJsonCfg struct {
|
||||
}
|
||||
|
||||
type SMAsteriskJsonCfg struct {
|
||||
Enabled *bool
|
||||
Sm_generic_conns *[]*HaPoolJsonCfg // Connections towards generic SM
|
||||
Session_terminate_subscriber *HaPoolJsonCfg
|
||||
Debit_interval *string
|
||||
Min_call_duration *string
|
||||
Max_call_duration *string
|
||||
Asterisk_conns *[]*AstConnJsonCfg
|
||||
Enabled *bool
|
||||
Sm_generic_conns *[]*HaPoolJsonCfg // Connections towards generic SMf
|
||||
Create_cdr *bool
|
||||
Asterisk_conns *[]*AstConnJsonCfg
|
||||
}
|
||||
|
||||
type CacheParamJsonCfg struct {
|
||||
|
||||
@@ -473,13 +473,10 @@ func (aConnCfg *AsteriskConnCfg) loadFromJsonCfg(jsnCfg *AstConnJsonCfg) error {
|
||||
}
|
||||
|
||||
type SMAsteriskCfg struct {
|
||||
Enabled bool
|
||||
SMGConns []*HaPoolConfig
|
||||
SessionTerminateSubscriber *HaPoolConfig
|
||||
DebitInterval time.Duration
|
||||
MinCallDuration time.Duration
|
||||
MaxCallDuration time.Duration
|
||||
AsteriskConns []*AsteriskConnCfg
|
||||
Enabled bool
|
||||
SMGConns []*HaPoolConfig
|
||||
CreateCDR bool
|
||||
AsteriskConns []*AsteriskConnCfg
|
||||
}
|
||||
|
||||
func (aCfg *SMAsteriskCfg) loadFromJsonCfg(jsnCfg *SMAsteriskJsonCfg) (err error) {
|
||||
@@ -493,24 +490,8 @@ func (aCfg *SMAsteriskCfg) loadFromJsonCfg(jsnCfg *SMAsteriskJsonCfg) (err error
|
||||
aCfg.SMGConns[idx].loadFromJsonCfg(jsnHaCfg)
|
||||
}
|
||||
}
|
||||
if jsnCfg.Session_terminate_subscriber != nil {
|
||||
aCfg.SessionTerminateSubscriber = NewDfltHaPoolConfig()
|
||||
aCfg.SessionTerminateSubscriber.loadFromJsonCfg(jsnCfg.Session_terminate_subscriber)
|
||||
}
|
||||
if jsnCfg.Debit_interval != nil {
|
||||
if aCfg.DebitInterval, err = utils.ParseDurationWithSecs(*jsnCfg.Debit_interval); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
if jsnCfg.Min_call_duration != nil {
|
||||
if aCfg.MinCallDuration, err = utils.ParseDurationWithSecs(*jsnCfg.Min_call_duration); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
if jsnCfg.Max_call_duration != nil {
|
||||
if aCfg.MaxCallDuration, err = utils.ParseDurationWithSecs(*jsnCfg.Max_call_duration); err != nil {
|
||||
return err
|
||||
}
|
||||
if jsnCfg.Create_cdr != nil {
|
||||
aCfg.CreateCDR = *jsnCfg.Create_cdr
|
||||
}
|
||||
if jsnCfg.Asterisk_conns != nil {
|
||||
aCfg.AsteriskConns = make([]*AsteriskConnCfg, len(*jsnCfg.Asterisk_conns))
|
||||
|
||||
@@ -125,24 +125,23 @@ func (sma *SMAsterisk) handleStasisStart(ev *SMAsteriskEvent) {
|
||||
}
|
||||
return
|
||||
}
|
||||
if maxUsage == -1 {
|
||||
maxUsage = 0 // So we can set it later as unlimited
|
||||
} else if maxUsage == 0 || maxUsage < sma.cgrCfg.SMAsteriskCfg().MinCallDuration.Seconds() {
|
||||
if maxUsage == 0 {
|
||||
if err := sma.hangupChannel(ev.ChannelID()); err != nil {
|
||||
utils.Logger.Err(fmt.Sprintf("<SMAsterisk> Error: %s when attempting to disconnect channelID: %s", err.Error(), ev.ChannelID()))
|
||||
}
|
||||
return
|
||||
}
|
||||
// Call allowed, set absolute timeout
|
||||
if _, err := sma.astConn.Call(aringo.HTTP_POST, fmt.Sprintf("http://%s/ari/channels/%s/variable?variable=%s", // Asterisk having issue with variable terminating empty so harcoding param in url
|
||||
sma.cgrCfg.SMAsteriskCfg().AsteriskConns[sma.astConnIdx].Address, ev.ChannelID(), CGRMaxSessionTime),
|
||||
url.Values{"value": {strconv.FormatFloat(maxUsage*1000, 'f', -1, 64)}}); err != nil { // Asterisk expects value in ms
|
||||
utils.Logger.Err(fmt.Sprintf("<SMAsterisk> Error: %s when setting %s for channelID: %s", err.Error(), CGRMaxSessionTime, ev.ChannelID()))
|
||||
// Since we got error, disconnect channel
|
||||
if err := sma.hangupChannel(ev.ChannelID()); err != nil {
|
||||
utils.Logger.Err(fmt.Sprintf("<SMAsterisk> Error: %s when attempting to disconnect channelID: %s", err.Error(), ev.ChannelID()))
|
||||
} else if maxUsage != -1 {
|
||||
// Set absolute timeout for non-postpaid calls
|
||||
if _, err := sma.astConn.Call(aringo.HTTP_POST, fmt.Sprintf("http://%s/ari/channels/%s/variable?variable=%s", // Asterisk having issue with variable terminating empty so harcoding param in url
|
||||
sma.cgrCfg.SMAsteriskCfg().AsteriskConns[sma.astConnIdx].Address, ev.ChannelID(), CGRMaxSessionTime),
|
||||
url.Values{"value": {strconv.FormatFloat(maxUsage*1000, 'f', -1, 64)}}); err != nil { // Asterisk expects value in ms
|
||||
utils.Logger.Err(fmt.Sprintf("<SMAsterisk> Error: %s when setting %s for channelID: %s", err.Error(), CGRMaxSessionTime, ev.ChannelID()))
|
||||
// Since we got error, disconnect channel
|
||||
if err := sma.hangupChannel(ev.ChannelID()); err != nil {
|
||||
utils.Logger.Err(fmt.Sprintf("<SMAsterisk> Error: %s when attempting to disconnect channelID: %s", err.Error(), ev.ChannelID()))
|
||||
}
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// Exit channel from stasis
|
||||
@@ -183,7 +182,7 @@ func (sma *SMAsterisk) handleChannelStateChange(ev *SMAsteriskEvent) {
|
||||
utils.Logger.Err(fmt.Sprintf("<SMAsterisk> Error: %s when attempting to disconnect channelID: %s", err.Error(), ev.ChannelID()))
|
||||
}
|
||||
return
|
||||
} else if maxUsage != -1 && (maxUsage == 0 || maxUsage < sma.cgrCfg.SMAsteriskCfg().MinCallDuration.Seconds()) {
|
||||
} else if maxUsage == 0 {
|
||||
if err := sma.hangupChannel(ev.ChannelID()); err != nil {
|
||||
utils.Logger.Err(fmt.Sprintf("<SMAsterisk> Error: %s when attempting to disconnect channelID: %s", err.Error(), ev.ChannelID()))
|
||||
}
|
||||
@@ -213,8 +212,10 @@ func (sma *SMAsterisk) handleChannelDestroyed(ev *SMAsteriskEvent) {
|
||||
if err := sma.smg.Call("SMGenericV1.TerminateSession", *smgEv, &reply); err != nil {
|
||||
utils.Logger.Err(fmt.Sprintf("<SMAsterisk> Error: %s when attempting to terminate session for channelID: %s", err.Error(), ev.ChannelID()))
|
||||
}
|
||||
if err := sma.smg.Call("SMGenericV1.ProcessCDR", *smgEv, &reply); err != nil {
|
||||
utils.Logger.Err(fmt.Sprintf("<SMAsterisk> Error: %s when attempting to process CDR for channelID: %s", err.Error(), ev.ChannelID()))
|
||||
if sma.cgrCfg.SMAsteriskCfg().CreateCDR {
|
||||
if err := sma.smg.Call("SMGenericV1.ProcessCDR", *smgEv, &reply); err != nil {
|
||||
utils.Logger.Err(fmt.Sprintf("<SMAsterisk> Error: %s when attempting to process CDR for channelID: %s", err.Error(), ev.ChannelID()))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user