From 31b201f70dec2b9665dece192d2670a8d039d19b Mon Sep 17 00:00:00 2001 From: Trial97 Date: Fri, 19 Mar 2021 08:31:48 +0200 Subject: [PATCH] Added ~*req prefix for freeswitch extra_fields --- agents/fsevent.go | 17 ++++++++++------ agents/fsevent_test.go | 42 +++++++++++++++++++-------------------- packages/debian/changelog | 3 ++- 3 files changed, 34 insertions(+), 28 deletions(-) diff --git a/agents/fsevent.go b/agents/fsevent.go index ac8e41e4e..02ad4ff3c 100644 --- a/agents/fsevent.go +++ b/agents/fsevent.go @@ -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 } diff --git a/agents/fsevent_test.go b/agents/fsevent_test.go index 2dae14a0e..dbc3aba6d 100644 --- a/agents/fsevent_test.go +++ b/agents/fsevent_test.go @@ -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) diff --git a/packages/debian/changelog b/packages/debian/changelog index b18fa5a57..f4756b26b 100644 --- a/packages/debian/changelog +++ b/packages/debian/changelog @@ -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 Wed, 19 Feb 2020 13:25:52 +0200 cgrates (0.10.0) UNRELEASED; urgency=medium