Browse Source

fix:修改

duxin 1 year ago
parent
commit
c600e10d97
4 changed files with 63 additions and 0 deletions
  1. 1 0
      go.mod
  2. 6 0
      go.sum
  3. 1 0
      ipmatch/README.md
  4. 55 0
      ipmatch/ipmatch.go

+ 1 - 0
go.mod

@@ -4,6 +4,7 @@ go 1.13
 
 require (
 	app.yhyue.com/moapp/esv1 v0.0.0-20220414031211-3da4123e648d
+	github.com/RoaringBitmap/roaring v1.5.0
 	github.com/coscms/tagfast v0.0.0-20150925144250-2b69b2496250
 	github.com/donnie4w/go-logger v0.0.0-20170827050443-4740c51383f4
 	github.com/fsnotify/fsnotify v1.4.9

+ 6 - 0
go.sum

@@ -48,6 +48,8 @@ github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q
 github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=
 github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
 github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
+github.com/RoaringBitmap/roaring v1.5.0 h1:V0VCSiHjroItEYCM3guC8T83ehi5QMt3oM9EefTTOms=
+github.com/RoaringBitmap/roaring v1.5.0/go.mod h1:plvDsJQpxOC5bw8LRteu/MLWHsHez/3y6cubLI4/1yE=
 github.com/Shopify/sarama v1.30.0/go.mod h1:zujlQQx1kzHsh4jfV1USnptCQrHAEZ2Hk8fTKCulPVs=
 github.com/Shopify/toxiproxy/v2 v2.1.6-0.20210914104332-15ea381dcdae/go.mod h1:/cvHQkZ1fst0EmZnA5dFtiQdWCNCFYzb+uE2vqVgvx0=
 github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
@@ -66,6 +68,8 @@ github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZx
 github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
 github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
+github.com/bits-and-blooms/bitset v1.2.0 h1:Kn4yilvwNtMACtf1eYDlG8H77R07mZSPbMjLyS07ChA=
+github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA=
 github.com/bkaradzic/go-lz4 v1.0.0/go.mod h1:0YdlkowM3VswSROI7qDxhRvJ3sLhlFrRRwjwegp5jy4=
 github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
 github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
@@ -320,6 +324,8 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN
 github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
 github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
 github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
+github.com/mschoch/smat v0.2.0 h1:8imxQsjDm8yFEAVBe7azKmKSgzSkZXDuKkSq9374khM=
+github.com/mschoch/smat v0.2.0/go.mod h1:kc9mz7DoBKqDyiRL7VZN8KvXQMWeTaVnttLRXOlotKw=
 github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
 github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
 github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=

+ 1 - 0
ipmatch/README.md

@@ -0,0 +1 @@
+IP黑白名单检测

+ 55 - 0
ipmatch/ipmatch.go

@@ -0,0 +1,55 @@
+package ipmatch
+
+import (
+	_ "embed"
+	"errors"
+	"github.com/RoaringBitmap/roaring"
+	"strconv"
+	"strings"
+)
+
+type WhiteIp struct {
+	Rb *roaring.Bitmap
+}
+
+// ip2Uint32
+func ip2Uint32(rawIp string) (uint32, error) {
+	w := strings.Split(rawIp, ".")
+	if len(w) != 4 {
+		return 0, errors.New("error data type")
+	}
+	var ipInt uint32
+	for i, s := range w {
+		tmp, err := strconv.Atoi(s)
+		if err != nil {
+			return 0, err
+		}
+		ipInt += uint32(tmp << ((3 - i) * 8))
+	}
+	return ipInt, nil
+}
+
+// NewRb init
+func NewRb(ip string) *WhiteIp {
+	newIp := new(WhiteIp)
+	rb := roaring.NewBitmap()
+	for _, v := range strings.Split(ip, "\n") {
+		if len(v) < 8 {
+			continue
+		}
+		if ipUint, err := ip2Uint32(v); err == nil {
+			rb.Add(ipUint)
+		}
+	}
+	newIp.Rb = rb
+	return newIp
+}
+
+// Match
+func (ip *WhiteIp) Match(rawIp string) bool {
+	if ipUint, err := ip2Uint32(rawIp); err != nil {
+		return false
+	} else {
+		return ip.Rb.Contains(ipUint)
+	}
+}