From 6953182cb47bdcb5e4c52fe810158eab10e7bc92 Mon Sep 17 00:00:00 2001 From: spiritlhl <103393591+spiritLHLS@users.noreply.github.com> Date: Mon, 2 Mar 2026 10:05:54 +0000 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=B0=9D=E8=AF=95=E6=80=A7=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E5=AE=89=E5=8D=93TMUX=E4=B8=8B=E5=8F=AF=E8=83=BD?= =?UTF-8?q?=E5=AD=98=E5=9C=A8=E7=9A=84DNS=E8=A7=A3=E6=9E=90=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- goecs.go | 3 +- utils/utils.go | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+), 1 deletion(-) diff --git a/goecs.go b/goecs.go index 01487d9a..70f3f199 100644 --- a/goecs.go +++ b/goecs.go @@ -27,7 +27,7 @@ import ( ) var ( - ecsVersion = "v0.1.115" // 融合怪版本号 + ecsVersion = "v0.1.116" // 融合怪版本号 configs = params.NewConfig(ecsVersion) // 全局配置实例 userSetFlags = make(map[string]bool) // 用于跟踪哪些参数是用户显式设置的 ) @@ -63,6 +63,7 @@ func main() { return } initLogger() + utils.CheckAndFixAndroidDNS(configs.Language) preCheck := utils.CheckPublicAccess(3 * time.Second) go func() { if preCheck.Connected { diff --git a/utils/utils.go b/utils/utils.go index b75aed76..cebe577e 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -26,6 +26,88 @@ import ( "github.com/oneclickvirt/security/network" ) +// IsAndroid 检测当前是否在 Android (Termux) 环境下运行 +func IsAndroid() bool { + // Termux 会设置 TERMUX_VERSION 或 PREFIX 环境变量 + if os.Getenv("TERMUX_VERSION") != "" { + return true + } + if prefix := os.Getenv("PREFIX"); strings.Contains(prefix, "termux") { + return true + } + // Android 系统标志文件 + if _, err := os.Stat("/system/build.prop"); err == nil { + return true + } + // ANDROID_ROOT 环境变量 (Android 系统设置为 /system) + if os.Getenv("ANDROID_ROOT") != "" { + return true + } + return false +} + +// androidDNSServers 是用于修复 Android/Termux 下 DNS 问题的备用服务器列表 +var androidDNSServers = []string{ + "nameserver 8.8.8.8", + "nameserver 8.8.4.4", + "nameserver 1.1.1.1", + "nameserver 223.5.5.5", +} + +// CheckAndFixAndroidDNS 检测并尝试修复 Android Termux 下的 DNS 解析问题。 +// 仅在检测到 Android 环境下调用。不出现问题时无任何输出。 +// language: "zh" 或 "en" +func CheckAndFixAndroidDNS(language string) { + if !IsAndroid() { + return + } + resolvPath := "/etc/resolv.conf" + hasValidDNS := false + if data, err := os.ReadFile(resolvPath); err == nil { + for _, line := range strings.Split(string(data), "\n") { + line = strings.TrimSpace(line) + if strings.HasPrefix(line, "nameserver") && len(strings.Fields(line)) >= 2 { + hasValidDNS = true + break + } + } + } + if hasValidDNS { + // DNS 配置正常,无需处理 + return + } + // /etc/resolv.conf 缺失或无有效 nameserver,尝试自动创建 + content := strings.Join(androidDNSServers, "\n") + "\n" + err := os.WriteFile(resolvPath, []byte(content), 0644) + if err != nil { + // 写入失败(权限不足),给出双语提示和修复建议 + fmt.Println("-----------------------------------------------------") + fmt.Println("[Android/Termux] 检测到 DNS 解析配置缺失!") + fmt.Println("这将导致依赖系统 DNS 的测试项目无法正常运行。") + fmt.Println("解决方案(推荐):") + fmt.Println(" 通过 Magisk / KernelSU 刷入以下模块后重启手机:") + fmt.Println(" https://github.com/weigui404/resolv.conf") + fmt.Println("解决方案(临时):") + fmt.Println(" 以 root 身份执行: echo 'nameserver 8.8.8.8' > /etc/resolv.conf") + fmt.Println("-----------------------------------------------------") + fmt.Println("[Android/Termux] DNS resolver config is missing!") + fmt.Println("This will cause DNS-dependent tests to fail.") + fmt.Println("Fix (recommended):") + fmt.Println(" Flash the following module via Magisk / KernelSU and reboot:") + fmt.Println(" https://github.com/weigui404/resolv.conf") + fmt.Println("Fix (temporary):") + fmt.Println(" Run as root: echo 'nameserver 8.8.8.8' > /etc/resolv.conf") + fmt.Println("-----------------------------------------------------") + } else { + // 写入成功 + if language == "zh" { + fmt.Println("[Android/Termux] DNS 配置缺失,已自动写入 /etc/resolv.conf,DNS 解析已恢复。") + } else { + fmt.Println("[Android/Termux] DNS config was missing; auto-written to /etc/resolv.conf, DNS resolution restored.") + } + } +} + // 获取本程序本日及总执行的统计信息 type StatsResponse struct { Counter string `json:"counter"`