diff --git a/denyip b/denyip index d45ec2b..c45feca 100644 Binary files a/denyip and b/denyip differ diff --git a/ipset.go b/ipset.go index 48d64ae..b894704 100644 --- a/ipset.go +++ b/ipset.go @@ -62,7 +62,7 @@ func NumIPSet(setName string) (int, error) { } // IsIpset 检查名为 setName 的 ipset 是否存在,通过返回 0 表示存在,非零表示不存在或其他错误。 -func IsIpset(setName string) int { +func Is_Name_Ipset(setName string) int { cmd := exec.Command("ipset", "list", setName) err := cmd.Run() @@ -80,6 +80,24 @@ func IsIpset(setName string) int { return 0 } +func Is_Ip_Ipset(ip string) int { + cmd := exec.Command("sh", "-c", fmt.Sprintf("ipset list | grep \"%s\" | cut -d ':' -f 2 | sed 's/ //g'", ip)) + err := cmd.Run() + + if err != nil { + if exitError, ok := err.(*exec.ExitError); ok { + // The program has exited with an exit code != 0 + return exitError.ExitCode() + } else { + // Another error occurred (e.g., command not found) + return -1 // 或者你可以选择其他方式来标识这种情况 + } + } + + // Command executed successfully, the set exists + return 0 +} + // 添加 Iptables 规则 func iptables_add(setName string) error { diff --git a/main.go b/main.go index 0c0955e..9a467fd 100644 --- a/main.go +++ b/main.go @@ -160,7 +160,7 @@ func runMainProcess() { // 主进程逻辑 IPSET_NUMBER = 0 IPSET_NAME = fmt.Sprintf("root%d", IPSET_NUMBER) - if return_value := IsIpset(IPSET_NAME); return_value == 1 { + if return_value := Is_Name_Ipset(IPSET_NAME); return_value == 1 { createIPSet(IPSET_NAME) } @@ -183,16 +183,22 @@ func runMainProcess() { // 主进程逻辑 return 0 }()) - if !strings.Contains(region, "中国") && !strings.Contains(region, "内网") { - if position, err := curl_(e1.Value.(net.IP).String()); err != nil { //判断地域 - log.Printf("获取Ip地域出错: %v", err) - } else { - log.Printf("\033[31m%s %s\033[0m\n", e1.Value.(net.IP).String(), position) // 打印地域 - AddIPSet(IPSET_NAME, e1.Value.(net.IP).String()) // 添加 Ip 到 ipset 集合 + if Is_Ip_Ipset(e1.Value.(net.IP).String()) != 0 { // Ip不在 Ipset 集合中 + if !strings.Contains(region, "中国") && !strings.Contains(region, "内网") { // 离线库判断不在中国内,尝试API判断 + if position, err := curl_(e1.Value.(net.IP).String()); err != nil { //API判断地域 + log.Printf("获取Ip地域出错: %v", err) + } else { + log.Printf("\033[31m%s %s\033[0m\n", e1.Value.(net.IP).String(), position) // 打印地域 - IpList.Remove(e1) // 移除第一个元素 + AddIPSet(IPSET_NAME, e1.Value.(net.IP).String()) // 添加 Ip 到 ipset 集合 + + IpList.Remove(e1) // 移除第一个元素 + } + } else { // 这时是国内地址 + IpList.Remove(e1) } - } else { // 这时是国内地址 + } else { // 在 Ipset 集合中 + log.Printf("\033[31m%s 已经在 Ipset 集合中\033[0m\n", e1.Value.(net.IP).String()) IpList.Remove(e1) } @@ -209,7 +215,6 @@ func runMainProcess() { // 主进程逻辑 go func() { for { if ipset_len, _ := NumIPSet(IPSET_NAME); ipset_len >= 65534 { - //log.Printf("ipset %s 列表已满 %dd\n", IPSET_NAME, ipset_len) log.Printf("\033[31m ipset %s 列表已满 %d \033[0m\n", IPSET_NAME, ipset_len) // 创建新的 ipset 集合 @@ -221,7 +226,7 @@ func runMainProcess() { // 主进程逻辑 } IPSET_NAME = fmt.Sprintf("root%d", IPSET_NUMBER) - if return_value := IsIpset(IPSET_NAME); return_value == 1 { + if return_value := Is_Name_Ipset(IPSET_NAME); return_value == 1 { createIPSet(IPSET_NAME) }