Repository navigation
v1.5.0
What's new in v1.5.0
The largest release so far. SnmpLens keeps working with the window closed, tells
somebody when something breaks, and lets you edit the MIBs it reads.
Features
Background operation. The poll clock now lives in Go, so monitoring, thresholds
and alerts keep running when the window is closed — previously closing it silently
stopped every session. A system-tray icon, a "start at login" entry (per-user only,
so it never asks for elevation) and a close-to-tray preference come with it.
Alerting: an event journal and notification routing. Traps, threshold breaches
and reachability changes are recorded in a durable journal, then routed by rules you
write — matched on category, severity, source and OID prefix, with priorities, a
"stop here" flag and quiet hours evaluated in your own timezone. Destinations are
syslog (UDP, TCP and TLS per RFC 5425), a webhook, or email. Deliveries go through a
durable outbox with exponential backoff, so an alert survives a closed window or an
unreachable collector, and a delivery log screen shows what was sent, what is waiting
and what was given up on.
Message templates. A destination can carry its own subject and body, over a fixed
vocabulary the settings screen lists. A webhook can send its own JSON instead of the
SnmpLens envelope — which is how you talk to Slack, Teams or Alertmanager — and the
preview renders through the same code the sink uses, so what is on screen is what
will be sent, with its size and its parse result.
A MIB editor. A full editing tab for the MIBs in your configuration directory, or
any file you open: syntax highlighting, find and replace, undo and redo grouped by
edit rather than by keystroke, drafts that survive closing the window, automatic
backups, and a "restore bundled" button. Diagnostics are two-tier — positioned syntax
errors as you type, semantic analysis on a pause — and cover what neither the parser
nor the loader reports on its own: unknown types, duplicate OIDs, unresolved parents,
missing modules in FROM, undefined INDEX. A "Fix imports" button works out which
symbol comes from which module and edits the IMPORTS clause as text, so comments and
alignment survive.
Why a MIB did not load. gosmi answers "Could not load module at X" for a missing
file, a PDF, a syntax error on line 412 and an unsatisfiable IMPORTS clause alike.
SnmpLens now reports the stage it reached, the located diagnostics with an excerpt and
a caret, the imports it could not satisfy and the symbols each was needed for, and it
recognises the files people actually download by mistake — an HTML page, a PDF, a zip,
a UTF-16 file.
Conceptual tables, decoded and editable. A table's INDEX is split per RFC 2578
§7.7 rather than shown as a raw sub-OID, so tcpConnTable reads as four columns
instead of one opaque 10.0.0.5.161.192.168.1.9.50000, name-keyed tables show names,
and rows sort correctly. Tables with a RowStatus column can have rows created and
destroyed, written in one PDU so the agent never sees a half-built row.
INFORMs. Acknowledged notifications, sent and received, alongside traps.
IPv6. Targets, the trap listener and traceroute all work over IPv6.
Credentials held by the operating system. The community string and v3 passphrases
are sealed with a key kept in DPAPI, the macOS Keychain or a protected file, rather
than beside the ciphertext in localStorage. The settings banner names the backend
rather than claiming more than it delivers.
Target labels everywhere. A label given to a device now appears in SNMP
operations, traps, history and events — not only in Monitor — with the address on
hover.
A project site, at https://snmplens.com, with documentation, a changelog and a
browser demo that runs the real application on fixed data.
Fixes
- The routing rules list stopped rendering when any rule had a destination.
- Restored monitoring sessions no longer lose the indicator showing which samples
failed — the live and reloaded paths built points differently, and only the
reloaded one was wrong. - A keyboard listener accumulated on every switch away from the MIB tab.
- The MIB node panel shows Status, Units and Parent, which it had been laid out for
but never received. Status matters: it tells you an object isdeprecatedor
obsoletebefore you build monitoring on it. - The credential banner in SNMP settings renders its icon.
- On macOS, the "runs at login" line shows the command rather than the entry's name.
- The results table decodes enumerations again:
ethernetCsmacd(6)rather than6. - A trap storm is no longer silently truncated by the socket receive buffer —
measured, 417 of 2000 datagrams recorded before, 2000 after. - Stopping the trap listener no longer waits two seconds for a value another
goroutine had already taken, and no longer leaves a socket bound when a stop lands
while it is still binding. - Quiet hours are evaluated at the event's own time, converted to your timezone;
they were rotating by the machine's UTC offset. - A notification is retried or given up on according to the reply CODE, not its text.
A 503 reading "invalid upstream" was being discarded. - A webhook no longer follows redirects, which Go rewrites as a GET with no body — a
receiver behind a 302 answered 200 having been sent nothing, and the delivery was
recorded as successful. - A credential is scrubbed from any error a receiver hands back, so a debug endpoint
that echoes headers cannot write it into the database. - Switching a destination off means silence, not an alarm on every event.
- One unreachable relay no longer holds up a healthy webhook.
- Mail: dot-stuffing, header folding, a subject over ~300 non-ASCII characters
arriving as a bare ellipsis, and credentials being offered before the connection
was encrypted. - A locked credential store no longer erases the credentials it could not read.
- Several ways the MIB editor could lose work, wedge, resurrect undone text, or
report a destroyed tree as healthy. - Find and replace worked on the wrong text in five ways.
- "Fix imports" no longer breaks a correct MIB.
- Anonymous Mode masks the sentence, not just the column.
- Discovery no longer tries to expand a
/8into 16.7 million strings, or an IPv6
/64for ever. - Screenshots on the site load in Firefox.
Under the hood
- The frontend is Svelte 5 (from 3.59), with Vite 8. Svelte 5 removed two compiler
warnings this project relied on, so both are now checks of our own — one for a name
nothing declares, one for a rendered expression that depends on state it does not
name. Eight of the latter were live at migration time. - Go 1.26.7 and Wails v2.15.0.
- Tests run on Windows, macOS and Linux rather than Linux alone.
pkg/autostart,
pkg/secretsandpkg/networkare three implementations behind one interface each,
and only one was ever exercised — the first multi-platform run found a macOS defect. - Release signing is mandatory rather than best-effort, the checksums manifest is bound
to its tag so an older signed manifest cannot be replayed, and build provenance is
attested:gh attestation verify SnmpLens-windows-amd64.exe --repo Wasabules/SnmpLens. govulnchecknow scans the whole tree. It had been silently skipping the main
package on Linux and reporting a clean bill of health.- Event routing runs off the trap listener's goroutine in bounded batches, behind a
durable watermark, so a crash replays rather than loses. Journal trimming went from
173 ms to 20 ms. Measured end to end: no loss at 2000 traps/s sustained. - Database contention is reported rather than hidden — a call waiting on a pooled
connection blocked 748 ms and returned success with nothing in any log. - 449 frontend assertions and 13 Go packages under
-race, on every platform.
Binaries ship with an Ed25519-signed SnmpLens-checksums.txt, verified by the in-app
auto-updater before anything is applied. From this release the manifest also names the
tag it belongs to, so an older signed manifest cannot be replayed in place of this one,
and every asset carries attested build provenance:
gh attestation verify SnmpLens-windows-amd64.exe --repo Wasabules/SnmpLens
Full changelog: v1.4.1...v1.5.0