我构建了一个免费、自己托管的 SNMP 工具包——现在支持实时 WebSocket 推送

发布: (2026年2月22日 GMT+8 21:01)
7 分钟阅读
原文: Dev.to

I’m happy to translate the article for you, but I need the full text of the post (the content you’d like translated). Could you please paste the article’s body here? I’ll keep the source link exactly as you provided and translate the rest into Simplified Chinese while preserving all formatting, markdown, and technical terms.

什么是 Trishul SNMP?

一个自托管的 SNMP 开发工具包,将五个工具整合到一个简洁的 Web UI 中。

功能代替
SNMP Simulator (UDP agent)snmpsim + CLI 配置
Walk & Parse → JSONsnmpwalk + 手动 OID 查询
Trap Sender + Receiversnmptrap + snmptrapd
MIB Browser (tree view)iReasoning MIB Browser($500 以上)
MIB Manager (upload/validate)文本编辑器 + 手动处理依赖地狱

技术栈: Python 3.11、FastAPI、pysnmp、pysmi、Bootstrap 5、Docker。

# 一键安装
curl -fsSL https://raw.githubusercontent.com/tosumitdhaka/trishul-snmp/main/install-trishul-snmp.sh | bash

然后打开 http://localhost:8080。默认登录:admin / admin123 — 请立即在 Settings 中更改密码。

Source:

v1.2.4 更新内容

⚡ 实时 WebSocket 推送 — 轮询已死

最大的架构变化:整个前端现在是事件驱动的。

之前: 每个页面都在 setInterval 上轮询后端 — 仪表盘每 30 秒,模拟器每 5 秒。数据陈旧很常见。切换页面会出现加载动画。

之后:/api/ws 上建立单一持久的 WebSocket 连接。后端在状态变化的瞬间广播。仪表盘、模拟器状态和 Trap Receiver 都会立即更新 — 不需要刷新。

Browser ←──── WS push ────── FastAPI /api/ws

                              broadcasts on:
                              - trap received
                              - simulator start/stop
                              - MIB uploaded
                              - stats change

当 WebSocket 正常时,导航栏会显示一个绿色实时点。重新连接后,后端会发送 full_state 消息重新播种所有数据 — 这样在网络波动后也不会看到陈旧数据。

对开发者的意义: 如果你在编写 trap 处理器并从 UI 发送测试 trap,现在可以在仪表盘上实时看到计数器递增。无需 F5。

📊 实时活动统计仪表盘

仪表盘新增一行 8 项计数器,展示会话中的所有活动:

计数器描述
SNMP 请求模拟器提供的总轮询次数
已加载 OID所有已加载 MIB 中当前驻留内存的 OID 数量
接收 / 发送的 Trap实时 trap 计数器
执行的 Walk已运行的 SNMP walk 次数
返回的 OID所有 walk 中返回的 OID 总数
上传的 MIB / 重载次数MIB 管理活动

所有计数器通过 WebSocket 推送实时更新。它们也是 文件持久化 的 — 即使容器重启也会保留,避免丢失会话历史。

⚙️ 设置 — 三张新卡片

应用行为

  • 两个开关:容器启动时自动启动 Simulator容器启动时自动启动 Trap Receiver
  • 可配置会话超时时间(60 秒 – 86 400 秒)。
  • 设置会持久化到 app_settings.json,并在下次重启时生效。

统计管理

  • 将所有计数器导出为 JSON(用于记录测试会话结果)。
  • 将计数器重置为零,以便在测试前获得干净的基准。

关于

  • 版本、作者和描述实时从后端获取 — 始终与实际部署保持同步。

🐛 重要修复

问题修复
时间戳错误 – 当后端返回 Unix epoch 为 0 时,Trap Receiver 显示 1970 为 “Last Received”。对该值进行判断,若 epoch 为零则显示 --
发送的 Trap 计数不足 – 统计仅在前端递增,API 直接发送的 trap 未更新计数器。后端在每次成功发送 trap 后广播统计信息。
页面切换时仪表盘加载动画 – WS full_stateDashboardModule.init() 注册监听器之前触发,导致磁贴卡在加载动画。无论 WS 状态如何,初始化时始终通过 REST 进行播种。
MIB 浏览器状态冲突 – 从 Walk & Parse 跳转到浏览器(带预填 OID)时,有时会记录 “Could not find node”,因为上一次会话的待处理树状态冲突。当存在程序化 OID 搜索时,清除 pendingSelectedOidpendingExpandedNodes

适用于谁?

  • NMS / 后端开发者 – 需要一个真实的 SNMP 代理进行轮询而无需实际硬件,或需要触发特定的 trap OID 来验证处理代码。
  • DevOps / 集成工程师 – 需要在 CI/预发布环境中测试 SNMP 监控集成。
  • 网络工程师 – 想要交互式地探索 MIB 结构——按 OID、名称或描述搜索——并在设备正式上线前了解其可能触发的 trap。

用于

  • 生产环境 24/7 监控 → 使用 Zabbix、LibreNMS、PRTG。
  • 企业 NMS → 使用 SolarWinds、Cisco Prime。
  • 大规模高可用性 trap 收集 → 使用专用平台。

Trishul 是一个 开发者和测试工具,而非生产监控系统。

Browser (8080)
   │ HTTP + WebSocket

Nginx (static files + reverse proxy)
   │ REST + WS

FastAPI Backend (8000)
   ├── MIB Service (parse, validate, search)
   ├── SNMP Simulator (UDP 1061)
   ├── Trap Manager (send + receive on UDP 1162)
   ├── Walker (SNMP walk client)
   └── WebSocket hub (/api/ws)

所有组件均在 Docker 中以 host network mode 运行,因此 SNMP 的 UDP 端口(1061、1162)可以直接从宿主机访问。

试一试

# One‑command install
curl -fsSL https://raw.githubusercontent.com/tosumitdhaka/trishul-snmp/main/install-trishul-snmp.sh | bash

# Access at
http://localhost:8080

🐙 GitHubtosumitdhaka/trishul-snmp
💬 v1.2.4 公告与讨论查看讨论
📋 完整更新日志查看更新日志

如果觉得有用,请在 GitHub 上点个 ⭐ —— 这能帮助其他开发者发现该项目。

欢迎在评论中提问,关于架构决策、pysnmp/pysmi 集成或 WebSocket 实现等问题。 🔱

0 浏览
Back to Blog

相关文章

阅读更多 »