Tools
Tools: I Built a Free, Self-Hosted SNMP Toolkit β Now With Real-Time WebSocket Push
2026-02-22
0 views
admin
What Is Trishul SNMP Studio? ## What's New in v1.2.4 ## β‘ Real-Time WebSocket Push β Polling Is Dead ## π Live Activity Stats Dashboard ## βοΈ Settings β Three New Cards ## π Notable Fixes ## Who Is This For? ## What It's NOT For ## Quick Architecture ## Try It If you've ever worked with SNMP β testing NMS integrations, debugging trap handlers, or validating MIB structures β you know the pain. You end up juggling Net-SNMP CLI commands you can never remember, snmptrapd configs scattered everywhere, and a $500 MIB browser that still looks like it was designed in 2003. I built Trishul SNMP Studio to fix that. One Docker container. Browser-based. Free. This post covers what's new in v1.2.4 β the biggest update yet β and why I built it this way. It's a self-hosted SNMP dev toolkit that combines five tools into one clean web UI: Stack: Python 3.11, FastAPI, pysnmp, pysmi, Bootstrap 5, Docker. Then open http://localhost:8080. Default login: admin / admin123 β change it immediately in Settings. The biggest architectural change: the entire frontend is now event-driven. Before: Every page polled the backend on a setInterval β dashboard every 30s, simulator every 5s. Stale data was common. Switching pages caused spinners. After: A single persistent WebSocket connection at /api/ws. The backend broadcasts state changes the moment they happen. Dashboard, Simulator status, and Trap Receiver all update instantly β no refresh needed. The navbar shows a live green dot when the WebSocket is healthy. On reconnect, the backend sends a full_state message to re-seed everything β so you never see stale data after a network hiccup. Why this matters for devs: If you're building a trap handler and sending test traps from the UI, you now see the counter increment on the dashboard in real time. No F5 needed. A new 8-counter row on the dashboard shows everything happening in your session: All counters update via WebSocket push. They're also file-backed β they survive container restarts so you don't lose your session history. Two toggles: auto-start Simulator and auto-start Trap Receiver on container boot. Plus a configurable session timeout (60sβ86400s). Settings persist to app_settings.json and take effect on next restart. Export all counters as JSON (useful for logging test session results) or reset to zero for a clean baseline before a test run. Version, author, and description pulled live from the backend β always in sync with what's actually deployed. Timestamp bug: The Trap Receiver was showing 1970 for Last Received when the backend returned a Unix epoch 0. Now guarded and shown as --. Traps Sent undercount: Stats were only incremented in the frontend β if you sent traps via API directly, the counter never moved. Fixed by broadcasting stats from the backend after every successful trap send. Dashboard spinners on page switch: The WS full_state event fires before DashboardModule.init() registers its listener on page switch, so status tiles stayed as spinners until the next reconnect. Fixed by always seeding via REST on init, regardless of WS state. MIB Browser state conflict: Navigating to the Browser from Walk & Parse (with a pre-filled OID) would sometimes log Could not find node because the previous session's pending tree state conflicted. Fixed by clearing pendingSelectedOid and pendingExpandedNodes when a programmatic OID search is present. NMS / backend developers who need a real SNMP agent to poll without actual hardware, or need to fire specific trap OIDs to validate their handler code. DevOps / integration engineers who need to test SNMP monitoring integrations in CI/staging environments. Network engineers who want to explore MIB structures interactively β search by OID, by name, or by description β and understand what traps a device can fire before it's on the floor. Trishul is a developer and testing tool, not a production monitoring system. Everything runs in Docker with host network mode so the SNMP UDP ports (1061, 1162) are accessible directly from your local machine or test devices. If it's useful, a β on GitHub goes a long way β it helps other devs find the project. Happy to answer questions in the comments about architecture decisions, the pysnmp/pysmi integration, or the WebSocket implementation. π± Templates let you quickly answer FAQs or store snippets for re-use. Are you sure you want to hide this comment? It will become hidden in your post, but will still be visible via the comment's permalink. Hide child comments as well For further actions, you may consider blocking this person and/or reporting abuse COMMAND_BLOCK:
# Install in one command
curl -fsSL https://raw.githubusercontent.com/tosumitdhaka/trishul-snmp/main/install-trishul-snmp.sh | bash Enter fullscreen mode Exit fullscreen mode COMMAND_BLOCK:
# Install in one command
curl -fsSL https://raw.githubusercontent.com/tosumitdhaka/trishul-snmp/main/install-trishul-snmp.sh | bash COMMAND_BLOCK:
# Install in one command
curl -fsSL https://raw.githubusercontent.com/tosumitdhaka/trishul-snmp/main/install-trishul-snmp.sh | bash CODE_BLOCK:
Browser βββββ WS push ββββββ FastAPI /api/ws β broadcasts on: - trap received - simulator start/stop - MIB uploaded - stats change Enter fullscreen mode Exit fullscreen mode CODE_BLOCK:
Browser βββββ WS push ββββββ FastAPI /api/ws β broadcasts on: - trap received - simulator start/stop - MIB uploaded - stats change CODE_BLOCK:
Browser βββββ WS push ββββββ FastAPI /api/ws β broadcasts on: - trap received - simulator start/stop - MIB uploaded - stats change CODE_BLOCK:
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) Enter fullscreen mode Exit fullscreen mode CODE_BLOCK:
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) CODE_BLOCK:
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) COMMAND_BLOCK:
# One-command install
curl -fsSL https://raw.githubusercontent.com/tosumitdhaka/trishul-snmp/main/install-trishul-snmp.sh | bash # Access at
http://localhost:8080 Enter fullscreen mode Exit fullscreen mode COMMAND_BLOCK:
# One-command install
curl -fsSL https://raw.githubusercontent.com/tosumitdhaka/trishul-snmp/main/install-trishul-snmp.sh | bash # Access at
http://localhost:8080 COMMAND_BLOCK:
# One-command install
curl -fsSL https://raw.githubusercontent.com/tosumitdhaka/trishul-snmp/main/install-trishul-snmp.sh | bash # Access at
http://localhost:8080 - SNMP Requests β Total polls served by the simulator
- OIDs Loaded β OIDs currently in memory across all loaded MIBs
- Traps Received / Sent β Live trap counters
- Walks Executed β How many SNMP walks you've run
- OIDs Returned β Total OIDs returned across all walks
- MIBs Uploaded / Times Reloaded β MIB management activity - Production 24/7 monitoring β use Zabbix, LibreNMS, PRTG
- Enterprise NMS β use SolarWinds, Cisco Prime
- High-availability trap collection at scale β use dedicated platforms - π GitHub β tosumitdhaka/trishul-snmp
- π¬ v1.2.4 Announcement & Discussion
- π Full Changelog
how-totutorialguidedev.toaibashnetworkswitchnginxdockernodepythonsslgitgithub