@iobroker/js-controller-cli 7.0.2 → 7.0.4-alpha.0-20241116-db3148f4f
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 +2 -1
- package/build/cjs/index.js.map +2 -2
- package/build/cjs/lib/_Types.d.ts +0 -1
- package/build/cjs/lib/cli/cliCert.js +17 -0
- package/build/cjs/lib/cli/cliCert.js.map +1 -1
- package/build/cjs/lib/cli/cliCommand.d.ts +0 -1
- package/build/cjs/lib/cli/cliCommand.js +6 -0
- package/build/cjs/lib/cli/cliCommand.js.map +1 -1
- package/build/cjs/lib/cli/cliCompact.js +30 -1
- package/build/cjs/lib/cli/cliCompact.js.map +1 -1
- package/build/cjs/lib/cli/cliDebug.js +16 -0
- package/build/cjs/lib/cli/cliDebug.js.map +1 -1
- package/build/cjs/lib/cli/cliHost.js +35 -0
- package/build/cjs/lib/cli/cliHost.js.map +1 -1
- package/build/cjs/lib/cli/cliLogs.js +33 -3
- package/build/cjs/lib/cli/cliLogs.js.map +3 -3
- package/build/cjs/lib/cli/cliMessage.js +10 -0
- package/build/cjs/lib/cli/cliMessage.js.map +1 -1
- package/build/cjs/lib/cli/cliObjects.d.ts +0 -1
- package/build/cjs/lib/cli/cliObjects.js +85 -0
- package/build/cjs/lib/cli/cliObjects.js.map +1 -1
- package/build/cjs/lib/cli/cliPlugin.js +23 -2
- package/build/cjs/lib/cli/cliPlugin.js.map +3 -3
- package/build/cjs/lib/cli/cliProcess.js +65 -2
- package/build/cjs/lib/cli/cliProcess.js.map +1 -1
- package/build/cjs/lib/cli/cliStates.d.ts +0 -1
- package/build/cjs/lib/cli/cliStates.js +38 -0
- package/build/cjs/lib/cli/cliStates.js.map +1 -1
- package/build/cjs/lib/cli/cliTools.js.map +1 -1
- package/build/cjs/lib/cli/messages.d.ts +27 -23
- package/build/cjs/lib/cli/messages.js.map +1 -1
- package/build/cjs/lib/setup/dbConnection.js +9 -0
- package/build/cjs/lib/setup/dbConnection.js.map +1 -1
- package/build/cjs/lib/setup/formatters.js.map +1 -1
- package/build/cjs/lib/setup/multihostClient.d.ts +0 -1
- package/build/cjs/lib/setup/multihostClient.js +36 -0
- package/build/cjs/lib/setup/multihostClient.js.map +1 -1
- package/build/cjs/lib/setup/setupBackup.js +112 -2
- package/build/cjs/lib/setup/setupBackup.js.map +1 -1
- package/build/cjs/lib/setup/setupInstall.d.ts +6 -6
- package/build/cjs/lib/setup/setupInstall.js +198 -57
- package/build/cjs/lib/setup/setupInstall.js.map +4 -4
- package/build/cjs/lib/setup/setupLicense.js +9 -0
- package/build/cjs/lib/setup/setupLicense.js.map +1 -1
- package/build/cjs/lib/setup/setupList.d.ts +0 -1
- package/build/cjs/lib/setup/setupList.js +4 -0
- package/build/cjs/lib/setup/setupList.js.map +1 -1
- package/build/cjs/lib/setup/setupMultihost.d.ts +2 -5
- package/build/cjs/lib/setup/setupMultihost.js +58 -33
- package/build/cjs/lib/setup/setupMultihost.js.map +3 -3
- package/build/cjs/lib/setup/setupPacketManager.js +41 -0
- package/build/cjs/lib/setup/setupPacketManager.js.map +1 -1
- package/build/cjs/lib/setup/setupRepo.js +60 -0
- package/build/cjs/lib/setup/setupRepo.js.map +1 -1
- package/build/cjs/lib/setup/setupSetup.d.ts +0 -1
- package/build/cjs/lib/setup/setupSetup.js +79 -5
- package/build/cjs/lib/setup/setupSetup.js.map +3 -3
- package/build/cjs/lib/setup/setupUpgrade.js +34 -0
- package/build/cjs/lib/setup/setupUpgrade.js.map +1 -1
- package/build/cjs/lib/setup/setupUpload.d.ts +0 -3
- package/build/cjs/lib/setup/setupUpload.js +43 -0
- package/build/cjs/lib/setup/setupUpload.js.map +1 -1
- package/build/cjs/lib/setup/setupUsers.d.ts +0 -1
- package/build/cjs/lib/setup/setupUsers.js +109 -0
- package/build/cjs/lib/setup/setupUsers.js.map +1 -1
- package/build/cjs/lib/setup/setupVendor.js +18 -1
- package/build/cjs/lib/setup/setupVendor.js.map +1 -1
- package/build/cjs/lib/setup/setupVisDebug.js +16 -0
- package/build/cjs/lib/setup/setupVisDebug.js.map +1 -1
- package/build/cjs/lib/setup/utils.d.ts +1 -1
- package/build/cjs/lib/setup/utils.js +8 -4
- package/build/cjs/lib/setup/utils.js.map +2 -2
- package/build/cjs/lib/setup.js +17 -6
- package/build/cjs/lib/setup.js.map +3 -3
- package/build/esm/index.d.ts.map +1 -1
- package/build/esm/index.js +1 -0
- package/build/esm/index.js.map +1 -1
- package/build/esm/lib/_Types.d.ts +0 -1
- package/build/esm/lib/_Types.d.ts.map +1 -1
- package/build/esm/lib/cli/cliCommand.d.ts +0 -1
- package/build/esm/lib/cli/cliCommand.d.ts.map +1 -1
- package/build/esm/lib/cli/cliObjects.d.ts +0 -1
- package/build/esm/lib/cli/cliObjects.d.ts.map +1 -1
- package/build/esm/lib/cli/cliStates.d.ts +0 -1
- package/build/esm/lib/cli/cliStates.d.ts.map +1 -1
- package/build/esm/lib/cli/messages.d.ts +27 -23
- package/build/esm/lib/cli/messages.d.ts.map +1 -1
- package/build/esm/lib/setup/multihostClient.d.ts +0 -1
- package/build/esm/lib/setup/multihostClient.d.ts.map +1 -1
- package/build/esm/lib/setup/setupInstall.d.ts +6 -6
- package/build/esm/lib/setup/setupInstall.d.ts.map +1 -1
- package/build/esm/lib/setup/setupInstall.js +37 -70
- package/build/esm/lib/setup/setupInstall.js.map +1 -1
- package/build/esm/lib/setup/setupList.d.ts +0 -1
- package/build/esm/lib/setup/setupList.d.ts.map +1 -1
- package/build/esm/lib/setup/setupMultihost.d.ts +2 -5
- package/build/esm/lib/setup/setupMultihost.d.ts.map +1 -1
- package/build/esm/lib/setup/setupMultihost.js +12 -37
- package/build/esm/lib/setup/setupMultihost.js.map +1 -1
- package/build/esm/lib/setup/setupSetup.d.ts +0 -1
- package/build/esm/lib/setup/setupSetup.d.ts.map +1 -1
- package/build/esm/lib/setup/setupUpload.d.ts +0 -3
- package/build/esm/lib/setup/setupUpload.d.ts.map +1 -1
- package/build/esm/lib/setup/setupUsers.d.ts +0 -1
- package/build/esm/lib/setup/setupUsers.d.ts.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 +3 -3
- package/build/esm/lib/setup/utils.js.map +1 -1
- package/build/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +4 -4
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/lib/cli/cliProcess.ts"],
|
|
4
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": "
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["import_js_controller_common", "path", "fs", "os", "deepClone", "wait"]
|
|
7
7
|
}
|
|
@@ -18,6 +18,10 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
18
18
|
return to;
|
|
19
19
|
};
|
|
20
20
|
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
21
25
|
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
22
26
|
mod
|
|
23
27
|
));
|
|
@@ -37,6 +41,11 @@ class CLIStates extends import_cliCommand.CLICommand {
|
|
|
37
41
|
constructor(options) {
|
|
38
42
|
super(options);
|
|
39
43
|
}
|
|
44
|
+
/**
|
|
45
|
+
* Executes a command
|
|
46
|
+
*
|
|
47
|
+
* @param args parsed cli args
|
|
48
|
+
*/
|
|
40
49
|
execute(args) {
|
|
41
50
|
const { callback, pretty, showHelp } = this.options;
|
|
42
51
|
const command = args[0];
|
|
@@ -77,6 +86,9 @@ class CLIStates extends import_cliCommand.CLICommand {
|
|
|
77
86
|
return void callback(3);
|
|
78
87
|
}
|
|
79
88
|
}
|
|
89
|
+
/**
|
|
90
|
+
* Get the protocol version
|
|
91
|
+
*/
|
|
80
92
|
getDBVersion() {
|
|
81
93
|
const { callback, dbConnect } = this.options;
|
|
82
94
|
dbConnect(async (params) => {
|
|
@@ -86,6 +98,9 @@ class CLIStates extends import_cliCommand.CLICommand {
|
|
|
86
98
|
return void callback(0);
|
|
87
99
|
});
|
|
88
100
|
}
|
|
101
|
+
/**
|
|
102
|
+
* Set protocol version
|
|
103
|
+
*/
|
|
89
104
|
setDBVersion() {
|
|
90
105
|
const { callback, dbConnect } = this.options;
|
|
91
106
|
dbConnect(async (params) => {
|
|
@@ -109,10 +124,23 @@ class CLIStates extends import_cliCommand.CLICommand {
|
|
|
109
124
|
return void callback(0);
|
|
110
125
|
});
|
|
111
126
|
}
|
|
127
|
+
/**
|
|
128
|
+
* Checks if state is a binary state
|
|
129
|
+
*
|
|
130
|
+
* @param id id of the state
|
|
131
|
+
* @param objects the objects db
|
|
132
|
+
* @param _obj cached object
|
|
133
|
+
*/
|
|
112
134
|
async _isBinary(id, objects, _obj) {
|
|
113
135
|
const obj = _obj || await objects.getObjectAsync(id);
|
|
114
136
|
return !!(obj && ("binary" in obj || obj.common && "type" in obj.common && obj.common.type === "file"));
|
|
115
137
|
}
|
|
138
|
+
/**
|
|
139
|
+
* Returns the value of a state
|
|
140
|
+
*
|
|
141
|
+
* @param args parsed cli arguments
|
|
142
|
+
* @param resultTransform transform function for result
|
|
143
|
+
*/
|
|
116
144
|
get_(args, resultTransform) {
|
|
117
145
|
const { callback, dbConnect } = this.options;
|
|
118
146
|
const id = args[1];
|
|
@@ -176,6 +204,11 @@ class CLIStates extends import_cliCommand.CLICommand {
|
|
|
176
204
|
}
|
|
177
205
|
});
|
|
178
206
|
}
|
|
207
|
+
/**
|
|
208
|
+
* Set state in database
|
|
209
|
+
*
|
|
210
|
+
* @param args parsed cli arguments
|
|
211
|
+
*/
|
|
179
212
|
set_(args) {
|
|
180
213
|
const { callback, dbConnect, showHelp } = this.options;
|
|
181
214
|
let [id, val, ack] = args.slice(1);
|
|
@@ -276,6 +309,11 @@ class CLIStates extends import_cliCommand.CLICommand {
|
|
|
276
309
|
}
|
|
277
310
|
});
|
|
278
311
|
}
|
|
312
|
+
/**
|
|
313
|
+
* Deletes a state
|
|
314
|
+
*
|
|
315
|
+
* @param args parsed cli arguments
|
|
316
|
+
*/
|
|
279
317
|
delete(args) {
|
|
280
318
|
const { callback, dbConnect } = this.options;
|
|
281
319
|
const id = args[1];
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/lib/cli/cliStates.ts"],
|
|
4
4
|
"sourcesContent": ["import { tools } from '@iobroker/js-controller-common';\nimport { CLICommand, type CLICommandOptions } from './cliCommand.js';\nimport type { Client as ObjectsClient } from '@iobroker/db-objects-redis';\nimport * as CLI from '@/lib/cli/messages.js';\nimport { formatValue } from '@/lib/cli/cliTools.js';\nimport * as rl from 'readline-sync';\n\nconst ALIAS_STARTS_WITH = 'alias.';\n\ntype ResultTransform = (input: ioBroker.State) => string;\n\n/** Command iobroker state ... */\nexport class CLIStates extends CLICommand {\n constructor(options: CLICommandOptions) {\n super(options);\n }\n\n /**\n * Executes a command\n *\n * @param args parsed cli args\n */\n execute(args: any[]): void {\n const { callback, pretty, showHelp } = this.options;\n const command = args[0];\n let resultTransform: ResultTransform;\n\n switch (command) {\n case 'get':\n resultTransform = obj => formatValue(obj, pretty);\n return this.get_(args, resultTransform);\n case 'getPlain':\n case 'getplain':\n resultTransform = obj => {\n if (!obj) {\n return 'null';\n }\n\n return [obj.val, obj.ack, obj.from, obj.ts, obj.lc].map(line => formatValue(line)).join('\\n');\n };\n return this.get_(args, resultTransform);\n case 'getValue':\n case 'getvalue':\n resultTransform = obj => (obj ? formatValue(obj.val, pretty) : 'null');\n return this.get_(args, resultTransform);\n case 'set':\n return this.set_(args);\n case 'chmod':\n case 'chown':\n CLI.error.wrongCommandPrefix('state', command, 'object');\n return void callback(3);\n case 'delete':\n case 'del':\n return this.delete(args);\n case 'getDBVersion':\n return this.getDBVersion();\n case 'setDBVersion':\n return this.setDBVersion();\n default:\n CLI.error.unknownCommand('state', command);\n showHelp();\n return void callback(3);\n }\n }\n\n /**\n * Get the protocol version\n */\n getDBVersion(): void {\n const { callback, dbConnect } = this.options;\n dbConnect(async params => {\n const { states } = params;\n const version = await states.getProtocolVersion();\n console.log(`Current States DB protocol version: ${version}`);\n return void callback(0);\n });\n }\n\n /**\n * Set protocol version\n */\n setDBVersion(): void {\n const { callback, dbConnect } = this.options;\n dbConnect(async params => {\n const { states } = params;\n\n let answer = rl.question('Changing the protocol version will restart all hosts! Continue? [N/y]', {\n limit: /^(yes|y|n|no)$/i,\n defaultInput: 'no',\n });\n\n answer = answer.toLowerCase();\n\n if (answer !== 'y' && answer !== 'yes') {\n console.log('Protocol version has not been changed!');\n return void callback(0);\n }\n\n try {\n await states.setProtocolVersion(this.options.version);\n } catch (e) {\n console.error(`Cannot update protocol version: ${e.message}`);\n return void callback(1);\n }\n console.log(`States DB protocol updated to version ${this.options.version}`);\n return void callback(0);\n });\n }\n\n /**\n * Checks if state is a binary state\n *\n * @param id id of the state\n * @param objects the objects db\n * @param _obj cached object\n */\n private async _isBinary(id: string, objects: ObjectsClient, _obj?: ioBroker.AnyObject | null): Promise<boolean> {\n const obj = _obj || (await objects.getObjectAsync(id));\n\n return !!(obj && ('binary' in obj || (obj.common && 'type' in obj.common && obj.common.type === 'file')));\n }\n\n /**\n * Returns the value of a state\n *\n * @param args parsed cli arguments\n * @param resultTransform transform function for result\n */\n get_(args: any[], resultTransform: ResultTransform): void {\n const { callback, dbConnect } = this.options;\n const id = args[1];\n\n if (!id) {\n CLI.error.stateNotFound(id);\n return;\n }\n\n dbConnect(async params => {\n const { states, objects } = params;\n\n if (id.startsWith(ALIAS_STARTS_WITH)) {\n objects.getObject(id, (err, targetObj) => {\n // alias\n if (targetObj && targetObj.common && 'alias' in targetObj.common && targetObj.common.alias.id) {\n const aliasId =\n typeof targetObj.common.alias.id.read === 'string'\n ? targetObj.common.alias.id.read\n : targetObj.common.alias.id;\n objects.getObject(aliasId, async (_err, sourceObj) => {\n // read target\n try {\n if (await this._isBinary(aliasId, objects, targetObj)) {\n CLI.error.stateBinaryGetUnsupported(aliasId);\n return void callback(1);\n }\n\n const state = await states.getStateAsync(aliasId);\n if (!state) {\n CLI.error.stateNotFound(id);\n } else {\n tools.formatAliasValue({\n sourceCommon: sourceObj?.common as ioBroker.StateCommon | undefined,\n targetCommon: targetObj.common as ioBroker.StateCommon,\n state,\n logger: console,\n logNamespace: '',\n sourceId: sourceObj?._id,\n targetId: targetObj._id,\n });\n console.log(resultTransform(state));\n }\n } catch (e) {\n CLI.error.unknown(e);\n }\n return void callback(0);\n });\n } else {\n CLI.error.unknown(err?.message || `Alias ${id} has no target`);\n return void callback(1); // ?\n }\n });\n } else {\n try {\n if (await this._isBinary(id, objects)) {\n CLI.error.stateBinaryGetUnsupported(id);\n return void callback(1);\n }\n const state = await states.getStateAsync(id);\n if (!state) {\n CLI.error.stateNotFound(id);\n } else {\n console.log(resultTransform(state));\n }\n } catch (e) {\n CLI.error.unknown(e);\n }\n return void callback(0);\n }\n });\n }\n\n /**\n * Set state in database\n *\n * @param args parsed cli arguments\n */\n set_(args: any[]): void {\n const { callback, dbConnect, showHelp } = this.options;\n // eslint-disable-next-line prefer-const\n let [id, val, ack] = args.slice(1) as [string, any, any];\n const force = args.includes('--force') || args.includes('-f');\n\n if (val === undefined) {\n CLI.error.requiredArgumentMissing('value');\n showHelp();\n return void callback(0);\n }\n\n if (ack !== undefined) {\n ack = ack === 'true' || ack === '1' || ack === 1 || ack === true;\n }\n\n dbConnect(params => {\n const { states, objects } = params;\n const newVal = ack === undefined ? { val, ack: false } : { val, ack: !!ack };\n\n if (id.startsWith(ALIAS_STARTS_WITH)) {\n objects.getObject(id, async (_err, obj) => {\n if (await this._isBinary(id, objects, obj)) {\n CLI.error.stateBinarySetUnsupported(id);\n return void callback(1);\n }\n // alias\n if (obj && obj.common && obj.common.alias && obj.common.alias.id) {\n const aliasId =\n typeof obj.common.alias.id.write === 'string'\n ? obj.common.alias.id.write\n : obj.common.alias.id;\n\n objects.getObject(aliasId, (err, targetObj) => {\n if (err) {\n CLI.error.unknown(err.message);\n return void callback(1); // access error\n }\n if (!obj && !force) {\n CLI.error.objectNotFound(id, 'null');\n return void callback(1); // object not exists\n }\n\n if (obj?.common?.type) {\n if (obj.common.type === 'string') {\n newVal.val = newVal.val.toString();\n } else if (obj.common.type === 'number') {\n newVal.val = parseFloat(newVal.val);\n } else if (obj.common.type === 'boolean') {\n newVal.val = newVal.val.toString();\n newVal.val =\n newVal.val === 'true' ||\n newVal.val === '1' ||\n newVal.val === 'ON' ||\n newVal.val === 'on';\n }\n }\n\n // write target\n states.setState(\n aliasId,\n tools.formatAliasValue({\n sourceCommon: obj.common as ioBroker.StateCommon,\n targetCommon: targetObj?.common as ioBroker.StateCommon | undefined,\n state: newVal as ioBroker.State,\n logger: console,\n logNamespace: '',\n sourceId: obj._id,\n targetId: targetObj?._id,\n }),\n err => {\n if (err) {\n CLI.error.unknown(err.message);\n return void callback(1); // ?\n }\n CLI.success.stateUpdated(id, val, !!ack);\n return void callback(0);\n },\n );\n });\n } else {\n CLI.error.unknown(`Alias ${id} has no target`);\n return void callback(1); // ?\n }\n });\n } else {\n objects.getObject(id, async (err, obj) => {\n if (err) {\n CLI.error.unknown(err.message);\n return void callback(1); // access error\n }\n\n if (await this._isBinary(id, objects, obj)) {\n CLI.error.stateBinarySetUnsupported(id);\n return void callback(1);\n }\n\n if (!obj && !force) {\n CLI.error.objectNotFound(id, 'null');\n return void callback(1); // object not exists\n }\n\n if (obj && obj.common && obj.common.type) {\n if (obj.common.type === 'string') {\n newVal.val = newVal.val.toString();\n } else if (obj.common.type === 'number') {\n newVal.val = parseFloat(newVal.val);\n } else if (obj.common.type === 'boolean') {\n newVal.val = newVal.val.toString();\n newVal.val =\n newVal.val === 'true' ||\n newVal.val === '1' ||\n newVal.val === 'ON' ||\n newVal.val === 'on';\n }\n }\n\n states.setState(id, newVal, err => {\n if (err) {\n CLI.error.unknown(err.message);\n return void callback(1); // ?\n }\n CLI.success.stateUpdated(id, val, !!ack);\n return void callback(0);\n });\n });\n }\n });\n }\n\n /**\n * Deletes a state\n *\n * @param args parsed cli arguments\n */\n delete(args: any[]): void {\n const { callback, dbConnect } = this.options;\n const id: string = args[1];\n if (!id) {\n CLI.error.requiredArgumentMissing('id', 'state delete id');\n return void callback(1);\n }\n\n dbConnect(params => {\n const { states } = params;\n\n states.delState(id, err => {\n if (err) {\n CLI.error.stateNotFound(id, err.message);\n return void callback(3);\n }\n CLI.success.stateDeleted(id);\n return void callback(0);\n });\n });\n }\n}\n"],
|
|
5
|
-
"mappings": "
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["err"]
|
|
7
7
|
}
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/lib/cli/cliTools.ts"],
|
|
4
4
|
"sourcesContent": ["import { tools } from '@iobroker/js-controller-common';\nimport type { Client as ObjectsClient } from '@iobroker/db-objects-redis';\n\n/**\n *\n * @param val The value to format for output\n * @param pretty Whether it should be pretty-printed\n */\nexport function formatValue(val: any, pretty = false): string {\n // Only use JSON.stringify if we need it (for objects and arrays)\n const needsStringify = tools.isObject(val) || tools.isArray(val);\n const output = !needsStringify ? val : pretty ? JSON.stringify(val, null, 2) : JSON.stringify(val);\n return output;\n}\n\n/** Returns the \"from\" property for objects changed by the CLI */\nexport function getObjectFrom(): `system.host.${string}.cli` {\n return `system.host.${tools.getHostName()}.cli`;\n}\n\n/**\n * Removes <tools.appName> from the start of the adapter name if it is there\n * E.g. iobroker.admin -> admin\n *\n * @param name The adapter name to normalize\n */\nexport function normalizeAdapterName(name: string): string {\n if (typeof name === 'string') {\n name = name.replace(new RegExp(`^${tools.appName}\\\\.`, 'i'), '');\n }\n return name;\n}\n\n/**\n * Ensures that the given string is a valid adapter identifier (<adaptername>) WITHOUT instance number\n *\n * @param name The name which is supposed to be an adapter identifier\n */\nexport function validateAdapterIdentifier(name: string): boolean {\n return /^[a-z0-9\\-_]+$/.test(name);\n}\n\n/**\n * Ensures that the given string contains a valid identifier for\n * an adapter (without instance number) or instance (with instance number)\n *\n * @param name the adapter name or instance\n */\nexport function validateAdapterOrInstanceIdentifier(name: string): boolean {\n return /^[a-z0-9\\-_]+(\\.\\d+)?$/.test(name);\n}\n\n/**\n * Ensures that the given string contains a valid identifier for\n * an adapter (without instance number) or instance (with instance number)\n *\n * @param name the adapter name or instance\n */\nexport function splitAdapterOrInstanceIdentifierWithVersion(\n name: string,\n): { name: string; instance: string | null; version: string | null; nameWithVersion: string } | null {\n const res = name.match(/^([a-z0-9\\-_]+)\\.?(\\d+)?@?([a-z0-9\\-_.]*)?$/);\n if (!res) {\n return null;\n }\n return {\n name: res[1],\n instance: res[2] || null,\n version: res[3] || null,\n nameWithVersion: `${res[1]}${res[3] ? `@${res[3]}` : ''}`,\n };\n}\n\n/**\n * Extracts the instance name from an object ID\n *\n * @param instanceObjID The ID of the instance object\n */\nexport function getInstanceName(instanceObjID: string): string {\n return instanceObjID.replace(/^system\\.adapter\\./i, '');\n}\n\n/**\n * Enumerates the instances of an adapter or all of them\n *\n * @param objects The objects DB to use\n * @param adapter (optional) The adapter whose instances should be enumerated\n * @returns An array of instance objects\n */\nexport async function enumInstances(objects: ObjectsClient, adapter?: string): Promise<ioBroker.InstanceObject[]> {\n // if no adapter given all instances should be returned\n const startkey = `system.adapter.${adapter ? `${adapter}.` : ''}`;\n const data = await enumObjects(objects, 'instance', startkey);\n // because of startkey logic not only receive objects with the dot at the end, so filter them!\n return data.filter((it): it is ioBroker.InstanceObject => !!(it && it._id.startsWith(startkey)));\n}\n\n/**\n * Enumerates all known hosts\n *\n * @param objects The objects DB to use\n * @returns An array of host objects\n */\nexport function enumHosts(objects: ObjectsClient): Promise<ioBroker.InferGetObjectViewItemType<'system', 'host'>[]> {\n return enumObjects(objects, 'host', 'system.host.');\n}\n\n/**\n * Enumerates all objects of a given type\n *\n * @param objects The objects DB to use\n * @param type The type of the objects to enumerate\n * @param startkey The prefix of the objects\n */\nexport function enumObjects<T extends string>(\n objects: ObjectsClient,\n type: T,\n startkey: string,\n): Promise<ioBroker.InferGetObjectViewItemType<'system', T>[]> {\n return new Promise((resolve, reject) => {\n const endkey = `${startkey}\\u9999`;\n objects.getObjectView('system', type, { startkey, endkey }, null, (err, res) => {\n if (err) {\n return reject(err);\n }\n\n let ret: ioBroker.InferGetObjectViewItemType<'system', T>[] = [];\n if (res?.rows) {\n ret = res.rows.map(row => row.value);\n }\n resolve(ret);\n });\n });\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;;;;;;;;;;;;;;kCAAsB;AAQhB,SAAU,YAAY,KAAU,SAAS,OAAK;AAEhD,QAAM,iBAAiB,kCAAM,SAAS,GAAG,KAAK,kCAAM,QAAQ,GAAG;AAC/D,QAAM,SAAS,CAAC,iBAAiB,MAAM,SAAS,KAAK,UAAU,KAAK,MAAM,CAAC,IAAI,KAAK,UAAU,GAAG;AACjG,SAAO;AACX;AAGM,SAAU,gBAAa;AACzB,SAAO,eAAe,kCAAM,YAAW;
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;;;;;;;;;;;;;;AAAA,kCAAsB;AAQhB,SAAU,YAAY,KAAU,SAAS,OAAK;AAEhD,QAAM,iBAAiB,kCAAM,SAAS,GAAG,KAAK,kCAAM,QAAQ,GAAG;AAC/D,QAAM,SAAS,CAAC,iBAAiB,MAAM,SAAS,KAAK,UAAU,KAAK,MAAM,CAAC,IAAI,KAAK,UAAU,GAAG;AACjG,SAAO;AACX;AAGM,SAAU,gBAAa;AACzB,SAAO,eAAe,kCAAM,YAAW,CAAE;AAC7C;AAQM,SAAU,qBAAqB,MAAY;AAC7C,MAAI,OAAO,SAAS,UAAU;AAC1B,WAAO,KAAK,QAAQ,IAAI,OAAO,IAAI,kCAAM,OAAO,OAAO,GAAG,GAAG,EAAE;EACnE;AACA,SAAO;AACX;AAOM,SAAU,0BAA0B,MAAY;AAClD,SAAO,iBAAiB,KAAK,IAAI;AACrC;AAQM,SAAU,oCAAoC,MAAY;AAC5D,SAAO,yBAAyB,KAAK,IAAI;AAC7C;AAQM,SAAU,4CACZ,MAAY;AAEZ,QAAM,MAAM,KAAK,MAAM,6CAA6C;AACpE,MAAI,CAAC,KAAK;AACN,WAAO;EACX;AACA,SAAO;IACH,MAAM,IAAI,CAAC;IACX,UAAU,IAAI,CAAC,KAAK;IACpB,SAAS,IAAI,CAAC,KAAK;IACnB,iBAAiB,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,KAAK,EAAE;;AAE/D;AAOM,SAAU,gBAAgB,eAAqB;AACjD,SAAO,cAAc,QAAQ,uBAAuB,EAAE;AAC1D;AASA,eAAsB,cAAc,SAAwB,SAAgB;AAExE,QAAM,WAAW,kBAAkB,UAAU,GAAG,OAAO,MAAM,EAAE;AAC/D,QAAM,OAAO,MAAM,YAAY,SAAS,YAAY,QAAQ;AAE5D,SAAO,KAAK,OAAO,CAAC,OAAsC,CAAC,EAAE,MAAM,GAAG,IAAI,WAAW,QAAQ,EAAE;AACnG;AAQM,SAAU,UAAU,SAAsB;AAC5C,SAAO,YAAY,SAAS,QAAQ,cAAc;AACtD;AASM,SAAU,YACZ,SACA,MACA,UAAgB;AAEhB,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAU;AACnC,UAAM,SAAS,GAAG,QAAQ;AAC1B,YAAQ,cAAc,UAAU,MAAM,EAAE,UAAU,OAAM,GAAI,MAAM,CAAC,KAAK,QAAO;AAC3E,UAAI,KAAK;AACL,eAAO,OAAO,GAAG;MACrB;AAEA,UAAI,MAA0D,CAAA;AAC9D,UAAI,KAAK,MAAM;AACX,cAAM,IAAI,KAAK,IAAI,SAAO,IAAI,KAAK;MACvC;AACA,cAAQ,GAAG;IACf,CAAC;EACL,CAAC;AACL;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,26 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
export declare const success: Readonly<{
|
|
3
|
-
objectUpdated: (objectID: string) => string;
|
|
4
|
-
objectDeleted: (objectID: string) => string;
|
|
5
|
-
stateUpdated: (stateID: string, value: any, ack?: boolean) => string;
|
|
6
|
-
stateDeleted: (stateID: string) => string;
|
|
7
|
-
adapterStarted: (adapter: string) => string;
|
|
8
|
-
adapterStopped: (adapter: string) => string;
|
|
9
|
-
adapterRestarted: (adapter: string) => string;
|
|
10
|
-
systemStatus: (isRunning: boolean) => string;
|
|
11
|
-
controllerStatus: (isRunning: boolean) => string;
|
|
12
|
-
messageSent: (adapter: string, command: string, message: string) => string;
|
|
13
|
-
hostRenamed: (from: string, to: string) => string;
|
|
14
|
-
instanceHostChanged: (instance: string, from: string, to: string) => string;
|
|
15
|
-
hostDeleted: (hostname: string) => string;
|
|
16
|
-
pluginEnabledOrDisabled: (pluginName: string, host: string, instance: string, status: boolean) => string;
|
|
17
|
-
pluginStatus: (pluginName: string, host: string, instance: string, status: boolean) => string;
|
|
18
|
-
}>;
|
|
19
|
-
export declare const warn: Readonly<{
|
|
20
|
-
noInstancesFoundOnHost: (hostname?: string) => string;
|
|
21
|
-
}>;
|
|
22
|
-
/** Prints predefined error messages on the CLI */
|
|
23
|
-
export declare const error: Readonly<{
|
|
1
|
+
declare const errorMessages: Readonly<{
|
|
24
2
|
stateNotFound: (stateID: string, error?: string) => string;
|
|
25
3
|
stateNotBinary: (stateId: string) => string;
|
|
26
4
|
stateBinaryGetUnsupported: (stateId: string) => string;
|
|
@@ -52,4 +30,30 @@ export declare const error: Readonly<{
|
|
|
52
30
|
cert: (certName: string) => string;
|
|
53
31
|
instanceAlreadyRunning: (instance: string) => string;
|
|
54
32
|
}>;
|
|
33
|
+
declare const successMessages: Readonly<{
|
|
34
|
+
objectUpdated: (objectID: string) => string;
|
|
35
|
+
objectDeleted: (objectID: string) => string;
|
|
36
|
+
stateUpdated: (stateID: string, value: any, ack?: boolean) => string;
|
|
37
|
+
stateDeleted: (stateID: string) => string;
|
|
38
|
+
adapterStarted: (adapter: string) => string;
|
|
39
|
+
adapterStopped: (adapter: string) => string;
|
|
40
|
+
adapterRestarted: (adapter: string) => string;
|
|
41
|
+
systemStatus: (isRunning: boolean) => string;
|
|
42
|
+
controllerStatus: (isRunning: boolean) => string;
|
|
43
|
+
messageSent: (adapter: string, command: string, message: string) => string;
|
|
44
|
+
hostRenamed: (from: string, to: string) => string;
|
|
45
|
+
instanceHostChanged: (instance: string, from: string, to: string) => string;
|
|
46
|
+
hostDeleted: (hostname: string) => string;
|
|
47
|
+
pluginEnabledOrDisabled: (pluginName: string, host: string, instance: string, status: boolean) => string;
|
|
48
|
+
pluginStatus: (pluginName: string, host: string, instance: string, status: boolean) => string;
|
|
49
|
+
}>;
|
|
50
|
+
declare const warnings: Readonly<{
|
|
51
|
+
noInstancesFoundOnHost: (hostname?: string) => string;
|
|
52
|
+
}>;
|
|
53
|
+
/** Prints predefined success messages on the CLI */
|
|
54
|
+
export declare const success: typeof successMessages;
|
|
55
|
+
export declare const warn: typeof warnings;
|
|
56
|
+
/** Prints predefined error messages on the CLI */
|
|
57
|
+
export declare const error: typeof errorMessages;
|
|
58
|
+
export {};
|
|
55
59
|
//# sourceMappingURL=messages.d.ts.map
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/lib/cli/messages.ts"],
|
|
4
4
|
"sourcesContent": ["import { tools } from '@iobroker/js-controller-common';\n\nconst errorMessages = Object.freeze({\n stateNotFound: (stateID: string, error?: string) =>\n `The state ${stateID} was not found!${error ? ` Reason: ${error}` : ''}`,\n stateNotBinary: (stateId: string) => `State \"${stateId}\" is not binary.`,\n stateBinaryGetUnsupported: (stateId: string) => `State \"${stateId}\" is a binary state, please use getBinary.`,\n stateBinarySetUnsupported: (stateId: string) => `State \"${stateId}\" is a binary state and cannot be set via cli.`,\n objectNotFound: (objectID: string, error?: string) =>\n `The object ${objectID} was not found!${error ? ` Reason: ${error}` : ''}`,\n cannotUpdateObject: (objectID: string, error?: string) =>\n `The object ${objectID} could not be updated!${error ? ` Reason: ${error}` : ''}`,\n cannotDeleteObject: (objectID: string, error?: string) =>\n `The object ${objectID} cannot be deleted!${error ? ` Reason: ${error}` : ''}`,\n cannotDeleteObjectFromEnums: (objectID: string, error?: string) =>\n `The object ${objectID} could not be deleted from enums!${error ? ` Reason: ${error}` : ''}`,\n cannotChangeObject: (objectID: string, error?: string) =>\n `The object ${objectID} cannot be changed!${error ? ` Reason: ${error}` : ''}`,\n objectPropertyNotFound: (objectID: string, propPath: string) =>\n `The requested property \"${propPath}\" or one of its parents was not found in the object \"${objectID}\"!`,\n invalidPropertyOrValue: () => `The property path or value is not valid. Please make sure the value is valid JSON.`,\n invalidJSONValue: () => `The given value is not valid JSON.`,\n\n unknownCommand: (prefix: string, command: string) => `Unknown command \"${prefix} ${command}\"!`,\n requiredArgumentMissing: (argName: string, exampleCommand?: string) =>\n `The required argument \"${argName}\" is missing!${exampleCommand ? ` Example: \"${exampleCommand}\"` : ''}`,\n\n noInstancesFound: (adapter: string) => `Cannot find any instances of \"${adapter}\"!`,\n invalidInstance: (instance: string) => `The instance \"${instance}\" does not exist!`,\n specifyInstance: (adapter: string, adapterInstances: string[]) =>\n `The adapter \"${adapter}\" has multiple instances! Please specify which one should be started: \"${adapterInstances.join(\n '\", \"',\n )}\".`,\n adapterDirNotFound: (adapter: string) => `Cannot find the installation dir for adapter \"${adapter}\"!`,\n mainFileNotFound: (adapter: string) => `Cannot find the main file for adapter \"${adapter}\"!`,\n cannotLoadIoPackage: (adapter: string) => `Cannot load the io-package.json file for adapter \"${adapter}\"!`,\n\n wrongCommandPrefix: (wrongPrefix: string, command: string, correctPrefix?: string) =>\n `The command ${command} is not intended to be used with ${wrongPrefix}!${\n correctPrefix ? ` Please use \"${correctPrefix} ${command}\" instead.` : ''\n }`,\n unknown: (err: string) => `An unknown error occurred: ${err}`,\n\n cannotChangeRunningSystem: () => `Cannot execute changes on running system. Stop ${tools.appName} first.`,\n noHostThisInMultihost: () => `Cannot use this command in multihost!`,\n hostAlreadyExists: (hostname: string) => `A host with the name \"${hostname}\" already exists!`,\n hostDoesNotExist: (hostname: string) => `The host \"${hostname}\" does not exist!`,\n dontRemoveCurrentHost: (hostname: string) => `Cannot remove host \"${hostname}\" from itself!`,\n\n pluginNotDefined: (pluginName: string, host: string, instance: string) =>\n `The plugin \"${pluginName}\" does not exist for ${host ? `host \"${host}\"` : `instance \"${instance}\"`}!`,\n\n cert: (certName: string) => `Certificate \"${certName}\" not found or error parsing certificate information.`,\n instanceAlreadyRunning: (instance: string) =>\n `The instance \"${instance}\" is already running, please stop instance first.`,\n});\n\nconst successMessages = Object.freeze({\n objectUpdated: (objectID: string) => `The object \"${objectID}\" was updated successfully.`,\n objectDeleted: (objectID: string) => `The object \"${objectID}\" was deleted.`,\n stateUpdated: (stateID: string, value: any, ack?: boolean) =>\n `The state \"${stateID}\" was set to \"${value}\"${ack === undefined ? '' : ` with flag ack=${ack}`}`,\n stateDeleted: (stateID: string) => `The state \"${stateID}\" was deleted.`,\n adapterStarted: (adapter: string) => `The adapter \"${adapter}\" was started.`,\n adapterStopped: (adapter: string) => `The adapter \"${adapter}\" was stopped.`,\n adapterRestarted: (adapter: string) => `The adapter \"${adapter}\" was restarted.`,\n systemStatus: (isRunning: boolean) =>\n isRunning ? `At least one ${tools.appName} host is running.` : `No ${tools.appName} host is running.`,\n controllerStatus: (isRunning: boolean) => `${tools.appName} is ${isRunning ? '' : 'not '}running on this host.`,\n messageSent: (adapter: string, command: string, message: string) =>\n `The command \"${command}\" was sent to \"${adapter}\" with the message \"${message}\".`,\n hostRenamed: (from: string, to: string) => `Host \"${from}\" successfully renamed to \"${to}\".`,\n instanceHostChanged: (instance: string, from: string, to: string) =>\n `The host for instance \"${instance}\" was changed from \"${from}\" to \"${to}\".`,\n hostDeleted: (hostname: string) => `The host \"${hostname}\" was deleted.`,\n\n pluginEnabledOrDisabled: (pluginName: string, host: string, instance: string, status: boolean) =>\n `The plugin \"${pluginName}\" was successfully ${status ? 'enabled' : 'disabled'} for ${\n host ? `host \"${host}\"` : `instance \"${instance}\"`\n }.`,\n pluginStatus: (pluginName: string, host: string, instance: string, status: boolean) =>\n `The plugin \"${pluginName}\" is ${status ? 'enabled' : 'disabled'} for ${\n host ? `host \"${host}\"` : `instance \"${instance}\"`\n }.`,\n});\n\nconst warnings = Object.freeze({\n noInstancesFoundOnHost: (hostname?: string) =>\n hostname ? `No instances found for host \"${hostname}\"!` : `No instances found!`,\n});\n\n// Capsule success messages in console.log\n/** Prints predefined success messages on the CLI */\nexport const success = {} as typeof successMessages;\nfor (const method of Object.keys(successMessages)) {\n // @ts-expect-error we are only using keys of sucessMessages so method is keyof\n success[method] = (...args: string[]) => console.log(successMessages[method](...args));\n}\n// warnings in console.warning\nexport const warn = {} as typeof warnings;\nfor (const method of Object.keys(warnings)) {\n // @ts-expect-error we are only using keys of sucessMessages so method is keyof\n warn[method] = (...args) => console.log(warnings[method](...args));\n}\n\n// error messages in console.error\n/** Prints predefined error messages on the CLI */\nexport const error = {} as typeof errorMessages;\nfor (const method of Object.keys(errorMessages)) {\n // @ts-expect-error we are only using keys of sucessMessages so method is keyof\n error[method] = (...args) => console.error(errorMessages[method](...args));\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;;;;;;;kCAAsB;AAEtB,MAAM,gBAAgB,OAAO,OAAO;EAChC,eAAe,CAAC,SAAiBA,WAC7B,aAAa,
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["error"]
|
|
7
7
|
}
|
|
@@ -18,6 +18,10 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
18
18
|
return to;
|
|
19
19
|
};
|
|
20
20
|
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
21
25
|
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
22
26
|
mod
|
|
23
27
|
));
|
|
@@ -165,6 +169,8 @@ async function dbConnect(onlyCheck, params, callback) {
|
|
|
165
169
|
});
|
|
166
170
|
}
|
|
167
171
|
},
|
|
172
|
+
// react on change
|
|
173
|
+
// @ts-expect-error todo according to types and first look states.onchange does not exist
|
|
168
174
|
change: (id, msg) => states?.onChange(id, msg)
|
|
169
175
|
});
|
|
170
176
|
states.onChange = null;
|
|
@@ -199,6 +205,7 @@ async function dbConnect(onlyCheck, params, callback) {
|
|
|
199
205
|
console.log("No connection to databases possible ...");
|
|
200
206
|
if (onlyCheck) {
|
|
201
207
|
callback && callback({
|
|
208
|
+
// TODO types: allow null if onlyCheck is true
|
|
202
209
|
objects: null,
|
|
203
210
|
states: null,
|
|
204
211
|
isOffline: true,
|
|
@@ -263,6 +270,7 @@ async function dbConnect(onlyCheck, params, callback) {
|
|
|
263
270
|
callback({ objects, states, isOffline, objectsDBType: config.objects.type, config });
|
|
264
271
|
}
|
|
265
272
|
},
|
|
273
|
+
// @ts-expect-error todo according to types and first look states.onchange does not exist
|
|
266
274
|
change: (id, state) => states?.onChange(id, state)
|
|
267
275
|
});
|
|
268
276
|
}
|
|
@@ -302,6 +310,7 @@ function initializePlugins(config) {
|
|
|
302
310
|
logNamespace: `host.${hostname}`,
|
|
303
311
|
scope: "controller",
|
|
304
312
|
log: {
|
|
313
|
+
// cli should be clean, only log warn/error
|
|
305
314
|
silly: (_msg) => {
|
|
306
315
|
},
|
|
307
316
|
debug: (_msg) => {
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/lib/setup/dbConnection.ts"],
|
|
4
4
|
"sourcesContent": ["import type { DbConnectAsyncReturn, DbConnectCallback } from '../_Types.js';\nimport fs from 'fs-extra';\nimport {\n getObjectsConstructor,\n getStatesConstructor,\n objectsDbHasServer,\n statesDbHasServer,\n} from '@iobroker/js-controller-common';\nimport { EXIT_CODES } from '@iobroker/js-controller-common';\nimport { tools } from '@iobroker/js-controller-common';\nimport { setTimeout as wait } from 'node:timers/promises';\nimport type { Client as StatesRedisClient } from '@iobroker/db-states-redis';\nimport type { Client as ObjectsInRedisClient } from '@iobroker/db-objects-redis';\nimport path from 'node:path';\nimport type { PluginHandlerSettings } from '@iobroker/plugin-base/types';\nimport { PluginHandler } from '@iobroker/plugin-base';\n\nlet pluginHandler: InstanceType<typeof PluginHandler>;\nlet Objects: typeof ObjectsInRedisClient | null; // constructor\nlet objects: ObjectsInRedisClient | null; // instance\nlet States: typeof StatesRedisClient | null; // constructor\nlet states: StatesRedisClient | null; // instance\n\ninterface DbConnectParams {\n /** DB connect timeout, default is 10_000 */\n timeout?: number;\n}\n\nexport function dbConnect(callback: DbConnectCallback): void;\nexport function dbConnect(params: Record<string, any>, callback: DbConnectCallback): void;\nexport function dbConnect(onlyCheck: boolean, params: Record<string, any>, callback: DbConnectCallback): void;\n/**\n * Connects to the DB or tests the connection.\n *\n * @param onlyCheck\n * @param params\n * @param callback\n */\nexport async function dbConnect(\n onlyCheck: boolean | Record<string, any> | DbConnectCallback,\n params?: DbConnectParams | DbConnectCallback,\n callback?: DbConnectCallback,\n): Promise<void> {\n if (typeof onlyCheck === 'object') {\n callback = params as DbConnectCallback;\n params = onlyCheck;\n onlyCheck = false;\n }\n if (typeof onlyCheck === 'function') {\n callback = onlyCheck;\n onlyCheck = false;\n }\n if (typeof params === 'function') {\n callback = params;\n params = {};\n }\n\n if (!callback) {\n throw new Error('No callback for dbConnect');\n }\n\n params = params || {};\n\n const config: ioBroker.IoBrokerJson = fs.readJSONSync(tools.getConfigFileName());\n\n if (objects && states) {\n return void callback({ objects, states, isOffline: false, objectsDBType: config.objects.type, config });\n }\n\n config.states = config.states || { type: 'jsonl' };\n config.objects = config.objects || { type: 'jsonl' };\n // Make sure the DB has enough time (5s). JsonL can take a bit longer if the process just crashed before\n // because the lockfile might not have been freed.\n config.states.connectTimeout = Math.max(config.states.connectTimeout || 0, 5_000);\n config.objects.connectTimeout = Math.max(config.objects.connectTimeout || 0, 5_000);\n\n Objects = await getObjectsConstructor(); // Objects DB Client object\n States = await getStatesConstructor(); // States DB Client object\n\n let isObjectConnected = false;\n let isStatesConnected = false;\n\n // Detect timeout or try to open file itself\n setTimeout(\n async () => {\n if (isObjectConnected && isStatesConnected) {\n return;\n }\n\n if (!isObjectConnected) {\n if (objects) {\n // Destroy Client we tried to connect with\n await objects.destroy();\n objects = null;\n }\n\n const hasObjectsServer = await objectsDbHasServer(config.objects.type);\n\n if (hasObjectsServer) {\n // Just open in memory DB itself\n Objects = (await import(`@iobroker/db-objects-${config.objects.type}`)).Server;\n objects = new Objects!({\n connection: config.objects,\n logger: {\n silly: (_msg: string) => {\n /** do not log on this level */\n },\n debug: (_msg: string) => {\n /** do not log on this level */\n },\n info: (_msg: string) => {\n /** do not log on this level */\n },\n warn: (msg: string) => console.log(msg),\n error: (msg: string) => console.log(msg),\n },\n connected: async () => {\n isObjectConnected = true;\n if (isStatesConnected && typeof callback === 'function') {\n try {\n await initializePlugins(config);\n } catch {\n // ignore in silence\n }\n return void callback({\n objects: objects!,\n states: states!,\n isOffline: true,\n objectsDBType: config.objects.type,\n config,\n });\n }\n },\n });\n } else {\n console.log(\n `No connection to objects ${config.objects.host}:${config.objects.port}[${config.objects.type}]`,\n );\n if (onlyCheck) {\n callback &&\n callback({\n objects: objects!,\n states: states!,\n isOffline: true,\n objectsDBType: config.objects.type,\n config,\n });\n callback = undefined;\n } else {\n return void exitApplicationSave(EXIT_CODES.NO_CONNECTION_TO_OBJ_DB);\n }\n }\n }\n\n if (!isStatesConnected) {\n if (states) {\n // Destroy Client we tried to connect with\n await states.destroy();\n states = null;\n }\n\n const hasStatesServer = await statesDbHasServer(config.states.type);\n\n if (hasStatesServer) {\n // Just open in memory DB itself\n States = (await import(`@iobroker/db-states-${config.states.type}`)).Server;\n\n states = new States!({\n connection: config.states,\n logger: {\n silly: (_msg: string) => {\n /** do not log on this level */\n },\n debug: (_msg: string) => {\n /** do not log on this level */\n },\n info: (_msg: string) => {\n /** do not log on this level */\n },\n warn: (msg: string) => console.log(msg),\n error: (msg: string) => console.log(msg),\n },\n connected: async () => {\n isStatesConnected = true;\n if (isObjectConnected && typeof callback === 'function') {\n try {\n await initializePlugins(config);\n } catch {\n // ignore in silence\n }\n return void callback({\n objects: objects!,\n states: states!,\n isOffline: true,\n objectsDBType: config.objects.type,\n config,\n });\n }\n },\n // react on change\n // @ts-expect-error todo according to types and first look states.onchange does not exist\n change: (id, msg) => states?.onChange(id, msg),\n });\n // @ts-expect-error todo according to types and first look states.onchange does not exist\n states.onChange = null; // here the custom onChange handler could be installed\n } else {\n if (states) {\n // Destroy Client we tried to connect with\n await (states as StatesRedisClient).destroy();\n states = null;\n }\n if (objects) {\n // Destroy Client we tried to connect with\n await objects.destroy();\n objects = null;\n }\n console.log(\n `No connection to states ${config.states.host}:${config.states.port}[${config.states.type}]`,\n );\n if (onlyCheck) {\n callback &&\n callback({\n objects: objects!,\n states: states!,\n isOffline: true,\n objectsDBType: config.objects.type,\n config,\n });\n callback = undefined;\n } else {\n return void exitApplicationSave(EXIT_CODES.NO_CONNECTION_TO_OBJ_DB);\n }\n }\n }\n\n await wait((params.timeout || 10_000) + config.objects.connectTimeout);\n\n // Failsafe\n if (isObjectConnected && isStatesConnected) {\n return;\n }\n\n console.log('No connection to databases possible ...');\n if (onlyCheck) {\n callback &&\n callback({\n // TODO types: allow null if onlyCheck is true\n objects: null as any,\n states: null as any,\n isOffline: true,\n objectsDBType: config.objects.type,\n config,\n });\n callback = undefined;\n } else {\n return void exitApplicationSave(EXIT_CODES.NO_CONNECTION_TO_OBJ_DB);\n }\n },\n params.timeout || config.objects.connectTimeout * 2,\n );\n\n // try to connect as client\n objects = new Objects({\n connection: config.objects,\n logger: {\n silly: (_msg: string) => {\n /** do not log on this level */\n },\n debug: (_msg: string) => {\n /** do not log on this level */\n },\n info: (_msg: string) => {\n /** do not log on this level */\n },\n warn: (msg: string) => console.log(msg),\n error: (msg: string) => console.log(msg),\n },\n connected: async () => {\n if (isObjectConnected) {\n return;\n }\n isObjectConnected = true;\n\n if (isStatesConnected && typeof callback === 'function') {\n const isOffline = await checkSystemOffline(onlyCheck);\n try {\n await initializePlugins(config);\n } catch {\n // ignore in silence\n }\n callback({ objects: objects!, states: states!, isOffline, objectsDBType: config.objects.type, config });\n }\n },\n });\n\n states = new States({\n connection: config.states,\n logger: {\n silly: (_msg: string) => {\n /** do not log on this level */\n },\n debug: (_msg: string) => {\n /** do not log on this level */\n },\n info: (_msg: string) => {\n /** do not log on this level */\n },\n warn: (msg: string) => console.log(msg),\n error: (msg: string) => console.log(msg),\n },\n connected: async () => {\n if (isStatesConnected) {\n return;\n }\n isStatesConnected = true;\n\n if (isObjectConnected && typeof callback === 'function') {\n const isOffline = await checkSystemOffline(onlyCheck);\n try {\n await initializePlugins(config);\n } catch {\n // ignore in silence\n }\n callback({ objects: objects!, states: states!, isOffline, objectsDBType: config.objects.type, config });\n }\n },\n // @ts-expect-error todo according to types and first look states.onchange does not exist\n change: (id, state) => states?.onChange(id, state),\n });\n}\n\n/**\n * Connects to the DB or tests the connection.\n *\n * @param onlyCheck if only connection check should be performed\n * @param params options used by dbConnect\n */\nexport function dbConnectAsync(onlyCheck: boolean, params?: DbConnectParams): Promise<DbConnectAsyncReturn> {\n return new Promise(resolve => dbConnect(onlyCheck, params || {}, params => resolve(params)));\n}\n\n/**\n * Disconnect the database\n */\nexport async function resetDbConnect(): Promise<void> {\n if (objects) {\n await objects.destroy();\n objects = null;\n }\n if (states) {\n await states.destroy();\n states = null;\n }\n if (Objects) {\n Objects = null;\n }\n if (States) {\n States = null;\n }\n\n if (pluginHandler) {\n pluginHandler.destroyAll();\n }\n}\n\n/**\n * Exits the process and saves objects before exit - never resolves\n *\n * @param exitCode code passed to process.exit\n */\nexport async function exitApplicationSave(exitCode?: number): Promise<never> {\n await resetDbConnect();\n await wait(1_000);\n process.exit(exitCode);\n}\n\n/**\n * Initialize plugins from io-pack and config json\n *\n * @param config - parsed content of iobroker.json\n */\nfunction initializePlugins(config: Record<string, any>): Promise<void> {\n const ioPackage = fs.readJsonSync(path.join(tools.getControllerDir(), 'io-package.json'));\n const packageJson = fs.readJsonSync(path.join(tools.getControllerDir(), 'package.json'));\n const hostname = tools.getHostName();\n\n const pluginSettings: PluginHandlerSettings = {\n namespace: `system.host.${hostname}`,\n logNamespace: `host.${hostname}`,\n scope: 'controller',\n log: {\n // cli should be clean, only log warn/error\n silly: (_msg: string) => {\n /** do not log on this level */\n },\n debug: (_msg: string) => {\n /** do not log on this level */\n },\n info: (_msg: string) => {\n /** do not log on this level */\n },\n warn: (msg: string) => console.log(msg),\n error: (msg: string) => console.log(msg),\n level: 'warn',\n },\n iobrokerConfig: config,\n parentPackage: packageJson,\n controllerVersion: ioPackage.common.version,\n };\n\n pluginHandler = new PluginHandler(pluginSettings);\n pluginHandler.addPlugins(ioPackage.common.plugins, tools.getControllerDir()); // Plugins from io-package have priority over ...\n pluginHandler.addPlugins(config.plugins, tools.getControllerDir()); // ... plugins from iobroker.json\n pluginHandler.setDatabaseForPlugins(objects, states);\n\n return pluginHandler.initPlugins(ioPackage);\n}\n\n/**\n * Checks if system is offline\n *\n * @param onlyCheck - returns true then\n */\nasync function checkSystemOffline(onlyCheck: boolean): Promise<boolean> {\n if (!objects || !states) {\n // should never happen\n return true;\n }\n if (onlyCheck) {\n return true;\n }\n\n const offlineStatus = !(await tools.isHostRunning(objects, states));\n\n return offlineStatus;\n}\n"],
|
|
5
|
-
"mappings": "
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["import_js_controller_common", "fs", "wait", "params", "path"]
|
|
7
7
|
}
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/lib/setup/formatters.ts"],
|
|
4
4
|
"sourcesContent": ["/**\n * Format number in seconds to time text\n *\n * @param seconds\n */\nexport function formatSeconds(seconds: number): string {\n let _seconds: number | string = seconds;\n\n const days = Math.floor(_seconds / (3_600 * 24));\n _seconds %= 3_600 * 24;\n let hours: number | string = Math.floor(_seconds / 3_600);\n if (hours < 10) {\n hours = `0${hours}`;\n }\n _seconds %= 3_600;\n let minutes: number | string = Math.floor(_seconds / 60);\n if (minutes < 10) {\n minutes = `0${minutes}`;\n }\n _seconds %= 60;\n _seconds = Math.floor(_seconds);\n if (_seconds < 10) {\n _seconds = `0${_seconds}`;\n }\n let text = '';\n if (days) {\n text += `${days}d. `;\n }\n text += `${hours}:${minutes}:${_seconds}`;\n\n return text;\n}\n\n/**\n * Format bytes to MB or GB\n *\n * @param bytes\n */\nexport function formatRam(bytes: number): string {\n const GB = Math.floor((bytes / (1024 * 1024 * 1024)) * 10) / 10;\n bytes %= 1024 * 1024 * 1024;\n const MB = Math.floor((bytes / (1024 * 1024)) * 10) / 10;\n let text = '';\n if (GB > 1) {\n text += `${GB} GB`;\n } else {\n text += `${MB} MB`;\n }\n\n return text;\n}\n\n/**\n * Format speed\n *\n * @param mhz\n */\nexport function formatSpeed(mhz: number): string {\n return `${mhz} MHz`;\n}\n\n/**\n * Format bytes to human readable form\n *\n * @param bytes\n */\nexport function formatBytes(bytes: number): string {\n if (Math.abs(bytes) < 1024) {\n return `${bytes} B`;\n }\n const units = ['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB'];\n let u = -1;\n do {\n bytes /= 1024;\n ++u;\n } while (Math.abs(bytes) >= 1024 && u < units.length - 1);\n return `${bytes.toFixed(1)} ${units[u]}`;\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;;;;;;;;AAKM,SAAU,cAAc,SAAe;AACzC,MAAI,WAA4B;AAEhC,QAAM,OAAO,KAAK,MAAM,YAAY,OAAQ,GAAG;AAC/C,cAAY,OAAQ;AACpB,MAAI,QAAyB,KAAK,MAAM,WAAW,IAAK;AACxD,MAAI,QAAQ,IAAI;AACZ,YAAQ,IAAI;
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;;;;;;;;AAKM,SAAU,cAAc,SAAe;AACzC,MAAI,WAA4B;AAEhC,QAAM,OAAO,KAAK,MAAM,YAAY,OAAQ,GAAG;AAC/C,cAAY,OAAQ;AACpB,MAAI,QAAyB,KAAK,MAAM,WAAW,IAAK;AACxD,MAAI,QAAQ,IAAI;AACZ,YAAQ,IAAI,KAAK;EACrB;AACA,cAAY;AACZ,MAAI,UAA2B,KAAK,MAAM,WAAW,EAAE;AACvD,MAAI,UAAU,IAAI;AACd,cAAU,IAAI,OAAO;EACzB;AACA,cAAY;AACZ,aAAW,KAAK,MAAM,QAAQ;AAC9B,MAAI,WAAW,IAAI;AACf,eAAW,IAAI,QAAQ;EAC3B;AACA,MAAI,OAAO;AACX,MAAI,MAAM;AACN,YAAQ,GAAG,IAAI;EACnB;AACA,UAAQ,GAAG,KAAK,IAAI,OAAO,IAAI,QAAQ;AAEvC,SAAO;AACX;AAOM,SAAU,UAAU,OAAa;AACnC,QAAM,KAAK,KAAK,MAAO,SAAS,OAAO,OAAO,QAAS,EAAE,IAAI;AAC7D,WAAS,OAAO,OAAO;AACvB,QAAM,KAAK,KAAK,MAAO,SAAS,OAAO,QAAS,EAAE,IAAI;AACtD,MAAI,OAAO;AACX,MAAI,KAAK,GAAG;AACR,YAAQ,GAAG,EAAE;EACjB,OAAO;AACH,YAAQ,GAAG,EAAE;EACjB;AAEA,SAAO;AACX;AAOM,SAAU,YAAY,KAAW;AACnC,SAAO,GAAG,GAAG;AACjB;AAOM,SAAU,YAAY,OAAa;AACrC,MAAI,KAAK,IAAI,KAAK,IAAI,MAAM;AACxB,WAAO,GAAG,KAAK;EACnB;AACA,QAAM,QAAQ,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK;AACrE,MAAI,IAAI;AACR,KAAG;AACC,aAAS;AACT,MAAE;EACN,SAAS,KAAK,IAAI,KAAK,KAAK,QAAQ,IAAI,MAAM,SAAS;AACvD,SAAO,GAAG,MAAM,QAAQ,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC;AAC1C;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -18,6 +18,10 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
18
18
|
return to;
|
|
19
19
|
};
|
|
20
20
|
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
21
25
|
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
22
26
|
mod
|
|
23
27
|
));
|
|
@@ -36,6 +40,9 @@ class MHClient {
|
|
|
36
40
|
id = 1;
|
|
37
41
|
timer = null;
|
|
38
42
|
server;
|
|
43
|
+
/**
|
|
44
|
+
* Stops the MH server
|
|
45
|
+
*/
|
|
39
46
|
stopServer() {
|
|
40
47
|
if (this.server) {
|
|
41
48
|
try {
|
|
@@ -49,6 +56,13 @@ class MHClient {
|
|
|
49
56
|
this.timer = null;
|
|
50
57
|
}
|
|
51
58
|
}
|
|
59
|
+
/**
|
|
60
|
+
* Calculate the SHA
|
|
61
|
+
*
|
|
62
|
+
* @param secret the MH secret
|
|
63
|
+
* @param salt the MH salt
|
|
64
|
+
* @param callback
|
|
65
|
+
*/
|
|
52
66
|
sha(secret, salt, callback) {
|
|
53
67
|
const hash = import_node_crypto.default.createHash("sha256");
|
|
54
68
|
hash.on("readable", function() {
|
|
@@ -60,6 +74,15 @@ class MHClient {
|
|
|
60
74
|
hash.write(secret + salt);
|
|
61
75
|
hash.end();
|
|
62
76
|
}
|
|
77
|
+
/**
|
|
78
|
+
* Starts the MH server
|
|
79
|
+
*
|
|
80
|
+
* @param isBroadcast if server should receive broadcast
|
|
81
|
+
* @param timeout timeout after which MH server will be closed
|
|
82
|
+
* @param onReady ready handler
|
|
83
|
+
* @param onMessage message handler, if return true here, server will be stopped
|
|
84
|
+
* @param onFinished finished handler
|
|
85
|
+
*/
|
|
63
86
|
startServer(isBroadcast, timeout, onReady, onMessage, onFinished) {
|
|
64
87
|
if (this.server) {
|
|
65
88
|
onFinished(new Error("Some operation still active"));
|
|
@@ -99,6 +122,12 @@ class MHClient {
|
|
|
99
122
|
});
|
|
100
123
|
this.server.bind();
|
|
101
124
|
}
|
|
125
|
+
/**
|
|
126
|
+
* Start MH browsing for server
|
|
127
|
+
*
|
|
128
|
+
* @param timeout timeout to stop browsing
|
|
129
|
+
* @param isDebug debug will also show local addresses
|
|
130
|
+
*/
|
|
102
131
|
browse(timeout, isDebug) {
|
|
103
132
|
const result = [];
|
|
104
133
|
const ownIps = import_js_controller_common.tools.findIPs();
|
|
@@ -137,6 +166,13 @@ class MHClient {
|
|
|
137
166
|
});
|
|
138
167
|
});
|
|
139
168
|
}
|
|
169
|
+
/**
|
|
170
|
+
* Connect to server
|
|
171
|
+
*
|
|
172
|
+
* @param ip ip address of server
|
|
173
|
+
* @param password password for authentication
|
|
174
|
+
* @param callback
|
|
175
|
+
*/
|
|
140
176
|
connect(ip, password, callback) {
|
|
141
177
|
let callCb = true;
|
|
142
178
|
this.startServer(false, 2e3, () => {
|