新增 auto-check 工具:网段扫描+SSH登录+压力测试永久循环工作流

- pkg/discovery: TCP端口探测存活主机,ARP表解析MAC作为设备唯一标识
- pkg/sshclient: SSH连接(密码/密钥认证)与远程命令执行
- pkg/stress: stress-ng/stressapptest 压测(cpu/memory/disk/memnative/full)+温度与dmesg监控
- pkg/report: 检测报告生成(文本/JSON)
- pkg/workflow: 永久循环工作流(间隔可配),MAC唯一标识设备,增量测试+状态变化打印
- pkg/config: YAML分类配置(scan/ssh/stress/report/workflow)
- cmd: cobra入口,仅 --config 指定配置文件
This commit is contained in:
张威33321
2026-08-10 20:30:23 +08:00
parent c6d83a4a94
commit 19f6050147
18 changed files with 2077 additions and 0 deletions

View File

@@ -0,0 +1,119 @@
package config
import (
"fmt"
"os"
"time"
"gopkg.in/yaml.v3"
)
// ============================
// Config — 分类配置
// ============================
// Config 全局运行配置(仅从配置文件加载)
type Config struct {
Scan ScanConfig `yaml:"scan"`
SSH SSHConfig `yaml:"ssh"`
Stress StressConfig `yaml:"stress"`
Report ReportConfig `yaml:"report"`
Workflow WorkflowConfig `yaml:"workflow"`
}
// ============================
// 分类配置项
// ============================
// ScanConfig 网段扫描
type ScanConfig struct {
CIDR string `yaml:"cidr"`
Timeout time.Duration `yaml:"timeout"`
Concurrency int `yaml:"concurrency"`
}
// SSHConfig SSH 认证
type SSHConfig struct {
User string `yaml:"user"`
Password string `yaml:"password"`
KeyFile string `yaml:"key"`
Port int `yaml:"port"`
}
// StressConfig 压力测试
type StressConfig struct {
Types string `yaml:"types"`
Duration time.Duration `yaml:"duration"`
Threads int `yaml:"threads"`
}
// ReportConfig 报告
type ReportConfig struct {
Path string `yaml:"path"`
}
// WorkflowConfig 工作流
type WorkflowConfig struct {
Interval time.Duration `yaml:"interval"` // 轮询间隔
}
// ============================
// 加载
// ============================
// Default 内置默认配置
func Default() *Config {
return &Config{
Scan: ScanConfig{
CIDR: "192.168.1.0/24",
Timeout: 3 * time.Second,
Concurrency: 50,
},
SSH: SSHConfig{
User: "root",
Port: 22,
},
Stress: StressConfig{
Types: "cpu,memory",
Duration: 30 * time.Second,
Threads: 4,
},
Workflow: WorkflowConfig{
Interval: 10 * time.Second,
},
}
}
// Load 从文件加载配置(覆盖默认值)
// path 为空时尝试加载 ./auto-check.yaml
// 文件不存在时返回默认配置
func Load(path string) (*Config, error) {
cfg := Default()
if path == "" {
path = "auto-check.yaml"
}
data, err := os.ReadFile(path)
if err != nil {
if os.IsNotExist(err) {
return cfg, nil // 无配置文件,使用默认值
}
return nil, fmt.Errorf("读取配置文件失败: %w", err)
}
if err := yaml.Unmarshal(data, cfg); err != nil {
return nil, fmt.Errorf("解析配置文件 %s 失败: %w", path, err)
}
return cfg, nil
}
// LoadFromString 从字符串加载(用于测试)
func LoadFromString(s string) (*Config, error) {
cfg := Default()
if err := yaml.Unmarshal([]byte(s), cfg); err != nil {
return nil, fmt.Errorf("解析配置失败: %w", err)
}
return cfg, nil
}