优化核心逻辑
This commit is contained in:
parent
172ccca162
commit
b51d64644f
20
ipset.go
20
ipset.go
@ -62,7 +62,7 @@ func NumIPSet(setName string) (int, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// IsIpset 检查名为 setName 的 ipset 是否存在,通过返回 0 表示存在,非零表示不存在或其他错误。
|
// IsIpset 检查名为 setName 的 ipset 是否存在,通过返回 0 表示存在,非零表示不存在或其他错误。
|
||||||
func IsIpset(setName string) int {
|
func Is_Name_Ipset(setName string) int {
|
||||||
cmd := exec.Command("ipset", "list", setName)
|
cmd := exec.Command("ipset", "list", setName)
|
||||||
err := cmd.Run()
|
err := cmd.Run()
|
||||||
|
|
||||||
@ -80,6 +80,24 @@ func IsIpset(setName string) int {
|
|||||||
return 0
|
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 规则
|
// 添加 Iptables 规则
|
||||||
func iptables_add(setName string) error {
|
func iptables_add(setName string) error {
|
||||||
|
|
||||||
|
27
main.go
27
main.go
@ -160,7 +160,7 @@ func runMainProcess() { // 主进程逻辑
|
|||||||
|
|
||||||
IPSET_NUMBER = 0
|
IPSET_NUMBER = 0
|
||||||
IPSET_NAME = fmt.Sprintf("root%d", IPSET_NUMBER)
|
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)
|
createIPSet(IPSET_NAME)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -183,16 +183,22 @@ func runMainProcess() { // 主进程逻辑
|
|||||||
return 0
|
return 0
|
||||||
}())
|
}())
|
||||||
|
|
||||||
if !strings.Contains(region, "中国") && !strings.Contains(region, "内网") {
|
if Is_Ip_Ipset(e1.Value.(net.IP).String()) != 0 { // Ip不在 Ipset 集合中
|
||||||
if position, err := curl_(e1.Value.(net.IP).String()); err != nil { //判断地域
|
if !strings.Contains(region, "中国") && !strings.Contains(region, "内网") { // 离线库判断不在中国内,尝试API判断
|
||||||
log.Printf("获取Ip地域出错: %v", err)
|
if position, err := curl_(e1.Value.(net.IP).String()); err != nil { //API判断地域
|
||||||
} else {
|
log.Printf("获取Ip地域出错: %v", err)
|
||||||
log.Printf("\033[31m%s %s\033[0m\n", e1.Value.(net.IP).String(), position) // 打印地域
|
} else {
|
||||||
AddIPSet(IPSET_NAME, e1.Value.(net.IP).String()) // 添加 Ip 到 ipset 集合
|
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)
|
IpList.Remove(e1)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -209,7 +215,6 @@ func runMainProcess() { // 主进程逻辑
|
|||||||
go func() {
|
go func() {
|
||||||
for {
|
for {
|
||||||
if ipset_len, _ := NumIPSet(IPSET_NAME); ipset_len >= 65534 {
|
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)
|
log.Printf("\033[31m ipset %s 列表已满 %d \033[0m\n", IPSET_NAME, ipset_len)
|
||||||
|
|
||||||
// 创建新的 ipset 集合
|
// 创建新的 ipset 集合
|
||||||
@ -221,7 +226,7 @@ func runMainProcess() { // 主进程逻辑
|
|||||||
}
|
}
|
||||||
|
|
||||||
IPSET_NAME = fmt.Sprintf("root%d", IPSET_NUMBER)
|
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)
|
createIPSet(IPSET_NAME)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user