@iobroker/js-controller-cli 7.2.3 → 8.0.0-alpha.2-20260923-99da17fcc
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 +8 -1
- package/build/cjs/lib/cli/cliCert.d.ts +7 -4
- package/build/cjs/lib/cli/cliCert.js +10 -6
- package/build/cjs/lib/cli/cliCert.js.map +2 -2
- package/build/cjs/lib/cli/cliCommand.d.ts +63 -15
- package/build/cjs/lib/cli/cliCommand.js +8 -1
- package/build/cjs/lib/cli/cliCommand.js.map +2 -2
- package/build/cjs/lib/cli/cliCompact.d.ts +5 -2
- package/build/cjs/lib/cli/cliCompact.js +9 -2
- package/build/cjs/lib/cli/cliCompact.js.map +2 -2
- package/build/cjs/lib/cli/cliDebug.d.ts +5 -2
- package/build/cjs/lib/cli/cliDebug.js +8 -1
- package/build/cjs/lib/cli/cliDebug.js.map +2 -2
- package/build/cjs/lib/cli/cliHost.d.ts +13 -10
- package/build/cjs/lib/cli/cliHost.js +13 -5
- package/build/cjs/lib/cli/cliHost.js.map +2 -2
- package/build/cjs/lib/cli/cliLogs.d.ts +9 -3
- package/build/cjs/lib/cli/cliLogs.js +12 -1
- package/build/cjs/lib/cli/cliLogs.js.map +2 -2
- package/build/cjs/lib/cli/cliMessage.d.ts +2 -1
- package/build/cjs/lib/cli/cliMessage.js +5 -0
- package/build/cjs/lib/cli/cliMessage.js.map +2 -2
- package/build/cjs/lib/cli/cliObjects.d.ts +21 -18
- package/build/cjs/lib/cli/cliObjects.js +51 -33
- 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 +6 -0
- package/build/cjs/lib/cli/cliPlugin.js.map +2 -2
- package/build/cjs/lib/cli/cliProcess.d.ts +17 -7
- package/build/cjs/lib/cli/cliProcess.js +77 -24
- package/build/cjs/lib/cli/cliProcess.js.map +3 -3
- package/build/cjs/lib/cli/cliStates.d.ts +7 -4
- package/build/cjs/lib/cli/cliStates.js +14 -6
- package/build/cjs/lib/cli/cliStates.js.map +2 -2
- package/build/cjs/lib/cli/cliTools.js +11 -0
- package/build/cjs/lib/cli/cliTools.js.map +1 -1
- package/build/cjs/lib/cli/messages.js +47 -46
- package/build/cjs/lib/cli/messages.js.map +1 -1
- package/build/cjs/lib/progressBar.d.ts +59 -0
- package/build/cjs/lib/progressBar.js +115 -0
- package/build/cjs/lib/progressBar.js.map +7 -0
- package/build/cjs/lib/setup/customError.d.ts +4 -0
- package/build/cjs/lib/setup/customError.js +7 -0
- package/build/cjs/lib/setup/customError.js.map +2 -2
- package/build/cjs/lib/setup/dbConnection.js +69 -64
- 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 +5 -0
- package/build/cjs/lib/setup/formatters.js.map +2 -2
- package/build/cjs/lib/setup/multihostClient.js +6 -2
- package/build/cjs/lib/setup/multihostClient.js.map +1 -1
- package/build/cjs/lib/setup/pluginInfos.d.ts +5 -0
- package/build/cjs/lib/setup/pluginInfos.js +2 -0
- package/build/cjs/lib/setup/pluginInfos.js.map +2 -2
- package/build/cjs/lib/setup/setupBackup.d.ts +53 -0
- package/build/cjs/lib/setup/setupBackup.js +125 -14
- package/build/cjs/lib/setup/setupBackup.js.map +3 -3
- package/build/cjs/lib/setup/setupInstall.d.ts +66 -15
- package/build/cjs/lib/setup/setupInstall.js +282 -28
- package/build/cjs/lib/setup/setupInstall.js.map +2 -2
- package/build/cjs/lib/setup/setupLicense.d.ts +13 -0
- package/build/cjs/lib/setup/setupLicense.js +33 -2
- package/build/cjs/lib/setup/setupLicense.js.map +2 -2
- package/build/cjs/lib/setup/setupList.d.ts +55 -1
- package/build/cjs/lib/setup/setupList.js +78 -24
- package/build/cjs/lib/setup/setupList.js.map +3 -3
- package/build/cjs/lib/setup/setupMultihost.d.ts +7 -0
- package/build/cjs/lib/setup/setupMultihost.js +78 -11
- package/build/cjs/lib/setup/setupMultihost.js.map +3 -3
- package/build/cjs/lib/setup/setupPacketManager.d.ts +10 -0
- package/build/cjs/lib/setup/setupPacketManager.js +16 -6
- package/build/cjs/lib/setup/setupPacketManager.js.map +2 -2
- package/build/cjs/lib/setup/setupRepo.d.ts +19 -0
- package/build/cjs/lib/setup/setupRepo.js +141 -13
- package/build/cjs/lib/setup/setupRepo.js.map +2 -2
- package/build/cjs/lib/setup/setupSetup.d.ts +34 -0
- package/build/cjs/lib/setup/setupSetup.js +209 -35
- package/build/cjs/lib/setup/setupSetup.js.map +3 -3
- package/build/cjs/lib/setup/setupUpgrade.d.ts +13 -2
- package/build/cjs/lib/setup/setupUpgrade.js +72 -12
- package/build/cjs/lib/setup/setupUpgrade.js.map +2 -2
- package/build/cjs/lib/setup/setupUpload.d.ts +77 -1
- package/build/cjs/lib/setup/setupUpload.js +152 -9
- package/build/cjs/lib/setup/setupUpload.js.map +2 -2
- package/build/cjs/lib/setup/setupUsers.d.ts +44 -14
- package/build/cjs/lib/setup/setupUsers.js +330 -17
- package/build/cjs/lib/setup/setupUsers.js.map +2 -2
- package/build/cjs/lib/setup/setupVendor.d.ts +14 -1
- package/build/cjs/lib/setup/setupVendor.js +40 -8
- package/build/cjs/lib/setup/setupVendor.js.map +2 -2
- package/build/cjs/lib/setup/setupVisDebug.d.ts +16 -2
- package/build/cjs/lib/setup/setupVisDebug.js +41 -17
- 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 +13 -9
- package/build/cjs/lib/setup/utils.js.map +3 -3
- package/build/cjs/lib/setup.d.ts +1 -1
- package/build/cjs/lib/setup.js +858 -1758
- package/build/cjs/lib/setup.js.map +3 -3
- package/build/esm/lib/_Types.d.ts +8 -1
- package/build/esm/lib/_Types.d.ts.map +1 -1
- package/build/esm/lib/cli/cliCert.d.ts +7 -4
- 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 +63 -15
- package/build/esm/lib/cli/cliCommand.d.ts.map +1 -1
- package/build/esm/lib/cli/cliCommand.js +4 -1
- package/build/esm/lib/cli/cliCommand.js.map +1 -1
- package/build/esm/lib/cli/cliCompact.d.ts +5 -2
- package/build/esm/lib/cli/cliCompact.d.ts.map +1 -1
- package/build/esm/lib/cli/cliCompact.js +5 -2
- package/build/esm/lib/cli/cliCompact.js.map +1 -1
- package/build/esm/lib/cli/cliDebug.d.ts +5 -2
- package/build/esm/lib/cli/cliDebug.d.ts.map +1 -1
- package/build/esm/lib/cli/cliDebug.js +4 -1
- package/build/esm/lib/cli/cliDebug.js.map +1 -1
- package/build/esm/lib/cli/cliHost.d.ts +13 -10
- package/build/esm/lib/cli/cliHost.d.ts.map +1 -1
- package/build/esm/lib/cli/cliHost.js +8 -5
- package/build/esm/lib/cli/cliHost.js.map +1 -1
- package/build/esm/lib/cli/cliLogs.d.ts +9 -3
- package/build/esm/lib/cli/cliLogs.d.ts.map +1 -1
- package/build/esm/lib/cli/cliLogs.js +8 -1
- package/build/esm/lib/cli/cliLogs.js.map +1 -1
- package/build/esm/lib/cli/cliMessage.d.ts +2 -1
- package/build/esm/lib/cli/cliMessage.d.ts.map +1 -1
- package/build/esm/lib/cli/cliMessage.js +1 -0
- package/build/esm/lib/cli/cliMessage.js.map +1 -1
- package/build/esm/lib/cli/cliObjects.d.ts +21 -18
- package/build/esm/lib/cli/cliObjects.d.ts.map +1 -1
- package/build/esm/lib/cli/cliObjects.js +44 -38
- 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 +17 -7
- package/build/esm/lib/cli/cliProcess.d.ts.map +1 -1
- package/build/esm/lib/cli/cliProcess.js +73 -12
- package/build/esm/lib/cli/cliProcess.js.map +1 -1
- package/build/esm/lib/cli/cliStates.d.ts +7 -4
- package/build/esm/lib/cli/cliStates.d.ts.map +1 -1
- package/build/esm/lib/cli/cliStates.js +6 -2
- package/build/esm/lib/cli/cliStates.js.map +1 -1
- package/build/esm/lib/progressBar.d.ts +59 -0
- package/build/esm/lib/progressBar.d.ts.map +1 -0
- package/build/esm/lib/progressBar.js +104 -0
- package/build/esm/lib/progressBar.js.map +1 -0
- package/build/esm/lib/setup/customError.d.ts +4 -0
- package/build/esm/lib/setup/customError.d.ts.map +1 -1
- package/build/esm/lib/setup/customError.js +3 -0
- 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 +10 -13
- 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 +5 -0
- package/build/esm/lib/setup/pluginInfos.d.ts.map +1 -1
- package/build/esm/lib/setup/pluginInfos.js +5 -0
- package/build/esm/lib/setup/pluginInfos.js.map +1 -1
- package/build/esm/lib/setup/setupBackup.d.ts +53 -0
- package/build/esm/lib/setup/setupBackup.d.ts.map +1 -1
- package/build/esm/lib/setup/setupBackup.js +132 -13
- package/build/esm/lib/setup/setupBackup.js.map +1 -1
- package/build/esm/lib/setup/setupInstall.d.ts +66 -15
- package/build/esm/lib/setup/setupInstall.d.ts.map +1 -1
- package/build/esm/lib/setup/setupInstall.js +309 -23
- package/build/esm/lib/setup/setupInstall.js.map +1 -1
- package/build/esm/lib/setup/setupLicense.d.ts +13 -0
- package/build/esm/lib/setup/setupLicense.d.ts.map +1 -1
- package/build/esm/lib/setup/setupLicense.js +31 -1
- package/build/esm/lib/setup/setupLicense.js.map +1 -1
- package/build/esm/lib/setup/setupList.d.ts +55 -1
- package/build/esm/lib/setup/setupList.d.ts.map +1 -1
- package/build/esm/lib/setup/setupList.js +61 -8
- package/build/esm/lib/setup/setupList.js.map +1 -1
- package/build/esm/lib/setup/setupMultihost.d.ts +7 -0
- package/build/esm/lib/setup/setupMultihost.d.ts.map +1 -1
- package/build/esm/lib/setup/setupMultihost.js +85 -6
- package/build/esm/lib/setup/setupMultihost.js.map +1 -1
- package/build/esm/lib/setup/setupPacketManager.d.ts +10 -0
- package/build/esm/lib/setup/setupPacketManager.d.ts.map +1 -1
- package/build/esm/lib/setup/setupPacketManager.js +9 -0
- package/build/esm/lib/setup/setupPacketManager.js.map +1 -1
- package/build/esm/lib/setup/setupRepo.d.ts +19 -0
- package/build/esm/lib/setup/setupRepo.d.ts.map +1 -1
- package/build/esm/lib/setup/setupRepo.js +164 -14
- package/build/esm/lib/setup/setupRepo.js.map +1 -1
- package/build/esm/lib/setup/setupSetup.d.ts +34 -0
- package/build/esm/lib/setup/setupSetup.d.ts.map +1 -1
- package/build/esm/lib/setup/setupSetup.js +218 -21
- package/build/esm/lib/setup/setupSetup.js.map +1 -1
- package/build/esm/lib/setup/setupUpgrade.d.ts +13 -2
- package/build/esm/lib/setup/setupUpgrade.d.ts.map +1 -1
- package/build/esm/lib/setup/setupUpgrade.js +70 -6
- package/build/esm/lib/setup/setupUpgrade.js.map +1 -1
- package/build/esm/lib/setup/setupUpload.d.ts +77 -1
- package/build/esm/lib/setup/setupUpload.d.ts.map +1 -1
- package/build/esm/lib/setup/setupUpload.js +164 -7
- package/build/esm/lib/setup/setupUpload.js.map +1 -1
- package/build/esm/lib/setup/setupUsers.d.ts +44 -14
- package/build/esm/lib/setup/setupUsers.d.ts.map +1 -1
- package/build/esm/lib/setup/setupUsers.js +346 -14
- package/build/esm/lib/setup/setupUsers.js.map +1 -1
- package/build/esm/lib/setup/setupVendor.d.ts +14 -1
- package/build/esm/lib/setup/setupVendor.d.ts.map +1 -1
- package/build/esm/lib/setup/setupVendor.js +33 -2
- package/build/esm/lib/setup/setupVendor.js.map +1 -1
- package/build/esm/lib/setup/setupVisDebug.d.ts +16 -2
- package/build/esm/lib/setup/setupVisDebug.d.ts.map +1 -1
- package/build/esm/lib/setup/setupVisDebug.js +39 -14
- 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 +2 -4
- package/build/esm/lib/setup/utils.js.map +1 -1
- package/build/esm/lib/setup.d.ts +1 -1
- package/build/esm/lib/setup.d.ts.map +1 -1
- package/build/esm/lib/setup.js +959 -1910
- package/build/esm/lib/setup.js.map +1 -1
- package/build/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +14 -14
package/build/cjs/lib/setup.js
CHANGED
|
@@ -5,6 +5,7 @@ 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 });
|
|
8
9
|
var __export = (target, all) => {
|
|
9
10
|
for (var name in all)
|
|
10
11
|
__defProp(target, name, { get: all[name], enumerable: true });
|
|
@@ -33,15 +34,14 @@ __export(setup_exports, {
|
|
|
33
34
|
module.exports = __toCommonJS(setup_exports);
|
|
34
35
|
var __import_meta_url = typeof document === "undefined" ? new (require("url".replace("", ""))).URL("file:" + __filename).href : document.currentScript && document.currentScript.src || new URL("main.js", document.baseURI).href;
|
|
35
36
|
var import_fs_extra = __toESM(require("fs-extra"), 1);
|
|
36
|
-
var import_js_controller_common = require("@iobroker/js-controller-common");
|
|
37
|
-
var import_js_controller_common2 = require("@iobroker/js-controller-common");
|
|
38
|
-
var import_deep_clone = __toESM(require("deep-clone"), 1);
|
|
39
|
-
var import_node_util = require("node:util");
|
|
40
37
|
var import_debug = __toESM(require("debug"), 1);
|
|
41
|
-
var import_js_controller_common3 = require("@iobroker/js-controller-common");
|
|
42
38
|
var import_node_path = __toESM(require("node:path"), 1);
|
|
43
39
|
var import_yargs = __toESM(require("yargs/yargs"), 1);
|
|
44
|
-
var
|
|
40
|
+
var url = __toESM(require("node:url"), 1);
|
|
41
|
+
var events = __toESM(require("node:events"), 1);
|
|
42
|
+
var import_node_module = require("node:module");
|
|
43
|
+
var import_js_controller_common = require("@iobroker/js-controller-common");
|
|
44
|
+
var import_constants = require("@iobroker/js-controller-common-db/constants");
|
|
45
45
|
var import_cliHost = require("../lib/cli/cliHost.js");
|
|
46
46
|
var import_cliStates = require("../lib/cli/cliStates.js");
|
|
47
47
|
var import_cliDebug = require("../lib/cli/cliDebug.js");
|
|
@@ -56,10 +56,8 @@ var import_messages = require("../lib/cli/messages.js");
|
|
|
56
56
|
var import_utils = require("../lib/setup/utils.js");
|
|
57
57
|
var import_dbConnection = require("../lib/setup/dbConnection.js");
|
|
58
58
|
var import_customError = require("../lib/setup/customError.js");
|
|
59
|
-
var
|
|
60
|
-
var
|
|
61
|
-
var import_node_module = require("node:module");
|
|
62
|
-
var import_constants = require("@iobroker/js-controller-common-db/constants");
|
|
59
|
+
var import_setupList = require("../lib/setup/setupList.js");
|
|
60
|
+
var formatters = __toESM(require("../lib/setup/formatters.js"), 1);
|
|
63
61
|
const thisDir = url.fileURLToPath(new URL(".", __import_meta_url || `file://${__filename}`));
|
|
64
62
|
const require2 = (0, import_node_module.createRequire)(__import_meta_url || `file://${__filename}`);
|
|
65
63
|
import_js_controller_common.tools.ensureDNSOrder();
|
|
@@ -317,26 +315,37 @@ function initYargs() {
|
|
|
317
315
|
}).wrap(null);
|
|
318
316
|
return _yargs;
|
|
319
317
|
}
|
|
318
|
+
__name(initYargs, "initYargs");
|
|
320
319
|
function showHelp() {
|
|
321
320
|
if (_yargs) {
|
|
322
321
|
_yargs.showHelp();
|
|
323
322
|
}
|
|
324
323
|
}
|
|
324
|
+
__name(showHelp, "showHelp");
|
|
325
325
|
async function processCommand(command, args, params, callback) {
|
|
326
326
|
const commandContext = { dbConnect: import_dbConnection.dbConnect, callback, showHelp };
|
|
327
327
|
const commandOptions = { ...params, ...commandContext };
|
|
328
|
+
const options = {
|
|
329
|
+
command,
|
|
330
|
+
args,
|
|
331
|
+
params,
|
|
332
|
+
callback,
|
|
333
|
+
commandOptions,
|
|
334
|
+
cleanDatabase,
|
|
335
|
+
restartController
|
|
336
|
+
};
|
|
328
337
|
debug(`commandOptions: ${JSON.stringify(commandOptions)}`);
|
|
329
338
|
debug(`args: ${JSON.stringify(args)}`);
|
|
330
339
|
switch (command) {
|
|
331
340
|
case "start":
|
|
332
341
|
case "stop": {
|
|
333
342
|
const procCommand = new import_cliProcess.CLIProcess(commandOptions);
|
|
334
|
-
procCommand[command](args);
|
|
343
|
+
procCommand[command](args).catch((e) => console.error(`Cannot ${command}: ${e.message}`));
|
|
335
344
|
break;
|
|
336
345
|
}
|
|
337
346
|
case "debug": {
|
|
338
347
|
const debugCommand = new import_cliDebug.CLIDebug(commandOptions);
|
|
339
|
-
debugCommand.execute(args);
|
|
348
|
+
debugCommand.execute(args).catch((e) => console.error(`Cannot debug: ${e.message}`));
|
|
340
349
|
break;
|
|
341
350
|
}
|
|
342
351
|
case "status":
|
|
@@ -348,474 +357,48 @@ async function processCommand(command, args, params, callback) {
|
|
|
348
357
|
case "r":
|
|
349
358
|
case "restart": {
|
|
350
359
|
const procCommand = new import_cliProcess.CLIProcess(commandOptions);
|
|
351
|
-
procCommand.restart(args);
|
|
360
|
+
procCommand.restart(args).catch((e) => console.error(`Cannot restart: ${e.message}`));
|
|
352
361
|
break;
|
|
353
362
|
}
|
|
354
363
|
case "_restart":
|
|
355
|
-
restartController();
|
|
364
|
+
restartController().catch((e) => console.error(`Cannot restart controller: ${e.message}`));
|
|
356
365
|
callback();
|
|
357
366
|
break;
|
|
358
367
|
case "update": {
|
|
359
|
-
const
|
|
360
|
-
|
|
361
|
-
const { Repo } = await import("./setup/setupRepo.js");
|
|
362
|
-
const repo = new Repo({
|
|
363
|
-
objects,
|
|
364
|
-
states
|
|
365
|
-
});
|
|
366
|
-
await repo.showRepo(repoUrl, params);
|
|
367
|
-
setTimeout(callback, 1e3);
|
|
368
|
-
});
|
|
369
|
-
break;
|
|
368
|
+
const { processCommandUpdate } = await import("../lib/setup/setupRepo.js");
|
|
369
|
+
return processCommandUpdate(options);
|
|
370
370
|
}
|
|
371
371
|
case "setup": {
|
|
372
|
-
const {
|
|
373
|
-
|
|
374
|
-
processExit: callback,
|
|
375
|
-
cleanDatabase,
|
|
376
|
-
restartController,
|
|
377
|
-
params
|
|
378
|
-
});
|
|
379
|
-
if (args[0] === "custom" || params.custom) {
|
|
380
|
-
const exitCode = await setup.setupCustom();
|
|
381
|
-
callback(exitCode);
|
|
382
|
-
return;
|
|
383
|
-
}
|
|
384
|
-
let isFirst = false;
|
|
385
|
-
let isRedis = false;
|
|
386
|
-
for (const arg of args) {
|
|
387
|
-
if (arg === "first") {
|
|
388
|
-
isFirst = true;
|
|
389
|
-
} else if (arg === "redis") {
|
|
390
|
-
isRedis = true;
|
|
391
|
-
}
|
|
392
|
-
}
|
|
393
|
-
isRedis = params.redis || isRedis;
|
|
394
|
-
isFirst = params.first || isFirst;
|
|
395
|
-
setup.setup({
|
|
396
|
-
callback: async () => {
|
|
397
|
-
const { states, objects } = await (0, import_dbConnection.dbConnectAsync)(false, params);
|
|
398
|
-
if (isFirst) {
|
|
399
|
-
const { Install } = await import("./setup/setupInstall.js");
|
|
400
|
-
const install = new Install({
|
|
401
|
-
objects,
|
|
402
|
-
states,
|
|
403
|
-
processExit: callback,
|
|
404
|
-
params
|
|
405
|
-
});
|
|
406
|
-
const initialInstances = ["admin", "discovery", "backitup"];
|
|
407
|
-
for (const instance of initialInstances) {
|
|
408
|
-
try {
|
|
409
|
-
const adapterInstalled = !!require2.resolve(`${import_js_controller_common.tools.appName.toLowerCase()}.${instance}`);
|
|
410
|
-
if (adapterInstalled) {
|
|
411
|
-
let otherInstanceExists = false;
|
|
412
|
-
try {
|
|
413
|
-
const res = await objects.getObjectViewAsync("system", "instance", {
|
|
414
|
-
startkey: `system.adapter.${instance}`,
|
|
415
|
-
endkey: `system.adapter.${instance}\u9999`
|
|
416
|
-
});
|
|
417
|
-
otherInstanceExists = !!res.rows.length;
|
|
418
|
-
} catch {
|
|
419
|
-
}
|
|
420
|
-
if (!otherInstanceExists) {
|
|
421
|
-
await install.createInstance(instance, {
|
|
422
|
-
enabled: true,
|
|
423
|
-
ignoreIfExists: true
|
|
424
|
-
});
|
|
425
|
-
}
|
|
426
|
-
}
|
|
427
|
-
} catch {
|
|
428
|
-
}
|
|
429
|
-
}
|
|
430
|
-
await new Promise((resolve) => {
|
|
431
|
-
const cert = new import_cliCert.CLICert({ ...commandOptions, callback: resolve });
|
|
432
|
-
cert.create();
|
|
433
|
-
});
|
|
434
|
-
}
|
|
435
|
-
const { Repo } = await import("./setup/setupRepo.js");
|
|
436
|
-
const repo = new Repo({ objects, states });
|
|
437
|
-
try {
|
|
438
|
-
await repo.rename("default", "stable", import_utils.STABLE_REPO_URL);
|
|
439
|
-
await repo.rename("latest", "beta", import_utils.BETA_REPO_URL);
|
|
440
|
-
} catch (err) {
|
|
441
|
-
console.warn(`Cannot rename: ${err.message}`);
|
|
442
|
-
}
|
|
443
|
-
try {
|
|
444
|
-
await objects.delObjectAsync("system.adapter.js-controller");
|
|
445
|
-
} catch {
|
|
446
|
-
}
|
|
447
|
-
try {
|
|
448
|
-
const configFile = import_js_controller_common.tools.getConfigFileName();
|
|
449
|
-
const configOrig = import_fs_extra.default.readJSONSync(configFile);
|
|
450
|
-
const config = (0, import_deep_clone.default)(configOrig);
|
|
451
|
-
config.objects.options = config.objects.options || {
|
|
452
|
-
auth_pass: null,
|
|
453
|
-
retry_max_delay: 5e3
|
|
454
|
-
};
|
|
455
|
-
if (config.objects.options.retry_max_delay === 15e3 || !config.objects.options.retry_max_delay) {
|
|
456
|
-
config.objects.options.retry_max_delay = 5e3;
|
|
457
|
-
}
|
|
458
|
-
config.states.options = config.states.options || {
|
|
459
|
-
auth_pass: null,
|
|
460
|
-
retry_max_delay: 5e3
|
|
461
|
-
};
|
|
462
|
-
if (config.states.options.retry_max_delay === 15e3 || !config.states.options.retry_max_delay) {
|
|
463
|
-
config.states.options.retry_max_delay = 5e3;
|
|
464
|
-
}
|
|
465
|
-
let migrated = "";
|
|
466
|
-
if (config.states.type === "file") {
|
|
467
|
-
config.states.type = "jsonl";
|
|
468
|
-
const hasLocalStatesServer = await (0, import_js_controller_common3.isLocalStatesDbServer)("file", config.states.host);
|
|
469
|
-
if (hasLocalStatesServer) {
|
|
470
|
-
console.log('States DB type migrated from "file" to "jsonl"');
|
|
471
|
-
migrated += "States";
|
|
472
|
-
}
|
|
473
|
-
}
|
|
474
|
-
if (config.objects.type === "file") {
|
|
475
|
-
config.objects.type = "jsonl";
|
|
476
|
-
const hasLocalObjectsServer = await (0, import_js_controller_common3.isLocalObjectsDbServer)("file", config.objects.host);
|
|
477
|
-
if (hasLocalObjectsServer) {
|
|
478
|
-
console.log('Objects DB type migrated from "file" to "jsonl"');
|
|
479
|
-
migrated += migrated ? " and Objects" : "Objects";
|
|
480
|
-
}
|
|
481
|
-
}
|
|
482
|
-
if (migrated) {
|
|
483
|
-
const { NotificationHandler } = await import("@iobroker/js-controller-common");
|
|
484
|
-
const hostname = import_js_controller_common.tools.getHostName();
|
|
485
|
-
const notificationSettings = {
|
|
486
|
-
states,
|
|
487
|
-
objects,
|
|
488
|
-
log: console,
|
|
489
|
-
logPrefix: "",
|
|
490
|
-
host: hostname
|
|
491
|
-
};
|
|
492
|
-
const notificationHandler = new NotificationHandler(notificationSettings);
|
|
493
|
-
try {
|
|
494
|
-
const ioPackage = import_fs_extra.default.readJsonSync(import_node_path.default.join(import_js_controller_common.tools.getControllerDir(), "io-package.json"));
|
|
495
|
-
await notificationHandler.addConfig(ioPackage.notifications);
|
|
496
|
-
await notificationHandler.addMessage({
|
|
497
|
-
scope: "system",
|
|
498
|
-
category: "fileToJsonl",
|
|
499
|
-
message: `Migrated: ${migrated}`,
|
|
500
|
-
instance: `system.host.${hostname}`
|
|
501
|
-
});
|
|
502
|
-
notificationHandler.storeNotifications();
|
|
503
|
-
} catch (e) {
|
|
504
|
-
console.warn(`Could not add File-to-JSONL notification: ${e.message}`);
|
|
505
|
-
}
|
|
506
|
-
}
|
|
507
|
-
if (!(0, import_node_util.isDeepStrictEqual)(config, configOrig)) {
|
|
508
|
-
import_fs_extra.default.writeFileSync(configFile, JSON.stringify(config, null, 2));
|
|
509
|
-
console.log("ioBroker configuration updated");
|
|
510
|
-
}
|
|
511
|
-
} catch (err) {
|
|
512
|
-
console.log(`Could not update ioBroker configuration: ${err.message}`);
|
|
513
|
-
}
|
|
514
|
-
return void callback();
|
|
515
|
-
},
|
|
516
|
-
ignoreIfExist: isFirst,
|
|
517
|
-
useRedis: isRedis
|
|
518
|
-
});
|
|
519
|
-
break;
|
|
372
|
+
const { processCommandSetup } = await import("../lib/setup/setupSetup.js");
|
|
373
|
+
return processCommandSetup(options);
|
|
520
374
|
}
|
|
521
375
|
case "url": {
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
if (!url2) {
|
|
525
|
-
console.log("Please provide a URL to install from and optionally a name of the adapter to install");
|
|
526
|
-
callback(import_js_controller_common2.EXIT_CODES.INVALID_ARGUMENTS);
|
|
527
|
-
}
|
|
528
|
-
if (url2[0] === '"' && url2[url2.length - 1] === '"') {
|
|
529
|
-
url2 = url2.substring(1, url2.length - 1);
|
|
530
|
-
}
|
|
531
|
-
url2 = url2.trim();
|
|
532
|
-
(0, import_dbConnection.dbConnect)(params, async ({ objects, states }) => {
|
|
533
|
-
const { Install } = await import("./setup/setupInstall.js");
|
|
534
|
-
const install = new Install({
|
|
535
|
-
objects,
|
|
536
|
-
states,
|
|
537
|
-
processExit: callback,
|
|
538
|
-
params
|
|
539
|
-
});
|
|
540
|
-
try {
|
|
541
|
-
await install.installAdapterFromUrl(url2, name);
|
|
542
|
-
return void callback(import_js_controller_common2.EXIT_CODES.NO_ERROR);
|
|
543
|
-
} catch (e) {
|
|
544
|
-
console.error(`Could not install adapter from url: ${e.message}`);
|
|
545
|
-
return void callback(import_js_controller_common2.EXIT_CODES.CANNOT_INSTALL_NPM_PACKET);
|
|
546
|
-
}
|
|
547
|
-
});
|
|
548
|
-
break;
|
|
549
|
-
}
|
|
550
|
-
case "info": {
|
|
551
|
-
(0, import_dbConnection.dbConnect)(params, async ({ objects }) => {
|
|
552
|
-
try {
|
|
553
|
-
const data = await import_js_controller_common.tools.getHostInfo(objects);
|
|
554
|
-
const formatters = await import("./setup/formatters.js");
|
|
555
|
-
const formatInfo = {
|
|
556
|
-
Uptime: formatters.formatSeconds,
|
|
557
|
-
"System uptime": formatters.formatSeconds,
|
|
558
|
-
RAM: formatters.formatRam,
|
|
559
|
-
Speed: formatters.formatSpeed,
|
|
560
|
-
"Disk size": formatters.formatBytes,
|
|
561
|
-
"Disk free": formatters.formatBytes
|
|
562
|
-
};
|
|
563
|
-
for (const attr of Object.keys(data)) {
|
|
564
|
-
console.log(`${attr}${attr.length < 16 ? new Array(16 - attr.length).join(" ") : ""}: ${// @ts-expect-error todo would need checks
|
|
565
|
-
formatInfo[attr] ? formatInfo[attr](data[attr]) : data[attr] || ""}`);
|
|
566
|
-
}
|
|
567
|
-
} catch (err) {
|
|
568
|
-
console.error(`Cannot read host info: ${typeof err === "object" ? JSON.stringify(err) : err}`);
|
|
569
|
-
return callback(import_js_controller_common2.EXIT_CODES.CANNOT_GET_HOST_INFO);
|
|
570
|
-
}
|
|
571
|
-
return void callback();
|
|
572
|
-
});
|
|
573
|
-
break;
|
|
376
|
+
const { processCommandUrl } = await import("../lib/setup/setupInstall.js");
|
|
377
|
+
return processCommandUrl(options);
|
|
574
378
|
}
|
|
379
|
+
case "info":
|
|
380
|
+
return processCommandInfo(options);
|
|
575
381
|
case "a":
|
|
576
382
|
case "add":
|
|
577
383
|
case "install":
|
|
578
384
|
case "i": {
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
let repoUrl = args[2];
|
|
582
|
-
if (parseInt(instance, 10).toString() !== (instance || "").toString()) {
|
|
583
|
-
repoUrl = instance;
|
|
584
|
-
instance = void 0;
|
|
585
|
-
}
|
|
586
|
-
if (parseInt(repoUrl, 10).toString() === (repoUrl || "").toString()) {
|
|
587
|
-
const temp = instance;
|
|
588
|
-
instance = repoUrl;
|
|
589
|
-
repoUrl = temp;
|
|
590
|
-
}
|
|
591
|
-
if (instance && parseInt(instance, 10).toString() === (instance || "").toString()) {
|
|
592
|
-
params.instance = parseInt(instance, 10);
|
|
593
|
-
}
|
|
594
|
-
name = CLITools.normalizeAdapterName(name);
|
|
595
|
-
const parsedName = CLITools.splitAdapterOrInstanceIdentifierWithVersion(name);
|
|
596
|
-
if (!parsedName) {
|
|
597
|
-
console.log("Invalid adapter name for install");
|
|
598
|
-
showHelp();
|
|
599
|
-
return void callback(import_js_controller_common2.EXIT_CODES.INVALID_ADAPTER_ID);
|
|
600
|
-
}
|
|
601
|
-
if (parsedName.instance !== null) {
|
|
602
|
-
params.instance = parsedName.instance;
|
|
603
|
-
}
|
|
604
|
-
name = parsedName.name;
|
|
605
|
-
const installName = parsedName.nameWithVersion;
|
|
606
|
-
const adapterDir = import_js_controller_common.tools.getAdapterDir(name);
|
|
607
|
-
(0, import_dbConnection.dbConnect)(params, async ({ objects, states }) => {
|
|
608
|
-
const { Install } = await import("./setup/setupInstall.js");
|
|
609
|
-
const install = new Install({
|
|
610
|
-
objects,
|
|
611
|
-
states,
|
|
612
|
-
processExit: callback,
|
|
613
|
-
params
|
|
614
|
-
});
|
|
615
|
-
if (params.host && params.host !== import_js_controller_common.tools.getHostName()) {
|
|
616
|
-
let obj;
|
|
617
|
-
try {
|
|
618
|
-
obj = await objects.getObjectAsync(`system.host.${params.host}`);
|
|
619
|
-
} catch (err) {
|
|
620
|
-
console.warn(`Could not check existence of host "${params.host}": ${err.message}`);
|
|
621
|
-
}
|
|
622
|
-
if (!obj) {
|
|
623
|
-
console.error(`Cannot add instance to non-existing host "${params.host}"`);
|
|
624
|
-
return void callback(import_js_controller_common2.EXIT_CODES.NON_EXISTING_HOST);
|
|
625
|
-
}
|
|
626
|
-
}
|
|
627
|
-
if (!adapterDir || !import_fs_extra.default.existsSync(adapterDir)) {
|
|
628
|
-
try {
|
|
629
|
-
const { stoppedList } = await install.downloadPacket(repoUrl, installName);
|
|
630
|
-
await install.installAdapter(installName, repoUrl);
|
|
631
|
-
await install.enableInstances(stoppedList, true);
|
|
632
|
-
if (command !== "install" && command !== "i") {
|
|
633
|
-
await install.createInstance(name, params);
|
|
634
|
-
}
|
|
635
|
-
return void callback();
|
|
636
|
-
} catch (e) {
|
|
637
|
-
console.error(`adapter "${name}" cannot be installed: ${e.message}`);
|
|
638
|
-
return void callback(e instanceof import_customError.IoBrokerError ? e.code : import_js_controller_common2.EXIT_CODES.UNKNOWN_ERROR);
|
|
639
|
-
}
|
|
640
|
-
} else if (command !== "install" && command !== "i") {
|
|
641
|
-
try {
|
|
642
|
-
await install.createInstance(name, params);
|
|
643
|
-
return void callback();
|
|
644
|
-
} catch (err) {
|
|
645
|
-
console.error(`adapter "${name}" cannot be installed: ${err.message}`);
|
|
646
|
-
return void callback(import_js_controller_common2.EXIT_CODES.UNKNOWN_ERROR);
|
|
647
|
-
}
|
|
648
|
-
} else {
|
|
649
|
-
console.log(`adapter "${name}" already installed. Use "upgrade" to upgrade to a newer version.`);
|
|
650
|
-
return void callback(import_js_controller_common2.EXIT_CODES.ADAPTER_ALREADY_INSTALLED);
|
|
651
|
-
}
|
|
652
|
-
});
|
|
653
|
-
break;
|
|
654
|
-
}
|
|
655
|
-
case "rebuild": {
|
|
656
|
-
const options = { debug: process.argv.includes("--debug") };
|
|
657
|
-
if (commandOptions.path) {
|
|
658
|
-
if (import_node_path.default.isAbsolute(commandOptions.path)) {
|
|
659
|
-
options.cwd = commandOptions.path;
|
|
660
|
-
} else {
|
|
661
|
-
console.log("Path argument needs to be an absolute path!");
|
|
662
|
-
return void (0, import_dbConnection.exitApplicationSave)(import_js_controller_common2.EXIT_CODES.INVALID_ARGUMENTS);
|
|
663
|
-
}
|
|
664
|
-
}
|
|
665
|
-
if (commandOptions.module) {
|
|
666
|
-
options.module = commandOptions.module;
|
|
667
|
-
console.log(`Rebuilding native module "${commandOptions.module}"${options.cwd ? ` in ${options.cwd}` : ""} ...`);
|
|
668
|
-
} else {
|
|
669
|
-
console.log(`Rebuilding native modules${options.cwd ? ` in ${options.cwd}` : ""} ...`);
|
|
670
|
-
}
|
|
671
|
-
const result = await import_js_controller_common.tools.rebuildNodeModules(options);
|
|
672
|
-
if (result.success) {
|
|
673
|
-
console.log();
|
|
674
|
-
console.log(`Rebuilding native modules done`);
|
|
675
|
-
return void callback();
|
|
676
|
-
}
|
|
677
|
-
console.error("Rebuilding native modules failed");
|
|
678
|
-
return void (0, import_dbConnection.exitApplicationSave)(result.exitCode);
|
|
385
|
+
const { processCommandInstall } = await import("../lib/setup/setupInstall.js");
|
|
386
|
+
return processCommandInstall(options);
|
|
679
387
|
}
|
|
388
|
+
case "rebuild":
|
|
389
|
+
return processCommandRebuild(options);
|
|
680
390
|
case "upload":
|
|
681
391
|
case "u": {
|
|
682
|
-
const
|
|
683
|
-
|
|
684
|
-
if (name) {
|
|
685
|
-
(0, import_dbConnection.dbConnect)(params, async ({ objects, states }) => {
|
|
686
|
-
const { Upload } = await import("./setup/setupUpload.js");
|
|
687
|
-
const upload = new Upload({ states, objects });
|
|
688
|
-
if (name === "all") {
|
|
689
|
-
try {
|
|
690
|
-
const objs = await objects.getObjectListAsync({
|
|
691
|
-
startkey: "system.adapter.",
|
|
692
|
-
endkey: "system.adapter.\u9999"
|
|
693
|
-
});
|
|
694
|
-
if (objs) {
|
|
695
|
-
const adapters = [];
|
|
696
|
-
for (const row of objs.rows) {
|
|
697
|
-
if (row.value.type !== "adapter") {
|
|
698
|
-
continue;
|
|
699
|
-
}
|
|
700
|
-
adapters.push(import_js_controller_common.tools.isObject(row.value.common.name) ? row.value.common.name.en : row.value.common.name);
|
|
701
|
-
}
|
|
702
|
-
await upload.uploadAdapterFullAsync(adapters);
|
|
703
|
-
}
|
|
704
|
-
callback();
|
|
705
|
-
} catch (err) {
|
|
706
|
-
console.error(`Cannot upload all adapters: ${err.message}`);
|
|
707
|
-
return void callback(import_js_controller_common2.EXIT_CODES.CANNOT_UPLOAD_DATA);
|
|
708
|
-
}
|
|
709
|
-
} else {
|
|
710
|
-
if (name.includes(".")) {
|
|
711
|
-
if (!subTree) {
|
|
712
|
-
console.log(`Please specify target name, like:
|
|
713
|
-
${import_js_controller_common.tools.appName} upload /file/picture.png /vis-2.0/main/img/picture.png`);
|
|
714
|
-
return void callback(import_js_controller_common2.EXIT_CODES.INVALID_ARGUMENTS);
|
|
715
|
-
}
|
|
716
|
-
try {
|
|
717
|
-
const newName = await upload.uploadFile(name, subTree);
|
|
718
|
-
console.log(`File "${name}" is successfully saved under ${newName}`);
|
|
719
|
-
return void callback();
|
|
720
|
-
} catch (err) {
|
|
721
|
-
console.error(`Cannot upload file "${name}": ${err.message}`);
|
|
722
|
-
return void callback(import_js_controller_common2.EXIT_CODES.CANNOT_UPLOAD_DATA);
|
|
723
|
-
}
|
|
724
|
-
} else {
|
|
725
|
-
try {
|
|
726
|
-
if (subTree) {
|
|
727
|
-
await upload.uploadAdapter(name, false, true, subTree);
|
|
728
|
-
} else {
|
|
729
|
-
await upload.uploadAdapterFullAsync([name]);
|
|
730
|
-
}
|
|
731
|
-
return void callback();
|
|
732
|
-
} catch (err) {
|
|
733
|
-
console.error(`Cannot upload files "${name}": ${err.message}`);
|
|
734
|
-
return void callback(import_js_controller_common2.EXIT_CODES.CANNOT_UPLOAD_DATA);
|
|
735
|
-
}
|
|
736
|
-
}
|
|
737
|
-
}
|
|
738
|
-
});
|
|
739
|
-
} else {
|
|
740
|
-
console.log("No adapter name found!");
|
|
741
|
-
showHelp();
|
|
742
|
-
return void callback(import_js_controller_common2.EXIT_CODES.INVALID_ADAPTER_ID);
|
|
743
|
-
}
|
|
744
|
-
break;
|
|
392
|
+
const { processCommandUpload } = await import("../lib/setup/setupUpload.js");
|
|
393
|
+
return processCommandUpload(options);
|
|
745
394
|
}
|
|
746
395
|
case "delete":
|
|
747
396
|
case "del": {
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
if (!adapter) {
|
|
751
|
-
showHelp();
|
|
752
|
-
return void callback(import_js_controller_common2.EXIT_CODES.INVALID_ADAPTER_ID);
|
|
753
|
-
}
|
|
754
|
-
adapter = CLITools.normalizeAdapterName(adapter);
|
|
755
|
-
if (!instance) {
|
|
756
|
-
if (!CLITools.validateAdapterOrInstanceIdentifier(adapter)) {
|
|
757
|
-
showHelp();
|
|
758
|
-
return void callback(import_js_controller_common2.EXIT_CODES.INVALID_ADAPTER_ID);
|
|
759
|
-
}
|
|
760
|
-
if (adapter.indexOf(".") > -1) {
|
|
761
|
-
[adapter, instance] = adapter.split(".", 2);
|
|
762
|
-
}
|
|
763
|
-
} else {
|
|
764
|
-
if (!CLITools.validateAdapterIdentifier(adapter) || !/^\d+$/.test(instance)) {
|
|
765
|
-
showHelp();
|
|
766
|
-
return void callback(import_js_controller_common2.EXIT_CODES.INVALID_ADAPTER_ID);
|
|
767
|
-
}
|
|
768
|
-
}
|
|
769
|
-
if (instance) {
|
|
770
|
-
(0, import_dbConnection.dbConnect)(params, async ({ objects, states }) => {
|
|
771
|
-
const { Install } = await import("../lib/setup/setupInstall.js");
|
|
772
|
-
const install = new Install({
|
|
773
|
-
objects,
|
|
774
|
-
states,
|
|
775
|
-
processExit: callback,
|
|
776
|
-
params
|
|
777
|
-
});
|
|
778
|
-
console.log(`Delete instance "${adapter}.${instance}"`);
|
|
779
|
-
await install.deleteInstance(adapter, parseInt(instance));
|
|
780
|
-
callback();
|
|
781
|
-
});
|
|
782
|
-
} else {
|
|
783
|
-
(0, import_dbConnection.dbConnect)(params, async ({ objects, states }) => {
|
|
784
|
-
const { Install } = await import("../lib/setup/setupInstall.js");
|
|
785
|
-
const install = new Install({
|
|
786
|
-
objects,
|
|
787
|
-
states,
|
|
788
|
-
processExit: callback,
|
|
789
|
-
params
|
|
790
|
-
});
|
|
791
|
-
console.log(`Delete adapter "${adapter}"`);
|
|
792
|
-
const resultCode = await install.deleteAdapter(adapter);
|
|
793
|
-
callback(resultCode);
|
|
794
|
-
});
|
|
795
|
-
}
|
|
796
|
-
break;
|
|
797
|
-
}
|
|
798
|
-
case "unsetup": {
|
|
799
|
-
const rl = (await import("node:readline")).createInterface({
|
|
800
|
-
input: process.stdin,
|
|
801
|
-
output: process.stdout
|
|
802
|
-
});
|
|
803
|
-
if (params.yes || params.y || params.Y) {
|
|
804
|
-
unsetup(params, callback);
|
|
805
|
-
} else {
|
|
806
|
-
rl.question("UUID will be deleted. Are you sure? [y/N]: ", (answer) => {
|
|
807
|
-
rl.close();
|
|
808
|
-
answer = answer.toLowerCase();
|
|
809
|
-
if (answer === "y" || answer === "yes" || answer === "ja" || answer === "j") {
|
|
810
|
-
unsetup(params, callback);
|
|
811
|
-
} else {
|
|
812
|
-
console.log("Nothing deleted");
|
|
813
|
-
return void callback();
|
|
814
|
-
}
|
|
815
|
-
});
|
|
816
|
-
}
|
|
817
|
-
break;
|
|
397
|
+
const { processCommandDelete } = await import("../lib/setup/setupInstall.js");
|
|
398
|
+
return processCommandDelete(options);
|
|
818
399
|
}
|
|
400
|
+
case "unsetup":
|
|
401
|
+
return processCommandUnsetup(options);
|
|
819
402
|
case "o":
|
|
820
403
|
case "object": {
|
|
821
404
|
const objectsCommand = new import_cliObjects.CLIObjects(commandOptions);
|
|
@@ -840,150 +423,27 @@ ${import_js_controller_common.tools.appName} upload /file/picture.png /vis-2.0/m
|
|
|
840
423
|
break;
|
|
841
424
|
}
|
|
842
425
|
case "upgrade": {
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
adapter = null;
|
|
846
|
-
}
|
|
847
|
-
(0, import_dbConnection.dbConnect)(params, async ({ objects, states }) => {
|
|
848
|
-
const { Upgrade } = await import("./setup/setupUpgrade.js");
|
|
849
|
-
const upgrade = new Upgrade({
|
|
850
|
-
objects,
|
|
851
|
-
states,
|
|
852
|
-
params,
|
|
853
|
-
processExit: callback
|
|
854
|
-
});
|
|
855
|
-
if (adapter) {
|
|
856
|
-
try {
|
|
857
|
-
if (adapter.split("@")[0] === "self") {
|
|
858
|
-
const hostAlive = await states.getStateAsync(`system.host.${import_js_controller_common.tools.getHostName()}.alive`);
|
|
859
|
-
const version = adapter.split("@")[1];
|
|
860
|
-
await upgrade.upgradeController({
|
|
861
|
-
forceDowngrade: params.force || params.f,
|
|
862
|
-
controllerRunning: !!hostAlive?.val,
|
|
863
|
-
version
|
|
864
|
-
});
|
|
865
|
-
} else {
|
|
866
|
-
await upgrade.upgradeAdapter("", adapter, params.force || params.f, params.y || params.yes, false);
|
|
867
|
-
}
|
|
868
|
-
return void callback();
|
|
869
|
-
} catch (err) {
|
|
870
|
-
console.error(`Cannot upgrade: ${err.message}`);
|
|
871
|
-
return void callback(import_js_controller_common2.EXIT_CODES.INVALID_REPO);
|
|
872
|
-
}
|
|
873
|
-
} else {
|
|
874
|
-
try {
|
|
875
|
-
const links = await (0, import_utils.getRepository)({ objects });
|
|
876
|
-
if (!links) {
|
|
877
|
-
return void callback(import_js_controller_common2.EXIT_CODES.INVALID_REPO);
|
|
878
|
-
}
|
|
879
|
-
await upgrade.upgradeAdapterHelper(links, Object.keys(links).sort(), false, params.y || params.yes);
|
|
880
|
-
return void callback();
|
|
881
|
-
} catch (e) {
|
|
882
|
-
console.error(`Cannot upgrade: ${e.message}`);
|
|
883
|
-
return void callback(e instanceof import_customError.IoBrokerError ? e.code : import_js_controller_common2.EXIT_CODES.INVALID_REPO);
|
|
884
|
-
}
|
|
885
|
-
}
|
|
886
|
-
});
|
|
887
|
-
break;
|
|
888
|
-
}
|
|
889
|
-
case "clean": {
|
|
890
|
-
const yes = args[0];
|
|
891
|
-
if (yes !== "yes") {
|
|
892
|
-
console.log(`Command "clean" clears all Objects and States. To execute it write "${import_js_controller_common.tools.appName} clean yes"`);
|
|
893
|
-
} else {
|
|
894
|
-
(0, import_dbConnection.dbConnect)(params, async ({ isOffline }) => {
|
|
895
|
-
if (!isOffline) {
|
|
896
|
-
console.error(`Stop ${import_js_controller_common.tools.appName} first!`);
|
|
897
|
-
return void callback(import_js_controller_common2.EXIT_CODES.CONTROLLER_RUNNING);
|
|
898
|
-
}
|
|
899
|
-
try {
|
|
900
|
-
const count = await cleanDatabase(true);
|
|
901
|
-
console.log(`Deleted ${count} states`);
|
|
902
|
-
} catch {
|
|
903
|
-
}
|
|
904
|
-
restartController();
|
|
905
|
-
console.log(`Restarting ${import_js_controller_common.tools.appName}...`);
|
|
906
|
-
callback();
|
|
907
|
-
});
|
|
908
|
-
}
|
|
909
|
-
break;
|
|
426
|
+
const { processCommandUpgrade } = await import("../lib/setup/setupUpgrade.js");
|
|
427
|
+
return processCommandUpgrade(options);
|
|
910
428
|
}
|
|
429
|
+
case "clean":
|
|
430
|
+
return processCommandClean(options);
|
|
911
431
|
case "restore": {
|
|
912
|
-
const {
|
|
913
|
-
|
|
914
|
-
if (!isOffline) {
|
|
915
|
-
console.error(`Stop ${import_js_controller_common.tools.appName} first!`);
|
|
916
|
-
return void callback(import_js_controller_common2.EXIT_CODES.CONTROLLER_RUNNING);
|
|
917
|
-
}
|
|
918
|
-
const backup = new BackupRestore({
|
|
919
|
-
states,
|
|
920
|
-
objects,
|
|
921
|
-
cleanDatabase,
|
|
922
|
-
restartController,
|
|
923
|
-
processExit: callback
|
|
924
|
-
});
|
|
925
|
-
const { exitCode } = await backup.restoreBackup({
|
|
926
|
-
name: args[0],
|
|
927
|
-
force: !!params.force,
|
|
928
|
-
dontDeleteAdapters: false
|
|
929
|
-
});
|
|
930
|
-
if (exitCode === import_js_controller_common2.EXIT_CODES.NO_ERROR) {
|
|
931
|
-
console.log("System successfully restored!");
|
|
932
|
-
}
|
|
933
|
-
return void callback(exitCode);
|
|
934
|
-
});
|
|
935
|
-
break;
|
|
432
|
+
const { processCommandRestore } = await import("../lib/setup/setupBackup.js");
|
|
433
|
+
return processCommandRestore(options);
|
|
936
434
|
}
|
|
937
435
|
case "backup": {
|
|
938
|
-
const
|
|
939
|
-
|
|
940
|
-
(0, import_dbConnection.dbConnect)(params, async ({ states, objects }) => {
|
|
941
|
-
const backup = new BackupRestore({
|
|
942
|
-
states,
|
|
943
|
-
objects,
|
|
944
|
-
cleanDatabase,
|
|
945
|
-
restartController,
|
|
946
|
-
processExit: callback
|
|
947
|
-
});
|
|
948
|
-
try {
|
|
949
|
-
const filePath = await backup.createBackup(name);
|
|
950
|
-
console.log(`Backup created: ${filePath}`);
|
|
951
|
-
console.log("This backup can only be restored with js-controller version 7.0 or higher");
|
|
952
|
-
return void callback(import_js_controller_common2.EXIT_CODES.NO_ERROR);
|
|
953
|
-
} catch (e) {
|
|
954
|
-
console.log(`Cannot create backup: ${e.message}`);
|
|
955
|
-
return void callback(e instanceof import_customError.IoBrokerError ? e.code : import_js_controller_common2.EXIT_CODES.CANNOT_EXTRACT_FROM_ZIP);
|
|
956
|
-
}
|
|
957
|
-
});
|
|
958
|
-
break;
|
|
436
|
+
const { processCommandBackup } = await import("../lib/setup/setupBackup.js");
|
|
437
|
+
return processCommandBackup(options);
|
|
959
438
|
}
|
|
960
439
|
case "validate": {
|
|
961
|
-
const
|
|
962
|
-
|
|
963
|
-
(0, import_dbConnection.dbConnect)(params, async ({ objects, states }) => {
|
|
964
|
-
const backup = new BackupRestore({
|
|
965
|
-
states,
|
|
966
|
-
objects,
|
|
967
|
-
cleanDatabase,
|
|
968
|
-
restartController,
|
|
969
|
-
processExit: callback
|
|
970
|
-
});
|
|
971
|
-
try {
|
|
972
|
-
await backup.validateBackup(name);
|
|
973
|
-
console.log("Backup OK");
|
|
974
|
-
return void (0, import_dbConnection.exitApplicationSave)(0);
|
|
975
|
-
} catch (e) {
|
|
976
|
-
console.log(`Backup check failed: ${e.message}`);
|
|
977
|
-
return void (0, import_dbConnection.exitApplicationSave)(e instanceof import_customError.IoBrokerError ? e.code : 1);
|
|
978
|
-
}
|
|
979
|
-
});
|
|
980
|
-
break;
|
|
440
|
+
const { processCommandValidate } = await import("../lib/setup/setupBackup.js");
|
|
441
|
+
return processCommandValidate(options);
|
|
981
442
|
}
|
|
982
443
|
case "l":
|
|
983
444
|
case "list": {
|
|
984
|
-
(0, import_dbConnection.dbConnect)(params,
|
|
985
|
-
const
|
|
986
|
-
const list = new List({
|
|
445
|
+
(0, import_dbConnection.dbConnect)(params, ({ objects, states }) => {
|
|
446
|
+
const list = new import_setupList.List({
|
|
987
447
|
states,
|
|
988
448
|
objects,
|
|
989
449
|
processExit: callback
|
|
@@ -992,1239 +452,875 @@ ${import_js_controller_common.tools.appName} upload /file/picture.png /vis-2.0/m
|
|
|
992
452
|
});
|
|
993
453
|
break;
|
|
994
454
|
}
|
|
995
|
-
case "touch":
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
if (pattern === "*") {
|
|
1007
|
-
objects.getObjectList({
|
|
1008
|
-
startkey: "system.adapter.",
|
|
1009
|
-
endkey: "system.adapter.\u9999"
|
|
1010
|
-
}, (err, arr) => {
|
|
1011
|
-
if (!err && arr?.rows) {
|
|
1012
|
-
const files = [];
|
|
1013
|
-
let count = 0;
|
|
1014
|
-
for (const row of arr.rows) {
|
|
1015
|
-
if (row.value.type !== "adapter") {
|
|
1016
|
-
continue;
|
|
1017
|
-
}
|
|
1018
|
-
count++;
|
|
1019
|
-
objects.touch(
|
|
1020
|
-
row.value.common.name,
|
|
1021
|
-
"*",
|
|
1022
|
-
{ user: "system.user.admin" },
|
|
1023
|
-
// @ts-expect-error todo this looks wrong, we have no cb args other than err
|
|
1024
|
-
async (err2, processed, _id) => {
|
|
1025
|
-
if (!err2 && processed) {
|
|
1026
|
-
files.push({ id: _id, processed });
|
|
1027
|
-
}
|
|
1028
|
-
if (!--count) {
|
|
1029
|
-
const { List } = await import("./setup/setupList.js");
|
|
1030
|
-
const list = new List({
|
|
1031
|
-
states,
|
|
1032
|
-
objects,
|
|
1033
|
-
processExit: callback
|
|
1034
|
-
});
|
|
1035
|
-
files.sort((a, b) => a.id.localeCompare(b.id));
|
|
1036
|
-
for (const file of files) {
|
|
1037
|
-
for (const processedFile of processed) {
|
|
1038
|
-
list.showFile(file.id, processedFile.path, processedFile);
|
|
1039
|
-
}
|
|
1040
|
-
}
|
|
1041
|
-
setTimeout(callback, 1e3);
|
|
1042
|
-
}
|
|
1043
|
-
}
|
|
1044
|
-
);
|
|
1045
|
-
}
|
|
1046
|
-
if (!count) {
|
|
1047
|
-
console.log("Nothing found");
|
|
1048
|
-
return void callback();
|
|
1049
|
-
}
|
|
1050
|
-
}
|
|
1051
|
-
});
|
|
1052
|
-
} else {
|
|
1053
|
-
const parts = pattern.split("/");
|
|
1054
|
-
const id = parts.shift();
|
|
1055
|
-
const path2 = parts.join("/");
|
|
1056
|
-
objects.touch(id, path2, { user: "system.user.admin" }, async (err, processed) => {
|
|
1057
|
-
if (err) {
|
|
1058
|
-
console.error(err);
|
|
1059
|
-
} else {
|
|
1060
|
-
if (processed) {
|
|
1061
|
-
const { List } = await import("./setup/setupList.js");
|
|
1062
|
-
const list = new List({
|
|
1063
|
-
states,
|
|
1064
|
-
objects,
|
|
1065
|
-
processExit: callback
|
|
1066
|
-
});
|
|
1067
|
-
for (const processedFile of processed) {
|
|
1068
|
-
list.showFile(id, processedFile.path, processedFile);
|
|
1069
|
-
}
|
|
1070
|
-
}
|
|
1071
|
-
}
|
|
1072
|
-
setTimeout(callback, 1e3);
|
|
1073
|
-
});
|
|
1074
|
-
}
|
|
1075
|
-
});
|
|
1076
|
-
break;
|
|
455
|
+
case "touch":
|
|
456
|
+
return processCommandTouch(options);
|
|
457
|
+
case "rm":
|
|
458
|
+
return processCommandRm(options);
|
|
459
|
+
case "chmod":
|
|
460
|
+
return processCommandChmod(options);
|
|
461
|
+
case "chown":
|
|
462
|
+
return processCommandChown(options);
|
|
463
|
+
case "user": {
|
|
464
|
+
const { processCommandUser } = await import("../lib/setup/setupUsers.js");
|
|
465
|
+
return processCommandUser(options);
|
|
1077
466
|
}
|
|
1078
|
-
case "
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
return void callback(import_js_controller_common2.EXIT_CODES.INVALID_ARGUMENTS);
|
|
1083
|
-
}
|
|
1084
|
-
(0, import_dbConnection.dbConnect)(params, ({ objects, states }) => {
|
|
1085
|
-
pattern = pattern.replace(/\\/g, "/");
|
|
1086
|
-
if (pattern[0] === "/") {
|
|
1087
|
-
pattern = pattern.substring(1);
|
|
1088
|
-
}
|
|
1089
|
-
if (pattern === "*") {
|
|
1090
|
-
objects.getObjectList({
|
|
1091
|
-
startkey: "system.adapter.",
|
|
1092
|
-
endkey: "system.adapter.\u9999"
|
|
1093
|
-
}, (err, arr) => {
|
|
1094
|
-
if (!err && arr?.rows) {
|
|
1095
|
-
const files = [];
|
|
1096
|
-
let count = 0;
|
|
1097
|
-
for (const row of arr.rows) {
|
|
1098
|
-
if (row.value.type !== "adapter") {
|
|
1099
|
-
continue;
|
|
1100
|
-
}
|
|
1101
|
-
count++;
|
|
1102
|
-
objects.rm(
|
|
1103
|
-
row.value.common.name,
|
|
1104
|
-
"*",
|
|
1105
|
-
{ user: "system.user.admin" },
|
|
1106
|
-
// @ts-expect-error todo id should not exist according to types check it
|
|
1107
|
-
async (err2, processed, _id) => {
|
|
1108
|
-
if (!err2 && processed) {
|
|
1109
|
-
files.push({ id: _id, processed });
|
|
1110
|
-
}
|
|
1111
|
-
if (!--count) {
|
|
1112
|
-
const { List } = await import("./setup/setupList.js");
|
|
1113
|
-
const list = new List({
|
|
1114
|
-
states,
|
|
1115
|
-
objects,
|
|
1116
|
-
processExit: callback
|
|
1117
|
-
});
|
|
1118
|
-
files.sort((a, b) => a.id.localeCompare(b.id));
|
|
1119
|
-
list.showFileHeader();
|
|
1120
|
-
for (const file of files) {
|
|
1121
|
-
for (const processedFile of processed) {
|
|
1122
|
-
list.showFile(file.id, processedFile.path, processedFile);
|
|
1123
|
-
}
|
|
1124
|
-
}
|
|
1125
|
-
setTimeout(callback, 1e3);
|
|
1126
|
-
}
|
|
1127
|
-
}
|
|
1128
|
-
);
|
|
1129
|
-
}
|
|
1130
|
-
if (!count) {
|
|
1131
|
-
console.log("Nothing found");
|
|
1132
|
-
return void callback();
|
|
1133
|
-
}
|
|
1134
|
-
}
|
|
1135
|
-
});
|
|
1136
|
-
} else {
|
|
1137
|
-
const parts = pattern.split("/");
|
|
1138
|
-
const id = parts.shift();
|
|
1139
|
-
const path2 = parts.join("/");
|
|
1140
|
-
objects.rm(id, path2, { user: "system.user.admin" }, async (err, processed) => {
|
|
1141
|
-
if (err) {
|
|
1142
|
-
console.error(err);
|
|
1143
|
-
} else {
|
|
1144
|
-
if (processed) {
|
|
1145
|
-
const { List } = await import("./setup/setupList.js");
|
|
1146
|
-
const list = new List({
|
|
1147
|
-
states,
|
|
1148
|
-
objects,
|
|
1149
|
-
processExit: callback
|
|
1150
|
-
});
|
|
1151
|
-
list.showFileHeader();
|
|
1152
|
-
for (const file of processed) {
|
|
1153
|
-
list.showFile(id, file.path, file);
|
|
1154
|
-
}
|
|
1155
|
-
}
|
|
1156
|
-
}
|
|
1157
|
-
setTimeout(callback, 1e3);
|
|
1158
|
-
});
|
|
1159
|
-
}
|
|
1160
|
-
});
|
|
1161
|
-
break;
|
|
467
|
+
case "g":
|
|
468
|
+
case "group": {
|
|
469
|
+
const { processCommandGroup } = await import("../lib/setup/setupUsers.js");
|
|
470
|
+
return processCommandGroup(options);
|
|
1162
471
|
}
|
|
1163
|
-
case "
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
if (!mode) {
|
|
1167
|
-
import_messages.error.requiredArgumentMissing("mode", "chmod 777 /vis-2.0/main/*");
|
|
1168
|
-
return void callback(import_js_controller_common2.EXIT_CODES.INVALID_ARGUMENTS);
|
|
1169
|
-
}
|
|
1170
|
-
mode = parseInt(mode.toString(), 16);
|
|
1171
|
-
if (!pattern) {
|
|
1172
|
-
import_messages.error.requiredArgumentMissing("file path", "chmod 777 /vis-2.0/main/*");
|
|
1173
|
-
return void callback(import_js_controller_common2.EXIT_CODES.INVALID_ARGUMENTS);
|
|
1174
|
-
}
|
|
1175
|
-
(0, import_dbConnection.dbConnect)(params, ({ objects, states }) => {
|
|
1176
|
-
pattern = pattern.replace(/\\/g, "/");
|
|
1177
|
-
if (pattern[0] === "/") {
|
|
1178
|
-
pattern = pattern.substring(1);
|
|
1179
|
-
}
|
|
1180
|
-
if (pattern === "*") {
|
|
1181
|
-
objects.getObjectList({
|
|
1182
|
-
startkey: "system.adapter.",
|
|
1183
|
-
endkey: "system.adapter.\u9999"
|
|
1184
|
-
}, (err, arr) => {
|
|
1185
|
-
if (!err && arr?.rows) {
|
|
1186
|
-
const files = [];
|
|
1187
|
-
let count = 0;
|
|
1188
|
-
for (const row of arr.rows) {
|
|
1189
|
-
if (row.value.type !== "adapter") {
|
|
1190
|
-
continue;
|
|
1191
|
-
}
|
|
1192
|
-
count++;
|
|
1193
|
-
objects.chmodFile(
|
|
1194
|
-
row.value.common.name,
|
|
1195
|
-
"*",
|
|
1196
|
-
{
|
|
1197
|
-
user: "system.user.admin",
|
|
1198
|
-
mode
|
|
1199
|
-
},
|
|
1200
|
-
// @ts-expect-error todo _id should not exist how to handle
|
|
1201
|
-
async (err2, processed, _id) => {
|
|
1202
|
-
if (!err2 && processed) {
|
|
1203
|
-
files.push({ id: _id, processed });
|
|
1204
|
-
}
|
|
1205
|
-
if (!--count) {
|
|
1206
|
-
const { List } = await import("./setup/setupList.js");
|
|
1207
|
-
const list = new List({
|
|
1208
|
-
states,
|
|
1209
|
-
objects,
|
|
1210
|
-
processExit: callback
|
|
1211
|
-
});
|
|
1212
|
-
files.sort((a, b) => a.id.localeCompare(b.id));
|
|
1213
|
-
list.showFileHeader();
|
|
1214
|
-
for (const file of files) {
|
|
1215
|
-
for (const processedFile of file.processed) {
|
|
1216
|
-
list.showFile(file.id, processedFile.path, processedFile);
|
|
1217
|
-
}
|
|
1218
|
-
}
|
|
1219
|
-
setTimeout(callback, 1e3);
|
|
1220
|
-
}
|
|
1221
|
-
}
|
|
1222
|
-
);
|
|
1223
|
-
}
|
|
1224
|
-
if (!count) {
|
|
1225
|
-
console.log("Nothing found");
|
|
1226
|
-
return void callback();
|
|
1227
|
-
}
|
|
1228
|
-
}
|
|
1229
|
-
});
|
|
1230
|
-
} else {
|
|
1231
|
-
const parts = pattern.split("/");
|
|
1232
|
-
const id = parts.shift();
|
|
1233
|
-
const path2 = parts.join("/");
|
|
1234
|
-
objects.chmodFile(id, path2, { user: "system.user.admin", mode }, async (err, processed) => {
|
|
1235
|
-
if (err) {
|
|
1236
|
-
console.error(err);
|
|
1237
|
-
} else {
|
|
1238
|
-
if (processed) {
|
|
1239
|
-
const { List } = await import("./setup/setupList.js");
|
|
1240
|
-
const list = new List({
|
|
1241
|
-
states,
|
|
1242
|
-
objects,
|
|
1243
|
-
processExit: callback
|
|
1244
|
-
});
|
|
1245
|
-
list.showFileHeader();
|
|
1246
|
-
for (const file of processed) {
|
|
1247
|
-
list.showFile(id, file.path, file);
|
|
1248
|
-
}
|
|
1249
|
-
}
|
|
1250
|
-
}
|
|
1251
|
-
setTimeout(callback, 1e3);
|
|
1252
|
-
});
|
|
1253
|
-
}
|
|
1254
|
-
});
|
|
1255
|
-
break;
|
|
472
|
+
case "adduser": {
|
|
473
|
+
const { processCommandAddUser } = await import("../lib/setup/setupUsers.js");
|
|
474
|
+
return processCommandAddUser(options);
|
|
1256
475
|
}
|
|
1257
|
-
case "
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
let pattern = args[2];
|
|
1261
|
-
if (!pattern) {
|
|
1262
|
-
pattern = group;
|
|
1263
|
-
group = void 0;
|
|
1264
|
-
}
|
|
1265
|
-
if (!user) {
|
|
1266
|
-
import_messages.error.requiredArgumentMissing("user", "chown user /vis-2.0/main/*");
|
|
1267
|
-
return void callback(import_js_controller_common2.EXIT_CODES.INVALID_ARGUMENTS);
|
|
1268
|
-
} else if (user.substring(12) !== "system.user.") {
|
|
1269
|
-
user = `system.user.${user}`;
|
|
1270
|
-
}
|
|
1271
|
-
if (group && group.substring(13) !== "system.group.") {
|
|
1272
|
-
group = `system.group.${group}`;
|
|
1273
|
-
}
|
|
1274
|
-
if (!pattern) {
|
|
1275
|
-
import_messages.error.requiredArgumentMissing("file path", "chown user /vis-2.0/main/*");
|
|
1276
|
-
return void callback(import_js_controller_common2.EXIT_CODES.INVALID_ARGUMENTS);
|
|
1277
|
-
}
|
|
1278
|
-
(0, import_dbConnection.dbConnect)(params, ({ objects, states }) => {
|
|
1279
|
-
pattern = pattern.replace(/\\/g, "/");
|
|
1280
|
-
if (pattern[0] === "/") {
|
|
1281
|
-
pattern = pattern.substring(1);
|
|
1282
|
-
}
|
|
1283
|
-
if (pattern === "*") {
|
|
1284
|
-
objects.getObjectList({
|
|
1285
|
-
startkey: "system.adapter.",
|
|
1286
|
-
endkey: "system.adapter.\u9999"
|
|
1287
|
-
}, (err, arr) => {
|
|
1288
|
-
if (!err && arr?.rows) {
|
|
1289
|
-
const files = [];
|
|
1290
|
-
let count = 0;
|
|
1291
|
-
for (const row of arr.rows) {
|
|
1292
|
-
if (row.value.type !== "adapter") {
|
|
1293
|
-
continue;
|
|
1294
|
-
}
|
|
1295
|
-
count++;
|
|
1296
|
-
objects.chownFile(
|
|
1297
|
-
row.value.common.name,
|
|
1298
|
-
"*",
|
|
1299
|
-
{
|
|
1300
|
-
user: "system.user.admin",
|
|
1301
|
-
owner: user,
|
|
1302
|
-
ownerGroup: group
|
|
1303
|
-
},
|
|
1304
|
-
// @ts-expect-error todo _id should not exist how to handle
|
|
1305
|
-
async (err2, processed, _id) => {
|
|
1306
|
-
if (!err2 && processed) {
|
|
1307
|
-
files.push({ id: _id, processed });
|
|
1308
|
-
}
|
|
1309
|
-
if (!--count) {
|
|
1310
|
-
const { List } = await import("./setup/setupList.js");
|
|
1311
|
-
const list = new List({
|
|
1312
|
-
states,
|
|
1313
|
-
objects,
|
|
1314
|
-
processExit: callback
|
|
1315
|
-
});
|
|
1316
|
-
files.sort((a, b) => a.id.localeCompare(b.id));
|
|
1317
|
-
list.showFileHeader();
|
|
1318
|
-
for (let k = 0; k < files.length; k++) {
|
|
1319
|
-
for (let t = 0; t < files[k].processed.length; t++) {
|
|
1320
|
-
list.showFile(files[k].id, files[k].processed[t].path, files[k].processed[t]);
|
|
1321
|
-
}
|
|
1322
|
-
}
|
|
1323
|
-
setTimeout(callback, 1e3);
|
|
1324
|
-
}
|
|
1325
|
-
}
|
|
1326
|
-
);
|
|
1327
|
-
}
|
|
1328
|
-
if (!count) {
|
|
1329
|
-
console.log("Nothing found");
|
|
1330
|
-
return void callback();
|
|
1331
|
-
}
|
|
1332
|
-
}
|
|
1333
|
-
});
|
|
1334
|
-
} else {
|
|
1335
|
-
const parts = pattern.split("/");
|
|
1336
|
-
const id = parts.shift();
|
|
1337
|
-
const path2 = parts.join("/");
|
|
1338
|
-
objects.chownFile(id, path2, {
|
|
1339
|
-
user: "system.user.admin",
|
|
1340
|
-
owner: user,
|
|
1341
|
-
ownerGroup: group
|
|
1342
|
-
}, async (err, processed) => {
|
|
1343
|
-
if (err) {
|
|
1344
|
-
console.error(err);
|
|
1345
|
-
} else {
|
|
1346
|
-
if (processed) {
|
|
1347
|
-
const { List } = await import("./setup/setupList.js");
|
|
1348
|
-
const list = new List({
|
|
1349
|
-
states,
|
|
1350
|
-
objects,
|
|
1351
|
-
processExit: callback
|
|
1352
|
-
});
|
|
1353
|
-
list.showFileHeader();
|
|
1354
|
-
for (const file of processed) {
|
|
1355
|
-
list.showFile(id, file.path, file);
|
|
1356
|
-
}
|
|
1357
|
-
}
|
|
1358
|
-
}
|
|
1359
|
-
setTimeout(callback, 1e3);
|
|
1360
|
-
});
|
|
1361
|
-
}
|
|
1362
|
-
});
|
|
1363
|
-
break;
|
|
476
|
+
case "passwd": {
|
|
477
|
+
const { processCommandPassword } = await import("../lib/setup/setupUsers.js");
|
|
478
|
+
return processCommandPassword(options);
|
|
1364
479
|
}
|
|
1365
|
-
case "
|
|
1366
|
-
|
|
1367
|
-
|
|
1368
|
-
|
|
1369
|
-
|
|
1370
|
-
|
|
1371
|
-
(0, import_dbConnection.dbConnect)(params, async ({ objects }) => {
|
|
1372
|
-
const { Users } = await import("./setup/setupUsers.js");
|
|
1373
|
-
const users = new Users({
|
|
1374
|
-
objects,
|
|
1375
|
-
processExit: callback
|
|
1376
|
-
});
|
|
1377
|
-
const password = params.password;
|
|
1378
|
-
const group = params.ingroup || "system.group.administrator";
|
|
1379
|
-
if (command2 === "add") {
|
|
1380
|
-
users.addUserPrompt(user, group, password, (err) => {
|
|
1381
|
-
if (err) {
|
|
1382
|
-
console.error(err);
|
|
1383
|
-
return void callback(import_js_controller_common2.EXIT_CODES.CANNOT_CREATE_USER_OR_GROUP);
|
|
1384
|
-
}
|
|
1385
|
-
console.log(`User "${user}" created (Group: ${group.replace("system.group.", "")})`);
|
|
1386
|
-
return void callback();
|
|
1387
|
-
});
|
|
1388
|
-
} else if (command2 === "del" || command2 === "delete") {
|
|
1389
|
-
users.delUser(user, (err) => {
|
|
1390
|
-
if (err) {
|
|
1391
|
-
console.error(err);
|
|
1392
|
-
return void callback(import_js_controller_common2.EXIT_CODES.CANNOT_CREATE_USER_OR_GROUP);
|
|
1393
|
-
}
|
|
1394
|
-
console.log(`User "${user}" deleted`);
|
|
1395
|
-
return void callback();
|
|
1396
|
-
});
|
|
1397
|
-
} else if (command2 === "check") {
|
|
1398
|
-
users.checkUserPassword(user, password, (err) => {
|
|
1399
|
-
if (err) {
|
|
1400
|
-
console.error(err.message);
|
|
1401
|
-
return void callback(import_js_controller_common2.EXIT_CODES.CANNOT_CREATE_USER_OR_GROUP);
|
|
1402
|
-
}
|
|
1403
|
-
console.log(`Password for user "${user}" matches.`);
|
|
1404
|
-
return void callback();
|
|
1405
|
-
});
|
|
1406
|
-
} else if (command2 === "set" || command2 === "passwd") {
|
|
1407
|
-
users.setUserPassword(user, password, (err) => {
|
|
1408
|
-
if (err) {
|
|
1409
|
-
console.error(err.message);
|
|
1410
|
-
return void callback(import_js_controller_common2.EXIT_CODES.CANNOT_CREATE_USER_OR_GROUP);
|
|
1411
|
-
}
|
|
1412
|
-
console.log(`Password for "${user}" was successfully set.`);
|
|
1413
|
-
return void callback();
|
|
1414
|
-
});
|
|
1415
|
-
} else if (command2 === "enable" || command2 === "e") {
|
|
1416
|
-
users.enableUser(user, true, (err) => {
|
|
1417
|
-
if (err) {
|
|
1418
|
-
console.error(err.message);
|
|
1419
|
-
return void callback(import_js_controller_common2.EXIT_CODES.CANNOT_CREATE_USER_OR_GROUP);
|
|
1420
|
-
}
|
|
1421
|
-
console.log(`User "${user}" was successfully enabled.`);
|
|
1422
|
-
return void callback();
|
|
1423
|
-
});
|
|
1424
|
-
} else if (command2 === "disable" || command2 === "d") {
|
|
1425
|
-
users.enableUser(user, false, (err) => {
|
|
1426
|
-
if (err) {
|
|
1427
|
-
console.error(err.message);
|
|
1428
|
-
return void callback(import_js_controller_common2.EXIT_CODES.CANNOT_CREATE_USER_OR_GROUP);
|
|
1429
|
-
}
|
|
1430
|
-
console.log(`User "${user}" was successfully disabled.`);
|
|
1431
|
-
return void callback();
|
|
1432
|
-
});
|
|
1433
|
-
} else if (command2 === "get") {
|
|
1434
|
-
users.getUser(user, (err, isEnabled) => {
|
|
1435
|
-
if (err) {
|
|
1436
|
-
console.error(err.message);
|
|
1437
|
-
return void callback(import_js_controller_common2.EXIT_CODES.CANNOT_CREATE_USER_OR_GROUP);
|
|
1438
|
-
}
|
|
1439
|
-
console.log(`User "${user}" is ${isEnabled ? "enabled" : "disabled"}`);
|
|
1440
|
-
return void callback();
|
|
1441
|
-
});
|
|
1442
|
-
} else {
|
|
1443
|
-
console.warn(`Unknown command "${command2}". Available commands are: add, del, passwd, enable, disable, check, get`);
|
|
1444
|
-
return void callback(import_js_controller_common2.EXIT_CODES.INVALID_ARGUMENTS);
|
|
1445
|
-
}
|
|
1446
|
-
});
|
|
1447
|
-
break;
|
|
480
|
+
case "ud":
|
|
481
|
+
case "udel":
|
|
482
|
+
case "userdel":
|
|
483
|
+
case "deluser": {
|
|
484
|
+
const { processCommandUserDel } = await import("../lib/setup/setupUsers.js");
|
|
485
|
+
return processCommandUserDel(options);
|
|
1448
486
|
}
|
|
1449
|
-
case "
|
|
1450
|
-
|
|
1451
|
-
|
|
1452
|
-
|
|
1453
|
-
|
|
1454
|
-
|
|
1455
|
-
|
|
1456
|
-
}
|
|
1457
|
-
if (user && user.startsWith("system.user.")) {
|
|
1458
|
-
user = user.substring("system.user.".length);
|
|
1459
|
-
}
|
|
1460
|
-
if (!command2) {
|
|
1461
|
-
console.warn(`Unknown command "${command2}". Available commands are: add, del, passwd, enable, disable, list, get`);
|
|
1462
|
-
return void callback(import_js_controller_common2.EXIT_CODES.INVALID_ARGUMENTS);
|
|
1463
|
-
}
|
|
1464
|
-
if (!group) {
|
|
1465
|
-
console.warn(`Please define group name: group ${command2} groupName`);
|
|
1466
|
-
return callback(import_js_controller_common2.EXIT_CODES.CANNOT_CREATE_USER_OR_GROUP);
|
|
1467
|
-
}
|
|
1468
|
-
(0, import_dbConnection.dbConnect)(params, async ({ objects }) => {
|
|
1469
|
-
const { Users } = await import("./setup/setupUsers.js");
|
|
1470
|
-
const users = new Users({
|
|
1471
|
-
objects,
|
|
1472
|
-
processExit: callback
|
|
1473
|
-
});
|
|
1474
|
-
if (command2 === "useradd" || command2 === "adduser") {
|
|
1475
|
-
if (!user) {
|
|
1476
|
-
console.warn('Please define user name: "group useradd groupName userName"');
|
|
1477
|
-
return void callback(import_js_controller_common2.EXIT_CODES.CANNOT_CREATE_USER_OR_GROUP);
|
|
1478
|
-
}
|
|
1479
|
-
users.addUserToGroup(user, group, (err) => {
|
|
1480
|
-
if (err) {
|
|
1481
|
-
console.error(err);
|
|
1482
|
-
return void callback(import_js_controller_common2.EXIT_CODES.CANNOT_CREATE_USER_OR_GROUP);
|
|
1483
|
-
}
|
|
1484
|
-
console.log(`User "${user}" was added to group "${group}"`);
|
|
1485
|
-
return void callback();
|
|
1486
|
-
});
|
|
1487
|
-
} else if (command2 === "userdel" || command2 === "deluser") {
|
|
1488
|
-
if (!user) {
|
|
1489
|
-
console.warn('Please define user name: "group userdel groupName userName"');
|
|
1490
|
-
return void callback(import_js_controller_common2.EXIT_CODES.CANNOT_CREATE_USER_OR_GROUP);
|
|
1491
|
-
}
|
|
1492
|
-
users.removeUserFromGroup(user, group, (err) => {
|
|
1493
|
-
if (err) {
|
|
1494
|
-
console.error(err);
|
|
1495
|
-
return void callback(import_js_controller_common2.EXIT_CODES.CANNOT_CREATE_USER_OR_GROUP);
|
|
1496
|
-
}
|
|
1497
|
-
console.log(`User "${user}" was deleted from group "${group}"`);
|
|
1498
|
-
return void callback();
|
|
1499
|
-
});
|
|
1500
|
-
} else if (command2 === "add") {
|
|
1501
|
-
try {
|
|
1502
|
-
await users.addGroup(group);
|
|
1503
|
-
console.log(`Group "${group}" was created`);
|
|
1504
|
-
return void callback();
|
|
1505
|
-
} catch {
|
|
1506
|
-
return void callback(import_js_controller_common2.EXIT_CODES.CANNOT_CREATE_USER_OR_GROUP);
|
|
1507
|
-
}
|
|
1508
|
-
} else if (command2 === "del" || command2 === "delete") {
|
|
1509
|
-
users.delGroup(group, (err) => {
|
|
1510
|
-
if (err) {
|
|
1511
|
-
console.error(err);
|
|
1512
|
-
return void callback(import_js_controller_common2.EXIT_CODES.CANNOT_CREATE_USER_OR_GROUP);
|
|
1513
|
-
}
|
|
1514
|
-
console.log(`Group "${group}" was deleted`);
|
|
1515
|
-
return void callback();
|
|
1516
|
-
});
|
|
1517
|
-
} else if (command2 === "list" || command2 === "l") {
|
|
1518
|
-
users.getGroup(group, (err, isEnabled, members) => {
|
|
1519
|
-
if (err) {
|
|
1520
|
-
console.error(err);
|
|
1521
|
-
return void callback(import_js_controller_common2.EXIT_CODES.CANNOT_CREATE_USER_OR_GROUP);
|
|
1522
|
-
}
|
|
1523
|
-
console.log(`Group "${group}" is ${isEnabled ? "enabled" : "disabled"} and has following members:`);
|
|
1524
|
-
if (members) {
|
|
1525
|
-
for (const member of members) {
|
|
1526
|
-
console.log(member.substring("system.user.".length));
|
|
1527
|
-
}
|
|
1528
|
-
}
|
|
1529
|
-
return void callback();
|
|
1530
|
-
});
|
|
1531
|
-
} else if (command2 === "enable" || command2 === "e") {
|
|
1532
|
-
users.enableGroup(group, true, (err) => {
|
|
1533
|
-
if (err) {
|
|
1534
|
-
console.error(err);
|
|
1535
|
-
return void callback(import_js_controller_common2.EXIT_CODES.CANNOT_CREATE_USER_OR_GROUP);
|
|
1536
|
-
}
|
|
1537
|
-
console.log(`Group "${group}" was successfully enabled.`);
|
|
1538
|
-
return void callback();
|
|
1539
|
-
});
|
|
1540
|
-
} else if (command2 === "disable" || command2 === "d") {
|
|
1541
|
-
users.enableGroup(group, false, (err) => {
|
|
1542
|
-
if (err) {
|
|
1543
|
-
console.error(err);
|
|
1544
|
-
return void callback(import_js_controller_common2.EXIT_CODES.CANNOT_CREATE_USER_OR_GROUP);
|
|
1545
|
-
}
|
|
1546
|
-
console.log(`Group "${group}" was successfully disabled.`);
|
|
1547
|
-
return void callback();
|
|
1548
|
-
});
|
|
1549
|
-
} else if (command2 === "get") {
|
|
1550
|
-
users.getGroup(group, (err, isEnabled) => {
|
|
1551
|
-
if (err) {
|
|
1552
|
-
console.error(err);
|
|
1553
|
-
return void callback(import_js_controller_common2.EXIT_CODES.CANNOT_CREATE_USER_OR_GROUP);
|
|
1554
|
-
}
|
|
1555
|
-
console.log(`Group "${group}" is ${isEnabled ? "enabled" : "disabled"}`);
|
|
1556
|
-
return void callback();
|
|
1557
|
-
});
|
|
1558
|
-
} else {
|
|
1559
|
-
console.warn(`Unknown command "${command2}". Available commands are: add, del, passwd, enable, disable, list, get`);
|
|
1560
|
-
return void callback(import_js_controller_common2.EXIT_CODES.INVALID_ARGUMENTS);
|
|
1561
|
-
}
|
|
1562
|
-
});
|
|
487
|
+
case "package":
|
|
488
|
+
return processCommandPackage(options);
|
|
489
|
+
case "set":
|
|
490
|
+
return processCommandSet(options);
|
|
491
|
+
case "host": {
|
|
492
|
+
const hostCommand = new import_cliHost.CLIHost(commandOptions);
|
|
493
|
+
hostCommand.execute(args);
|
|
1563
494
|
break;
|
|
1564
495
|
}
|
|
1565
|
-
case "
|
|
1566
|
-
const
|
|
1567
|
-
|
|
1568
|
-
|
|
1569
|
-
|
|
1570
|
-
|
|
1571
|
-
|
|
1572
|
-
|
|
1573
|
-
|
|
1574
|
-
|
|
1575
|
-
|
|
1576
|
-
|
|
1577
|
-
|
|
1578
|
-
|
|
1579
|
-
|
|
1580
|
-
|
|
1581
|
-
|
|
1582
|
-
|
|
1583
|
-
|
|
496
|
+
case "visdebug": {
|
|
497
|
+
const { processCommandVisDebug } = await import("../lib/setup/setupVisDebug.js");
|
|
498
|
+
return processCommandVisDebug(options);
|
|
499
|
+
}
|
|
500
|
+
case "file":
|
|
501
|
+
case "f":
|
|
502
|
+
return processCommandFile(options);
|
|
503
|
+
case "id":
|
|
504
|
+
case "uuid":
|
|
505
|
+
return processCommandUuid(options);
|
|
506
|
+
case "v":
|
|
507
|
+
case "version":
|
|
508
|
+
return processCommandVersion(options);
|
|
509
|
+
case "checklog":
|
|
510
|
+
return processCommandCheckLog(options);
|
|
511
|
+
case "repo": {
|
|
512
|
+
const { processCommandRepo } = await import("../lib/setup/setupRepo.js");
|
|
513
|
+
return processCommandRepo(options);
|
|
514
|
+
}
|
|
515
|
+
case "multihost":
|
|
516
|
+
case "mh": {
|
|
517
|
+
const { processCommandMultihost } = await import("../lib/setup/setupMultihost.js");
|
|
518
|
+
return processCommandMultihost(options);
|
|
519
|
+
}
|
|
520
|
+
case "vendor": {
|
|
521
|
+
const { processCommandVendor } = await import("../lib/setup/setupVendor.js");
|
|
522
|
+
return processCommandVendor(options);
|
|
523
|
+
}
|
|
524
|
+
case "cert": {
|
|
525
|
+
const certCommand = new import_cliCert.CLICert(commandOptions);
|
|
526
|
+
Promise.resolve(certCommand.execute(args)).catch((e) => console.error(`Cannot execute cert command: ${e.message}`));
|
|
1584
527
|
break;
|
|
1585
528
|
}
|
|
1586
|
-
case "
|
|
1587
|
-
const
|
|
1588
|
-
|
|
1589
|
-
(0, import_dbConnection.dbConnect)(params, async ({ objects }) => {
|
|
1590
|
-
const { Users } = await import("./setup/setupUsers.js");
|
|
1591
|
-
const users = new Users({
|
|
1592
|
-
objects,
|
|
1593
|
-
processExit: callback
|
|
1594
|
-
});
|
|
1595
|
-
users.setUserPassword(user, password, (err) => {
|
|
1596
|
-
if (err) {
|
|
1597
|
-
console.error(err);
|
|
1598
|
-
return void callback(import_js_controller_common2.EXIT_CODES.CANNOT_CREATE_USER_OR_GROUP);
|
|
1599
|
-
}
|
|
1600
|
-
console.log(`Password for "${user}" was successfully set.`);
|
|
1601
|
-
return void callback();
|
|
1602
|
-
});
|
|
1603
|
-
});
|
|
529
|
+
case "compact": {
|
|
530
|
+
const compactCommand = new import_cliCompact.CLICompact(commandOptions);
|
|
531
|
+
compactCommand.execute(args);
|
|
1604
532
|
break;
|
|
1605
533
|
}
|
|
1606
|
-
case "
|
|
1607
|
-
|
|
1608
|
-
|
|
1609
|
-
case "deluser": {
|
|
1610
|
-
const user = args[0];
|
|
1611
|
-
(0, import_dbConnection.dbConnect)(params, async ({ objects }) => {
|
|
1612
|
-
const { Users } = await import("./setup/setupUsers.js");
|
|
1613
|
-
const users = new Users({
|
|
1614
|
-
objects,
|
|
1615
|
-
processExit: callback
|
|
1616
|
-
});
|
|
1617
|
-
users.delUser(user, (err) => {
|
|
1618
|
-
if (err) {
|
|
1619
|
-
console.error(err);
|
|
1620
|
-
return void callback(import_js_controller_common2.EXIT_CODES.CANNOT_CREATE_USER_OR_GROUP);
|
|
1621
|
-
}
|
|
1622
|
-
console.log(`User "${user}" deleted`);
|
|
1623
|
-
return void callback();
|
|
1624
|
-
});
|
|
1625
|
-
});
|
|
534
|
+
case "plugin": {
|
|
535
|
+
const pluginCommand = new import_cliPlugin.CLIPlugin(commandOptions);
|
|
536
|
+
pluginCommand.execute(args);
|
|
1626
537
|
break;
|
|
1627
538
|
}
|
|
1628
|
-
|
|
1629
|
-
|
|
1630
|
-
|
|
1631
|
-
|
|
1632
|
-
|
|
1633
|
-
|
|
1634
|
-
|
|
1635
|
-
|
|
1636
|
-
|
|
1637
|
-
|
|
1638
|
-
|
|
1639
|
-
|
|
1640
|
-
author: "bluefox <dogafox@gmail.com>"
|
|
1641
|
-
};
|
|
1642
|
-
import_js_controller_common.tools.getRepositoryFile(null, null, (_err, sources, _sourcesHash) => {
|
|
1643
|
-
if (sources) {
|
|
1644
|
-
for (const s in sources) {
|
|
1645
|
-
if (Object.prototype.hasOwnProperty.call(sources, s)) {
|
|
1646
|
-
if (sources[s].url) {
|
|
1647
|
-
if (!json.dependencies[`${import_js_controller_common.tools.appName}.${s}`]) {
|
|
1648
|
-
json.optionalDependencies[`${import_js_controller_common.tools.appName}.${s}`] = sources[s].url;
|
|
1649
|
-
}
|
|
1650
|
-
} else {
|
|
1651
|
-
if (!json.dependencies[`${import_js_controller_common.tools.appName}.${s}`]) {
|
|
1652
|
-
json.optionalDependencies[`${import_js_controller_common.tools.appName}.${s}`] = "*";
|
|
1653
|
-
}
|
|
1654
|
-
}
|
|
1655
|
-
}
|
|
539
|
+
case "license": {
|
|
540
|
+
const { processCommandLicense } = await import("../lib/setup/setupLicense.js");
|
|
541
|
+
return processCommandLicense(options);
|
|
542
|
+
}
|
|
543
|
+
default: {
|
|
544
|
+
if (params.v || params.version) {
|
|
545
|
+
let pckg;
|
|
546
|
+
if (command) {
|
|
547
|
+
try {
|
|
548
|
+
pckg = require2(`${import_js_controller_common.tools.appName.toLowerCase()}.${command}/package.json`);
|
|
549
|
+
} catch {
|
|
550
|
+
pckg = { version: `"${command}" not found` };
|
|
1656
551
|
}
|
|
552
|
+
} else {
|
|
553
|
+
pckg = require2(`@iobroker/js-controller-common/package.json`);
|
|
1657
554
|
}
|
|
1658
|
-
|
|
1659
|
-
|
|
1660
|
-
|
|
1661
|
-
|
|
1662
|
-
}
|
|
1663
|
-
case "set": {
|
|
1664
|
-
const instance = args[0];
|
|
1665
|
-
if (!instance) {
|
|
1666
|
-
console.warn("please specify instance.");
|
|
1667
|
-
return void callback(import_js_controller_common2.EXIT_CODES.INVALID_ADAPTER_ID);
|
|
555
|
+
console.log(pckg.version);
|
|
556
|
+
} else {
|
|
557
|
+
showHelp();
|
|
558
|
+
return void callback(import_js_controller_common.EXIT_CODES.INVALID_ARGUMENTS);
|
|
1668
559
|
}
|
|
1669
|
-
|
|
1670
|
-
|
|
1671
|
-
|
|
560
|
+
return void callback();
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
__name(processCommand, "processCommand");
|
|
565
|
+
function processCommandInfo(options) {
|
|
566
|
+
const { params, callback } = options;
|
|
567
|
+
(0, import_dbConnection.dbConnect)(params, async ({ objects }) => {
|
|
568
|
+
try {
|
|
569
|
+
const data = await import_js_controller_common.tools.getHostInfo(objects);
|
|
570
|
+
for (const attr in data) {
|
|
571
|
+
let info;
|
|
572
|
+
if (attr === "Uptime" || attr === "System uptime") {
|
|
573
|
+
info = formatters.formatSeconds(data[attr]);
|
|
574
|
+
} else if (attr === "RAM") {
|
|
575
|
+
info = formatters.formatRam(data[attr]);
|
|
576
|
+
} else if (attr === "Speed") {
|
|
577
|
+
info = formatters.formatSpeed(data[attr]);
|
|
578
|
+
} else if (attr === "Disk size" || attr === "Disk free") {
|
|
579
|
+
info = formatters.formatBytes(data[attr]);
|
|
580
|
+
} else {
|
|
581
|
+
info = data[attr];
|
|
582
|
+
}
|
|
583
|
+
console.log(`${attr}${attr.length < 16 ? new Array(16 - attr.length).join(" ") : ""}: ${info || ""}`);
|
|
1672
584
|
}
|
|
1673
|
-
|
|
1674
|
-
|
|
1675
|
-
|
|
1676
|
-
|
|
1677
|
-
|
|
585
|
+
} catch (err) {
|
|
586
|
+
console.error(`Cannot read host info: ${typeof err === "object" ? JSON.stringify(err) : err}`);
|
|
587
|
+
return callback(import_js_controller_common.EXIT_CODES.CANNOT_GET_HOST_INFO);
|
|
588
|
+
}
|
|
589
|
+
return void callback();
|
|
590
|
+
});
|
|
591
|
+
}
|
|
592
|
+
__name(processCommandInfo, "processCommandInfo");
|
|
593
|
+
async function processCommandRebuild(options) {
|
|
594
|
+
const { callback, commandOptions } = options;
|
|
595
|
+
const rebuildOptions = { debug: process.argv.includes("--debug") };
|
|
596
|
+
if (commandOptions.path) {
|
|
597
|
+
if (import_node_path.default.isAbsolute(commandOptions.path)) {
|
|
598
|
+
rebuildOptions.cwd = commandOptions.path;
|
|
599
|
+
} else {
|
|
600
|
+
console.log("Path argument needs to be an absolute path!");
|
|
601
|
+
return void (0, import_dbConnection.exitApplicationSave)(import_js_controller_common.EXIT_CODES.INVALID_ARGUMENTS);
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
if (commandOptions.module) {
|
|
605
|
+
rebuildOptions.module = commandOptions.module;
|
|
606
|
+
console.log(`Rebuilding native module "${commandOptions.module}"${rebuildOptions.cwd ? ` in ${rebuildOptions.cwd}` : ""} ...`);
|
|
607
|
+
} else {
|
|
608
|
+
console.log(`Rebuilding native modules${rebuildOptions.cwd ? ` in ${rebuildOptions.cwd}` : ""} ...`);
|
|
609
|
+
}
|
|
610
|
+
const result = await import_js_controller_common.tools.rebuildNodeModules(rebuildOptions);
|
|
611
|
+
if (result.success) {
|
|
612
|
+
console.log();
|
|
613
|
+
console.log(`Rebuilding native modules done`);
|
|
614
|
+
return void callback();
|
|
615
|
+
}
|
|
616
|
+
console.error("Rebuilding native modules failed");
|
|
617
|
+
return void (0, import_dbConnection.exitApplicationSave)(result.exitCode);
|
|
618
|
+
}
|
|
619
|
+
__name(processCommandRebuild, "processCommandRebuild");
|
|
620
|
+
async function processCommandUnsetup(options) {
|
|
621
|
+
const { params, callback } = options;
|
|
622
|
+
const rl = (await import("node:readline")).createInterface({
|
|
623
|
+
input: process.stdin,
|
|
624
|
+
output: process.stdout
|
|
625
|
+
});
|
|
626
|
+
if (params.yes || params.y || params.Y) {
|
|
627
|
+
unsetup(params, callback).catch((e) => console.error(`Cannot unsetup: ${e.message}`));
|
|
628
|
+
} else {
|
|
629
|
+
rl.question("UUID will be deleted. Are you sure? [y/N]: ", (answer) => {
|
|
630
|
+
rl.close();
|
|
631
|
+
answer = answer.toLowerCase();
|
|
632
|
+
if (answer === "y" || answer === "yes" || answer === "ja" || answer === "j") {
|
|
633
|
+
unsetup(params, callback).catch((e) => console.error(`Cannot unsetup: ${e.message}`));
|
|
634
|
+
return;
|
|
1678
635
|
}
|
|
1679
|
-
|
|
1680
|
-
|
|
1681
|
-
|
|
1682
|
-
|
|
1683
|
-
|
|
1684
|
-
|
|
1685
|
-
|
|
1686
|
-
|
|
1687
|
-
|
|
1688
|
-
|
|
1689
|
-
|
|
1690
|
-
|
|
1691
|
-
|
|
1692
|
-
|
|
636
|
+
console.log("Nothing deleted");
|
|
637
|
+
return void callback();
|
|
638
|
+
});
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
__name(processCommandUnsetup, "processCommandUnsetup");
|
|
642
|
+
function processCommandClean(options) {
|
|
643
|
+
const { args, params, callback } = options;
|
|
644
|
+
const yes = args[0];
|
|
645
|
+
if (yes !== "yes") {
|
|
646
|
+
console.log(`Command "clean" clears all Objects and States. To execute it write "${import_js_controller_common.tools.appName} clean yes"`);
|
|
647
|
+
return void callback(import_js_controller_common.EXIT_CODES.INVALID_ARGUMENTS);
|
|
648
|
+
}
|
|
649
|
+
(0, import_dbConnection.dbConnect)(params, async ({ isOffline }) => {
|
|
650
|
+
if (!isOffline) {
|
|
651
|
+
console.error(`Stop ${import_js_controller_common.tools.appName} first!`);
|
|
652
|
+
return void callback(import_js_controller_common.EXIT_CODES.CONTROLLER_RUNNING);
|
|
653
|
+
}
|
|
654
|
+
try {
|
|
655
|
+
const count = await cleanDatabase(true);
|
|
656
|
+
console.log(`Deleted ${count} states`);
|
|
657
|
+
} catch {
|
|
658
|
+
}
|
|
659
|
+
restartController().catch((e) => console.error(`Cannot restart controller: ${e.message}`));
|
|
660
|
+
console.log(`Restarting ${import_js_controller_common.tools.appName}...`);
|
|
661
|
+
callback();
|
|
662
|
+
});
|
|
663
|
+
}
|
|
664
|
+
__name(processCommandClean, "processCommandClean");
|
|
665
|
+
function processCommandTouch(options) {
|
|
666
|
+
const { args, params, callback } = options;
|
|
667
|
+
let pattern = args[0];
|
|
668
|
+
if (!pattern) {
|
|
669
|
+
console.log('No file path found. Example: "touch /vis-2.0/main/*"');
|
|
670
|
+
return void callback(import_js_controller_common.EXIT_CODES.INVALID_ARGUMENTS);
|
|
671
|
+
}
|
|
672
|
+
(0, import_dbConnection.dbConnect)(params, ({ objects }) => {
|
|
673
|
+
pattern = pattern.replace(/\\/g, "/");
|
|
674
|
+
if (pattern[0] === "/") {
|
|
675
|
+
pattern = pattern.substring(1);
|
|
676
|
+
}
|
|
677
|
+
if (pattern === "*") {
|
|
678
|
+
objects.getObjectList({
|
|
679
|
+
startkey: "system.adapter.",
|
|
680
|
+
endkey: "system.adapter.\u9999"
|
|
681
|
+
}, async (err, arr) => {
|
|
682
|
+
if (!err && arr?.rows) {
|
|
683
|
+
const files = [];
|
|
684
|
+
for (const row of arr.rows) {
|
|
685
|
+
const rowTyped = row.value;
|
|
686
|
+
if (rowTyped.type !== "adapter") {
|
|
687
|
+
continue;
|
|
1693
688
|
}
|
|
1694
|
-
|
|
1695
|
-
|
|
1696
|
-
|
|
1697
|
-
console.warn(`Adapter "${instance}" has no setting "${attr}".`);
|
|
689
|
+
await new Promise((resolve) => objects.touch(rowTyped.common.name, "*", { user: "system.user.admin" }, (err2) => {
|
|
690
|
+
if (!err2) {
|
|
691
|
+
files.push(rowTyped.common.name);
|
|
1698
692
|
} else {
|
|
1699
|
-
|
|
1700
|
-
obj.native[parts[0]][parts[1]] = val;
|
|
1701
|
-
console.log(`New ${attr} for "${instance}" is: ${val}`);
|
|
693
|
+
console.warn(`Cannot touch file ${rowTyped.common.name}`);
|
|
1702
694
|
}
|
|
1703
|
-
|
|
1704
|
-
|
|
1705
|
-
|
|
1706
|
-
|
|
1707
|
-
|
|
1708
|
-
|
|
1709
|
-
console.log(`New ${attr} for "${instance}" is: ${val}`);
|
|
1710
|
-
}
|
|
1711
|
-
}
|
|
1712
|
-
a++;
|
|
695
|
+
resolve();
|
|
696
|
+
}));
|
|
697
|
+
}
|
|
698
|
+
files.sort((a, b) => a.localeCompare(b));
|
|
699
|
+
for (const file of files) {
|
|
700
|
+
console.log(`Touched ${file}`);
|
|
1713
701
|
}
|
|
702
|
+
setTimeout(callback, 1e3);
|
|
1714
703
|
}
|
|
1715
|
-
|
|
1716
|
-
|
|
1717
|
-
|
|
1718
|
-
|
|
1719
|
-
|
|
1720
|
-
|
|
1721
|
-
|
|
704
|
+
});
|
|
705
|
+
} else {
|
|
706
|
+
const parts = pattern.split("/");
|
|
707
|
+
const id = parts.shift();
|
|
708
|
+
const path2 = parts.join("/");
|
|
709
|
+
objects.touch(id, path2, { user: "system.user.admin" }, (err) => {
|
|
710
|
+
if (err) {
|
|
711
|
+
console.error(err);
|
|
1722
712
|
} else {
|
|
1723
|
-
console.log(
|
|
1724
|
-
return void callback();
|
|
713
|
+
console.log(`Touched ${id}/${path2}`);
|
|
1725
714
|
}
|
|
1726
|
-
|
|
1727
|
-
import_messages.error.invalidInstance(instance);
|
|
1728
|
-
return void callback(import_js_controller_common2.EXIT_CODES.INVALID_ADAPTER_ID);
|
|
1729
|
-
}
|
|
1730
|
-
break;
|
|
1731
|
-
}
|
|
1732
|
-
case "host": {
|
|
1733
|
-
const hostCommand = new import_cliHost.CLIHost(commandOptions);
|
|
1734
|
-
hostCommand.execute(args);
|
|
1735
|
-
break;
|
|
1736
|
-
}
|
|
1737
|
-
case "visdebug": {
|
|
1738
|
-
let widgetset = args[0];
|
|
1739
|
-
if (widgetset && widgetset.startsWith("vis-")) {
|
|
1740
|
-
widgetset = widgetset.substring(4);
|
|
1741
|
-
}
|
|
1742
|
-
const { VisDebug } = await import("./setup/setupVisDebug.js");
|
|
1743
|
-
(0, import_dbConnection.dbConnect)(params, ({ objects }) => {
|
|
1744
|
-
const visDebug = new VisDebug({
|
|
1745
|
-
objects,
|
|
1746
|
-
processExit: callback
|
|
1747
|
-
});
|
|
1748
|
-
visDebug.enableDebug(widgetset);
|
|
715
|
+
setTimeout(callback, 1e3);
|
|
1749
716
|
});
|
|
1750
|
-
break;
|
|
1751
717
|
}
|
|
1752
|
-
|
|
1753
|
-
|
|
1754
|
-
|
|
1755
|
-
|
|
1756
|
-
|
|
1757
|
-
|
|
1758
|
-
|
|
1759
|
-
|
|
1760
|
-
|
|
1761
|
-
|
|
1762
|
-
|
|
1763
|
-
|
|
1764
|
-
|
|
1765
|
-
|
|
1766
|
-
|
|
1767
|
-
|
|
1768
|
-
|
|
1769
|
-
|
|
1770
|
-
|
|
1771
|
-
|
|
1772
|
-
|
|
1773
|
-
|
|
1774
|
-
|
|
1775
|
-
|
|
718
|
+
});
|
|
719
|
+
}
|
|
720
|
+
__name(processCommandTouch, "processCommandTouch");
|
|
721
|
+
function processCommandRm(options) {
|
|
722
|
+
const { args, params, callback } = options;
|
|
723
|
+
let pattern = args[0];
|
|
724
|
+
if (!pattern) {
|
|
725
|
+
console.log('No file path found. Example: "touch /vis-2.0/main/*"');
|
|
726
|
+
return void callback(import_js_controller_common.EXIT_CODES.INVALID_ARGUMENTS);
|
|
727
|
+
}
|
|
728
|
+
(0, import_dbConnection.dbConnect)(params, ({ objects }) => {
|
|
729
|
+
pattern = pattern.replace(/\\/g, "/");
|
|
730
|
+
if (pattern[0] === "/") {
|
|
731
|
+
pattern = pattern.substring(1);
|
|
732
|
+
}
|
|
733
|
+
if (pattern === "*") {
|
|
734
|
+
objects.getObjectList({
|
|
735
|
+
startkey: "system.adapter.",
|
|
736
|
+
endkey: "system.adapter.\u9999"
|
|
737
|
+
}, async (err, arr) => {
|
|
738
|
+
if (!err && arr?.rows) {
|
|
739
|
+
const files = [];
|
|
740
|
+
for (const row of arr.rows) {
|
|
741
|
+
const rowTyped = row.value;
|
|
742
|
+
if (rowTyped.type !== "adapter") {
|
|
743
|
+
continue;
|
|
1776
744
|
}
|
|
745
|
+
await new Promise((resolve) => objects.rm(rowTyped.common.name, "*", { user: "system.user.admin" }, (err2, processed) => {
|
|
746
|
+
if (!err2 && processed) {
|
|
747
|
+
files.push({ id: rowTyped.common.name, processed });
|
|
748
|
+
}
|
|
749
|
+
resolve();
|
|
750
|
+
}));
|
|
1777
751
|
}
|
|
1778
|
-
|
|
1779
|
-
|
|
1780
|
-
|
|
1781
|
-
|
|
1782
|
-
if (!adapt) {
|
|
1783
|
-
console.log(`Invalid parameters: adapter cannot be found!`);
|
|
1784
|
-
return void callback(import_js_controller_common2.EXIT_CODES.INVALID_ARGUMENTS);
|
|
1785
|
-
}
|
|
1786
|
-
if (!parts.length) {
|
|
1787
|
-
console.log("Invalid parameters: file cannot be found: file not provided");
|
|
1788
|
-
return void callback(import_js_controller_common2.EXIT_CODES.INVALID_ARGUMENTS);
|
|
1789
|
-
}
|
|
1790
|
-
objects.readFile(adapt, parts.join("/"), null, (err, data) => {
|
|
1791
|
-
err && console.error(err);
|
|
1792
|
-
if (data) {
|
|
1793
|
-
const destFilename = path2.join("/");
|
|
1794
|
-
import_fs_extra.default.writeFileSync(destFilename, data);
|
|
1795
|
-
console.log(`File "${toRead}" stored as "${destFilename}"`);
|
|
752
|
+
files.sort((a, b) => a.id.localeCompare(b.id));
|
|
753
|
+
for (const file of files) {
|
|
754
|
+
for (const processedFile of file.processed) {
|
|
755
|
+
console.log(`Removed ${processedFile.path}/${processedFile.file}`);
|
|
1796
756
|
}
|
|
1797
|
-
return void callback(import_js_controller_common2.EXIT_CODES.NO_ERROR);
|
|
1798
|
-
});
|
|
1799
|
-
} else if (cmd === "write" || cmd === "w") {
|
|
1800
|
-
const toRead = args[1] || "";
|
|
1801
|
-
const parts = toRead.replace(/\\/g, "/").split("/");
|
|
1802
|
-
const path2 = (args[2] || "").replace(/\\/g, "/").split("/");
|
|
1803
|
-
let adapt = path2.shift();
|
|
1804
|
-
if (!adapt) {
|
|
1805
|
-
adapt = path2.shift();
|
|
1806
|
-
}
|
|
1807
|
-
if (!path2.length) {
|
|
1808
|
-
path2.push("");
|
|
1809
|
-
}
|
|
1810
|
-
const fileSrc = parts[parts.length - 1];
|
|
1811
|
-
let fileDest = path2[path2.length - 1];
|
|
1812
|
-
if (!fileDest || !fileDest.match(/\.[a-zA-Z0-9]+$/)) {
|
|
1813
|
-
fileDest = "";
|
|
1814
|
-
}
|
|
1815
|
-
if (!fileSrc || !import_fs_extra.default.existsSync(toRead)) {
|
|
1816
|
-
console.log(`Please provide a valid file name as source file: "file write /opt/SOURCE/script.js /vis-2/DESTINATION/script.js"`);
|
|
1817
|
-
return void callback(import_js_controller_common2.EXIT_CODES.INVALID_ARGUMENTS);
|
|
1818
757
|
}
|
|
1819
|
-
|
|
1820
|
-
|
|
1821
|
-
|
|
1822
|
-
|
|
1823
|
-
|
|
1824
|
-
|
|
1825
|
-
|
|
1826
|
-
|
|
1827
|
-
|
|
1828
|
-
|
|
1829
|
-
|
|
1830
|
-
|
|
1831
|
-
|
|
758
|
+
setTimeout(callback, 1e3);
|
|
759
|
+
}
|
|
760
|
+
});
|
|
761
|
+
} else {
|
|
762
|
+
const parts = pattern.split("/");
|
|
763
|
+
const id = parts.shift();
|
|
764
|
+
const path2 = parts.join("/");
|
|
765
|
+
objects.rm(id, path2, { user: "system.user.admin" }, (err, processed) => {
|
|
766
|
+
if (err) {
|
|
767
|
+
console.error(err);
|
|
768
|
+
} else {
|
|
769
|
+
if (processed) {
|
|
770
|
+
for (const file of processed) {
|
|
771
|
+
console.log(`Removed ${file.path}/${file.file}`);
|
|
1832
772
|
}
|
|
1833
773
|
}
|
|
1834
|
-
|
|
1835
|
-
|
|
1836
|
-
|
|
1837
|
-
|
|
1838
|
-
|
|
1839
|
-
|
|
1840
|
-
|
|
1841
|
-
|
|
1842
|
-
|
|
1843
|
-
|
|
1844
|
-
|
|
1845
|
-
|
|
1846
|
-
|
|
1847
|
-
|
|
1848
|
-
|
|
1849
|
-
|
|
1850
|
-
|
|
1851
|
-
|
|
1852
|
-
|
|
1853
|
-
|
|
1854
|
-
|
|
1855
|
-
|
|
1856
|
-
|
|
1857
|
-
|
|
774
|
+
}
|
|
775
|
+
setTimeout(callback, 1e3);
|
|
776
|
+
});
|
|
777
|
+
}
|
|
778
|
+
});
|
|
779
|
+
}
|
|
780
|
+
__name(processCommandRm, "processCommandRm");
|
|
781
|
+
function processCommandChmod(options) {
|
|
782
|
+
const { args, params, callback } = options;
|
|
783
|
+
let mode = args[0];
|
|
784
|
+
let pattern = args[1];
|
|
785
|
+
if (!mode) {
|
|
786
|
+
import_messages.error.requiredArgumentMissing("mode", "chmod 777 /vis-2.0/main/*");
|
|
787
|
+
return void callback(import_js_controller_common.EXIT_CODES.INVALID_ARGUMENTS);
|
|
788
|
+
}
|
|
789
|
+
mode = parseInt(mode.toString(), 16);
|
|
790
|
+
if (!pattern) {
|
|
791
|
+
import_messages.error.requiredArgumentMissing("file path", "chmod 777 /vis-2.0/main/*");
|
|
792
|
+
return void callback(import_js_controller_common.EXIT_CODES.INVALID_ARGUMENTS);
|
|
793
|
+
}
|
|
794
|
+
(0, import_dbConnection.dbConnect)(params, ({ objects, states }) => {
|
|
795
|
+
pattern = pattern.replace(/\\/g, "/");
|
|
796
|
+
if (pattern[0] === "/") {
|
|
797
|
+
pattern = pattern.substring(1);
|
|
798
|
+
}
|
|
799
|
+
if (pattern === "*") {
|
|
800
|
+
objects.getObjectList({
|
|
801
|
+
startkey: "system.adapter.",
|
|
802
|
+
endkey: "system.adapter.\u9999"
|
|
803
|
+
}, async (err, arr) => {
|
|
804
|
+
if (!err && arr?.rows) {
|
|
805
|
+
const files = [];
|
|
806
|
+
for (const row of arr.rows) {
|
|
807
|
+
const rowTyped = row.value;
|
|
808
|
+
if (rowTyped.type !== "adapter") {
|
|
809
|
+
continue;
|
|
810
|
+
}
|
|
811
|
+
await new Promise((resolve) => objects.chmodFile(rowTyped.common.name, "*", {
|
|
812
|
+
user: "system.user.admin",
|
|
813
|
+
mode
|
|
814
|
+
}, (err2, processed) => {
|
|
815
|
+
if (!err2 && processed) {
|
|
816
|
+
files.push({ id: rowTyped.common.name, processed });
|
|
817
|
+
}
|
|
818
|
+
resolve();
|
|
819
|
+
}));
|
|
1858
820
|
}
|
|
1859
|
-
|
|
1860
|
-
|
|
1861
|
-
|
|
1862
|
-
|
|
821
|
+
const list = new import_setupList.List({
|
|
822
|
+
states,
|
|
823
|
+
objects,
|
|
824
|
+
processExit: callback
|
|
1863
825
|
});
|
|
1864
|
-
|
|
1865
|
-
|
|
1866
|
-
|
|
1867
|
-
|
|
1868
|
-
|
|
1869
|
-
if (!objects.syncFileDirectory || !objects.dirExists) {
|
|
1870
|
-
console.log("Please stop ioBroker before syncing files and only use this command on the ioBroker master host!");
|
|
1871
|
-
return void callback(import_js_controller_common2.EXIT_CODES.CONTROLLER_RUNNING);
|
|
1872
|
-
}
|
|
1873
|
-
try {
|
|
1874
|
-
const objExists = await objects.objectExists("meta.user");
|
|
1875
|
-
if (objExists) {
|
|
1876
|
-
const dirExists = objects.dirExists("meta.user");
|
|
1877
|
-
if (!dirExists) {
|
|
1878
|
-
await objects.mkdirAsync("meta.user");
|
|
1879
|
-
console.log('Successfully created "meta.user" directory');
|
|
1880
|
-
}
|
|
826
|
+
files.sort((a, b) => a.id.localeCompare(b.id));
|
|
827
|
+
list.showFileHeader();
|
|
828
|
+
for (const file of files) {
|
|
829
|
+
for (const processedFile of file.processed) {
|
|
830
|
+
list.showFile(file.id, processedFile.path, processedFile);
|
|
1881
831
|
}
|
|
1882
|
-
} catch (err) {
|
|
1883
|
-
console.warn(`Could not create directory "meta.user": ${err.message}`);
|
|
1884
832
|
}
|
|
1885
|
-
|
|
1886
|
-
|
|
1887
|
-
|
|
1888
|
-
|
|
1889
|
-
|
|
1890
|
-
|
|
1891
|
-
|
|
833
|
+
setTimeout(callback, 1e3);
|
|
834
|
+
}
|
|
835
|
+
});
|
|
836
|
+
} else {
|
|
837
|
+
const parts = pattern.split("/");
|
|
838
|
+
const id = parts.shift();
|
|
839
|
+
const path2 = parts.join("/");
|
|
840
|
+
objects.chmodFile(id, path2, { user: "system.user.admin", mode }, (err, processed) => {
|
|
841
|
+
if (err) {
|
|
842
|
+
console.error(err);
|
|
843
|
+
} else {
|
|
844
|
+
if (processed) {
|
|
845
|
+
const list = new import_setupList.List({
|
|
846
|
+
states,
|
|
847
|
+
objects,
|
|
848
|
+
processExit: callback
|
|
849
|
+
});
|
|
850
|
+
list.showFileHeader();
|
|
851
|
+
for (const file of processed) {
|
|
852
|
+
list.showFile(id, file.path, file);
|
|
1892
853
|
}
|
|
1893
|
-
return void callback(import_js_controller_common2.EXIT_CODES.NO_ERROR);
|
|
1894
|
-
} catch (err) {
|
|
1895
|
-
console.error(`Error on sync: ${err.message}. Partial content might have been synced.`);
|
|
1896
|
-
return void callback(import_js_controller_common2.EXIT_CODES.CANNOT_SYNC_FILES);
|
|
1897
854
|
}
|
|
1898
|
-
} else {
|
|
1899
|
-
console.log('Invalid parameters: write "file read /vis-2.0/main/img/picture.png /opt/picture/image.png" to read the file from DB and store it on disk');
|
|
1900
|
-
console.log('or "file write /opt/SOURCE/image.png /vis-2.0/main/DESTINATION/picture.png" to write the file into DB from disk');
|
|
1901
|
-
console.log('or "file rm /vis-2.0/main/img/picture.png" to delete the file in DB');
|
|
1902
|
-
return void callback(import_js_controller_common2.EXIT_CODES.INVALID_ARGUMENTS);
|
|
1903
855
|
}
|
|
856
|
+
setTimeout(callback, 1e3);
|
|
1904
857
|
});
|
|
1905
|
-
break;
|
|
1906
858
|
}
|
|
1907
|
-
|
|
1908
|
-
|
|
1909
|
-
|
|
1910
|
-
|
|
1911
|
-
|
|
1912
|
-
|
|
1913
|
-
|
|
859
|
+
});
|
|
860
|
+
}
|
|
861
|
+
__name(processCommandChmod, "processCommandChmod");
|
|
862
|
+
function processCommandChown(options) {
|
|
863
|
+
const { args, params, callback } = options;
|
|
864
|
+
let user = args[0];
|
|
865
|
+
let group = args[1];
|
|
866
|
+
let pattern = args[2];
|
|
867
|
+
if (!pattern) {
|
|
868
|
+
pattern = group;
|
|
869
|
+
group = void 0;
|
|
870
|
+
}
|
|
871
|
+
if (!user) {
|
|
872
|
+
import_messages.error.requiredArgumentMissing("user", "chown user /vis-2.0/main/*");
|
|
873
|
+
return void callback(import_js_controller_common.EXIT_CODES.INVALID_ARGUMENTS);
|
|
874
|
+
}
|
|
875
|
+
if (!user.startsWith("system.user.")) {
|
|
876
|
+
user = `system.user.${user}`;
|
|
877
|
+
}
|
|
878
|
+
if (group && !group.startsWith("system.group.")) {
|
|
879
|
+
group = `system.group.${group}`;
|
|
880
|
+
}
|
|
881
|
+
if (!pattern) {
|
|
882
|
+
import_messages.error.requiredArgumentMissing("file path", "chown user /vis-2.0/main/*");
|
|
883
|
+
return void callback(import_js_controller_common.EXIT_CODES.INVALID_ARGUMENTS);
|
|
884
|
+
}
|
|
885
|
+
(0, import_dbConnection.dbConnect)(params, ({ objects, states }) => {
|
|
886
|
+
pattern = pattern.replace(/\\/g, "/");
|
|
887
|
+
if (pattern[0] === "/") {
|
|
888
|
+
pattern = pattern.substring(1);
|
|
889
|
+
}
|
|
890
|
+
if (pattern === "*") {
|
|
891
|
+
objects.getObjectList({
|
|
892
|
+
startkey: "system.adapter.",
|
|
893
|
+
endkey: "system.adapter.\u9999"
|
|
894
|
+
}, async (err, arr) => {
|
|
895
|
+
if (!err && arr?.rows) {
|
|
896
|
+
const files = [];
|
|
897
|
+
for (const row of arr.rows) {
|
|
898
|
+
const rowTyped = row.value;
|
|
899
|
+
if (rowTyped.type !== "adapter") {
|
|
900
|
+
continue;
|
|
901
|
+
}
|
|
902
|
+
await new Promise((resolve) => objects.chownFile(rowTyped.common.name, "*", {
|
|
903
|
+
user: "system.user.admin",
|
|
904
|
+
owner: user,
|
|
905
|
+
ownerGroup: group
|
|
906
|
+
}, (err2, processed) => {
|
|
907
|
+
if (!err2 && processed) {
|
|
908
|
+
files.push({ id: rowTyped.common.name, processed });
|
|
909
|
+
}
|
|
910
|
+
resolve();
|
|
911
|
+
}));
|
|
1914
912
|
}
|
|
1915
|
-
if (
|
|
1916
|
-
console.log(
|
|
913
|
+
if (!files.length) {
|
|
914
|
+
console.log("Nothing found");
|
|
1917
915
|
return void callback();
|
|
1918
916
|
}
|
|
1919
|
-
|
|
1920
|
-
|
|
1921
|
-
|
|
917
|
+
const list = new import_setupList.List({
|
|
918
|
+
states,
|
|
919
|
+
objects,
|
|
920
|
+
processExit: callback
|
|
921
|
+
});
|
|
922
|
+
files.sort((a, b) => a.id.localeCompare(b.id));
|
|
923
|
+
list.showFileHeader();
|
|
924
|
+
for (let k = 0; k < files.length; k++) {
|
|
925
|
+
for (let t = 0; t < files[k].processed.length; t++) {
|
|
926
|
+
list.showFile(files[k].id, files[k].processed[t].path, files[k].processed[t]);
|
|
927
|
+
}
|
|
928
|
+
}
|
|
929
|
+
setTimeout(callback, 1e3);
|
|
930
|
+
}
|
|
931
|
+
});
|
|
932
|
+
} else {
|
|
933
|
+
const parts = pattern.split("/");
|
|
934
|
+
const id = parts.shift();
|
|
935
|
+
const path2 = parts.join("/");
|
|
936
|
+
objects.chownFile(id, path2, {
|
|
937
|
+
user: "system.user.admin",
|
|
938
|
+
owner: user,
|
|
939
|
+
ownerGroup: group
|
|
940
|
+
}, (err, processed) => {
|
|
941
|
+
if (err) {
|
|
942
|
+
console.error(err);
|
|
943
|
+
} else {
|
|
944
|
+
if (processed) {
|
|
945
|
+
const list = new import_setupList.List({
|
|
946
|
+
states,
|
|
947
|
+
objects,
|
|
948
|
+
processExit: callback
|
|
949
|
+
});
|
|
950
|
+
list.showFileHeader();
|
|
951
|
+
for (const file of processed) {
|
|
952
|
+
list.showFile(id, file.path, file);
|
|
953
|
+
}
|
|
954
|
+
}
|
|
955
|
+
}
|
|
956
|
+
setTimeout(callback, 1e3);
|
|
1922
957
|
});
|
|
1923
|
-
break;
|
|
1924
958
|
}
|
|
1925
|
-
|
|
1926
|
-
|
|
1927
|
-
|
|
1928
|
-
|
|
1929
|
-
|
|
1930
|
-
|
|
1931
|
-
|
|
1932
|
-
|
|
1933
|
-
|
|
1934
|
-
|
|
1935
|
-
|
|
959
|
+
});
|
|
960
|
+
}
|
|
961
|
+
__name(processCommandChown, "processCommandChown");
|
|
962
|
+
async function processCommandPackage(options) {
|
|
963
|
+
const { callback } = options;
|
|
964
|
+
const json = {
|
|
965
|
+
name: import_js_controller_common.tools.appName,
|
|
966
|
+
engines: {
|
|
967
|
+
node: ">=22"
|
|
968
|
+
},
|
|
969
|
+
optionalDependencies: {},
|
|
970
|
+
dependencies: {
|
|
971
|
+
[`${import_js_controller_common.tools.appName.toLowerCase()}.js-controller`]: "*",
|
|
972
|
+
[`${import_js_controller_common.tools.appName.toLowerCase()}.admin`]: "*"
|
|
973
|
+
},
|
|
974
|
+
author: "bluefox <dogafox@gmail.com>"
|
|
975
|
+
};
|
|
976
|
+
try {
|
|
977
|
+
const sources = await import_js_controller_common.tools.getRepositoryFile();
|
|
978
|
+
if (sources) {
|
|
979
|
+
for (const s in sources) {
|
|
980
|
+
if (Object.prototype.hasOwnProperty.call(sources, s)) {
|
|
981
|
+
if (sources[s].url) {
|
|
982
|
+
if (!json.dependencies[`${import_js_controller_common.tools.appName}.${s}`]) {
|
|
983
|
+
json.optionalDependencies[`${import_js_controller_common.tools.appName}.${s}`] = sources[s].url;
|
|
984
|
+
}
|
|
985
|
+
} else {
|
|
986
|
+
if (!json.dependencies[`${import_js_controller_common.tools.appName}.${s}`]) {
|
|
987
|
+
json.optionalDependencies[`${import_js_controller_common.tools.appName}.${s}`] = "*";
|
|
988
|
+
}
|
|
989
|
+
}
|
|
1936
990
|
}
|
|
1937
|
-
console.log(`Successfully ignored version "${params.ignore}" of adapter "${params.adapter}"!`);
|
|
1938
|
-
callback();
|
|
1939
|
-
return;
|
|
1940
991
|
}
|
|
1941
|
-
|
|
1942
|
-
|
|
1943
|
-
|
|
1944
|
-
|
|
1945
|
-
|
|
1946
|
-
|
|
1947
|
-
|
|
992
|
+
}
|
|
993
|
+
import_fs_extra.default.writeFileSync(import_node_path.default.join(import_js_controller_common.tools.getRootDir(), "package.json"), JSON.stringify(json, null, 2));
|
|
994
|
+
return void callback();
|
|
995
|
+
} catch (e) {
|
|
996
|
+
console.error(`Cannot read repository file: ${e}`);
|
|
997
|
+
return void callback(import_js_controller_common.EXIT_CODES.UNKNOWN_ERROR);
|
|
998
|
+
}
|
|
999
|
+
}
|
|
1000
|
+
__name(processCommandPackage, "processCommandPackage");
|
|
1001
|
+
async function processCommandSet(options) {
|
|
1002
|
+
const { args, params, callback } = options;
|
|
1003
|
+
const instance = args[0];
|
|
1004
|
+
if (!instance) {
|
|
1005
|
+
console.warn("please specify instance.");
|
|
1006
|
+
return void callback(import_js_controller_common.EXIT_CODES.INVALID_ADAPTER_ID);
|
|
1007
|
+
}
|
|
1008
|
+
if (!instance.includes(".")) {
|
|
1009
|
+
console.warn(`please specify instance, like "${instance}.0"`);
|
|
1010
|
+
return void callback(import_js_controller_common.EXIT_CODES.INVALID_ADAPTER_ID);
|
|
1011
|
+
}
|
|
1012
|
+
const { objects } = await (0, import_dbConnection.dbConnectAsync)(false, params);
|
|
1013
|
+
let obj;
|
|
1014
|
+
try {
|
|
1015
|
+
obj = await objects.getObjectAsync(`system.adapter.${instance}`);
|
|
1016
|
+
} catch {
|
|
1017
|
+
}
|
|
1018
|
+
if (obj) {
|
|
1019
|
+
let changed = false;
|
|
1020
|
+
for (let a = 0; a < process.argv.length; a++) {
|
|
1021
|
+
if (process.argv[a].startsWith("--") && process.argv[a + 1] && !process.argv[a + 1].startsWith("--")) {
|
|
1022
|
+
const attr = process.argv[a].substring(2);
|
|
1023
|
+
let val = process.argv[a + 1];
|
|
1024
|
+
if (val === "__EMPTY__") {
|
|
1025
|
+
val = "";
|
|
1026
|
+
} else if (val === "true") {
|
|
1027
|
+
val = true;
|
|
1028
|
+
} else if (val === "false") {
|
|
1029
|
+
val = false;
|
|
1030
|
+
} else if (parseFloat(val).toString() === val) {
|
|
1031
|
+
val = parseFloat(val);
|
|
1948
1032
|
}
|
|
1949
|
-
|
|
1950
|
-
|
|
1951
|
-
|
|
1952
|
-
|
|
1953
|
-
|
|
1954
|
-
|
|
1955
|
-
|
|
1956
|
-
|
|
1957
|
-
|
|
1958
|
-
|
|
1033
|
+
if (attr.indexOf(".") !== -1) {
|
|
1034
|
+
const parts = attr.split(".");
|
|
1035
|
+
if (!obj.native[parts[0]] || obj.native[parts[0]][parts[1]] === void 0) {
|
|
1036
|
+
console.warn(`Adapter "${instance}" has no setting "${attr}".`);
|
|
1037
|
+
} else {
|
|
1038
|
+
changed = true;
|
|
1039
|
+
obj.native[parts[0]][parts[1]] = val;
|
|
1040
|
+
console.log(`New ${attr} for "${instance}" is: ${val}`);
|
|
1041
|
+
}
|
|
1042
|
+
} else {
|
|
1043
|
+
if (obj.native[attr] === void 0) {
|
|
1044
|
+
console.warn(`Adapter "${instance}" has no setting "${attr}".`);
|
|
1045
|
+
} else {
|
|
1046
|
+
changed = true;
|
|
1047
|
+
obj.native[attr] = val;
|
|
1048
|
+
console.log(`New ${attr} for "${instance}" is: ${val}`);
|
|
1049
|
+
}
|
|
1959
1050
|
}
|
|
1960
|
-
|
|
1961
|
-
packJson = require2(`@iobroker/js-controller-common/package.json`);
|
|
1051
|
+
a++;
|
|
1962
1052
|
}
|
|
1963
|
-
console.log(packJson.version);
|
|
1964
|
-
return void callback();
|
|
1965
1053
|
}
|
|
1966
|
-
|
|
1967
|
-
|
|
1968
|
-
|
|
1969
|
-
|
|
1970
|
-
|
|
1971
|
-
|
|
1972
|
-
}
|
|
1973
|
-
console.log(`${import_js_controller_common.tools.appName} is running`);
|
|
1974
|
-
objects.getObjectList({
|
|
1975
|
-
startkey: "system.host.",
|
|
1976
|
-
endkey: `system.host.\u9999`
|
|
1977
|
-
}, null, (err, res) => {
|
|
1978
|
-
if (!err && res?.rows.length) {
|
|
1979
|
-
for (const row of res.rows) {
|
|
1980
|
-
const parts = row.id.split(".");
|
|
1981
|
-
if (parts.length === 3) {
|
|
1982
|
-
states.pushMessage(row.id, {
|
|
1983
|
-
command: "checkLogging",
|
|
1984
|
-
message: null,
|
|
1985
|
-
from: "console"
|
|
1986
|
-
});
|
|
1987
|
-
}
|
|
1988
|
-
}
|
|
1989
|
-
}
|
|
1990
|
-
setTimeout(callback, 200);
|
|
1991
|
-
});
|
|
1054
|
+
if (changed) {
|
|
1055
|
+
obj.from = `system.host.${import_js_controller_common.tools.getHostName()}.cli`;
|
|
1056
|
+
obj.ts = (/* @__PURE__ */ new Date()).getTime();
|
|
1057
|
+
objects.setObject(`system.adapter.${instance}`, obj, () => {
|
|
1058
|
+
console.log(`Instance settings for "${instance}" are changed.`);
|
|
1059
|
+
return void callback();
|
|
1992
1060
|
});
|
|
1993
|
-
|
|
1061
|
+
} else {
|
|
1062
|
+
console.log("No parameters set.");
|
|
1063
|
+
return void callback();
|
|
1994
1064
|
}
|
|
1995
|
-
|
|
1996
|
-
|
|
1997
|
-
|
|
1998
|
-
|
|
1999
|
-
|
|
2000
|
-
|
|
2001
|
-
|
|
2002
|
-
|
|
2003
|
-
|
|
2004
|
-
|
|
2005
|
-
|
|
2006
|
-
|
|
2007
|
-
|
|
2008
|
-
|
|
2009
|
-
|
|
2010
|
-
|
|
2011
|
-
|
|
2012
|
-
|
|
2013
|
-
|
|
2014
|
-
|
|
2015
|
-
|
|
1065
|
+
} else {
|
|
1066
|
+
import_messages.error.invalidInstance(instance);
|
|
1067
|
+
return void callback(import_js_controller_common.EXIT_CODES.INVALID_ADAPTER_ID);
|
|
1068
|
+
}
|
|
1069
|
+
}
|
|
1070
|
+
__name(processCommandSet, "processCommandSet");
|
|
1071
|
+
function processCommandFile(options) {
|
|
1072
|
+
const { args, params, callback } = options;
|
|
1073
|
+
const cmd = args[0];
|
|
1074
|
+
if (cmd !== "read" && cmd !== "r" && cmd !== "w" && cmd !== "write" && cmd !== "sync" && cmd !== "rm" && cmd !== "unlink" && cmd !== "del") {
|
|
1075
|
+
console.log('Invalid parameters: write "file read /vis-2.0/main/img/picture.png /opt/picture/image.png" to read the file');
|
|
1076
|
+
return void callback(import_js_controller_common.EXIT_CODES.INVALID_ARGUMENTS);
|
|
1077
|
+
}
|
|
1078
|
+
if (cmd !== "sync" && !args[1]) {
|
|
1079
|
+
console.log('Invalid parameters: write "file read /vis-2.0/main/img/picture.png /opt/picture/image.png" to read the file from DB and store it on disk');
|
|
1080
|
+
console.log('or "file write /opt/SOURCE/image.png /vis-2.0/main/DESTINATION/picture.png" to write the file into DB from disk');
|
|
1081
|
+
console.log('or "file rm /vis-2.0/main/img/picture.png" to delete the file in DB');
|
|
1082
|
+
return void callback(import_js_controller_common.EXIT_CODES.INVALID_ARGUMENTS);
|
|
1083
|
+
}
|
|
1084
|
+
(0, import_dbConnection.dbConnect)(params, async ({ objects, objectsDBType }) => {
|
|
1085
|
+
if (cmd === "read" || cmd === "r") {
|
|
1086
|
+
const toRead = args[1];
|
|
1087
|
+
const parts = toRead.replace(/\\/g, "/").split("/");
|
|
1088
|
+
const path2 = (args[2] || process.cwd()).replace(/\\/g, "/").split("/");
|
|
1089
|
+
const file = path2[path2.length - 1];
|
|
1090
|
+
if (!file.match(/\.[a-zA-Z0-9]+$/)) {
|
|
1091
|
+
if (file !== "") {
|
|
1092
|
+
path2.push(parts[parts.length - 1]);
|
|
1093
|
+
} else {
|
|
1094
|
+
path2[path2.length - 1] = parts[parts.length - 1];
|
|
2016
1095
|
}
|
|
2017
1096
|
}
|
|
2018
|
-
|
|
2019
|
-
|
|
2020
|
-
|
|
2021
|
-
|
|
1097
|
+
let adapt = parts.shift();
|
|
1098
|
+
if (!adapt) {
|
|
1099
|
+
adapt = parts.shift();
|
|
1100
|
+
}
|
|
1101
|
+
if (!adapt) {
|
|
1102
|
+
console.log(`Invalid parameters: adapter cannot be found!`);
|
|
1103
|
+
return void callback(import_js_controller_common.EXIT_CODES.INVALID_ARGUMENTS);
|
|
1104
|
+
}
|
|
1105
|
+
if (!parts.length) {
|
|
1106
|
+
console.log("Invalid parameters: file cannot be found: file not provided");
|
|
1107
|
+
return void callback(import_js_controller_common.EXIT_CODES.INVALID_ARGUMENTS);
|
|
1108
|
+
}
|
|
1109
|
+
objects.readFile(adapt, parts.join("/"), null, (err, data) => {
|
|
1110
|
+
if (err) {
|
|
1111
|
+
console.error(err);
|
|
2022
1112
|
}
|
|
2023
|
-
if (
|
|
2024
|
-
|
|
2025
|
-
|
|
2026
|
-
}
|
|
2027
|
-
console.error(e.message);
|
|
2028
|
-
return void callback(import_js_controller_common2.EXIT_CODES.INVALID_ARGUMENTS);
|
|
2029
|
-
}
|
|
1113
|
+
if (data) {
|
|
1114
|
+
const destFilename = path2.join("/");
|
|
1115
|
+
import_fs_extra.default.writeFileSync(destFilename, data);
|
|
1116
|
+
console.log(`File "${toRead}" stored as "${destFilename}"`);
|
|
2030
1117
|
}
|
|
2031
|
-
|
|
2032
|
-
|
|
2033
|
-
|
|
2034
|
-
|
|
2035
|
-
|
|
2036
|
-
|
|
2037
|
-
|
|
2038
|
-
|
|
2039
|
-
|
|
2040
|
-
|
|
2041
|
-
|
|
2042
|
-
|
|
2043
|
-
|
|
2044
|
-
|
|
2045
|
-
|
|
2046
|
-
|
|
2047
|
-
|
|
2048
|
-
|
|
2049
|
-
|
|
2050
|
-
|
|
2051
|
-
|
|
2052
|
-
|
|
2053
|
-
|
|
2054
|
-
|
|
2055
|
-
|
|
2056
|
-
|
|
2057
|
-
|
|
2058
|
-
|
|
2059
|
-
|
|
2060
|
-
|
|
2061
|
-
|
|
2062
|
-
|
|
2063
|
-
|
|
2064
|
-
console.log(`Repository "${repoName}" deleted.`);
|
|
2065
|
-
await repo.showRepoStatus();
|
|
2066
|
-
return void callback();
|
|
2067
|
-
} catch (e) {
|
|
2068
|
-
console.error(`Cannot remove repository: ${e.message}`);
|
|
2069
|
-
return void callback(import_js_controller_common2.EXIT_CODES.INVALID_REPO);
|
|
2070
|
-
}
|
|
2071
|
-
} else if (repoUrlOrCommand === "unset") {
|
|
2072
|
-
try {
|
|
2073
|
-
await repo.setInactive(repoName);
|
|
2074
|
-
console.log(`Repository "${repoName}" deactivated.`);
|
|
2075
|
-
await repo.showRepoStatus();
|
|
2076
|
-
return void callback();
|
|
2077
|
-
} catch (e) {
|
|
2078
|
-
console.error(`Cannot deactivate repository: ${e.message}`);
|
|
2079
|
-
return void callback(import_js_controller_common2.EXIT_CODES.INVALID_REPO);
|
|
2080
|
-
}
|
|
1118
|
+
return void callback(import_js_controller_common.EXIT_CODES.NO_ERROR);
|
|
1119
|
+
});
|
|
1120
|
+
} else if (cmd === "write" || cmd === "w") {
|
|
1121
|
+
const toRead = args[1] || "";
|
|
1122
|
+
const parts = toRead.replace(/\\/g, "/").split("/");
|
|
1123
|
+
const path2 = (args[2] || "").replace(/\\/g, "/").split("/");
|
|
1124
|
+
let adapt = path2.shift();
|
|
1125
|
+
if (!adapt) {
|
|
1126
|
+
adapt = path2.shift();
|
|
1127
|
+
}
|
|
1128
|
+
if (!path2.length) {
|
|
1129
|
+
path2.push("");
|
|
1130
|
+
}
|
|
1131
|
+
const fileSrc = parts[parts.length - 1];
|
|
1132
|
+
let fileDest = path2[path2.length - 1];
|
|
1133
|
+
if (!fileDest || !fileDest.match(/\.[a-zA-Z0-9]+$/)) {
|
|
1134
|
+
fileDest = "";
|
|
1135
|
+
}
|
|
1136
|
+
if (!fileSrc || !import_fs_extra.default.existsSync(toRead)) {
|
|
1137
|
+
console.log(`Please provide a valid file name as source file: "file write /opt/SOURCE/script.js /vis-2/DESTINATION/script.js"`);
|
|
1138
|
+
return void callback(import_js_controller_common.EXIT_CODES.INVALID_ARGUMENTS);
|
|
1139
|
+
}
|
|
1140
|
+
const srcStat = import_fs_extra.default.statSync(toRead);
|
|
1141
|
+
if (!srcStat.isFile()) {
|
|
1142
|
+
console.log(`Please provide a valid file name as source file: "file write /opt/SOURCE/script.js /vis-2/DESTINATION/script.js"`);
|
|
1143
|
+
return void callback(import_js_controller_common.EXIT_CODES.INVALID_ARGUMENTS);
|
|
1144
|
+
}
|
|
1145
|
+
if (!fileDest) {
|
|
1146
|
+
fileDest = fileSrc;
|
|
1147
|
+
}
|
|
1148
|
+
if (fileDest !== path2[path2.length - 1]) {
|
|
1149
|
+
if (path2[path2.length - 1] !== "") {
|
|
1150
|
+
path2.push(fileDest);
|
|
2081
1151
|
} else {
|
|
2082
|
-
|
|
2083
|
-
return void callback(import_js_controller_common2.EXIT_CODES.INVALID_ARGUMENTS);
|
|
1152
|
+
path2[path2.length - 1] = fileDest;
|
|
2084
1153
|
}
|
|
2085
1154
|
}
|
|
2086
|
-
|
|
2087
|
-
|
|
2088
|
-
|
|
2089
|
-
|
|
2090
|
-
const cmd = args[0];
|
|
2091
|
-
if (cmd !== "c" && cmd !== "connect" && cmd !== "s" && cmd !== "status" && cmd !== "b" && cmd !== "browse" && cmd !== "e" && cmd !== "enable" && cmd !== "d" && cmd !== "disable") {
|
|
2092
|
-
console.log("Invalid parameters. Following is possible: enable, browse, connect, status");
|
|
2093
|
-
return void callback(import_js_controller_common2.EXIT_CODES.INVALID_ARGUMENTS);
|
|
1155
|
+
const destFilename = path2.length ? path2.join("/") : "/";
|
|
1156
|
+
if (!import_fs_extra.default.existsSync(toRead)) {
|
|
1157
|
+
console.log("Invalid parameters: file does not exist!");
|
|
1158
|
+
return void callback(import_js_controller_common.EXIT_CODES.INVALID_ARGUMENTS);
|
|
2094
1159
|
}
|
|
2095
|
-
|
|
2096
|
-
|
|
2097
|
-
|
|
2098
|
-
|
|
2099
|
-
|
|
2100
|
-
|
|
2101
|
-
|
|
2102
|
-
|
|
2103
|
-
|
|
2104
|
-
|
|
2105
|
-
|
|
2106
|
-
|
|
2107
|
-
|
|
2108
|
-
|
|
2109
|
-
|
|
2110
|
-
|
|
2111
|
-
|
|
2112
|
-
|
|
2113
|
-
|
|
2114
|
-
|
|
2115
|
-
|
|
2116
|
-
|
|
2117
|
-
|
|
2118
|
-
|
|
2119
|
-
|
|
2120
|
-
|
|
2121
|
-
|
|
2122
|
-
|
|
2123
|
-
|
|
2124
|
-
callback();
|
|
2125
|
-
});
|
|
2126
|
-
} else if (cmd === "d" || cmd === "disable") {
|
|
2127
|
-
mh.enable(false, async (err) => {
|
|
2128
|
-
if (err) {
|
|
2129
|
-
console.error(err);
|
|
2130
|
-
return void callback(import_js_controller_common2.EXIT_CODES.CANNOT_ENABLE_MULTIHOST);
|
|
2131
|
-
}
|
|
2132
|
-
await states.pushMessage(`system.host.${import_js_controller_common.tools.getHostName()}`, {
|
|
2133
|
-
command: "updateMultihost",
|
|
2134
|
-
message: null,
|
|
2135
|
-
from: "setup"
|
|
2136
|
-
});
|
|
2137
|
-
callback();
|
|
2138
|
-
});
|
|
2139
|
-
} else if (cmd === "c" || cmd === "connect") {
|
|
2140
|
-
mh.connect(parseInt(args[1]), args[2], (err) => {
|
|
2141
|
-
if (err) {
|
|
2142
|
-
console.error(err);
|
|
2143
|
-
}
|
|
2144
|
-
return void callback(err ? 1 : 0);
|
|
2145
|
-
});
|
|
1160
|
+
const data = import_fs_extra.default.readFileSync(toRead);
|
|
1161
|
+
if (!adapt) {
|
|
1162
|
+
console.log("Invalid parameters: destination adapter cannot be found!");
|
|
1163
|
+
return void callback(import_js_controller_common.EXIT_CODES.INVALID_ARGUMENTS);
|
|
1164
|
+
}
|
|
1165
|
+
objects.writeFile(adapt, destFilename, data, (_err) => {
|
|
1166
|
+
console.log(`File "${toRead}" stored as "${destFilename}"`);
|
|
1167
|
+
return void callback(import_js_controller_common.EXIT_CODES.NO_ERROR);
|
|
1168
|
+
}).catch((e) => console.error(`Cannot write file: ${e.message}`));
|
|
1169
|
+
} else if (cmd === "del" || cmd === "rm" || cmd === "unlink") {
|
|
1170
|
+
const toDelete = args[1];
|
|
1171
|
+
const parts = toDelete.replace(/\\/g, "/").split("/");
|
|
1172
|
+
let adapt = parts.shift();
|
|
1173
|
+
if (!adapt) {
|
|
1174
|
+
adapt = parts.shift();
|
|
1175
|
+
}
|
|
1176
|
+
if (!adapt) {
|
|
1177
|
+
console.log("Invalid parameters: adapter cannot be found!");
|
|
1178
|
+
return void callback(import_js_controller_common.EXIT_CODES.INVALID_ARGUMENTS);
|
|
1179
|
+
}
|
|
1180
|
+
if (!parts.length) {
|
|
1181
|
+
console.log("Invalid parameters: file cannot be found: file not provided");
|
|
1182
|
+
return void callback(import_js_controller_common.EXIT_CODES.INVALID_ARGUMENTS);
|
|
1183
|
+
}
|
|
1184
|
+
objects.unlink(adapt, parts.join("/"), null, (err) => {
|
|
1185
|
+
if (err) {
|
|
1186
|
+
console.error(err);
|
|
1187
|
+
} else {
|
|
1188
|
+
console.log(`File "${toDelete}" was deleted`);
|
|
2146
1189
|
}
|
|
1190
|
+
return void callback(import_js_controller_common.EXIT_CODES.NO_ERROR);
|
|
2147
1191
|
});
|
|
2148
|
-
|
|
2149
|
-
|
|
2150
|
-
|
|
2151
|
-
|
|
2152
|
-
|
|
2153
|
-
|
|
2154
|
-
|
|
2155
|
-
|
|
2156
|
-
${import_js_controller_common.tools.appName.toLowerCase()} vendor <PASS_PHRASE> <vendor.json>`);
|
|
2157
|
-
return void callback(import_js_controller_common2.EXIT_CODES.INVALID_ARGUMENTS);
|
|
1192
|
+
} else if (cmd === "sync") {
|
|
1193
|
+
if (objectsDBType === "redis") {
|
|
1194
|
+
console.log('File Sync is not available when database type "redis" is used.');
|
|
1195
|
+
return void callback(import_js_controller_common.EXIT_CODES.INVALID_ARGUMENTS);
|
|
1196
|
+
}
|
|
1197
|
+
if (!objects.syncFileDirectory || !objects.dirExists) {
|
|
1198
|
+
console.log("Please stop ioBroker before syncing files and only use this command on the ioBroker master host!");
|
|
1199
|
+
return void callback(import_js_controller_common.EXIT_CODES.CONTROLLER_RUNNING);
|
|
2158
1200
|
}
|
|
2159
|
-
const { objects } = await (0, import_dbConnection.dbConnectAsync)(false, params);
|
|
2160
|
-
const { Vendor } = await import("./setup/setupVendor.js");
|
|
2161
|
-
const vendor = new Vendor({ objects });
|
|
2162
1201
|
try {
|
|
2163
|
-
await
|
|
2164
|
-
|
|
2165
|
-
|
|
1202
|
+
const objExists = await objects.objectExists("meta.user");
|
|
1203
|
+
if (objExists) {
|
|
1204
|
+
const dirExists = objects.dirExists("meta.user");
|
|
1205
|
+
if (!dirExists) {
|
|
1206
|
+
await objects.mkdirAsync("meta.user");
|
|
1207
|
+
console.log('Successfully created "meta.user" directory');
|
|
1208
|
+
}
|
|
1209
|
+
}
|
|
2166
1210
|
} catch (err) {
|
|
2167
|
-
console.
|
|
2168
|
-
return void callback(import_js_controller_common2.EXIT_CODES.CANNOT_UPDATE_VENDOR);
|
|
2169
|
-
}
|
|
2170
|
-
}
|
|
2171
|
-
case "cert": {
|
|
2172
|
-
const certCommand = new import_cliCert.CLICert(commandOptions);
|
|
2173
|
-
certCommand.execute(args);
|
|
2174
|
-
break;
|
|
2175
|
-
}
|
|
2176
|
-
case "compact": {
|
|
2177
|
-
const compactCommand = new import_cliCompact.CLICompact(commandOptions);
|
|
2178
|
-
compactCommand.execute(args);
|
|
2179
|
-
break;
|
|
2180
|
-
}
|
|
2181
|
-
case "plugin": {
|
|
2182
|
-
const pluginCommand = new import_cliPlugin.CLIPlugin(commandOptions);
|
|
2183
|
-
pluginCommand.execute(args);
|
|
2184
|
-
break;
|
|
2185
|
-
}
|
|
2186
|
-
case "license": {
|
|
2187
|
-
const file = args[0];
|
|
2188
|
-
if (!file) {
|
|
2189
|
-
console.warn(`Please specify the path to the license file or place license text directly!
|
|
2190
|
-
${import_js_controller_common.tools.appName.toLowerCase()} license <license.file or license.text>`);
|
|
2191
|
-
return void callback(import_js_controller_common2.EXIT_CODES.INVALID_ARGUMENTS);
|
|
1211
|
+
console.warn(`Could not create directory "meta.user": ${err.message}`);
|
|
2192
1212
|
}
|
|
2193
|
-
|
|
2194
|
-
const {
|
|
2195
|
-
|
|
2196
|
-
|
|
2197
|
-
|
|
2198
|
-
console.log(`
|
|
2199
|
-
return void callback();
|
|
2200
|
-
} catch (err) {
|
|
2201
|
-
console.error(`Cannot update license: ${err.message}`);
|
|
2202
|
-
return void callback(import_js_controller_common2.EXIT_CODES.CANNOT_UPDATE_LICENSE);
|
|
1213
|
+
try {
|
|
1214
|
+
const { numberSuccess, notifications } = objects.syncFileDirectory(args[1]);
|
|
1215
|
+
console.log(`${numberSuccess} file(s) successfully synchronized with ioBroker storage`);
|
|
1216
|
+
if (notifications.length) {
|
|
1217
|
+
console.log("\nThe following notifications happened during sync: ");
|
|
1218
|
+
notifications.forEach((el) => console.log(`- ${el}`));
|
|
2203
1219
|
}
|
|
2204
|
-
|
|
2205
|
-
|
|
1220
|
+
return void callback(import_js_controller_common.EXIT_CODES.NO_ERROR);
|
|
1221
|
+
} catch (err) {
|
|
1222
|
+
console.error(`Error on sync: ${err.message}. Partial content might have been synced.`);
|
|
1223
|
+
return void callback(import_js_controller_common.EXIT_CODES.CANNOT_SYNC_FILES);
|
|
1224
|
+
}
|
|
1225
|
+
} else {
|
|
1226
|
+
console.log('Invalid parameters: write "file read /vis-2.0/main/img/picture.png /opt/picture/image.png" to read the file from DB and store it on disk');
|
|
1227
|
+
console.log('or "file write /opt/SOURCE/image.png /vis-2.0/main/DESTINATION/picture.png" to write the file into DB from disk');
|
|
1228
|
+
console.log('or "file rm /vis-2.0/main/img/picture.png" to delete the file in DB');
|
|
1229
|
+
return void callback(import_js_controller_common.EXIT_CODES.INVALID_ARGUMENTS);
|
|
2206
1230
|
}
|
|
2207
|
-
|
|
2208
|
-
|
|
2209
|
-
|
|
2210
|
-
|
|
2211
|
-
|
|
2212
|
-
|
|
2213
|
-
|
|
2214
|
-
|
|
1231
|
+
});
|
|
1232
|
+
}
|
|
1233
|
+
__name(processCommandFile, "processCommandFile");
|
|
1234
|
+
function processCommandUuid(options) {
|
|
1235
|
+
const { params, callback } = options;
|
|
1236
|
+
(0, import_dbConnection.dbConnect)(params, ({ objects }) => {
|
|
1237
|
+
objects.getObject("system.meta.uuid", (err, obj) => {
|
|
1238
|
+
if (err) {
|
|
1239
|
+
console.error(`Error: ${err.message}`);
|
|
1240
|
+
return void callback(import_js_controller_common.EXIT_CODES.CANNOT_GET_UUID);
|
|
1241
|
+
}
|
|
1242
|
+
if (obj?.native) {
|
|
1243
|
+
console.log(obj.native.uuid);
|
|
1244
|
+
return void callback();
|
|
1245
|
+
}
|
|
1246
|
+
console.error("Error: no UUID found");
|
|
1247
|
+
return void callback(import_js_controller_common.EXIT_CODES.CANNOT_GET_UUID);
|
|
1248
|
+
});
|
|
1249
|
+
});
|
|
1250
|
+
}
|
|
1251
|
+
__name(processCommandUuid, "processCommandUuid");
|
|
1252
|
+
async function processCommandVersion(options) {
|
|
1253
|
+
const { params, callback } = options;
|
|
1254
|
+
const adapter = params.adapter;
|
|
1255
|
+
if (params.ignore) {
|
|
1256
|
+
try {
|
|
1257
|
+
const { objects } = await (0, import_dbConnection.dbConnectAsync)(false, params);
|
|
1258
|
+
await (0, import_utils.ignoreVersion)({ adapterName: adapter, version: params.ignore, objects });
|
|
1259
|
+
} catch (e) {
|
|
1260
|
+
console.error(e.message);
|
|
1261
|
+
callback(e instanceof import_customError.IoBrokerError ? e.code : import_js_controller_common.EXIT_CODES.UNKNOWN_ERROR);
|
|
1262
|
+
return;
|
|
1263
|
+
}
|
|
1264
|
+
console.log(`Successfully ignored version "${params.ignore}" of adapter "${params.adapter}"!`);
|
|
1265
|
+
callback();
|
|
1266
|
+
return;
|
|
1267
|
+
}
|
|
1268
|
+
if (params.recognize) {
|
|
1269
|
+
try {
|
|
1270
|
+
const { objects } = await (0, import_dbConnection.dbConnectAsync)(false, params);
|
|
1271
|
+
await (0, import_utils.recognizeVersion)({ adapterName: adapter, objects });
|
|
1272
|
+
} catch (e) {
|
|
1273
|
+
console.error(e.message);
|
|
1274
|
+
callback(e instanceof import_customError.IoBrokerError ? e.code : import_js_controller_common.EXIT_CODES.UNKNOWN_ERROR);
|
|
1275
|
+
}
|
|
1276
|
+
console.log(`Successfully recognized all versions of adapter "${params.adapter}" again!`);
|
|
1277
|
+
callback();
|
|
1278
|
+
return;
|
|
1279
|
+
}
|
|
1280
|
+
let packJson;
|
|
1281
|
+
if (adapter) {
|
|
1282
|
+
try {
|
|
1283
|
+
packJson = require2(`${import_js_controller_common.tools.appName.toLowerCase()}.${adapter}/package.json`);
|
|
1284
|
+
} catch {
|
|
1285
|
+
packJson = { version: `"${adapter}" not found` };
|
|
1286
|
+
}
|
|
1287
|
+
} else {
|
|
1288
|
+
packJson = require2(`@iobroker/js-controller-common/package.json`);
|
|
1289
|
+
}
|
|
1290
|
+
console.log(packJson.version);
|
|
1291
|
+
return void callback();
|
|
1292
|
+
}
|
|
1293
|
+
__name(processCommandVersion, "processCommandVersion");
|
|
1294
|
+
function processCommandCheckLog(options) {
|
|
1295
|
+
const { params, callback } = options;
|
|
1296
|
+
(0, import_dbConnection.dbConnect)(params, async ({ objects, states, isOffline, objectsDBType }) => {
|
|
1297
|
+
const hasLocalObjectsServer = await (0, import_js_controller_common.objectsDbHasServer)(objectsDBType);
|
|
1298
|
+
if (isOffline && hasLocalObjectsServer) {
|
|
1299
|
+
console.log(`${import_js_controller_common.tools.appName} is not running`);
|
|
1300
|
+
return void callback(import_js_controller_common.EXIT_CODES.CONTROLLER_NOT_RUNNING);
|
|
1301
|
+
}
|
|
1302
|
+
console.log(`${import_js_controller_common.tools.appName} is running`);
|
|
1303
|
+
objects.getObjectList({
|
|
1304
|
+
startkey: "system.host.",
|
|
1305
|
+
endkey: `system.host.\u9999`
|
|
1306
|
+
}, null, (err, res) => {
|
|
1307
|
+
if (!err && res?.rows.length) {
|
|
1308
|
+
for (const row of res.rows) {
|
|
1309
|
+
const parts = row.id.split(".");
|
|
1310
|
+
if (parts.length === 3) {
|
|
1311
|
+
states.pushMessage(row.id, {
|
|
1312
|
+
command: "checkLogging",
|
|
1313
|
+
message: null,
|
|
1314
|
+
from: "console"
|
|
1315
|
+
}).catch((e) => console.error(`Cannot push checkLogging message: ${e.message}`));
|
|
2215
1316
|
}
|
|
2216
|
-
} else {
|
|
2217
|
-
pckg = require2(`@iobroker/js-controller-common/package.json`);
|
|
2218
1317
|
}
|
|
2219
|
-
console.log(pckg.version);
|
|
2220
|
-
} else {
|
|
2221
|
-
showHelp();
|
|
2222
|
-
return void callback(import_js_controller_common2.EXIT_CODES.INVALID_ARGUMENTS);
|
|
2223
1318
|
}
|
|
2224
|
-
|
|
2225
|
-
}
|
|
2226
|
-
}
|
|
1319
|
+
setTimeout(callback, 200);
|
|
1320
|
+
});
|
|
1321
|
+
});
|
|
2227
1322
|
}
|
|
1323
|
+
__name(processCommandCheckLog, "processCommandCheckLog");
|
|
2228
1324
|
const OBJECTS_THAT_CANNOT_BE_DELETED = [
|
|
2229
1325
|
"0_userdata.0",
|
|
2230
1326
|
"alias.0",
|
|
@@ -2250,6 +1346,7 @@ async function delObjects(ids) {
|
|
|
2250
1346
|
}
|
|
2251
1347
|
}
|
|
2252
1348
|
}
|
|
1349
|
+
__name(delObjects, "delObjects");
|
|
2253
1350
|
async function delStates() {
|
|
2254
1351
|
const { states } = await (0, import_dbConnection.dbConnectAsync)(false);
|
|
2255
1352
|
const keys = await states.getKeys("*");
|
|
@@ -2265,12 +1362,12 @@ async function delStates() {
|
|
|
2265
1362
|
}
|
|
2266
1363
|
return keys ? keys.length : 0;
|
|
2267
1364
|
}
|
|
1365
|
+
__name(delStates, "delStates");
|
|
2268
1366
|
async function cleanDatabase(isDeleteDb) {
|
|
2269
1367
|
const { objects } = await (0, import_dbConnection.dbConnectAsync)(false);
|
|
2270
1368
|
if (isDeleteDb) {
|
|
2271
1369
|
await objects.destroyDBAsync();
|
|
2272
|
-
|
|
2273
|
-
return keysCount2;
|
|
1370
|
+
return await delStates();
|
|
2274
1371
|
}
|
|
2275
1372
|
let ids = [];
|
|
2276
1373
|
try {
|
|
@@ -2282,9 +1379,9 @@ async function cleanDatabase(isDeleteDb) {
|
|
|
2282
1379
|
} catch {
|
|
2283
1380
|
}
|
|
2284
1381
|
await delObjects(ids);
|
|
2285
|
-
|
|
2286
|
-
return keysCount;
|
|
1382
|
+
return await delStates();
|
|
2287
1383
|
}
|
|
1384
|
+
__name(cleanDatabase, "cleanDatabase");
|
|
2288
1385
|
async function unsetup(params, callback) {
|
|
2289
1386
|
const { objects } = await (0, import_dbConnection.dbConnectAsync)(false, params);
|
|
2290
1387
|
objects.delObject("system.meta.uuid", (err) => {
|
|
@@ -2307,7 +1404,7 @@ async function unsetup(params, callback) {
|
|
|
2307
1404
|
objects.setObject(import_constants.SYSTEM_CONFIG_ID, obj, (err2) => {
|
|
2308
1405
|
if (err2) {
|
|
2309
1406
|
console.log(`not found: ${err2.message}`);
|
|
2310
|
-
return void callback(
|
|
1407
|
+
return void callback(import_js_controller_common.EXIT_CODES.CANNOT_SET_OBJECT);
|
|
2311
1408
|
}
|
|
2312
1409
|
console.log(`${import_constants.SYSTEM_CONFIG_ID} reset`);
|
|
2313
1410
|
return void callback();
|
|
@@ -2319,6 +1416,7 @@ async function unsetup(params, callback) {
|
|
|
2319
1416
|
});
|
|
2320
1417
|
});
|
|
2321
1418
|
}
|
|
1419
|
+
__name(unsetup, "unsetup");
|
|
2322
1420
|
async function restartController() {
|
|
2323
1421
|
console.log("Starting node restart.js");
|
|
2324
1422
|
const { spawn } = await import("node:child_process");
|
|
@@ -2329,6 +1427,7 @@ async function restartController() {
|
|
|
2329
1427
|
});
|
|
2330
1428
|
child.unref();
|
|
2331
1429
|
}
|
|
1430
|
+
__name(restartController, "restartController");
|
|
2332
1431
|
function execute() {
|
|
2333
1432
|
const _yargs2 = initYargs();
|
|
2334
1433
|
const command = _yargs2.argv._[0];
|
|
@@ -2339,11 +1438,12 @@ function execute() {
|
|
|
2339
1438
|
}
|
|
2340
1439
|
args.push(process.argv[i]);
|
|
2341
1440
|
}
|
|
2342
|
-
processCommand(command, args, _yargs2.argv, import_dbConnection.exitApplicationSave);
|
|
1441
|
+
processCommand(command, args, _yargs2.argv, import_dbConnection.exitApplicationSave).catch((e) => console.error(`Cannot process command: ${e.message}`));
|
|
2343
1442
|
}
|
|
1443
|
+
__name(execute, "execute");
|
|
2344
1444
|
process.on("unhandledRejection", (e) => {
|
|
2345
1445
|
console.error(`Uncaught Rejection: ${e.stack || e}`);
|
|
2346
|
-
(0, import_dbConnection.exitApplicationSave)(
|
|
1446
|
+
return (0, import_dbConnection.exitApplicationSave)(import_js_controller_common.EXIT_CODES.UNCAUGHT_EXCEPTION);
|
|
2347
1447
|
});
|
|
2348
1448
|
// Annotate the CommonJS export names for ESM import in node:
|
|
2349
1449
|
0 && (module.exports = {
|