From 34e6e850ad887054f5933086ca228113f3df0cb4 Mon Sep 17 00:00:00 2001 From: Juergen Kunz Date: Mon, 20 Oct 2025 12:48:14 +0000 Subject: [PATCH] feat(status): display actions and groups in status command - Add action display to UPS status showing trigger mode, thresholds, and delays - Create displayGroupsStatus() method to show group information - Display group mode, member UPS devices, and group actions - Integrate groups section into status command output --- ts/systemd.ts | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) diff --git a/ts/systemd.ts b/ts/systemd.ts index ac3be90..8323605 100644 --- a/ts/systemd.ts +++ b/ts/systemd.ts @@ -277,6 +277,9 @@ WantedBy=multi-user.target for (const ups of config.upsDevices) { await this.displaySingleUpsStatus(ups, snmp); } + + // Display groups after UPS devices + this.displayGroupsStatus(); } else if (config.snmp) { // Legacy single UPS configuration (v1/v2 format) logger.info('UPS Devices (1):'); @@ -365,6 +368,27 @@ WantedBy=multi-user.target logger.log(` ${theme.dim(`Groups: ${groupNames.join(', ')}`)}`); } + // Display actions if any + if (ups.actions && ups.actions.length > 0) { + for (const action of ups.actions) { + let actionDesc = `${action.type}`; + if (action.thresholds) { + actionDesc += ` (${action.triggerMode || 'onlyThresholds'}: battery<${action.thresholds.battery}%, runtime<${action.thresholds.runtime}min`; + if (action.shutdownDelay) { + actionDesc += `, delay=${action.shutdownDelay}s`; + } + actionDesc += ')'; + } else { + actionDesc += ` (${action.triggerMode || 'onlyPowerChanges'}`; + if (action.shutdownDelay) { + actionDesc += `, delay=${action.shutdownDelay}s`; + } + actionDesc += ')'; + } + logger.log(` ${theme.dim('Action:')} ${theme.info(actionDesc)}`); + } + } + logger.log(''); } catch (error) { @@ -376,6 +400,69 @@ WantedBy=multi-user.target } } + /** + * Display status of all groups + * @private + */ + private displayGroupsStatus(): void { + const config = this.daemon.getConfig(); + + if (!config.groups || config.groups.length === 0) { + return; // No groups to display + } + + logger.log(''); + logger.info(`Groups (${config.groups.length}):`); + + for (const group of config.groups) { + // Display group name and mode + const modeColor = group.mode === 'redundant' ? theme.success : theme.warning; + logger.log( + ` ${symbols.info} ${theme.highlight(group.name)} ${theme.dim(`(${modeColor(group.mode)})`)}`, + ); + + // Display description if present + if (group.description) { + logger.log(` ${theme.dim(group.description)}`); + } + + // Display UPS devices in this group + const upsInGroup = config.upsDevices.filter((ups) => + ups.groups && ups.groups.includes(group.id) + ); + + if (upsInGroup.length > 0) { + const upsNames = upsInGroup.map((ups) => ups.name).join(', '); + logger.log(` ${theme.dim(`UPS Devices (${upsInGroup.length}):`)} ${upsNames}`); + } else { + logger.log(` ${theme.dim('UPS Devices: None')}`); + } + + // Display actions if any + if (group.actions && group.actions.length > 0) { + for (const action of group.actions) { + let actionDesc = `${action.type}`; + if (action.thresholds) { + actionDesc += ` (${action.triggerMode || 'onlyThresholds'}: battery<${action.thresholds.battery}%, runtime<${action.thresholds.runtime}min`; + if (action.shutdownDelay) { + actionDesc += `, delay=${action.shutdownDelay}s`; + } + actionDesc += ')'; + } else { + actionDesc += ` (${action.triggerMode || 'onlyPowerChanges'}`; + if (action.shutdownDelay) { + actionDesc += `, delay=${action.shutdownDelay}s`; + } + actionDesc += ')'; + } + logger.log(` ${theme.dim('Action:')} ${theme.info(actionDesc)}`); + } + } + + logger.log(''); + } + } + /** * Disable and uninstall the systemd service * @throws Error if disabling fails