Restructure the UI behind top-level tabs (Dashboard / ONU / OLT) so more features have room to land. showView() now drives the active tab via a VIEW_TO_TAB map, so sub-views (campaign/verify) keep the ONU tab lit. Tabs appear on login (landing on Dashboard) and hide on logout. Dashboard: a read-only network telemetry view modeled on the PONGo iOS app's DashboardViewModel. New api:dashboardStats aggregates, all in main.js (renderer just formats): - counts: ONUs, OLTs, controllers (controllers best-effort via /v3/controllers/configs/) - aggregate traffic (OLT TX BW = downstream, RX BW = upstream) - health: OLTs with laser off; abnormal-Rx count (rx < -28 || > -10) - ONU registration-state breakdown (clicking a state deep-links to the ONU tab pre-filtered) - opt-in detailed scan: per-ONU optical + FEC-health distribution fmtBps is a port of the iOS Format.bps. Edge glow: #edge-glow draws a neon conic-gradient beam masked to a 3px border ring and spins an @property --beam-angle 0->360deg, so a glow travels around the screen edge. Honors prefers-reduced-motion. mcms-api: add listAllControllerConfigs. Docs: CLAUDE.md section 15 + README + IPC table. Verified: npm run check passes; rendered the Dashboard + tabs + edge beam offscreen (beam frozen on the right edge to confirm it follows the border). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> |
||
|---|---|---|
| renderer | ||
| src | ||
| .gitignore | ||
| CLAUDE.md | ||
| main.js | ||
| package.json | ||
| preload.js | ||
| README.md | ||
PON Fleet Upgrader
An Electron desktop app for operating a Ciena MicroClimate Management System (MCMS) 6.2 PON Manager. Top tabs split it into:
- Dashboard — read-only network telemetry: ONU/OLT/controller counts, aggregate up/down traffic, health (abnormal Rx, lasers off), and ONU registration-state breakdown (with an opt-in per-ONU Rx/FEC scan). Clicking a state jumps to the ONU tab pre-filtered.
- ONU — the fleet table plus bulk ONU firmware upgrades (below).
- OLT — bulk OLT PON flooding-mode changes (private↔auto on NNI services — see "OLT PON flooding mode" below).
ONU firmware upgrades
Filters a fleet of ONUs, previews the planned writes, and stages new firmware to each device's inactive bank so the forced reboot is deferred until the next natural restart window.
Two execution modes:
- Bulk task (Procedure 8, recommended) — creates a single
AUTO-TASK-CFGviaPUT /v3/tasks/configs/<id>/. MCMS owns the rollout (retries, pacing, scheduled start). - Per-ONU PUT (Procedure 7) — iterates the selected ONUs, fetches each
ONU-CFG, mutatesFW Bank {Ptr,Files,Versions}, andPUTs the full document back. Slower, but you see errors live per device.
Prerequisites
- Node.js 18+ and npm
- Network reachability to your MCMS host
- An MCMS user with ONU write + Files write permissions
- A compatible ONU firmware
.binfile (already uploaded via this tool or the vendor UI into/files/onu-firmware/)
Install & run
cd pon-fleet-upgrader
npm install
npm start
This launches an Electron window. Use npm run check to syntax-check all
source files without launching the app.
Bank strategy
MCMS stores firmware in two slots per ONU (FW Bank Files[0/1],
FW Bank Versions[0/1]) with FW Bank Ptr pointing at the active one.
Current FW Bank Ptr |
Tool writes to slot | Why |
|---|---|---|
0 |
1 |
Don't overwrite active image |
1 |
0 |
Don't overwrite active image |
65535 (unset) |
1 |
Matches Procedure 7 example; slot 0 stays as factory fallback |
The tool computes this per ONU and buckets the selection by target slot
when submitting a bulk task (MCMS's AUTO-TASK-CFG.Task Details.ONU.FW Bank Ptr accepts a single slot number, so each bucket becomes one task).
Safety notes
- Always validate on one ONU first. Select a single device, run in per-ONU mode, confirm the ONU recovers on slot N before using bulk task on the rest of the fleet.
- Don't blank the active slot. The planner preserves both slots'
existing
Files/Versionsand only writes the target slot. - Scheduled start is UTC. The datetime-local picker converts from
your local timezone to UTC before submitting the
AUTO-TASK-CFG. - Leave the session short. Log out when done — MCMS sessions don't auto-expire and a stale cookie on a shared workstation is an unnecessary exposure.
Filters
The left panel supports:
- Name / address contains — substring match over
ONU.Name,ONU.Address, and_id - PON mode — server-side Mongo filter on
ONU.PON Mode - Active version matches — substring match on the version string in
whichever slot
FW Bank Ptrpoints to - Model / version family — substring match across both slots'
version strings, useful for fleet cuts like
EV051(all Everest 5.1x)
The server-side projection is narrow (serial, name/address, PON mode, bank state). The full ONU-CFG is only re-fetched at plan time.
Files
pon-fleet-upgrader/
├── package.json
├── main.js # Electron main process, IPC handlers
├── preload.js # contextBridge exposing window.api.*
├── src/
│ ├── mcms-api.js # HTTPS client with tough-cookie jar + CSRF
│ └── bank-strategy.js # inactive-bank selection + plan computation
└── renderer/
├── index.html # Login / fleet / campaign views
├── app.css
└── app.js # UI logic
OLT PON flooding mode
From the fleet view, Open OLT inspector… opens a second workflow for bulk-checking and changing the PON flooding mode of OLT NNI services.
On Tibit OLTs the flooding mode is encoded by the presence of a single key
on each OLT-CFG["NNI Networks"] entry:
| Mode | PON FLOOD ID key |
Change |
|---|---|---|
| private | present (any value, incl. 0) |
→ auto: delete the key |
| auto | absent | → private: set the key to 0 |
Workflow: enter a TAG MATCH pattern (exact like s0.c76.c0, or a *
glob like s0.c76.*), Load OLTs, select the OLTs to change, pick a
direction, then Execute change… (two-step confirm). Each OLT is
re-fetched, the matching NNI entries are flipped, and the full OLT-CFG is
PUT back. A result CSV is auto-saved to ~/Downloads/pon-olt-flood-*.csv.
Both directions are supported, so a change can be rolled back from the same
screen. The default action targets s0.c76.c0, private → auto.
Known limitations
- The
/v1/onus/<id>/upgrade/status/path used by the original question isn't part of the dev-guide-documented surface; if your MCMS returns 404 for it, fall back to pollingGET /v1/onus/configs/<id>/and watchingFW Bank Versions+FW Bank Ptrchange. - Progress of a bulk task is reported back by MCMS in its own task
status collection — the tool currently submits and then leaves
monitoring to the PON Manager UI. Follow-up work: poll
/v3/tasks/states/<taskId>/. - No offline mode / cached fleet snapshot. Each
Load fleethits the API. - PATCH endpoints aren't used — MCMS requires full-document PUTs for
ONU-CFGupdates (the dev guide is explicit about this).
License
Internal use only.