UNPKG

iobroker.js-controller

Version:

Updated by reinstall.js on 2018-06-11T15:19:56.688Z

188 lines (187 loc) • 7.23 kB
"use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var adapterAutoUpgradeManager_exports = {}; __export(adapterAutoUpgradeManager_exports, { AdapterAutoUpgradeManager: () => AdapterAutoUpgradeManager }); module.exports = __toCommonJS(adapterAutoUpgradeManager_exports); var import_js_controller_cli = require("@iobroker/js-controller-cli"); var import_semver = __toESM(require("semver"), 1); class AdapterAutoUpgradeManager { objects; states; /** Mapping from semver range to range identifier */ SEMVER_RANGE_MAPPING = { none: "", patch: "~", minor: "^", major: ">" }; /** Prefix for log messages */ logPrefix; /** Logger which needs to be prefixed */ logger; constructor(options) { this.objects = options.objects; this.states = options.states; this.logger = options.logger; this.logPrefix = options.logPrefix; } /** * Checks if auto upgrade is enabled for the current configured repository */ async isAutoUpgradeEnabled() { let sysConf; try { sysConf = await this.objects.getObjectAsync("system.config"); } catch { } if (!sysConf?.common.activeRepo?.length || !sysConf.common.adapterAutoUpgrade) { return false; } const activeRepo = sysConf.common.activeRepo[0]; return sysConf.common.adapterAutoUpgrade.repositories[activeRepo]; } /** * Checks the current `system.repositories` object and checks if one needs to be performed according to the adapter configuration */ async upgradeAdapters() { this.logger.info(`${this.logPrefix} Check for available automatic adapter upgrades`); const upgradedAdapters = []; const failedAdapters = []; const repoName = await this.getConfiguredRepositoryName(); const repoInformation = await this.getRepository(repoName); const installedAdaptersConfig = await this.getAutoUpdateConfiguration(); for (const adapterConfig of installedAdaptersConfig) { const repoAdapterInfo = repoInformation[adapterConfig.name]; if (!repoAdapterInfo) { continue; } if (import_semver.default.gte(adapterConfig.version, repoAdapterInfo.version)) { continue; } if (import_semver.default.satisfies(repoAdapterInfo.version, `${this.SEMVER_RANGE_MAPPING[adapterConfig.upgradePolicy]}${adapterConfig.version}`, { includePrerelease: true })) { try { await this.upgradeAdapter({ ...repoAdapterInfo, repoName }); upgradedAdapters.push({ name: repoAdapterInfo.name, newVersion: repoAdapterInfo.version, oldVersion: adapterConfig.version }); this.logger.info(`${this.logPrefix} Successfully upgraded adapter "${repoAdapterInfo.name}" to ${repoAdapterInfo.version}`); } catch (e) { this.logger.error(`${this.logPrefix} Could not upgrade adapter "${repoAdapterInfo.name}" to ${repoAdapterInfo.version}: ${e.message}`); failedAdapters.push({ name: repoAdapterInfo.name, newVersion: repoAdapterInfo.version, oldVersion: adapterConfig.version }); } } } return { upgradedAdapters, failedAdapters }; } /** * Upgrade specified adapter to given version * * @param options information of the adapter to install, e.g. version and name, sa well as active repo */ async upgradeAdapter(options) { const { repoName, name, version } = options; this.logger.info(`${this.logPrefix} Upgrade adapter "${name}" to ${version}`); const upgrade = new import_js_controller_cli.Upgrade({ objects: this.objects, states: this.states, params: {}, processExit: () => void 0 }); await upgrade.upgradeAdapter(repoName, `${name}@${version}`, false, true, false); } /** * Get the current active repository name */ async getConfiguredRepositoryName() { const obj = await this.objects.getObjectAsync("system.config"); if (!obj?.common?.activeRepo?.length) { throw new Error("Could not find an active repository"); } return obj.common.activeRepo[0]; } /** * Get the repository information for the given repository * * @param name Name of the repository */ async getRepository(name) { const obj = await this.objects.getObjectAsync("system.repositories"); const jsonContent = obj?.native?.repositories?.[name]?.json; if (!jsonContent) { throw new Error(`Could not get repository information for "${name}"`); } delete jsonContent._repoInfo; return jsonContent; } /** * Get the auto upgrade configuration of all adapters */ async getAutoUpdateConfiguration() { const res = await this.objects.getObjectViewAsync("system", "adapter", { startkey: "system.adapter.", endkey: "system.adapter.\u9999" }); if (!res) { throw new Error("Did not get information about installed adapters"); } const defaultPolicy = await this.getDefaultUpgradePolicy(); return res.rows.filter((row) => defaultPolicy && defaultPolicy !== "none" || row.value?.common.automaticUpgrade && row.value.common.automaticUpgrade !== "none").map((row) => { return { // ts can not infer, that we filtered out falsy row.value entries name: row.value.common.name, version: row.value.common.version, upgradePolicy: row.value.common.automaticUpgrade || defaultPolicy }; }); } /** * Get the default upgrade policy from the system config */ async getDefaultUpgradePolicy() { let sysConf; try { sysConf = await this.objects.getObjectAsync("system.config"); } catch { } return sysConf?.common.adapterAutoUpgrade?.defaultPolicy; } } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { AdapterAutoUpgradeManager }); //# sourceMappingURL=adapterAutoUpgradeManager.js.map