All notable changes to trishul-snmp are documented here.
Format follows Keep a Changelog.
Versioning follows Semantic Versioning.
V3NotificationListener now handles one configured USM user, inbound auth/decrypt, discovery REPORT replies for notifier engine discovery, and automatic v3 inform acknowledgement.decode_notification(..., user=...) and tsnmp decode-notification --snmp-version 3 now support strict USM-backed v3 notification decode.NotificationEvent now carries additive v3 metadata (username, security_level, context engine/name, authoritative engine state); CLI text/JSON rendering stays stable for v2c and emits the extra v3 metadata when present.tsnmp listen --snmp-version 3 now routes through V3NotificationListener and requires explicit --local-engine-id, --local-engine-boots, and --local-engine-time.UsmLocalEngine is now public and V3Notifier.send_trap() is supported when the caller supplies explicit local authoritative engine state (engine_id, engine_boots, engine_time).tsnmp now supports SNMPv3 get, getnext, getbulk, walk, bulkwalk, trap, and inform through explicit --snmp-version {2c,3} selection.--username, auth/priv protocol and secret inputs, --context-name, and trap-only --local-engine-* options are now validated before any network I/O.V3Notifier behavior — send_inform() discovers peer engine state lazily on first use, while trap-capable notifiers no longer depend on a discovery roundtrip during open().[v3] extras for auth/priv workflows now surface as ordinary CLI errors with the install hint instead of a Python traceback.V3Notifier.send_trap() local-engine requirement.listen and decode-notification remain SNMPv2c-only in 0.4.1; SNMPv3 inbound/offline notification work is deferred to 0.4.2.PrivProtocol.DES is retained only for wire-level identification and still raises ProtocolError at runtime.cryptography>=41.UsmModel.prepare(dispatcher) sends an RFC 3414 probe and caches engineID / engineBoots / engineTime; SnmpSession.open() awaits it automatically when the security model exposes the method.V3Manager — thin subclass of SnmpManager that accepts a UsmUser and wires a UsmModel internally, mirroring the V2cManager pattern.V3Notifier — send_inform() supported; send_trap() raises ProtocolError. SNMPv3 traps require the sender’s own authoritative engine state (RFC 3412 §7.1.9), which is unavailable after engine discovery against the receiver.AuthenticationError — new exception raised on HMAC verification failure; subclass of ProtocolError.cryptography>=40 optional extra — pip install trishul-snmp[v3]; the package imports and works without it, only auth/priv method calls fail with a clear install hint..[dev,v3] so the full test suite runs with crypto support.dispatcher.py gained send_raw_and_receive(data) -> bytes for the USM discovery path; never used by normal send_pdu / send_only flows.from_bundle() now assigns simulation rules for dynamic syntax types — counters (Counter32, Counter64, and variants) get a CounterRule that increments on every poll, timetick/timestamp syntaxes (TimeTicks, TimeStamp, TimeInterval) get an UptimeRule, and gauges (Gauge32, Unsigned32) get a RandomNumericRule(min=0, max=1000). Previously all three were frozen at 0 as static values, making the simulator non-responsive over time.CounterRule, RandomNumericRule, UptimeRule, and TimestampRule let InMemoryObjectSource serve dynamic OID values (monotonically-increasing counters, random gauges, auto-incrementing timeticks, epoch timestamps) without any application-side callback code. The SimulationRule protocol is public for custom rules.InMemoryObjectSource.from_bundle() — class method that auto-populates a source from a MibBundle, generating scalar .0 instances and column instances up to max_instances, with syntax-appropriate default values and optional deprecated-object filtering.MibBundle iteration helpers — iter_objects(), iter_notifications(), and search() allow callers to iterate or substring-search bundle nodes in memory without a separate database, enabling browser UIs and catalog features to query the bundle directly.NotificationEvent.to_dict() — returns a fully JSON-safe dict representation of a notification event, including varbinds and member bindings, suitable for WebSocket broadcast or storage without additional application-side serialization.V2cNotifier now supports outbound trap and inform send, and V2cNotificationListener supports inbound trap/inform receive with automatic inform acknowledgement.decode_notification() turns captured BER payloads into the same public NotificationEvent model used by the live listener.V2cResponder, InMemoryObjectSource, and CallbackObjectSource now cover GET, GET_NEXT, and GET_BULK for tests, demos, and simulator-style use.scripts/validate_ecosystem.py now creates an isolated venv, validates tsmi CLI bundle output, exercises live manager flows against a real agent, and checks local notification and responder behavior end to end.NotificationEvent now carries notification OID/name/description, uptime, and declared member bindings derived from compiled JSON metadata when available.tsnmp now includes trap, inform, listen, and decode-notification in addition to the manager polling commands.scripts/benchmark_snmpd.py compares raw vs enriched API and CLI paths against a live SNMP agent.tsmi sidecar contract validation from tsnmp display-policy behavior.MODULE::symbol.0 when an exact .0 alias is an OBJECT IDENTIFIER for a scalar OBJECT-TYPE, without changing low-level exact lookup semantics.V2cManager is the primary public API.get, get_next, get_bulk, walk, and bulkwalk.translate, get, getnext, getbulk, walk, bulkwalk, and version.See v0.1.0 release notes for the fuller release summary.