@iobroker/js-controller-cli 6.0.6 → 6.0.7

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.
@@ -74,7 +74,10 @@ class CLILogs extends import_cliCommand.CLICommand {
74
74
  fileName = fileName.replace(/\\/g, "/");
75
75
  const parts = fileName.split("/");
76
76
  parts.pop();
77
- import_chokidar.default.watch(`${parts.join("/")}/iobroker*`, { awaitWriteFinish: { stabilityThreshold: 500 } }).on("all", this.watchHandler.bind(this, options)).on("ready", () => this.isReady = true);
77
+ import_chokidar.default.watch(`${parts.join("/")}/iobroker*`, {
78
+ awaitWriteFinish: { stabilityThreshold: 500 },
79
+ followSymlinks: false
80
+ }).on("all", this.watchHandler.bind(this, options)).on("ready", () => this.isReady = true);
78
81
  }
79
82
  } else {
80
83
  console.log("No log file found");
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/lib/cli/cliLogs.ts"],
4
- "sourcesContent": ["import { CLICommand, type CLICommandOptions } from './cliCommand.js';\nimport { tools, logger as toolsLogger } from '@iobroker/js-controller-common';\nimport chokidar from 'chokidar';\nimport fs from 'fs-extra';\nimport os from 'node:os';\nimport es from 'event-stream';\nimport { createRequire } from 'node:module';\n// eslint-disable-next-line unicorn/prefer-module\nconst require = createRequire(import.meta.url || 'file://' + __filename);\n\nconst { getConfigFileName } = tools;\n\ninterface CLILogsOptions {\n /** Whether to show today's full log */\n complete?: boolean;\n /** An optional RegExp to filter by */\n regex?: RegExp;\n}\n\n/** Command ioBroker state ... */\nexport class CLILogs extends CLICommand {\n private readonly fileSizes = new Map<string, number>();\n private isReady = false;\n\n constructor(options: CLICommandOptions) {\n super(options);\n }\n\n /**\n * Executes a command\n *\n * @param args\n * @param params additional parsed CLI parameters\n */\n execute(args: any[], params: Record<string, any>): void {\n const adapterName = args[0];\n const watch = params.watch || params.w;\n const count = params.lines || 1_000;\n\n const options: CLILogsOptions = {\n complete: this.options.all\n };\n\n const config = fs.readJSONSync(require.resolve(getConfigFileName()));\n const logger = toolsLogger(config.log);\n /** @ts-expect-error todo adjust logger type */\n let fileName = logger.getFileName();\n if (fileName) {\n let lines = fs.readFileSync(fileName).toString('utf-8').split('\\n');\n lines = lines.filter(line => line);\n if (lines.length > count) {\n lines.splice(0, lines.length - count);\n }\n let regex: RegExp;\n if (adapterName) {\n //2019-03-02 13:26:54.698 - debug: iot.0 [ALEXA] Created ALEXA device: Bad.Hauptlicht.Aktor.STATE [\"turnOn\",\"turnOff\"]\n regex = new RegExp(`: ${adapterName}\\\\.`);\n options.regex = regex;\n }\n lines.forEach(line => {\n if (regex && !regex.test(line)) {\n return;\n }\n console.log(line);\n });\n\n if (watch) {\n fileName = fileName.replace(/\\\\/g, '/');\n const parts = fileName.split('/');\n parts.pop();\n chokidar\n .watch(`${parts.join('/')}/iobroker*`, { awaitWriteFinish: { stabilityThreshold: 500 } })\n .on('all', this.watchHandler.bind(this, options))\n .on('ready', () => (this.isReady = true));\n }\n } else {\n console.log('No log file found');\n }\n }\n\n /**\n * Called by chokidar when watched files change\n *\n * @param options some options\n * @param event The type of change\n * @param path Which path has changed\n * @param stats Information about the file\n */\n watchHandler(options: CLILogsOptions, event: string, path: string, stats: Record<string, any>): void {\n if (event === 'add' || !this.fileSizes.has(path)) {\n this.fileSizes.set(path, stats.size);\n if (stats.size > 0 && (this.isReady || (options.complete && this.isTodaysLogfile(path)))) {\n this.streamChange(path, 0, options);\n }\n } else if (event === 'change') {\n const oldFileSize = this.fileSizes.get(path)!;\n this.fileSizes.set(path, stats.size);\n if (this.isReady && stats.size > oldFileSize) {\n this.streamChange(path, oldFileSize, options);\n }\n } else if (event === 'unlink') {\n this.fileSizes.delete(path);\n }\n }\n\n /**\n * If the log file belongs to today\n *\n * @param path The log file path\n */\n isTodaysLogfile(path: string): boolean {\n const YYYYMMDDDate = new Date().toJSON().slice(0, 10);\n return path.includes(YYYYMMDDDate);\n }\n\n /**\n * Streams a portion of a file to the console\n *\n * @param path The file to stream\n * @param start The offset in bytes where to start\n * @param options some options\n */\n streamChange(path: string, start: number, options: CLILogsOptions): void {\n const input = fs.createReadStream(path, {\n encoding: 'utf8',\n start,\n autoClose: true\n });\n if (options.regex) {\n // Read the input line by line and only include the lines matching the filter\n input\n .pipe(es.split())\n .pipe(es.filterSync(line => options.regex!.test(line)))\n .pipe(es.mapSync((line: string) => line + os.EOL))\n .pipe(process.stdout);\n } else {\n // just pipe the input through\n tools.pipeLinewise(input, process.stdout);\n }\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { CLICommand, type CLICommandOptions } from './cliCommand.js';\nimport { tools, logger as toolsLogger } from '@iobroker/js-controller-common';\nimport chokidar from 'chokidar';\nimport fs from 'fs-extra';\nimport os from 'node:os';\nimport es from 'event-stream';\nimport { createRequire } from 'node:module';\n// eslint-disable-next-line unicorn/prefer-module\nconst require = createRequire(import.meta.url || 'file://' + __filename);\n\nconst { getConfigFileName } = tools;\n\ninterface CLILogsOptions {\n /** Whether to show today's full log */\n complete?: boolean;\n /** An optional RegExp to filter by */\n regex?: RegExp;\n}\n\n/** Command ioBroker state ... */\nexport class CLILogs extends CLICommand {\n private readonly fileSizes = new Map<string, number>();\n private isReady = false;\n\n constructor(options: CLICommandOptions) {\n super(options);\n }\n\n /**\n * Executes a command\n *\n * @param args\n * @param params additional parsed CLI parameters\n */\n execute(args: any[], params: Record<string, any>): void {\n const adapterName = args[0];\n const watch = params.watch || params.w;\n const count = params.lines || 1_000;\n\n const options: CLILogsOptions = {\n complete: this.options.all\n };\n\n const config = fs.readJSONSync(require.resolve(getConfigFileName()));\n const logger = toolsLogger(config.log);\n /** @ts-expect-error todo adjust logger type */\n let fileName = logger.getFileName();\n if (fileName) {\n let lines = fs.readFileSync(fileName).toString('utf-8').split('\\n');\n lines = lines.filter(line => line);\n if (lines.length > count) {\n lines.splice(0, lines.length - count);\n }\n let regex: RegExp;\n if (adapterName) {\n //2019-03-02 13:26:54.698 - debug: iot.0 [ALEXA] Created ALEXA device: Bad.Hauptlicht.Aktor.STATE [\"turnOn\",\"turnOff\"]\n regex = new RegExp(`: ${adapterName}\\\\.`);\n options.regex = regex;\n }\n lines.forEach(line => {\n if (regex && !regex.test(line)) {\n return;\n }\n console.log(line);\n });\n\n if (watch) {\n fileName = fileName.replace(/\\\\/g, '/');\n const parts = fileName.split('/');\n parts.pop();\n chokidar\n .watch(`${parts.join('/')}/iobroker*`, {\n awaitWriteFinish: { stabilityThreshold: 500 },\n followSymlinks: false\n })\n .on('all', this.watchHandler.bind(this, options))\n .on('ready', () => (this.isReady = true));\n }\n } else {\n console.log('No log file found');\n }\n }\n\n /**\n * Called by chokidar when watched files change\n *\n * @param options some options\n * @param event The type of change\n * @param path Which path has changed\n * @param stats Information about the file\n */\n watchHandler(options: CLILogsOptions, event: string, path: string, stats: Record<string, any>): void {\n if (event === 'add' || !this.fileSizes.has(path)) {\n this.fileSizes.set(path, stats.size);\n if (stats.size > 0 && (this.isReady || (options.complete && this.isTodaysLogfile(path)))) {\n this.streamChange(path, 0, options);\n }\n } else if (event === 'change') {\n const oldFileSize = this.fileSizes.get(path)!;\n this.fileSizes.set(path, stats.size);\n if (this.isReady && stats.size > oldFileSize) {\n this.streamChange(path, oldFileSize, options);\n }\n } else if (event === 'unlink') {\n this.fileSizes.delete(path);\n }\n }\n\n /**\n * If the log file belongs to today\n *\n * @param path The log file path\n */\n isTodaysLogfile(path: string): boolean {\n const YYYYMMDDDate = new Date().toJSON().slice(0, 10);\n return path.includes(YYYYMMDDDate);\n }\n\n /**\n * Streams a portion of a file to the console\n *\n * @param path The file to stream\n * @param start The offset in bytes where to start\n * @param options some options\n */\n streamChange(path: string, start: number, options: CLILogsOptions): void {\n const input = fs.createReadStream(path, {\n encoding: 'utf8',\n start,\n autoClose: true\n });\n if (options.regex) {\n // Read the input line by line and only include the lines matching the filter\n input\n .pipe(es.split())\n .pipe(es.filterSync(line => options.regex!.test(line)))\n .pipe(es.mapSync((line: string) => line + os.EOL))\n .pipe(process.stdout);\n } else {\n // just pipe the input through\n tools.pipeLinewise(input, process.stdout);\n }\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["require", "fs", "toolsLogger", "chokidar", "es", "os"]
7
7
  }
@@ -293,7 +293,7 @@ async function exitApplicationSave(exitCode) {
293
293
  await (0, import_promises.setTimeout)(1e3);
294
294
  process.exit(exitCode);
295
295
  }
296
- function initializePlugins(config) {
296
+ async function initializePlugins(config) {
297
297
  const ioPackage = import_fs_extra.default.readJsonSync(import_node_path.default.join(import_js_controller_common3.tools.getControllerDir(), "io-package.json"));
298
298
  const packageJson = import_fs_extra.default.readJsonSync(import_node_path.default.join(import_js_controller_common3.tools.getControllerDir(), "package.json"));
299
299
  const hostname = import_js_controller_common3.tools.getHostName();
@@ -320,9 +320,7 @@ function initializePlugins(config) {
320
320
  pluginHandler.addPlugins(ioPackage.common.plugins, import_js_controller_common3.tools.getControllerDir());
321
321
  pluginHandler.addPlugins(config.plugins, import_js_controller_common3.tools.getControllerDir());
322
322
  pluginHandler.setDatabaseForPlugins(objects, states);
323
- return new Promise((resolve) => {
324
- pluginHandler.initPlugins(ioPackage, () => resolve());
325
- });
323
+ await pluginHandler.initPlugins(ioPackage);
326
324
  }
327
325
  async function checkSystemOffline(onlyCheck) {
328
326
  if (!objects || !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 {\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 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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",
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 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 */\nasync function 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 await 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": "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",
6
6
  "names": ["import_js_controller_common", "fs", "wait", "params", "path"]
7
7
  }
@@ -298,6 +298,7 @@ class List {
298
298
  return;
299
299
  }
300
300
  const reg = filter ? new RegExp(import_js_controller_common2.tools.pattern2RegEx("system.adapter." + filter)) : null;
301
+ const adapterList = [];
301
302
  for (const obj of objs.rows) {
302
303
  if (obj.value.type !== "adapter") {
303
304
  continue;
@@ -308,10 +309,15 @@ class List {
308
309
  if (import_js_controller_common2.tools.isObject(name)) {
309
310
  name = name[lang] || name.en;
310
311
  }
311
- const text = `${id.padEnd(39)}: ${name.padEnd(14)} - v${obj.value.common.version}`;
312
- console.log(text);
312
+ adapterList.push({
313
+ id,
314
+ name,
315
+ version: obj.value.common.version,
316
+ "upgrade policy": obj.value.common.automaticUpgrade ?? "none"
317
+ });
313
318
  }
314
319
  }
320
+ console.table(adapterList);
315
321
  this.processExit();
316
322
  });
317
323
  break;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/lib/setup/setupList.ts"],
4
- "sourcesContent": ["/**\n * List different objects for CLI\n *\n * Copyright 2013-2022 bluefox <dogafox@gmail.com>\n *\n * MIT License\n *\n */\n\nimport { EXIT_CODES } from '@iobroker/js-controller-common';\nimport fs from 'fs-extra';\nimport { tools } from '@iobroker/js-controller-common';\nimport type { Client as StatesRedisClient } from '@iobroker/db-states-redis';\nimport type { Client as ObjectsRedisClient } from '@iobroker/db-objects-redis';\n\ninterface File {\n adapter: string;\n path: string;\n file: ioBroker.ReadDirResult;\n}\n\ninterface IdValueObject {\n id: string;\n value: any;\n}\n\ninterface FlagObject {\n alive?: boolean;\n enabled?: boolean;\n disabled?: boolean;\n port?: number;\n ssl?: boolean;\n ip?: string;\n}\n\ninterface CLIListOptions {\n states: StatesRedisClient;\n objects: ObjectsRedisClient;\n processExit: (exitCode?: number) => void;\n}\n\nexport type ListType =\n | 'objects'\n | 'o'\n | 'states'\n | 's'\n | 'adapters'\n | 'a'\n | 'instances'\n | 'i'\n | 'users'\n | 'u'\n | 'groups'\n | 'g'\n | 'hosts'\n | 'h'\n | 'enums'\n | 'e'\n | 'files'\n | 'f';\n\nexport class List {\n private config: Record<string, any>;\n private objects: ObjectsRedisClient;\n private states: StatesRedisClient;\n private readonly processExit: (exitCode?: number) => void;\n\n constructor(options: CLIListOptions) {\n options = options || {};\n\n if (!options.states) {\n throw new Error('Invalid Modified arguments: states is missing');\n }\n if (!options.objects) {\n throw new Error('Invalid arguments: objects is missing');\n }\n if (!options.processExit) {\n throw new Error('Invalid arguments: processExit is missing');\n }\n\n this.config = fs.readJSONSync(tools.getConfigFileName());\n\n this.objects = options.objects;\n this.states = options.states;\n this.processExit = options.processExit;\n }\n\n private static _perm2str(perm: number): string {\n let result = '';\n // user\n result += perm & 0x400 ? 'r' : '-';\n result += perm & 0x200 ? 'w' : '-';\n result += perm & 0x100 ? 'x' : '-';\n // group\n result += perm & 0x040 ? 'r' : '-';\n result += perm & 0x020 ? 'w' : '-';\n result += perm & 0x010 ? 'x' : '-';\n // any\n result += perm & 0x004 ? 'r' : '-';\n result += perm & 0x002 ? 'w' : '-';\n result += perm & 0x001 ? 'x' : '-';\n return result;\n }\n\n showFileHeader(adapter?: string): void {\n if (adapter) {\n console.log(`\\n-- ${adapter} --`);\n }\n\n console.log(' Modified at |Permission| User | Group | Size | Name');\n console.log('----------------+----------+--------------+--------------+------+---------');\n }\n\n showFile(adapter: string, path: string, file: ioBroker.ReadDirResult): void {\n //drwxr-xr-x 1 odroid odroid 43 Oct 3 2013 .xsessionrc\n let text = '';\n let time = '';\n if (file.modifiedAt) {\n const ts = new Date(file.modifiedAt);\n time = ts.toISOString();\n time = time.replace('T', ' ');\n time = time.substring(0, 16) + ' ';\n }\n text += time.padEnd(17);\n\n if (file.acl) {\n text += (file.isDir ? 'd' : '-') + List._perm2str(file.acl.permissions || 0);\n let owner = file.acl.owner;\n // cut system.user.\n owner = owner.substring(12);\n\n text += ` ${owner.padStart(14)}`;\n let group = file.acl.ownerGroup;\n // cut system.group.\n group = group.substring(13);\n text += ` ${group.padStart(14)}`;\n } else {\n text += (file.isDir ? 'd' : '-') + '?????????' + new Array(31).join(' ');\n }\n const size = file.stats && file.stats.size ? file.stats.size.toString() : '';\n\n text += ` ${size.padStart(6)} ${adapter}${!path || path[0] === '/' ? '' : '/'}${path}/${file.file}`;\n if (file.isDir) {\n text += '/';\n console.log(text);\n } else {\n console.log(text);\n }\n }\n\n showObjectHeader(): void {\n console.log('ObjectAC | StateAC | User | Group | ID');\n console.log('---------+---------+--------------+--------------+--------------');\n }\n\n showObject(obj: ioBroker.AnyObject): void {\n //drwxr-xr-x 1 odroid odroid 43 Oct 3 2013 .xsessionrc\n let text = '';\n if (obj.acl) {\n text += `${List._perm2str(obj.acl.object || 0)} ${\n obj.type === 'state' ? List._perm2str(obj.acl.state || 0) : ' '\n }`;\n let owner = obj.acl.owner;\n // cut system.user.\n owner = owner.substring(12);\n\n text += ` ${owner.padStart(14)}`;\n let group = obj.acl.ownerGroup;\n // cut system.group.\n group = group.substring(13);\n text += ` ${group.padStart(14)}`;\n } else {\n text += `?????????${obj.type === 'state' ? ' ?????????' : ' '}${new Array(31).join(' ')}`;\n }\n text += ` ${obj._id}`;\n console.log(text);\n }\n\n listDirectory(\n adapter: string,\n path: string | null | undefined,\n allFiles?: File[] | ((allFiles: File[]) => void),\n callback?: (allFiles: File[]) => void\n ): void {\n if (typeof path === 'function') {\n callback = path;\n path = '';\n allFiles = [];\n }\n if (typeof allFiles === 'function') {\n callback = allFiles;\n allFiles = [];\n }\n const _allFiles = allFiles || [];\n const _path = path || '';\n\n this.objects.readDir(adapter, _path, null, (err, files) => {\n if (err && err.code === 'ENOTDIR') {\n const pos = _path.lastIndexOf('/');\n if (pos !== -1) {\n const dir = _path.substring(0, pos);\n const fname = _path.substring(pos + 1);\n this.objects.readDir(adapter, dir, null, (err, files) => {\n if (err) {\n console.log(`Cannot read \"${path}\": ${err.message}`);\n typeof callback === 'function' && callback(_allFiles);\n } else {\n // @ts-expect-error if no error, files are guranteed to be an Array https://github.com/ioBroker/adapter-core/issues/455\n for (const file of files) {\n if (file.file === '.' || file.file === '..') {\n continue;\n }\n if (file.file === fname) {\n _allFiles.push({ adapter, path: _path, file });\n break;\n }\n }\n typeof callback === 'function' && callback(_allFiles);\n }\n });\n } else if (typeof callback === 'function') {\n callback(_allFiles);\n }\n } else {\n let count = 0;\n // @ts-expect-error if no error, files are guranteed to be an Array https://github.com/ioBroker/adapter-core/issues/455\n for (const file of files) {\n if (file.file === '.' || file.file === '..') {\n continue;\n }\n _allFiles.push({ adapter: adapter, path: _path, file });\n if (file.isDir) {\n count++;\n this.listDirectory(adapter, `${path}/${file.file}`, allFiles, () => {\n if (!--count && callback) {\n typeof callback === 'function' && callback(_allFiles);\n }\n });\n }\n }\n if (!count && typeof callback === 'function') {\n callback(_allFiles);\n }\n }\n });\n }\n\n sortFiles(a: File, b: File): number {\n let a1 = a.path + a.file.file;\n if (a1[0] !== '/') {\n a1 = '/' + a1;\n }\n let b1 = b.path + b.file.file;\n if (b1[0] !== '/') {\n b1 = '/' + b1;\n }\n return a1.localeCompare(b1);\n }\n\n listAdaptersFiles(adapters: string[], filter?: null | string, callback?: () => void): void | Promise<void> {\n if (typeof filter === 'function') {\n callback = filter;\n filter = null;\n }\n if (filter) {\n filter = filter.replace(/\\*/g, '');\n if (filter[filter.length - 1] === '/') {\n filter = filter.substring(0, filter.length - 1);\n }\n }\n\n if (adapters && adapters.length) {\n const adapter = adapters.shift() as string;\n this.listDirectory(adapter, filter, files => {\n files.sort(this.sortFiles);\n this.showFileHeader(adapter);\n\n files\n .filter(f => !filter || `${f.path}/${f.file.file}`.startsWith(filter))\n .forEach(f => this.showFile(f.adapter, f.path, f.file));\n\n this.listAdaptersFiles(adapters, filter, callback);\n });\n } else {\n return tools.maybeCallback(callback);\n }\n }\n\n private _readOnlineState(\n lines: IdValueObject[],\n flags: FlagObject,\n cb: (res: any[]) => void,\n _result?: any[]\n ): void {\n const result = _result || [];\n if (!lines || !lines.length) {\n cb(result);\n } else {\n const task = lines.shift() as IdValueObject;\n const id = `${task.id}.alive`;\n this.states.getState(id, (err, state) => {\n if (state && state.val) {\n result.push(`+ ${task.value}`);\n } else if (!flags.alive) {\n result.push(` ${task.value}`);\n }\n setImmediate(() => this._readOnlineState(lines, flags, cb, result));\n });\n }\n }\n\n list(type: ListType, filter: string, flags: FlagObject): void {\n this.objects.getObject('system.config', (err, systemConf) => {\n const lang: ioBroker.Languages = systemConf?.common?.language || 'en';\n switch (type) {\n case 'objects':\n case 'o':\n this.objects.getObjectList({}, (err, objs) => {\n if (!objs) {\n this.processExit();\n return;\n }\n const reg = filter ? new RegExp(tools.pattern2RegEx(filter)) : null;\n for (const obj of objs.rows) {\n let name = obj.value?.common?.name;\n if (tools.isObject(name)) {\n name = name[lang] || name.en;\n }\n\n if (!reg || reg.test(obj.value._id) || (name && reg.test(name as string))) {\n if (obj.value.type) {\n const id = obj.value._id;\n const type = obj.value.type;\n\n console.log(`${id.padStart(39)}: ${type.padStart(39)} - ${name || ''}`);\n }\n }\n }\n this.processExit();\n });\n break;\n\n case 'states':\n case 's':\n this.states.getKeys(filter || '*', (err, keys) => {\n if (err) {\n console.error(err);\n return void this.processExit(EXIT_CODES.CANNOT_GET_STATES);\n }\n\n if (!keys) {\n return void this.processExit();\n }\n\n this.states.getStates(keys, (err, states) => {\n if (err || !states) {\n console.error(err);\n return void this.processExit(EXIT_CODES.CANNOT_GET_STATES);\n }\n for (let i = 0; i < states.length; i++) {\n const state = states[i];\n if (!state) {\n continue;\n }\n\n const id = keys[i];\n const from = state.from || '';\n const type = typeof state.val;\n\n console.log(\n `${id.padEnd(39)}: from [${from.padEnd(29)}] (${type.padEnd(9)}) ${\n state.ack ? ' ack' : 'not ack'\n } ${JSON.stringify(state.val)}`\n );\n }\n this.processExit();\n });\n });\n break;\n\n case 'adapters':\n case 'a':\n this.objects.getObjectList(\n { startkey: 'system.adapter.', endkey: 'system.adapter.\\u9999' },\n (err, objs) => {\n if (!objs) {\n this.processExit();\n return;\n }\n const reg = filter ? new RegExp(tools.pattern2RegEx('system.adapter.' + filter)) : null;\n for (const obj of objs.rows) {\n if (obj.value.type !== 'adapter') {\n continue;\n }\n if (\n !reg ||\n reg.test(obj.value._id) ||\n (obj.value.common && reg.test(obj.value.common.name))\n ) {\n const id = obj.value._id;\n let name = obj.value.common.name;\n if (tools.isObject(name)) {\n name = name[lang] || name.en;\n }\n\n const text = `${id.padEnd(39)}: ${name.padEnd(14)} - v${obj.value.common.version}`;\n\n console.log(text);\n }\n }\n this.processExit();\n }\n );\n break;\n\n case 'instances':\n case 'i':\n this.objects.getObjectList(\n { startkey: 'system.adapter.', endkey: 'system.adapter.\\u9999' },\n (err, objs) => {\n if (!objs) {\n this.processExit();\n return;\n }\n const reg = filter ? new RegExp(tools.pattern2RegEx(`system.adapter.${filter}`)) : null;\n objs.rows.sort((a, b) => {\n if (a.id > b.id) {\n return 1;\n } else if (a.id < b.id) {\n return -1;\n }\n return 0;\n });\n const lines = [];\n for (const row of objs.rows) {\n if (row.value.type !== 'instance') {\n continue;\n }\n\n let name = row.value.common?.name;\n\n if (tools.isObject(name)) {\n name = name[lang] || name.en;\n }\n\n if (!reg || reg.test(row.value._id) || (name && reg.test(name))) {\n if (flags.enabled && !row.value.common.enabled) {\n continue;\n }\n if (flags.disabled && row.value.common.enabled) {\n continue;\n }\n if (flags.port && row.value.native.port === undefined) {\n continue;\n }\n if (flags.ssl && row.value.native.secure === undefined) {\n continue;\n }\n if (flags.ip && row.value.native.bind === undefined) {\n continue;\n }\n\n let id: string = row.value._id;\n let host = row.value.common.host;\n\n if (id.length < 40) {\n id = id.padEnd(40);\n }\n if (name && name.length < 22) {\n name = name.padEnd(22);\n }\n\n if (host && host.length < 40) {\n host = host.padEnd(40);\n }\n\n let text = `${id}: ${name || ''}: ${host} - ${\n row.value.common.enabled ? ' enabled' : 'disabled'\n }`;\n\n if (this.config.system && this.config.system.compact && row.value.common.compact) {\n text +=\n ', compact ' +\n (row.value.common.compact && row.value.common.runAsCompactMode\n ? `enabled (group ${\n row.value.common.compactGroup !== undefined\n ? row.value.common.compactGroup\n : 1\n })`\n : 'disabled');\n }\n\n if (row.value.native && row.value.native.port) {\n text += `, port: ${row.value.native.port}`;\n }\n if (row.value.native && row.value.native.bind) {\n text += `, bind: ${row.value.native.bind}`;\n }\n if (row.value.native && row.value.native.secure) {\n text += ' (SSL)';\n }\n if (row.value.native && row.value.native.defaultUser) {\n text += `, run as: ${row.value.native.defaultUser}`;\n }\n lines.push({ id: row.value._id, value: text });\n }\n }\n this._readOnlineState(lines, flags, result => {\n console.log(result.join('\\n'));\n console.log('\\n+ instance is alive');\n this.processExit();\n });\n }\n );\n break;\n\n case 'users':\n case 'u':\n this.objects.getObjectList(\n { startkey: 'system.user.', endkey: 'system.user.\\u9999' },\n (err, objs) => {\n this.objects.getObjectList(\n { startkey: 'system.group.', endkey: 'system.group.\\u9999' },\n (err, groups) => {\n if (!objs) {\n this.processExit();\n return;\n }\n const reg = filter\n ? new RegExp(tools.pattern2RegEx('system.user.' + filter))\n : null;\n console.log(\n ' ID | Name | Active | Groups'\n );\n console.log(\n '---------------------------------------+-------------+----------+--------------'\n );\n for (const obj of objs.rows) {\n if (obj.value.type !== 'user') {\n continue;\n }\n\n if (\n !reg ||\n reg.test(obj.value._id) ||\n (obj.value.common && reg.test(obj.value.common.name))\n ) {\n const id = obj.value._id;\n let name = obj.value.common.name;\n if (tools.isObject(name)) {\n name = name[lang] || name.en;\n }\n\n const text = `${id.padEnd(39)}| ${name.padEnd(11)} | ${\n obj.value.common.enabled ? ' enabled' : 'disabled'\n } |`;\n if (groups) {\n const gs = [];\n // find all groups\n for (const group of groups.rows) {\n if (\n group.value.common.members &&\n group.value.common.members.indexOf(obj.value._id) !== -1\n ) {\n gs.push(group.value._id.substring(13));\n }\n }\n console.log(`${text} ${gs.join(', ')}`);\n }\n }\n }\n this.processExit();\n }\n );\n }\n );\n break;\n\n case 'groups':\n case 'g':\n this.objects.getObjectList(\n { startkey: 'system.group.', endkey: 'system.group.\\u9999' },\n (err, objs) => {\n if (!objs) {\n this.processExit();\n return;\n }\n const reg = filter ? new RegExp(tools.pattern2RegEx('system.group.' + filter)) : null;\n console.log('');\n console.log(\n ' system.group | object | state | file | user | others | users'\n );\n console.log(\n ' | l r w d | l r w d | l r w c d | w c d | |'\n );\n console.log(\n '--------------------+---------+---------+-----------+-------+------------------------+---------'\n );\n for (const obj of objs.rows) {\n if (obj.value.type !== 'group') {\n continue;\n }\n if (\n !reg ||\n reg.test(obj.value._id) ||\n (obj.value.common && reg.test(obj.value.common.name))\n ) {\n const id = obj.value._id.substring(13);\n if (id === 'administrator') {\n obj.value.common.acl = {\n file: {\n read: true,\n write: true,\n delete: true,\n create: true,\n list: true\n },\n object: {\n read: true,\n write: true,\n create: true,\n delete: true,\n list: true\n },\n state: {\n read: true,\n write: true,\n delete: true,\n create: true,\n list: true\n },\n users: {\n write: true,\n create: true,\n delete: true,\n list: true,\n read: true\n },\n other: {\n execute: true,\n http: true,\n sendto: true\n }\n };\n }\n\n let text = id.padEnd(19);\n text += ' | ';\n if (obj.value.common.acl?.object) {\n text += (obj.value.common.acl.object.list ? '+' : '-') + ' ';\n text += (obj.value.common.acl.object.read ? '+' : '-') + ' ';\n text += (obj.value.common.acl.object.write ? '+' : '-') + ' ';\n text += (obj.value.common.acl.object.delete ? '+' : '-') + ' ';\n text += '|';\n } else {\n text += ' |';\n }\n if (obj.value.common.acl?.state) {\n text += ' ';\n text += (obj.value.common.acl.state.list ? '+' : '-') + ' ';\n text += (obj.value.common.acl.state.read ? '+' : '-') + ' ';\n text += (obj.value.common.acl.state.write ? '+' : '-') + ' ';\n text += (obj.value.common.acl.state.delete ? '+' : '-') + ' ';\n text += '|';\n } else {\n text += ' |';\n }\n if (obj.value.common.acl?.file) {\n text += ' ';\n text += (obj.value.common.acl.file.list ? '+' : '-') + ' ';\n text += (obj.value.common.acl.file.read ? '+' : '-') + ' ';\n text += (obj.value.common.acl.file.write ? '+' : '-') + ' ';\n text += (obj.value.common.acl.file.create ? '+' : '-') + ' ';\n text += (obj.value.common.acl.file.delete ? '+' : '-') + ' ';\n text += '|';\n } else {\n text += ' |';\n }\n if (obj.value.common.acl?.users) {\n text += ' ';\n text += (obj.value.common.acl.users.write ? '+' : '-') + ' ';\n text += (obj.value.common.acl.users.create ? '+' : '-') + ' ';\n text += (obj.value.common.acl.users.delete ? '+' : '-') + ' ';\n text += '|';\n } else {\n text += ' |';\n }\n if (obj.value.common.acl?.other) {\n text += ' ';\n let others = '';\n for (const [r, otherPerm] of Object.entries(obj.value.common.acl.other)) {\n others += r + (otherPerm ? '+' : '-') + ' ';\n }\n\n text += `${others.padEnd(22)}|`;\n } else {\n text += new Array(25).join(' ') + '|';\n }\n\n if (obj.value.common.members) {\n for (let m = 0; m < obj.value.common.members.length; m++) {\n obj.value.common.members[m] = obj.value.common.members[m].substring(\n 12\n ) as ioBroker.ObjectIDs.User;\n }\n text += ` ${obj.value.common.members.join(', ')}`;\n }\n console.log(text);\n }\n }\n\n console.log(\n '--------------------+---------+---------+-----------+-------+------------------------+---------'\n );\n console.log('Legend: (l)ist, (r)ead, (w)rite, (c)reate, (d)elete');\n this.processExit();\n }\n );\n break;\n\n case 'h':\n case 'hosts':\n this.objects.getObjectList(\n { startkey: 'system.host.', endkey: 'system.host.\\u9999' },\n (err, objs) => {\n if (!objs) {\n this.processExit();\n return;\n }\n this.states.getKeys('system.host.*', (err, keys) => {\n if (!keys) {\n this.processExit();\n return;\n }\n this.states.getStates(keys, (err, states) => {\n if (!states) {\n this.processExit();\n return;\n }\n\n const reg = filter\n ? new RegExp(tools.pattern2RegEx('system.host.' + filter))\n : null;\n\n for (const obj of objs.rows) {\n if (obj.value.type !== 'host') {\n continue;\n }\n if (\n !reg ||\n reg.test(obj.value._id) ||\n (obj.value.common && reg.test(obj.value.common.name))\n ) {\n const id = obj.value._id.substring(12);\n let name = obj.value.common.name;\n if (tools.isObject(name)) {\n name = name[lang] || name.en;\n }\n\n const hostname = obj.value.common.hostname;\n\n const version = obj.value.common.installedVersion;\n let alive = '';\n let uptime = '';\n for (let k = 0; k < keys.length; k++) {\n if (keys[k] === `${obj.value._id}.alive`) {\n alive = 'alive';\n }\n if (keys[k] === `${obj.value._id}.uptime`) {\n uptime = states[k]!.val?.toString() || '-';\n }\n }\n alive = alive || 'dead';\n\n if (!uptime) {\n uptime = '-';\n }\n const text = `${id.padEnd(\n 19\n )} ${name} (version: ${version}, hostname: ${hostname.padEnd(\n 14\n )}, ${alive}, uptime: ${uptime})`;\n // todo\n console.log(text);\n }\n }\n\n this.processExit();\n });\n });\n }\n );\n break;\n\n case 'enums':\n case 'e':\n this.objects.getObjectList({ startkey: 'enum.', endkey: 'enum.\\u9999' }, (err, objs) => {\n if (!objs) {\n this.processExit();\n return;\n }\n const reg = filter ? new RegExp(tools.pattern2RegEx(`enum.${filter}`)) : null;\n for (const obj of objs.rows) {\n if (obj.value.type !== 'enum') {\n continue;\n }\n\n let name = obj.value.common?.name;\n if (tools.isObject(name)) {\n name = name[lang] || name.en;\n }\n\n if (!reg || reg.test(obj.value._id) || (name && reg.test(name))) {\n console.log(\n '\\n====================================================================================='\n );\n const id = obj.value._id.substring(5);\n\n console.log(`${id.padEnd(19)}(${name})`);\n console.log(\n '-------------------------------------------------------------------------------------'\n );\n\n if (obj.value.common.members) {\n console.log(obj.value.common.members.join(', '));\n }\n }\n }\n this.processExit();\n });\n break;\n\n case 'files':\n case 'f':\n this.objects.getObjectList({ startkey: '', endkey: '\\u9999' }, (err, objs) => {\n if (!objs) {\n this.processExit();\n return;\n }\n\n const adapter = filter || null;\n const names = filter ? filter.split('/') : null;\n if (names && !names[0]) {\n names.splice(0, 1);\n }\n\n const adapters = objs.rows\n .filter(\n row =>\n row.value.type === 'meta' &&\n !(\n names &&\n adapter &&\n row.value._id !== names[0] &&\n !row.value._id.startsWith(`${names[0]}.`)\n )\n )\n .map(row => row.value._id);\n\n if (names) {\n names.shift();\n }\n\n this.listAdaptersFiles(adapters, names ? names.join('/') : null, () => this.processExit());\n });\n break;\n }\n });\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * List different objects for CLI\n *\n * Copyright 2013-2022 bluefox <dogafox@gmail.com>\n *\n * MIT License\n *\n */\n\nimport { EXIT_CODES } from '@iobroker/js-controller-common';\nimport fs from 'fs-extra';\nimport { tools } from '@iobroker/js-controller-common';\nimport type { Client as StatesRedisClient } from '@iobroker/db-states-redis';\nimport type { Client as ObjectsRedisClient } from '@iobroker/db-objects-redis';\n\ninterface File {\n adapter: string;\n path: string;\n file: ioBroker.ReadDirResult;\n}\n\ninterface IdValueObject {\n id: string;\n value: any;\n}\n\ninterface FlagObject {\n alive?: boolean;\n enabled?: boolean;\n disabled?: boolean;\n port?: number;\n ssl?: boolean;\n ip?: string;\n}\n\ninterface CLIListOptions {\n states: StatesRedisClient;\n objects: ObjectsRedisClient;\n processExit: (exitCode?: number) => void;\n}\n\nexport type ListType =\n | 'objects'\n | 'o'\n | 'states'\n | 's'\n | 'adapters'\n | 'a'\n | 'instances'\n | 'i'\n | 'users'\n | 'u'\n | 'groups'\n | 'g'\n | 'hosts'\n | 'h'\n | 'enums'\n | 'e'\n | 'files'\n | 'f';\n\ninterface AdapterListEntry {\n /** The object id */\n id: string;\n /** Adapter name */\n name: string;\n /** Version of adapter */\n version: string;\n /** The configured upgrade policy */\n 'upgrade policy': ioBroker.AutoUpgradePolicy;\n}\n\nexport class List {\n private config: Record<string, any>;\n private objects: ObjectsRedisClient;\n private states: StatesRedisClient;\n private readonly processExit: (exitCode?: number) => void;\n\n constructor(options: CLIListOptions) {\n options = options || {};\n\n if (!options.states) {\n throw new Error('Invalid Modified arguments: states is missing');\n }\n if (!options.objects) {\n throw new Error('Invalid arguments: objects is missing');\n }\n if (!options.processExit) {\n throw new Error('Invalid arguments: processExit is missing');\n }\n\n this.config = fs.readJSONSync(tools.getConfigFileName());\n\n this.objects = options.objects;\n this.states = options.states;\n this.processExit = options.processExit;\n }\n\n private static _perm2str(perm: number): string {\n let result = '';\n // user\n result += perm & 0x400 ? 'r' : '-';\n result += perm & 0x200 ? 'w' : '-';\n result += perm & 0x100 ? 'x' : '-';\n // group\n result += perm & 0x040 ? 'r' : '-';\n result += perm & 0x020 ? 'w' : '-';\n result += perm & 0x010 ? 'x' : '-';\n // any\n result += perm & 0x004 ? 'r' : '-';\n result += perm & 0x002 ? 'w' : '-';\n result += perm & 0x001 ? 'x' : '-';\n return result;\n }\n\n showFileHeader(adapter?: string): void {\n if (adapter) {\n console.log(`\\n-- ${adapter} --`);\n }\n\n console.log(' Modified at |Permission| User | Group | Size | Name');\n console.log('----------------+----------+--------------+--------------+------+---------');\n }\n\n showFile(adapter: string, path: string, file: ioBroker.ReadDirResult): void {\n //drwxr-xr-x 1 odroid odroid 43 Oct 3 2013 .xsessionrc\n let text = '';\n let time = '';\n if (file.modifiedAt) {\n const ts = new Date(file.modifiedAt);\n time = ts.toISOString();\n time = time.replace('T', ' ');\n time = time.substring(0, 16) + ' ';\n }\n text += time.padEnd(17);\n\n if (file.acl) {\n text += (file.isDir ? 'd' : '-') + List._perm2str(file.acl.permissions || 0);\n let owner = file.acl.owner;\n // cut system.user.\n owner = owner.substring(12);\n\n text += ` ${owner.padStart(14)}`;\n let group = file.acl.ownerGroup;\n // cut system.group.\n group = group.substring(13);\n text += ` ${group.padStart(14)}`;\n } else {\n text += (file.isDir ? 'd' : '-') + '?????????' + new Array(31).join(' ');\n }\n const size = file.stats && file.stats.size ? file.stats.size.toString() : '';\n\n text += ` ${size.padStart(6)} ${adapter}${!path || path[0] === '/' ? '' : '/'}${path}/${file.file}`;\n if (file.isDir) {\n text += '/';\n console.log(text);\n } else {\n console.log(text);\n }\n }\n\n showObjectHeader(): void {\n console.log('ObjectAC | StateAC | User | Group | ID');\n console.log('---------+---------+--------------+--------------+--------------');\n }\n\n showObject(obj: ioBroker.AnyObject): void {\n //drwxr-xr-x 1 odroid odroid 43 Oct 3 2013 .xsessionrc\n let text = '';\n if (obj.acl) {\n text += `${List._perm2str(obj.acl.object || 0)} ${\n obj.type === 'state' ? List._perm2str(obj.acl.state || 0) : ' '\n }`;\n let owner = obj.acl.owner;\n // cut system.user.\n owner = owner.substring(12);\n\n text += ` ${owner.padStart(14)}`;\n let group = obj.acl.ownerGroup;\n // cut system.group.\n group = group.substring(13);\n text += ` ${group.padStart(14)}`;\n } else {\n text += `?????????${obj.type === 'state' ? ' ?????????' : ' '}${new Array(31).join(' ')}`;\n }\n text += ` ${obj._id}`;\n console.log(text);\n }\n\n listDirectory(\n adapter: string,\n path: string | null | undefined,\n allFiles?: File[] | ((allFiles: File[]) => void),\n callback?: (allFiles: File[]) => void\n ): void {\n if (typeof path === 'function') {\n callback = path;\n path = '';\n allFiles = [];\n }\n if (typeof allFiles === 'function') {\n callback = allFiles;\n allFiles = [];\n }\n const _allFiles = allFiles || [];\n const _path = path || '';\n\n this.objects.readDir(adapter, _path, null, (err, files) => {\n if (err && err.code === 'ENOTDIR') {\n const pos = _path.lastIndexOf('/');\n if (pos !== -1) {\n const dir = _path.substring(0, pos);\n const fname = _path.substring(pos + 1);\n this.objects.readDir(adapter, dir, null, (err, files) => {\n if (err) {\n console.log(`Cannot read \"${path}\": ${err.message}`);\n typeof callback === 'function' && callback(_allFiles);\n } else {\n // @ts-expect-error if no error, files are guranteed to be an Array https://github.com/ioBroker/adapter-core/issues/455\n for (const file of files) {\n if (file.file === '.' || file.file === '..') {\n continue;\n }\n if (file.file === fname) {\n _allFiles.push({ adapter, path: _path, file });\n break;\n }\n }\n typeof callback === 'function' && callback(_allFiles);\n }\n });\n } else if (typeof callback === 'function') {\n callback(_allFiles);\n }\n } else {\n let count = 0;\n // @ts-expect-error if no error, files are guranteed to be an Array https://github.com/ioBroker/adapter-core/issues/455\n for (const file of files) {\n if (file.file === '.' || file.file === '..') {\n continue;\n }\n _allFiles.push({ adapter: adapter, path: _path, file });\n if (file.isDir) {\n count++;\n this.listDirectory(adapter, `${path}/${file.file}`, allFiles, () => {\n if (!--count && callback) {\n typeof callback === 'function' && callback(_allFiles);\n }\n });\n }\n }\n if (!count && typeof callback === 'function') {\n callback(_allFiles);\n }\n }\n });\n }\n\n sortFiles(a: File, b: File): number {\n let a1 = a.path + a.file.file;\n if (a1[0] !== '/') {\n a1 = '/' + a1;\n }\n let b1 = b.path + b.file.file;\n if (b1[0] !== '/') {\n b1 = '/' + b1;\n }\n return a1.localeCompare(b1);\n }\n\n listAdaptersFiles(adapters: string[], filter?: null | string, callback?: () => void): void | Promise<void> {\n if (typeof filter === 'function') {\n callback = filter;\n filter = null;\n }\n if (filter) {\n filter = filter.replace(/\\*/g, '');\n if (filter[filter.length - 1] === '/') {\n filter = filter.substring(0, filter.length - 1);\n }\n }\n\n if (adapters && adapters.length) {\n const adapter = adapters.shift() as string;\n this.listDirectory(adapter, filter, files => {\n files.sort(this.sortFiles);\n this.showFileHeader(adapter);\n\n files\n .filter(f => !filter || `${f.path}/${f.file.file}`.startsWith(filter))\n .forEach(f => this.showFile(f.adapter, f.path, f.file));\n\n this.listAdaptersFiles(adapters, filter, callback);\n });\n } else {\n return tools.maybeCallback(callback);\n }\n }\n\n private _readOnlineState(\n lines: IdValueObject[],\n flags: FlagObject,\n cb: (res: any[]) => void,\n _result?: any[]\n ): void {\n const result = _result || [];\n if (!lines || !lines.length) {\n cb(result);\n } else {\n const task = lines.shift() as IdValueObject;\n const id = `${task.id}.alive`;\n this.states.getState(id, (err, state) => {\n if (state && state.val) {\n result.push(`+ ${task.value}`);\n } else if (!flags.alive) {\n result.push(` ${task.value}`);\n }\n setImmediate(() => this._readOnlineState(lines, flags, cb, result));\n });\n }\n }\n\n list(type: ListType, filter: string, flags: FlagObject): void {\n this.objects.getObject('system.config', (err, systemConf) => {\n const lang: ioBroker.Languages = systemConf?.common?.language || 'en';\n switch (type) {\n case 'objects':\n case 'o':\n this.objects.getObjectList({}, (err, objs) => {\n if (!objs) {\n this.processExit();\n return;\n }\n const reg = filter ? new RegExp(tools.pattern2RegEx(filter)) : null;\n for (const obj of objs.rows) {\n let name = obj.value?.common?.name;\n if (tools.isObject(name)) {\n name = name[lang] || name.en;\n }\n\n if (!reg || reg.test(obj.value._id) || (name && reg.test(name as string))) {\n if (obj.value.type) {\n const id = obj.value._id;\n const type = obj.value.type;\n\n console.log(`${id.padStart(39)}: ${type.padStart(39)} - ${name || ''}`);\n }\n }\n }\n this.processExit();\n });\n break;\n\n case 'states':\n case 's':\n this.states.getKeys(filter || '*', (err, keys) => {\n if (err) {\n console.error(err);\n return void this.processExit(EXIT_CODES.CANNOT_GET_STATES);\n }\n\n if (!keys) {\n return void this.processExit();\n }\n\n this.states.getStates(keys, (err, states) => {\n if (err || !states) {\n console.error(err);\n return void this.processExit(EXIT_CODES.CANNOT_GET_STATES);\n }\n for (let i = 0; i < states.length; i++) {\n const state = states[i];\n if (!state) {\n continue;\n }\n\n const id = keys[i];\n const from = state.from || '';\n const type = typeof state.val;\n\n console.log(\n `${id.padEnd(39)}: from [${from.padEnd(29)}] (${type.padEnd(9)}) ${\n state.ack ? ' ack' : 'not ack'\n } ${JSON.stringify(state.val)}`\n );\n }\n this.processExit();\n });\n });\n break;\n\n case 'adapters':\n case 'a':\n this.objects.getObjectList(\n { startkey: 'system.adapter.', endkey: 'system.adapter.\\u9999' },\n (err, objs) => {\n if (!objs) {\n this.processExit();\n return;\n }\n const reg = filter ? new RegExp(tools.pattern2RegEx('system.adapter.' + filter)) : null;\n const adapterList: AdapterListEntry[] = [];\n for (const obj of objs.rows) {\n if (obj.value.type !== 'adapter') {\n continue;\n }\n\n if (\n !reg ||\n reg.test(obj.value._id) ||\n (obj.value.common && reg.test(obj.value.common.name))\n ) {\n const id = obj.value._id;\n let name = obj.value.common.name;\n if (tools.isObject(name)) {\n name = name[lang] || name.en;\n }\n\n adapterList.push({\n id,\n name,\n version: obj.value.common.version,\n 'upgrade policy': obj.value.common.automaticUpgrade ?? 'none'\n });\n }\n }\n\n console.table(adapterList);\n this.processExit();\n }\n );\n break;\n\n case 'instances':\n case 'i':\n this.objects.getObjectList(\n { startkey: 'system.adapter.', endkey: 'system.adapter.\\u9999' },\n (err, objs) => {\n if (!objs) {\n this.processExit();\n return;\n }\n const reg = filter ? new RegExp(tools.pattern2RegEx(`system.adapter.${filter}`)) : null;\n objs.rows.sort((a, b) => {\n if (a.id > b.id) {\n return 1;\n } else if (a.id < b.id) {\n return -1;\n }\n return 0;\n });\n const lines = [];\n for (const row of objs.rows) {\n if (row.value.type !== 'instance') {\n continue;\n }\n\n let name = row.value.common?.name;\n\n if (tools.isObject(name)) {\n name = name[lang] || name.en;\n }\n\n if (!reg || reg.test(row.value._id) || (name && reg.test(name))) {\n if (flags.enabled && !row.value.common.enabled) {\n continue;\n }\n if (flags.disabled && row.value.common.enabled) {\n continue;\n }\n if (flags.port && row.value.native.port === undefined) {\n continue;\n }\n if (flags.ssl && row.value.native.secure === undefined) {\n continue;\n }\n if (flags.ip && row.value.native.bind === undefined) {\n continue;\n }\n\n let id: string = row.value._id;\n let host = row.value.common.host;\n\n if (id.length < 40) {\n id = id.padEnd(40);\n }\n if (name && name.length < 22) {\n name = name.padEnd(22);\n }\n\n if (host && host.length < 40) {\n host = host.padEnd(40);\n }\n\n let text = `${id}: ${name || ''}: ${host} - ${\n row.value.common.enabled ? ' enabled' : 'disabled'\n }`;\n\n if (this.config.system && this.config.system.compact && row.value.common.compact) {\n text +=\n ', compact ' +\n (row.value.common.compact && row.value.common.runAsCompactMode\n ? `enabled (group ${\n row.value.common.compactGroup !== undefined\n ? row.value.common.compactGroup\n : 1\n })`\n : 'disabled');\n }\n\n if (row.value.native && row.value.native.port) {\n text += `, port: ${row.value.native.port}`;\n }\n if (row.value.native && row.value.native.bind) {\n text += `, bind: ${row.value.native.bind}`;\n }\n if (row.value.native && row.value.native.secure) {\n text += ' (SSL)';\n }\n if (row.value.native && row.value.native.defaultUser) {\n text += `, run as: ${row.value.native.defaultUser}`;\n }\n lines.push({ id: row.value._id, value: text });\n }\n }\n this._readOnlineState(lines, flags, result => {\n console.log(result.join('\\n'));\n console.log('\\n+ instance is alive');\n this.processExit();\n });\n }\n );\n break;\n\n case 'users':\n case 'u':\n this.objects.getObjectList(\n { startkey: 'system.user.', endkey: 'system.user.\\u9999' },\n (err, objs) => {\n this.objects.getObjectList(\n { startkey: 'system.group.', endkey: 'system.group.\\u9999' },\n (err, groups) => {\n if (!objs) {\n this.processExit();\n return;\n }\n const reg = filter\n ? new RegExp(tools.pattern2RegEx('system.user.' + filter))\n : null;\n console.log(\n ' ID | Name | Active | Groups'\n );\n console.log(\n '---------------------------------------+-------------+----------+--------------'\n );\n for (const obj of objs.rows) {\n if (obj.value.type !== 'user') {\n continue;\n }\n\n if (\n !reg ||\n reg.test(obj.value._id) ||\n (obj.value.common && reg.test(obj.value.common.name))\n ) {\n const id = obj.value._id;\n let name = obj.value.common.name;\n if (tools.isObject(name)) {\n name = name[lang] || name.en;\n }\n\n const text = `${id.padEnd(39)}| ${name.padEnd(11)} | ${\n obj.value.common.enabled ? ' enabled' : 'disabled'\n } |`;\n if (groups) {\n const gs = [];\n // find all groups\n for (const group of groups.rows) {\n if (\n group.value.common.members &&\n group.value.common.members.indexOf(obj.value._id) !== -1\n ) {\n gs.push(group.value._id.substring(13));\n }\n }\n console.log(`${text} ${gs.join(', ')}`);\n }\n }\n }\n this.processExit();\n }\n );\n }\n );\n break;\n\n case 'groups':\n case 'g':\n this.objects.getObjectList(\n { startkey: 'system.group.', endkey: 'system.group.\\u9999' },\n (err, objs) => {\n if (!objs) {\n this.processExit();\n return;\n }\n const reg = filter ? new RegExp(tools.pattern2RegEx('system.group.' + filter)) : null;\n console.log('');\n console.log(\n ' system.group | object | state | file | user | others | users'\n );\n console.log(\n ' | l r w d | l r w d | l r w c d | w c d | |'\n );\n console.log(\n '--------------------+---------+---------+-----------+-------+------------------------+---------'\n );\n for (const obj of objs.rows) {\n if (obj.value.type !== 'group') {\n continue;\n }\n if (\n !reg ||\n reg.test(obj.value._id) ||\n (obj.value.common && reg.test(obj.value.common.name))\n ) {\n const id = obj.value._id.substring(13);\n if (id === 'administrator') {\n obj.value.common.acl = {\n file: {\n read: true,\n write: true,\n delete: true,\n create: true,\n list: true\n },\n object: {\n read: true,\n write: true,\n create: true,\n delete: true,\n list: true\n },\n state: {\n read: true,\n write: true,\n delete: true,\n create: true,\n list: true\n },\n users: {\n write: true,\n create: true,\n delete: true,\n list: true,\n read: true\n },\n other: {\n execute: true,\n http: true,\n sendto: true\n }\n };\n }\n\n let text = id.padEnd(19);\n text += ' | ';\n if (obj.value.common.acl?.object) {\n text += (obj.value.common.acl.object.list ? '+' : '-') + ' ';\n text += (obj.value.common.acl.object.read ? '+' : '-') + ' ';\n text += (obj.value.common.acl.object.write ? '+' : '-') + ' ';\n text += (obj.value.common.acl.object.delete ? '+' : '-') + ' ';\n text += '|';\n } else {\n text += ' |';\n }\n if (obj.value.common.acl?.state) {\n text += ' ';\n text += (obj.value.common.acl.state.list ? '+' : '-') + ' ';\n text += (obj.value.common.acl.state.read ? '+' : '-') + ' ';\n text += (obj.value.common.acl.state.write ? '+' : '-') + ' ';\n text += (obj.value.common.acl.state.delete ? '+' : '-') + ' ';\n text += '|';\n } else {\n text += ' |';\n }\n if (obj.value.common.acl?.file) {\n text += ' ';\n text += (obj.value.common.acl.file.list ? '+' : '-') + ' ';\n text += (obj.value.common.acl.file.read ? '+' : '-') + ' ';\n text += (obj.value.common.acl.file.write ? '+' : '-') + ' ';\n text += (obj.value.common.acl.file.create ? '+' : '-') + ' ';\n text += (obj.value.common.acl.file.delete ? '+' : '-') + ' ';\n text += '|';\n } else {\n text += ' |';\n }\n if (obj.value.common.acl?.users) {\n text += ' ';\n text += (obj.value.common.acl.users.write ? '+' : '-') + ' ';\n text += (obj.value.common.acl.users.create ? '+' : '-') + ' ';\n text += (obj.value.common.acl.users.delete ? '+' : '-') + ' ';\n text += '|';\n } else {\n text += ' |';\n }\n if (obj.value.common.acl?.other) {\n text += ' ';\n let others = '';\n for (const [r, otherPerm] of Object.entries(obj.value.common.acl.other)) {\n others += r + (otherPerm ? '+' : '-') + ' ';\n }\n\n text += `${others.padEnd(22)}|`;\n } else {\n text += new Array(25).join(' ') + '|';\n }\n\n if (obj.value.common.members) {\n for (let m = 0; m < obj.value.common.members.length; m++) {\n obj.value.common.members[m] = obj.value.common.members[m].substring(\n 12\n ) as ioBroker.ObjectIDs.User;\n }\n text += ` ${obj.value.common.members.join(', ')}`;\n }\n console.log(text);\n }\n }\n\n console.log(\n '--------------------+---------+---------+-----------+-------+------------------------+---------'\n );\n console.log('Legend: (l)ist, (r)ead, (w)rite, (c)reate, (d)elete');\n this.processExit();\n }\n );\n break;\n\n case 'h':\n case 'hosts':\n this.objects.getObjectList(\n { startkey: 'system.host.', endkey: 'system.host.\\u9999' },\n (err, objs) => {\n if (!objs) {\n this.processExit();\n return;\n }\n this.states.getKeys('system.host.*', (err, keys) => {\n if (!keys) {\n this.processExit();\n return;\n }\n this.states.getStates(keys, (err, states) => {\n if (!states) {\n this.processExit();\n return;\n }\n\n const reg = filter\n ? new RegExp(tools.pattern2RegEx('system.host.' + filter))\n : null;\n\n for (const obj of objs.rows) {\n if (obj.value.type !== 'host') {\n continue;\n }\n if (\n !reg ||\n reg.test(obj.value._id) ||\n (obj.value.common && reg.test(obj.value.common.name))\n ) {\n const id = obj.value._id.substring(12);\n let name = obj.value.common.name;\n if (tools.isObject(name)) {\n name = name[lang] || name.en;\n }\n\n const hostname = obj.value.common.hostname;\n\n const version = obj.value.common.installedVersion;\n let alive = '';\n let uptime = '';\n for (let k = 0; k < keys.length; k++) {\n if (keys[k] === `${obj.value._id}.alive`) {\n alive = 'alive';\n }\n if (keys[k] === `${obj.value._id}.uptime`) {\n uptime = states[k]!.val?.toString() || '-';\n }\n }\n alive = alive || 'dead';\n\n if (!uptime) {\n uptime = '-';\n }\n const text = `${id.padEnd(\n 19\n )} ${name} (version: ${version}, hostname: ${hostname.padEnd(\n 14\n )}, ${alive}, uptime: ${uptime})`;\n // todo\n console.log(text);\n }\n }\n\n this.processExit();\n });\n });\n }\n );\n break;\n\n case 'enums':\n case 'e':\n this.objects.getObjectList({ startkey: 'enum.', endkey: 'enum.\\u9999' }, (err, objs) => {\n if (!objs) {\n this.processExit();\n return;\n }\n const reg = filter ? new RegExp(tools.pattern2RegEx(`enum.${filter}`)) : null;\n for (const obj of objs.rows) {\n if (obj.value.type !== 'enum') {\n continue;\n }\n\n let name = obj.value.common?.name;\n if (tools.isObject(name)) {\n name = name[lang] || name.en;\n }\n\n if (!reg || reg.test(obj.value._id) || (name && reg.test(name))) {\n console.log(\n '\\n====================================================================================='\n );\n const id = obj.value._id.substring(5);\n\n console.log(`${id.padEnd(19)}(${name})`);\n console.log(\n '-------------------------------------------------------------------------------------'\n );\n\n if (obj.value.common.members) {\n console.log(obj.value.common.members.join(', '));\n }\n }\n }\n this.processExit();\n });\n break;\n\n case 'files':\n case 'f':\n this.objects.getObjectList({ startkey: '', endkey: '\\u9999' }, (err, objs) => {\n if (!objs) {\n this.processExit();\n return;\n }\n\n const adapter = filter || null;\n const names = filter ? filter.split('/') : null;\n if (names && !names[0]) {\n names.splice(0, 1);\n }\n\n const adapters = objs.rows\n .filter(\n row =>\n row.value.type === 'meta' &&\n !(\n names &&\n adapter &&\n row.value._id !== names[0] &&\n !row.value._id.startsWith(`${names[0]}.`)\n )\n )\n .map(row => row.value._id);\n\n if (names) {\n names.shift();\n }\n\n this.listAdaptersFiles(adapters, names ? names.join('/') : null, () => this.processExit());\n });\n break;\n }\n });\n }\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;AASA,kCAA2B;AAC3B,sBAAe;AACf,IAAAA,+BAAsB;AA6DhB,MAAO,KAAI;EACL;EACA;EACA;EACS;EAEjB,YAAY,SAAuB;AAC/B,cAAU,WAAW,CAAA;AAErB,QAAI,CAAC,QAAQ,QAAQ;AACjB,YAAM,IAAI,MAAM,+CAA+C;IACnE;AACA,QAAI,CAAC,QAAQ,SAAS;AAClB,YAAM,IAAI,MAAM,uCAAuC;IAC3D;AACA,QAAI,CAAC,QAAQ,aAAa;AACtB,YAAM,IAAI,MAAM,2CAA2C;IAC/D;AAEA,SAAK,SAAS,gBAAAC,QAAG,aAAa,mCAAM,kBAAiB,CAAE;AAEvD,SAAK,UAAU,QAAQ;AACvB,SAAK,SAAS,QAAQ;AACtB,SAAK,cAAc,QAAQ;EAC/B;EAEQ,OAAO,UAAU,MAAY;AACjC,QAAI,SAAS;AAEb,cAAU,OAAO,OAAQ,MAAM;AAC/B,cAAU,OAAO,MAAQ,MAAM;AAC/B,cAAU,OAAO,MAAQ,MAAM;AAE/B,cAAU,OAAO,KAAQ,MAAM;AAC/B,cAAU,OAAO,KAAQ,MAAM;AAC/B,cAAU,OAAO,KAAQ,MAAM;AAE/B,cAAU,OAAO,IAAQ,MAAM;AAC/B,cAAU,OAAO,IAAQ,MAAM;AAC/B,cAAU,OAAO,IAAQ,MAAM;AAC/B,WAAO;EACX;EAEA,eAAe,SAAgB;AAC3B,QAAI,SAAS;AACT,cAAQ,IAAI;KAAQ,YAAY;IACpC;AAEA,YAAQ,IAAI,wEAAwE;AACpF,YAAQ,IAAI,4EAA4E;EAC5F;EAEA,SAAS,SAAiB,MAAc,MAA4B;AAEhE,QAAI,OAAO;AACX,QAAI,OAAO;AACX,QAAI,KAAK,YAAY;AACjB,YAAM,KAAK,IAAI,KAAK,KAAK,UAAU;AACnC,aAAO,GAAG,YAAW;AACrB,aAAO,KAAK,QAAQ,KAAK,GAAG;AAC5B,aAAO,KAAK,UAAU,GAAG,EAAE,IAAI;IACnC;AACA,YAAQ,KAAK,OAAO,EAAE;AAEtB,QAAI,KAAK,KAAK;AACV,eAAS,KAAK,QAAQ,MAAM,OAAO,KAAK,UAAU,KAAK,IAAI,eAAe,CAAC;AAC3E,UAAI,QAAQ,KAAK,IAAI;AAErB,cAAQ,MAAM,UAAU,EAAE;AAE1B,cAAQ,IAAI,MAAM,SAAS,EAAE;AAC7B,UAAI,QAAQ,KAAK,IAAI;AAErB,cAAQ,MAAM,UAAU,EAAE;AAC1B,cAAQ,IAAI,MAAM,SAAS,EAAE;IACjC,OAAO;AACH,eAAS,KAAK,QAAQ,MAAM,OAAO,cAAc,IAAI,MAAM,EAAE,EAAE,KAAK,GAAG;IAC3E;AACA,UAAM,OAAO,KAAK,SAAS,KAAK,MAAM,OAAO,KAAK,MAAM,KAAK,SAAQ,IAAK;AAE1E,YAAQ,IAAI,KAAK,SAAS,CAAC,KAAK,UAAU,CAAC,QAAQ,KAAK,OAAO,MAAM,KAAK,MAAM,QAAQ,KAAK;AAC7F,QAAI,KAAK,OAAO;AACZ,cAAQ;AACR,cAAQ,IAAI,IAAI;IACpB,OAAO;AACH,cAAQ,IAAI,IAAI;IACpB;EACJ;EAEA,mBAAgB;AACZ,YAAQ,IAAI,uDAAuD;AACnE,YAAQ,IAAI,kEAAkE;EAClF;EAEA,WAAW,KAAuB;AAE9B,QAAI,OAAO;AACX,QAAI,IAAI,KAAK;AACT,cAAQ,GAAG,KAAK,UAAU,IAAI,IAAI,UAAU,CAAC,KACzC,IAAI,SAAS,UAAU,KAAK,UAAU,IAAI,IAAI,SAAS,CAAC,IAAI;AAEhE,UAAI,QAAQ,IAAI,IAAI;AAEpB,cAAQ,MAAM,UAAU,EAAE;AAE1B,cAAQ,IAAI,MAAM,SAAS,EAAE;AAC7B,UAAI,QAAQ,IAAI,IAAI;AAEpB,cAAQ,MAAM,UAAU,EAAE;AAC1B,cAAQ,IAAI,MAAM,SAAS,EAAE;IACjC,OAAO;AACH,cAAQ,YAAY,IAAI,SAAS,UAAU,eAAe,eAAe,IAAI,MAAM,EAAE,EAAE,KAAK,GAAG;IACnG;AACA,YAAQ,IAAI,IAAI;AAChB,YAAQ,IAAI,IAAI;EACpB;EAEA,cACI,SACA,MACA,UACA,UAAqC;AAErC,QAAI,OAAO,SAAS,YAAY;AAC5B,iBAAW;AACX,aAAO;AACP,iBAAW,CAAA;IACf;AACA,QAAI,OAAO,aAAa,YAAY;AAChC,iBAAW;AACX,iBAAW,CAAA;IACf;AACA,UAAM,YAAY,YAAY,CAAA;AAC9B,UAAM,QAAQ,QAAQ;AAEtB,SAAK,QAAQ,QAAQ,SAAS,OAAO,MAAM,CAAC,KAAK,UAAS;AACtD,UAAI,OAAO,IAAI,SAAS,WAAW;AAC/B,cAAM,MAAM,MAAM,YAAY,GAAG;AACjC,YAAI,QAAQ,IAAI;AACZ,gBAAM,MAAM,MAAM,UAAU,GAAG,GAAG;AAClC,gBAAM,QAAQ,MAAM,UAAU,MAAM,CAAC;AACrC,eAAK,QAAQ,QAAQ,SAAS,KAAK,MAAM,CAACC,MAAKC,WAAS;AACpD,gBAAID,MAAK;AACL,sBAAQ,IAAI,gBAAgB,UAAUA,KAAI,SAAS;AACnD,qBAAO,aAAa,cAAc,SAAS,SAAS;YACxD,OAAO;AAEH,yBAAW,QAAQC,QAAO;AACtB,oBAAI,KAAK,SAAS,OAAO,KAAK,SAAS,MAAM;AACzC;gBACJ;AACA,oBAAI,KAAK,SAAS,OAAO;AACrB,4BAAU,KAAK,EAAE,SAAS,MAAM,OAAO,KAAI,CAAE;AAC7C;gBACJ;cACJ;AACA,qBAAO,aAAa,cAAc,SAAS,SAAS;YACxD;UACJ,CAAC;QACL,WAAW,OAAO,aAAa,YAAY;AACvC,mBAAS,SAAS;QACtB;MACJ,OAAO;AACH,YAAI,QAAQ;AAEZ,mBAAW,QAAQ,OAAO;AACtB,cAAI,KAAK,SAAS,OAAO,KAAK,SAAS,MAAM;AACzC;UACJ;AACA,oBAAU,KAAK,EAAE,SAAkB,MAAM,OAAO,KAAI,CAAE;AACtD,cAAI,KAAK,OAAO;AACZ;AACA,iBAAK,cAAc,SAAS,GAAG,QAAQ,KAAK,QAAQ,UAAU,MAAK;AAC/D,kBAAI,CAAC,EAAE,SAAS,UAAU;AACtB,uBAAO,aAAa,cAAc,SAAS,SAAS;cACxD;YACJ,CAAC;UACL;QACJ;AACA,YAAI,CAAC,SAAS,OAAO,aAAa,YAAY;AAC1C,mBAAS,SAAS;QACtB;MACJ;IACJ,CAAC;EACL;EAEA,UAAU,GAAS,GAAO;AACtB,QAAI,KAAK,EAAE,OAAO,EAAE,KAAK;AACzB,QAAI,GAAG,OAAO,KAAK;AACf,WAAK,MAAM;IACf;AACA,QAAI,KAAK,EAAE,OAAO,EAAE,KAAK;AACzB,QAAI,GAAG,OAAO,KAAK;AACf,WAAK,MAAM;IACf;AACA,WAAO,GAAG,cAAc,EAAE;EAC9B;EAEA,kBAAkB,UAAoB,QAAwB,UAAqB;AAC/E,QAAI,OAAO,WAAW,YAAY;AAC9B,iBAAW;AACX,eAAS;IACb;AACA,QAAI,QAAQ;AACR,eAAS,OAAO,QAAQ,OAAO,EAAE;AACjC,UAAI,OAAO,OAAO,SAAS,OAAO,KAAK;AACnC,iBAAS,OAAO,UAAU,GAAG,OAAO,SAAS,CAAC;MAClD;IACJ;AAEA,QAAI,YAAY,SAAS,QAAQ;AAC7B,YAAM,UAAU,SAAS,MAAK;AAC9B,WAAK,cAAc,SAAS,QAAQ,WAAQ;AACxC,cAAM,KAAK,KAAK,SAAS;AACzB,aAAK,eAAe,OAAO;AAE3B,cACK,OAAO,OAAK,CAAC,UAAU,GAAG,EAAE,QAAQ,EAAE,KAAK,OAAO,WAAW,MAAM,CAAC,EACpE,QAAQ,OAAK,KAAK,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC;AAE1D,aAAK,kBAAkB,UAAU,QAAQ,QAAQ;MACrD,CAAC;IACL,OAAO;AACH,aAAO,mCAAM,cAAc,QAAQ;IACvC;EACJ;EAEQ,iBACJ,OACA,OACA,IACA,SAAe;AAEf,UAAM,SAAS,WAAW,CAAA;AAC1B,QAAI,CAAC,SAAS,CAAC,MAAM,QAAQ;AACzB,SAAG,MAAM;IACb,OAAO;AACH,YAAM,OAAO,MAAM,MAAK;AACxB,YAAM,KAAK,GAAG,KAAK;AACnB,WAAK,OAAO,SAAS,IAAI,CAAC,KAAK,UAAS;AACpC,YAAI,SAAS,MAAM,KAAK;AACpB,iBAAO,KAAK,KAAK,KAAK,OAAO;QACjC,WAAW,CAAC,MAAM,OAAO;AACrB,iBAAO,KAAK,KAAK,KAAK,OAAO;QACjC;AACA,qBAAa,MAAM,KAAK,iBAAiB,OAAO,OAAO,IAAI,MAAM,CAAC;MACtE,CAAC;IACL;EACJ;EAEA,KAAK,MAAgB,QAAgB,OAAiB;AAClD,SAAK,QAAQ,UAAU,iBAAiB,CAAC,KAAK,eAAc;AACxD,YAAM,OAA2B,YAAY,QAAQ,YAAY;AACjE,cAAQ,MAAM;QACV,KAAK;QACL,KAAK;AACD,eAAK,QAAQ,cAAc,CAAA,GAAI,CAACD,MAAK,SAAQ;AACzC,gBAAI,CAAC,MAAM;AACP,mBAAK,YAAW;AAChB;YACJ;AACA,kBAAM,MAAM,SAAS,IAAI,OAAO,mCAAM,cAAc,MAAM,CAAC,IAAI;AAC/D,uBAAW,OAAO,KAAK,MAAM;AACzB,kBAAI,OAAO,IAAI,OAAO,QAAQ;AAC9B,kBAAI,mCAAM,SAAS,IAAI,GAAG;AACtB,uBAAO,KAAK,SAAS,KAAK;cAC9B;AAEA,kBAAI,CAAC,OAAO,IAAI,KAAK,IAAI,MAAM,GAAG,KAAM,QAAQ,IAAI,KAAK,IAAc,GAAI;AACvE,oBAAI,IAAI,MAAM,MAAM;AAChB,wBAAM,KAAK,IAAI,MAAM;AACrB,wBAAME,QAAO,IAAI,MAAM;AAEvB,0BAAQ,IAAI,GAAG,GAAG,SAAS,EAAE,MAAMA,MAAK,SAAS,EAAE,OAAO,QAAQ,IAAI;gBAC1E;cACJ;YACJ;AACA,iBAAK,YAAW;UACpB,CAAC;AACD;QAEJ,KAAK;QACL,KAAK;AACD,eAAK,OAAO,QAAQ,UAAU,KAAK,CAACF,MAAK,SAAQ;AAC7C,gBAAIA,MAAK;AACL,sBAAQ,MAAMA,IAAG;AACjB,qBAAO,KAAK,KAAK,YAAY,uCAAW,iBAAiB;YAC7D;AAEA,gBAAI,CAAC,MAAM;AACP,qBAAO,KAAK,KAAK,YAAW;YAChC;AAEA,iBAAK,OAAO,UAAU,MAAM,CAACA,MAAK,WAAU;AACxC,kBAAIA,QAAO,CAAC,QAAQ;AAChB,wBAAQ,MAAMA,IAAG;AACjB,uBAAO,KAAK,KAAK,YAAY,uCAAW,iBAAiB;cAC7D;AACA,uBAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACpC,sBAAM,QAAQ,OAAO;AACrB,oBAAI,CAAC,OAAO;AACR;gBACJ;AAEA,sBAAM,KAAK,KAAK;AAChB,sBAAM,OAAO,MAAM,QAAQ;AAC3B,sBAAME,QAAO,OAAO,MAAM;AAE1B,wBAAQ,IACJ,GAAG,GAAG,OAAO,EAAE,YAAY,KAAK,OAAO,EAAE,OAAOA,MAAK,OAAO,CAAC,MACzD,MAAM,MAAM,YAAY,aACxB,KAAK,UAAU,MAAM,GAAG,GAAG;cAEvC;AACA,mBAAK,YAAW;YACpB,CAAC;UACL,CAAC;AACD;QAEJ,KAAK;QACL,KAAK;AACD,eAAK,QAAQ,cACT,EAAE,UAAU,mBAAmB,QAAQ,wBAAuB,GAC9D,CAACF,MAAK,SAAQ;AACV,gBAAI,CAAC,MAAM;AACP,mBAAK,YAAW;AAChB;YACJ;AACA,kBAAM,MAAM,SAAS,IAAI,OAAO,mCAAM,cAAc,oBAAoB,MAAM,CAAC,IAAI;AACnF,kBAAM,cAAkC,CAAA;AACxC,uBAAW,OAAO,KAAK,MAAM;AACzB,kBAAI,IAAI,MAAM,SAAS,WAAW;AAC9B;cACJ;AAEA,kBACI,CAAC,OACD,IAAI,KAAK,IAAI,MAAM,GAAG,KACrB,IAAI,MAAM,UAAU,IAAI,KAAK,IAAI,MAAM,OAAO,IAAI,GACrD;AACE,sBAAM,KAAK,IAAI,MAAM;AACrB,oBAAI,OAAO,IAAI,MAAM,OAAO;AAC5B,oBAAI,mCAAM,SAAS,IAAI,GAAG;AACtB,yBAAO,KAAK,SAAS,KAAK;gBAC9B;AAEA,4BAAY,KAAK;kBACb;kBACA;kBACA,SAAS,IAAI,MAAM,OAAO;kBAC1B,kBAAkB,IAAI,MAAM,OAAO,oBAAoB;iBAC1D;cACL;YACJ;AAEA,oBAAQ,MAAM,WAAW;AACzB,iBAAK,YAAW;UACpB,CAAC;AAEL;QAEJ,KAAK;QACL,KAAK;AACD,eAAK,QAAQ,cACT,EAAE,UAAU,mBAAmB,QAAQ,wBAAuB,GAC9D,CAACA,MAAK,SAAQ;AACV,gBAAI,CAAC,MAAM;AACP,mBAAK,YAAW;AAChB;YACJ;AACA,kBAAM,MAAM,SAAS,IAAI,OAAO,mCAAM,cAAc,kBAAkB,QAAQ,CAAC,IAAI;AACnF,iBAAK,KAAK,KAAK,CAAC,GAAG,MAAK;AACpB,kBAAI,EAAE,KAAK,EAAE,IAAI;AACb,uBAAO;cACX,WAAW,EAAE,KAAK,EAAE,IAAI;AACpB,uBAAO;cACX;AACA,qBAAO;YACX,CAAC;AACD,kBAAM,QAAQ,CAAA;AACd,uBAAW,OAAO,KAAK,MAAM;AACzB,kBAAI,IAAI,MAAM,SAAS,YAAY;AAC/B;cACJ;AAEA,kBAAI,OAAO,IAAI,MAAM,QAAQ;AAE7B,kBAAI,mCAAM,SAAS,IAAI,GAAG;AACtB,uBAAO,KAAK,SAAS,KAAK;cAC9B;AAEA,kBAAI,CAAC,OAAO,IAAI,KAAK,IAAI,MAAM,GAAG,KAAM,QAAQ,IAAI,KAAK,IAAI,GAAI;AAC7D,oBAAI,MAAM,WAAW,CAAC,IAAI,MAAM,OAAO,SAAS;AAC5C;gBACJ;AACA,oBAAI,MAAM,YAAY,IAAI,MAAM,OAAO,SAAS;AAC5C;gBACJ;AACA,oBAAI,MAAM,QAAQ,IAAI,MAAM,OAAO,SAAS,QAAW;AACnD;gBACJ;AACA,oBAAI,MAAM,OAAO,IAAI,MAAM,OAAO,WAAW,QAAW;AACpD;gBACJ;AACA,oBAAI,MAAM,MAAM,IAAI,MAAM,OAAO,SAAS,QAAW;AACjD;gBACJ;AAEA,oBAAI,KAAa,IAAI,MAAM;AAC3B,oBAAI,OAAO,IAAI,MAAM,OAAO;AAE5B,oBAAI,GAAG,SAAS,IAAI;AAChB,uBAAK,GAAG,OAAO,EAAE;gBACrB;AACA,oBAAI,QAAQ,KAAK,SAAS,IAAI;AAC1B,yBAAO,KAAK,OAAO,EAAE;gBACzB;AAEA,oBAAI,QAAQ,KAAK,SAAS,IAAI;AAC1B,yBAAO,KAAK,OAAO,EAAE;gBACzB;AAEA,oBAAI,OAAO,GAAG,OAAO,QAAQ,OAAO,UAChC,IAAI,MAAM,OAAO,UAAU,aAAa;AAG5C,oBAAI,KAAK,OAAO,UAAU,KAAK,OAAO,OAAO,WAAW,IAAI,MAAM,OAAO,SAAS;AAC9E,0BACI,gBACC,IAAI,MAAM,OAAO,WAAW,IAAI,MAAM,OAAO,mBACxC,kBACI,IAAI,MAAM,OAAO,iBAAiB,SAC5B,IAAI,MAAM,OAAO,eACjB,OAEV;gBACd;AAEA,oBAAI,IAAI,MAAM,UAAU,IAAI,MAAM,OAAO,MAAM;AAC3C,0BAAQ,WAAW,IAAI,MAAM,OAAO;gBACxC;AACA,oBAAI,IAAI,MAAM,UAAU,IAAI,MAAM,OAAO,MAAM;AAC3C,0BAAQ,WAAW,IAAI,MAAM,OAAO;gBACxC;AACA,oBAAI,IAAI,MAAM,UAAU,IAAI,MAAM,OAAO,QAAQ;AAC7C,0BAAQ;gBACZ;AACA,oBAAI,IAAI,MAAM,UAAU,IAAI,MAAM,OAAO,aAAa;AAClD,0BAAQ,aAAa,IAAI,MAAM,OAAO;gBAC1C;AACA,sBAAM,KAAK,EAAE,IAAI,IAAI,MAAM,KAAK,OAAO,KAAI,CAAE;cACjD;YACJ;AACA,iBAAK,iBAAiB,OAAO,OAAO,YAAS;AACzC,sBAAQ,IAAI,OAAO,KAAK,IAAI,CAAC;AAC7B,sBAAQ,IAAI,uBAAuB;AACnC,mBAAK,YAAW;YACpB,CAAC;UACL,CAAC;AAEL;QAEJ,KAAK;QACL,KAAK;AACD,eAAK,QAAQ,cACT,EAAE,UAAU,gBAAgB,QAAQ,qBAAoB,GACxD,CAACA,MAAK,SAAQ;AACV,iBAAK,QAAQ,cACT,EAAE,UAAU,iBAAiB,QAAQ,sBAAqB,GAC1D,CAACA,MAAK,WAAU;AACZ,kBAAI,CAAC,MAAM;AACP,qBAAK,YAAW;AAChB;cACJ;AACA,oBAAM,MAAM,SACN,IAAI,OAAO,mCAAM,cAAc,iBAAiB,MAAM,CAAC,IACvD;AACN,sBAAQ,IACJ,0EAA0E;AAE9E,sBAAQ,IACJ,iFAAiF;AAErF,yBAAW,OAAO,KAAK,MAAM;AACzB,oBAAI,IAAI,MAAM,SAAS,QAAQ;AAC3B;gBACJ;AAEA,oBACI,CAAC,OACD,IAAI,KAAK,IAAI,MAAM,GAAG,KACrB,IAAI,MAAM,UAAU,IAAI,KAAK,IAAI,MAAM,OAAO,IAAI,GACrD;AACE,wBAAM,KAAK,IAAI,MAAM;AACrB,sBAAI,OAAO,IAAI,MAAM,OAAO;AAC5B,sBAAI,mCAAM,SAAS,IAAI,GAAG;AACtB,2BAAO,KAAK,SAAS,KAAK;kBAC9B;AAEA,wBAAM,OAAO,GAAG,GAAG,OAAO,EAAE,MAAM,KAAK,OAAO,EAAE,OAC5C,IAAI,MAAM,OAAO,UAAU,aAAa;AAE5C,sBAAI,QAAQ;AACR,0BAAM,KAAK,CAAA;AAEX,+BAAW,SAAS,OAAO,MAAM;AAC7B,0BACI,MAAM,MAAM,OAAO,WACnB,MAAM,MAAM,OAAO,QAAQ,QAAQ,IAAI,MAAM,GAAG,MAAM,IACxD;AACE,2BAAG,KAAK,MAAM,MAAM,IAAI,UAAU,EAAE,CAAC;sBACzC;oBACJ;AACA,4BAAQ,IAAI,GAAG,QAAQ,GAAG,KAAK,IAAI,GAAG;kBAC1C;gBACJ;cACJ;AACA,mBAAK,YAAW;YACpB,CAAC;UAET,CAAC;AAEL;QAEJ,KAAK;QACL,KAAK;AACD,eAAK,QAAQ,cACT,EAAE,UAAU,iBAAiB,QAAQ,sBAAqB,GAC1D,CAACA,MAAK,SAAQ;AACV,gBAAI,CAAC,MAAM;AACP,mBAAK,YAAW;AAChB;YACJ;AACA,kBAAM,MAAM,SAAS,IAAI,OAAO,mCAAM,cAAc,kBAAkB,MAAM,CAAC,IAAI;AACjF,oBAAQ,IAAI,EAAE;AACd,oBAAQ,IACJ,8FAA8F;AAElG,oBAAQ,IACJ,wFAAwF;AAE5F,oBAAQ,IACJ,iGAAiG;AAErG,uBAAW,OAAO,KAAK,MAAM;AACzB,kBAAI,IAAI,MAAM,SAAS,SAAS;AAC5B;cACJ;AACA,kBACI,CAAC,OACD,IAAI,KAAK,IAAI,MAAM,GAAG,KACrB,IAAI,MAAM,UAAU,IAAI,KAAK,IAAI,MAAM,OAAO,IAAI,GACrD;AACE,sBAAM,KAAK,IAAI,MAAM,IAAI,UAAU,EAAE;AACrC,oBAAI,OAAO,iBAAiB;AACxB,sBAAI,MAAM,OAAO,MAAM;oBACnB,MAAM;sBACF,MAAM;sBACN,OAAO;sBACP,QAAQ;sBACR,QAAQ;sBACR,MAAM;;oBAEV,QAAQ;sBACJ,MAAM;sBACN,OAAO;sBACP,QAAQ;sBACR,QAAQ;sBACR,MAAM;;oBAEV,OAAO;sBACH,MAAM;sBACN,OAAO;sBACP,QAAQ;sBACR,QAAQ;sBACR,MAAM;;oBAEV,OAAO;sBACH,OAAO;sBACP,QAAQ;sBACR,QAAQ;sBACR,MAAM;sBACN,MAAM;;oBAEV,OAAO;sBACH,SAAS;sBACT,MAAM;sBACN,QAAQ;;;gBAGpB;AAEA,oBAAI,OAAO,GAAG,OAAO,EAAE;AACvB,wBAAQ;AACR,oBAAI,IAAI,MAAM,OAAO,KAAK,QAAQ;AAC9B,2BAAS,IAAI,MAAM,OAAO,IAAI,OAAO,OAAO,MAAM,OAAO;AACzD,2BAAS,IAAI,MAAM,OAAO,IAAI,OAAO,OAAO,MAAM,OAAO;AACzD,2BAAS,IAAI,MAAM,OAAO,IAAI,OAAO,QAAQ,MAAM,OAAO;AAC1D,2BAAS,IAAI,MAAM,OAAO,IAAI,OAAO,SAAS,MAAM,OAAO;AAC3D,0BAAQ;gBACZ,OAAO;AACH,0BAAQ;gBACZ;AACA,oBAAI,IAAI,MAAM,OAAO,KAAK,OAAO;AAC7B,0BAAQ;AACR,2BAAS,IAAI,MAAM,OAAO,IAAI,MAAM,OAAO,MAAM,OAAO;AACxD,2BAAS,IAAI,MAAM,OAAO,IAAI,MAAM,OAAO,MAAM,OAAO;AACxD,2BAAS,IAAI,MAAM,OAAO,IAAI,MAAM,QAAQ,MAAM,OAAO;AACzD,2BAAS,IAAI,MAAM,OAAO,IAAI,MAAM,SAAS,MAAM,OAAO;AAC1D,0BAAQ;gBACZ,OAAO;AACH,0BAAQ;gBACZ;AACA,oBAAI,IAAI,MAAM,OAAO,KAAK,MAAM;AAC5B,0BAAQ;AACR,2BAAS,IAAI,MAAM,OAAO,IAAI,KAAK,OAAO,MAAM,OAAO;AACvD,2BAAS,IAAI,MAAM,OAAO,IAAI,KAAK,OAAO,MAAM,OAAO;AACvD,2BAAS,IAAI,MAAM,OAAO,IAAI,KAAK,QAAQ,MAAM,OAAO;AACxD,2BAAS,IAAI,MAAM,OAAO,IAAI,KAAK,SAAS,MAAM,OAAO;AACzD,2BAAS,IAAI,MAAM,OAAO,IAAI,KAAK,SAAS,MAAM,OAAO;AACzD,0BAAQ;gBACZ,OAAO;AACH,0BAAQ;gBACZ;AACA,oBAAI,IAAI,MAAM,OAAO,KAAK,OAAO;AAC7B,0BAAQ;AACR,2BAAS,IAAI,MAAM,OAAO,IAAI,MAAM,QAAQ,MAAM,OAAO;AACzD,2BAAS,IAAI,MAAM,OAAO,IAAI,MAAM,SAAS,MAAM,OAAO;AAC1D,2BAAS,IAAI,MAAM,OAAO,IAAI,MAAM,SAAS,MAAM,OAAO;AAC1D,0BAAQ;gBACZ,OAAO;AACH,0BAAQ;gBACZ;AACA,oBAAI,IAAI,MAAM,OAAO,KAAK,OAAO;AAC7B,0BAAQ;AACR,sBAAI,SAAS;AACb,6BAAW,CAAC,GAAG,SAAS,KAAK,OAAO,QAAQ,IAAI,MAAM,OAAO,IAAI,KAAK,GAAG;AACrE,8BAAU,KAAK,YAAY,MAAM,OAAO;kBAC5C;AAEA,0BAAQ,GAAG,OAAO,OAAO,EAAE;gBAC/B,OAAO;AACH,0BAAQ,IAAI,MAAM,EAAE,EAAE,KAAK,GAAG,IAAI;gBACtC;AAEA,oBAAI,IAAI,MAAM,OAAO,SAAS;AAC1B,2BAAS,IAAI,GAAG,IAAI,IAAI,MAAM,OAAO,QAAQ,QAAQ,KAAK;AACtD,wBAAI,MAAM,OAAO,QAAQ,KAAK,IAAI,MAAM,OAAO,QAAQ,GAAG,UACtD,EAAE;kBAEV;AACA,0BAAQ,IAAI,IAAI,MAAM,OAAO,QAAQ,KAAK,IAAI;gBAClD;AACA,wBAAQ,IAAI,IAAI;cACpB;YACJ;AAEA,oBAAQ,IACJ,iGAAiG;AAErG,oBAAQ,IAAI,qDAAqD;AACjE,iBAAK,YAAW;UACpB,CAAC;AAEL;QAEJ,KAAK;QACL,KAAK;AACD,eAAK,QAAQ,cACT,EAAE,UAAU,gBAAgB,QAAQ,qBAAoB,GACxD,CAACA,MAAK,SAAQ;AACV,gBAAI,CAAC,MAAM;AACP,mBAAK,YAAW;AAChB;YACJ;AACA,iBAAK,OAAO,QAAQ,iBAAiB,CAACA,MAAK,SAAQ;AAC/C,kBAAI,CAAC,MAAM;AACP,qBAAK,YAAW;AAChB;cACJ;AACA,mBAAK,OAAO,UAAU,MAAM,CAACA,MAAK,WAAU;AACxC,oBAAI,CAAC,QAAQ;AACT,uBAAK,YAAW;AAChB;gBACJ;AAEA,sBAAM,MAAM,SACN,IAAI,OAAO,mCAAM,cAAc,iBAAiB,MAAM,CAAC,IACvD;AAEN,2BAAW,OAAO,KAAK,MAAM;AACzB,sBAAI,IAAI,MAAM,SAAS,QAAQ;AAC3B;kBACJ;AACA,sBACI,CAAC,OACD,IAAI,KAAK,IAAI,MAAM,GAAG,KACrB,IAAI,MAAM,UAAU,IAAI,KAAK,IAAI,MAAM,OAAO,IAAI,GACrD;AACE,0BAAM,KAAK,IAAI,MAAM,IAAI,UAAU,EAAE;AACrC,wBAAI,OAAO,IAAI,MAAM,OAAO;AAC5B,wBAAI,mCAAM,SAAS,IAAI,GAAG;AACtB,6BAAO,KAAK,SAAS,KAAK;oBAC9B;AAEA,0BAAM,WAAW,IAAI,MAAM,OAAO;AAElC,0BAAM,UAAU,IAAI,MAAM,OAAO;AACjC,wBAAI,QAAQ;AACZ,wBAAI,SAAS;AACb,6BAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AAClC,0BAAI,KAAK,OAAO,GAAG,IAAI,MAAM,aAAa;AACtC,gCAAQ;sBACZ;AACA,0BAAI,KAAK,OAAO,GAAG,IAAI,MAAM,cAAc;AACvC,iCAAS,OAAO,GAAI,KAAK,SAAQ,KAAM;sBAC3C;oBACJ;AACA,4BAAQ,SAAS;AAEjB,wBAAI,CAAC,QAAQ;AACT,+BAAS;oBACb;AACA,0BAAM,OAAO,GAAG,GAAG,OACf,EAAE,KACD,kBAAkB,sBAAsB,SAAS,OAClD,EAAE,MACA,kBAAkB;AAExB,4BAAQ,IAAI,IAAI;kBACpB;gBACJ;AAEA,qBAAK,YAAW;cACpB,CAAC;YACL,CAAC;UACL,CAAC;AAEL;QAEJ,KAAK;QACL,KAAK;AACD,eAAK,QAAQ,cAAc,EAAE,UAAU,SAAS,QAAQ,cAAa,GAAI,CAACA,MAAK,SAAQ;AACnF,gBAAI,CAAC,MAAM;AACP,mBAAK,YAAW;AAChB;YACJ;AACA,kBAAM,MAAM,SAAS,IAAI,OAAO,mCAAM,cAAc,QAAQ,QAAQ,CAAC,IAAI;AACzE,uBAAW,OAAO,KAAK,MAAM;AACzB,kBAAI,IAAI,MAAM,SAAS,QAAQ;AAC3B;cACJ;AAEA,kBAAI,OAAO,IAAI,MAAM,QAAQ;AAC7B,kBAAI,mCAAM,SAAS,IAAI,GAAG;AACtB,uBAAO,KAAK,SAAS,KAAK;cAC9B;AAEA,kBAAI,CAAC,OAAO,IAAI,KAAK,IAAI,MAAM,GAAG,KAAM,QAAQ,IAAI,KAAK,IAAI,GAAI;AAC7D,wBAAQ,IACJ,yFAAyF;AAE7F,sBAAM,KAAK,IAAI,MAAM,IAAI,UAAU,CAAC;AAEpC,wBAAQ,IAAI,GAAG,GAAG,OAAO,EAAE,KAAK,OAAO;AACvC,wBAAQ,IACJ,uFAAuF;AAG3F,oBAAI,IAAI,MAAM,OAAO,SAAS;AAC1B,0BAAQ,IAAI,IAAI,MAAM,OAAO,QAAQ,KAAK,IAAI,CAAC;gBACnD;cACJ;YACJ;AACA,iBAAK,YAAW;UACpB,CAAC;AACD;QAEJ,KAAK;QACL,KAAK;AACD,eAAK,QAAQ,cAAc,EAAE,UAAU,IAAI,QAAQ,SAAQ,GAAI,CAACA,MAAK,SAAQ;AACzE,gBAAI,CAAC,MAAM;AACP,mBAAK,YAAW;AAChB;YACJ;AAEA,kBAAM,UAAU,UAAU;AAC1B,kBAAM,QAAQ,SAAS,OAAO,MAAM,GAAG,IAAI;AAC3C,gBAAI,SAAS,CAAC,MAAM,IAAI;AACpB,oBAAM,OAAO,GAAG,CAAC;YACrB;AAEA,kBAAM,WAAW,KAAK,KACjB,OACG,SACI,IAAI,MAAM,SAAS,UACnB,EACI,SACA,WACA,IAAI,MAAM,QAAQ,MAAM,MACxB,CAAC,IAAI,MAAM,IAAI,WAAW,GAAG,MAAM,KAAK,EAC3C,EAER,IAAI,SAAO,IAAI,MAAM,GAAG;AAE7B,gBAAI,OAAO;AACP,oBAAM,MAAK;YACf;AAEA,iBAAK,kBAAkB,UAAU,QAAQ,MAAM,KAAK,GAAG,IAAI,MAAM,MAAM,KAAK,YAAW,CAAE;UAC7F,CAAC;AACD;MACR;IACJ,CAAC;EACL;;",
6
6
  "names": ["import_js_controller_common", "fs", "err", "files", "type"]
7
7
  }
@@ -145,8 +145,8 @@ class Repo {
145
145
  return oldRepos.native.repositories[repoName].json;
146
146
  }
147
147
  async showRepo(repoUrl, flags) {
148
- const systemConfig = await this.objects.getObjectAsync("system.config");
149
- const systemRepos = await this.objects.getObjectAsync("system.repositories");
148
+ const systemConfig = await this.objects.getObject("system.config");
149
+ const systemRepos = await this.objects.getObject("system.repositories");
150
150
  if (!systemConfig) {
151
151
  console.error('Error: Object "system.config" not found');
152
152
  } else if (!systemRepos) {
@@ -252,13 +252,19 @@ class Repo {
252
252
  }
253
253
  async showRepoStatus() {
254
254
  try {
255
- const obj = await this.objects.getObjectAsync("system.repositories");
255
+ const obj = await this.objects.getObject("system.repositories");
256
+ const objCfg = await this.objects.getObject("system.config");
256
257
  if (!obj) {
257
258
  console.error("List is empty");
258
259
  return import_js_controller_common.EXIT_CODES.CANNOT_GET_REPO_LIST;
259
260
  } else if (obj.native.repositories) {
260
- Object.keys(obj.native.repositories).forEach((r) => console.log(`${r.padEnd(14)}: ${obj.native.repositories[r].link}`));
261
- const objCfg = await this.objects.getObjectAsync("system.config");
261
+ console.table(Object.entries(obj.native.repositories).map(([key, value]) => {
262
+ return {
263
+ name: key,
264
+ url: value.link,
265
+ "auto upgrade": objCfg?.common.adapterAutoUpgrade?.repositories[key] ?? false
266
+ };
267
+ }));
262
268
  if (objCfg?.common) {
263
269
  let activeRepo = objCfg.common.activeRepo;
264
270
  if (typeof activeRepo === "string") {
@@ -266,6 +272,7 @@ class Repo {
266
272
  }
267
273
  console.log(`
268
274
  Active repo(s): ${activeRepo.join(", ")}`);
275
+ console.log(`Upgrade policy: ${objCfg.common.adapterAutoUpgrade?.defaultPolicy ?? "none"}`);
269
276
  }
270
277
  } else {
271
278
  console.error("List is empty");