NetSwitch 网络设备端口自动控制工具 — 开发记录
项目概述
NetSwitch 是一款基于 Go 语言开发的网络设备端口自动控制工具,通过 SSH 远程连接交换机,按定时计划自动执行端口的开启(enable)和关闭(disable)操作。支持以 Windows 服务方式部署,实现无人值守的自动化断网/通网管理。
技术栈
- 语言:Go(交叉编译 Windows amd64)
- 远程控制:SSH(golang.org/x/crypto/ssh)
- 命令框架:cobra 子命令风格
- 部署方式:Windows 服务(golang.org/x/sys/windows/svc)
- 配置格式:JSON(支持
// 行注释)
主要功能
| 功能 | 说明 |
| 定时断网/通网 | 通过 cron 风格的 schedules 配置,自动在指定时间执行端口 shutdown/undo shutdown |
| Windows 服务 | 支持 install/uninstall/start/stop,开机自启动 |
| 多主机并发 | 多台交换机并发执行 SSH 操作,缩短总耗时 |
| 交互式 SSH | 内置 ssh 子命令,可直接登录交换机手动操作 |
| 日志系统 | 线程安全、自动轮转、带调用者位置和毫秒时间戳 |
| 配置热加载 | 服务运行中自动检测 config.json 变更并重新加载 |
本次迭代完成的工作
一、代码质量优化
- logger.go 重写:加入
sync.Mutex 线程安全保护,去除 log.Logger 和 io.MultiWriter 间接依赖,改用直接文件写入;新增 LogLevel.String() 方法 - go.mod 清理:移除约 30 个未使用的
fyne.io GUI 依赖,go.mod 从 45 行缩减至 11 行 - service.go 修复:删除存在竞争条件的
watchConfigFile(两个 goroutine 争抢同一 ticker channel),合并到主循环
二、6 项逻辑缺陷修复
| # | 问题 | 修复方式 |
| 1 | readChunk goroutine 泄漏(超时后阻塞无法回收) | 改为 startChunkReader 单 goroutine + channel |
| 2 | daemon 和 service 定时逻辑重复且不一致 | 提取 scheduleRunner 统一复用 |
| 3 | 多主机串行执行,最坏 45 秒+ | 改为 sync.WaitGroup 并发执行 |
| 4 | findHostConfig 同一主机重复查找 3-4 次 | 一次查出 HostConfig 直接传递 |
| 5 | 全局 config 变量无线程安全保护 | 改用 atomic.Pointer[Config] 无锁读写 |
| 6 | setupLog 不关闭旧 logger 泄漏文件句柄 | 创建新 logger 前先 Close 旧实例 |
三、日志输出优化
- 截断 SSH 算法列表:
shortenError 在 , client offered: 处截断,避免日志刷屏 - 重试日志精简:每次重试只记次数,最终失败才记一次短错误
- 操作汇总:末尾统计 成功/失败/总计
- 时间戳加毫秒,级别对齐 5 字符,附带
[文件:行号] - Windows 换行:日志输出改为
\r\n,兼容记事本显示
四、命令框架重构(flag → cobra)
旧: NetSwitchs.exe -action=enable -host=switch1
新: NetSwitchs.exe enable switch1
- 每个子命令有独立
--help - 内置
completion 命令,支持 PowerShell/Bash/Zsh Tab 补全 - 命令分组:网络操作 / Windows 服务管理
- 去掉了
-service 内部参数,改用 svc.IsWindowsService() 自动检测 - 去掉了
-daemon 模式,统一为 Windows 服务 + console 调试
五、服务启动流程优化
install → 注册到 Windows SCM(启动命令: NetSwitchs.exe)
SCM 启动 → 自动检测 IsWindowsService() → 进入服务模式
→ 每分钟检查配置变更 + 定时任务
→ 匹配时间 + 星期 → SSH 执行命令
六、文档与配置
- README 全面重写,命令表格按分组拆分,补充示例
- config.json 支持
// 行注释,配置说明内联 - 服务名统一为
NetSwitchs
版本
- 当前版本:
v2.0-beta(commit 4e9eba5) - 编译产物:
NetSwitchs.exe(Windows amd64,6.6MB)