Переглянути джерело

add expr helper to check if IP is in ipRange (#113)

* add expr helper to check if IP is in ipRange

* update helper name

Co-authored-by: erenJag <erenJag>
erenJag 5 роки тому
батько
коміт
f6826c7e47
2 змінених файлів з 42 додано та 0 видалено
  1. 20 0
      pkg/exprhelpers/expr_test.go
  2. 22 0
      pkg/exprhelpers/exprlib.go

+ 20 - 0
pkg/exprhelpers/expr_test.go

@@ -5,6 +5,7 @@ import (
 	"testing"
 
 	"github.com/antonmedv/expr"
+	"github.com/stretchr/testify/require"
 	"gotest.tools/assert"
 )
 
@@ -113,3 +114,22 @@ func TestFile(t *testing.T) {
 		assert.Equal(t, test.result, result)
 	}
 }
+
+func TestIpInRange(t *testing.T) {
+	env := map[string]interface{}{
+		"ip":        "192.168.0.1",
+		"ipRange":   "192.168.0.0/24",
+		"IpInRange": IpInRange,
+	}
+	code := "IpInRange(ip, ipRange)"
+	log.Printf("Running filter : %s", code)
+
+	program, err := expr.Compile(code, expr.Env(env))
+	require.NoError(t, err)
+
+	output, err := expr.Run(program, env)
+	require.NoError(t, err)
+
+	require.Equal(t, true, output)
+
+}

+ 22 - 0
pkg/exprhelpers/exprlib.go

@@ -3,6 +3,7 @@ package exprhelpers
 import (
 	"bufio"
 	"fmt"
+	"net"
 	"os"
 	"path"
 	"regexp"
@@ -36,6 +37,7 @@ func GetExprEnv(ctx map[string]interface{}) map[string]interface{} {
 		"File":           File,
 		"RegexpInFile":   RegexpInFile,
 		"Upper":          Upper,
+		"IpInRange":      IpInRange,
 	}
 	for k, v := range ctx {
 		ExprLib[k] = v
@@ -101,3 +103,23 @@ func RegexpInFile(data string, filename string) bool {
 	}
 	return false
 }
+
+func IpInRange(ip string, ipRange string) bool {
+	var err error
+	var ipParsed net.IP
+	var ipRangeParsed *net.IPNet
+
+	ipParsed = net.ParseIP(ip)
+	if ipParsed == nil {
+		log.Errorf("'%s' is not a valid IP", ip)
+		return false
+	}
+	if _, ipRangeParsed, err = net.ParseCIDR(ipRange); err != nil {
+		log.Errorf("'%s' is not a valid IP Range", ipRange)
+		return false
+	}
+	if ipRangeParsed.Contains(ipParsed) {
+		return true
+	}
+	return false
+}