本项目遵循 语义化版本 与 Keep a Changelog 格式。
3.x 及更早版本早于本 CHANGELOG 建立,详见 git 提交历史与 Releases 页。
- 采样速度提升约 6 倍(单条命令 3.5s → 0.6s):原来判断"一条命令读完了"只能死等
3 秒静默 —— 11 条命令就是 35 秒/台,用户实测"太慢了"。现在从登录 banner 里认出
设备提示符(
<SW-1>/[SW-1]),每读到输出末尾就是提示符时立刻收工; 认不出提示符(个别老设备)自动退回原来的静默判定,行为不变。 实测:2 条只读命令 7~8 秒 → 3.2 秒;12 台 × 11 命令的一轮从 ~70 秒降到 ~15 秒。
- 275 项(+5):新增
tests/test_ring_prompt_speedup.py—— banner 提示符识别(华为<...>/ 系统视图[...]/ 空输入 / 表里形似提示符的行不误判)、看到提示符提前 收工(<0.5s 且通道关闭)、无提示符时退回静默判定。
- 连接通道不释放(真实故障):
_run_commands_via_shell的channel.close()原来只写在 成功路径上 —— 一旦命令报错 / 超时 / 被用户「停止」,通道就不释放,设备侧 VTY 会话被一直占着 (实测挂了 3 小时),后续再连同一台设备就被回Unable to open channel。 现在改为finally必关,并给通道加settimeout(2.0)兜底防线程卡死。 - 瞬时故障不再一次就放弃:面板
_ssh_run对「通道被拒 / 被掐 / 超时」这类瞬时故障 换一条新连接自动重试一次(间隔 2.5 秒);认证失败等确定性错误不重试(避免无谓撞库)。
- 连接类报错翻译成中文指导:
Unable to open channel→ 提示"密码是对的,是设备侧会话被占满, 请确认只开了一个巡检工具 / 等 30 秒再试";认证失败 / 超时 / 端口拒绝各有对应说明。 - 面板「两轮间隔」默认值 5 → 1 分钟(方便用小设备表快速测试,需要精确差分时自行调大)。
- 270 项(+5):新增
tests/test_ring_panel_retry.py—— 瞬时故障重试一次成功 / 连续瞬时故障给友好文案 / 认证失败不重试 / 四类文案映射 / 瞬时判定。
- 排查结论:用户侧「0/37 台有数据」的根因是同时开了两个工具实例(新版 + 旧版)互抢设备会话, 叠加上述连接不释放。请只保留一个实例运行。
面向"不会数通的人"的故障定位能力:告警不再是一堆散点,而是故障 + 故障设备 + 处理步骤。
- 故障事件层
ring_events.py:把逐条技术告警聚合成"一个故障"- 故障卡(人话):故障设备 / 现象 / 判断 / 怎么处理(3 步内,含"先拔哪个口")
- 根因打分:同设备同 MAC 多端口(★★★) · 跨设备同 MAC(★★★) · 设备自检环路日志(★★★) · 多口同速率广播(★★) · MAC 漂移(★) → 排出"最可能的故障点",第一条标「先处理这个」
- 归并:同一设备的 风暴 + 环路日志 + MAC 证据 → 一个故障;单端口轻微广播 → 合并为一条"终端级"
- D13 同设备 MAC 多端口冲突:同一 MAC(同 VLAN)出现在同设备 ≥2 个非聚合端口 → 单轮即可判定,直接点名"哪两个口之间被环接了"(环路最直接、最好处理的证据)
- D4 环路组聚合:同设备上速率相近(±20%)的越阈端口合成一条"环路组"告警, 并自动区分"真环路(多口同速率)"与"终端噪声(单口小广播)"
- D7 日志结构化:从
hwMflpVlanLoopPeriodicTrap/MAC/4/MAC_MOVE等行抽取 MAC / VLAN / 端口 / 事件 - 页签双视图:Ring Alert 默认「故障视图」(给操作员),可一键切「告警明细」(给技术)
- 采样体检:逐条命令记录 字节数/行数/是否返回报错 → 一眼区分「命令没拿到数据」与「没发现环路」
- 大表模式:
_run_commands_via_shell(..., silence_rounds=);页签可传更大静默窗口与超时,避免大表被截断 - 告警新增字段:
mac/vlan/ports/peer/fault_hint
- HTML 报告置顶新增「🚨 故障清单」(人话卡片),技术明细表保留在下方
- 状态栏:
共 N 条告警 → M 个故障(严重 X)
- 265 项(+13):D13 正/负例与聚合口排除、D4 分组、D7 抽取、故障聚合/打分/文本与 HTML 渲染
V4 = V5 去掉 D8/D9(11 条规则),阉割边界与"物理隔离"约定不变
清掉最后一个已知问题,至此「已知问题」清单为空。
analyze_reports()在报告路径打错 / 文件被挪走时会把FileNotFoundError整个抛给调用方, 与同函数对「解析不出设备」的处理风格不一致。现在降级为warnings(GUI 只需展示提示,不必弹异常); 第二期报告读不到时同样降级,并退回单轮模式
- 原 characterization 用例改为验证修复后的行为;用例总数 252 项,全绿
三个「不报错但结果错」的静默缺陷(由新增测试发现并修复)。
rules.yaml里改阈值完全不生效:文件用thresholds:嵌套写法,而引擎_th()只读顶层键 → 一律回退内置默认值(用户按文档调阈值实为无效,例:广播风暴阈值调到 100000 仍按 1000 判)。 现在顶层优先、其次读thresholds子键(两种写法都生效)parse_huawei_temperature取到的「温度」是槽位号:固定宽度槽位表里第一个 -20120 的数字被当成温度 → D11 温度告警永远拿 1N 度比较,真实过温静默漏报。现在按表头定位Temperature(C)列取值 (字符位置切片 → 词序号 → 启发式 三级降级)- 首次运行自动释放
rules.yaml后没有回读 → 本次调用缺signals,D7 日志关键字静默失效 (新装 exe 或删掉 rules.yaml 后才会遇到)。现在写出后立刻解析回读
- 两个原 xfail 用例(温度列取值、释放后回读)转为正式断言;阈值用例从「锁定缺陷」改为「验证生效」
- 测试总数 250 → 253
5.1.0 - 2026-09-17
工程化改造 + 修一个影响环路告警可用性的真 bug。
LICENSE(MIT)pyproject.toml:PEP 621 元数据 + 命令入口net-inspect+ ruff/pytest 配置, 现在可以pip install -e .;依赖锁定paramiko>=3.5,<4(老设备 ssh-rsa 的硬要求)tests/:pytest 测试套件(判据引擎 12 条规则正负例、解析层华为两种排版、 编排层两轮差分、v5/镜像文件一致性)- GitHub Actions:
.github/workflows/ci.yml(Windows 跑 pytest、Linux 跑 ruff)、.github/workflows/build.yml(打 tag 或手动触发 → V3 与 V5 两个 exe artifact) - 本 CHANGELOG;README 增加徽章与「开发与测试」章节
- 环路告警页签「A. 在线两轮采样」连不上任何设备:调用宿主的 SSH 帮助函数时漏传
client参数(_ssh_connect()是就地连接、返回None),导致每台设备都抛异常、两轮采样全是空数据; 而结果提示不管几轮都写「单轮时看不出…」,用户会以为「只跑了一轮」 - 结果提示按「单轮快照 / 两轮差分」分开;新增采样数据统计(第 1 轮 / 第 2 轮各几台有数据); 失败原因(连接超时 / 认证失败 / 命令不被该平台支持)直接列进弹窗
- 主程序新增
main()入口与__version__;__main__守卫改为调用main()
5.0.0 - 2026-09-17
- 环路告警页签(Ring Alert):12 条判据 —— MAC 漂移 / STP 拓扑变化 / 根桥变更 / 广播与组播风暴 / 接口误码增长 / 链路震荡 / 厂家日志关键字 / BPDU 收发异常 / 跨设备关联 / 光衰 / 温度 / 电源状态; 支持在线两轮采样(工具自己连设备跑两遍做差分)与离线报告分析(1~2 份巡检 CSV)
- V5(个人版,含全部功能)与 V3(基础版)两个入口
- 153 个函数补齐中文 docstring(教学 / 交接版),AST 对比验证零逻辑改动
- 主动探测页签:ICMP 连通性 / DNS 解析与重定向 / DHCP 私接检测 / ARP 欺骗与跨网段判定 / VLAN 隔离检查
- 安全配置核查页签:DHCP snooping / DAI / DNS / VLAN 隔离 / 端口安全(只查询配置,不下发)
- 流量测试页签(UDP / ICMP / TCP / TCP SYN,内置接收端,实时 PPS 与带宽)
- 攻击日志检测(SQLi / XSS / 路径穿越 / 命令注入 / WebShell / SSH 爆破,按行类型门控防误报)
- IP 情报查询(ip-api,含机房 / 代理特征标记)
- 单机 / 批量 SSH 巡检(华为 / 新华三 / 锐捷 / 思科 / Linux),异常严重性着色与跳转
- 按设备异常统计、设备清单 txt + Excel 双格式、导出报告