Update auto-check config and stress modules

This commit is contained in:
12600k-rog-d4
2026-08-20 08:09:01 +08:00
parent 2aaaa16ae2
commit 22f6c40705
7 changed files with 164 additions and 169 deletions

View File

@@ -13,24 +13,13 @@ import (
// 国内镜像源
// ============================
// useMirror 控制是否把远端包管理器切到国内镜像。默认关闭——先用系统自带源
// 试装(飞牛/群晖等定制系统常常已预置可用源),失败或超时再开启清华镜像
var useMirror = false
// SetMirror 设置是否使用国内镜像源(由配置注入)
func SetMirror(on bool) {
useMirror = on
}
// mirrorName 根据发行版返回镜像别名(用于日志)
const mirrorLabel = "清华 TUNA 镜像"
// setupMirror 在安装前把对应包管理器的源切换为国内镜像(仅 apt 系需要改文件,
// 其它包管理器通过参数/变量临时指向镜像)。失败不致命,仅打印警告并继续用原源。
func setupMirror(client *ssh.Client, pm string, sudoPwd string) {
// setupMirror 在安装前把对应包管理器的源切换为国内镜像(清华 TUNA
// useMirror=false 时直接跳过(先用系统自带源试装)。失败不致命,仅提示并继续用原源
func setupMirror(client *ssh.Client, pm string, sudoPwd string, useMirror bool) {
if !useMirror {
return
}
const label = "清华 TUNA 镜像"
switch pm {
case "apt-get":
// 备份并替换为清华镜像Debian/Ubuntu 通用,按 lsb_release 选版本)
@@ -63,17 +52,14 @@ echo OK`
if err != nil || !strings.Contains(out, "OK") {
fmt.Printf(" [镜像] apt 切换国内源失败,将使用官方源: %v\n", err)
} else {
fmt.Printf(" [镜像] apt 已切换至%s\n", mirrorLabel)
fmt.Printf(" [镜像] apt 已切换至%s\n", label)
}
case "dnf", "yum":
// 清华镜像站对 dnf/yum 提供 repo 文件;这里用变量临时指向(持久化需改 repo
cmd := `echo "腾讯/清华镜像需手动配置 repo尝试临时使用 mirrors.tuna.tsinghua.edu.cn 变量"`
runPrivileged(client, cmd, sudoPwd)
// 通过 baseurl 变量临时覆盖(仅对部分仓库有效,作为加速兜底)
fmt.Printf(" [镜像] %s 使用系统默认源(建议手动配置%s repo\n", pm, mirrorLabel)
case "apk":
runPrivileged(client, "sed -i 's#https\\?://[^/]*alpinelinux.org#https://mirrors.tuna.tsinghua.edu.cn/alpine#g' /etc/apk/repositories", sudoPwd)
fmt.Printf(" [镜像] apk 已切换至%s\n", mirrorLabel)
fmt.Printf(" [镜像] apk 已切换至%s\n", label)
default:
// dnf/yum 等无通用一键切源命令,需手动配置 repo 文件,这里仅提示
fmt.Printf(" [镜像] %s 无内置切源逻辑,建议使用系统默认源或手动配置%s repo\n", pm, label)
}
}
@@ -81,8 +67,9 @@ echo OK`
// 远程工具检测
// ============================
// 压测核心依赖工具缺则按需在线安装。lm-sensors 依赖较多,仅单文件
// 二进制 stress-ng 与 fio 为必需sensors 缺失仅影响温度曲线,不阻断压测。
// requiredTools 压测核心依赖工具缺则按需在线安装。lm-sensors 依赖较多,
// 仅单文件二进制 stress-ng 与 fio 为必需sensors 缺失仅影响温度曲线,不阻断压测。
// 这是工具检测的唯一来源DetectTools/EnsureTools 都从这里取列表,避免两处不一致。
var requiredTools = []string{"stress-ng", "fio"}
// ToolInfo 远程工具信息
@@ -112,7 +99,7 @@ func (ts ToolSet) Get(name string) (ToolInfo, bool) {
// DetectTools 检测远程所有相关工具是否可用
func DetectTools(client *ssh.Client) ToolSet {
ts := ToolSet{Tools: make(map[string]ToolInfo)}
for _, name := range []string{"stress-ng", "stressapptest", "iperf3", "fio", "lm-sensors"} {
for _, name := range requiredTools {
if info, ok := detectOne(client, name); ok {
ts.Tools[name] = info
}
@@ -121,9 +108,10 @@ func DetectTools(client *ssh.Client) ToolSet {
}
// EnsureTools 检测工具;缺失且 autoInstall=true 时按发行版自动安装。
// sudoPwd 为非 root 用户执行安装时提供(为空则尝试免密 sudo
// 返回安装后的工具集合,以及最终仍缺失的工具名列表。
func EnsureTools(client *ssh.Client, names []string, autoInstall bool, sudoPwd string) (ToolSet, []string) {
// sudoPwd 为非 root 用户执行安装时提供(为空则尝试免密 sudouseMirror=true
// 时安装前把包管理器源切换为国内镜像(清华 TUNA返回安装后的工具集合,
// 以及最终仍缺失的工具名列表。
func EnsureTools(client *ssh.Client, names []string, autoInstall bool, sudoPwd string, useMirror bool) (ToolSet, []string) {
ts := DetectTools(client)
var missing []string
for _, n := range names {
@@ -142,7 +130,7 @@ func EnsureTools(client *ssh.Client, names []string, autoInstall bool, sudoPwd s
return ts, missing // 无法识别包管理器,跳过安装
}
// 安装前先把源切到国内镜像(使用官方源在网络差的环境会超时)
setupMirror(client, pm, sudoPwd)
setupMirror(client, pm, sudoPwd, useMirror)
// 仅 apt 系需要先刷新元数据
if pm == "apt-get" {
if out, err := runPrivileged(client, "timeout 180 apt-get update 2>&1", sudoPwd); err != nil || strings.Contains(out, "Err") || strings.Contains(out, "Failed") {
@@ -282,24 +270,13 @@ func detectOne(client *ssh.Client, name string) (ToolInfo, bool) {
return ToolInfo{}, false
}
var version string
switch name {
case "stress-ng":
v, _ := sshclient.RunCommand(client, path+" --version 2>&1 | head -1")
version = strings.TrimSpace(v)
case "stressapptest":
v, _ := sshclient.RunCommand(client, path+" --help 2>&1 | head -1")
version = strings.TrimSpace(v)
case "iperf3":
v, _ := sshclient.RunCommand(client, path+" --version 2>&1 | head -1")
version = strings.TrimSpace(v)
case "fio":
v, _ := sshclient.RunCommand(client, path+" --version 2>&1 | head -1")
version = strings.TrimSpace(v)
case "lm-sensors":
v, _ := sshclient.RunCommand(client, path+" -v 2>&1 | head -1")
version = strings.TrimSpace(v)
// 取版本lm-sensors 仅支持 -v其余工具均支持 --version
verFlag := "--version"
if name == "lm-sensors" {
verFlag = "-v"
}
v, _ := sshclient.RunCommand(client, path+" "+verFlag+" 2>&1 | head -1")
version := strings.TrimSpace(v)
return ToolInfo{Name: name, Path: path, Version: version}, true
}