onu: info/stats sub-tab with CPE lease health + OUI vendor
Adds an ONU info page and splits the ONU tab into two sub-tabs (Info / stats, Fleet & upgrade). The ONU tab now lands on Info; campaign/verify keep the Fleet sub-tab lit. ONU info page (#view-onu-info): master-detail over the already-loaded fleet (search + status filter, no new bulk fetch). Per-ONU detail shows identity, link/optical + FEC (read from the merged ONU-STATE), firmware, and a CPE card. CPE (customer router): - McmsClient.getCpe — GET /api/cpe/onu/<id>/ (unversioned, [status,doc] tuple). - src/cpe.js (pure, shared): summarizeCpe + leaseHealth. Renewal rule — <50% of the lease remaining => "renewal overdue" (amber), past end => expired. v4 expiry = DHCP "Remove Time"; v6 spans Last Success -> Preferred Lifetime (T1 midpoint), with Prefix Delegation surfaced. - api:getOnuCpe (main.js + web/server.js, exposed in both bridges). OUI vendor (src/oui.js, pure, shared): lazy fetch of the IEEE oui.csv, prefix->org map, cached in memory ~30 days + best-effort to disk (PFW_CACHE_DIR / temp; PrivateTmp makes /tmp writable). Resolved server-side in getOnuCpe; every failure degrades to "unknown OUI". CPE itself is not TTL-cached (lease must be live); only the OUI list is. Dashboard abnormal Rx/Tx rows are now clickable -> deep-link to that ONU's info page (showListModal gained per-item onClick). Docs: CLAUDE.md §17 + IPC table + intro; README. Verified: node --check; cpe.js/oui.js unit-tested (15/15: lease ok/warn/ expired/unknown + 50% boundary, v6 prefix parse, OUI quoted-CSV parse + lookup); ONU info page + CPE card rendered offscreen over HTTP. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
5e3d9271a8
commit
55e95ed467
12 changed files with 677 additions and 7 deletions
19
main.js
19
main.js
|
|
@ -13,6 +13,8 @@ const {
|
|||
summarizeOltNniNetworks, planNniEdit,
|
||||
} = require('./src/mcms-api');
|
||||
const { summarizeDashboard } = require('./src/dashboard');
|
||||
const { summarizeCpe } = require('./src/cpe');
|
||||
const { lookupOui } = require('./src/oui');
|
||||
const { planUpgrade, activeBankPtr, inactiveBank } = require('./src/bank-strategy');
|
||||
|
||||
/** @type {McmsClient | null} */
|
||||
|
|
@ -219,6 +221,23 @@ ipcMain.handle('api:getOnuConfig', async (_ev, { onuId }) => {
|
|||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* CPE (customer router) behind an ONU, for the ONU info page: DHCPv4/v6
|
||||
* lease state + renewal health, plus the CPE MAC's vendor (OUI lookup,
|
||||
* cached ~1 month). Returns null when there's no CPE record.
|
||||
*/
|
||||
ipcMain.handle('api:getOnuCpe', async (_ev, { onuId }) => {
|
||||
try {
|
||||
const c = requireClient();
|
||||
const doc = await c.getCpe(onuId);
|
||||
const cpe = summarizeCpe(doc);
|
||||
if (cpe) cpe.cpeVendor = await lookupOui(cpe.cpeMac);
|
||||
return { ok: true, data: cpe };
|
||||
} catch (err) {
|
||||
return { ok: false, error: toWireError(err) };
|
||||
}
|
||||
});
|
||||
|
||||
ipcMain.handle('api:listOnuFirmware', async () => {
|
||||
try {
|
||||
const c = requireClient();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue