ProcessedIPMap map 添加时间超时概念
This commit is contained in:
4
go.mod
4
go.mod
@@ -6,6 +6,6 @@ require github.com/google/gopacket v1.1.19
|
|||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/lionsoul2014/ip2region/binding/golang v0.0.0-20241220152942-06eb5c6e8230
|
github.com/lionsoul2014/ip2region/binding/golang v0.0.0-20241220152942-06eb5c6e8230
|
||||||
golang.org/x/net v0.33.0 // indirect
|
golang.org/x/net v0.34.0 // indirect
|
||||||
golang.org/x/sys v0.28.0 // indirect
|
golang.org/x/sys v0.29.0 // indirect
|
||||||
)
|
)
|
||||||
|
|||||||
5
go.sum
5
go.sum
@@ -10,11 +10,16 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn
|
|||||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I=
|
golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I=
|
||||||
golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
|
golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
|
||||||
|
golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0=
|
||||||
|
golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k=
|
||||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
|
golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
|
||||||
golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
|
golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU=
|
||||||
|
golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
|
golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
|
|||||||
82
main.go
82
main.go
@@ -36,8 +36,8 @@ var (
|
|||||||
IpList = list.New() // 存储 IPv4 地址的链表
|
IpList = list.New() // 存储 IPv4 地址的链表
|
||||||
IpMutex sync.Mutex // 保护 ipList 的互斥锁
|
IpMutex sync.Mutex // 保护 ipList 的互斥锁
|
||||||
|
|
||||||
ProcessedIPMap = make(map[string]string) // 使用 map 存储已处理的 IP
|
ProcessedIPMap = map[string]time.Time{} // 使用 map 存储已处理的 IP
|
||||||
ProcessedMutex sync.Mutex // 互斥锁保护 ProcessedIPMap
|
ProcessedMutex sync.Mutex // 互斥锁保护 ProcessedIPMap
|
||||||
)
|
)
|
||||||
|
|
||||||
// 启动子进程
|
// 启动子进程
|
||||||
@@ -187,13 +187,28 @@ func loadFromFile(filePath string, logMessage string) error {
|
|||||||
}
|
}
|
||||||
defer file.Close()
|
defer file.Close()
|
||||||
|
|
||||||
|
// 尝试用新格式解码
|
||||||
decoder := json.NewDecoder(file)
|
decoder := json.NewDecoder(file)
|
||||||
if err := decoder.Decode(&ProcessedIPMap); err != nil {
|
temp := make(map[string]time.Time)
|
||||||
return fmt.Errorf("解码 Map 失败: %w", err)
|
if err := decoder.Decode(&temp); err == nil {
|
||||||
|
ProcessedIPMap = temp
|
||||||
|
log.Println(logMessage)
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Println(logMessage)
|
// 如果失败,尝试旧格式
|
||||||
return nil
|
file.Seek(0, 0) // 重置读取位置
|
||||||
|
decoder = json.NewDecoder(file)
|
||||||
|
oldTemp := make(map[string]string)
|
||||||
|
if err := decoder.Decode(&oldTemp); err == nil {
|
||||||
|
for ip := range oldTemp {
|
||||||
|
ProcessedIPMap[ip] = time.Now() // 给旧 IP 打个当前时间戳
|
||||||
|
}
|
||||||
|
log.Println(logMessage + "(从旧格式转换)")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return fmt.Errorf("解码 Map 失败: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func InitMap() {
|
func InitMap() {
|
||||||
@@ -220,7 +235,7 @@ func WriteLocalAddr() {
|
|||||||
if local_ipv4_addr != "NULL" {
|
if local_ipv4_addr != "NULL" {
|
||||||
//log.Printf("\033[33m %s 本机地址 \033[0m\n", ipStr)
|
//log.Printf("\033[33m %s 本机地址 \033[0m\n", ipStr)
|
||||||
ProcessedMutex.Lock()
|
ProcessedMutex.Lock()
|
||||||
ProcessedIPMap[local_ipv4_addr] = ""
|
ProcessedIPMap[local_ipv4_addr] = time.Now()
|
||||||
ProcessedMutex.Unlock()
|
ProcessedMutex.Unlock()
|
||||||
}
|
}
|
||||||
// 写入json文件
|
// 写入json文件
|
||||||
@@ -287,7 +302,7 @@ func RunMainProcess() { // 主进程逻辑
|
|||||||
|
|
||||||
// 将 IP 标记为已处理,国内地址
|
// 将 IP 标记为已处理,国内地址
|
||||||
ProcessedMutex.Lock()
|
ProcessedMutex.Lock()
|
||||||
ProcessedIPMap[ipStr] = ""
|
ProcessedIPMap[ipStr] = time.Now()
|
||||||
ProcessedMutex.Unlock()
|
ProcessedMutex.Unlock()
|
||||||
|
|
||||||
// 写入json文件
|
// 写入json文件
|
||||||
@@ -309,28 +324,45 @@ func RunMainProcess() { // 主进程逻辑
|
|||||||
IpMutex.Unlock() // 解锁互斥锁
|
IpMutex.Unlock() // 解锁互斥锁
|
||||||
|
|
||||||
// 打印当前info
|
// 打印当前info
|
||||||
/*
|
log.Printf(" 当前Ip链表长度:%d, Ipset名:%s, 长:%d, ProcessedIPMap:[%s]当前长度:%d\n", IpList.Len(), IPSET_NAME, func() int { // 打印 当前 Ipset 链长度
|
||||||
log.Printf(" 当前Ip链表长度:%d, Ipset名:%s, 长:%d, ProcessedIPMap:[%s]当前长度:%d\n", IpList.Len(), IPSET_NAME, func() int { // 打印 当前 Ipset 链长度
|
_len, _err := NumIPSet(IPSET_NAME)
|
||||||
_len, _err := NumIPSet(IPSET_NAME)
|
if _err == nil {
|
||||||
if _err == nil {
|
return _len
|
||||||
return _len
|
}
|
||||||
}
|
return 0
|
||||||
return 0
|
}(), ProcessedIPMap, len(ProcessedIPMap))
|
||||||
}(), ProcessedIPMap, len(ProcessedIPMap))
|
|
||||||
*/
|
|
||||||
|
|
||||||
// 清理 ProcessedIPMap
|
|
||||||
if len(ProcessedIPMap) >= 1024 {
|
|
||||||
ProcessedMutex.Lock() // 锁定互斥锁
|
|
||||||
ProcessedIPMap = make(map[string]string) // 创建一个新的空 map
|
|
||||||
ProcessedMutex.Unlock() // 解锁
|
|
||||||
log.Println("ProcessedIPMap 已清空")
|
|
||||||
}
|
|
||||||
|
|
||||||
time.Sleep(1 * time.Second) // 防止高频运行
|
time.Sleep(1 * time.Second) // 防止高频运行
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
// 启动一个 goroutine(后台任务),用于定期清理 ProcessedIPMap 中过期的 IP 条目
|
||||||
|
go func() {
|
||||||
|
for {
|
||||||
|
time.Sleep(1 * time.Minute)
|
||||||
|
|
||||||
|
// 获取当前时间,用于与 map 中的时间戳进行比较
|
||||||
|
now := time.Now()
|
||||||
|
|
||||||
|
// 加锁,确保并发安全地访问全局变量 ProcessedIPMap
|
||||||
|
ProcessedMutex.Lock()
|
||||||
|
|
||||||
|
// 遍历 ProcessedIPMap,检查每个 IP 的记录是否已超过 24 小时
|
||||||
|
for ip, t := range ProcessedIPMap {
|
||||||
|
// 如果当前时间减去记录时间大于 1 小时,则删除该条目
|
||||||
|
if now.Sub(t) > 10*time.Minute {
|
||||||
|
delete(ProcessedIPMap, ip)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 解锁,允许其他 goroutine 访问 ProcessedIPMap
|
||||||
|
ProcessedMutex.Unlock()
|
||||||
|
|
||||||
|
// 打印日志,表示本次清理已完成
|
||||||
|
log.Println("已清理过期 ProcessedIPMap 项")
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
// 启动防火墙管理
|
// 启动防火墙管理
|
||||||
go func() {
|
go func() {
|
||||||
for {
|
for {
|
||||||
|
|||||||
Reference in New Issue
Block a user