UNPKG

zwave-js-ui

Version:

Z-Wave Control Panel and MQTT Gateway

135 lines (134 loc) 5.46 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.NVM_BACKUP_PREFIX = void 0; const store_1 = __importDefault(require("../config/store")); const logger_1 = require("./logger"); const jsonStore_1 = __importStar(require("./jsonStore")); const croner_1 = __importDefault(require("croner")); const promises_1 = require("fs/promises"); const app_1 = require("../config/app"); const utils_1 = require("./utils"); exports.NVM_BACKUP_PREFIX = 'NVM_'; const logger = (0, logger_1.module)('Backup'); class BackupManager { config; storeJob; nvmJob; zwaveClient; get default() { return { storeBackup: false, storeCron: '0 0 * * *', storeKeep: 7, nvmBackup: false, nvmBackupOnEvent: false, nvmCron: '0 0 * * *', nvmKeep: 7, }; } get backupOnEvent() { return this.config.nvmBackupOnEvent; } nextRun(job) { if (job?.nextRun()) { return job.nextRun().toLocaleString(); } return 'UNKNOWN'; } init(zwaveClient) { this.config = { ...this.default, ...jsonStore_1.default.get(store_1.default.settings).backup, }; this.zwaveClient = zwaveClient; if (this.storeJob) { this.storeJob.stop(); } if (!this.config.storeBackup) { logger.warn('Store backup is disabled'); } else { this.storeJob = new croner_1.default(this.config.storeCron, this.backupStore.bind(this)); logger.info(`Backup job started with cron: ${this.config.storeCron}. Next run: ${this.nextRun(this.storeJob)}`); } if (this.nvmJob) { this.nvmJob.stop(); } if (!this.config.nvmBackup) { logger.warn('Nvm backup is disabled'); } else { this.nvmJob = new croner_1.default(this.config.nvmCron, this.backupNvm.bind(this)); logger.info(`Backup job started with cron: ${this.config.nvmCron}. Next run: ${this.nextRun(this.nvmJob)}`); } } async backupNvm() { logger.info('Backup NVM started'); try { const { fileName } = await this.zwaveClient.backupNVMRaw(); logger.info(`Backup NVM created: ${fileName}`); if (this.nvmJob) { logger.info(`Next NVM backup: ${this.nextRun(this.nvmJob)}`); } // cleanup backups dir, keep last backup files const backups = (await (0, promises_1.readdir)(app_1.nvmBackupsDir)).filter((f) => f.startsWith(exports.NVM_BACKUP_PREFIX)); // keep last `keep` backups if (backups.length > this.config.nvmKeep) { const toDelete = backups.slice(0, backups.length - this.config.nvmKeep); await Promise.all(toDelete.map(async (file) => (0, promises_1.unlink)((0, utils_1.joinPath)(app_1.nvmBackupsDir, file)))); logger.info(`Deleted ${toDelete.length} old NVM backups`); } } catch (err) { logger.error('Backup NVM failed', err); } } async backupStore() { logger.info('Backup STORE started'); try { const backupFile = await jsonStore_1.default.backup(); logger.info(`Backup STORE created: ${backupFile}`); if (this.storeJob) { logger.info(`Next STORE backup: ${this.nextRun(this.storeJob)}`); } // cleanup backups dir, keep last backup files const backups = (await (0, promises_1.readdir)(app_1.storeBackupsDir)).filter((f) => f.startsWith(jsonStore_1.STORE_BACKUP_PREFIX)); // keep last `keep` backups if (backups.length > this.config.storeKeep) { const toDelete = backups.slice(0, backups.length - this.config.storeKeep); await Promise.all(toDelete.map(async (file) => (0, promises_1.unlink)((0, utils_1.joinPath)(app_1.storeBackupsDir, file)))); logger.info(`Deleted ${toDelete.length} old STORE backups`); } } catch (err) { logger.error('Backup STORE failed', err); } } } exports.default = new BackupManager();