import { BaseMigration } from './base-migration.ts'; import { logger } from '../logger.ts'; /** * Migration from v3 (upsList) to v4 (upsDevices) * * Transforms v3 format with flat SNMP config: * { * upsList: [ * { * id: "ups-1", * name: "UPS 1", * host: "192.168.1.1", * port: 161, * community: "public", * version: "1" // string * } * ] * } * * To v4 format with nested SNMP config: * { * version: "4.0", * upsDevices: [ * { * id: "ups-1", * name: "UPS 1", * snmp: { * host: "192.168.1.1", * port: 161, * community: "public", * version: 1, // number * timeout: 5000 * }, * thresholds: { battery: 60, runtime: 20 }, * groups: [] * } * ] * } */ export class MigrationV3ToV4 extends BaseMigration { readonly order = 4; readonly fromVersion = '3.x'; readonly toVersion = '4.0'; async shouldRun(config: any): Promise { // V3 format has upsList instead of upsDevices return !!config.upsList && !config.upsDevices; } 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)`); // Transform each UPS device from v3 flat structure to v4 nested structure const transformedDevices = config.upsList.map((device: any) => { // Build SNMP config object const snmpConfig: any = { host: device.host, port: device.port || 161, version: typeof device.version === 'string' ? parseInt(device.version, 10) : device.version, timeout: device.timeout || 5000, }; // Add SNMPv1/v2c fields if (device.community) { snmpConfig.community = device.community; } // Add SNMPv3 fields if (device.securityLevel) snmpConfig.securityLevel = device.securityLevel; if (device.username) snmpConfig.username = device.username; if (device.authProtocol) snmpConfig.authProtocol = device.authProtocol; if (device.authKey) snmpConfig.authKey = device.authKey; if (device.privProtocol) snmpConfig.privProtocol = device.privProtocol; if (device.privKey) snmpConfig.privKey = device.privKey; // Add UPS model if present if (device.upsModel) snmpConfig.upsModel = device.upsModel; if (device.customOIDs) snmpConfig.customOIDs = device.customOIDs; // Return v4 format with nested structure return { id: device.id, name: device.name, snmp: snmpConfig, thresholds: device.thresholds || { battery: 60, runtime: 20, }, groups: device.groups || [], }; }); const migrated = { version: this.toVersion, upsDevices: transformedDevices, groups: config.groups || [], checkInterval: config.checkInterval || 30000, }; logger.success(`${this.getName()}: Migration complete (${transformedDevices.length} devices transformed)`); return migrated; } }