Added *ipnet filter

This commit is contained in:
Trial97
2020-08-11 13:06:12 +03:00
committed by Dan Christian Bogos
parent 29466d8770
commit 064e271b5e
4 changed files with 113 additions and 6 deletions

View File

@@ -218,19 +218,21 @@ func (fltr *Filter) Compile() (err error) {
return
}
var supportedFiltersType utils.StringSet = utils.NewStringSet([]string{utils.MetaString, utils.MetaPrefix, utils.MetaSuffix,
var supportedFiltersType utils.StringSet = utils.NewStringSet([]string{
utils.MetaString, utils.MetaPrefix, utils.MetaSuffix,
utils.MetaTimings, utils.MetaRSR, utils.MetaDestinations,
utils.MetaEmpty, utils.MetaExists, utils.MetaLessThan, utils.MetaLessOrEqual,
utils.MetaGreaterThan, utils.MetaGreaterOrEqual, utils.MetaEqual,
utils.MetaNotEqual})
var needsFieldName utils.StringSet = utils.NewStringSet([]string{utils.MetaString, utils.MetaPrefix,
utils.MetaSuffix, utils.MetaTimings, utils.MetaRSR, utils.MetaDestinations, utils.MetaLessThan,
utils.MetaNotEqual, utils.MetaIPNet})
var needsFieldName utils.StringSet = utils.NewStringSet([]string{
utils.MetaString, utils.MetaPrefix, utils.MetaSuffix,
utils.MetaTimings, utils.MetaRSR, utils.MetaDestinations, utils.MetaLessThan,
utils.MetaEmpty, utils.MetaExists, utils.MetaLessOrEqual, utils.MetaGreaterThan,
utils.MetaGreaterOrEqual, utils.MetaEqual, utils.MetaNotEqual})
utils.MetaGreaterOrEqual, utils.MetaEqual, utils.MetaNotEqual, utils.MetaIPNet})
var needsValues utils.StringSet = utils.NewStringSet([]string{utils.MetaString, utils.MetaPrefix,
utils.MetaSuffix, utils.MetaTimings, utils.MetaRSR, utils.MetaDestinations,
utils.MetaLessThan, utils.MetaLessOrEqual, utils.MetaGreaterThan, utils.MetaGreaterOrEqual,
utils.MetaEqual, utils.MetaNotEqual})
utils.MetaEqual, utils.MetaNotEqual, utils.MetaIPNet})
// NewFilterRule returns a new filter
func NewFilterRule(rfType, fieldName string, vals []string) (*FilterRule, error) {
@@ -331,6 +333,8 @@ func (fltr *FilterRule) Pass(dDP utils.DataProvider) (result bool, err error) {
result, err = fltr.passGreaterThan(dDP)
case utils.MetaEqual, utils.MetaNotEqual:
result, err = fltr.passEqualTo(dDP)
case utils.MetaIPNet, utils.MetaNotIPNet:
result, err = fltr.passIPNet(dDP)
default:
err = utils.ErrPrefixNotErrNotImplemented(fltr.Type)
}
@@ -567,6 +571,30 @@ func (fltr *FilterRule) passEqualTo(dDP utils.DataProvider) (bool, error) {
return false, nil
}
func (fltr *FilterRule) passIPNet(dDP utils.DataProvider) (bool, error) {
strVal, err := fltr.rsrElement.ParseDataProvider(dDP)
if err != nil {
if err == utils.ErrNotFound {
return false, nil
}
return false, err
}
_, ip, err := net.ParseCIDR(strVal)
if err != nil {
return false, err
}
for _, val := range fltr.rsrValues {
sval, err := val.ParseDataProvider(dDP)
if err != nil {
continue
}
if ip.Contains(net.ParseIP(sval)) {
return true, nil
}
}
return false, nil
}
func newDynamicDP(cfg *config.CGRConfig, connMgr *ConnManager,
tenant string, initialDP utils.DataProvider) *dynamicDP {
return &dynamicDP{

View File

@@ -1368,3 +1368,79 @@ func TestVerifyInlineFilterS(t *testing.T) {
t.Errorf("Expected error received nil")
}
}
func TestFilterPassIPNet(t *testing.T) {
cd := utils.MapStorage{
"IP": "192.0.2.1/24",
"WrongIP": "192.0.2.1",
}
rf := &FilterRule{Type: utils.MetaIPNet,
Element: "~IP", Values: []string{"192.0.2.0"}}
if err := rf.CompileValues(); err != nil {
t.Fatal(err)
}
if passes, err := rf.passIPNet(cd); err != nil {
t.Error(err)
} else if !passes {
t.Error("Not passes filter")
}
rf = &FilterRule{Type: utils.MetaIPNet,
Element: "~IP", Values: []string{"~IP2", "192.0.3.0"}}
if err := rf.CompileValues(); err != nil {
t.Fatal(err)
}
if passes, err := rf.passIPNet(cd); err != nil {
t.Error(err)
} else if passes {
t.Error("Filter passes")
}
//not
rf = &FilterRule{Type: utils.MetaNotIPNet,
Element: "~IP", Values: []string{"192.0.2.0"}}
if err := rf.CompileValues(); err != nil {
t.Fatal(err)
}
if passes, err := rf.Pass(cd); err != nil {
t.Error(err)
} else if passes {
t.Error("Filter passes")
}
rf = &FilterRule{Type: utils.MetaNotIPNet,
Element: "~IP", Values: []string{"192.0.3.0"}}
if err := rf.CompileValues(); err != nil {
t.Fatal(err)
}
if passes, err := rf.Pass(cd); err != nil {
t.Error(err)
} else if !passes {
t.Error("Not passes filter")
}
rf = &FilterRule{Type: utils.MetaIPNet,
Element: "~IP2", Values: []string{"192.0.2.0"}}
if err := rf.CompileValues(); err != nil {
t.Fatal(err)
}
if passes, err := rf.passIPNet(cd); err != nil {
t.Error(err)
} else if passes {
t.Error("Filter passes")
}
rf = &FilterRule{Type: utils.MetaIPNet,
Element: "~WrongIP", Values: []string{"192.0.2.0"}}
if err := rf.CompileValues(); err != nil {
t.Fatal(err)
}
if _, err := rf.passIPNet(cd); err == nil {
t.Error(err)
}
rf = &FilterRule{Type: utils.MetaIPNet,
Element: "~IP{*duration}", Values: []string{"192.0.2.0"}}
if err := rf.CompileValues(); err != nil {
t.Fatal(err)
}
if _, err := rf.Pass(cd); err == nil {
t.Error(err)
}
}

View File

@@ -90,6 +90,7 @@ cgrates (0.11.0~dev) UNRELEASED; urgency=medium
* [ERs] Add support for *template type
* [EEs] Add support for *template type
* [LoaderS] In case of empty output directory path don't move the processed file
* [FilterS] Added *ipnet filter to check if the network contains the IP
-- DanB <danb@cgrates.org> Wed, 19 Feb 2020 13:25:52 +0200

View File

@@ -996,6 +996,7 @@ const (
MetaGreaterOrEqual = "*gte"
MetaResources = "*resources"
MetaEqual = "*eq"
MetaIPNet = "*ipnet"
MetaNotString = "*notstring"
MetaNotPrefix = "*notprefix"
@@ -1008,6 +1009,7 @@ const (
MetaNotDestinations = "*notdestinations"
MetaNotResources = "*notresources"
MetaNotEqual = "*noteq"
MetaNotIPNet = "*notipnet"
MetaEC = "*ec"
)