@iobroker/js-controller-cli 5.0.20-alpha.0-20240424-e4f9cfa5 → 5.0.20-alpha.0-20240426-289fdff3
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/lib/cli/cliProcess.js +2 -2
- package/build/cjs/lib/cli/cliProcess.js.map +3 -3
- package/build/cjs/lib/setup/dbConnection.js +2 -2
- package/build/cjs/lib/setup/dbConnection.js.map +3 -3
- package/build/cjs/lib/setup/setupInstall.d.ts +2 -2
- package/build/cjs/lib/setup/setupInstall.js +9 -11
- package/build/cjs/lib/setup/setupInstall.js.map +2 -2
- package/build/cjs/lib/setup/setupMultihost.js +4 -4
- package/build/cjs/lib/setup/setupMultihost.js.map +3 -3
- package/build/cjs/lib/setup/setupRepo.d.ts +1 -1
- package/build/cjs/lib/setup/setupRepo.js +9 -3
- package/build/cjs/lib/setup/setupRepo.js.map +2 -2
- package/build/cjs/lib/setup/setupSetup.js +15 -15
- package/build/cjs/lib/setup/setupSetup.js.map +3 -3
- package/build/cjs/lib/setup/setupUpgrade.d.ts +5 -5
- package/build/cjs/lib/setup/setupUpgrade.js +66 -50
- package/build/cjs/lib/setup/setupUpgrade.js.map +2 -2
- package/build/cjs/lib/setup/setupUpload.js +1 -1
- package/build/cjs/lib/setup/setupUpload.js.map +2 -2
- package/build/cjs/lib/setup/utils.d.ts +28 -0
- package/build/cjs/lib/setup/utils.js +44 -3
- package/build/cjs/lib/setup/utils.js.map +3 -3
- package/build/cjs/lib/setup.js +48 -14
- package/build/cjs/lib/setup.js.map +3 -3
- package/build/esm/lib/cli/cliProcess.d.ts.map +1 -1
- package/build/esm/lib/cli/cliProcess.js +3 -3
- package/build/esm/lib/cli/cliProcess.js.map +1 -1
- package/build/esm/lib/setup/dbConnection.d.ts.map +1 -1
- package/build/esm/lib/setup/dbConnection.js +3 -3
- package/build/esm/lib/setup/dbConnection.js.map +1 -1
- package/build/esm/lib/setup/setupInstall.d.ts +2 -2
- package/build/esm/lib/setup/setupInstall.d.ts.map +1 -1
- package/build/esm/lib/setup/setupInstall.js +9 -13
- package/build/esm/lib/setup/setupInstall.js.map +1 -1
- package/build/esm/lib/setup/setupMultihost.d.ts.map +1 -1
- package/build/esm/lib/setup/setupMultihost.js +5 -5
- package/build/esm/lib/setup/setupMultihost.js.map +1 -1
- package/build/esm/lib/setup/setupRepo.d.ts +1 -1
- package/build/esm/lib/setup/setupRepo.d.ts.map +1 -1
- package/build/esm/lib/setup/setupRepo.js +10 -4
- package/build/esm/lib/setup/setupRepo.js.map +1 -1
- package/build/esm/lib/setup/setupSetup.d.ts.map +1 -1
- package/build/esm/lib/setup/setupSetup.js +16 -16
- package/build/esm/lib/setup/setupSetup.js.map +1 -1
- package/build/esm/lib/setup/setupUpgrade.d.ts +5 -5
- package/build/esm/lib/setup/setupUpgrade.d.ts.map +1 -1
- package/build/esm/lib/setup/setupUpgrade.js +72 -60
- package/build/esm/lib/setup/setupUpgrade.js.map +1 -1
- package/build/esm/lib/setup/setupUpload.js +1 -1
- package/build/esm/lib/setup/setupUpload.js.map +1 -1
- package/build/esm/lib/setup/utils.d.ts +28 -0
- package/build/esm/lib/setup/utils.d.ts.map +1 -1
- package/build/esm/lib/setup/utils.js +45 -1
- package/build/esm/lib/setup/utils.js.map +1 -1
- package/build/esm/lib/setup.d.ts.map +1 -1
- package/build/esm/lib/setup.js +61 -18
- package/build/esm/lib/setup.js.map +1 -1
- package/build/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +4 -4
|
@@ -168,8 +168,8 @@ class CLIProcess extends import_cliCommand.CLICommand {
|
|
|
168
168
|
const alive = hostAlive ? hostAlive.val : false;
|
|
169
169
|
CLI.success.controllerStatus(alive);
|
|
170
170
|
console.log();
|
|
171
|
-
const hasLocalStatesServer = await import_js_controller_common_db.
|
|
172
|
-
const hasLocalObjectsServer = await import_js_controller_common_db.
|
|
171
|
+
const hasLocalStatesServer = await (0, import_js_controller_common_db.isLocalStatesDbServer)(config.states.type, config.states.host);
|
|
172
|
+
const hasLocalObjectsServer = await (0, import_js_controller_common_db.isLocalObjectsDbServer)(config.objects.type, config.objects.host);
|
|
173
173
|
if (!hasLocalStatesServer && !hasLocalObjectsServer) {
|
|
174
174
|
CLI.success.systemStatus(!isOffline);
|
|
175
175
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/lib/cli/cliProcess.ts"],
|
|
4
|
-
"sourcesContent": ["import type { CLICommandOptions } from '@/lib/cli/cliCommand.js';\n\nimport fs from 'fs-extra';\nimport path from 'node:path';\nimport * as CLI from '@/lib/cli/messages.js';\nimport { CLICommand } from '@/lib/cli/cliCommand.js';\nimport { tools, EXIT_CODES } from '@iobroker/js-controller-common';\nimport { tools as dbTools } from '@iobroker/js-controller-common-db';\nimport deepClone from 'deep-clone';\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 os from 'node:os';\nimport { spawn } from 'node:child_process';\n// @ts-expect-error has no types but probably no longer needed as start/stop commands are no longer handled from this code\nimport daemonize2 from 'daemonize2';\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 start(args: any[]): void {\n const adapterName = normalizeAdapterName(args[0]);\n if (!adapterName) {\n this.startJSController();\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 restart(args: any[]): void {\n const adapterName = normalizeAdapterName(args[0]);\n if (!adapterName) {\n this.restartJSController();\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 stop(args: any[]): void {\n const adapterName = normalizeAdapterName(args[0]);\n if (adapterName === undefined) {\n this.stopJSController();\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 tools.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 (err) {\n CLI.error.unknown(err.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 /** Starts the JS controller */\n startJSController(): void {\n const daemon = setupDaemonize();\n daemon.start();\n }\n\n /** Stops the JS controller */\n stopJSController(): void {\n const { callback } = this.options;\n const daemon = setupDaemonize();\n // On non-Windows OSes start KILLALL script\n // to make sure nothing keeps running\n if (!os.platform().startsWith('win')) {\n daemon.on('stopped', () => {\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 child.on('exit', exitCode => {\n console.log('Exit code for \"killall.sh\": ' + exitCode);\n return void callback();\n });\n } else {\n console.log('No \"killall.sh\" script found. Just stop.');\n }\n });\n }\n daemon.stop();\n }\n\n /** Restarts the JS controller */\n restartJSController(): void {\n const daemon = setupDaemonize();\n daemon.on('stopped', () => daemon.start()).on('notrunning', () => daemon.start());\n daemon.stop();\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 dbTools.isLocalStatesDbServer(\n config.states.type,\n config.states.host\n );\n const hasLocalObjectsServer = await dbTools.isLocalObjectsDbServer(\n config.objects.type,\n config.objects.host\n );\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 } else {\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 } else {\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\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 <adapteName>.<instanceId>\n * @returns\n */\nfunction showInstanceStatus(states: StatesClient, adapterInstance: string): Promise<void> {\n return new Promise(resolve => {\n states.getState(`system.adapter.${adapterInstance}.alive`, (err, state) => {\n if (state && state.val === true) {\n console.log(`Instance \"${adapterInstance}\" is running`);\n } else {\n console.log(`Instance \"${adapterInstance}\" is not running`);\n }\n resolve();\n });\n });\n}\n\n/**\n * Prints the config file to the console\n *\n * @param config\n * @param root\n */\nfunction showConfig(config: Record<string, any>, 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[attr] === 'object') {\n const nextRoot = deepClone(root);\n nextRoot.push(attr);\n showConfig(config[attr], nextRoot);\n } else {\n console.log(`${prefix}${(prefix ? '/' : '') + attr}: ${config[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 */\nfunction setInstanceEnabled(\n objects: ObjectsClient,\n instanceObj: ioBroker.InstanceObject,\n enabled: boolean,\n force?: boolean\n): Promise<void> {\n return new Promise(resolve => {\n if (!!force || instanceObj.common.enabled !== enabled) {\n instanceObj.common.enabled = enabled;\n instanceObj.from = getObjectFrom();\n instanceObj.ts = Date.now();\n 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 resolve();\n });\n } else {\n resolve();\n }\n });\n}\n\nfunction setupDaemonize(): typeof daemonize2 {\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 const startObj: Record<string, unknown> = {\n main: path.join(rootDir, 'controller.js'),\n name: `${tools.appName} controller`,\n pidfile: path.join(rootDir, `${tools.appName}.pid`),\n cwd: rootDir,\n stopTimeout: 6_000\n };\n if (memoryLimitMB) {\n startObj.args = `--max-old-space-size=${memoryLimitMB}`;\n }\n\n const daemon = daemonize2.setup(startObj);\n daemon.on('error', (error: string) => CLI.error.unknown(error));\n return daemon;\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAEA;;;;;sBAAe;AACf,uBAAiB;AACjB,UAAqB;AACrB,wBAA2B;AAC3B,kCAAkC;AAClC,
|
|
6
|
-
"names": ["path", "os", "fs", "
|
|
4
|
+
"sourcesContent": ["import type { CLICommandOptions } from '@/lib/cli/cliCommand.js';\n\nimport fs from 'fs-extra';\nimport path from 'node:path';\nimport * as CLI from '@/lib/cli/messages.js';\nimport { CLICommand } from '@/lib/cli/cliCommand.js';\nimport { tools, EXIT_CODES } from '@iobroker/js-controller-common';\nimport { isLocalStatesDbServer, isLocalObjectsDbServer } from '@iobroker/js-controller-common-db';\nimport deepClone from 'deep-clone';\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 os from 'node:os';\nimport { spawn } from 'node:child_process';\n// @ts-expect-error has no types but probably no longer needed as start/stop commands are no longer handled from this code\nimport daemonize2 from 'daemonize2';\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 start(args: any[]): void {\n const adapterName = normalizeAdapterName(args[0]);\n if (!adapterName) {\n this.startJSController();\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 restart(args: any[]): void {\n const adapterName = normalizeAdapterName(args[0]);\n if (!adapterName) {\n this.restartJSController();\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 stop(args: any[]): void {\n const adapterName = normalizeAdapterName(args[0]);\n if (adapterName === undefined) {\n this.stopJSController();\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 tools.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 (err) {\n CLI.error.unknown(err.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 /** Starts the JS controller */\n startJSController(): void {\n const daemon = setupDaemonize();\n daemon.start();\n }\n\n /** Stops the JS controller */\n stopJSController(): void {\n const { callback } = this.options;\n const daemon = setupDaemonize();\n // On non-Windows OSes start KILLALL script\n // to make sure nothing keeps running\n if (!os.platform().startsWith('win')) {\n daemon.on('stopped', () => {\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 child.on('exit', exitCode => {\n console.log('Exit code for \"killall.sh\": ' + exitCode);\n return void callback();\n });\n } else {\n console.log('No \"killall.sh\" script found. Just stop.');\n }\n });\n }\n daemon.stop();\n }\n\n /** Restarts the JS controller */\n restartJSController(): void {\n const daemon = setupDaemonize();\n daemon.on('stopped', () => daemon.start()).on('notrunning', () => daemon.start());\n daemon.stop();\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 } else {\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 } else {\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\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 <adapteName>.<instanceId>\n * @returns\n */\nfunction showInstanceStatus(states: StatesClient, adapterInstance: string): Promise<void> {\n return new Promise(resolve => {\n states.getState(`system.adapter.${adapterInstance}.alive`, (err, state) => {\n if (state && state.val === true) {\n console.log(`Instance \"${adapterInstance}\" is running`);\n } else {\n console.log(`Instance \"${adapterInstance}\" is not running`);\n }\n resolve();\n });\n });\n}\n\n/**\n * Prints the config file to the console\n *\n * @param config\n * @param root\n */\nfunction showConfig(config: Record<string, any>, 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[attr] === 'object') {\n const nextRoot = deepClone(root);\n nextRoot.push(attr);\n showConfig(config[attr], nextRoot);\n } else {\n console.log(`${prefix}${(prefix ? '/' : '') + attr}: ${config[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 */\nfunction setInstanceEnabled(\n objects: ObjectsClient,\n instanceObj: ioBroker.InstanceObject,\n enabled: boolean,\n force?: boolean\n): Promise<void> {\n return new Promise(resolve => {\n if (!!force || instanceObj.common.enabled !== enabled) {\n instanceObj.common.enabled = enabled;\n instanceObj.from = getObjectFrom();\n instanceObj.ts = Date.now();\n 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 resolve();\n });\n } else {\n resolve();\n }\n });\n}\n\nfunction setupDaemonize(): typeof daemonize2 {\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 const startObj: Record<string, unknown> = {\n main: path.join(rootDir, 'controller.js'),\n name: `${tools.appName} controller`,\n pidfile: path.join(rootDir, `${tools.appName}.pid`),\n cwd: rootDir,\n stopTimeout: 6_000\n };\n if (memoryLimitMB) {\n startObj.args = `--max-old-space-size=${memoryLimitMB}`;\n }\n\n const daemon = daemonize2.setup(startObj);\n daemon.on('error', (error: string) => CLI.error.unknown(error));\n return daemon;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["path", "os", "fs", "deepClone", "daemonize2"]
|
|
7
7
|
}
|
|
@@ -81,7 +81,7 @@ async function dbConnect(onlyCheck, params, callback) {
|
|
|
81
81
|
await objects.destroy();
|
|
82
82
|
objects = null;
|
|
83
83
|
}
|
|
84
|
-
const hasObjectsServer = await import_js_controller_common_db.
|
|
84
|
+
const hasObjectsServer = await (0, import_js_controller_common_db.objectsDbHasServer)(config.objects.type);
|
|
85
85
|
if (hasObjectsServer) {
|
|
86
86
|
Objects = (await import(`@iobroker/db-objects-${config.objects.type}`)).Server;
|
|
87
87
|
objects = new Objects({
|
|
@@ -134,7 +134,7 @@ async function dbConnect(onlyCheck, params, callback) {
|
|
|
134
134
|
await states.destroy();
|
|
135
135
|
states = null;
|
|
136
136
|
}
|
|
137
|
-
const hasStatesServer = await import_js_controller_common_db.
|
|
137
|
+
const hasStatesServer = await (0, import_js_controller_common_db.statesDbHasServer)(config.states.type);
|
|
138
138
|
if (hasStatesServer) {
|
|
139
139
|
States = (await import(`@iobroker/db-states-${config.states.type}`)).Server;
|
|
140
140
|
states = new States({
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/lib/setup/dbConnection.ts"],
|
|
4
|
-
"sourcesContent": ["import type { DbConnectAsyncReturn, DbConnectCallback } from '../_Types.js';\nimport fs from 'fs-extra';\nimport { getObjectsConstructor, getStatesConstructor, tools as dbTools } from '@iobroker/js-controller-common-db';\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 as DbConnectCallback;\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 dbTools.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 dbTools.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 as boolean);\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 as boolean);\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 new Promise(resolve => {\n pluginHandler.initPlugins(ioPackage, () => resolve());\n });\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": ";;;;;;;;;;;;;;;;;;;;;;;;AACA;;;;;;;;sBAAe;AACf,
|
|
6
|
-
"names": ["import_js_controller_common", "fs", "
|
|
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-db';\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 as DbConnectCallback;\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 as boolean);\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 as boolean);\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 new Promise(resolve => {\n pluginHandler.initPlugins(ioPackage, () => resolve());\n });\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": "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",
|
|
6
|
+
"names": ["import_js_controller_common", "fs", "wait", "params", "path"]
|
|
7
7
|
}
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
import { EXIT_CODES } from '@iobroker/js-controller-common';
|
|
10
10
|
import type { Client as StatesRedisClient } from '@iobroker/db-states-redis';
|
|
11
11
|
import type { Client as ObjectsRedisClient } from '@iobroker/db-objects-redis';
|
|
12
|
-
import type { ProcessExitCallback } from '
|
|
12
|
+
import type { ProcessExitCallback } from '../../lib/_Types.js';
|
|
13
13
|
export interface CLIInstallOptions {
|
|
14
14
|
params: Record<string, any>;
|
|
15
15
|
states: StatesRedisClient;
|
|
@@ -60,7 +60,7 @@ export declare class Install {
|
|
|
60
60
|
* @param options options.stopDb will stop the db before upgrade ONLY use it for controller upgrade - db is gone afterwards, does not work with stoppedList
|
|
61
61
|
* @param stoppedList
|
|
62
62
|
*/
|
|
63
|
-
downloadPacket(repoUrl: string | undefined | Record<string, any>, packetName: string, options?: CLIDownloadPacketOptions, stoppedList?: ioBroker.InstanceObject[]): Promise<DownloadPacketReturnObject
|
|
63
|
+
downloadPacket(repoUrl: string | undefined | Record<string, any>, packetName: string, options?: CLIDownloadPacketOptions, stoppedList?: ioBroker.InstanceObject[]): Promise<DownloadPacketReturnObject>;
|
|
64
64
|
/**
|
|
65
65
|
* Install npm module from url
|
|
66
66
|
*
|
|
@@ -34,11 +34,11 @@ var import_semver = __toESM(require("semver"), 1);
|
|
|
34
34
|
var import_node_child_process = __toESM(require("node:child_process"), 1);
|
|
35
35
|
var import_axios = __toESM(require("axios"), 1);
|
|
36
36
|
var import_node_url = require("node:url");
|
|
37
|
-
var import_setupUpload = require("
|
|
38
|
-
var import_setupPacketManager = require("
|
|
39
|
-
var import_utils = require("
|
|
37
|
+
var import_setupUpload = require("../../lib/setup/setupUpload.js");
|
|
38
|
+
var import_setupPacketManager = require("../../lib/setup/setupPacketManager.js");
|
|
39
|
+
var import_utils = require("../../lib/setup/utils.js");
|
|
40
|
+
var import_customError = require("../../lib/setup/customError.js");
|
|
40
41
|
var import_constants = require("@iobroker/js-controller-common/constants");
|
|
41
|
-
var import_customError = require("./customError.js");
|
|
42
42
|
var import_node_module = require("node:module");
|
|
43
43
|
const import_meta = {};
|
|
44
44
|
const require2 = (0, import_node_module.createRequire)(import_meta.url || "file://" + __filename);
|
|
@@ -97,12 +97,7 @@ class Install {
|
|
|
97
97
|
stoppedList = stoppedList || [];
|
|
98
98
|
let sources;
|
|
99
99
|
if (!repoUrl || !import_js_controller_common.tools.isObject(repoUrl)) {
|
|
100
|
-
|
|
101
|
-
sources = await (0, import_utils.getRepository)({ repoName: repoUrl, objects: this.objects });
|
|
102
|
-
} catch (e) {
|
|
103
|
-
console.error(e.message);
|
|
104
|
-
return this.processExit(e instanceof import_customError.IoBrokerError ? e.code : e);
|
|
105
|
-
}
|
|
100
|
+
sources = await (0, import_utils.getRepository)({ repoName: repoUrl, objects: this.objects });
|
|
106
101
|
} else {
|
|
107
102
|
sources = repoUrl;
|
|
108
103
|
}
|
|
@@ -173,7 +168,10 @@ class Install {
|
|
|
173
168
|
}
|
|
174
169
|
}
|
|
175
170
|
console.error(`host.${hostname} Unknown packetName ${packetName}. Please install packages from outside the repository using "${import_js_controller_common.tools.appNameLowerCase} url <url-or-package>"!`);
|
|
176
|
-
|
|
171
|
+
throw new import_customError.IoBrokerError({
|
|
172
|
+
code: import_js_controller_common.EXIT_CODES.UNKNOWN_PACKET_NAME,
|
|
173
|
+
message: `Unknown packetName ${packetName}. Please install packages from outside the repository using npm!`
|
|
174
|
+
});
|
|
177
175
|
}
|
|
178
176
|
async _npmInstallWithCheck(npmUrl, options, debug) {
|
|
179
177
|
try {
|