跳转至

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 变更并重新加载

本次迭代完成的工作

一、代码质量优化

  1. logger.go 重写:加入 sync.Mutex 线程安全保护,去除 log.Loggerio.MultiWriter 间接依赖,改用直接文件写入;新增 LogLevel.String() 方法
  2. go.mod 清理:移除约 30 个未使用的 fyne.io GUI 依赖,go.mod 从 45 行缩减至 11 行
  3. 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)