@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
|
@@ -1,25 +1,29 @@
|
|
|
1
1
|
import { CLICommand } from '../../lib/cli/cliCommand.js';
|
|
2
2
|
import type { CLICommandOptions } from '../../lib/cli/cliCommand.js';
|
|
3
|
+
/** Command ioBroker process control (start/stop/restart/status) ... */
|
|
3
4
|
export declare class CLIProcess extends CLICommand {
|
|
5
|
+
/**
|
|
6
|
+
* @param options The command options including context and parameters
|
|
7
|
+
*/
|
|
4
8
|
constructor(options: CLICommandOptions);
|
|
5
9
|
/**
|
|
6
10
|
* Starts one or more adapters or the js-controller
|
|
7
11
|
*
|
|
8
12
|
* @param args parsed cli arguments
|
|
9
13
|
*/
|
|
10
|
-
start(args:
|
|
14
|
+
start(args: string[]): Promise<void>;
|
|
11
15
|
/**
|
|
12
16
|
* Restarts one or more instances or the js-controller
|
|
13
17
|
*
|
|
14
18
|
* @param args parsed cli arguments
|
|
15
19
|
*/
|
|
16
|
-
restart(args:
|
|
20
|
+
restart(args: string[]): Promise<void>;
|
|
17
21
|
/**
|
|
18
22
|
* Stops one or more adapters or the js-controller
|
|
19
23
|
*
|
|
20
24
|
* @param args parsed cli arguments
|
|
21
25
|
*/
|
|
22
|
-
stop(args:
|
|
26
|
+
stop(args: string[]): Promise<void>;
|
|
23
27
|
/**
|
|
24
28
|
* Starts or stops all adapters
|
|
25
29
|
*
|
|
@@ -45,19 +49,25 @@ export declare class CLIProcess extends CLICommand {
|
|
|
45
49
|
setAdapterInstanceEnabled(instance: string, enabled: boolean, restartIfRunning?: boolean): void;
|
|
46
50
|
/**
|
|
47
51
|
* Starts the JS controller
|
|
52
|
+
*
|
|
53
|
+
* @returns true if the controller was started or is already running, false if it could not be started
|
|
48
54
|
*/
|
|
49
|
-
startJSController(): Promise<
|
|
55
|
+
startJSController(): Promise<boolean>;
|
|
50
56
|
/**
|
|
51
57
|
* Stops the JS controller
|
|
52
58
|
*/
|
|
53
59
|
static stopJSController(): Promise<void>;
|
|
54
|
-
/**
|
|
55
|
-
|
|
60
|
+
/**
|
|
61
|
+
* Restarts the JS controller
|
|
62
|
+
*
|
|
63
|
+
* @returns true if the controller is running afterwards, false if it could not be started
|
|
64
|
+
*/
|
|
65
|
+
restartJSController(): Promise<boolean>;
|
|
56
66
|
/**
|
|
57
67
|
* Checks if ioBroker is running or not
|
|
58
68
|
*
|
|
59
69
|
* @param args parsed cli arguments
|
|
60
70
|
*/
|
|
61
|
-
status(args:
|
|
71
|
+
status(args: string[]): void;
|
|
62
72
|
}
|
|
63
73
|
//# sourceMappingURL=cliProcess.d.ts.map
|
|
@@ -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 });
|
|
@@ -38,14 +39,19 @@ var import_node_child_process = require("node:child_process");
|
|
|
38
39
|
var import_deep_clone = __toESM(require("deep-clone"), 1);
|
|
39
40
|
var import_promises = require("node:timers/promises");
|
|
40
41
|
var import_js_controller_common = require("@iobroker/js-controller-common");
|
|
41
|
-
var import_js_controller_common2 = require("@iobroker/js-controller-common");
|
|
42
42
|
var CLI = __toESM(require("../../lib/cli/messages.js"), 1);
|
|
43
43
|
var import_cliCommand = require("../../lib/cli/cliCommand.js");
|
|
44
44
|
var import_cliTools = require("../../lib/cli/cliTools.js");
|
|
45
45
|
const TRY_KILL_WAIT_MS = 5e3;
|
|
46
|
-
const rootDir =
|
|
46
|
+
const rootDir = import_js_controller_common.tools.getControllerDir();
|
|
47
47
|
const killAllScriptPath = import_node_path.default.join(rootDir, "killall.sh");
|
|
48
48
|
class CLIProcess extends import_cliCommand.CLICommand {
|
|
49
|
+
static {
|
|
50
|
+
__name(this, "CLIProcess");
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* @param options The command options including context and parameters
|
|
54
|
+
*/
|
|
49
55
|
constructor(options) {
|
|
50
56
|
super(options);
|
|
51
57
|
}
|
|
@@ -59,8 +65,8 @@ class CLIProcess extends import_cliCommand.CLICommand {
|
|
|
59
65
|
async start(args) {
|
|
60
66
|
const adapterName = (0, import_cliTools.normalizeAdapterName)(args[0]);
|
|
61
67
|
if (!adapterName) {
|
|
62
|
-
await this.startJSController();
|
|
63
|
-
this.options.callback();
|
|
68
|
+
const running = await this.startJSController();
|
|
69
|
+
this.options.callback(running ? void 0 : import_js_controller_common.EXIT_CODES.UNKNOWN_ERROR);
|
|
64
70
|
} else if (adapterName === "all") {
|
|
65
71
|
this.setAllAdaptersEnabled(true);
|
|
66
72
|
} else if (/\.\d+$/.test(adapterName)) {
|
|
@@ -77,8 +83,8 @@ class CLIProcess extends import_cliCommand.CLICommand {
|
|
|
77
83
|
async restart(args) {
|
|
78
84
|
const adapterName = (0, import_cliTools.normalizeAdapterName)(args[0]);
|
|
79
85
|
if (!adapterName) {
|
|
80
|
-
await this.restartJSController();
|
|
81
|
-
this.options.callback();
|
|
86
|
+
const running = await this.restartJSController();
|
|
87
|
+
this.options.callback(running ? void 0 : import_js_controller_common.EXIT_CODES.UNKNOWN_ERROR);
|
|
82
88
|
} else if (/\.\d+$/.test(adapterName)) {
|
|
83
89
|
this.setAdapterInstanceEnabled(
|
|
84
90
|
adapterName,
|
|
@@ -144,7 +150,7 @@ class CLIProcess extends import_cliCommand.CLICommand {
|
|
|
144
150
|
const adapterInstances = await (0, import_cliTools.enumInstances)(objects, adapter);
|
|
145
151
|
if (adapterInstances.length === 0) {
|
|
146
152
|
CLI.error.noInstancesFound(adapter);
|
|
147
|
-
return void callback(
|
|
153
|
+
return void callback(import_js_controller_common.EXIT_CODES.UNKNOWN_ERROR);
|
|
148
154
|
}
|
|
149
155
|
for (const instance of adapterInstances) {
|
|
150
156
|
await setInstanceEnabled(objects, instance, enabled, restartIfRunning);
|
|
@@ -152,7 +158,7 @@ class CLIProcess extends import_cliCommand.CLICommand {
|
|
|
152
158
|
return void callback();
|
|
153
159
|
} catch (e) {
|
|
154
160
|
CLI.error.unknown(e.message);
|
|
155
|
-
return void callback(
|
|
161
|
+
return void callback(import_js_controller_common.EXIT_CODES.UNKNOWN_ERROR);
|
|
156
162
|
}
|
|
157
163
|
});
|
|
158
164
|
}
|
|
@@ -177,34 +183,50 @@ class CLIProcess extends import_cliCommand.CLICommand {
|
|
|
177
183
|
return void callback();
|
|
178
184
|
} catch (e) {
|
|
179
185
|
CLI.error.unknown(e.message);
|
|
180
|
-
return void callback(
|
|
186
|
+
return void callback(import_js_controller_common.EXIT_CODES.UNKNOWN_ERROR);
|
|
181
187
|
}
|
|
182
188
|
});
|
|
183
189
|
}
|
|
184
190
|
/**
|
|
185
191
|
* Starts the JS controller
|
|
192
|
+
*
|
|
193
|
+
* @returns true if the controller was started or is already running, false if it could not be started
|
|
186
194
|
*/
|
|
187
195
|
async startJSController() {
|
|
188
196
|
let memoryLimitMB = 0;
|
|
189
197
|
try {
|
|
190
|
-
const config = import_fs_extra.default.readJSONSync(
|
|
198
|
+
const config = import_fs_extra.default.readJSONSync(import_js_controller_common.tools.getConfigFileName(), { encoding: "utf-8" });
|
|
191
199
|
if (config?.system?.memoryLimitMB) {
|
|
192
200
|
memoryLimitMB = Math.round(config.system.memoryLimitMB);
|
|
193
201
|
}
|
|
194
202
|
} catch {
|
|
195
203
|
console.warn("Cannot read memoryLimitMB");
|
|
196
204
|
console.warn(`May be config file does not exist.
|
|
197
|
-
Please call "${
|
|
205
|
+
Please call "${import_js_controller_common.tools.appName} setup first" to initialize the settings.`);
|
|
198
206
|
}
|
|
199
207
|
let pid;
|
|
200
208
|
try {
|
|
201
|
-
pid = await
|
|
209
|
+
pid = await import_js_controller_common.tools.getControllerPid();
|
|
202
210
|
} catch (e) {
|
|
203
211
|
console.error(`Could not read pid file: ${e.message}`);
|
|
204
212
|
}
|
|
205
213
|
if (pid) {
|
|
206
|
-
|
|
207
|
-
|
|
214
|
+
const staleReason = await getStalePidsFileReason(pid);
|
|
215
|
+
if (!staleReason) {
|
|
216
|
+
console.log(`Controller is already running with pid ${pid}`);
|
|
217
|
+
return true;
|
|
218
|
+
}
|
|
219
|
+
console.log(`Ignoring left over ${import_js_controller_common.tools.getPidsFileName()}: ${staleReason}`);
|
|
220
|
+
const pidsFileName = import_js_controller_common.tools.getPidsFileName();
|
|
221
|
+
try {
|
|
222
|
+
await import_fs_extra.default.unlink(pidsFileName);
|
|
223
|
+
} catch (e) {
|
|
224
|
+
if (e.code !== "ENOENT") {
|
|
225
|
+
console.error(`Could not remove ${pidsFileName}: ${e.message}`);
|
|
226
|
+
console.error(`Please delete the file manually and run "${import_js_controller_common.tools.appName} start" again.`);
|
|
227
|
+
return false;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
208
230
|
}
|
|
209
231
|
const args = [import_node_path.default.join(rootDir, "controller.js")];
|
|
210
232
|
if (memoryLimitMB) {
|
|
@@ -218,6 +240,7 @@ Please call "${import_js_controller_common2.tools.appName} setup first" to initi
|
|
|
218
240
|
cwd: rootDir
|
|
219
241
|
});
|
|
220
242
|
child.unref();
|
|
243
|
+
return true;
|
|
221
244
|
}
|
|
222
245
|
/**
|
|
223
246
|
* Stops the JS controller
|
|
@@ -225,13 +248,24 @@ Please call "${import_js_controller_common2.tools.appName} setup first" to initi
|
|
|
225
248
|
static async stopJSController() {
|
|
226
249
|
let pid;
|
|
227
250
|
try {
|
|
228
|
-
pid = await
|
|
251
|
+
pid = await import_js_controller_common.tools.getControllerPid();
|
|
229
252
|
} catch (e) {
|
|
230
253
|
console.error(`Could not read pid file: ${e.message}`);
|
|
231
254
|
}
|
|
232
255
|
if (!pid) {
|
|
233
256
|
return;
|
|
234
257
|
}
|
|
258
|
+
if (import_js_controller_common.tools.isProcessRunning(pid) && await import_js_controller_common.tools.isForeignProcess(pid)) {
|
|
259
|
+
console.log(`Not stopping pid ${pid}, it belongs to a different program`);
|
|
260
|
+
try {
|
|
261
|
+
await import_fs_extra.default.unlink(import_js_controller_common.tools.getPidsFileName());
|
|
262
|
+
} catch (e) {
|
|
263
|
+
if (e.code !== "ENOENT") {
|
|
264
|
+
console.error(`Could not remove ${import_js_controller_common.tools.getPidsFileName()}: ${e.message}`);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
235
269
|
await tryKill(pid);
|
|
236
270
|
if (import_node_os.default.platform() !== "win32") {
|
|
237
271
|
let data = "";
|
|
@@ -250,14 +284,18 @@ Please call "${import_js_controller_common2.tools.appName} setup first" to initi
|
|
|
250
284
|
console.log('No "killall.sh" script found. Just stop.');
|
|
251
285
|
}
|
|
252
286
|
try {
|
|
253
|
-
import_fs_extra.default.unlinkSync(
|
|
287
|
+
import_fs_extra.default.unlinkSync(import_js_controller_common.tools.getPidsFileName());
|
|
254
288
|
} catch {
|
|
255
289
|
}
|
|
256
290
|
}
|
|
257
|
-
/**
|
|
291
|
+
/**
|
|
292
|
+
* Restarts the JS controller
|
|
293
|
+
*
|
|
294
|
+
* @returns true if the controller is running afterwards, false if it could not be started
|
|
295
|
+
*/
|
|
258
296
|
async restartJSController() {
|
|
259
297
|
await CLIProcess.stopJSController();
|
|
260
|
-
|
|
298
|
+
return this.startJSController();
|
|
261
299
|
}
|
|
262
300
|
/**
|
|
263
301
|
* Checks if ioBroker is running or not
|
|
@@ -271,7 +309,7 @@ Please call "${import_js_controller_common2.tools.appName} setup first" to initi
|
|
|
271
309
|
dbConnect(async (params) => {
|
|
272
310
|
const { objects, states, config, isOffline } = params;
|
|
273
311
|
if (!adapterName || showEntireConfig) {
|
|
274
|
-
const hostAlive = await states.getState(`system.host.${
|
|
312
|
+
const hostAlive = await states.getState(`system.host.${import_js_controller_common.tools.getHostName()}.alive`);
|
|
275
313
|
const alive = hostAlive ? hostAlive.val : false;
|
|
276
314
|
CLI.success.controllerStatus(alive);
|
|
277
315
|
console.log();
|
|
@@ -289,7 +327,7 @@ Please call "${import_js_controller_common2.tools.appName} setup first" to initi
|
|
|
289
327
|
console.log(`Objects type: ${config.objects.type}`);
|
|
290
328
|
console.log(`States type: ${config.states.type}`);
|
|
291
329
|
}
|
|
292
|
-
return void callback(isOffline ?
|
|
330
|
+
return void callback(isOffline ? import_js_controller_common.EXIT_CODES.CONTROLLER_NOT_RUNNING : void 0);
|
|
293
331
|
}
|
|
294
332
|
if (/\.\d+$/.test(adapterName)) {
|
|
295
333
|
await showInstanceStatus(states, adapterName);
|
|
@@ -298,10 +336,10 @@ Please call "${import_js_controller_common2.tools.appName} setup first" to initi
|
|
|
298
336
|
const adapterInstances = await (0, import_cliTools.enumInstances)(objects, adapterName);
|
|
299
337
|
if (adapterInstances.length > 1) {
|
|
300
338
|
CLI.error.specifyInstance(adapterName, adapterInstances.map((obj) => obj._id.substring("system.adapter.".length)));
|
|
301
|
-
return void callback(
|
|
339
|
+
return void callback(import_js_controller_common.EXIT_CODES.INVALID_ADAPTER_ID);
|
|
302
340
|
} else if (adapterInstances.length === 0) {
|
|
303
341
|
CLI.error.noInstancesFound(adapterName);
|
|
304
|
-
return void callback(
|
|
342
|
+
return void callback(import_js_controller_common.EXIT_CODES.UNKNOWN_ERROR);
|
|
305
343
|
}
|
|
306
344
|
const instanceId = adapterInstances[0]._id.split(".").pop();
|
|
307
345
|
await showInstanceStatus(states, `${adapterName}.${instanceId}`);
|
|
@@ -317,6 +355,7 @@ async function showAllInstancesStatus(states, objects) {
|
|
|
317
355
|
}
|
|
318
356
|
return Promise.resolve();
|
|
319
357
|
}
|
|
358
|
+
__name(showAllInstancesStatus, "showAllInstancesStatus");
|
|
320
359
|
async function showInstanceStatus(states, adapterInstance) {
|
|
321
360
|
const state = await states.getState(`system.adapter.${adapterInstance}.alive`);
|
|
322
361
|
if (state?.val === true) {
|
|
@@ -325,11 +364,12 @@ async function showInstanceStatus(states, adapterInstance) {
|
|
|
325
364
|
console.log(`Instance "${adapterInstance}" is not running`);
|
|
326
365
|
}
|
|
327
366
|
}
|
|
367
|
+
__name(showInstanceStatus, "showInstanceStatus");
|
|
328
368
|
function showConfig(config, root) {
|
|
329
|
-
if (!
|
|
369
|
+
if (!import_js_controller_common.tools.isObject(config)) {
|
|
330
370
|
return;
|
|
331
371
|
}
|
|
332
|
-
root
|
|
372
|
+
root ||= [];
|
|
333
373
|
const prefix = root.join("/").toUpperCase();
|
|
334
374
|
for (const attr of Object.keys(config)) {
|
|
335
375
|
if (attr.match(/comment$/i)) {
|
|
@@ -344,6 +384,7 @@ function showConfig(config, root) {
|
|
|
344
384
|
}
|
|
345
385
|
}
|
|
346
386
|
}
|
|
387
|
+
__name(showConfig, "showConfig");
|
|
347
388
|
async function setInstanceEnabled(objects, instanceObj, enabled, force) {
|
|
348
389
|
if (!force && instanceObj.common.enabled === enabled) {
|
|
349
390
|
return;
|
|
@@ -359,6 +400,17 @@ async function setInstanceEnabled(objects, instanceObj, enabled, force) {
|
|
|
359
400
|
CLI.success.adapterStopped(instanceName);
|
|
360
401
|
}
|
|
361
402
|
}
|
|
403
|
+
__name(setInstanceEnabled, "setInstanceEnabled");
|
|
404
|
+
async function getStalePidsFileReason(pid) {
|
|
405
|
+
if (!import_js_controller_common.tools.isProcessRunning(pid)) {
|
|
406
|
+
return `process ${pid} is not running any more`;
|
|
407
|
+
}
|
|
408
|
+
if (await import_js_controller_common.tools.isForeignProcess(pid)) {
|
|
409
|
+
return `pid ${pid} belongs to a different program, not to a controller`;
|
|
410
|
+
}
|
|
411
|
+
return void 0;
|
|
412
|
+
}
|
|
413
|
+
__name(getStalePidsFileReason, "getStalePidsFileReason");
|
|
362
414
|
async function tryKill(pid) {
|
|
363
415
|
try {
|
|
364
416
|
process.kill(pid, "SIGTERM");
|
|
@@ -367,6 +419,7 @@ async function tryKill(pid) {
|
|
|
367
419
|
}
|
|
368
420
|
await (0, import_promises.setTimeout)(TRY_KILL_WAIT_MS);
|
|
369
421
|
}
|
|
422
|
+
__name(tryKill, "tryKill");
|
|
370
423
|
// Annotate the CommonJS export names for ESM import in node:
|
|
371
424
|
0 && (module.exports = {
|
|
372
425
|
CLIProcess
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/lib/cli/cliProcess.ts"],
|
|
4
|
-
"sourcesContent": ["import fs from 'fs-extra';\nimport path from 'node:path';\nimport os from 'node:os';\nimport { spawn } from 'node:child_process';\nimport deepClone from 'deep-clone';\nimport { setTimeout as wait } from 'node:timers/promises';\n\nimport {\n isLocalStatesDbServer,\n isLocalObjectsDbServer,\n getInstancesOrderedByStartPrio,\n} from '@iobroker/js-controller-common';\nimport { tools, EXIT_CODES } from '@iobroker/js-controller-common';\nimport * as CLI from '@/lib/cli/messages.js';\nimport { CLICommand } from '@/lib/cli/cliCommand.js';\nimport { getObjectFrom, getInstanceName, normalizeAdapterName, enumInstances } from '@/lib/cli/cliTools.js';\nimport type { Client as ObjectsClient } from '@iobroker/db-objects-redis';\nimport type { Client as StatesClient } from '@iobroker/db-states-redis';\nimport type { CLICommandOptions } from '@/lib/cli/cliCommand.js';\n\n/** Time to wait after killing pid until process is assumed as stopped */\nconst TRY_KILL_WAIT_MS = 5_000;\n\n// The root of this project. Change this when moving code to another directory\nconst rootDir = tools.getControllerDir();\nconst killAllScriptPath = path.join(rootDir, 'killall.sh');\n\nexport class CLIProcess extends CLICommand {\n constructor(options: CLICommandOptions) {\n super(options);\n }\n\n // These CLI commands have no subcommands, but belong together thematically\n // (start/stop/restart/status)\n\n /**\n * Starts one or more adapters or the js-controller\n *\n * @param args parsed cli arguments\n */\n async start(args: any[]): Promise<void> {\n const adapterName = normalizeAdapterName(args[0]);\n if (!adapterName) {\n await this.startJSController();\n this.options.callback();\n } else if (adapterName === 'all') {\n this.setAllAdaptersEnabled(true);\n } else if (/\\.\\d+$/.test(adapterName)) {\n this.setAdapterInstanceEnabled(adapterName, true);\n } else {\n this.setAdapterEnabled(adapterName, true);\n }\n }\n\n /**\n * Restarts one or more instances or the js-controller\n *\n * @param args parsed cli arguments\n */\n async restart(args: any[]): Promise<void> {\n const adapterName = normalizeAdapterName(args[0]);\n if (!adapterName) {\n await this.restartJSController();\n this.options.callback();\n } else if (/\\.\\d+$/.test(adapterName)) {\n this.setAdapterInstanceEnabled(adapterName, true, /* restartIfRunning */ true);\n } else {\n this.setAdapterEnabled(adapterName, true, /* restartIfRunning */ true);\n }\n }\n\n /**\n * Stops one or more adapters or the js-controller\n *\n * @param args parsed cli arguments\n */\n async stop(args: any[]): Promise<void> {\n const adapterName = normalizeAdapterName(args[0]);\n if (adapterName === undefined) {\n await CLIProcess.stopJSController();\n this.options.callback();\n } else if (adapterName === 'all') {\n this.setAllAdaptersEnabled(false);\n } else if (/\\.\\d+$/.test(adapterName)) {\n this.setAdapterInstanceEnabled(adapterName, false);\n } else {\n this.setAdapterEnabled(adapterName, false);\n }\n }\n\n /**\n * Starts or stops all adapters\n *\n * @param enabled if adapters should be started or stopped\n */\n setAllAdaptersEnabled(enabled: boolean): void {\n const { callback, dbConnect } = this.options;\n dbConnect(async params => {\n const { objects } = params;\n // Enumerate all adapter instances\n const instances = await getInstancesOrderedByStartPrio(objects, console);\n // Create a promise for each. setInstanceEnabled only starts/stops when necessary\n const instancePromises = instances\n .filter(obj => obj.common.enabled !== enabled)\n .map(obj => setInstanceEnabled(objects, obj, enabled));\n // wait for all instances to be started/stopped\n await Promise.all(instancePromises);\n callback();\n });\n }\n\n /**\n * Starts or stops a single or all instances of adapter.\n * If there are multiple instances, all will be started/stopped/restarted\n *\n * @param adapter The adapter to start\n * @param enabled If adapter should be started or stopped\n * @param [restartIfRunning] Whether running instances should be restarted\n */\n setAdapterEnabled(adapter: string, enabled: boolean, restartIfRunning?: boolean): void {\n const { callback, dbConnect } = this.options;\n dbConnect(async params => {\n const { objects } = params;\n\n try {\n // Enumerate all adapter instances\n const adapterInstances = await enumInstances(objects, adapter);\n if (adapterInstances.length === 0) {\n CLI.error.noInstancesFound(adapter);\n return void callback(EXIT_CODES.UNKNOWN_ERROR);\n }\n for (const instance of adapterInstances) {\n await setInstanceEnabled(objects, instance, enabled, restartIfRunning);\n }\n return void callback();\n } catch (e) {\n CLI.error.unknown(e.message);\n return void callback(EXIT_CODES.UNKNOWN_ERROR);\n }\n });\n }\n\n /**\n * Starts or stops a specific adapter instance\n *\n * @param instance The instance to start, e.g. \"adaptername.0\"\n * @param enabled If the instance should be started or stopped\n * @param [restartIfRunning] Whether running instances should be restarted\n */\n setAdapterInstanceEnabled(instance: string, enabled: boolean, restartIfRunning?: boolean): void {\n const { callback, dbConnect } = this.options;\n dbConnect(async params => {\n const { objects } = params;\n\n const obj = (await objects.getObject(`system.adapter.${instance}`)) as\n | ioBroker.InstanceObject\n | ioBroker.AdapterObject;\n\n if (!obj || obj.type !== 'instance') {\n CLI.error.invalidInstance(instance);\n return void callback();\n }\n\n try {\n await setInstanceEnabled(objects, obj, enabled, restartIfRunning);\n return void callback();\n } catch (e) {\n CLI.error.unknown(e.message);\n return void callback(EXIT_CODES.UNKNOWN_ERROR);\n }\n });\n }\n\n /**\n * Starts the JS controller\n */\n async startJSController(): Promise<void> {\n let memoryLimitMB = 0;\n try {\n const config: ioBroker.IoBrokerJson = fs.readJSONSync(tools.getConfigFileName(), { encoding: 'utf-8' });\n if (config?.system?.memoryLimitMB) {\n memoryLimitMB = Math.round(config.system.memoryLimitMB);\n }\n } catch {\n console.warn('Cannot read memoryLimitMB');\n console.warn(\n `May be config file does not exist.\\nPlease call \"${tools.appName} setup first\" to initialize the settings.`,\n );\n }\n\n let pid: number | undefined;\n try {\n pid = await tools.getControllerPid();\n } catch (e) {\n console.error(`Could not read pid file: ${e.message}`);\n }\n\n if (pid) {\n console.log(`Controller is already running with pid ${pid}`);\n return;\n }\n\n const args = [path.join(rootDir, 'controller.js')];\n if (memoryLimitMB) {\n args.push(`--max-old-space-size=${memoryLimitMB}`);\n }\n\n const child = spawn(process.execPath, args, {\n env: process.env,\n detached: true,\n stdio: ['ignore', 'ignore', 'ignore', 'ipc'],\n windowsHide: true,\n cwd: rootDir,\n });\n\n child.unref();\n }\n\n /**\n * Stops the JS controller\n */\n static async stopJSController(): Promise<void> {\n let pid: number | undefined;\n try {\n pid = await tools.getControllerPid();\n } catch (e) {\n console.error(`Could not read pid file: ${e.message}`);\n }\n\n if (!pid) {\n return;\n }\n\n await tryKill(pid);\n\n // On non-Windows OSes start a KILLALL script\n // to make sure nothing keeps running\n if (os.platform() !== 'win32') {\n let data = '';\n if (fs.existsSync(killAllScriptPath)) {\n fs.chmodSync(killAllScriptPath, '777');\n const child = spawn(killAllScriptPath, [], { windowsHide: true });\n child.stdout.on('data', _data => (data += _data.toString().replace(/\\n/g, '')));\n child.stderr.on('data', _data => (data += _data.toString().replace(/\\n/g, '')));\n return new Promise(resolve => {\n child.on('exit', exitCode => {\n console.log(`Exit code for \"killall.sh\": ${exitCode}`);\n resolve();\n });\n });\n }\n console.log('No \"killall.sh\" script found. Just stop.');\n }\n\n try {\n // delete pids.txt file\n fs.unlinkSync(tools.getPidsFileName());\n } catch {\n // ignore\n }\n }\n\n /** Restarts the JS controller */\n async restartJSController(): Promise<void> {\n await CLIProcess.stopJSController();\n await this.startJSController();\n }\n\n /**\n * Checks if ioBroker is running or not\n *\n * @param args parsed cli arguments\n */\n status(args: any[]): void {\n const { callback, dbConnect } = this.options;\n const adapterName = normalizeAdapterName(args[0]);\n const showEntireConfig = adapterName === 'all';\n\n dbConnect(async params => {\n const { objects, states, config, isOffline } = params;\n\n if (!adapterName || showEntireConfig) {\n // we want host info or/and whole config\n const hostAlive = await states.getState(`system.host.${tools.getHostName()}.alive`);\n\n const alive = hostAlive ? (hostAlive.val as boolean) : false;\n CLI.success.controllerStatus(alive);\n console.log();\n\n const hasLocalStatesServer = await isLocalStatesDbServer(config.states.type, config.states.host);\n const hasLocalObjectsServer = await isLocalObjectsDbServer(config.objects.type, config.objects.host);\n\n if (!hasLocalStatesServer && !hasLocalObjectsServer) {\n CLI.success.systemStatus(!isOffline);\n }\n\n console.log();\n if (showEntireConfig) {\n await showAllInstancesStatus(states, objects);\n console.log();\n showConfig(config);\n } else {\n console.log(`Objects type: ${config.objects.type}`);\n console.log(`States type: ${config.states.type}`);\n }\n return void callback(isOffline ? EXIT_CODES.CONTROLLER_NOT_RUNNING : undefined);\n }\n // we want to know the status of an adapter\n if (/\\.\\d+$/.test(adapterName)) {\n // instance specified\n await showInstanceStatus(states, adapterName);\n return void callback();\n }\n const adapterInstances = await enumInstances(objects, adapterName);\n // If there are multiple instances of this adapter, ask the user to specify which one\n if (adapterInstances.length > 1) {\n CLI.error.specifyInstance(\n adapterName,\n adapterInstances.map(obj => obj._id.substring('system.adapter.'.length)),\n );\n return void callback(EXIT_CODES.INVALID_ADAPTER_ID);\n } else if (adapterInstances.length === 0) {\n CLI.error.noInstancesFound(adapterName);\n return void callback(EXIT_CODES.UNKNOWN_ERROR);\n }\n\n const instanceId = adapterInstances[0]._id.split('.').pop();\n await showInstanceStatus(states, `${adapterName}.${instanceId}`);\n return void callback();\n });\n }\n}\n\n/**\n * Outputs the status of all existing adapter instances\n *\n * @param states The States DB\n * @param objects The Objects DB\n */\nasync function showAllInstancesStatus(states: StatesClient, objects: ObjectsClient): Promise<void> {\n const allInstances = await enumInstances(objects);\n for (const instance of allInstances) {\n const instanceId = instance._id.split('.').pop();\n await showInstanceStatus(states, `${instance.common.name}.${instanceId}`);\n }\n return Promise.resolve();\n}\n\n/**\n * Outputs the status of an adapter instance\n *\n * @param states the states object\n * @param adapterInstance <adapterName>.<instanceId>\n */\nasync function showInstanceStatus(states: StatesClient, adapterInstance: string): Promise<void> {\n const state = await states.getState(`system.adapter.${adapterInstance}.alive`);\n if (state?.val === true) {\n console.log(`Instance \"${adapterInstance}\" is running`);\n } else {\n console.log(`Instance \"${adapterInstance}\" is not running`);\n }\n}\n\n/**\n * Prints the config file to the console\n *\n * @param config the ioBroker json file content\n * @param root\n */\nfunction showConfig(config: ioBroker.IoBrokerJson, root?: string[]): void {\n if (!tools.isObject(config)) {\n return;\n }\n root = root || [];\n const prefix = root.join('/').toUpperCase();\n for (const attr of Object.keys(config)) {\n if (attr.match(/comment$/i)) {\n continue;\n }\n if (typeof (config as Record<string, any>)[attr] === 'object') {\n const nextRoot = deepClone(root);\n nextRoot.push(attr);\n showConfig((config as Record<string, any>)[attr], nextRoot);\n } else {\n console.log(`${prefix}${(prefix ? '/' : '') + attr}: ${(config as Record<string, any>)[attr]}`);\n }\n }\n}\n\n/**\n * Sets the enabled state of an instance to the given value\n *\n * @param objects The objects DB\n * @param instanceObj The instance object to change\n * @param enabled Whether the instance should be enabled or not\n * @param force Whether the object should be updated always\n */\nasync function setInstanceEnabled(\n objects: ObjectsClient,\n instanceObj: ioBroker.InstanceObject,\n enabled: boolean,\n force?: boolean,\n): Promise<void> {\n if (!force && instanceObj.common.enabled === enabled) {\n return;\n }\n\n instanceObj.common.enabled = enabled;\n instanceObj.from = getObjectFrom();\n instanceObj.ts = Date.now();\n await objects.setObject(instanceObj._id, instanceObj);\n const instanceName = getInstanceName(instanceObj._id);\n if (enabled) {\n CLI.success.adapterStarted(instanceName);\n } else {\n CLI.success.adapterStopped(instanceName);\n }\n}\n\n/**\n * Kills a process by its PID\n *\n * @param pid The PID of the process to kill\n */\nasync function tryKill(pid: number): Promise<void> {\n try {\n process.kill(pid, 'SIGTERM');\n } catch (e) {\n console.warn(`Could not send \"SIGTERM\" to process ${pid}: ${e.message}`);\n }\n\n await wait(TRY_KILL_WAIT_MS);\n}\n"],
|
|
5
|
-
"mappings": "
|
|
6
|
-
"names": ["
|
|
4
|
+
"sourcesContent": ["import fs from 'fs-extra';\nimport path from 'node:path';\nimport os from 'node:os';\nimport { spawn } from 'node:child_process';\nimport deepClone from 'deep-clone';\nimport { setTimeout as wait } from 'node:timers/promises';\n\nimport {\n isLocalStatesDbServer,\n isLocalObjectsDbServer,\n getInstancesOrderedByStartPrio,\n tools,\n EXIT_CODES,\n} from '@iobroker/js-controller-common';\nimport * as CLI from '@/lib/cli/messages.js';\nimport { CLICommand } from '@/lib/cli/cliCommand.js';\nimport { getObjectFrom, getInstanceName, normalizeAdapterName, enumInstances } from '@/lib/cli/cliTools.js';\nimport type { Client as ObjectsClient } from '@iobroker/db-objects-redis';\nimport type { Client as StatesClient } from '@iobroker/db-states-redis';\nimport type { CLICommandOptions } from '@/lib/cli/cliCommand.js';\n\n/** Time to wait after killing pid until process is assumed as stopped */\nconst TRY_KILL_WAIT_MS = 5_000;\n\n// The root of this project. Change this when moving code to another directory\nconst rootDir = tools.getControllerDir();\nconst killAllScriptPath = path.join(rootDir, 'killall.sh');\n\n/** Command ioBroker process control (start/stop/restart/status) ... */\nexport class CLIProcess extends CLICommand {\n /**\n * @param options The command options including context and parameters\n */\n constructor(options: CLICommandOptions) {\n super(options);\n }\n\n // These CLI commands have no subcommands, but belong together thematically\n // (start/stop/restart/status)\n\n /**\n * Starts one or more adapters or the js-controller\n *\n * @param args parsed cli arguments\n */\n async start(args: string[]): Promise<void> {\n const adapterName = normalizeAdapterName(args[0]);\n if (!adapterName) {\n const running = await this.startJSController();\n this.options.callback(running ? undefined : EXIT_CODES.UNKNOWN_ERROR);\n } else if (adapterName === 'all') {\n this.setAllAdaptersEnabled(true);\n } else if (/\\.\\d+$/.test(adapterName)) {\n this.setAdapterInstanceEnabled(adapterName, true);\n } else {\n this.setAdapterEnabled(adapterName, true);\n }\n }\n\n /**\n * Restarts one or more instances or the js-controller\n *\n * @param args parsed cli arguments\n */\n async restart(args: string[]): Promise<void> {\n const adapterName = normalizeAdapterName(args[0]);\n if (!adapterName) {\n const running = await this.restartJSController();\n this.options.callback(running ? undefined : EXIT_CODES.UNKNOWN_ERROR);\n } else if (/\\.\\d+$/.test(adapterName)) {\n this.setAdapterInstanceEnabled(adapterName, true, /* restartIfRunning */ true);\n } else {\n this.setAdapterEnabled(adapterName, true, /* restartIfRunning */ true);\n }\n }\n\n /**\n * Stops one or more adapters or the js-controller\n *\n * @param args parsed cli arguments\n */\n async stop(args: string[]): Promise<void> {\n const adapterName = normalizeAdapterName(args[0]);\n if (adapterName === undefined) {\n await CLIProcess.stopJSController();\n this.options.callback();\n } else if (adapterName === 'all') {\n this.setAllAdaptersEnabled(false);\n } else if (/\\.\\d+$/.test(adapterName)) {\n this.setAdapterInstanceEnabled(adapterName, false);\n } else {\n this.setAdapterEnabled(adapterName, false);\n }\n }\n\n /**\n * Starts or stops all adapters\n *\n * @param enabled if adapters should be started or stopped\n */\n setAllAdaptersEnabled(enabled: boolean): void {\n const { callback, dbConnect } = this.options;\n dbConnect(async params => {\n const { objects } = params;\n // Enumerate all adapter instances\n const instances = await getInstancesOrderedByStartPrio(objects, console);\n // Create a promise for each. setInstanceEnabled only starts/stops when necessary\n const instancePromises = instances\n .filter(obj => obj.common.enabled !== enabled)\n .map(obj => setInstanceEnabled(objects, obj, enabled));\n // wait for all instances to be started/stopped\n await Promise.all(instancePromises);\n callback();\n });\n }\n\n /**\n * Starts or stops a single or all instances of adapter.\n * If there are multiple instances, all will be started/stopped/restarted\n *\n * @param adapter The adapter to start\n * @param enabled If adapter should be started or stopped\n * @param [restartIfRunning] Whether running instances should be restarted\n */\n setAdapterEnabled(adapter: string, enabled: boolean, restartIfRunning?: boolean): void {\n const { callback, dbConnect } = this.options;\n dbConnect(async params => {\n const { objects } = params;\n\n try {\n // Enumerate all adapter instances\n const adapterInstances = await enumInstances(objects, adapter);\n if (adapterInstances.length === 0) {\n CLI.error.noInstancesFound(adapter);\n return void callback(EXIT_CODES.UNKNOWN_ERROR);\n }\n for (const instance of adapterInstances) {\n await setInstanceEnabled(objects, instance, enabled, restartIfRunning);\n }\n return void callback();\n } catch (e) {\n CLI.error.unknown(e.message);\n return void callback(EXIT_CODES.UNKNOWN_ERROR);\n }\n });\n }\n\n /**\n * Starts or stops a specific adapter instance\n *\n * @param instance The instance to start, e.g. \"adaptername.0\"\n * @param enabled If the instance should be started or stopped\n * @param [restartIfRunning] Whether running instances should be restarted\n */\n setAdapterInstanceEnabled(instance: string, enabled: boolean, restartIfRunning?: boolean): void {\n const { callback, dbConnect } = this.options;\n dbConnect(async params => {\n const { objects } = params;\n\n const obj = (await objects.getObject(`system.adapter.${instance}`)) as\n ioBroker.InstanceObject | ioBroker.AdapterObject;\n\n if (!obj || obj.type !== 'instance') {\n CLI.error.invalidInstance(instance);\n return void callback();\n }\n\n try {\n await setInstanceEnabled(objects, obj, enabled, restartIfRunning);\n return void callback();\n } catch (e) {\n CLI.error.unknown(e.message);\n return void callback(EXIT_CODES.UNKNOWN_ERROR);\n }\n });\n }\n\n /**\n * Starts the JS controller\n *\n * @returns true if the controller was started or is already running, false if it could not be started\n */\n async startJSController(): Promise<boolean> {\n let memoryLimitMB = 0;\n try {\n const config: ioBroker.IoBrokerJson = fs.readJSONSync(tools.getConfigFileName(), { encoding: 'utf-8' });\n if (config?.system?.memoryLimitMB) {\n memoryLimitMB = Math.round(config.system.memoryLimitMB);\n }\n } catch {\n console.warn('Cannot read memoryLimitMB');\n console.warn(\n `May be config file does not exist.\\nPlease call \"${tools.appName} setup first\" to initialize the settings.`,\n );\n }\n\n let pid: number | undefined;\n try {\n pid = await tools.getControllerPid();\n } catch (e) {\n console.error(`Could not read pid file: ${e.message}`);\n }\n\n if (pid) {\n const staleReason = await getStalePidsFileReason(pid);\n\n if (!staleReason) {\n console.log(`Controller is already running with pid ${pid}`);\n return true;\n }\n\n // The pids file survived an unclean shutdown, e.g. a power loss. Without removing it\n // here every \"start\" would keep refusing and only \"restart\" would work, because that\n // one deletes the file on its way through stop.\n console.log(`Ignoring left over ${tools.getPidsFileName()}: ${staleReason}`);\n\n const pidsFileName = tools.getPidsFileName();\n try {\n await fs.unlink(pidsFileName);\n } catch (e) {\n if (e.code !== 'ENOENT') {\n console.error(`Could not remove ${pidsFileName}: ${e.message}`);\n console.error(`Please delete the file manually and run \"${tools.appName} start\" again.`);\n return false;\n }\n }\n }\n\n const args = [path.join(rootDir, 'controller.js')];\n if (memoryLimitMB) {\n args.push(`--max-old-space-size=${memoryLimitMB}`);\n }\n\n const child = spawn(process.execPath, args, {\n env: process.env,\n detached: true,\n stdio: ['ignore', 'ignore', 'ignore', 'ipc'],\n windowsHide: true,\n cwd: rootDir,\n });\n\n child.unref();\n return true;\n }\n\n /**\n * Stops the JS controller\n */\n static async stopJSController(): Promise<void> {\n let pid: number | undefined;\n try {\n pid = await tools.getControllerPid();\n } catch (e) {\n console.error(`Could not read pid file: ${e.message}`);\n }\n\n if (!pid) {\n return;\n }\n\n // Stopping the controller is fine, shooting at whoever inherited its pid after a reboot\n // is not - so a pid which provably belongs to a different program is only cleaned up\n if (tools.isProcessRunning(pid) && (await tools.isForeignProcess(pid))) {\n console.log(`Not stopping pid ${pid}, it belongs to a different program`);\n\n try {\n await fs.unlink(tools.getPidsFileName());\n } catch (e) {\n if (e.code !== 'ENOENT') {\n console.error(`Could not remove ${tools.getPidsFileName()}: ${e.message}`);\n }\n }\n return;\n }\n\n await tryKill(pid);\n\n // On non-Windows OSes start a KILLALL script\n // to make sure nothing keeps running\n if (os.platform() !== 'win32') {\n let data = '';\n if (fs.existsSync(killAllScriptPath)) {\n fs.chmodSync(killAllScriptPath, '777');\n const child = spawn(killAllScriptPath, [], { windowsHide: true });\n child.stdout.on('data', _data => (data += _data.toString().replace(/\\n/g, '')));\n child.stderr.on('data', _data => (data += _data.toString().replace(/\\n/g, '')));\n return new Promise(resolve => {\n child.on('exit', exitCode => {\n console.log(`Exit code for \"killall.sh\": ${exitCode}`);\n resolve();\n });\n });\n }\n console.log('No \"killall.sh\" script found. Just stop.');\n }\n\n try {\n // delete pids.txt file\n fs.unlinkSync(tools.getPidsFileName());\n } catch {\n // ignore\n }\n }\n\n /**\n * Restarts the JS controller\n *\n * @returns true if the controller is running afterwards, false if it could not be started\n */\n async restartJSController(): Promise<boolean> {\n await CLIProcess.stopJSController();\n return this.startJSController();\n }\n\n /**\n * Checks if ioBroker is running or not\n *\n * @param args parsed cli arguments\n */\n status(args: string[]): void {\n const { callback, dbConnect } = this.options;\n const adapterName = normalizeAdapterName(args[0]);\n const showEntireConfig = adapterName === 'all';\n\n dbConnect(async params => {\n const { objects, states, config, isOffline } = params;\n\n if (!adapterName || showEntireConfig) {\n // we want host info or/and whole config\n const hostAlive = await states.getState(`system.host.${tools.getHostName()}.alive`);\n\n const alive = hostAlive ? (hostAlive.val as boolean) : false;\n CLI.success.controllerStatus(alive);\n console.log();\n\n const hasLocalStatesServer = await isLocalStatesDbServer(config.states.type, config.states.host);\n const hasLocalObjectsServer = await isLocalObjectsDbServer(config.objects.type, config.objects.host);\n\n if (!hasLocalStatesServer && !hasLocalObjectsServer) {\n CLI.success.systemStatus(!isOffline);\n }\n\n console.log();\n if (showEntireConfig) {\n await showAllInstancesStatus(states, objects);\n console.log();\n showConfig(config);\n } else {\n console.log(`Objects type: ${config.objects.type}`);\n console.log(`States type: ${config.states.type}`);\n }\n return void callback(isOffline ? EXIT_CODES.CONTROLLER_NOT_RUNNING : undefined);\n }\n // we want to know the status of an adapter\n if (/\\.\\d+$/.test(adapterName)) {\n // instance specified\n await showInstanceStatus(states, adapterName);\n return void callback();\n }\n const adapterInstances = await enumInstances(objects, adapterName);\n // If there are multiple instances of this adapter, ask the user to specify which one\n if (adapterInstances.length > 1) {\n CLI.error.specifyInstance(\n adapterName,\n adapterInstances.map(obj => obj._id.substring('system.adapter.'.length)),\n );\n return void callback(EXIT_CODES.INVALID_ADAPTER_ID);\n } else if (adapterInstances.length === 0) {\n CLI.error.noInstancesFound(adapterName);\n return void callback(EXIT_CODES.UNKNOWN_ERROR);\n }\n\n const instanceId = adapterInstances[0]._id.split('.').pop();\n await showInstanceStatus(states, `${adapterName}.${instanceId}`);\n return void callback();\n });\n }\n}\n\n/**\n * Outputs the status of all existing adapter instances\n *\n * @param states The States DB\n * @param objects The Objects DB\n */\nasync function showAllInstancesStatus(states: StatesClient, objects: ObjectsClient): Promise<void> {\n const allInstances = await enumInstances(objects);\n for (const instance of allInstances) {\n const instanceId = instance._id.split('.').pop();\n await showInstanceStatus(states, `${instance.common.name}.${instanceId}`);\n }\n return Promise.resolve();\n}\n\n/**\n * Outputs the status of an adapter instance\n *\n * @param states the states object\n * @param adapterInstance <adapterName>.<instanceId>\n */\nasync function showInstanceStatus(states: StatesClient, adapterInstance: string): Promise<void> {\n const state = await states.getState(`system.adapter.${adapterInstance}.alive`);\n if (state?.val === true) {\n console.log(`Instance \"${adapterInstance}\" is running`);\n } else {\n console.log(`Instance \"${adapterInstance}\" is not running`);\n }\n}\n\n/**\n * Prints the config file to the console\n *\n * @param config the ioBroker json file content\n * @param root The path of the current config section being printed\n */\nfunction showConfig(config: ioBroker.IoBrokerJson, root?: string[]): void {\n if (!tools.isObject(config)) {\n return;\n }\n root ||= [];\n const prefix = root.join('/').toUpperCase();\n for (const attr of Object.keys(config)) {\n if (attr.match(/comment$/i)) {\n continue;\n }\n if (typeof (config as Record<string, any>)[attr] === 'object') {\n const nextRoot = deepClone(root);\n nextRoot.push(attr);\n showConfig((config as Record<string, any>)[attr], nextRoot);\n } else {\n console.log(`${prefix}${(prefix ? '/' : '') + attr}: ${(config as Record<string, any>)[attr]}`);\n }\n }\n}\n\n/**\n * Sets the enabled state of an instance to the given value\n *\n * @param objects The objects DB\n * @param instanceObj The instance object to change\n * @param enabled Whether the instance should be enabled or not\n * @param force Whether the object should be updated always\n */\nasync function setInstanceEnabled(\n objects: ObjectsClient,\n instanceObj: ioBroker.InstanceObject,\n enabled: boolean,\n force?: boolean,\n): Promise<void> {\n if (!force && instanceObj.common.enabled === enabled) {\n return;\n }\n\n instanceObj.common.enabled = enabled;\n instanceObj.from = getObjectFrom();\n instanceObj.ts = Date.now();\n await objects.setObject(instanceObj._id, instanceObj);\n const instanceName = getInstanceName(instanceObj._id);\n if (enabled) {\n CLI.success.adapterStarted(instanceName);\n } else {\n CLI.success.adapterStopped(instanceName);\n }\n}\n\n/**\n * Determine whether the pids file is a leftover instead of belonging to a running controller\n *\n * @param pid the controller pid recorded in the pids file\n * @returns a human readable reason if the file is stale, else undefined\n */\nasync function getStalePidsFileReason(pid: number): Promise<string | undefined> {\n if (!tools.isProcessRunning(pid)) {\n return `process ${pid} is not running any more`;\n }\n\n // The pid is in use, but that alone proves nothing: after a reboot the operating system may\n // have handed it to an unrelated program. Only a positive identification counts here - if the\n // process cannot be inspected we leave it alone, because starting a second controller makes\n // both of them fail with EADDRINUSE.\n if (await tools.isForeignProcess(pid)) {\n return `pid ${pid} belongs to a different program, not to a controller`;\n }\n\n return undefined;\n}\n\n/**\n * Kills a process by its PID\n *\n * @param pid The PID of the process to kill\n */\nasync function tryKill(pid: number): Promise<void> {\n try {\n process.kill(pid, 'SIGTERM');\n } catch (e) {\n console.warn(`Could not send \"SIGTERM\" to process ${pid}: ${e.message}`);\n }\n\n await wait(TRY_KILL_WAIT_MS);\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["path", "fs", "os", "deepClone", "wait"]
|
|
7
7
|
}
|
|
@@ -7,13 +7,16 @@ interface CLIStatesOptions extends CLICommandOptions {
|
|
|
7
7
|
}
|
|
8
8
|
/** Command iobroker state ... */
|
|
9
9
|
export declare class CLIStates extends CLICommand<CLIStatesOptions> {
|
|
10
|
+
/**
|
|
11
|
+
* @param options The command options including context and parameters
|
|
12
|
+
*/
|
|
10
13
|
constructor(options: CLIStatesOptions);
|
|
11
14
|
/**
|
|
12
15
|
* Executes a command
|
|
13
16
|
*
|
|
14
17
|
* @param args parsed cli args
|
|
15
18
|
*/
|
|
16
|
-
execute(args:
|
|
19
|
+
execute(args: string[]): void;
|
|
17
20
|
/**
|
|
18
21
|
* Get the protocol version
|
|
19
22
|
*/
|
|
@@ -36,19 +39,19 @@ export declare class CLIStates extends CLICommand<CLIStatesOptions> {
|
|
|
36
39
|
* @param args parsed cli arguments
|
|
37
40
|
* @param resultTransform transform function for result
|
|
38
41
|
*/
|
|
39
|
-
get_(args:
|
|
42
|
+
get_(args: string[], resultTransform: ResultTransform): void;
|
|
40
43
|
/**
|
|
41
44
|
* Set state in database
|
|
42
45
|
*
|
|
43
46
|
* @param args parsed cli arguments
|
|
44
47
|
*/
|
|
45
|
-
set_(args:
|
|
48
|
+
set_(args: string[]): void;
|
|
46
49
|
/**
|
|
47
50
|
* Deletes a state
|
|
48
51
|
*
|
|
49
52
|
* @param args parsed cli arguments
|
|
50
53
|
*/
|
|
51
|
-
delete(args:
|
|
54
|
+
delete(args: string[]): void;
|
|
52
55
|
}
|
|
53
56
|
export {};
|
|
54
57
|
//# sourceMappingURL=cliStates.d.ts.map
|
|
@@ -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 });
|
|
@@ -36,8 +37,15 @@ var import_cliCommand = require("./cliCommand.js");
|
|
|
36
37
|
var CLI = __toESM(require("../../lib/cli/messages.js"), 1);
|
|
37
38
|
var import_cliTools = require("../../lib/cli/cliTools.js");
|
|
38
39
|
var rl = __toESM(require("readline-sync"), 1);
|
|
40
|
+
var import_tools = require("@iobroker/js-controller-common-db/tools");
|
|
39
41
|
const ALIAS_STARTS_WITH = "alias.";
|
|
40
42
|
class CLIStates extends import_cliCommand.CLICommand {
|
|
43
|
+
static {
|
|
44
|
+
__name(this, "CLIStates");
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* @param options The command options including context and parameters
|
|
48
|
+
*/
|
|
41
49
|
constructor(options) {
|
|
42
50
|
super(options);
|
|
43
51
|
}
|
|
@@ -52,20 +60,20 @@ class CLIStates extends import_cliCommand.CLICommand {
|
|
|
52
60
|
let resultTransform;
|
|
53
61
|
switch (command) {
|
|
54
62
|
case "get":
|
|
55
|
-
resultTransform = (obj) => (0, import_cliTools.formatValue)(obj, pretty);
|
|
63
|
+
resultTransform = /* @__PURE__ */ __name((obj) => (0, import_cliTools.formatValue)(obj, pretty), "resultTransform");
|
|
56
64
|
return this.get_(args, resultTransform);
|
|
57
65
|
case "getPlain":
|
|
58
66
|
case "getplain":
|
|
59
|
-
resultTransform = (obj) => {
|
|
67
|
+
resultTransform = /* @__PURE__ */ __name((obj) => {
|
|
60
68
|
if (!obj) {
|
|
61
69
|
return "null";
|
|
62
70
|
}
|
|
63
71
|
return [obj.val, obj.ack, obj.from, obj.ts, obj.lc].map((line) => (0, import_cliTools.formatValue)(line)).join("\n");
|
|
64
|
-
};
|
|
72
|
+
}, "resultTransform");
|
|
65
73
|
return this.get_(args, resultTransform);
|
|
66
74
|
case "getValue":
|
|
67
75
|
case "getvalue":
|
|
68
|
-
resultTransform = (obj) => obj ? (0, import_cliTools.formatValue)(obj.val, pretty) : "null";
|
|
76
|
+
resultTransform = /* @__PURE__ */ __name((obj) => obj ? (0, import_cliTools.formatValue)(obj.val, pretty) : "null", "resultTransform");
|
|
69
77
|
return this.get_(args, resultTransform);
|
|
70
78
|
case "set":
|
|
71
79
|
return this.set_(args);
|
|
@@ -168,7 +176,7 @@ class CLIStates extends import_cliCommand.CLICommand {
|
|
|
168
176
|
sourceCommon: sourceObj?.common,
|
|
169
177
|
targetCommon: targetObj.common,
|
|
170
178
|
state,
|
|
171
|
-
logger:
|
|
179
|
+
logger: (0, import_tools.getLogger)(),
|
|
172
180
|
logNamespace: "",
|
|
173
181
|
sourceId: sourceObj?._id,
|
|
174
182
|
targetId: targetObj._id
|
|
@@ -260,7 +268,7 @@ class CLIStates extends import_cliCommand.CLICommand {
|
|
|
260
268
|
sourceCommon: obj.common,
|
|
261
269
|
targetCommon: targetObj?.common,
|
|
262
270
|
state: newVal,
|
|
263
|
-
logger:
|
|
271
|
+
logger: (0, import_tools.getLogger)(),
|
|
264
272
|
logNamespace: "",
|
|
265
273
|
sourceId: obj._id,
|
|
266
274
|
targetId: targetObj?._id
|