iobroker.js-controller
Version:
Updated by reinstall.js on 2018-06-11T15:19:56.688Z
188 lines (187 loc) • 7.23 kB
JavaScript
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
;