@iobroker/js-controller-cli 7.2.3-alpha.8-20260709-8d8c9c5ed → 7.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/cjs/index.js +3 -3
- package/build/cjs/lib/_Types.d.ts +1 -8
- package/build/cjs/lib/cli/cliCert.d.ts +4 -7
- package/build/cjs/lib/cli/cliCert.js +6 -10
- package/build/cjs/lib/cli/cliCert.js.map +2 -2
- package/build/cjs/lib/cli/cliCommand.d.ts +14 -45
- package/build/cjs/lib/cli/cliCommand.js +1 -8
- package/build/cjs/lib/cli/cliCommand.js.map +2 -2
- package/build/cjs/lib/cli/cliCompact.d.ts +2 -5
- package/build/cjs/lib/cli/cliCompact.js +2 -9
- package/build/cjs/lib/cli/cliCompact.js.map +2 -2
- package/build/cjs/lib/cli/cliDebug.d.ts +2 -5
- package/build/cjs/lib/cli/cliDebug.js +1 -8
- package/build/cjs/lib/cli/cliDebug.js.map +2 -2
- package/build/cjs/lib/cli/cliHost.d.ts +10 -13
- package/build/cjs/lib/cli/cliHost.js +5 -13
- package/build/cjs/lib/cli/cliHost.js.map +2 -2
- package/build/cjs/lib/cli/cliLogs.d.ts +3 -9
- package/build/cjs/lib/cli/cliLogs.js +1 -12
- package/build/cjs/lib/cli/cliLogs.js.map +2 -2
- package/build/cjs/lib/cli/cliMessage.d.ts +1 -2
- package/build/cjs/lib/cli/cliMessage.js +0 -5
- package/build/cjs/lib/cli/cliMessage.js.map +2 -2
- package/build/cjs/lib/cli/cliObjects.d.ts +18 -21
- package/build/cjs/lib/cli/cliObjects.js +33 -51
- package/build/cjs/lib/cli/cliObjects.js.map +2 -2
- package/build/cjs/lib/cli/cliPlugin.d.ts +3 -3
- package/build/cjs/lib/cli/cliPlugin.js +0 -6
- package/build/cjs/lib/cli/cliPlugin.js.map +2 -2
- package/build/cjs/lib/cli/cliProcess.d.ts +4 -8
- package/build/cjs/lib/cli/cliProcess.js +16 -27
- package/build/cjs/lib/cli/cliProcess.js.map +3 -3
- package/build/cjs/lib/cli/cliStates.d.ts +4 -7
- package/build/cjs/lib/cli/cliStates.js +6 -14
- package/build/cjs/lib/cli/cliStates.js.map +2 -2
- package/build/cjs/lib/cli/cliTools.js +0 -11
- package/build/cjs/lib/cli/cliTools.js.map +1 -1
- package/build/cjs/lib/cli/messages.js +46 -47
- package/build/cjs/lib/cli/messages.js.map +1 -1
- package/build/cjs/lib/setup/customError.d.ts +0 -4
- package/build/cjs/lib/setup/customError.js +0 -7
- package/build/cjs/lib/setup/customError.js.map +2 -2
- package/build/cjs/lib/setup/dbConnection.js +64 -69
- package/build/cjs/lib/setup/dbConnection.js.map +3 -3
- package/build/cjs/lib/setup/formatters.d.ts +4 -4
- package/build/cjs/lib/setup/formatters.js +0 -5
- package/build/cjs/lib/setup/formatters.js.map +2 -2
- package/build/cjs/lib/setup/multihostClient.js +2 -6
- package/build/cjs/lib/setup/multihostClient.js.map +1 -1
- package/build/cjs/lib/setup/pluginInfos.d.ts +0 -5
- package/build/cjs/lib/setup/pluginInfos.js +0 -2
- package/build/cjs/lib/setup/pluginInfos.js.map +2 -2
- package/build/cjs/lib/setup/setupBackup.d.ts +0 -34
- package/build/cjs/lib/setup/setupBackup.js +12 -46
- package/build/cjs/lib/setup/setupBackup.js.map +3 -3
- package/build/cjs/lib/setup/setupInstall.d.ts +15 -38
- package/build/cjs/lib/setup/setupInstall.js +24 -42
- package/build/cjs/lib/setup/setupInstall.js.map +2 -2
- package/build/cjs/lib/setup/setupLicense.d.ts +0 -8
- package/build/cjs/lib/setup/setupLicense.js +0 -7
- package/build/cjs/lib/setup/setupLicense.js.map +2 -2
- package/build/cjs/lib/setup/setupList.d.ts +1 -55
- package/build/cjs/lib/setup/setupList.js +24 -78
- package/build/cjs/lib/setup/setupList.js.map +3 -3
- package/build/cjs/lib/setup/setupMultihost.js +9 -12
- package/build/cjs/lib/setup/setupMultihost.js.map +3 -3
- package/build/cjs/lib/setup/setupPacketManager.d.ts +0 -10
- package/build/cjs/lib/setup/setupPacketManager.js +6 -16
- package/build/cjs/lib/setup/setupPacketManager.js.map +2 -2
- package/build/cjs/lib/setup/setupRepo.d.ts +0 -6
- package/build/cjs/lib/setup/setupRepo.js +11 -28
- package/build/cjs/lib/setup/setupRepo.js.map +2 -2
- package/build/cjs/lib/setup/setupSetup.d.ts +0 -27
- package/build/cjs/lib/setup/setupSetup.js +33 -52
- package/build/cjs/lib/setup/setupSetup.js.map +3 -3
- package/build/cjs/lib/setup/setupUpgrade.d.ts +2 -8
- package/build/cjs/lib/setup/setupUpgrade.js +10 -19
- package/build/cjs/lib/setup/setupUpgrade.js.map +2 -2
- package/build/cjs/lib/setup/setupUpload.d.ts +1 -72
- package/build/cjs/lib/setup/setupUpload.js +6 -74
- package/build/cjs/lib/setup/setupUpload.js.map +2 -2
- package/build/cjs/lib/setup/setupUsers.d.ts +14 -23
- package/build/cjs/lib/setup/setupUsers.js +15 -58
- package/build/cjs/lib/setup/setupUsers.js.map +2 -2
- package/build/cjs/lib/setup/setupVendor.d.ts +1 -9
- package/build/cjs/lib/setup/setupVendor.js +6 -13
- package/build/cjs/lib/setup/setupVendor.js.map +2 -2
- package/build/cjs/lib/setup/setupVisDebug.d.ts +2 -11
- package/build/cjs/lib/setup/setupVisDebug.js +15 -21
- package/build/cjs/lib/setup/setupVisDebug.js.map +3 -3
- package/build/cjs/lib/setup/utils.d.ts +1 -1
- package/build/cjs/lib/setup/utils.js +9 -13
- package/build/cjs/lib/setup/utils.js.map +3 -3
- package/build/cjs/lib/setup.js +330 -269
- package/build/cjs/lib/setup.js.map +3 -3
- package/build/esm/lib/_Types.d.ts +1 -8
- package/build/esm/lib/_Types.d.ts.map +1 -1
- package/build/esm/lib/cli/cliCert.d.ts +4 -7
- package/build/esm/lib/cli/cliCert.d.ts.map +1 -1
- package/build/esm/lib/cli/cliCert.js +6 -6
- package/build/esm/lib/cli/cliCert.js.map +1 -1
- package/build/esm/lib/cli/cliCommand.d.ts +14 -45
- package/build/esm/lib/cli/cliCommand.d.ts.map +1 -1
- package/build/esm/lib/cli/cliCommand.js +1 -4
- package/build/esm/lib/cli/cliCommand.js.map +1 -1
- package/build/esm/lib/cli/cliCompact.d.ts +2 -5
- package/build/esm/lib/cli/cliCompact.d.ts.map +1 -1
- package/build/esm/lib/cli/cliCompact.js +2 -5
- package/build/esm/lib/cli/cliCompact.js.map +1 -1
- package/build/esm/lib/cli/cliDebug.d.ts +2 -5
- package/build/esm/lib/cli/cliDebug.d.ts.map +1 -1
- package/build/esm/lib/cli/cliDebug.js +1 -4
- package/build/esm/lib/cli/cliDebug.js.map +1 -1
- package/build/esm/lib/cli/cliHost.d.ts +10 -13
- package/build/esm/lib/cli/cliHost.d.ts.map +1 -1
- package/build/esm/lib/cli/cliHost.js +5 -8
- package/build/esm/lib/cli/cliHost.js.map +1 -1
- package/build/esm/lib/cli/cliLogs.d.ts +3 -9
- package/build/esm/lib/cli/cliLogs.d.ts.map +1 -1
- package/build/esm/lib/cli/cliLogs.js +1 -8
- package/build/esm/lib/cli/cliLogs.js.map +1 -1
- package/build/esm/lib/cli/cliMessage.d.ts +1 -2
- package/build/esm/lib/cli/cliMessage.d.ts.map +1 -1
- package/build/esm/lib/cli/cliMessage.js +0 -1
- package/build/esm/lib/cli/cliMessage.js.map +1 -1
- package/build/esm/lib/cli/cliObjects.d.ts +18 -21
- package/build/esm/lib/cli/cliObjects.d.ts.map +1 -1
- package/build/esm/lib/cli/cliObjects.js +38 -44
- package/build/esm/lib/cli/cliObjects.js.map +1 -1
- package/build/esm/lib/cli/cliPlugin.d.ts +3 -3
- package/build/esm/lib/cli/cliPlugin.d.ts.map +1 -1
- package/build/esm/lib/cli/cliPlugin.js +1 -1
- package/build/esm/lib/cli/cliPlugin.js.map +1 -1
- package/build/esm/lib/cli/cliProcess.d.ts +4 -8
- package/build/esm/lib/cli/cliProcess.d.ts.map +1 -1
- package/build/esm/lib/cli/cliProcess.js +4 -7
- package/build/esm/lib/cli/cliProcess.js.map +1 -1
- package/build/esm/lib/cli/cliStates.d.ts +4 -7
- package/build/esm/lib/cli/cliStates.d.ts.map +1 -1
- package/build/esm/lib/cli/cliStates.js +2 -6
- package/build/esm/lib/cli/cliStates.js.map +1 -1
- package/build/esm/lib/setup/customError.d.ts +0 -4
- package/build/esm/lib/setup/customError.d.ts.map +1 -1
- package/build/esm/lib/setup/customError.js +0 -3
- package/build/esm/lib/setup/customError.js.map +1 -1
- package/build/esm/lib/setup/dbConnection.d.ts.map +1 -1
- package/build/esm/lib/setup/dbConnection.js +13 -10
- package/build/esm/lib/setup/dbConnection.js.map +1 -1
- package/build/esm/lib/setup/formatters.d.ts +4 -4
- package/build/esm/lib/setup/formatters.js +4 -4
- package/build/esm/lib/setup/pluginInfos.d.ts +0 -5
- package/build/esm/lib/setup/pluginInfos.d.ts.map +1 -1
- package/build/esm/lib/setup/pluginInfos.js +0 -5
- package/build/esm/lib/setup/pluginInfos.js.map +1 -1
- package/build/esm/lib/setup/setupBackup.d.ts +0 -34
- package/build/esm/lib/setup/setupBackup.d.ts.map +1 -1
- package/build/esm/lib/setup/setupBackup.js +12 -46
- package/build/esm/lib/setup/setupBackup.js.map +1 -1
- package/build/esm/lib/setup/setupInstall.d.ts +15 -38
- package/build/esm/lib/setup/setupInstall.d.ts.map +1 -1
- package/build/esm/lib/setup/setupInstall.js +21 -38
- package/build/esm/lib/setup/setupInstall.js.map +1 -1
- package/build/esm/lib/setup/setupLicense.d.ts +0 -8
- package/build/esm/lib/setup/setupLicense.d.ts.map +1 -1
- package/build/esm/lib/setup/setupLicense.js +0 -6
- package/build/esm/lib/setup/setupLicense.js.map +1 -1
- package/build/esm/lib/setup/setupList.d.ts +1 -55
- package/build/esm/lib/setup/setupList.d.ts.map +1 -1
- package/build/esm/lib/setup/setupList.js +8 -61
- package/build/esm/lib/setup/setupList.js.map +1 -1
- package/build/esm/lib/setup/setupMultihost.d.ts.map +1 -1
- package/build/esm/lib/setup/setupMultihost.js +6 -5
- package/build/esm/lib/setup/setupMultihost.js.map +1 -1
- package/build/esm/lib/setup/setupPacketManager.d.ts +0 -10
- package/build/esm/lib/setup/setupPacketManager.d.ts.map +1 -1
- package/build/esm/lib/setup/setupPacketManager.js +0 -9
- package/build/esm/lib/setup/setupPacketManager.js.map +1 -1
- package/build/esm/lib/setup/setupRepo.d.ts +0 -6
- package/build/esm/lib/setup/setupRepo.d.ts.map +1 -1
- package/build/esm/lib/setup/setupRepo.js +14 -30
- package/build/esm/lib/setup/setupRepo.js.map +1 -1
- package/build/esm/lib/setup/setupSetup.d.ts +0 -27
- package/build/esm/lib/setup/setupSetup.d.ts.map +1 -1
- package/build/esm/lib/setup/setupSetup.js +21 -36
- package/build/esm/lib/setup/setupSetup.js.map +1 -1
- package/build/esm/lib/setup/setupUpgrade.d.ts +2 -8
- package/build/esm/lib/setup/setupUpgrade.d.ts.map +1 -1
- package/build/esm/lib/setup/setupUpgrade.js +6 -14
- package/build/esm/lib/setup/setupUpgrade.js.map +1 -1
- package/build/esm/lib/setup/setupUpload.d.ts +1 -72
- package/build/esm/lib/setup/setupUpload.d.ts.map +1 -1
- package/build/esm/lib/setup/setupUpload.js +5 -72
- package/build/esm/lib/setup/setupUpload.js.map +1 -1
- package/build/esm/lib/setup/setupUsers.d.ts +14 -23
- package/build/esm/lib/setup/setupUsers.d.ts.map +1 -1
- package/build/esm/lib/setup/setupUsers.js +14 -56
- package/build/esm/lib/setup/setupUsers.js.map +1 -1
- package/build/esm/lib/setup/setupVendor.d.ts +1 -9
- package/build/esm/lib/setup/setupVendor.d.ts.map +1 -1
- package/build/esm/lib/setup/setupVendor.js +1 -7
- package/build/esm/lib/setup/setupVendor.js.map +1 -1
- package/build/esm/lib/setup/setupVisDebug.d.ts +2 -11
- package/build/esm/lib/setup/setupVisDebug.d.ts.map +1 -1
- package/build/esm/lib/setup/setupVisDebug.js +14 -21
- package/build/esm/lib/setup/setupVisDebug.js.map +1 -1
- package/build/esm/lib/setup/utils.d.ts +1 -1
- package/build/esm/lib/setup/utils.d.ts.map +1 -1
- package/build/esm/lib/setup/utils.js +4 -2
- package/build/esm/lib/setup/utils.js.map +1 -1
- package/build/esm/lib/setup.d.ts.map +1 -1
- package/build/esm/lib/setup.js +211 -162
- package/build/esm/lib/setup.js.map +1 -1
- package/build/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +14 -14
|
@@ -5,7 +5,6 @@ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
|
5
5
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
6
|
var __getProtoOf = Object.getPrototypeOf;
|
|
7
7
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
-
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
9
8
|
var __export = (target, all) => {
|
|
10
9
|
for (var name in all)
|
|
11
10
|
__defProp(target, name, { get: all[name], enumerable: true });
|
|
@@ -45,19 +44,13 @@ var import_utils = require("../../lib/setup/utils.js");
|
|
|
45
44
|
var import_customError = require("../../lib/setup/customError.js");
|
|
46
45
|
const debug = (0, import_debug.default)("iobroker:cli");
|
|
47
46
|
class Upgrade {
|
|
48
|
-
static {
|
|
49
|
-
__name(this, "Upgrade");
|
|
50
|
-
}
|
|
51
47
|
hostname = import_js_controller_common.tools.getHostName();
|
|
52
48
|
upload;
|
|
53
49
|
install;
|
|
54
50
|
objects;
|
|
55
51
|
processExit;
|
|
56
|
-
/**
|
|
57
|
-
* @param options The objects client, the upload/install helpers and the process-exit callback
|
|
58
|
-
*/
|
|
59
52
|
constructor(options) {
|
|
60
|
-
options
|
|
53
|
+
options = options || {};
|
|
61
54
|
if (!options.processExit) {
|
|
62
55
|
throw new Error("Invalid arguments: processExit is missing");
|
|
63
56
|
}
|
|
@@ -77,14 +70,13 @@ class Upgrade {
|
|
|
77
70
|
async upgradeAdapterHelper(repo, list, forceDowngrade, autoConfirm) {
|
|
78
71
|
const relevantAdapters = [];
|
|
79
72
|
for (const adapter of list) {
|
|
80
|
-
|
|
81
|
-
if (repoAdapter.controller) {
|
|
73
|
+
if (repo[adapter].controller) {
|
|
82
74
|
continue;
|
|
83
75
|
}
|
|
84
76
|
const adapterDir = import_js_controller_common.tools.getAdapterDir(adapter);
|
|
85
77
|
if (adapterDir && import_fs_extra.default.existsSync(import_node_path.default.join(adapterDir, "io-package.json"))) {
|
|
86
78
|
const ioInstalled = import_fs_extra.default.readJsonSync(import_node_path.default.join(adapterDir, "io-package.json"));
|
|
87
|
-
if (!import_js_controller_common.tools.upToDate(
|
|
79
|
+
if (!import_js_controller_common.tools.upToDate(repo[adapter].version, ioInstalled.common.version)) {
|
|
88
80
|
relevantAdapters.push(adapter);
|
|
89
81
|
}
|
|
90
82
|
}
|
|
@@ -95,15 +87,14 @@ class Upgrade {
|
|
|
95
87
|
let oneAdapterAdded = false;
|
|
96
88
|
for (let i = relevantAdapters.length - 1; i >= 0; i--) {
|
|
97
89
|
const relAdapter = relevantAdapters[i];
|
|
98
|
-
|
|
99
|
-
if (!relevantAdapter.dependencies && !relevantAdapter.globalDependencies) {
|
|
90
|
+
if (!repo[relAdapter].dependencies && !repo[relAdapter].globalDependencies) {
|
|
100
91
|
sortedAdapters.push(relAdapter);
|
|
101
92
|
relevantAdapters.splice(relevantAdapters.indexOf(relAdapter), 1);
|
|
102
93
|
oneAdapterAdded = true;
|
|
103
94
|
} else {
|
|
104
95
|
const allDeps = {
|
|
105
|
-
...import_js_controller_common.tools.parseDependencies(
|
|
106
|
-
...import_js_controller_common.tools.parseDependencies(
|
|
96
|
+
...import_js_controller_common.tools.parseDependencies(repo[relAdapter].dependencies),
|
|
97
|
+
...import_js_controller_common.tools.parseDependencies(repo[relAdapter].globalDependencies)
|
|
107
98
|
};
|
|
108
99
|
let conflict = false;
|
|
109
100
|
for (const [depName, version] of Object.entries(allDeps)) {
|
|
@@ -253,7 +244,7 @@ class Upgrade {
|
|
|
253
244
|
forceDowngrade = true;
|
|
254
245
|
}
|
|
255
246
|
const repoAdapter = sources[adapter];
|
|
256
|
-
const finishUpgrade =
|
|
247
|
+
const finishUpgrade = async (name, ioPack) => {
|
|
257
248
|
if (!ioPack) {
|
|
258
249
|
const adapterDir2 = import_js_controller_common.tools.getAdapterDir(name);
|
|
259
250
|
if (!adapterDir2) {
|
|
@@ -273,7 +264,7 @@ class Upgrade {
|
|
|
273
264
|
await this.upload.uploadAdapter(name, false, true);
|
|
274
265
|
await this.upload.upgradeAdapterObjects(name, ioPack);
|
|
275
266
|
await this.upload.uploadAdapter(name, true, true);
|
|
276
|
-
}
|
|
267
|
+
};
|
|
277
268
|
const adapterDir = import_js_controller_common.tools.getAdapterDir(adapter);
|
|
278
269
|
if (!adapterDir || !version && !import_fs_extra.default.existsSync(import_node_path.default.join(adapterDir, "io-package.json"))) {
|
|
279
270
|
return console.log(`Adapter "${adapter}"${adapter.length < 15 ? new Array(15 - adapter.length).join(" ") : ""} is not installed.`);
|
|
@@ -292,7 +283,7 @@ class Upgrade {
|
|
|
292
283
|
ioInstalled = { common: { version: "0.0.0" } };
|
|
293
284
|
}
|
|
294
285
|
const installedVersion = ioInstalled.common.version;
|
|
295
|
-
const showUpgradeDialog =
|
|
286
|
+
const showUpgradeDialog = (installedVersion2, targetVersion, adapterName) => {
|
|
296
287
|
const isMajor = import_semver.default.major(installedVersion2) !== import_semver.default.major(targetVersion);
|
|
297
288
|
if (autoConfirm || !import_node_tty.default.isatty(process.stdout.fd) && (!isMajor || !upgradeAll)) {
|
|
298
289
|
return true;
|
|
@@ -369,7 +360,7 @@ This downgrade of "${adapter}" will ${noMissingNews ? "" : "at least "}remove th
|
|
|
369
360
|
}
|
|
370
361
|
} while (answer !== "y" && answer !== "yes");
|
|
371
362
|
return true;
|
|
372
|
-
}
|
|
363
|
+
};
|
|
373
364
|
if (repoAdapter.version) {
|
|
374
365
|
if (!forceDowngrade) {
|
|
375
366
|
try {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/lib/setup/setupUpgrade.ts"],
|
|
4
|
-
"sourcesContent": ["import Debug from 'debug';\nimport fs from 'fs-extra';\nimport { tools, EXIT_CODES } from '@iobroker/js-controller-common';\nimport semver from 'semver';\nimport { Upload } from '@/lib/setup/setupUpload.js';\nimport { Install } from '@/lib/setup/setupInstall.js';\nimport rl from 'readline-sync';\nimport tty from 'node:tty';\nimport path from 'node:path';\nimport { getRepository, isVersionIgnored } from '@/lib/setup/utils.js';\nimport type { Client as ObjectsInRedisClient } from '@iobroker/db-objects-redis';\nimport type { Client as StatesInRedisClient } from '@iobroker/db-states-redis';\nimport type { ProcessExitCallback } from '@/lib/_Types.js';\nimport { IoBrokerError } from '@/lib/setup/customError.js';\n\nconst debug = Debug('iobroker:cli');\n\ntype IoPackDependencies = string[] | Record<string, any>[] | Record<string, any>;\n\ninterface CLIUpgradeOptions {\n processExit: ProcessExitCallback;\n objects: ObjectsInRedisClient;\n states: StatesInRedisClient;\n params: Record<string, any>;\n}\n\ninterface UpgradeControllerOptions {\n /** The repo or url */\n repoUrl?: string;\n /** If downgrades are allowed */\n forceDowngrade: boolean;\n /** If controller is currently running */\n controllerRunning: boolean;\n /** Version to upgrade controller too */\n version?: string;\n}\n\n/**\n * CLI command to upgrade the js-controller\n */\nexport class Upgrade {\n private readonly hostname = tools.getHostName();\n private readonly upload: Upload;\n private readonly install: Install;\n private readonly objects: ObjectsInRedisClient;\n private readonly processExit: ProcessExitCallback;\n\n /**\n * @param options The objects client, the upload/install helpers and the process-exit callback\n */\n constructor(options: CLIUpgradeOptions) {\n options ||= {} as CLIUpgradeOptions;\n\n if (!options.processExit) {\n throw new Error('Invalid arguments: processExit is missing');\n }\n\n this.processExit = options.processExit;\n this.objects = options.objects;\n\n this.upload = new Upload(options);\n this.install = new Install(options);\n }\n\n /**\n * Sorts the adapters by their dependencies and then upgrades multiple adapters from the given repository url\n *\n * @param repo the repository content\n * @param list list of adapters to upgrade\n * @param forceDowngrade flag to force downgrade\n * @param autoConfirm automatically confirm the tty questions (bypass)\n */\n async upgradeAdapterHelper(\n repo: ioBroker.RepositoryJson,\n list: string[],\n forceDowngrade: boolean,\n autoConfirm: boolean,\n ): Promise<void> {\n const relevantAdapters = [];\n // check which adapters are upgradeable and sort them according to their dependencies\n for (const adapter of list) {\n const repoAdapter = repo[adapter] as ioBroker.RepositoryJsonAdapterContent;\n if (repoAdapter.controller) {\n // skip controller\n continue;\n }\n const adapterDir = tools.getAdapterDir(adapter);\n if (adapterDir && fs.existsSync(path.join(adapterDir, 'io-package.json'))) {\n const ioInstalled = fs.readJsonSync(path.join(adapterDir, 'io-package.json'));\n if (!tools.upToDate(repoAdapter.version, ioInstalled.common.version)) {\n // not up to date, we need to put it into account for our dependency check\n relevantAdapters.push(adapter);\n }\n }\n }\n\n if (relevantAdapters.length) {\n const sortedAdapters = [];\n\n while (relevantAdapters.length) {\n let oneAdapterAdded = false;\n // create an ordered list for upgrades\n for (let i = relevantAdapters.length - 1; i >= 0; i--) {\n const relAdapter = relevantAdapters[i];\n const relevantAdapter = repo[relAdapter] as ioBroker.RepositoryJsonAdapterContent;\n // if a new version has no dependencies, we can upgrade\n if (!relevantAdapter.dependencies && !relevantAdapter.globalDependencies) {\n // no deps, simply add it\n sortedAdapters.push(relAdapter);\n relevantAdapters.splice(relevantAdapters.indexOf(relAdapter), 1);\n oneAdapterAdded = true;\n } else {\n const allDeps: Record<string, string> = {\n ...tools.parseDependencies(relevantAdapter.dependencies),\n ...tools.parseDependencies(relevantAdapter.globalDependencies),\n };\n\n // we have to check if the deps are there\n let conflict = false;\n for (const [depName, version] of Object.entries(allDeps)) {\n debug(`adapter \"${relAdapter}\" has dependency \"${depName}\": \"${version}\"`);\n if (version !== '*') {\n // dependency is important because it affects the version range\n if (relevantAdapters.includes(depName)) {\n // the dependency is also in the upgrade list and not previously added, we should add the dependency first\n debug(`conflict for dependency \"${depName}\" at adapter \"${relAdapter}\"`);\n conflict = true;\n break;\n }\n }\n }\n // we reached here and no conflict, so every dep is satisfied\n if (!conflict) {\n sortedAdapters.push(relAdapter);\n relevantAdapters.splice(relevantAdapters.indexOf(relAdapter), 1);\n oneAdapterAdded = true;\n }\n }\n }\n\n if (!oneAdapterAdded) {\n // no adapter during this loop -> circular dependency\n console.warn(`Circular dependency detected between adapters \"${relevantAdapters.join(', ')}\"`);\n sortedAdapters.concat(relevantAdapters);\n break; // however, break and try to update\n }\n }\n\n debug(`upgrade order is \"${sortedAdapters.join(', ')}\"`);\n\n for (const sortedAdapter of sortedAdapters) {\n if ((repo[sortedAdapter] as ioBroker.RepositoryJsonAdapterContent)?.controller) {\n continue;\n }\n await this.upgradeAdapter(repo, sortedAdapter, forceDowngrade, autoConfirm, true);\n }\n } else {\n console.log('All adapters are up to date');\n }\n }\n\n /**\n * Checks that local and global deps are fulfilled else rejects promise\n *\n * @param deps local dependencies - required on this host\n * @param globalDeps global dependencies - required on one of the hosts\n */\n private async _checkDependencies(deps: IoPackDependencies, globalDeps: IoPackDependencies): Promise<void> {\n if (!deps && !globalDeps) {\n return Promise.resolve();\n }\n\n deps = tools.parseDependencies(deps);\n globalDeps = tools.parseDependencies(globalDeps);\n // combine both dependencies\n const allDeps = { ...deps, ...globalDeps };\n\n // Get all installed adapters\n const objs = await this.objects.getObjectViewAsync(\n 'system',\n 'instance',\n {\n startkey: 'system.adapter.',\n endkey: 'system.adapter.\\u9999',\n },\n undefined,\n );\n\n if (objs?.rows?.length) {\n for (const dName in allDeps) {\n if (dName === 'js-controller') {\n const version = allDeps[dName];\n // Check only if version not *, else we don't have to read io-pack unnecessarily\n if (version !== '*') {\n const iopkg_ = fs.readJSONSync(`${tools.getControllerDir()}/package.json`);\n try {\n if (!semver.satisfies(iopkg_.version, version, { includePrerelease: true })) {\n return Promise.reject(\n new Error(\n `Invalid version of \"${dName}\". Installed \"${iopkg_.version}\", required \"${version}`,\n ),\n );\n }\n } catch (e) {\n console.log(`Can not check js-controller dependency requirement: ${e.message}`);\n return Promise.reject(\n new Error(\n `Invalid version of \"${dName}\". Installed \"${iopkg_.version}\", required \"${version}`,\n ),\n );\n }\n }\n } else {\n let gInstances: ioBroker.GetObjectViewItem<ioBroker.InstanceObject>[] = [];\n let locInstances: ioBroker.GetObjectViewItem<ioBroker.InstanceObject>[] = [];\n // if global dep get all instances of adapter\n if (globalDeps[dName] !== undefined) {\n gInstances = objs.rows.filter(obj => obj.value.common && obj.value.common.name === dName);\n }\n if (deps[dName] !== undefined) {\n // local dependencies: get all instances on the same host\n locInstances = objs.rows.filter(\n obj =>\n obj.value.common &&\n obj.value.common.name === dName &&\n obj.value.common.host === this.hostname,\n );\n if (locInstances.length === 0) {\n return Promise.reject(new Error(`Required dependency \"${dName}\" not found on this host.`));\n }\n }\n\n let isFound = false;\n // we check that all instances match - respect different local and global dep versions\n for (const instance of locInstances) {\n const instanceVersion = instance.value.common.version;\n try {\n if (\n !semver.satisfies(instanceVersion, deps[dName], {\n includePrerelease: true,\n })\n ) {\n return Promise.reject(\n new Error(\n `Invalid version of \"${dName}\". Installed \"${instanceVersion}\", required \"${deps[dName]}`,\n ),\n );\n }\n } catch (e) {\n console.log(`Can not check dependency requirement: ${e.message}`);\n return Promise.reject(\n new Error(\n `Invalid version of \"${dName}\". Installed \"${instanceVersion}\", required \"${deps[dName]}`,\n ),\n );\n }\n isFound = true;\n }\n\n for (const instance of gInstances) {\n const instanceVersion = instance.value.common.version;\n try {\n if (\n !semver.satisfies(instanceVersion, globalDeps[dName], {\n includePrerelease: true,\n })\n ) {\n return Promise.reject(\n new Error(\n `Invalid version of \"${dName}\". Installed \"${instanceVersion}\", required \"${globalDeps[dName]}`,\n ),\n );\n }\n } catch (e) {\n console.log(`Can not check dependency requirement: ${e.message}`);\n return Promise.reject(\n new Error(\n `Invalid version of \"${dName}\". Installed \"${instanceVersion}\", required \"${globalDeps[dName]}`,\n ),\n );\n }\n isFound = true;\n }\n\n if (isFound === false) {\n return Promise.reject(new Error(`Required dependency \"${dName}\" not found.`));\n }\n }\n }\n }\n }\n\n /**\n * Try to async upgrade adapter from a given source with some checks\n *\n * @param repoUrlOrObject url of the selected repository or parsed repo, if undefined, use current active repository\n * @param adapter name of the adapter (can also include version like web@3.0.0)\n * @param forceDowngrade flag to force downgrade\n * @param autoConfirm automatically confirm the tty questions (bypass)\n * @param upgradeAll if true, this is an upgrade all call, we don't do major upgrades if no tty\n */\n async upgradeAdapter(\n repoUrlOrObject: string | ioBroker.RepositoryJson | undefined,\n adapter: string,\n forceDowngrade: boolean,\n autoConfirm: boolean,\n upgradeAll: boolean,\n ): Promise<void> {\n let sources: ioBroker.RepositoryJson;\n if (!repoUrlOrObject || !tools.isObject(repoUrlOrObject)) {\n try {\n sources = await getRepository({ repoName: repoUrlOrObject, objects: this.objects });\n } catch (e) {\n console.error(e.message);\n return this.processExit(e instanceof IoBrokerError ? e.code : e);\n }\n } else {\n sources = repoUrlOrObject;\n }\n\n let version: string;\n if (adapter.includes('@')) {\n const parts = adapter.split('@');\n adapter = parts[0];\n version = parts[1];\n } else {\n version = '';\n }\n if (version) {\n forceDowngrade = true;\n }\n\n /** Repository entry of this adapter */\n const repoAdapter = sources[adapter] as ioBroker.RepositoryJsonAdapterContent;\n\n // TODO: not really adapter object but close enough\n const finishUpgrade = async (name: string, ioPack?: ioBroker.AdapterObject): Promise<void> => {\n if (!ioPack) {\n const adapterDir = tools.getAdapterDir(name);\n\n if (!adapterDir) {\n console.error(`Cannot find io-package.json in ${adapterDir}`);\n return this.processExit(EXIT_CODES.MISSING_ADAPTER_FILES);\n }\n\n try {\n // close enough to an AdapterObject\n ioPack = fs.readJSONSync(path.join(adapterDir, 'io-package.json')) as ioBroker.AdapterObject;\n } catch {\n console.error(`Cannot find io-package.json in ${adapterDir}`);\n return this.processExit(EXIT_CODES.MISSING_ADAPTER_FILES);\n }\n }\n\n if (ioPack.common.osDependencies) {\n // install linux/osx libraries\n await this.install.installOSPackages(ioPack.common.osDependencies);\n }\n\n // Upload www and admin files of adapter\n await this.upload.uploadAdapter(name, false, true);\n // extend all adapter instance default configs with current config\n // (introduce potentially new attributes while keeping current settings)\n await this.upload.upgradeAdapterObjects(name, ioPack);\n await this.upload.uploadAdapter(name, true, true);\n };\n\n const adapterDir = tools.getAdapterDir(adapter);\n\n // Read the actual description of installed adapter with a version\n if (!adapterDir || (!version && !fs.existsSync(path.join(adapterDir, 'io-package.json')))) {\n return console.log(\n `Adapter \"${adapter}\"${\n adapter.length < 15 ? new Array(15 - adapter.length).join(' ') : ''\n } is not installed.`,\n );\n }\n // Get the url of io-package.json or direct the version\n if (!repoAdapter) {\n console.log(`Adapter \"${adapter}\" is not in the repository and cannot be updated.`);\n return this.processExit(EXIT_CODES.ADAPTER_NOT_FOUND);\n }\n if (repoAdapter.controller) {\n return console.log(\n `Cannot update ${adapter} using this command. Please use \"iobroker upgrade self\" instead!`,\n );\n }\n\n // TODO: not 100 % true but should be correct enough\n let ioInstalled: Pick<ioBroker.AdapterObject, 'common'>;\n if (adapterDir && fs.existsSync(path.join(adapterDir, 'io-package.json'))) {\n ioInstalled = fs.readJsonSync(`${adapterDir}/io-package.json`);\n } else {\n // @ts-expect-error https://github.com/ioBroker/adapter-core/issues/455\n ioInstalled = { common: { version: '0.0.0' } };\n }\n\n const installedVersion = ioInstalled.common.version;\n\n /**\n * We show changelog (news) and ask user if he really wants to upgrade but only if fd is associated with a tty, returns true if upgrade desired\n *\n * @param installedVersion - installed version of adapter\n * @param targetVersion - target version of adapter\n * @param adapterName - name of the adapter\n */\n const showUpgradeDialog = (installedVersion: string, targetVersion: string, adapterName: string): boolean => {\n // major upgrade or downgrade\n const isMajor = semver.major(installedVersion) !== semver.major(targetVersion);\n\n if (autoConfirm || (!tty.isatty(process.stdout.fd) && (!isMajor || !upgradeAll))) {\n // force flag or script on non-major or single adapter upgrade -> always upgrade\n return true;\n }\n\n if (!tty.isatty(process.stdout.fd) && isMajor && upgradeAll) {\n // no tty and not forced and multiple adapters, do not upgrade\n console.log(`Skip major upgrade of ${adapterName} from ${installedVersion} to ${targetVersion}`);\n return false;\n }\n\n const isUpgrade = semver.gt(targetVersion, installedVersion);\n const isDowngrade = semver.lt(targetVersion, installedVersion);\n\n // if information in repo files -> show news\n if (repoAdapter?.news) {\n const news = repoAdapter.news;\n\n let first = true;\n // check if upgrade or downgrade\n if (isUpgrade) {\n for (const version in news) {\n try {\n if (semver.lte(version, targetVersion) && semver.gt(version, installedVersion)) {\n if (first === true) {\n const noMissingNews = news[targetVersion] && news[installedVersion];\n console.log(\n `\\nThis upgrade of \"${adapter}\" will ${\n noMissingNews ? '' : 'at least '\n }introduce the following changes:`,\n );\n console.log(\n '==========================================================================',\n );\n first = false;\n } else if (first === false) {\n console.log();\n }\n console.log(`-> ${version}:`);\n console.log(news[version].en);\n }\n } catch {\n // ignore\n }\n }\n } else if (isDowngrade) {\n for (const version in news) {\n try {\n if (semver.gt(version, targetVersion) && semver.lte(version, installedVersion)) {\n if (first === true) {\n const noMissingNews = news[targetVersion] && news[installedVersion];\n console.log(\n `\\nThis downgrade of \"${adapter}\" will ${\n noMissingNews ? '' : 'at least '\n }remove the following changes:`,\n );\n console.log(\n '==========================================================================',\n );\n first = false;\n } else if (first === false) {\n console.log();\n }\n console.log(`-> ${version}`);\n console.log(news[version].en);\n }\n } catch {\n // ignore\n }\n }\n }\n if (first === false) {\n console.log('==========================================================================\\n');\n }\n }\n\n let answer;\n\n // ask user if he really wants to upgrade/downgrade/reinstall - repeat until (y)es or (n)o given\n do {\n if (isUpgrade || isDowngrade) {\n if (isMajor) {\n console.log(\n `BE CAREFUL: THIS IS A MAJOR ${\n isUpgrade ? 'UPGRADE' : 'DOWNGRADE'\n }, WHICH WILL MOST LIKELY INTRODUCE BREAKING CHANGES!`,\n );\n }\n answer = rl.question(\n `Would you like to ${\n isUpgrade ? 'upgrade' : 'downgrade'\n } ${adapter} from @${installedVersion} to @${\n version || repoAdapter.version\n } now? [(y)es, (n)o]: `,\n {\n defaultInput: 'n',\n },\n );\n } else {\n answer = rl.question(\n `Would you like to reinstall version ${\n version || repoAdapter.version\n } of ${adapter} now? [(y)es, (n)o]: `,\n {\n defaultInput: 'n',\n },\n );\n }\n\n answer = answer.toLowerCase();\n\n if (answer === 'n' || answer === 'no') {\n return false;\n }\n } while (answer !== 'y' && answer !== 'yes');\n return true;\n };\n\n // If a version is included in the repository\n if (repoAdapter.version) {\n if (!forceDowngrade) {\n try {\n await this._checkDependencies(repoAdapter.dependencies, repoAdapter.globalDependencies);\n } catch (e) {\n return console.error(`Cannot check dependencies: ${e.message}`);\n }\n }\n\n if (\n !forceDowngrade &&\n (repoAdapter.version === installedVersion || tools.upToDate(repoAdapter.version, installedVersion))\n ) {\n return console.log(\n `Adapter \"${adapter}\"${\n adapter.length < 15 ? new Array(15 - adapter.length).join(' ') : ''\n } is up to date.`,\n );\n }\n const targetVersion = version || repoAdapter.version;\n\n const isIgnored = await isVersionIgnored({\n adapterName: adapter,\n version: targetVersion,\n objects: this.objects,\n });\n\n if (isIgnored) {\n console.log(\n `No upgrade of \"${adapter}\" desired, because version \"${targetVersion}\" is configured to be ignored by the user. Run \"${tools.appNameLowerCase} version ${adapter} --recognize\" to allow this upgrade!`,\n );\n return;\n }\n\n try {\n if (!showUpgradeDialog(installedVersion, targetVersion, adapter)) {\n console.log(`No upgrade of \"${adapter}\" desired.`);\n return;\n }\n } catch (e) {\n console.log(`Can not check version information to display upgrade infos: ${e.message}`);\n }\n console.log(`Update ${adapter} from @${installedVersion} to @${targetVersion}`);\n const npmPacketName = `${tools.appNameLowerCase}.${adapter}`;\n\n try {\n if (!semver.diff(installedVersion, targetVersion)) {\n console.log(`Uninstall npm packet \"${npmPacketName}\" for a clean re-installation`);\n await tools.uninstallNodeModule(npmPacketName, { debug: process.argv.includes('--debug') });\n }\n } catch (e) {\n console.warn(`Could not uninstall npm packet \"${npmPacketName}\": ${e.message}`);\n }\n\n // Get the adapter from website\n const { packetName, stoppedList } = await this.install.downloadPacket(\n sources,\n `${adapter}@${targetVersion}`,\n );\n await finishUpgrade(packetName);\n await this.install.enableInstances(stoppedList, true);\n } else if (repoAdapter.meta) {\n // Read repository from url or file\n const ioPack = (await tools.getJsonAsync(repoAdapter.meta)) as ioBroker.AdapterObject;\n if (!ioPack) {\n console.error(`Cannot parse file${repoAdapter.meta}`);\n return;\n }\n\n if (!forceDowngrade) {\n try {\n // @ts-expect-error https://github.com/ioBroker/adapter-core/issues/455\n await this._checkDependencies(ioPack.common.dependencies, ioPack.common.globalDependencies);\n } catch (e) {\n console.error(`Cannot check dependencies: ${e.message}`);\n return;\n }\n }\n\n if (\n !version &&\n (ioPack.common.version === installedVersion ||\n (!forceDowngrade && tools.upToDate(ioPack.common.version, installedVersion)))\n ) {\n console.log(\n `Adapter \"${adapter}\"${\n adapter.length < 15 ? new Array(15 - adapter.length).join(' ') : ''\n } is up to date.`,\n );\n } else {\n // Get the adapter from website\n const targetVersion = version || ioPack.common.version;\n\n const isIgnored = await isVersionIgnored({\n adapterName: adapter,\n version: targetVersion,\n objects: this.objects,\n });\n\n if (isIgnored) {\n console.log(\n `No upgrade of \"${adapter}\" desired, because version \"${targetVersion}\" is configured to be ignored by the user. Run \"${tools.appNameLowerCase} version ${adapter} --recognize\" to allow this upgrade!`,\n );\n return;\n }\n\n try {\n if (!showUpgradeDialog(installedVersion, targetVersion, adapter)) {\n console.log(`No upgrade of \"${adapter}\" desired.`);\n return;\n }\n } catch (e) {\n console.log(`Can not check version information to display upgrade infos: ${e.message}`);\n }\n console.log(`Update ${adapter} from @${installedVersion} to @${targetVersion}`);\n const { packetName, stoppedList } = await this.install.downloadPacket(\n sources,\n `${adapter}@${targetVersion}`,\n );\n await finishUpgrade(packetName, ioPack);\n await this.install.enableInstances(stoppedList, true);\n }\n } else if (forceDowngrade) {\n try {\n if (!showUpgradeDialog(installedVersion, version, adapter)) {\n return console.log(`No upgrade of \"${adapter}\" desired.`);\n }\n } catch (e) {\n console.log(`Can not check version information to display upgrade infos: ${e.message}`);\n }\n console.warn(`Unable to get version for \"${adapter}\". Update anyway.`);\n console.log(`Update ${adapter} from @${installedVersion} to @${version}`);\n // Get the adapter from website\n const { packetName, stoppedList } = await this.install.downloadPacket(sources, `${adapter}@${version}`);\n await finishUpgrade(packetName);\n await this.install.enableInstances(stoppedList, true);\n } else {\n return console.error(`Unable to get version for \"${adapter}\".`);\n }\n }\n\n /**\n * Upgrade the js-controller\n *\n * @param options additional information like if controller running, optional url, version\n */\n async upgradeController(options: UpgradeControllerOptions): Promise<void> {\n const { repoUrl, forceDowngrade, controllerRunning, version } = options;\n let targetVersion = version;\n\n const installed = fs.readJSONSync(`${tools.getControllerDir()}/io-package.json`);\n if (!installed || !installed.common || !installed.common.version) {\n return console.error(\n `Host \"${this.hostname}\"${\n this.hostname.length < 15 ? ''.padStart(15 - this.hostname.length) : ''\n } is not installed.`,\n );\n }\n\n const controllerName = installed.common.name;\n let sources: ioBroker.RepositoryJson | undefined;\n\n if (targetVersion === undefined) {\n try {\n const result = await getRepository({ repoName: repoUrl, objects: this.objects });\n if (!result) {\n return console.warn(`Cannot get repository under \"${repoUrl}\"`);\n }\n sources = result;\n } catch (e) {\n console.error(e.message);\n return this.processExit(e instanceof IoBrokerError ? e.code : e);\n }\n\n /** Repository entry of the controller */\n const repoController = sources[controllerName] as ioBroker.RepositoryJsonAdapterContent;\n targetVersion = version ?? repoController.version;\n }\n\n if (!targetVersion) {\n // no info for controller\n return console.error(`Cannot find this controller \"${controllerName}\" in repository.`);\n }\n\n if (\n !forceDowngrade &&\n (targetVersion === installed.common.version || tools.upToDate(targetVersion, installed.common.version))\n ) {\n console.log(\n `Host \"${this.hostname}\"${\n this.hostname.length < 15 ? new Array(15 - this.hostname.length).join(' ') : ''\n } is up to date.`,\n );\n } else if (controllerRunning) {\n console.warn(`Controller is running. Please stop ioBroker first.`);\n } else {\n console.log(`Update ${controllerName} from @${installed.common.version} to @${targetVersion}`);\n // Get the controller from website\n await this.install.downloadPacket(sources, `${controllerName}@${targetVersion}`, {\n stopDb: true,\n });\n }\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import Debug from 'debug';\nimport fs from 'fs-extra';\nimport { tools, EXIT_CODES } from '@iobroker/js-controller-common';\nimport semver from 'semver';\nimport { Upload } from '@/lib/setup/setupUpload.js';\nimport { Install } from '@/lib/setup/setupInstall.js';\nimport rl from 'readline-sync';\nimport tty from 'node:tty';\nimport path from 'node:path';\nimport { getRepository, isVersionIgnored } from '@/lib/setup/utils.js';\nimport type { Client as ObjectsInRedisClient } from '@iobroker/db-objects-redis';\nimport type { Client as StatesInRedisClient } from '@iobroker/db-states-redis';\nimport type { ProcessExitCallback } from '@/lib/_Types.js';\nimport { IoBrokerError } from '@/lib/setup/customError.js';\n\nconst debug = Debug('iobroker:cli');\n\ntype IoPackDependencies = string[] | Record<string, any>[] | Record<string, any>;\n\ninterface CLIUpgradeOptions {\n processExit: ProcessExitCallback;\n objects: ObjectsInRedisClient;\n states: StatesInRedisClient;\n params: Record<string, any>;\n}\n\ninterface UpgradeControllerOptions {\n /** The repo or url */\n repoUrl?: string;\n /** If downgrades are allowed */\n forceDowngrade: boolean;\n /** If controller is currently running */\n controllerRunning: boolean;\n /** Version to upgrade controller too */\n version?: string;\n}\n\nexport class Upgrade {\n private readonly hostname = tools.getHostName();\n private readonly upload: Upload;\n private readonly install: Install;\n private readonly objects: ObjectsInRedisClient;\n private readonly processExit: ProcessExitCallback;\n\n constructor(options: CLIUpgradeOptions) {\n options = options || {};\n\n if (!options.processExit) {\n throw new Error('Invalid arguments: processExit is missing');\n }\n\n this.processExit = options.processExit;\n this.objects = options.objects;\n\n this.upload = new Upload(options);\n this.install = new Install(options);\n }\n\n /**\n * Sorts the adapters by their dependencies and then upgrades multiple adapters from the given repository url\n *\n * @param repo the repository content\n * @param list list of adapters to upgrade\n * @param forceDowngrade flag to force downgrade\n * @param autoConfirm automatically confirm the tty questions (bypass)\n */\n async upgradeAdapterHelper(\n repo: Record<string, any>,\n list: string[],\n forceDowngrade: boolean,\n autoConfirm: boolean,\n ): Promise<void> {\n const relevantAdapters = [];\n // check which adapters are upgradeable and sort them according to their dependencies\n for (const adapter of list) {\n if (repo[adapter].controller) {\n // skip controller\n continue;\n }\n const adapterDir = tools.getAdapterDir(adapter);\n if (adapterDir && fs.existsSync(path.join(adapterDir, 'io-package.json'))) {\n const ioInstalled = fs.readJsonSync(path.join(adapterDir, 'io-package.json'));\n if (!tools.upToDate(repo[adapter].version, ioInstalled.common.version)) {\n // not up to date, we need to put it into account for our dependency check\n relevantAdapters.push(adapter);\n }\n }\n }\n\n if (relevantAdapters.length) {\n const sortedAdapters = [];\n\n while (relevantAdapters.length) {\n let oneAdapterAdded = false;\n // create an ordered list for upgrades\n for (let i = relevantAdapters.length - 1; i >= 0; i--) {\n const relAdapter = relevantAdapters[i];\n // if a new version has no dependencies, we can upgrade\n if (!repo[relAdapter].dependencies && !repo[relAdapter].globalDependencies) {\n // no deps, simply add it\n sortedAdapters.push(relAdapter);\n relevantAdapters.splice(relevantAdapters.indexOf(relAdapter), 1);\n oneAdapterAdded = true;\n } else {\n const allDeps: Record<string, string> = {\n ...tools.parseDependencies(repo[relAdapter].dependencies),\n ...tools.parseDependencies(repo[relAdapter].globalDependencies),\n };\n\n // we have to check if the deps are there\n let conflict = false;\n for (const [depName, version] of Object.entries(allDeps)) {\n debug(`adapter \"${relAdapter}\" has dependency \"${depName}\": \"${version}\"`);\n if (version !== '*') {\n // dependency is important because it affects the version range\n if (relevantAdapters.includes(depName)) {\n // the dependency is also in the upgrade list and not previously added, we should add the dependency first\n debug(`conflict for dependency \"${depName}\" at adapter \"${relAdapter}\"`);\n conflict = true;\n break;\n }\n }\n }\n // we reached here and no conflict, so every dep is satisfied\n if (!conflict) {\n sortedAdapters.push(relAdapter);\n relevantAdapters.splice(relevantAdapters.indexOf(relAdapter), 1);\n oneAdapterAdded = true;\n }\n }\n }\n\n if (!oneAdapterAdded) {\n // no adapter during this loop -> circular dependency\n console.warn(`Circular dependency detected between adapters \"${relevantAdapters.join(', ')}\"`);\n sortedAdapters.concat(relevantAdapters);\n break; // however, break and try to update\n }\n }\n\n debug(`upgrade order is \"${sortedAdapters.join(', ')}\"`);\n\n for (const sortedAdapter of sortedAdapters) {\n if (repo[sortedAdapter]?.controller) {\n continue;\n }\n await this.upgradeAdapter(repo, sortedAdapter, forceDowngrade, autoConfirm, true);\n }\n } else {\n console.log('All adapters are up to date');\n }\n }\n\n /**\n * Checks that local and global deps are fulfilled else rejects promise\n *\n * @param deps local dependencies - required on this host\n * @param globalDeps global dependencies - required on one of the hosts\n */\n private async _checkDependencies(deps: IoPackDependencies, globalDeps: IoPackDependencies): Promise<void> {\n if (!deps && !globalDeps) {\n return Promise.resolve();\n }\n\n deps = tools.parseDependencies(deps);\n globalDeps = tools.parseDependencies(globalDeps);\n // combine both dependencies\n const allDeps = { ...deps, ...globalDeps };\n\n // Get all installed adapters\n const objs = await this.objects.getObjectViewAsync(\n 'system',\n 'instance',\n {\n startkey: 'system.adapter.',\n endkey: 'system.adapter.\\u9999',\n },\n undefined,\n );\n\n if (objs?.rows?.length) {\n for (const dName in allDeps) {\n if (dName === 'js-controller') {\n const version = allDeps[dName];\n // Check only if version not *, else we don't have to read io-pack unnecessarily\n if (version !== '*') {\n const iopkg_ = fs.readJSONSync(`${tools.getControllerDir()}/package.json`);\n try {\n if (!semver.satisfies(iopkg_.version, version, { includePrerelease: true })) {\n return Promise.reject(\n new Error(\n `Invalid version of \"${dName}\". Installed \"${iopkg_.version}\", required \"${version}`,\n ),\n );\n }\n } catch (e) {\n console.log(`Can not check js-controller dependency requirement: ${e.message}`);\n return Promise.reject(\n new Error(\n `Invalid version of \"${dName}\". Installed \"${iopkg_.version}\", required \"${version}`,\n ),\n );\n }\n }\n } else {\n let gInstances: ioBroker.GetObjectViewItem<ioBroker.InstanceObject>[] = [];\n let locInstances: ioBroker.GetObjectViewItem<ioBroker.InstanceObject>[] = [];\n // if global dep get all instances of adapter\n if (globalDeps[dName] !== undefined) {\n gInstances = objs.rows.filter(obj => obj.value.common && obj.value.common.name === dName);\n }\n if (deps[dName] !== undefined) {\n // local dependencies: get all instances on the same host\n locInstances = objs.rows.filter(\n obj =>\n obj.value.common &&\n obj.value.common.name === dName &&\n obj.value.common.host === this.hostname,\n );\n if (locInstances.length === 0) {\n return Promise.reject(new Error(`Required dependency \"${dName}\" not found on this host.`));\n }\n }\n\n let isFound = false;\n // we check that all instances match - respect different local and global dep versions\n for (const instance of locInstances) {\n const instanceVersion = instance.value.common.version;\n try {\n if (\n !semver.satisfies(instanceVersion, deps[dName], {\n includePrerelease: true,\n })\n ) {\n return Promise.reject(\n new Error(\n `Invalid version of \"${dName}\". Installed \"${instanceVersion}\", required \"${deps[dName]}`,\n ),\n );\n }\n } catch (e) {\n console.log(`Can not check dependency requirement: ${e.message}`);\n return Promise.reject(\n new Error(\n `Invalid version of \"${dName}\". Installed \"${instanceVersion}\", required \"${deps[dName]}`,\n ),\n );\n }\n isFound = true;\n }\n\n for (const instance of gInstances) {\n const instanceVersion = instance.value.common.version;\n try {\n if (\n !semver.satisfies(instanceVersion, globalDeps[dName], {\n includePrerelease: true,\n })\n ) {\n return Promise.reject(\n new Error(\n `Invalid version of \"${dName}\". Installed \"${instanceVersion}\", required \"${globalDeps[dName]}`,\n ),\n );\n }\n } catch (e) {\n console.log(`Can not check dependency requirement: ${e.message}`);\n return Promise.reject(\n new Error(\n `Invalid version of \"${dName}\". Installed \"${instanceVersion}\", required \"${globalDeps[dName]}`,\n ),\n );\n }\n isFound = true;\n }\n\n if (isFound === false) {\n return Promise.reject(new Error(`Required dependency \"${dName}\" not found.`));\n }\n }\n }\n }\n }\n\n /**\n * Try to async upgrade adapter from a given source with some checks\n *\n * @param repoUrlOrObject url of the selected repository or parsed repo, if undefined, use current active repository\n * @param adapter name of the adapter (can also include version like web@3.0.0)\n * @param forceDowngrade flag to force downgrade\n * @param autoConfirm automatically confirm the tty questions (bypass)\n * @param upgradeAll if true, this is an upgrade all call, we don't do major upgrades if no tty\n */\n async upgradeAdapter(\n repoUrlOrObject: string | Record<string, any> | undefined,\n adapter: string,\n forceDowngrade: boolean,\n autoConfirm: boolean,\n upgradeAll: boolean,\n ): Promise<void> {\n let sources: Record<string, any>;\n if (!repoUrlOrObject || !tools.isObject(repoUrlOrObject)) {\n try {\n sources = await getRepository({ repoName: repoUrlOrObject, objects: this.objects });\n } catch (e) {\n console.error(e.message);\n return this.processExit(e instanceof IoBrokerError ? e.code : e);\n }\n } else {\n sources = repoUrlOrObject;\n }\n\n let version: string;\n if (adapter.includes('@')) {\n const parts = adapter.split('@');\n adapter = parts[0];\n version = parts[1];\n } else {\n version = '';\n }\n if (version) {\n forceDowngrade = true;\n }\n\n /** Repository entry of this adapter */\n const repoAdapter: Record<string, any> = sources[adapter];\n\n // TODO: not really adapter object but close enough\n const finishUpgrade = async (name: string, ioPack?: ioBroker.AdapterObject): Promise<void> => {\n if (!ioPack) {\n const adapterDir = tools.getAdapterDir(name);\n\n if (!adapterDir) {\n console.error(`Cannot find io-package.json in ${adapterDir}`);\n return this.processExit(EXIT_CODES.MISSING_ADAPTER_FILES);\n }\n\n try {\n // close enough to an AdapterObject\n ioPack = fs.readJSONSync(path.join(adapterDir, 'io-package.json')) as ioBroker.AdapterObject;\n } catch {\n console.error(`Cannot find io-package.json in ${adapterDir}`);\n return this.processExit(EXIT_CODES.MISSING_ADAPTER_FILES);\n }\n }\n\n if (ioPack.common.osDependencies) {\n // install linux/osx libraries\n await this.install.installOSPackages(ioPack.common.osDependencies);\n }\n\n // Upload www and admin files of adapter\n await this.upload.uploadAdapter(name, false, true);\n // extend all adapter instance default configs with current config\n // (introduce potentially new attributes while keeping current settings)\n await this.upload.upgradeAdapterObjects(name, ioPack);\n await this.upload.uploadAdapter(name, true, true);\n };\n\n const adapterDir = tools.getAdapterDir(adapter);\n\n // Read the actual description of installed adapter with a version\n if (!adapterDir || (!version && !fs.existsSync(path.join(adapterDir, 'io-package.json')))) {\n return console.log(\n `Adapter \"${adapter}\"${\n adapter.length < 15 ? new Array(15 - adapter.length).join(' ') : ''\n } is not installed.`,\n );\n }\n // Get the url of io-package.json or direct the version\n if (!repoAdapter) {\n console.log(`Adapter \"${adapter}\" is not in the repository and cannot be updated.`);\n return this.processExit(EXIT_CODES.ADAPTER_NOT_FOUND);\n }\n if (repoAdapter.controller) {\n return console.log(\n `Cannot update ${adapter} using this command. Please use \"iobroker upgrade self\" instead!`,\n );\n }\n\n // TODO: not 100 % true but should be correct enough\n let ioInstalled: Pick<ioBroker.AdapterObject, 'common'>;\n if (adapterDir && fs.existsSync(path.join(adapterDir, 'io-package.json'))) {\n ioInstalled = fs.readJsonSync(`${adapterDir}/io-package.json`);\n } else {\n // @ts-expect-error https://github.com/ioBroker/adapter-core/issues/455\n ioInstalled = { common: { version: '0.0.0' } };\n }\n\n const installedVersion = ioInstalled.common.version;\n\n /**\n * We show changelog (news) and ask user if he really wants to upgrade but only if fd is associated with a tty, returns true if upgrade desired\n *\n * @param installedVersion - installed version of adapter\n * @param targetVersion - target version of adapter\n * @param adapterName - name of the adapter\n */\n const showUpgradeDialog = (installedVersion: string, targetVersion: string, adapterName: string): boolean => {\n // major upgrade or downgrade\n const isMajor = semver.major(installedVersion) !== semver.major(targetVersion);\n\n if (autoConfirm || (!tty.isatty(process.stdout.fd) && (!isMajor || !upgradeAll))) {\n // force flag or script on non-major or single adapter upgrade -> always upgrade\n return true;\n }\n\n if (!tty.isatty(process.stdout.fd) && isMajor && upgradeAll) {\n // no tty and not forced and multiple adapters, do not upgrade\n console.log(`Skip major upgrade of ${adapterName} from ${installedVersion} to ${targetVersion}`);\n return false;\n }\n\n const isUpgrade = semver.gt(targetVersion, installedVersion);\n const isDowngrade = semver.lt(targetVersion, installedVersion);\n\n // if information in repo files -> show news\n if (repoAdapter?.news) {\n const news = repoAdapter.news;\n\n let first = true;\n // check if upgrade or downgrade\n if (isUpgrade) {\n for (const version in news) {\n try {\n if (semver.lte(version, targetVersion) && semver.gt(version, installedVersion)) {\n if (first === true) {\n const noMissingNews = news[targetVersion] && news[installedVersion];\n console.log(\n `\\nThis upgrade of \"${adapter}\" will ${\n noMissingNews ? '' : 'at least '\n }introduce the following changes:`,\n );\n console.log(\n '==========================================================================',\n );\n first = false;\n } else if (first === false) {\n console.log();\n }\n console.log(`-> ${version}:`);\n console.log(news[version].en);\n }\n } catch {\n // ignore\n }\n }\n } else if (isDowngrade) {\n for (const version in news) {\n try {\n if (semver.gt(version, targetVersion) && semver.lte(version, installedVersion)) {\n if (first === true) {\n const noMissingNews = news[targetVersion] && news[installedVersion];\n console.log(\n `\\nThis downgrade of \"${adapter}\" will ${\n noMissingNews ? '' : 'at least '\n }remove the following changes:`,\n );\n console.log(\n '==========================================================================',\n );\n first = false;\n } else if (first === false) {\n console.log();\n }\n console.log(`-> ${version}`);\n console.log(news[version].en);\n }\n } catch {\n // ignore\n }\n }\n }\n if (first === false) {\n console.log('==========================================================================\\n');\n }\n }\n\n let answer;\n\n // ask user if he really wants to upgrade/downgrade/reinstall - repeat until (y)es or (n)o given\n do {\n if (isUpgrade || isDowngrade) {\n if (isMajor) {\n console.log(\n `BE CAREFUL: THIS IS A MAJOR ${\n isUpgrade ? 'UPGRADE' : 'DOWNGRADE'\n }, WHICH WILL MOST LIKELY INTRODUCE BREAKING CHANGES!`,\n );\n }\n answer = rl.question(\n `Would you like to ${\n isUpgrade ? 'upgrade' : 'downgrade'\n } ${adapter} from @${installedVersion} to @${\n version || repoAdapter.version\n } now? [(y)es, (n)o]: `,\n {\n defaultInput: 'n',\n },\n );\n } else {\n answer = rl.question(\n `Would you like to reinstall version ${\n version || repoAdapter.version\n } of ${adapter} now? [(y)es, (n)o]: `,\n {\n defaultInput: 'n',\n },\n );\n }\n\n answer = answer.toLowerCase();\n\n if (answer === 'n' || answer === 'no') {\n return false;\n }\n } while (answer !== 'y' && answer !== 'yes');\n return true;\n };\n\n // If a version is included in the repository\n if (repoAdapter.version) {\n if (!forceDowngrade) {\n try {\n await this._checkDependencies(repoAdapter.dependencies, repoAdapter.globalDependencies);\n } catch (e) {\n return console.error(`Cannot check dependencies: ${e.message}`);\n }\n }\n\n if (\n !forceDowngrade &&\n (repoAdapter.version === installedVersion || tools.upToDate(repoAdapter.version, installedVersion))\n ) {\n return console.log(\n `Adapter \"${adapter}\"${\n adapter.length < 15 ? new Array(15 - adapter.length).join(' ') : ''\n } is up to date.`,\n );\n }\n const targetVersion = version || repoAdapter.version;\n\n const isIgnored = await isVersionIgnored({\n adapterName: adapter,\n version: targetVersion,\n objects: this.objects,\n });\n\n if (isIgnored) {\n console.log(\n `No upgrade of \"${adapter}\" desired, because version \"${targetVersion}\" is configured to be ignored by the user. Run \"${tools.appNameLowerCase} version ${adapter} --recognize\" to allow this upgrade!`,\n );\n return;\n }\n\n try {\n if (!showUpgradeDialog(installedVersion, targetVersion, adapter)) {\n console.log(`No upgrade of \"${adapter}\" desired.`);\n return;\n }\n } catch (e) {\n console.log(`Can not check version information to display upgrade infos: ${e.message}`);\n }\n console.log(`Update ${adapter} from @${installedVersion} to @${targetVersion}`);\n const npmPacketName = `${tools.appNameLowerCase}.${adapter}`;\n\n try {\n if (!semver.diff(installedVersion, targetVersion)) {\n console.log(`Uninstall npm packet \"${npmPacketName}\" for a clean re-installation`);\n await tools.uninstallNodeModule(npmPacketName, { debug: process.argv.includes('--debug') });\n }\n } catch (e) {\n console.warn(`Could not uninstall npm packet \"${npmPacketName}\": ${e.message}`);\n }\n\n // Get the adapter from website\n const { packetName, stoppedList } = await this.install.downloadPacket(\n sources,\n `${adapter}@${targetVersion}`,\n );\n await finishUpgrade(packetName);\n await this.install.enableInstances(stoppedList, true);\n } else if (repoAdapter.meta) {\n // Read repository from url or file\n const ioPack = (await tools.getJsonAsync(repoAdapter.meta)) as ioBroker.AdapterObject;\n if (!ioPack) {\n console.error(`Cannot parse file${repoAdapter.meta}`);\n return;\n }\n\n if (!forceDowngrade) {\n try {\n // @ts-expect-error https://github.com/ioBroker/adapter-core/issues/455\n await this._checkDependencies(ioPack.common.dependencies, ioPack.common.globalDependencies);\n } catch (e) {\n console.error(`Cannot check dependencies: ${e.message}`);\n return;\n }\n }\n\n if (\n !version &&\n (ioPack.common.version === installedVersion ||\n (!forceDowngrade && tools.upToDate(ioPack.common.version, installedVersion)))\n ) {\n console.log(\n `Adapter \"${adapter}\"${\n adapter.length < 15 ? new Array(15 - adapter.length).join(' ') : ''\n } is up to date.`,\n );\n } else {\n // Get the adapter from website\n const targetVersion = version || ioPack.common.version;\n\n const isIgnored = await isVersionIgnored({\n adapterName: adapter,\n version: targetVersion,\n objects: this.objects,\n });\n\n if (isIgnored) {\n console.log(\n `No upgrade of \"${adapter}\" desired, because version \"${targetVersion}\" is configured to be ignored by the user. Run \"${tools.appNameLowerCase} version ${adapter} --recognize\" to allow this upgrade!`,\n );\n return;\n }\n\n try {\n if (!showUpgradeDialog(installedVersion, targetVersion, adapter)) {\n console.log(`No upgrade of \"${adapter}\" desired.`);\n return;\n }\n } catch (e) {\n console.log(`Can not check version information to display upgrade infos: ${e.message}`);\n }\n console.log(`Update ${adapter} from @${installedVersion} to @${targetVersion}`);\n const { packetName, stoppedList } = await this.install.downloadPacket(\n sources,\n `${adapter}@${targetVersion}`,\n );\n await finishUpgrade(packetName, ioPack);\n await this.install.enableInstances(stoppedList, true);\n }\n } else if (forceDowngrade) {\n try {\n if (!showUpgradeDialog(installedVersion, version, adapter)) {\n return console.log(`No upgrade of \"${adapter}\" desired.`);\n }\n } catch (e) {\n console.log(`Can not check version information to display upgrade infos: ${e.message}`);\n }\n console.warn(`Unable to get version for \"${adapter}\". Update anyway.`);\n console.log(`Update ${adapter} from @${installedVersion} to @${version}`);\n // Get the adapter from website\n const { packetName, stoppedList } = await this.install.downloadPacket(sources, `${adapter}@${version}`);\n await finishUpgrade(packetName);\n await this.install.enableInstances(stoppedList, true);\n } else {\n return console.error(`Unable to get version for \"${adapter}\".`);\n }\n }\n\n /**\n * Upgrade the js-controller\n *\n * @param options additional information like if controller running, optional url, version\n */\n async upgradeController(options: UpgradeControllerOptions): Promise<void> {\n const { repoUrl, forceDowngrade, controllerRunning, version } = options;\n let targetVersion = version;\n\n const installed = fs.readJSONSync(`${tools.getControllerDir()}/io-package.json`);\n if (!installed || !installed.common || !installed.common.version) {\n return console.error(\n `Host \"${this.hostname}\"${\n this.hostname.length < 15 ? ''.padStart(15 - this.hostname.length) : ''\n } is not installed.`,\n );\n }\n\n const controllerName = installed.common.name;\n let sources: Record<string, ioBroker.RepositoryJsonAdapterContent> | undefined;\n\n if (targetVersion === undefined) {\n try {\n const result = await getRepository({ repoName: repoUrl, objects: this.objects });\n if (!result) {\n return console.warn(`Cannot get repository under \"${repoUrl}\"`);\n }\n sources = result;\n } catch (e) {\n console.error(e.message);\n return this.processExit(e instanceof IoBrokerError ? e.code : e);\n }\n\n /** Repository entry of the controller */\n const repoController = sources[controllerName];\n targetVersion = version ?? repoController.version;\n }\n\n if (!targetVersion) {\n // no info for controller\n return console.error(`Cannot find this controller \"${controllerName}\" in repository.`);\n }\n\n if (\n !forceDowngrade &&\n (targetVersion === installed.common.version || tools.upToDate(targetVersion, installed.common.version))\n ) {\n console.log(\n `Host \"${this.hostname}\"${\n this.hostname.length < 15 ? new Array(15 - this.hostname.length).join(' ') : ''\n } is up to date.`,\n );\n } else if (controllerRunning) {\n console.warn(`Controller is running. Please stop ioBroker first.`);\n } else {\n console.log(`Update ${controllerName} from @${installed.common.version} to @${targetVersion}`);\n // Get the controller from website\n await this.install.downloadPacket(sources, `${controllerName}@${targetVersion}`, {\n stopDb: true,\n });\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["Debug", "fs", "path", "semver", "adapterDir", "installedVersion", "tty", "version", "rl"]
|
|
7
7
|
}
|
|
@@ -9,11 +9,8 @@
|
|
|
9
9
|
import type { Client as StatesRedisClient } from '@iobroker/db-states-redis';
|
|
10
10
|
import type { Client as ObjectsRedisClient } from '@iobroker/db-objects-redis';
|
|
11
11
|
import type { InternalLogger } from '@iobroker/js-controller-common-db/tools';
|
|
12
|
-
/** Options for the upload command */
|
|
13
12
|
export interface CLIUploadOptions {
|
|
14
|
-
/** The states database client */
|
|
15
13
|
states: StatesRedisClient;
|
|
16
|
-
/** The objects database client */
|
|
17
14
|
objects: ObjectsRedisClient;
|
|
18
15
|
}
|
|
19
16
|
interface File {
|
|
@@ -25,9 +22,6 @@ interface Logger extends InternalLogger {
|
|
|
25
22
|
}
|
|
26
23
|
/** Logger without noisy levels */
|
|
27
24
|
type MinimalLogger = Omit<Logger, 'info' | 'silly' | 'debug'>;
|
|
28
|
-
/**
|
|
29
|
-
* CLI command to upload adapter files into the objects database
|
|
30
|
-
*/
|
|
31
25
|
export declare class Upload {
|
|
32
26
|
private readonly states;
|
|
33
27
|
private readonly objects;
|
|
@@ -36,42 +30,11 @@ export declare class Upload {
|
|
|
36
30
|
private readonly sendToHostFromCliAsync;
|
|
37
31
|
private callbacks;
|
|
38
32
|
private lastProgressUpdate;
|
|
39
|
-
/**
|
|
40
|
-
* @param _options The states and objects database clients
|
|
41
|
-
*/
|
|
42
33
|
constructor(_options: CLIUploadOptions);
|
|
43
|
-
/**
|
|
44
|
-
* Filter the given hosts to those that are currently alive
|
|
45
|
-
*
|
|
46
|
-
* @param hosts The hosts to check
|
|
47
|
-
*/
|
|
48
34
|
checkHostsIfAlive(hosts: string[]): Promise<string[]>;
|
|
49
|
-
/**
|
|
50
|
-
* Get the list of known hosts
|
|
51
|
-
*
|
|
52
|
-
* @param onlyAlive Whether to only return hosts that are currently alive
|
|
53
|
-
*/
|
|
54
35
|
getHosts(onlyAlive: boolean): Promise<string[]>;
|
|
55
|
-
/**
|
|
56
|
-
* Check if some adapters must be restarted because of the given adapter's files and restart them
|
|
57
|
-
*
|
|
58
|
-
* @param adapter The adapter whose dependents should be restarted
|
|
59
|
-
*/
|
|
60
36
|
checkRestartOther(adapter: string): Promise<void>;
|
|
61
|
-
/**
|
|
62
|
-
* Send a message to a host from the CLI
|
|
63
|
-
*
|
|
64
|
-
* @param host The target host id
|
|
65
|
-
* @param command The command to send
|
|
66
|
-
* @param message The message payload
|
|
67
|
-
* @param callback Called with the host's response
|
|
68
|
-
*/
|
|
69
37
|
sendToHostFromCli(host: string, command: string, message: ioBroker.MessagePayload, callback: ioBroker.MessageCallback | null): void;
|
|
70
|
-
/**
|
|
71
|
-
* Upload the files of all given adapters from every host
|
|
72
|
-
*
|
|
73
|
-
* @param adapters The adapters to upload
|
|
74
|
-
*/
|
|
75
38
|
uploadAdapterFullAsync(adapters: string[]): Promise<void>;
|
|
76
39
|
/**
|
|
77
40
|
* Uploads a file
|
|
@@ -80,13 +43,7 @@ export declare class Upload {
|
|
|
80
43
|
* @param target target path
|
|
81
44
|
*/
|
|
82
45
|
uploadFile(source: string, target: string): Promise<string>;
|
|
83
|
-
|
|
84
|
-
* Delete the given files from the objects database
|
|
85
|
-
*
|
|
86
|
-
* @param files The files to delete
|
|
87
|
-
* @param logger Logger used to report errors
|
|
88
|
-
*/
|
|
89
|
-
eraseFiles(files: File[], logger: MinimalLogger | typeof console): Promise<void>;
|
|
46
|
+
eraseFiles(files: any[], logger: MinimalLogger | typeof console): Promise<void>;
|
|
90
47
|
/**
|
|
91
48
|
* Collect Files of an adapter specific directory from the ioBroker storage
|
|
92
49
|
*
|
|
@@ -98,22 +55,7 @@ export declare class Upload {
|
|
|
98
55
|
filesToDelete: File[];
|
|
99
56
|
dirs: File[];
|
|
100
57
|
}>;
|
|
101
|
-
/**
|
|
102
|
-
* Upload the files of a single adapter into the objects database
|
|
103
|
-
*
|
|
104
|
-
* @param adapter The adapter whose files are uploaded
|
|
105
|
-
* @param isAdmin Whether the admin files should be uploaded
|
|
106
|
-
* @param files The files to upload
|
|
107
|
-
* @param id The upload state id used to report progress
|
|
108
|
-
* @param logger Logger used to report progress
|
|
109
|
-
*/
|
|
110
58
|
upload(adapter: string, isAdmin: boolean, files: string[], id: string, logger: MinimalLogger | typeof console): Promise<string>;
|
|
111
|
-
/**
|
|
112
|
-
* Recursively collect all file paths below the given directory
|
|
113
|
-
*
|
|
114
|
-
* @param dir The directory to walk
|
|
115
|
-
* @param _results Accumulator of results collected so far
|
|
116
|
-
*/
|
|
117
59
|
walk(dir: string, _results?: string[]): string[];
|
|
118
60
|
/**
|
|
119
61
|
* Upload given adapter
|
|
@@ -125,20 +67,7 @@ export declare class Upload {
|
|
|
125
67
|
* @param _logger logger instance
|
|
126
68
|
*/
|
|
127
69
|
uploadAdapter(adapter: string, isAdmin: boolean, forceUpload: boolean, subTree?: string, _logger?: MinimalLogger): Promise<string>;
|
|
128
|
-
/**
|
|
129
|
-
* Deep-merge additional values into the native section of an object
|
|
130
|
-
*
|
|
131
|
-
* @param target The target object to extend
|
|
132
|
-
* @param additional The additional values to merge in
|
|
133
|
-
*/
|
|
134
70
|
extendNative(target: Record<string, any>, additional: Record<string, unknown>): Record<string, any>;
|
|
135
|
-
/**
|
|
136
|
-
* Merge additional values into the common section of an instance object, preserving some attributes
|
|
137
|
-
*
|
|
138
|
-
* @param target The target common object to extend
|
|
139
|
-
* @param additional The additional values to merge in
|
|
140
|
-
* @param instance The instance id the common belongs to
|
|
141
|
-
*/
|
|
142
71
|
extendCommon(target: Record<string, any>, additional: Record<string, any>, instance: string): ioBroker.InstanceCommon;
|
|
143
72
|
/**
|
|
144
73
|
* Extends the `system.instance.adapter.<instanceNumber>` objects with the native properties from adapters io-package.json
|
|
@@ -5,7 +5,6 @@ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
|
5
5
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
6
|
var __getProtoOf = Object.getPrototypeOf;
|
|
7
7
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
-
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
9
8
|
var __export = (target, all) => {
|
|
10
9
|
for (var name in all)
|
|
11
10
|
__defProp(target, name, { get: all[name], enumerable: true });
|
|
@@ -41,9 +40,6 @@ var import_mime_types = __toESM(require("mime-types"), 1);
|
|
|
41
40
|
var import_node_path = require("node:path");
|
|
42
41
|
const hostname = import_js_controller_common.tools.getHostName();
|
|
43
42
|
class Upload {
|
|
44
|
-
static {
|
|
45
|
-
__name(this, "Upload");
|
|
46
|
-
}
|
|
47
43
|
states;
|
|
48
44
|
objects;
|
|
49
45
|
regApp = new RegExp(`/${import_js_controller_common.tools.appName.replace(/\./g, "\\.")}\\.`, "i");
|
|
@@ -51,9 +47,6 @@ class Upload {
|
|
|
51
47
|
sendToHostFromCliAsync;
|
|
52
48
|
callbacks = {};
|
|
53
49
|
lastProgressUpdate = Date.now();
|
|
54
|
-
/**
|
|
55
|
-
* @param _options The states and objects database clients
|
|
56
|
-
*/
|
|
57
50
|
constructor(_options) {
|
|
58
51
|
const options = _options || {};
|
|
59
52
|
if (!options.states) {
|
|
@@ -66,11 +59,6 @@ class Upload {
|
|
|
66
59
|
this.objects = options.objects;
|
|
67
60
|
this.sendToHostFromCliAsync = import_js_controller_common.tools.promisifyNoError(this.sendToHostFromCli);
|
|
68
61
|
}
|
|
69
|
-
/**
|
|
70
|
-
* Filter the given hosts to those that are currently alive
|
|
71
|
-
*
|
|
72
|
-
* @param hosts The hosts to check
|
|
73
|
-
*/
|
|
74
62
|
async checkHostsIfAlive(hosts) {
|
|
75
63
|
const result = [];
|
|
76
64
|
if (hosts) {
|
|
@@ -83,11 +71,6 @@ class Upload {
|
|
|
83
71
|
}
|
|
84
72
|
return result;
|
|
85
73
|
}
|
|
86
|
-
/**
|
|
87
|
-
* Get the list of known hosts
|
|
88
|
-
*
|
|
89
|
-
* @param onlyAlive Whether to only return hosts that are currently alive
|
|
90
|
-
*/
|
|
91
74
|
async getHosts(onlyAlive) {
|
|
92
75
|
const hosts = [];
|
|
93
76
|
try {
|
|
@@ -111,11 +94,7 @@ class Upload {
|
|
|
111
94
|
}
|
|
112
95
|
return hosts;
|
|
113
96
|
}
|
|
114
|
-
|
|
115
|
-
* Check if some adapters must be restarted because of the given adapter's files and restart them
|
|
116
|
-
*
|
|
117
|
-
* @param adapter The adapter whose dependents should be restarted
|
|
118
|
-
*/
|
|
97
|
+
// Check if some adapters must be restarted and restart them
|
|
119
98
|
async checkRestartOther(adapter) {
|
|
120
99
|
const adapterDir = import_js_controller_common.tools.getAdapterDir(adapter);
|
|
121
100
|
if (!adapterDir) {
|
|
@@ -158,14 +137,6 @@ class Upload {
|
|
|
158
137
|
console.error(`Cannot parse ${adapterDir}/io-package.json: ${e.message}`);
|
|
159
138
|
}
|
|
160
139
|
}
|
|
161
|
-
/**
|
|
162
|
-
* Send a message to a host from the CLI
|
|
163
|
-
*
|
|
164
|
-
* @param host The target host id
|
|
165
|
-
* @param command The command to send
|
|
166
|
-
* @param message The message payload
|
|
167
|
-
* @param callback Called with the host's response
|
|
168
|
-
*/
|
|
169
140
|
sendToHostFromCli(host, command, message, callback) {
|
|
170
141
|
const time = Date.now();
|
|
171
142
|
const from = `system.host.${hostname}_cli_${time}`;
|
|
@@ -174,7 +145,7 @@ class Upload {
|
|
|
174
145
|
callback();
|
|
175
146
|
}
|
|
176
147
|
callback = null;
|
|
177
|
-
this.states.unsubscribeMessage(from)
|
|
148
|
+
this.states.unsubscribeMessage(from);
|
|
178
149
|
this.states.onChange = null;
|
|
179
150
|
}, 6e4);
|
|
180
151
|
this.states.onChange = (id, msg) => {
|
|
@@ -185,7 +156,7 @@ class Upload {
|
|
|
185
156
|
callback(msg && msg.message);
|
|
186
157
|
callback = null;
|
|
187
158
|
clearTimeout(timeout);
|
|
188
|
-
this.states.unsubscribeMessage(from)
|
|
159
|
+
this.states.unsubscribeMessage(from);
|
|
189
160
|
this.states.onChange = null;
|
|
190
161
|
}
|
|
191
162
|
}
|
|
@@ -206,14 +177,9 @@ class Upload {
|
|
|
206
177
|
this.callbackId = 1;
|
|
207
178
|
}
|
|
208
179
|
this.callbacks[`_${obj.callback.id}`] = { cb: callback };
|
|
209
|
-
this.states.pushMessage(host, obj)
|
|
180
|
+
this.states.pushMessage(host, obj);
|
|
210
181
|
});
|
|
211
182
|
}
|
|
212
|
-
/**
|
|
213
|
-
* Upload the files of all given adapters from every host
|
|
214
|
-
*
|
|
215
|
-
* @param adapters The adapters to upload
|
|
216
|
-
*/
|
|
217
183
|
async uploadAdapterFullAsync(adapters) {
|
|
218
184
|
if (adapters?.length) {
|
|
219
185
|
const liveHosts = await this.getHosts(true);
|
|
@@ -273,7 +239,7 @@ class Upload {
|
|
|
273
239
|
try {
|
|
274
240
|
const result = await (0, import_axios.default)(source, {
|
|
275
241
|
responseType: "arraybuffer",
|
|
276
|
-
validateStatus:
|
|
242
|
+
validateStatus: (status) => status === 200
|
|
277
243
|
});
|
|
278
244
|
if (result?.data) {
|
|
279
245
|
await this.objects.writeFileAsync(adapter, target, result.data);
|
|
@@ -303,14 +269,8 @@ class Upload {
|
|
|
303
269
|
}
|
|
304
270
|
return `${adapter}/${target}`;
|
|
305
271
|
}
|
|
306
|
-
/**
|
|
307
|
-
* Delete the given files from the objects database
|
|
308
|
-
*
|
|
309
|
-
* @param files The files to delete
|
|
310
|
-
* @param logger Logger used to report errors
|
|
311
|
-
*/
|
|
312
272
|
async eraseFiles(files, logger) {
|
|
313
|
-
if (files
|
|
273
|
+
if (files && files.length) {
|
|
314
274
|
for (const file of files) {
|
|
315
275
|
try {
|
|
316
276
|
await this.objects.unlinkAsync(file.adapter, file.path);
|
|
@@ -362,15 +322,6 @@ class Upload {
|
|
|
362
322
|
}
|
|
363
323
|
return { filesToDelete: _files, dirs: _dirs };
|
|
364
324
|
}
|
|
365
|
-
/**
|
|
366
|
-
* Upload the files of a single adapter into the objects database
|
|
367
|
-
*
|
|
368
|
-
* @param adapter The adapter whose files are uploaded
|
|
369
|
-
* @param isAdmin Whether the admin files should be uploaded
|
|
370
|
-
* @param files The files to upload
|
|
371
|
-
* @param id The upload state id used to report progress
|
|
372
|
-
* @param logger Logger used to report progress
|
|
373
|
-
*/
|
|
374
325
|
async upload(adapter, isAdmin, files, id, logger) {
|
|
375
326
|
const uploadID = `system.adapter.${adapter}.upload`;
|
|
376
327
|
await this.states.setState(uploadID, { val: 0, ack: true });
|
|
@@ -419,12 +370,6 @@ class Upload {
|
|
|
419
370
|
return adapter;
|
|
420
371
|
}
|
|
421
372
|
// Read synchronous all files recursively from local directory
|
|
422
|
-
/**
|
|
423
|
-
* Recursively collect all file paths below the given directory
|
|
424
|
-
*
|
|
425
|
-
* @param dir The directory to walk
|
|
426
|
-
* @param _results Accumulator of results collected so far
|
|
427
|
-
*/
|
|
428
373
|
walk(dir, _results) {
|
|
429
374
|
const results = _results || [];
|
|
430
375
|
try {
|
|
@@ -548,12 +493,6 @@ class Upload {
|
|
|
548
493
|
}
|
|
549
494
|
return adapter;
|
|
550
495
|
}
|
|
551
|
-
/**
|
|
552
|
-
* Deep-merge additional values into the native section of an object
|
|
553
|
-
*
|
|
554
|
-
* @param target The target object to extend
|
|
555
|
-
* @param additional The additional values to merge in
|
|
556
|
-
*/
|
|
557
496
|
extendNative(target, additional) {
|
|
558
497
|
if (import_js_controller_common.tools.isObject(additional)) {
|
|
559
498
|
for (const [attr, attrData] of Object.entries(additional)) {
|
|
@@ -573,13 +512,6 @@ class Upload {
|
|
|
573
512
|
}
|
|
574
513
|
return target;
|
|
575
514
|
}
|
|
576
|
-
/**
|
|
577
|
-
* Merge additional values into the common section of an instance object, preserving some attributes
|
|
578
|
-
*
|
|
579
|
-
* @param target The target common object to extend
|
|
580
|
-
* @param additional The additional values to merge in
|
|
581
|
-
* @param instance The instance id the common belongs to
|
|
582
|
-
*/
|
|
583
515
|
extendCommon(target, additional, instance) {
|
|
584
516
|
if (import_js_controller_common.tools.isObject(additional)) {
|
|
585
517
|
const preserveAttributes = [
|