diff --git a/common.go b/common.go index 017db88..da2a853 100644 --- a/common.go +++ b/common.go @@ -1,8 +1,13 @@ package main import ( + "fmt" + "io" "log" + "net" + "net/http" "os/exec" + "strings" ) // CheckCommandExists 检测系统命令是否存在,不存在则退出程序 @@ -12,3 +17,55 @@ func CheckCommandExists(cmd string) { log.Fatalf("命令未找到: %s (请确保已安装该命令)", cmd) } } + +// SplitBySpace 按空格分割字符串 +func SplitBySpace(s string) []string { + return strings.Split(s, " ") +} + +// ContainsPart 判断 target 是否包含 regionParts 中的任意片段(模糊匹配) +func ContainsPart(target string, REGION string) bool { + regionParts := SplitBySpace(REGION) + + for _, rp := range regionParts { + //fmt.Println("regionParts:", rp) + if strings.Contains(target, rp) { + return true + } + } + return false +} + +// 获取本机公网 IPv4 地址 +func GetLocalIpv4Addr() string { + resp, err := http.Get("https://inet-ip.aixiao.me/") + if err != nil { + fmt.Printf("请求失败: %s\n", err) + return "NULL" + } + defer resp.Body.Close() + + ip, err := io.ReadAll(resp.Body) + if err != nil { + fmt.Printf("读取响应失败: %s\n", err) + return "NULL" + } + + ipStr := strings.TrimSpace(string(ip)) + // ✅ 验证是否是合法 IPv4 + if net.ParseIP(ipStr) == nil || strings.Contains(ipStr, "<") { + fmt.Printf("无效的IP响应: %q\n", ipStr) + return "NULL" + } + + log.Printf(" 公网IP: %s\n", ipStr) + return ipStr +} + +/* +func main() { + REGION := "中国 内网" + + fmt.Println("结果1:", ContainsPart("美国", REGION)) // true +} +*/ diff --git a/denyip b/denyip index cdbd428..7c60386 100644 Binary files a/denyip and b/denyip differ diff --git a/denyip.upx b/denyip.upx deleted file mode 100644 index 6d4d053..0000000 Binary files a/denyip.upx and /dev/null differ diff --git a/local_addr.go b/local_addr.go deleted file mode 100644 index 4f395b4..0000000 --- a/local_addr.go +++ /dev/null @@ -1,35 +0,0 @@ -package main - -import ( - "fmt" - "io" - "log" - "net" - "net/http" - "strings" -) - -func GetLocalIpv4Addr() string { - resp, err := http.Get("https://inet-ip.aixiao.me/") - if err != nil { - fmt.Printf("请求失败: %s\n", err) - return "NULL" - } - defer resp.Body.Close() - - ip, err := io.ReadAll(resp.Body) - if err != nil { - fmt.Printf("读取响应失败: %s\n", err) - return "NULL" - } - - ipStr := strings.TrimSpace(string(ip)) - // ✅ 验证是否是合法 IPv4 - if net.ParseIP(ipStr) == nil || strings.Contains(ipStr, "<") { - fmt.Printf("无效的IP响应: %q\n", ipStr) - return "NULL" - } - - log.Printf(" 公网IP: %s\n", ipStr) - return ipStr -} diff --git a/region_name_match.go b/region_name_match.go deleted file mode 100644 index ed2206e..0000000 --- a/region_name_match.go +++ /dev/null @@ -1,31 +0,0 @@ -package main - -import ( - "strings" -) - -// SplitBySpace 按空格分割字符串 -func SplitBySpace(s string) []string { - return strings.Split(s, " ") -} - -// ContainsPart 判断 target 是否包含 regionParts 中的任意片段(模糊匹配) -func ContainsPart(target string, REGION string) bool { - regionParts := SplitBySpace(REGION) - - for _, rp := range regionParts { - //fmt.Println("regionParts:", rp) - if strings.Contains(target, rp) { - return true - } - } - return false -} - -/* -func main() { - REGION := "中国 内网" - - fmt.Println("结果1:", ContainsPart("美国", REGION)) // true -} -*/ diff --git a/warning_ding.go b/warning_ding.go deleted file mode 100644 index b619e15..0000000 --- a/warning_ding.go +++ /dev/null @@ -1,83 +0,0 @@ -package main - -import ( - "bytes" - "encoding/json" - "io" - "log" - "net/http" - "sync" - "time" -) - -var ( - WarningList = make(map[string]string) // 存储 IP 和位置的映射 - WarningListLock = sync.RWMutex{} - - dingtalkWebhook = "https://oapi.dingtalk.com/robot/send?access_token=7f069c672cb878987aa6772cca336740eece4ce36bde12b51b45e9f440e0565a" // 替换为你的 token -) - -// 发送钉钉 Markdown 消息 -func sendDingTalkMessage(title, text string) { - if len(text) > 1900 { - text = text[:1900] + "\n...(内容过长,已截断)" - } - - msg := map[string]interface{}{ - "msgtype": "markdown", - "markdown": map[string]string{ - "title": title, - "text": "### Warning " + title + "\n" + text, - }, - } - - jsonData, err := json.Marshal(msg) - if err != nil { - log.Println("JSON 编码失败:", err) - return - } - - client := &http.Client{Timeout: 5 * time.Second} - resp, err := client.Post(dingtalkWebhook, "application/json", bytes.NewBuffer(jsonData)) - if err != nil { - log.Println("发送钉钉消息失败:", err) - return - } - defer resp.Body.Close() - - body, _ := io.ReadAll(resp.Body) - var result map[string]interface{} - if err := json.Unmarshal(body, &result); err != nil { - log.Println("解析钉钉响应失败:", err) - return - } - - if result["errcode"].(float64) != 0 { - log.Println("钉钉返回错误:", result["errmsg"]) - } else { - log.Println("钉钉告警已发送成功") - } -} - -func warning_ding(ipStr string, position string) { - WarningListLock.Lock() - defer WarningListLock.Unlock() - - WarningList[ipStr] = position - - if len(WarningList) == 1000 { - var content string - for ip, pos := range WarningList { - line := "- " + ip + ", " + pos + "\n" - content += line - log.Println(ip, pos) - } - - log.Println("警告列表已满,发送钉钉告警并清空 map") - - //go sendDingTalkMessage("⚠️ 告警列表达到上限"+local_ipv4_addr, content) - - // 清空 map - WarningList = make(map[string]string) - } -}