// Extracts the value specified by cfgHdr out of cdr func (cdre *CdrExporter) cdrFieldValue(cdr *utils.StoredCdr, fltrRl, rsrFld *utils.RSRField, layout string) (string, error) { if rsrFld == nil { return "", nil } if fltrPass, _ := cdr.PassesFieldFilter(fltrRl); !fltrPass { return "", fmt.Errorf("Field: %s not matching filter rule %v", fltrRl.Id, fltrRl) } if len(layout) == 0 { layout = time.RFC3339 } var cdrVal string switch rsrFld.Id { case COST_DETAILS: // Special case when we need to further extract cost_details out of logDb if cdrVal, err = cdre.getCdrCostDetails(cdr.CgrId, cdr.MediationRunId); err != nil { return "", err } case utils.COST: cdrVal = cdr.FormatCost(cdre.costShiftDigits, cdre.roundDecimals) case utils.USAGE: cdrVal = cdr.FormatUsage(layout) case utils.SETUP_TIME: cdrVal = cdr.SetupTime.Format(layout) case utils.ANSWER_TIME: // Format time based on layout cdrVal = cdr.AnswerTime.Format(layout) case utils.DESTINATION: cdrVal = cdr.FieldAsString(&utils.RSRField{Id: utils.DESTINATION}) if cdre.maskLen != -1 && cdre.maskedDestination(cdrVal) { cdrVal = MaskDestination(cdrVal, cdre.maskLen) } default: cdrVal = cdr.FieldAsString(rsrFld) } return rsrFld.ParseValue(cdrVal), nil }
func (self SMGenericEvent) ParseEventValue(rsrFld *utils.RSRField, timezone string) string { switch rsrFld.Id { case utils.CGRID: return rsrFld.ParseValue(self.GetCgrId(timezone)) case utils.TOR: return rsrFld.ParseValue(utils.VOICE) case utils.ACCID: return rsrFld.ParseValue(self.GetUUID()) case utils.CDRHOST: return rsrFld.ParseValue(self.GetOriginatorIP(utils.META_DEFAULT)) case utils.CDRSOURCE: return rsrFld.ParseValue(self.GetName()) case utils.REQTYPE: return rsrFld.ParseValue(self.GetReqType(utils.META_DEFAULT)) case utils.DIRECTION: return rsrFld.ParseValue(self.GetDirection(utils.META_DEFAULT)) case utils.TENANT: return rsrFld.ParseValue(self.GetTenant(utils.META_DEFAULT)) case utils.CATEGORY: return rsrFld.ParseValue(self.GetCategory(utils.META_DEFAULT)) case utils.ACCOUNT: return rsrFld.ParseValue(self.GetAccount(utils.META_DEFAULT)) case utils.SUBJECT: return rsrFld.ParseValue(self.GetSubject(utils.META_DEFAULT)) case utils.DESTINATION: return rsrFld.ParseValue(self.GetDestination(utils.META_DEFAULT)) case utils.SETUP_TIME: st, _ := self.GetSetupTime(utils.META_DEFAULT, timezone) return rsrFld.ParseValue(st.String()) case utils.ANSWER_TIME: at, _ := self.GetAnswerTime(utils.META_DEFAULT, timezone) return rsrFld.ParseValue(at.String()) case utils.USAGE: dur, _ := self.GetUsage(utils.META_DEFAULT) return rsrFld.ParseValue(strconv.FormatInt(dur.Nanoseconds(), 10)) case utils.PDD: pdd, _ := self.GetPdd(utils.META_DEFAULT) return rsrFld.ParseValue(strconv.FormatFloat(pdd.Seconds(), 'f', -1, 64)) case utils.SUPPLIER: return rsrFld.ParseValue(self.GetSupplier(utils.META_DEFAULT)) case utils.DISCONNECT_CAUSE: return rsrFld.ParseValue(self.GetDisconnectCause(utils.META_DEFAULT)) case utils.MEDI_RUNID: return rsrFld.ParseValue(utils.META_DEFAULT) case utils.COST: return rsrFld.ParseValue(strconv.FormatFloat(-1, 'f', -1, 64)) // Recommended to use FormatCost default: strVal, _ := utils.ConvertIfaceToString(self[rsrFld.Id]) val := rsrFld.ParseValue(strVal) return val } return "" }
// Useful for CDR generation func (kev KamEvent) ParseEventValue(rsrFld *utils.RSRField, timezone string) string { sTime, _ := kev.GetSetupTime(utils.META_DEFAULT, config.CgrConfig().DefaultTimezone) aTime, _ := kev.GetAnswerTime(utils.META_DEFAULT, config.CgrConfig().DefaultTimezone) duration, _ := kev.GetDuration(utils.META_DEFAULT) switch rsrFld.Id { case utils.CGRID: return rsrFld.ParseValue(kev.GetCgrId(timezone)) case utils.TOR: return rsrFld.ParseValue(utils.VOICE) case utils.ACCID: return rsrFld.ParseValue(kev.GetUUID()) case utils.CDRHOST: return rsrFld.ParseValue(kev.GetOriginatorIP(utils.META_DEFAULT)) case utils.CDRSOURCE: return rsrFld.ParseValue(kev.GetCdrSource()) case utils.REQTYPE: return rsrFld.ParseValue(kev.GetReqType(utils.META_DEFAULT)) case utils.DIRECTION: return rsrFld.ParseValue(kev.GetDirection(utils.META_DEFAULT)) case utils.TENANT: return rsrFld.ParseValue(kev.GetTenant(utils.META_DEFAULT)) case utils.CATEGORY: return rsrFld.ParseValue(kev.GetCategory(utils.META_DEFAULT)) case utils.ACCOUNT: return rsrFld.ParseValue(kev.GetAccount(utils.META_DEFAULT)) case utils.SUBJECT: return rsrFld.ParseValue(kev.GetSubject(utils.META_DEFAULT)) case utils.DESTINATION: return rsrFld.ParseValue(kev.GetDestination(utils.META_DEFAULT)) case utils.SETUP_TIME: return rsrFld.ParseValue(sTime.String()) case utils.ANSWER_TIME: return rsrFld.ParseValue(aTime.String()) case utils.USAGE: return rsrFld.ParseValue(strconv.FormatFloat(utils.Round(duration.Seconds(), 0, utils.ROUNDING_MIDDLE), 'f', -1, 64)) case utils.PDD: return rsrFld.ParseValue(strconv.FormatFloat(utils.Round(duration.Seconds(), 0, utils.ROUNDING_MIDDLE), 'f', -1, 64)) case utils.SUPPLIER: return rsrFld.ParseValue(kev.GetSupplier(utils.META_DEFAULT)) case utils.DISCONNECT_CAUSE: return rsrFld.ParseValue(kev.GetDisconnectCause(utils.META_DEFAULT)) case utils.MEDI_RUNID: return rsrFld.ParseValue(utils.META_DEFAULT) case utils.COST: return rsrFld.ParseValue("-1.0") default: return rsrFld.ParseValue(kev.GetExtraFields()[rsrFld.Id]) } }
// Used in derived charging and sittuations when we need to run regexp on fields func (fsev FSEvent) ParseEventValue(rsrFld *utils.RSRField, timezone string) string { switch rsrFld.Id { case utils.CGRID: return rsrFld.ParseValue(fsev.GetCgrId(timezone)) case utils.TOR: return rsrFld.ParseValue(utils.VOICE) case utils.ACCID: return rsrFld.ParseValue(fsev.GetUUID()) case utils.CDRHOST: return rsrFld.ParseValue(fsev["FreeSWITCH-IPv4"]) case utils.CDRSOURCE: return rsrFld.ParseValue("FS_EVENT") case utils.REQTYPE: return rsrFld.ParseValue(fsev.GetReqType("")) case utils.DIRECTION: return rsrFld.ParseValue(fsev.GetDirection("")) case utils.TENANT: return rsrFld.ParseValue(fsev.GetTenant("")) case utils.CATEGORY: return rsrFld.ParseValue(fsev.GetCategory("")) case utils.ACCOUNT: return rsrFld.ParseValue(fsev.GetAccount("")) case utils.SUBJECT: return rsrFld.ParseValue(fsev.GetSubject("")) case utils.DESTINATION: return rsrFld.ParseValue(fsev.GetDestination("")) case utils.SETUP_TIME: st, _ := fsev.GetSetupTime("", timezone) return rsrFld.ParseValue(st.String()) case utils.ANSWER_TIME: at, _ := fsev.GetAnswerTime("", timezone) return rsrFld.ParseValue(at.String()) case utils.USAGE: dur, _ := fsev.GetDuration("") return rsrFld.ParseValue(strconv.FormatInt(dur.Nanoseconds(), 10)) case utils.PDD: pdd, _ := fsev.GetPdd(utils.META_DEFAULT) return rsrFld.ParseValue(strconv.FormatFloat(pdd.Seconds(), 'f', -1, 64)) case utils.SUPPLIER: return rsrFld.ParseValue(fsev.GetSupplier("")) case utils.DISCONNECT_CAUSE: return rsrFld.ParseValue(fsev.GetDisconnectCause("")) case utils.MEDI_RUNID: return rsrFld.ParseValue(utils.DEFAULT_RUNID) case utils.COST: return rsrFld.ParseValue(strconv.FormatFloat(-1, 'f', -1, 64)) // Recommended to use FormatCost default: val := rsrFld.ParseValue(fsev[rsrFld.Id]) if val == "" { // Trying looking for variable_+ Id also if the first one not found val = rsrFld.ParseValue(fsev[FS_VARPREFIX+rsrFld.Id]) } return val } }
// Used to retrieve fields as string, primary fields are const labeled func (cdr *CDR) FieldAsString(rsrFld *utils.RSRField) string { if rsrFld.IsStatic() { // Static values do not care about headers return rsrFld.ParseValue("") } switch rsrFld.Id { case utils.CGRID: return rsrFld.ParseValue(cdr.CGRID) case utils.ORDERID: return rsrFld.ParseValue(strconv.FormatInt(cdr.OrderID, 10)) case utils.TOR: return rsrFld.ParseValue(cdr.ToR) case utils.ACCID: return rsrFld.ParseValue(cdr.OriginID) case utils.CDRHOST: return rsrFld.ParseValue(cdr.OriginHost) case utils.CDRSOURCE: return rsrFld.ParseValue(cdr.Source) case utils.REQTYPE: return rsrFld.ParseValue(cdr.RequestType) case utils.DIRECTION: return rsrFld.ParseValue(cdr.Direction) case utils.TENANT: return rsrFld.ParseValue(cdr.Tenant) case utils.CATEGORY: return rsrFld.ParseValue(cdr.Category) case utils.ACCOUNT: return rsrFld.ParseValue(cdr.Account) case utils.SUBJECT: return rsrFld.ParseValue(cdr.Subject) case utils.DESTINATION: return rsrFld.ParseValue(cdr.Destination) case utils.SETUP_TIME: return rsrFld.ParseValue(cdr.SetupTime.Format(time.RFC3339)) case utils.PDD: return strconv.FormatFloat(cdr.PDD.Seconds(), 'f', -1, 64) case utils.ANSWER_TIME: return rsrFld.ParseValue(cdr.AnswerTime.Format(time.RFC3339)) case utils.USAGE: return strconv.FormatFloat(cdr.Usage.Seconds(), 'f', -1, 64) case utils.SUPPLIER: return rsrFld.ParseValue(cdr.Supplier) case utils.DISCONNECT_CAUSE: return rsrFld.ParseValue(cdr.DisconnectCause) case utils.MEDI_RUNID: return rsrFld.ParseValue(cdr.RunID) case utils.RATED_FLD: return rsrFld.ParseValue(strconv.FormatBool(cdr.Rated)) case utils.COST: return rsrFld.ParseValue(strconv.FormatFloat(cdr.Cost, 'f', -1, 64)) // Recommended to use FormatCost case utils.COST_DETAILS: return rsrFld.ParseValue(cdr.CostDetailsJson()) case utils.PartialField: return rsrFld.ParseValue(strconv.FormatBool(cdr.Partial)) default: return rsrFld.ParseValue(cdr.ExtraFields[rsrFld.Id]) } }
// Used to retrieve fields as string, primary fields are const labeled func (storedCdr *StoredCdr) FieldAsString(rsrFld *utils.RSRField) string { switch rsrFld.Id { case utils.CGRID: return rsrFld.ParseValue(storedCdr.CgrId) case utils.ORDERID: return rsrFld.ParseValue(strconv.FormatInt(storedCdr.OrderId, 10)) case utils.TOR: return rsrFld.ParseValue(storedCdr.TOR) case utils.ACCID: return rsrFld.ParseValue(storedCdr.AccId) case utils.CDRHOST: return rsrFld.ParseValue(storedCdr.CdrHost) case utils.CDRSOURCE: return rsrFld.ParseValue(storedCdr.CdrSource) case utils.REQTYPE: return rsrFld.ParseValue(storedCdr.ReqType) case utils.DIRECTION: return rsrFld.ParseValue(storedCdr.Direction) case utils.TENANT: return rsrFld.ParseValue(storedCdr.Tenant) case utils.CATEGORY: return rsrFld.ParseValue(storedCdr.Category) case utils.ACCOUNT: return rsrFld.ParseValue(storedCdr.Account) case utils.SUBJECT: return rsrFld.ParseValue(storedCdr.Subject) case utils.DESTINATION: return rsrFld.ParseValue(storedCdr.Destination) case utils.SETUP_TIME: return rsrFld.ParseValue(storedCdr.SetupTime.Format(time.RFC3339)) case utils.PDD: return strconv.FormatFloat(storedCdr.Pdd.Seconds(), 'f', -1, 64) case utils.ANSWER_TIME: return rsrFld.ParseValue(storedCdr.AnswerTime.Format(time.RFC3339)) case utils.USAGE: return strconv.FormatFloat(storedCdr.Usage.Seconds(), 'f', -1, 64) case utils.SUPPLIER: return rsrFld.ParseValue(storedCdr.Supplier) case utils.DISCONNECT_CAUSE: return rsrFld.ParseValue(storedCdr.DisconnectCause) case utils.MEDI_RUNID: return rsrFld.ParseValue(storedCdr.MediationRunId) case utils.RATED_ACCOUNT: return rsrFld.ParseValue(storedCdr.RatedAccount) case utils.RATED_SUBJECT: return rsrFld.ParseValue(storedCdr.RatedSubject) case utils.COST: return rsrFld.ParseValue(strconv.FormatFloat(storedCdr.Cost, 'f', -1, 64)) // Recommended to use FormatCost case utils.COST_DETAILS: return rsrFld.ParseValue(storedCdr.CostDetailsJson()) default: return rsrFld.ParseValue(storedCdr.ExtraFields[rsrFld.Id]) } }
// Used in derived charging and sittuations when we need to run regexp on fields func (fsev FSEvent) ParseEventValue(rsrFld *utils.RSRField) string { switch rsrFld.Id { case utils.CGRID: return rsrFld.ParseValue(fsev.GetCgrId()) case utils.TOR: return rsrFld.ParseValue(utils.VOICE) case utils.ACCID: return rsrFld.ParseValue(fsev.GetUUID()) case utils.CDRHOST: return rsrFld.ParseValue(fsev["FreeSWITCH-IPv4"]) case utils.CDRSOURCE: return rsrFld.ParseValue("FS_EVENT") case utils.REQTYPE: return rsrFld.ParseValue(fsev.GetReqType("")) case utils.DIRECTION: return rsrFld.ParseValue(fsev.GetDirection("")) case utils.TENANT: return rsrFld.ParseValue(fsev.GetTenant("")) case utils.CATEGORY: return rsrFld.ParseValue(fsev.GetCategory("")) case utils.ACCOUNT: return rsrFld.ParseValue(fsev.GetAccount("")) case utils.SUBJECT: return rsrFld.ParseValue(fsev.GetSubject("")) case utils.DESTINATION: return rsrFld.ParseValue(fsev.GetDestination("")) case utils.SETUP_TIME: st, _ := fsev.GetSetupTime("") return rsrFld.ParseValue(st.String()) case utils.ANSWER_TIME: at, _ := fsev.GetAnswerTime("") return rsrFld.ParseValue(at.String()) case utils.USAGE: dur, _ := fsev.GetDuration("") return rsrFld.ParseValue(strconv.FormatInt(dur.Nanoseconds(), 10)) case utils.MEDI_RUNID: return rsrFld.ParseValue(utils.DEFAULT_RUNID) case utils.COST: return rsrFld.ParseValue(strconv.FormatFloat(-1, 'f', -1, 64)) // Recommended to use FormatCost default: return rsrFld.ParseValue(fsev[rsrFld.Id]) } }