前言
因为工作关系,需要使用ipset
,但是截止目前,golang
社区中对ipset
的支持并不好。之前用的是go-ipset,只能满足基础的使用,而且只支持hash
类型以及部分选项。所以萌生了全面封装golang
版本ipset
的想法,才有了gonetx/ipset的诞生。
功能
支持所有的ispet
常用命令、类型以及实用的选项。
常用命令
支持增删改查导入导出等常用命令,用法可以参见快速开始和进阶使用。
全类型支持
支持所有ipset
的方法类型
和数据类型
灵活的选项
每种set
类型都会有各自的选项,主要集中在创建和新增操作上。目前支持22
个选项,常用的有
func Exist(exist bool) Option
:创建set
或添加entry
时,若数据已存在报不报错;删除entry
时不存在数据报不报错;
func Timeout(timeout time.Duration) Option
:创建set
或者添加entry
时可以指定超时时间;
func MaxElem(maxElem uint) Option
:指定hash
方法类型的set
容量;
func Family(family NetFamily) Option
:指定hash
方法类型的set
网络协议簇;
func HashSize(hashSize uint) Option
:指定hash
方法类型的set
初始化hash
大小。
更多选项详情可以查看文档。
示例
通过示例可以更快地了解该包的使用。需要注意的是,使用该包之前,必须调用ispet.Check
检查系统是否支持ispet
操作以及版本是否大于v6.0
。
快速开始
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
package main
import (
"log"
"time"
"github.com/kiyonlin/gonetx/ipset"
)
func init() {
if err := ipset.Check(); err != nil {
panic(err)
}
}
func main() {
// create test set even it's exist
set, _ := ipset.New("test", ipset.HashIp, ipset.Exist(true), ipset.Timeout(time.Hour))
// output: test
log.Println(set.Name())
_ = set.Flush()
_ = set.Add("1.1.1.1", ipset.Timeout(time.Hour))
ok, _ := set.Test("1.1.1.1")
// output: true
log.Println(ok)
ok, _ = set.Test("1.1.1.2")
// output: false
log.Println(ok)
info, _ := set.List()
// output: &{test hash:ip 4 family inet hashsize 1024 maxelem 65536 timeout 3600 216 0 [1.1.1.1 timeout 3599]}
log.Println(info)
_ = set.Del("1.1.1.1")
_ = set.Destroy()
}
|
进阶使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
package main
import (
"bytes"
"io/ioutil"
"log"
"time"
"github.com/kiyonlin/gonetx/ipset"
)
func init() {
if err := ipset.Check(); err != nil {
panic(err)
}
}
func main() {
// create test set even it's exist
set, _ := ipset.New("test", ipset.HashIp,
ipset.Exist(true), ipset.Timeout(time.Hour*3),
ipset.Family(ipset.Inet), ipset.HashSize(1024),
ipset.MaxElem(100000),
)
// Saved content:
_ = ioutil.WriteFile("saved",
[]byte("add test 1.1.1.1 timeout 3600 -exist\nadd test 1.1.1.2 timeout 3600 -exist\n"),
0600)
_ = set.RestoreFromFile("saved")
data := &bytes.Buffer{}
data.WriteString("add test 1.1.1.3 timeout 3600 -exist\n")
data.WriteString("add test 1.1.1.4 timeout 3600 -exist\n")
_ = set.Restore(data)
info, _ := set.List()
// output: &{test hash:ip 4 family inet hashsize 1024 maxelem 100000 timeout 10800 504 0 [1.1.1.3 timeout 3599 1.1.1.2 timeout 3599 1.1.1.1 timeout 3599 1.1.1.4 timeout 3599]}
log.Println(info)
_ = set.SaveToFile("saved")
// cat saved:
//create test hash:ip family inet hashsize 1024 maxelem 100000 timeout 10800
//add test 1.1.1.3 timeout 3599
//add test 1.1.1.2 timeout 3599
//add test 1.1.1.1 timeout 3599
//add test 1.1.1.4 timeout 3599
}
|
最后
有任何疑问或者改进,请提交issue或者PR。