Added ~*req prefix for freeswitch extra_fields

This commit is contained in:
Trial97
2021-03-19 08:31:48 +02:00
committed by Dan Christian Bogos
parent d4d602001c
commit 31b201f70d
3 changed files with 34 additions and 28 deletions

View File

@@ -287,20 +287,25 @@ func (fsev FSEvent) GetOriginHost() string {
func (fsev FSEvent) GetExtraFields() map[string]string {
extraFields := make(map[string]string)
const dynprefix string = utils.MetaDynReq + utils.NestingSep
for _, fldRule := range config.CgrConfig().FsAgentCfg().ExtraFields {
if parsed, err := fsev.ParseEventValue(fldRule,
if !strings.HasPrefix(fldRule.Rules, dynprefix) {
continue
}
attrName := fldRule.AttrName()[5:]
if parsed, err := fsev.ParseEventValue(attrName, fldRule,
config.CgrConfig().GeneralCfg().DefaultTimezone); err != nil {
utils.Logger.Warning(fmt.Sprintf("<%s> error: %s parsing event rule: %+v", utils.FreeSWITCHAgent, err.Error(), fldRule))
} else {
extraFields[fldRule.AttrName()] = parsed
extraFields[attrName] = parsed
}
}
return extraFields
}
// Used in derived charging and sittuations when we need to run regexp on fields
func (fsev FSEvent) ParseEventValue(rsrFld *config.RSRParser, timezone string) (parsed string, err error) {
switch rsrFld.AttrName() {
func (fsev FSEvent) ParseEventValue(attrName string, rsrFld *config.RSRParser, timezone string) (parsed string, err error) {
switch attrName {
case utils.ToR:
return rsrFld.ParseValue(utils.MetaVoice)
case utils.OriginID:
@@ -342,8 +347,8 @@ func (fsev FSEvent) ParseEventValue(rsrFld *config.RSRParser, timezone string) (
case utils.Cost:
return rsrFld.ParseValue(strconv.FormatFloat(-1, 'f', -1, 64)) // Recommended to use FormatCost
default:
if parsed, err = rsrFld.ParseValue(fsev[rsrFld.AttrName()]); err != nil {
parsed, err = rsrFld.ParseValue(fsev[FS_VARPREFIX+rsrFld.AttrName()])
if parsed, err = rsrFld.ParseValue(fsev[attrName]); err != nil {
parsed, err = rsrFld.ParseValue(fsev[FS_VARPREFIX+attrName])
}
return
}

View File

@@ -492,60 +492,60 @@ func TestParseEventValue(t *testing.T) {
cfg := config.NewDefaultCGRConfig()
config.SetCgrConfig(cfg)
ev := NewFSEvent(hangupEv)
if tor, _ := ev.ParseEventValue(config.NewRSRParserMustCompile(utils.DynamicDataPrefix+utils.ToR), ""); tor != utils.MetaVoice {
if tor, _ := ev.ParseEventValue(utils.ToR, config.NewRSRParserMustCompile(utils.MetaDynReq+utils.NestingSep+utils.ToR), ""); tor != utils.MetaVoice {
t.Errorf("Unexpected tor parsed %q", tor)
}
if accid, _ := ev.ParseEventValue(config.NewRSRParserMustCompile(utils.DynamicDataPrefix+utils.OriginID), ""); accid != "e3133bf7-dcde-4daf-9663-9a79ffcef5ad" {
if accid, _ := ev.ParseEventValue(utils.OriginID, config.NewRSRParserMustCompile(utils.MetaDynReq+utils.NestingSep+utils.OriginID), ""); accid != "e3133bf7-dcde-4daf-9663-9a79ffcef5ad" {
t.Error("Unexpected result parsed", accid)
}
if parsed, _ := ev.ParseEventValue(config.NewRSRParserMustCompile(utils.DynamicDataPrefix+utils.OriginHost), ""); parsed != "10.0.3.15" {
if parsed, _ := ev.ParseEventValue(utils.OriginHost, config.NewRSRParserMustCompile(utils.MetaDynReq+utils.NestingSep+utils.OriginHost), ""); parsed != "10.0.3.15" {
t.Error("Unexpected result parsed", parsed)
}
if parsed, _ := ev.ParseEventValue(config.NewRSRParserMustCompile(utils.DynamicDataPrefix+utils.Source), ""); parsed != "FS_EVENT" {
if parsed, _ := ev.ParseEventValue(utils.Source, config.NewRSRParserMustCompile(utils.MetaDynReq+utils.NestingSep+utils.Source), ""); parsed != "FS_EVENT" {
t.Error("Unexpected result parsed", parsed)
}
if parsed, _ := ev.ParseEventValue(config.NewRSRParserMustCompile(utils.DynamicDataPrefix+utils.RequestType), ""); parsed != utils.MetaPrepaid {
if parsed, _ := ev.ParseEventValue(utils.RequestType, config.NewRSRParserMustCompile(utils.MetaDynReq+utils.NestingSep+utils.RequestType), ""); parsed != utils.MetaPrepaid {
t.Error("Unexpected result parsed", parsed)
}
if parsed, _ := ev.ParseEventValue(config.NewRSRParserMustCompile(utils.DynamicDataPrefix+utils.Tenant), ""); parsed != "cgrates.org" {
if parsed, _ := ev.ParseEventValue(utils.Tenant, config.NewRSRParserMustCompile(utils.MetaDynReq+utils.NestingSep+utils.Tenant), ""); parsed != "cgrates.org" {
t.Error("Unexpected result parsed", parsed)
}
if parsed, _ := ev.ParseEventValue(config.NewRSRParserMustCompile(utils.DynamicDataPrefix+utils.Category), ""); parsed != "call" {
if parsed, _ := ev.ParseEventValue(utils.Category, config.NewRSRParserMustCompile(utils.MetaDynReq+utils.NestingSep+utils.Category), ""); parsed != "call" {
t.Error("Unexpected result parsed", parsed)
}
if parsed, _ := ev.ParseEventValue(config.NewRSRParserMustCompile(utils.DynamicDataPrefix+utils.AccountField), ""); parsed != "1001" {
if parsed, _ := ev.ParseEventValue(utils.AccountField, config.NewRSRParserMustCompile(utils.MetaDynReq+utils.NestingSep+utils.AccountField), ""); parsed != "1001" {
t.Error("Unexpected result parsed", parsed)
}
if parsed, _ := ev.ParseEventValue(config.NewRSRParserMustCompile(utils.DynamicDataPrefix+utils.Subject), ""); parsed != "1001" {
if parsed, _ := ev.ParseEventValue(utils.Subject, config.NewRSRParserMustCompile(utils.MetaDynReq+utils.NestingSep+utils.Subject), ""); parsed != "1001" {
t.Error("Unexpected result parsed", parsed)
}
if parsed, _ := ev.ParseEventValue(config.NewRSRParserMustCompile(utils.DynamicDataPrefix+utils.Destination), ""); parsed != "1003" {
if parsed, _ := ev.ParseEventValue(utils.Destination, config.NewRSRParserMustCompile(utils.MetaDynReq+utils.NestingSep+utils.Destination), ""); parsed != "1003" {
t.Error("Unexpected result parsed", parsed)
}
sTime, _ := utils.ParseTimeDetectLayout("1436280728471153"[:len("1436280728471153")-6], "") // We discard nanoseconds information so we can correlate csv
if parsed, _ := ev.ParseEventValue(config.NewRSRParserMustCompile(utils.DynamicDataPrefix+utils.SetupTime), ""); parsed != sTime.String() {
if parsed, _ := ev.ParseEventValue(utils.SetupTime, config.NewRSRParserMustCompile(utils.MetaDynReq+utils.NestingSep+utils.SetupTime), ""); parsed != sTime.String() {
t.Errorf("Expecting: %s, parsed: %s", sTime.String(), parsed)
}
aTime, _ := utils.ParseTimeDetectLayout("1436280728971147"[:len("1436280728971147")-6], "")
if parsed, _ := ev.ParseEventValue(config.NewRSRParserMustCompile(utils.DynamicDataPrefix+utils.AnswerTime), ""); parsed != aTime.String() {
if parsed, _ := ev.ParseEventValue(utils.AnswerTime, config.NewRSRParserMustCompile(utils.MetaDynReq+utils.NestingSep+utils.AnswerTime), ""); parsed != aTime.String() {
t.Errorf("Expecting: %s, parsed: %s", aTime.String(), parsed)
}
if parsed, _ := ev.ParseEventValue(config.NewRSRParserMustCompile(utils.DynamicDataPrefix+utils.Usage), ""); parsed != "66000000000" {
if parsed, _ := ev.ParseEventValue(utils.Usage, config.NewRSRParserMustCompile(utils.MetaDynReq+utils.NestingSep+utils.Usage), ""); parsed != "66000000000" {
t.Error("Unexpected result parsed", parsed)
}
if parsed, _ := ev.ParseEventValue(config.NewRSRParserMustCompile(utils.DynamicDataPrefix+utils.PDD), ""); parsed != "0.028" {
if parsed, _ := ev.ParseEventValue(utils.PDD, config.NewRSRParserMustCompile(utils.MetaDynReq+utils.NestingSep+utils.PDD), ""); parsed != "0.028" {
t.Error("Unexpected result parsed", parsed)
}
if parsed, _ := ev.ParseEventValue(config.NewRSRParserMustCompile(utils.DynamicDataPrefix+utils.Route), ""); parsed != "supplier1" {
if parsed, _ := ev.ParseEventValue(utils.Route, config.NewRSRParserMustCompile(utils.MetaDynReq+utils.NestingSep+utils.Route), ""); parsed != "supplier1" {
t.Error("Unexpected result parsed", parsed)
}
if parsed, _ := ev.ParseEventValue(config.NewRSRParserMustCompile(utils.DynamicDataPrefix+utils.RunID), ""); parsed != utils.MetaDefault {
if parsed, _ := ev.ParseEventValue(utils.RunID, config.NewRSRParserMustCompile(utils.MetaDynReq+utils.NestingSep+utils.RunID), ""); parsed != utils.MetaDefault {
t.Error("Unexpected result parsed", parsed)
}
if parsed, _ := ev.ParseEventValue(config.NewRSRParserMustCompile(utils.DynamicDataPrefix+utils.Cost), ""); parsed != "-1" {
if parsed, _ := ev.ParseEventValue(utils.Cost, config.NewRSRParserMustCompile(utils.MetaDynReq+utils.NestingSep+utils.Cost), ""); parsed != "-1" {
t.Error("Unexpected result parsed", parsed)
}
if parsed, _ := ev.ParseEventValue(config.NewRSRParserMustCompile(utils.DynamicDataPrefix+"Hangup-Cause"), ""); parsed != "NORMAL_CLEARING" {
if parsed, _ := ev.ParseEventValue("Hangup-Cause", config.NewRSRParserMustCompile(utils.MetaDynReq+utils.NestingSep+"Hangup-Cause"), ""); parsed != "NORMAL_CLEARING" {
t.Error("Unexpected result parsed", parsed)
}
}
@@ -609,9 +609,9 @@ func TestFsEvGetExtraFields(t *testing.T) {
var err error
err = nil
cfg.FsAgentCfg().ExtraFields, err = config.NewRSRParsersFromSlice([]string{
"~Channel-Read-Codec-Name",
"~Channel-Write-Codec-Name",
"~NonExistingHeader",
"~*req.Channel-Read-Codec-Name",
"~*req.Channel-Write-Codec-Name",
"~*req.NonExistingHeader",
})
if err != nil {
t.Error(err)

View File

@@ -152,7 +152,8 @@ cgrates (0.11.0~dev) UNRELEASED; urgency=medium
* [RouteS] Updated RouteSv1.GetRoutes API to return multiple profiles
* [Templates] Added support for Length Field in case of NMSlice
* [Templates] Added support for multiple indexes
* [AgentS] Added ~*req prefix for freeswitch extra_fields
-- DanB <danb@cgrates.org> Wed, 19 Feb 2020 13:25:52 +0200
cgrates (0.10.0) UNRELEASED; urgency=medium