<CDRC> CDR filters for fwv, fixes #135

This commit is contained in:
DanB
2015-07-30 16:46:37 +02:00
parent 44780f1fe3
commit ee62da445f
2 changed files with 35 additions and 4 deletions

View File

@@ -115,13 +115,12 @@ func (self *FwvRecordsProcessor) ProcessNextRecord() ([]*engine.StoredCdr, error
engine.Logger.Err(fmt.Sprintf("<Cdrc> Could not read complete line, have instead: %s", string(buf)))
return nil, io.EOF
}
record := string(buf)
for cfgKey := range self.cdrcCfgs {
filterBreak := false
// ToDo: Field filters
if filterBreak { // Stop importing cdrc fields profile due to non matching filter
if passes := self.recordPassesCfgFilter(record, cfgKey); !passes {
continue
}
if storedCdr, err := self.recordToStoredCdr(string(buf), cfgKey); err != nil {
if storedCdr, err := self.recordToStoredCdr(record, cfgKey); err != nil {
return nil, fmt.Errorf("Failed converting to StoredCdr, error: %s", err.Error())
} else {
recordCdrs = append(recordCdrs, storedCdr)
@@ -130,6 +129,24 @@ func (self *FwvRecordsProcessor) ProcessNextRecord() ([]*engine.StoredCdr, error
return recordCdrs, nil
}
func (self *FwvRecordsProcessor) recordPassesCfgFilter(record, configKey string) bool {
filterPasses := true
for _, rsrFilter := range self.cdrcCfgs[configKey].CdrFilter {
if rsrFilter == nil { // Nil filter does not need to match anything
continue
}
if cfgFieldIdx, _ := strconv.Atoi(rsrFilter.Id); len(record) <= cfgFieldIdx {
fmt.Errorf("Ignoring record: %v - cannot compile filter %+v", record, rsrFilter)
return false
} else if !rsrFilter.FilterPasses(record[cfgFieldIdx:]) {
fmt.Printf("Record content to test: %s\n", record[cfgFieldIdx:])
filterPasses = false
break
}
}
return filterPasses
}
// Converts a record (header or normal) to StoredCdr
func (self *FwvRecordsProcessor) recordToStoredCdr(record string, cfgKey string) (*engine.StoredCdr, error) {
var err error

View File

@@ -19,6 +19,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
package cdrc
import (
"github.com/cgrates/cgrates/config"
"github.com/cgrates/cgrates/utils"
"testing"
)
@@ -39,3 +41,15 @@ func TestFwvValue(t *testing.T) {
}
}
func TestFwvRecordPassesCfgFilter(t *testing.T) {
//record, configKey string) bool {
cgrConfig, _ := config.NewDefaultCGRConfig()
cdrcConfig := cgrConfig.CdrcProfiles["/var/log/cgrates/cdrc/in"][utils.META_DEFAULT] // We don't really care that is for .csv since all we want to test are the filters
cdrcConfig.CdrFilter = utils.ParseRSRFieldsMustCompile(`~52:s/^0(\d{9})/+49${1}/(+49123123120)`, utils.INFIELD_SEP)
fwvRp := &FwvRecordsProcessor{cdrcCfgs: cgrConfig.CdrcProfiles["/var/log/cgrates/cdrc/in"]}
cdrLine := "CDR0000010 0 20120708181506000123451234 0040123123120 004 000018009980010001ISDN ABC 10Buiten uw regio EHV 00000009190000000009"
if passesFilter := fwvRp.recordPassesCfgFilter(cdrLine, utils.META_DEFAULT); !passesFilter {
t.Error("Not passes filter")
}
}