diff --git a/deno.json b/deno.json index f792084..b9f334d 100644 --- a/deno.json +++ b/deno.json @@ -1,6 +1,6 @@ { "name": "@serve.zone/nupst", - "version": "4.0.4", + "version": "4.0.5", "exports": "./mod.ts", "tasks": { "dev": "deno run --allow-all mod.ts", diff --git a/ts/migrations/migration-v3-to-v4.ts b/ts/migrations/migration-v3-to-v4.ts index 30b3ed5..7faab71 100644 --- a/ts/migrations/migration-v3-to-v4.ts +++ b/ts/migrations/migration-v3-to-v4.ts @@ -44,17 +44,30 @@ export class MigrationV3ToV4 extends BaseMigration { readonly toVersion = '4.0'; async shouldRun(config: any): Promise { - // V3 format has upsList instead of upsDevices - return !!config.upsList && !config.upsDevices; + // V3 format has upsList OR has upsDevices with flat structure (host at top level) + if (config.upsList && !config.upsDevices) { + return true; // Classic v3 with upsList + } + + // Check if upsDevices exists but has flat structure (v3 format) + if (config.upsDevices && config.upsDevices.length > 0) { + const firstDevice = config.upsDevices[0]; + // V3 has host at top level, v4 has it nested in snmp object + return !!firstDevice.host && !firstDevice.snmp; + } + + return false; } async migrate(config: any): Promise { logger.info(`${this.getName()}: Migrating v3 config to v4 format...`); - logger.dim(` - Renaming upsList → upsDevices`); logger.dim(` - Restructuring UPS devices (flat → nested snmp config)`); + // Get devices from either upsList or upsDevices (for partially migrated configs) + const sourceDevices = config.upsList || config.upsDevices; + // Transform each UPS device from v3 flat structure to v4 nested structure - const transformedDevices = config.upsList.map((device: any) => { + const transformedDevices = sourceDevices.map((device: any) => { // Build SNMP config object const snmpConfig: any = { host: device.host,