mirror of
https://github.com/cgrates/cgrates.git
synced 2026-02-11 18:16:24 +05:00
Added *ipnet filter
This commit is contained in:
committed by
Dan Christian Bogos
parent
29466d8770
commit
064e271b5e
@@ -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{
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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"
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user