Security hardening, bandwidth savings, router card identity pills, log history
Added
- Router card identity pills (
src/collectors/system.js,src/index.js,public/app.js) — each router card on the Routers page now shows up to three additional footer pills: Architecture (violet, e.g.arm64), Serial Number (amber,SN: XXXX), and License Level (emerald,L6). Architecture comes from/system/resource/print; serial and license are fetched once via/system/routerboard/printand/system/license/printrespectively. CHR/virtual routers gracefully omit the serial pill when the routerboard API is unavailable. Closes issue #70 - Historical log import on connect (
src/collectors/logs.js,public/app.js) — when MikroDash first connects to a router (and on every reconnect), it fetches the current RouterOS log buffer via/log/printand seeds the ring buffer before starting the/log/listenstream. The Logs page and dashboard log card now show existing entries immediately rather than waiting for new events. Ring buffer is cleared on reconnect so stale entries from a prior session are never interleaved with fresh ones. Closes issue #57
Fixed
- Wireless detection bug — Ethernet rows filtered (
src/collectors/wireless.js) — on certain RouterOS builds, the wireless registration-table endpoint returns interface metadata rows (including Ethernet interfaces) alongside genuine wireless clients. The collector now filters to only rows containing at least one wireless-specific field (signal,signal-strength,rx-signal,ssid,tx-rate,rx-rate,tx-rate-set). Closes issue #54 - Router deletion leaves orphan session (
src/index.js) — deleting a router viaDELETE /api/routers/:idnow tears down any live pool entry (cancels idle timer, callsteardownSession(), removes from_routerSessions), preventing a dangling TCP connection to the deleted router. Closes issue #48 - Duplicate Socket.IO connections on page refresh (
src/index.js) — Socket.IO ping interval tightened from 25 s / 20 s to 10 s / 5 s, reducing the stale-socket detection window from ~45 s to ~15 s. A concurrent-sendInitialState()race onfetchInterfaces()is fixed by caching the in-flight Promise insession._ifacesFetch. Closes issue #51 - First-run wizard bypassed on Basic Auth migration (
src/index.js) —_migrateBasicAuth()previously fell back toauthMode:'none'for Basic Auth deployments with no credentials. It now falls back toauthMode:'modern', triggering the first-run wizard. Closes issue #47
Changed
- HTTP Basic Authentication removed (
src/auth/basicAuth.js,src/index.js,src/settings.js,public/index.html,public/app.js) — the legacyBASIC_AUTH_USER/BASIC_AUTH_PASSenv-var auth layer andauthMode:'basic'have been removed. The dashboard now supports two modes only:none(open, with startup warning) andmodern(cookie sessions, scrypt-hashed passwords,admin/viewerroles). Existing Basic Auth deployments are migrated tomodernon first start. Closes issue #46
Performance
- Reduced RouterOS API payload size (
src/collectors/interfaces.js,dhcpLeases.js,dhcpNetworks.js) — three collectors now request only the fields they use via=.proplist=filtering, reducing per-poll bandwidth on busy routers. Closes issue #49
Tests
- 4 new tests covering log history seeding, wireless Ethernet-row filtering, system collector identity fields, and log
_loadInitial()behaviour - Test count raised from 233 to 237 (all passing)