@iobroker/js-controller-cli 6.0.7-alpha.0-20240702-5c723a4ac → 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.
- package/build/cjs/lib/cli/cliLogs.js +4 -1
- package/build/cjs/lib/cli/cliLogs.js.map +2 -2
- package/build/cjs/lib/setup/dbConnection.js +2 -4
- package/build/cjs/lib/setup/dbConnection.js.map +2 -2
- package/build/cjs/lib/setup/setupUsers.js +3 -3
- package/build/cjs/lib/setup/setupUsers.js.map +2 -2
- package/build/cjs/lib/setup.js +5 -5
- package/build/cjs/lib/setup.js.map +2 -2
- package/build/esm/lib/cli/cliLogs.d.ts.map +1 -1
- package/build/esm/lib/cli/cliLogs.js +4 -1
- package/build/esm/lib/cli/cliLogs.js.map +1 -1
- package/build/esm/lib/setup/dbConnection.js +2 -4
- package/build/esm/lib/setup/dbConnection.js.map +1 -1
- package/build/esm/lib/setup/setupUsers.d.ts.map +1 -1
- package/build/esm/lib/setup/setupUsers.js +3 -4
- package/build/esm/lib/setup/setupUsers.js.map +1 -1
- package/build/esm/lib/setup.js +9 -9
- package/build/esm/lib/setup.js.map +1 -1
- package/build/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +5 -4
|
@@ -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*`, {
|
|
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*`, {
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;wBAAmD;AACnD,kCAA6C;AAC7C,sBAAqB;AACrB,sBAAe;AACf,qBAAe;AACf,0BAAe;AACf,yBAA8B;AAN9B;AAQA,MAAMA,eAAU,kCAAc,YAAY,OAAO,YAAY,UAAU;AAEvE,MAAM,EAAE,kBAAiB,IAAK;AAUxB,MAAO,gBAAgB,6BAAU;EAClB,YAAY,oBAAI,IAAG;EAC5B,UAAU;EAElB,YAAY,SAA0B;AAClC,UAAM,OAAO;EACjB;EAQA,QAAQ,MAAa,QAA2B;AAC5C,UAAM,cAAc,KAAK;AACzB,UAAM,QAAQ,OAAO,SAAS,OAAO;AACrC,UAAM,QAAQ,OAAO,SAAS;AAE9B,UAAM,UAA0B;MAC5B,UAAU,KAAK,QAAQ;;AAG3B,UAAM,SAAS,gBAAAC,QAAG,aAAaD,SAAQ,QAAQ,kBAAiB,CAAE,CAAC;AACnE,UAAM,aAAS,4BAAAE,QAAY,OAAO,GAAG;AAErC,QAAI,WAAW,OAAO,YAAW;AACjC,QAAI,UAAU;AACV,UAAI,QAAQ,gBAAAD,QAAG,aAAa,QAAQ,EAAE,SAAS,OAAO,EAAE,MAAM,IAAI;AAClE,cAAQ,MAAM,OAAO,UAAQ,IAAI;AACjC,UAAI,MAAM,SAAS,OAAO;AACtB,cAAM,OAAO,GAAG,MAAM,SAAS,KAAK;MACxC;AACA,UAAI;AACJ,UAAI,aAAa;AAEb,gBAAQ,IAAI,OAAO,KAAK,gBAAgB;AACxC,gBAAQ,QAAQ;MACpB;AACA,YAAM,QAAQ,UAAO;AACjB,YAAI,SAAS,CAAC,MAAM,KAAK,IAAI,GAAG;AAC5B;QACJ;AACA,gBAAQ,IAAI,IAAI;MACpB,CAAC;AAED,UAAI,OAAO;AACP,mBAAW,SAAS,QAAQ,OAAO,GAAG;AACtC,cAAM,QAAQ,SAAS,MAAM,GAAG;AAChC,cAAM,IAAG;AACT,wBAAAE,QACK,MAAM,GAAG,MAAM,KAAK,GAAG,eAAe,
|
|
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
|
-
|
|
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": ";;;;;;;;;;;;;;;;;;;;;;;;AACA;;;;;;;;sBAAe;AACf,kCAKO;AACP,IAAAA,+BAA2B;AAC3B,IAAAA,+BAAsB;AACtB,sBAAmC;AAGnC,uBAAiB;AAEjB,yBAA8B;AAE9B,IAAI;AACJ,IAAI;AACJ,IAAI;AACJ,IAAI;AACJ,IAAI;AAiBJ,eAAsB,UAClB,WACA,QACA,UAA4B;AAE5B,MAAI,OAAO,cAAc,UAAU;AAC/B,eAAW;AACX,aAAS;AACT,gBAAY;EAChB;AACA,MAAI,OAAO,cAAc,YAAY;AACjC,eAAW;AACX,gBAAY;EAChB;AACA,MAAI,OAAO,WAAW,YAAY;AAC9B,eAAW;AACX,aAAS,CAAA;EACb;AAEA,MAAI,CAAC,UAAU;AACX,UAAM,IAAI,MAAM,2BAA2B;EAC/C;AAEA,WAAS,UAAU,CAAA;AAEnB,QAAM,SAAgC,gBAAAC,QAAG,aAAa,mCAAM,kBAAiB,CAAE;AAE/E,MAAI,WAAW,QAAQ;AACnB,WAAO,KAAK,SAAS,EAAE,SAAS,QAAQ,WAAW,OAAO,eAAe,OAAO,QAAQ,MAAM,OAAM,CAAE;EAC1G;AAEA,SAAO,SAAS,OAAO,UAAU,EAAE,MAAM,QAAO;AAChD,SAAO,UAAU,OAAO,WAAW,EAAE,MAAM,QAAO;AAGlD,SAAO,OAAO,iBAAiB,KAAK,IAAI,OAAO,OAAO,kBAAkB,GAAG,GAAK;AAChF,SAAO,QAAQ,iBAAiB,KAAK,IAAI,OAAO,QAAQ,kBAAkB,GAAG,GAAK;AAElF,YAAU,UAAM,mDAAqB;AACrC,WAAS,UAAM,kDAAoB;AAEnC,MAAI,oBAAoB;AACxB,MAAI,oBAAoB;AAGxB,aACI,YAAW;AACP,QAAI,qBAAqB,mBAAmB;AACxC;IACJ;AAEA,QAAI,CAAC,mBAAmB;AACpB,UAAI,SAAS;AAET,cAAM,QAAQ,QAAO;AACrB,kBAAU;MACd;AAEA,YAAM,mBAAmB,UAAM,gDAAmB,OAAO,QAAQ,IAAI;AAErE,UAAI,kBAAkB;AAElB,mBAAW,MAAM,OAAO,wBAAwB,OAAO,QAAQ,SAAS;AACxE,kBAAU,IAAI,QAAS;UACnB,YAAY,OAAO;UACnB,QAAQ;YACJ,OAAO,CAAC,SAAgB;YAExB;YACA,OAAO,CAAC,SAAgB;YAExB;YACA,MAAM,CAAC,SAAgB;YAEvB;YACA,MAAM,CAAC,QAAgB,QAAQ,IAAI,GAAG;YACtC,OAAO,CAAC,QAAgB,QAAQ,IAAI,GAAG;;UAE3C,WAAW,YAAW;AAClB,gCAAoB;AACpB,gBAAI,qBAAqB,OAAO,aAAa,YAAY;AACrD,kBAAI;AACA,sBAAM,kBAAkB,MAAM;cAClC,QAAE;cAEF;AACA,qBAAO,KAAK,SAAS;gBACjB;gBACA;gBACA,WAAW;gBACX,eAAe,OAAO,QAAQ;gBAC9B;eACH;YACL;UACJ;SACH;MACL,OAAO;AACH,gBAAQ,IACJ,4BAA4B,OAAO,QAAQ,QAAQ,OAAO,QAAQ,QAAQ,OAAO,QAAQ,OAAO;AAEpG,YAAI,WAAW;AACX,sBACI,SAAS;YACL;YACA;YACA,WAAW;YACX,eAAe,OAAO,QAAQ;YAC9B;WACH;AACL,qBAAW;QACf,OAAO;AACH,iBAAO,KAAK,oBAAoB,wCAAW,uBAAuB;QACtE;MACJ;IACJ;AAEA,QAAI,CAAC,mBAAmB;AACpB,UAAI,QAAQ;AAER,cAAM,OAAO,QAAO;AACpB,iBAAS;MACb;AAEA,YAAM,kBAAkB,UAAM,+CAAkB,OAAO,OAAO,IAAI;AAElE,UAAI,iBAAiB;AAEjB,kBAAU,MAAM,OAAO,uBAAuB,OAAO,OAAO,SAAS;AAErE,iBAAS,IAAI,OAAQ;UACjB,YAAY,OAAO;UACnB,QAAQ;YACJ,OAAO,CAAC,SAAgB;YAExB;YACA,OAAO,CAAC,SAAgB;YAExB;YACA,MAAM,CAAC,SAAgB;YAEvB;YACA,MAAM,CAAC,QAAgB,QAAQ,IAAI,GAAG;YACtC,OAAO,CAAC,QAAgB,QAAQ,IAAI,GAAG;;UAE3C,WAAW,YAAW;AAClB,gCAAoB;AACpB,gBAAI,qBAAqB,OAAO,aAAa,YAAY;AACrD,kBAAI;AACA,sBAAM,kBAAkB,MAAM;cAClC,QAAE;cAEF;AACA,qBAAO,KAAK,SAAS;gBACjB;gBACA;gBACA,WAAW;gBACX,eAAe,OAAO,QAAQ;gBAC9B;eACH;YACL;UACJ;UAGA,QAAQ,CAAC,IAAI,QAAQ,QAAQ,SAAS,IAAI,GAAG;SAChD;AAED,eAAQ,WAAW;MACvB,OAAO;AACH,YAAI,QAAQ;AAER,gBAAO,OAA6B,QAAO;AAC3C,mBAAS;QACb;AACA,YAAI,SAAS;AAET,gBAAM,QAAQ,QAAO;AACrB,oBAAU;QACd;AACA,gBAAQ,IACJ,2BAA2B,OAAO,OAAO,QAAQ,OAAO,OAAO,QAAQ,OAAO,OAAO,OAAO;AAEhG,YAAI,WAAW;AACX,sBACI,SAAS;YACL;YACA;YACA,WAAW;YACX,eAAe,OAAO,QAAQ;YAC9B;WACH;AACL,qBAAW;QACf,OAAO;AACH,iBAAO,KAAK,oBAAoB,wCAAW,uBAAuB;QACtE;MACJ;IACJ;AAEA,cAAM,gBAAAC,aAAM,OAAO,WAAW,OAAU,OAAO,QAAQ,cAAc;AAGrE,QAAI,qBAAqB,mBAAmB;AACxC;IACJ;AAEA,YAAQ,IAAI,yCAAyC;AACrD,QAAI,WAAW;AACX,kBACI,SAAS;QAEL,SAAS;QACT,QAAQ;QACR,WAAW;QACX,eAAe,OAAO,QAAQ;QAC9B;OACH;AACL,iBAAW;IACf,OAAO;AACH,aAAO,KAAK,oBAAoB,wCAAW,uBAAuB;IACtE;EACJ,GACA,OAAO,WAAW,OAAO,QAAQ,iBAAiB,CAAC;AAIvD,YAAU,IAAI,QAAS;IACnB,YAAY,OAAO;IACnB,QAAQ;MACJ,OAAO,CAAC,SAAgB;MAExB;MACA,OAAO,CAAC,SAAgB;MAExB;MACA,MAAM,CAAC,SAAgB;MAEvB;MACA,MAAM,CAAC,QAAgB,QAAQ,IAAI,GAAG;MACtC,OAAO,CAAC,QAAgB,QAAQ,IAAI,GAAG;;IAE3C,WAAW,YAAW;AAClB,UAAI,mBAAmB;AACnB;MACJ;AACA,0BAAoB;AAEpB,UAAI,qBAAqB,OAAO,aAAa,YAAY;AACrD,cAAM,YAAY,MAAM,mBAAmB,SAAoB;AAC/D,YAAI;AACA,gBAAM,kBAAkB,MAAM;QAClC,QAAE;QAEF;AACA,iBAAS,EAAE,SAAmB,QAAiB,WAAW,eAAe,OAAO,QAAQ,MAAM,OAAM,CAAE;MAC1G;IACJ;GACH;AAED,WAAS,IAAI,OAAQ;IACjB,YAAY,OAAO;IACnB,QAAQ;MACJ,OAAO,CAAC,SAAgB;MAExB;MACA,OAAO,CAAC,SAAgB;MAExB;MACA,MAAM,CAAC,SAAgB;MAEvB;MACA,MAAM,CAAC,QAAgB,QAAQ,IAAI,GAAG;MACtC,OAAO,CAAC,QAAgB,QAAQ,IAAI,GAAG;;IAE3C,WAAW,YAAW;AAClB,UAAI,mBAAmB;AACnB;MACJ;AACA,0BAAoB;AAEpB,UAAI,qBAAqB,OAAO,aAAa,YAAY;AACrD,cAAM,YAAY,MAAM,mBAAmB,SAAoB;AAC/D,YAAI;AACA,gBAAM,kBAAkB,MAAM;QAClC,QAAE;QAEF;AACA,iBAAS,EAAE,SAAmB,QAAiB,WAAW,eAAe,OAAO,QAAQ,MAAM,OAAM,CAAE;MAC1G;IACJ;IAEA,QAAQ,CAAC,IAAI,UAAU,QAAQ,SAAS,IAAI,KAAK;GACpD;AACL;AAQM,SAAU,eAAe,WAAoB,QAAwB;AACvE,SAAO,IAAI,QAAQ,aAAW,UAAU,WAAW,UAAU,CAAA,GAAI,CAAAC,YAAU,QAAQA,OAAM,CAAC,CAAC;AAC/F;AAKA,eAAsB,iBAAc;AAChC,MAAI,SAAS;AACT,UAAM,QAAQ,QAAO;AACrB,cAAU;EACd;AACA,MAAI,QAAQ;AACR,UAAM,OAAO,QAAO;AACpB,aAAS;EACb;AACA,MAAI,SAAS;AACT,cAAU;EACd;AACA,MAAI,QAAQ;AACR,aAAS;EACb;AAEA,MAAI,eAAe;AACf,kBAAc,WAAU;EAC5B;AACJ;AAOA,eAAsB,oBAAoB,UAAiB;AACvD,QAAM,eAAc;AACpB,YAAM,gBAAAD,YAAK,GAAK;AAChB,UAAQ,KAAK,QAAQ;AACzB;AAOA,
|
|
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
|
}
|
|
@@ -363,7 +363,7 @@ class Users {
|
|
|
363
363
|
import_prompt.default.get(schema, (err, result) => {
|
|
364
364
|
this.checkPassword(result.username, result.password, (err2, res) => {
|
|
365
365
|
if (err2 || !res) {
|
|
366
|
-
return import_js_controller_common.tools.maybeCallbackWithError(callback, `Password for user "${result.username}" does not match${err2 ?
|
|
366
|
+
return import_js_controller_common.tools.maybeCallbackWithError(callback, `Password for user "${result.username}" does not match${err2 ? `: ${err2.message}` : ""}`);
|
|
367
367
|
} else {
|
|
368
368
|
return import_js_controller_common.tools.maybeCallbackWithError(callback, null);
|
|
369
369
|
}
|
|
@@ -386,7 +386,7 @@ class Users {
|
|
|
386
386
|
import_prompt.default.get(schema, (err, result) => {
|
|
387
387
|
this.checkPassword(username, result.password, (err2, res) => {
|
|
388
388
|
if (err2 || !res) {
|
|
389
|
-
return import_js_controller_common.tools.maybeCallbackWithError(callback, `Password for user "${username}" does not
|
|
389
|
+
return import_js_controller_common.tools.maybeCallbackWithError(callback, `Password for user "${username}" does not match${err2 ? `: ${err2.message}` : ""}`);
|
|
390
390
|
} else {
|
|
391
391
|
return import_js_controller_common.tools.maybeCallbackWithError(callback, null);
|
|
392
392
|
}
|
|
@@ -395,7 +395,7 @@ class Users {
|
|
|
395
395
|
} else {
|
|
396
396
|
this.checkPassword(username, password2, (err, res) => {
|
|
397
397
|
if (err || !res) {
|
|
398
|
-
return import_js_controller_common.tools.maybeCallbackWithError(callback,
|
|
398
|
+
return import_js_controller_common.tools.maybeCallbackWithError(callback, `Password for user "${username}" does not match${err ? `: ${err.message}` : ""}`);
|
|
399
399
|
} else {
|
|
400
400
|
return import_js_controller_common.tools.maybeCallbackWithError(callback, null);
|
|
401
401
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/lib/setup/setupUsers.ts"],
|
|
4
|
-
"sourcesContent": ["import { password, tools, EXIT_CODES } from '@iobroker/js-controller-common';\nimport type { ProcessExitCallback } from '../_Types.js';\nimport type { Client as ObjectsRedisClient } from '@iobroker/db-objects-redis';\nimport prompt from 'prompt';\n\nexport interface CLIUsersOptions {\n processExit: ProcessExitCallback;\n objects: ObjectsRedisClient;\n}\n\nexport class Users {\n private readonly objects: ObjectsRedisClient;\n private readonly processExit: ProcessExitCallback;\n\n constructor(options: CLIUsersOptions) {\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.objects = options.objects;\n this.processExit = options.processExit;\n }\n\n /**\n * Adds new user to system\n *\n * @param username name of the user which will be added\n * @param pw password\n * @param callback\n */\n addUser(username: string, pw: string, callback: ioBroker.ErrorCallback): void {\n // user id's should be case insensitive\n const _user = username.replace(/\\s/g, '_').toLowerCase();\n this.objects.getObject(`system.user.${_user}`, (err, obj) => {\n if (obj) {\n return tools.maybeCallbackWithError(callback, 'User yet exists');\n } else {\n this.objects.setObject(\n `system.user.${_user}`,\n {\n type: 'user',\n common: {\n name: username,\n enabled: true,\n password: ''\n },\n from: `system.host.${tools.getHostName()}.cli`,\n ts: Date.now(),\n native: {}\n },\n err => {\n if (!err) {\n this.setPassword(username, pw, callback);\n } else {\n return tools.maybeCallbackWithError(callback, err);\n }\n }\n );\n }\n });\n }\n\n /**\n * Checks if user exists\n *\n * @param username name of the user to check existence of\n */\n async isUser(username: string): Promise<boolean> {\n const _user = username.replace(/\\s/g, '_').toLowerCase();\n let isExisting = false;\n try {\n isExisting = await this.objects.objectExists(`system.user.${_user}`);\n } catch {\n // ignore\n }\n\n return isExisting;\n }\n\n /**\n * Set password for specific user\n *\n * @param username name of the user to set password for\n * @param pw password\n * @param callback\n */\n setPassword(username: string, pw: string, callback: ioBroker.ErrorCallback): void {\n const _user = username.replace(/\\s/g, '_').toLowerCase();\n\n this.objects.getObject(`system.user.${_user}`, (err, obj) => {\n if (err || !obj) {\n return tools.maybeCallbackWithError(callback, 'User does not exist');\n }\n\n password(pw).hash(null, null, (err, res) => {\n if (err) {\n return tools.maybeCallbackWithError(callback, err);\n }\n obj.common.password = res ?? '';\n obj.from = `system.host.${tools.getHostName()}.cli`;\n obj.ts = Date.now();\n this.objects.setObject(`system.user.${_user}`, obj, err => {\n return tools.maybeCallbackWithError(callback, err);\n });\n });\n });\n }\n\n /**\n * Checks if password is correct for given user\n *\n * @param username name of the user to check password\n * @param pw password\n * @param callback\n */\n checkPassword(username: string, pw: string, callback: (err?: Error | null, isOk?: boolean) => void): void {\n const _user = username.replace(/\\s/g, '_').toLowerCase();\n\n this.objects.getObject(`system.user.${_user}`, (err, obj) => {\n if (err || !obj) {\n return tools.maybeCallbackWithError(callback, 'User does not exist');\n }\n\n password(pw).check(obj.common.password, (err, res) => {\n return tools.maybeCallbackWithError(callback, err, res);\n });\n });\n }\n\n /**\n * Deletes user from system\n *\n * @param username name of the user to delete\n * @param callback\n */\n delUser(username: string, callback: ioBroker.ErrorCallback): void {\n if (!username) {\n return tools.maybeCallbackWithError(callback, 'Please define user name, like: \"userdel user\"');\n }\n\n const _user = username.replace(/\\s/g, '_').toLowerCase();\n\n this.objects.getObject(`system.user.${_user}`, (err, obj) => {\n if (err || !obj) {\n return tools.maybeCallbackWithError(callback, 'User does not exist');\n } else {\n if (obj.common.dontDelete) {\n return tools.maybeCallbackWithError(callback, 'Cannot delete user, while is system user');\n } else {\n this.objects.delObject('system.user.' + _user, err => {\n // Remove this user from all groups\n if (!err) {\n this.objects.getObjectList(\n { startkey: 'system.group.', endkey: 'system.group.\\u9999' },\n (err, groups) => {\n if (!groups) {\n return tools.maybeCallback(callback);\n }\n\n let count = 0;\n for (let i = 0; i < groups.rows.length; i++) {\n if (groups.rows[i].value.type !== 'group') {\n continue;\n }\n // find all groups\n if (\n groups.rows[i].value.common.members &&\n groups.rows[i].value.common.members.indexOf('system.user.' + _user) !== -1\n ) {\n const pos = groups.rows[i].value.common.members.indexOf(\n 'system.user.' + _user\n );\n groups.rows[i].value.common.members.splice(pos, 1);\n count++;\n groups.rows[i].value.from = 'system.host.' + tools.getHostName() + '.cli';\n groups.rows[i].value.ts = Date.now();\n this.objects.setObject(\n groups.rows[i].value._id,\n groups.rows[i].value,\n err => {\n if (!--count) {\n return tools.maybeCallbackWithError(callback, err);\n }\n }\n );\n }\n }\n if (!count) {\n return tools.maybeCallback(callback);\n }\n }\n );\n } else {\n return tools.maybeCallbackWithError(callback, err);\n }\n });\n }\n }\n });\n }\n\n /**\n * Adds user to given group\n *\n * @param username user which will be added to the group\n * @param groupName name of the group where the user will be added to\n * @param callback\n */\n addUserToGroup(username: string, groupName: string, callback: ioBroker.ErrorCallback): void {\n let _user = username.replace(/\\s/g, '_').toLowerCase();\n if (!groupName.startsWith('system.group.')) {\n groupName = `system.group.${groupName}`;\n }\n if (!_user.startsWith('system.user.')) {\n _user = `system.user.${_user}`;\n }\n\n this.objects.getObject(_user, (err, obj) => {\n if (err || !obj) {\n return tools.maybeCallbackWithError(callback, 'User does not exist');\n }\n this.objects.getObject(groupName, (err, obj) => {\n if (err || !obj) {\n return tools.maybeCallbackWithError(callback, 'Group does not exist');\n }\n obj.common = obj.common || {};\n obj.common.members = obj.common.members || [];\n\n if (obj.common.members.indexOf(_user) === -1) {\n obj.common.members.push(_user);\n obj.from = 'system.host.' + tools.getHostName() + '.cli';\n obj.ts = Date.now();\n this.objects.setObject(groupName, obj, err => {\n return tools.maybeCallbackWithError(callback, err);\n });\n } else {\n return tools.maybeCallback(callback);\n }\n });\n });\n }\n\n /**\n * Add user via CLI prompt\n *\n * @param username user which sohuld be created\n * @param groupName default group for the new user\n * @param password user password\n * @param callback\n */\n addUserPrompt(username: string, groupName: string, password: string, callback: ioBroker.ErrorCallback): void {\n if (!username) {\n return tools.maybeCallbackWithError(callback, 'Please define user name, like: \"adduser newUser\"');\n }\n\n // Check group\n if (groupName.substring(0, 13) !== 'system.group.') {\n groupName = `system.group.${groupName}`;\n }\n\n this.objects.getObject(groupName, (err, obj) => {\n if (!obj) {\n return tools.maybeCallbackWithError(callback, `Unknown group: ${groupName}`);\n }\n if (!password) {\n prompt.message = '';\n prompt.delimiter = '';\n const schema = {\n properties: {\n password: {\n description: 'Enter your password:',\n pattern: /^[^'\"]+$/,\n message: 'No \" are allowed',\n hidden: true\n },\n repeatPassword: {\n description: 'Repeat your password:',\n pattern: /^[^'\"]+$/,\n message: 'No \" are allowed',\n hidden: true\n }\n }\n };\n prompt.start();\n\n prompt.get(schema, (err, result) => {\n if (result) {\n if (result.password !== result.repeatPassword) {\n console.log('Passwords are not identical!');\n return void this.processExit(EXIT_CODES.INVALID_PASSWORD);\n }\n // @ts-expect-error external types problem?\n this.addUser(username, result.password, err => {\n if (err) {\n return tools.maybeCallbackWithError(callback, err);\n } else {\n this.addUserToGroup(username, groupName, err => {\n if (err) {\n return tools.maybeCallbackWithError(callback, err);\n } else {\n return tools.maybeCallback(callback);\n }\n });\n }\n });\n } else {\n return tools.maybeCallbackWithError(callback, err);\n }\n });\n } else {\n this.addUser(username, password, err => {\n if (err) {\n return tools.maybeCallbackWithError(callback, err);\n } else {\n this.addUserToGroup(username, groupName, err => {\n if (err) {\n return tools.maybeCallbackWithError(callback, err);\n } else {\n return tools.maybeCallback(callback);\n }\n });\n }\n });\n }\n });\n }\n\n /**\n * Set password of user\n *\n * @param username name of the user to set password for\n * @param password password of user\n * @param callback\n */\n async setUserPassword(username: string, password: string, callback: ioBroker.ErrorCallback): Promise<void> {\n if (!username) {\n return tools.maybeCallbackWithError(callback, 'Please define user name, like: \"passwd username\"');\n }\n\n const isExisting = await this.isUser(username);\n if (!isExisting) {\n return tools.maybeCallbackWithError(callback, `User \"${username}\" does not exist.`);\n } else {\n // Check group\n if (!password) {\n prompt.message = '';\n prompt.delimiter = '';\n const schema = {\n properties: {\n password: {\n description: 'Enter your password:',\n pattern: /^[^'\"]*$/,\n message: 'No \" are allowed',\n hidden: true\n },\n repeatPassword: {\n description: 'Repeat your password:',\n pattern: /^[^'\"]*$/,\n message: 'No \" are allowed',\n hidden: true\n }\n }\n };\n prompt.start();\n\n prompt.get(schema, (err, result) => {\n if (result) {\n if (result.password !== result.repeatPassword) {\n return tools.maybeCallbackWithError(callback, 'Passwords are not identical!');\n }\n // @ts-expect-error external types problem?\n this.setPassword(username, result.password, err => {\n if (err) {\n return tools.maybeCallbackWithError(callback, err);\n } else {\n return tools.maybeCallback(callback);\n }\n });\n } else {\n return tools.maybeCallbackWithError(callback, 'No password entered!');\n }\n });\n } else {\n this.setPassword(username, password, err => {\n if (err) {\n return tools.maybeCallbackWithError(callback, err);\n } else {\n return tools.maybeCallback(callback);\n }\n });\n }\n }\n }\n\n /**\n * Enable user\n *\n * @param username name of the user which will be activated\n * @param enable true if it should be enabled else false\n * @param callback\n */\n enableUser(username: string, enable: boolean, callback: ioBroker.ErrorCallback): void {\n if (!username) {\n return tools.maybeCallbackWithError(callback, 'Please define user name, like: \"enable username\"');\n }\n if (username.startsWith('system.user.')) {\n username = username.substring('system.user.'.length);\n }\n\n if (username === 'admin' && !enable) {\n return tools.maybeCallbackWithError(callback, 'User admin cannot be disabled');\n }\n\n this.objects.getObject(`system.user.${username}`, (err, obj) => {\n if (err) {\n return tools.maybeCallbackWithError(callback, `Cannot read user: ${err.message}`);\n }\n if (!obj) {\n return tools.maybeCallbackWithError(callback, `User \"${username}\" not found`);\n } else {\n obj.common.enabled = enable;\n obj.from = `system.host.${tools.getHostName()}.cli`;\n obj.ts = Date.now();\n this.objects.setObject(obj._id, obj, err => {\n return tools.maybeCallbackWithError(callback, err);\n });\n }\n });\n }\n\n /**\n * Check if user password is valid\n *\n * @param username name of the user to check password for\n * @param password password to check\n * @param callback\n */\n checkUserPassword(username: string, password: string, callback: ioBroker.ErrorCallback): void {\n let schema;\n if (!username && !password) {\n prompt.message = '';\n prompt.delimiter = '';\n schema = {\n properties: {\n username: {\n description: 'Enter username to check password:',\n pattern: /^[^'\"]+$/,\n message: 'No \" are allowed',\n hidden: false\n },\n password: {\n description: 'Enter current password:',\n pattern: /^[^'\"]+$/,\n message: 'No \" are allowed',\n hidden: true\n }\n }\n };\n prompt.start();\n\n prompt.get(schema, (err, result) => {\n this.checkPassword(result.username as string, result.password as string, (err, res) => {\n if (err || !res) {\n return tools.maybeCallbackWithError(\n callback,\n `Password for user \"${result.username as string}\" does not match${err ? ': ' + err : ''}`\n );\n } else {\n return tools.maybeCallbackWithError(callback, null);\n }\n });\n });\n } else if (!password) {\n prompt.message = '';\n prompt.delimiter = '';\n schema = {\n properties: {\n password: {\n description: 'Enter current password:',\n pattern: /^[^'\"]+$/,\n message: 'No \" are allowed',\n hidden: true\n }\n }\n };\n prompt.start();\n\n prompt.get(schema, (err, result) => {\n // @ts-expect-error external types problem?\n this.checkPassword(username, result.password, (err, res) => {\n if (err || !res) {\n return tools.maybeCallbackWithError(\n callback,\n `Password for user \"${username}\" does not matched${err ? ': ' + err : ''}`\n );\n } else {\n return tools.maybeCallbackWithError(callback, null);\n }\n });\n });\n } else {\n this.checkPassword(username, password, (err, res) => {\n if (err || !res) {\n return tools.maybeCallbackWithError(\n callback,\n 'Password for user \"' + username + '\" does not matched' + (err ? ': ' + err : '')\n );\n } else {\n return tools.maybeCallbackWithError(callback, null);\n }\n });\n }\n }\n\n /**\n * Get user object\n *\n * @param username name of the user to get object of\n * @param callback\n */\n getUser(username: string, callback: (err?: Error | null, enabled?: boolean) => void): void {\n this.objects.getObject(`system.user.${username}`, (err, obj) => {\n if (err) {\n return tools.maybeCallbackWithError(callback, `Cannot read user: ${err.message}`);\n }\n if (!obj) {\n return tools.maybeCallbackWithError(callback, `User \"${username}\" not found`);\n } else {\n return tools.maybeCallbackWithError(callback, null, obj.common.enabled);\n }\n });\n }\n\n /**\n * Get group object\n *\n * @param group groupname\n * @param callback\n */\n getGroup(group: string, callback: (err?: Error | null, enabled?: boolean, members?: string[]) => void): void {\n this.objects.getObject(`system.group.${group}`, (err, obj) => {\n if (err) {\n return tools.maybeCallbackWithError(callback, `Cannot read group: ${err.message}`);\n }\n if (!obj) {\n return tools.maybeCallbackWithError(callback, `Group \"${group}\" not found`);\n } else {\n return tools.maybeCallbackWithError(callback, null, obj.common.enabled, obj.common.members);\n }\n });\n }\n\n /**\n * Enable or disable group by name\n *\n * @param group groupname\n * @param enable if enable or disable\n * @param callback\n */\n enableGroup(group: string, enable: boolean, callback: ioBroker.ErrorCallback): void {\n if (!group) {\n return tools.maybeCallbackWithError(callback, 'Please define group name, like: \"enable groupname\"');\n }\n if (group.startsWith('system.group.')) {\n group = group.substring('system.group.'.length);\n }\n\n if (group === 'administrator' && !enable) {\n return tools.maybeCallbackWithError(callback, 'Group \"administrator\" cannot be disabled');\n }\n\n this.objects.getObject(`system.group.${group}`, (err, obj) => {\n if (err) {\n return tools.maybeCallbackWithError(callback, `Cannot read group: ${err.message}`);\n }\n if (!obj) {\n return tools.maybeCallbackWithError(callback, `Group \"${group}\" not found`);\n } else {\n obj.common.enabled = enable;\n obj.from = `system.host.${tools.getHostName()}.cli`;\n obj.ts = Date.now();\n this.objects.setObject(obj._id, obj, err => {\n return tools.maybeCallbackWithError(callback, err);\n });\n }\n });\n }\n\n /**\n * Add new group\n *\n * @param group groupname\n */\n async addGroup(group: string): Promise<void> {\n const _group = group.replace(/\\s/g, '_');\n const obj = await this.objects.getObject(`system.group.${_group}`);\n if (obj) {\n throw new Error('Group yet exists');\n } else {\n // TODO: shoudln't it have some default acl? TS is worrying\n await this.objects.setObject(`system.group.${_group}`, {\n type: 'group',\n common: {\n name: group,\n enabled: true,\n members: []\n },\n from: `system.host.${tools.getHostName()}.cli`,\n ts: Date.now(),\n native: {}\n } as any);\n }\n }\n\n /**\n * Remove group\n *\n * @param group groupname\n * @param callback\n */\n delGroup(group: string, callback: ioBroker.ErrorCallback): void {\n const _group = group.replace(/\\s/g, '_');\n\n if (group === 'administrator') {\n return tools.maybeCallbackWithError(callback, 'Group \"administrator\" cannot be deleted');\n } else {\n this.objects.getObject(`system.group.${_group}`, (err, obj) => {\n if (!obj) {\n return tools.maybeCallbackWithError(callback, 'Group does not exists');\n } else {\n this.objects.delObject(`system.group.${_group}`, err => {\n return tools.maybeCallbackWithError(callback, err);\n });\n }\n });\n }\n }\n\n /**\n * Remove user from given group\n *\n * @param username name of the user which will be removed from group\n * @param groupName name of the group user will be removed from\n * @param callback\n */\n removeUserFromGroup(username: string, groupName: string, callback: ioBroker.ErrorCallback): void {\n const _group = groupName.replace(/\\s/g, '_');\n this.objects.getObject(`system.group.${_group}`, (err, obj) => {\n if (!obj) {\n return tools.maybeCallbackWithError(callback, 'Group does not exists');\n } else {\n const pos = obj.common.members.indexOf(`system.user.${username}`);\n if (pos === -1) {\n return tools.maybeCallbackWithError(callback, 'User not in group');\n } else {\n obj.common.members.splice(pos, 1);\n obj.from = `system.host.${tools.getHostName()}.cli`;\n obj.ts = Date.now();\n this.objects.setObject(obj._id, obj, err => {\n return tools.maybeCallbackWithError(callback, err);\n });\n }\n }\n });\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import { password, tools, EXIT_CODES } from '@iobroker/js-controller-common';\nimport type { ProcessExitCallback } from '../_Types.js';\nimport type { Client as ObjectsRedisClient } from '@iobroker/db-objects-redis';\nimport prompt from 'prompt';\n\nexport interface CLIUsersOptions {\n processExit: ProcessExitCallback;\n objects: ObjectsRedisClient;\n}\n\n/** Return type of prompt.get() for user */\ntype UsernamePromptProps = { password: string; username: string };\n\nexport class Users {\n private readonly objects: ObjectsRedisClient;\n private readonly processExit: ProcessExitCallback;\n\n constructor(options: CLIUsersOptions) {\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.objects = options.objects;\n this.processExit = options.processExit;\n }\n\n /**\n * Adds new user to system\n *\n * @param username name of the user which will be added\n * @param pw password\n * @param callback\n */\n addUser(username: string, pw: string, callback: ioBroker.ErrorCallback): void {\n // user id's should be case insensitive\n const _user = username.replace(/\\s/g, '_').toLowerCase();\n this.objects.getObject(`system.user.${_user}`, (err, obj) => {\n if (obj) {\n return tools.maybeCallbackWithError(callback, 'User yet exists');\n } else {\n this.objects.setObject(\n `system.user.${_user}`,\n {\n type: 'user',\n common: {\n name: username,\n enabled: true,\n password: ''\n },\n from: `system.host.${tools.getHostName()}.cli`,\n ts: Date.now(),\n native: {}\n },\n err => {\n if (!err) {\n this.setPassword(username, pw, callback);\n } else {\n return tools.maybeCallbackWithError(callback, err);\n }\n }\n );\n }\n });\n }\n\n /**\n * Checks if user exists\n *\n * @param username name of the user to check existence of\n */\n async isUser(username: string): Promise<boolean> {\n const _user = username.replace(/\\s/g, '_').toLowerCase();\n let isExisting = false;\n try {\n isExisting = await this.objects.objectExists(`system.user.${_user}`);\n } catch {\n // ignore\n }\n\n return isExisting;\n }\n\n /**\n * Set password for specific user\n *\n * @param username name of the user to set password for\n * @param pw password\n * @param callback\n */\n setPassword(username: string, pw: string, callback: ioBroker.ErrorCallback): void {\n const _user = username.replace(/\\s/g, '_').toLowerCase();\n\n this.objects.getObject(`system.user.${_user}`, (err, obj) => {\n if (err || !obj) {\n return tools.maybeCallbackWithError(callback, 'User does not exist');\n }\n\n password(pw).hash(null, null, (err, res) => {\n if (err) {\n return tools.maybeCallbackWithError(callback, err);\n }\n obj.common.password = res ?? '';\n obj.from = `system.host.${tools.getHostName()}.cli`;\n obj.ts = Date.now();\n this.objects.setObject(`system.user.${_user}`, obj, err => {\n return tools.maybeCallbackWithError(callback, err);\n });\n });\n });\n }\n\n /**\n * Checks if password is correct for given user\n *\n * @param username name of the user to check password\n * @param pw password\n * @param callback\n */\n checkPassword(username: string, pw: string, callback: (err?: Error | null, isOk?: boolean) => void): void {\n const _user = username.replace(/\\s/g, '_').toLowerCase();\n\n this.objects.getObject(`system.user.${_user}`, (err, obj) => {\n if (err || !obj) {\n return tools.maybeCallbackWithError(callback, 'User does not exist');\n }\n\n password(pw).check(obj.common.password, (err, res) => {\n return tools.maybeCallbackWithError(callback, err, res);\n });\n });\n }\n\n /**\n * Deletes user from system\n *\n * @param username name of the user to delete\n * @param callback\n */\n delUser(username: string, callback: ioBroker.ErrorCallback): void {\n if (!username) {\n return tools.maybeCallbackWithError(callback, 'Please define user name, like: \"userdel user\"');\n }\n\n const _user = username.replace(/\\s/g, '_').toLowerCase();\n\n this.objects.getObject(`system.user.${_user}`, (err, obj) => {\n if (err || !obj) {\n return tools.maybeCallbackWithError(callback, 'User does not exist');\n } else {\n if (obj.common.dontDelete) {\n return tools.maybeCallbackWithError(callback, 'Cannot delete user, while is system user');\n } else {\n this.objects.delObject('system.user.' + _user, err => {\n // Remove this user from all groups\n if (!err) {\n this.objects.getObjectList(\n { startkey: 'system.group.', endkey: 'system.group.\\u9999' },\n (err, groups) => {\n if (!groups) {\n return tools.maybeCallback(callback);\n }\n\n let count = 0;\n for (let i = 0; i < groups.rows.length; i++) {\n if (groups.rows[i].value.type !== 'group') {\n continue;\n }\n // find all groups\n if (\n groups.rows[i].value.common.members &&\n groups.rows[i].value.common.members.indexOf('system.user.' + _user) !== -1\n ) {\n const pos = groups.rows[i].value.common.members.indexOf(\n 'system.user.' + _user\n );\n groups.rows[i].value.common.members.splice(pos, 1);\n count++;\n groups.rows[i].value.from = 'system.host.' + tools.getHostName() + '.cli';\n groups.rows[i].value.ts = Date.now();\n this.objects.setObject(\n groups.rows[i].value._id,\n groups.rows[i].value,\n err => {\n if (!--count) {\n return tools.maybeCallbackWithError(callback, err);\n }\n }\n );\n }\n }\n if (!count) {\n return tools.maybeCallback(callback);\n }\n }\n );\n } else {\n return tools.maybeCallbackWithError(callback, err);\n }\n });\n }\n }\n });\n }\n\n /**\n * Adds user to given group\n *\n * @param username user which will be added to the group\n * @param groupName name of the group where the user will be added to\n * @param callback\n */\n addUserToGroup(username: string, groupName: string, callback: ioBroker.ErrorCallback): void {\n let _user = username.replace(/\\s/g, '_').toLowerCase();\n if (!groupName.startsWith('system.group.')) {\n groupName = `system.group.${groupName}`;\n }\n if (!_user.startsWith('system.user.')) {\n _user = `system.user.${_user}`;\n }\n\n this.objects.getObject(_user, (err, obj) => {\n if (err || !obj) {\n return tools.maybeCallbackWithError(callback, 'User does not exist');\n }\n this.objects.getObject(groupName, (err, obj) => {\n if (err || !obj) {\n return tools.maybeCallbackWithError(callback, 'Group does not exist');\n }\n obj.common = obj.common || {};\n obj.common.members = obj.common.members || [];\n\n if (obj.common.members.indexOf(_user) === -1) {\n obj.common.members.push(_user);\n obj.from = 'system.host.' + tools.getHostName() + '.cli';\n obj.ts = Date.now();\n this.objects.setObject(groupName, obj, err => {\n return tools.maybeCallbackWithError(callback, err);\n });\n } else {\n return tools.maybeCallback(callback);\n }\n });\n });\n }\n\n /**\n * Add user via CLI prompt\n *\n * @param username user which sohuld be created\n * @param groupName default group for the new user\n * @param password user password\n * @param callback\n */\n addUserPrompt(username: string, groupName: string, password: string, callback: ioBroker.ErrorCallback): void {\n if (!username) {\n return tools.maybeCallbackWithError(callback, 'Please define user name, like: \"adduser newUser\"');\n }\n\n // Check group\n if (groupName.substring(0, 13) !== 'system.group.') {\n groupName = `system.group.${groupName}`;\n }\n\n this.objects.getObject(groupName, (err, obj) => {\n if (!obj) {\n return tools.maybeCallbackWithError(callback, `Unknown group: ${groupName}`);\n }\n if (!password) {\n prompt.message = '';\n prompt.delimiter = '';\n const schema = {\n properties: {\n password: {\n description: 'Enter your password:',\n pattern: /^[^'\"]+$/,\n message: 'No \" are allowed',\n hidden: true\n },\n repeatPassword: {\n description: 'Repeat your password:',\n pattern: /^[^'\"]+$/,\n message: 'No \" are allowed',\n hidden: true\n }\n }\n };\n prompt.start();\n\n prompt.get(schema, (err, result) => {\n if (result) {\n if (result.password !== result.repeatPassword) {\n console.log('Passwords are not identical!');\n return void this.processExit(EXIT_CODES.INVALID_PASSWORD);\n }\n // @ts-expect-error external types problem?\n this.addUser(username, result.password, err => {\n if (err) {\n return tools.maybeCallbackWithError(callback, err);\n } else {\n this.addUserToGroup(username, groupName, err => {\n if (err) {\n return tools.maybeCallbackWithError(callback, err);\n } else {\n return tools.maybeCallback(callback);\n }\n });\n }\n });\n } else {\n return tools.maybeCallbackWithError(callback, err);\n }\n });\n } else {\n this.addUser(username, password, err => {\n if (err) {\n return tools.maybeCallbackWithError(callback, err);\n } else {\n this.addUserToGroup(username, groupName, err => {\n if (err) {\n return tools.maybeCallbackWithError(callback, err);\n } else {\n return tools.maybeCallback(callback);\n }\n });\n }\n });\n }\n });\n }\n\n /**\n * Set password of user\n *\n * @param username name of the user to set password for\n * @param password password of user\n * @param callback\n */\n async setUserPassword(username: string, password: string, callback: ioBroker.ErrorCallback): Promise<void> {\n if (!username) {\n return tools.maybeCallbackWithError(callback, 'Please define user name, like: \"passwd username\"');\n }\n\n const isExisting = await this.isUser(username);\n if (!isExisting) {\n return tools.maybeCallbackWithError(callback, `User \"${username}\" does not exist.`);\n } else {\n // Check group\n if (!password) {\n prompt.message = '';\n prompt.delimiter = '';\n const schema = {\n properties: {\n password: {\n description: 'Enter your password:',\n pattern: /^[^'\"]*$/,\n message: 'No \" are allowed',\n hidden: true\n },\n repeatPassword: {\n description: 'Repeat your password:',\n pattern: /^[^'\"]*$/,\n message: 'No \" are allowed',\n hidden: true\n }\n }\n };\n prompt.start();\n\n prompt.get(schema, (err, result) => {\n if (result) {\n if (result.password !== result.repeatPassword) {\n return tools.maybeCallbackWithError(callback, 'Passwords are not identical!');\n }\n // @ts-expect-error external types problem?\n this.setPassword(username, result.password, err => {\n if (err) {\n return tools.maybeCallbackWithError(callback, err);\n } else {\n return tools.maybeCallback(callback);\n }\n });\n } else {\n return tools.maybeCallbackWithError(callback, 'No password entered!');\n }\n });\n } else {\n this.setPassword(username, password, err => {\n if (err) {\n return tools.maybeCallbackWithError(callback, err);\n } else {\n return tools.maybeCallback(callback);\n }\n });\n }\n }\n }\n\n /**\n * Enable user\n *\n * @param username name of the user which will be activated\n * @param enable true if it should be enabled else false\n * @param callback\n */\n enableUser(username: string, enable: boolean, callback: ioBroker.ErrorCallback): void {\n if (!username) {\n return tools.maybeCallbackWithError(callback, 'Please define user name, like: \"enable username\"');\n }\n if (username.startsWith('system.user.')) {\n username = username.substring('system.user.'.length);\n }\n\n if (username === 'admin' && !enable) {\n return tools.maybeCallbackWithError(callback, 'User admin cannot be disabled');\n }\n\n this.objects.getObject(`system.user.${username}`, (err, obj) => {\n if (err) {\n return tools.maybeCallbackWithError(callback, `Cannot read user: ${err.message}`);\n }\n if (!obj) {\n return tools.maybeCallbackWithError(callback, `User \"${username}\" not found`);\n } else {\n obj.common.enabled = enable;\n obj.from = `system.host.${tools.getHostName()}.cli`;\n obj.ts = Date.now();\n this.objects.setObject(obj._id, obj, err => {\n return tools.maybeCallbackWithError(callback, err);\n });\n }\n });\n }\n\n /**\n * Check if user password is valid\n *\n * @param username name of the user to check password for\n * @param password password to check\n * @param callback\n */\n checkUserPassword(username: string, password: string, callback: ioBroker.ErrorCallback): void {\n let schema;\n if (!username && !password) {\n prompt.message = '';\n prompt.delimiter = '';\n schema = {\n properties: {\n username: {\n description: 'Enter username to check password:',\n pattern: /^[^'\"]+$/,\n message: 'No \" are allowed',\n hidden: false\n },\n password: {\n description: 'Enter current password:',\n pattern: /^[^'\"]+$/,\n message: 'No \" are allowed',\n hidden: true\n }\n }\n };\n prompt.start();\n\n prompt.get<UsernamePromptProps>(schema, (err, result) => {\n this.checkPassword(result.username, result.password, (err, res) => {\n if (err || !res) {\n return tools.maybeCallbackWithError(\n callback,\n `Password for user \"${result.username as string}\" does not match${err ? `: ${err.message}` : ''}`\n );\n } else {\n return tools.maybeCallbackWithError(callback, null);\n }\n });\n });\n } else if (!password) {\n prompt.message = '';\n prompt.delimiter = '';\n schema = {\n properties: {\n password: {\n description: 'Enter current password:',\n pattern: /^[^'\"]+$/,\n message: 'No \" are allowed',\n hidden: true\n }\n }\n };\n prompt.start();\n\n prompt.get<UsernamePromptProps>(schema, (err, result) => {\n this.checkPassword(username, result.password, (err, res) => {\n if (err || !res) {\n return tools.maybeCallbackWithError(\n callback,\n `Password for user \"${username}\" does not match${err ? `: ${err.message}` : ''}`\n );\n } else {\n return tools.maybeCallbackWithError(callback, null);\n }\n });\n });\n } else {\n this.checkPassword(username, password, (err, res) => {\n if (err || !res) {\n return tools.maybeCallbackWithError(\n callback,\n `Password for user \"${username}\" does not match${err ? `: ${err.message}` : ''}`\n );\n } else {\n return tools.maybeCallbackWithError(callback, null);\n }\n });\n }\n }\n\n /**\n * Get user object\n *\n * @param username name of the user to get object of\n * @param callback\n */\n getUser(username: string, callback: (err?: Error | null, enabled?: boolean) => void): void {\n this.objects.getObject(`system.user.${username}`, (err, obj) => {\n if (err) {\n return tools.maybeCallbackWithError(callback, `Cannot read user: ${err.message}`);\n }\n if (!obj) {\n return tools.maybeCallbackWithError(callback, `User \"${username}\" not found`);\n } else {\n return tools.maybeCallbackWithError(callback, null, obj.common.enabled);\n }\n });\n }\n\n /**\n * Get group object\n *\n * @param group groupname\n * @param callback\n */\n getGroup(group: string, callback: (err?: Error | null, enabled?: boolean, members?: string[]) => void): void {\n this.objects.getObject(`system.group.${group}`, (err, obj) => {\n if (err) {\n return tools.maybeCallbackWithError(callback, `Cannot read group: ${err.message}`);\n }\n if (!obj) {\n return tools.maybeCallbackWithError(callback, `Group \"${group}\" not found`);\n } else {\n return tools.maybeCallbackWithError(callback, null, obj.common.enabled, obj.common.members);\n }\n });\n }\n\n /**\n * Enable or disable group by name\n *\n * @param group groupname\n * @param enable if enable or disable\n * @param callback\n */\n enableGroup(group: string, enable: boolean, callback: ioBroker.ErrorCallback): void {\n if (!group) {\n return tools.maybeCallbackWithError(callback, 'Please define group name, like: \"enable groupname\"');\n }\n if (group.startsWith('system.group.')) {\n group = group.substring('system.group.'.length);\n }\n\n if (group === 'administrator' && !enable) {\n return tools.maybeCallbackWithError(callback, 'Group \"administrator\" cannot be disabled');\n }\n\n this.objects.getObject(`system.group.${group}`, (err, obj) => {\n if (err) {\n return tools.maybeCallbackWithError(callback, `Cannot read group: ${err.message}`);\n }\n if (!obj) {\n return tools.maybeCallbackWithError(callback, `Group \"${group}\" not found`);\n } else {\n obj.common.enabled = enable;\n obj.from = `system.host.${tools.getHostName()}.cli`;\n obj.ts = Date.now();\n this.objects.setObject(obj._id, obj, err => {\n return tools.maybeCallbackWithError(callback, err);\n });\n }\n });\n }\n\n /**\n * Add new group\n *\n * @param group groupname\n */\n async addGroup(group: string): Promise<void> {\n const _group = group.replace(/\\s/g, '_');\n const obj = await this.objects.getObject(`system.group.${_group}`);\n if (obj) {\n throw new Error('Group yet exists');\n } else {\n // TODO: shoudln't it have some default acl? TS is worrying\n await this.objects.setObject(`system.group.${_group}`, {\n type: 'group',\n common: {\n name: group,\n enabled: true,\n members: []\n },\n from: `system.host.${tools.getHostName()}.cli`,\n ts: Date.now(),\n native: {}\n } as any);\n }\n }\n\n /**\n * Remove group\n *\n * @param group groupname\n * @param callback\n */\n delGroup(group: string, callback: ioBroker.ErrorCallback): void {\n const _group = group.replace(/\\s/g, '_');\n\n if (group === 'administrator') {\n return tools.maybeCallbackWithError(callback, 'Group \"administrator\" cannot be deleted');\n } else {\n this.objects.getObject(`system.group.${_group}`, (err, obj) => {\n if (!obj) {\n return tools.maybeCallbackWithError(callback, 'Group does not exists');\n } else {\n this.objects.delObject(`system.group.${_group}`, err => {\n return tools.maybeCallbackWithError(callback, err);\n });\n }\n });\n }\n }\n\n /**\n * Remove user from given group\n *\n * @param username name of the user which will be removed from group\n * @param groupName name of the group user will be removed from\n * @param callback\n */\n removeUserFromGroup(username: string, groupName: string, callback: ioBroker.ErrorCallback): void {\n const _group = groupName.replace(/\\s/g, '_');\n this.objects.getObject(`system.group.${_group}`, (err, obj) => {\n if (!obj) {\n return tools.maybeCallbackWithError(callback, 'Group does not exists');\n } else {\n const pos = obj.common.members.indexOf(`system.user.${username}`);\n if (pos === -1) {\n return tools.maybeCallbackWithError(callback, 'User not in group');\n } else {\n obj.common.members.splice(pos, 1);\n obj.from = `system.host.${tools.getHostName()}.cli`;\n obj.ts = Date.now();\n this.objects.setObject(obj._id, obj, err => {\n return tools.maybeCallbackWithError(callback, err);\n });\n }\n }\n });\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["err", "obj", "password", "prompt"]
|
|
7
7
|
}
|
package/build/cjs/lib/setup.js
CHANGED
|
@@ -1382,7 +1382,7 @@ ${import_js_controller_common.tools.appName} upload /file/picture.png /vis-2.0/m
|
|
|
1382
1382
|
} else if (command2 === "check") {
|
|
1383
1383
|
users.checkUserPassword(user, password, (err) => {
|
|
1384
1384
|
if (err) {
|
|
1385
|
-
console.error(err);
|
|
1385
|
+
console.error(err.message);
|
|
1386
1386
|
return void callback(import_js_controller_common2.EXIT_CODES.CANNOT_CREATE_USER_OR_GROUP);
|
|
1387
1387
|
} else {
|
|
1388
1388
|
console.log(`Password for user "${user}" matches.`);
|
|
@@ -1392,7 +1392,7 @@ ${import_js_controller_common.tools.appName} upload /file/picture.png /vis-2.0/m
|
|
|
1392
1392
|
} else if (command2 === "set" || command2 === "passwd") {
|
|
1393
1393
|
users.setUserPassword(user, password, (err) => {
|
|
1394
1394
|
if (err) {
|
|
1395
|
-
console.error(err);
|
|
1395
|
+
console.error(err.message);
|
|
1396
1396
|
return void callback(import_js_controller_common2.EXIT_CODES.CANNOT_CREATE_USER_OR_GROUP);
|
|
1397
1397
|
} else {
|
|
1398
1398
|
console.log(`Password for "${user}" was successfully set.`);
|
|
@@ -1402,7 +1402,7 @@ ${import_js_controller_common.tools.appName} upload /file/picture.png /vis-2.0/m
|
|
|
1402
1402
|
} else if (command2 === "enable" || command2 === "e") {
|
|
1403
1403
|
users.enableUser(user, true, (err) => {
|
|
1404
1404
|
if (err) {
|
|
1405
|
-
console.error(err);
|
|
1405
|
+
console.error(err.message);
|
|
1406
1406
|
return void callback(import_js_controller_common2.EXIT_CODES.CANNOT_CREATE_USER_OR_GROUP);
|
|
1407
1407
|
} else {
|
|
1408
1408
|
console.log(`User "${user}" was successfully enabled.`);
|
|
@@ -1412,7 +1412,7 @@ ${import_js_controller_common.tools.appName} upload /file/picture.png /vis-2.0/m
|
|
|
1412
1412
|
} else if (command2 === "disable" || command2 === "d") {
|
|
1413
1413
|
users.enableUser(user, false, (err) => {
|
|
1414
1414
|
if (err) {
|
|
1415
|
-
console.error(err);
|
|
1415
|
+
console.error(err.message);
|
|
1416
1416
|
return void callback(import_js_controller_common2.EXIT_CODES.CANNOT_CREATE_USER_OR_GROUP);
|
|
1417
1417
|
} else {
|
|
1418
1418
|
console.log(`User "${user}" was successfully disabled.`);
|
|
@@ -1422,7 +1422,7 @@ ${import_js_controller_common.tools.appName} upload /file/picture.png /vis-2.0/m
|
|
|
1422
1422
|
} else if (command2 === "get") {
|
|
1423
1423
|
users.getUser(user, (err, isEnabled) => {
|
|
1424
1424
|
if (err) {
|
|
1425
|
-
console.error(err);
|
|
1425
|
+
console.error(err.message);
|
|
1426
1426
|
return void callback(import_js_controller_common2.EXIT_CODES.CANNOT_CREATE_USER_OR_GROUP);
|
|
1427
1427
|
} else {
|
|
1428
1428
|
console.log(`User "${user}" is ${isEnabled ? "enabled" : "disabled"}`);
|