Osprey 1.3.2. Network topology intelligence for OSPF, IS-IS, EIGRP, BGP, MPLS, and EVPN — passive discovery, protocol-accurate modelling, no agents on your routers and no routes injected.
A correctness release. Five independent audits — the database, the EIGRP module, the BGP tables against the routers' own output, and the HTTP API — drove this work, and every fix below was verified against live equipment rather than assumed. The theme throughout: a number that cannot be measured is now shown as unmeasured instead of as a plausible-looking wrong answer.
Highlights since 1.3.1
EIGRP accuracy
- The hop metric now means what the label says. EIGRP's Feasible Distance is the lowest distance seen since a route last went passive — a feasibility threshold, not today's cost — yet it was labelled "the router's own composite metric". The two only diverge when something interesting happens, which is exactly when you are looking. Osprey now reads the router's current computed distance and the successor's reported distance, and every metric surface (hop table, path bar, hop diagram, stitched segments, RIB view) shows the current distance with a self-labelled fallback for older data.
- Unreachable is no longer a four-billion metric. When DUAL has no feasible successor the MIB reports a saturated sentinel; it was stored and rendered as a distance. Such destinations are now marked unreachable — the route still shows, because "known but currently unreachable" is real DUAL state — paths terminate with a named
route_unreachableoutcome, and an uninstalled route can no longer win a routing decision with a fabricated metric. - The RIB view stopped serving a bystander's numbers. For a destination reached over several paths, the metric shown could belong to a path the router does not even use, and only one next hop appeared where the router installs several. The view now shows the per-destination distance and the full installed next-hop set — a third of IPv4 prefixes on a variance-configured network have more than one.
- Paths stay inside their routing context. An observed EIGRP path could hop from the global table into a VRF on prefix length alone, or compare two EIGRP processes by a metric no router compares. The walk now pins the VRF end-to-end (
?vrf=on the path API), stops with a named boundary result when a destination continues only in another context, and picks between processes by administrative distance first. - The neighbour "Hold" column reads "Hold left". It is a decaying countdown sampled mid-cycle, not the configured hold time — which is why healthy neighbours looked like they were seconds from expiry.
BGP and BMP
- Withdrawn prefixes no longer accumulate. Prefixes withdrawn while the collector was down were never deleted, so per-peer tables could drift far above reality — one session reported 70× the router's own count, with entries three weeks stale. Each completed table dump now reconciles the session: anything the peer no longer advertises is removed, which is safe precisely because a completed dump re-touches everything still live.
- Sessions carrying IPv6 over IPv4 transport are visible. Hundreds of sessions carried an IPv6 address family that was silently narrowed to IPv4 in the inventory. Every address family a session carries is now inventoried in its own right, with its own prefix count, and disappears again when it leaves the session.
- Prefix counts are measured or absent, never fabricated. Sessions discovered over the plain BGP MIB had no counter available and reported zero — sorted to the top of "fewest prefixes" and exported as data. Unmeasured now renders as a dash with its reason, sorts last in either direction, and exports empty; Cisco-agent sessions get genuine per-address-family counts instead. A flap no longer resets a measured count.
- Best paths decided by a coin flip say so. Where candidates tie through the entire decision process, Osprey and a router can legitimately disagree — different vendors break the tie differently. Winning paths now carry the decision step they resolved at, and the routes panel badges the ones settled at the final tiebreak, so a difference from your router is explained rather than mysterious.
- Historical questions no longer answer with phantoms. Asking about peers "as of" a date before recording began returned sessions that were not up at that moment, and a stale-clock class could write history intervals that closed before they opened. Both are repaired, with database constraints so the shape cannot come back.
Detection and alerting
- A persistent multiple-origin finding alerts once per episode. It re-alerted every fifteen minutes for as long as the condition lasted; it now opens, holds, and clears as one episode.
- Idle interfaces no longer freeze silently, and interface records gained the lifecycle timestamps that let stale ones be recognised and reaped.
- Topology events are joinable again. Three quarters of the event log — every stub-network addition — recorded no entity reference, so those events could not be tied back to the object they described.
Reliability and API behaviour
- "Not found" answers as not found. Four endpoints returned a server error for an absent or malformed identifier, which is indistinguishable from a broken server. They now answer
404and400correctly, and identifier validation was extended to route subtrees where it silently did not apply — malformed input no longer reaches the database. - Deleting part of the hierarchy is robust. Optional bookkeeping inside a delete (recording tombstones, cleaning history, stopping collectors) is now genuinely optional: a failure is logged and the delete proceeds, instead of aborting the whole operation with an error that pointed nowhere near the cause.
- Database privilege drift is detected at startup. A table left owned by the wrong role after an out-of-band migration silently disabled a feature and blocked its writes. Services now audit ownership and privileges on every table at startup and log a precise, actionable error — the drift is visible immediately instead of surfacing weeks later as an unexplained failure.
- Empty list responses are consistently empty lists, not
null, across the L2 topology API. - The topology canvas no longer mislabels EIGRP. Hovering an EIGRP node described its autonomous system as if it were an OSPF area.
Install
curl -LO https://github.com/wijnberg-net/osprey/releases/latest/download/osprey_amd64.deb
curl -LO https://github.com/wijnberg-net/osprey/releases/latest/download/SHA256SUMS
sha256sum -c SHA256SUMS
sudo apt install ./osprey_amd64.deb
Debian 12+, Ubuntu 24.04+ (bare metal, Proxmox LXC, or VM). PostgreSQL, NATS, and nginx are pulled in as dependencies; services start under systemd and a self-signed TLS certificate is generated on first install. Open https://your-server/ and log in with the admin account created during setup.
Free evaluation: all features, up to 32 devices, no time limit. Commercial licensing: sales@wijnberg.net.
Full documentation: https://www.wijnberg.net/docs/