@iobroker/js-controller-cli 7.2.2 → 7.2.3-alpha.1-20260621-61726ea22

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.
Files changed (177) hide show
  1. package/build/cjs/lib/_Types.d.ts +7 -0
  2. package/build/cjs/lib/cli/cliCert.d.ts +5 -2
  3. package/build/cjs/lib/cli/cliCert.js +5 -2
  4. package/build/cjs/lib/cli/cliCert.js.map +2 -2
  5. package/build/cjs/lib/cli/cliCommand.d.ts +32 -1
  6. package/build/cjs/lib/cli/cliCommand.js +4 -1
  7. package/build/cjs/lib/cli/cliCommand.js.map +2 -2
  8. package/build/cjs/lib/cli/cliCompact.d.ts +4 -1
  9. package/build/cjs/lib/cli/cliCompact.js +4 -1
  10. package/build/cjs/lib/cli/cliCompact.js.map +2 -2
  11. package/build/cjs/lib/cli/cliDebug.d.ts +4 -1
  12. package/build/cjs/lib/cli/cliDebug.js +4 -1
  13. package/build/cjs/lib/cli/cliDebug.js.map +2 -2
  14. package/build/cjs/lib/cli/cliHost.d.ts +8 -5
  15. package/build/cjs/lib/cli/cliHost.js +8 -5
  16. package/build/cjs/lib/cli/cliHost.js.map +2 -2
  17. package/build/cjs/lib/cli/cliLogs.d.ts +4 -1
  18. package/build/cjs/lib/cli/cliLogs.js +4 -1
  19. package/build/cjs/lib/cli/cliLogs.js.map +2 -2
  20. package/build/cjs/lib/cli/cliMessage.d.ts +1 -0
  21. package/build/cjs/lib/cli/cliMessage.js.map +2 -2
  22. package/build/cjs/lib/cli/cliObjects.d.ts +12 -9
  23. package/build/cjs/lib/cli/cliObjects.js +12 -9
  24. package/build/cjs/lib/cli/cliObjects.js.map +2 -2
  25. package/build/cjs/lib/cli/cliPlugin.js.map +1 -1
  26. package/build/cjs/lib/cli/cliProcess.d.ts +4 -0
  27. package/build/cjs/lib/cli/cliProcess.js +3 -0
  28. package/build/cjs/lib/cli/cliProcess.js.map +2 -2
  29. package/build/cjs/lib/cli/cliStates.d.ts +3 -0
  30. package/build/cjs/lib/cli/cliStates.js +3 -0
  31. package/build/cjs/lib/cli/cliStates.js.map +2 -2
  32. package/build/cjs/lib/setup/customError.d.ts +4 -0
  33. package/build/cjs/lib/setup/customError.js +3 -0
  34. package/build/cjs/lib/setup/customError.js.map +2 -2
  35. package/build/cjs/lib/setup/formatters.d.ts +4 -4
  36. package/build/cjs/lib/setup/formatters.js.map +1 -1
  37. package/build/cjs/lib/setup/pluginInfos.d.ts +5 -0
  38. package/build/cjs/lib/setup/pluginInfos.js.map +2 -2
  39. package/build/cjs/lib/setup/setupBackup.d.ts +34 -0
  40. package/build/cjs/lib/setup/setupBackup.js +22 -0
  41. package/build/cjs/lib/setup/setupBackup.js.map +2 -2
  42. package/build/cjs/lib/setup/setupInstall.d.ts +37 -14
  43. package/build/cjs/lib/setup/setupInstall.js +28 -14
  44. package/build/cjs/lib/setup/setupInstall.js.map +2 -2
  45. package/build/cjs/lib/setup/setupLicense.d.ts +8 -0
  46. package/build/cjs/lib/setup/setupLicense.js +3 -0
  47. package/build/cjs/lib/setup/setupLicense.js.map +2 -2
  48. package/build/cjs/lib/setup/setupList.d.ts +54 -0
  49. package/build/cjs/lib/setup/setupList.js +51 -0
  50. package/build/cjs/lib/setup/setupList.js.map +2 -2
  51. package/build/cjs/lib/setup/setupPacketManager.d.ts +10 -0
  52. package/build/cjs/lib/setup/setupPacketManager.js +6 -0
  53. package/build/cjs/lib/setup/setupPacketManager.js.map +2 -2
  54. package/build/cjs/lib/setup/setupRepo.d.ts +6 -0
  55. package/build/cjs/lib/setup/setupRepo.js +3 -0
  56. package/build/cjs/lib/setup/setupRepo.js.map +2 -2
  57. package/build/cjs/lib/setup/setupSetup.d.ts +27 -0
  58. package/build/cjs/lib/setup/setupSetup.js +18 -0
  59. package/build/cjs/lib/setup/setupSetup.js.map +2 -2
  60. package/build/cjs/lib/setup/setupUpgrade.d.ts +6 -0
  61. package/build/cjs/lib/setup/setupUpgrade.js +3 -0
  62. package/build/cjs/lib/setup/setupUpgrade.js.map +2 -2
  63. package/build/cjs/lib/setup/setupUpload.d.ts +71 -0
  64. package/build/cjs/lib/setup/setupUpload.js +65 -1
  65. package/build/cjs/lib/setup/setupUpload.js.map +2 -2
  66. package/build/cjs/lib/setup/setupUsers.d.ts +23 -14
  67. package/build/cjs/lib/setup/setupUsers.js +17 -14
  68. package/build/cjs/lib/setup/setupUsers.js.map +2 -2
  69. package/build/cjs/lib/setup/setupVendor.d.ts +9 -1
  70. package/build/cjs/lib/setup/setupVendor.js +4 -1
  71. package/build/cjs/lib/setup/setupVendor.js.map +2 -2
  72. package/build/cjs/lib/setup/setupVisDebug.d.ts +9 -0
  73. package/build/cjs/lib/setup/setupVisDebug.js +3 -0
  74. package/build/cjs/lib/setup/setupVisDebug.js.map +2 -2
  75. package/build/esm/lib/_Types.d.ts +7 -0
  76. package/build/esm/lib/_Types.d.ts.map +1 -1
  77. package/build/esm/lib/cli/cliCert.d.ts +5 -2
  78. package/build/esm/lib/cli/cliCert.d.ts.map +1 -1
  79. package/build/esm/lib/cli/cliCert.js +5 -2
  80. package/build/esm/lib/cli/cliCert.js.map +1 -1
  81. package/build/esm/lib/cli/cliCommand.d.ts +32 -1
  82. package/build/esm/lib/cli/cliCommand.d.ts.map +1 -1
  83. package/build/esm/lib/cli/cliCommand.js +4 -1
  84. package/build/esm/lib/cli/cliCommand.js.map +1 -1
  85. package/build/esm/lib/cli/cliCompact.d.ts +4 -1
  86. package/build/esm/lib/cli/cliCompact.d.ts.map +1 -1
  87. package/build/esm/lib/cli/cliCompact.js +4 -1
  88. package/build/esm/lib/cli/cliCompact.js.map +1 -1
  89. package/build/esm/lib/cli/cliDebug.d.ts +4 -1
  90. package/build/esm/lib/cli/cliDebug.d.ts.map +1 -1
  91. package/build/esm/lib/cli/cliDebug.js +4 -1
  92. package/build/esm/lib/cli/cliDebug.js.map +1 -1
  93. package/build/esm/lib/cli/cliHost.d.ts +8 -5
  94. package/build/esm/lib/cli/cliHost.d.ts.map +1 -1
  95. package/build/esm/lib/cli/cliHost.js +8 -5
  96. package/build/esm/lib/cli/cliHost.js.map +1 -1
  97. package/build/esm/lib/cli/cliLogs.d.ts +4 -1
  98. package/build/esm/lib/cli/cliLogs.d.ts.map +1 -1
  99. package/build/esm/lib/cli/cliLogs.js +4 -1
  100. package/build/esm/lib/cli/cliLogs.js.map +1 -1
  101. package/build/esm/lib/cli/cliMessage.d.ts +1 -0
  102. package/build/esm/lib/cli/cliMessage.d.ts.map +1 -1
  103. package/build/esm/lib/cli/cliMessage.js +1 -0
  104. package/build/esm/lib/cli/cliMessage.js.map +1 -1
  105. package/build/esm/lib/cli/cliObjects.d.ts +12 -9
  106. package/build/esm/lib/cli/cliObjects.d.ts.map +1 -1
  107. package/build/esm/lib/cli/cliObjects.js +17 -14
  108. package/build/esm/lib/cli/cliObjects.js.map +1 -1
  109. package/build/esm/lib/cli/cliPlugin.js +1 -1
  110. package/build/esm/lib/cli/cliProcess.d.ts +4 -0
  111. package/build/esm/lib/cli/cliProcess.d.ts.map +1 -1
  112. package/build/esm/lib/cli/cliProcess.js +5 -1
  113. package/build/esm/lib/cli/cliProcess.js.map +1 -1
  114. package/build/esm/lib/cli/cliStates.d.ts +3 -0
  115. package/build/esm/lib/cli/cliStates.d.ts.map +1 -1
  116. package/build/esm/lib/cli/cliStates.js +3 -0
  117. package/build/esm/lib/cli/cliStates.js.map +1 -1
  118. package/build/esm/lib/setup/customError.d.ts +4 -0
  119. package/build/esm/lib/setup/customError.d.ts.map +1 -1
  120. package/build/esm/lib/setup/customError.js +3 -0
  121. package/build/esm/lib/setup/customError.js.map +1 -1
  122. package/build/esm/lib/setup/formatters.d.ts +4 -4
  123. package/build/esm/lib/setup/formatters.js +4 -4
  124. package/build/esm/lib/setup/pluginInfos.d.ts +5 -0
  125. package/build/esm/lib/setup/pluginInfos.d.ts.map +1 -1
  126. package/build/esm/lib/setup/pluginInfos.js +5 -0
  127. package/build/esm/lib/setup/pluginInfos.js.map +1 -1
  128. package/build/esm/lib/setup/setupBackup.d.ts +34 -0
  129. package/build/esm/lib/setup/setupBackup.d.ts.map +1 -1
  130. package/build/esm/lib/setup/setupBackup.js +25 -0
  131. package/build/esm/lib/setup/setupBackup.js.map +1 -1
  132. package/build/esm/lib/setup/setupInstall.d.ts +37 -14
  133. package/build/esm/lib/setup/setupInstall.d.ts.map +1 -1
  134. package/build/esm/lib/setup/setupInstall.js +31 -14
  135. package/build/esm/lib/setup/setupInstall.js.map +1 -1
  136. package/build/esm/lib/setup/setupLicense.d.ts +8 -0
  137. package/build/esm/lib/setup/setupLicense.d.ts.map +1 -1
  138. package/build/esm/lib/setup/setupLicense.js +6 -0
  139. package/build/esm/lib/setup/setupLicense.js.map +1 -1
  140. package/build/esm/lib/setup/setupList.d.ts +54 -0
  141. package/build/esm/lib/setup/setupList.d.ts.map +1 -1
  142. package/build/esm/lib/setup/setupList.js +54 -0
  143. package/build/esm/lib/setup/setupList.js.map +1 -1
  144. package/build/esm/lib/setup/setupPacketManager.d.ts +10 -0
  145. package/build/esm/lib/setup/setupPacketManager.d.ts.map +1 -1
  146. package/build/esm/lib/setup/setupPacketManager.js +9 -0
  147. package/build/esm/lib/setup/setupPacketManager.js.map +1 -1
  148. package/build/esm/lib/setup/setupRepo.d.ts +6 -0
  149. package/build/esm/lib/setup/setupRepo.d.ts.map +1 -1
  150. package/build/esm/lib/setup/setupRepo.js +6 -0
  151. package/build/esm/lib/setup/setupRepo.js.map +1 -1
  152. package/build/esm/lib/setup/setupSetup.d.ts +27 -0
  153. package/build/esm/lib/setup/setupSetup.d.ts.map +1 -1
  154. package/build/esm/lib/setup/setupSetup.js +21 -0
  155. package/build/esm/lib/setup/setupSetup.js.map +1 -1
  156. package/build/esm/lib/setup/setupUpgrade.d.ts +6 -0
  157. package/build/esm/lib/setup/setupUpgrade.d.ts.map +1 -1
  158. package/build/esm/lib/setup/setupUpgrade.js +6 -0
  159. package/build/esm/lib/setup/setupUpgrade.js.map +1 -1
  160. package/build/esm/lib/setup/setupUpload.d.ts +71 -0
  161. package/build/esm/lib/setup/setupUpload.d.ts.map +1 -1
  162. package/build/esm/lib/setup/setupUpload.js +68 -1
  163. package/build/esm/lib/setup/setupUpload.js.map +1 -1
  164. package/build/esm/lib/setup/setupUsers.d.ts +23 -14
  165. package/build/esm/lib/setup/setupUsers.d.ts.map +1 -1
  166. package/build/esm/lib/setup/setupUsers.js +20 -14
  167. package/build/esm/lib/setup/setupUsers.js.map +1 -1
  168. package/build/esm/lib/setup/setupVendor.d.ts +9 -1
  169. package/build/esm/lib/setup/setupVendor.d.ts.map +1 -1
  170. package/build/esm/lib/setup/setupVendor.js +7 -1
  171. package/build/esm/lib/setup/setupVendor.js.map +1 -1
  172. package/build/esm/lib/setup/setupVisDebug.d.ts +9 -0
  173. package/build/esm/lib/setup/setupVisDebug.d.ts.map +1 -1
  174. package/build/esm/lib/setup/setupVisDebug.js +6 -0
  175. package/build/esm/lib/setup/setupVisDebug.js.map +1 -1
  176. package/build/tsconfig.build.tsbuildinfo +1 -1
  177. package/package.json +4 -4
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/lib/cli/cliProcess.ts"],
4
- "sourcesContent": ["import fs from 'fs-extra';\nimport path from 'node:path';\nimport os from 'node:os';\nimport { spawn } from 'node:child_process';\nimport deepClone from 'deep-clone';\nimport { setTimeout as wait } from 'node:timers/promises';\n\nimport {\n isLocalStatesDbServer,\n isLocalObjectsDbServer,\n getInstancesOrderedByStartPrio,\n} from '@iobroker/js-controller-common';\nimport { tools, EXIT_CODES } from '@iobroker/js-controller-common';\nimport * as CLI from '@/lib/cli/messages.js';\nimport { CLICommand } from '@/lib/cli/cliCommand.js';\nimport { getObjectFrom, getInstanceName, normalizeAdapterName, enumInstances } from '@/lib/cli/cliTools.js';\nimport type { Client as ObjectsClient } from '@iobroker/db-objects-redis';\nimport type { Client as StatesClient } from '@iobroker/db-states-redis';\nimport type { CLICommandOptions } from '@/lib/cli/cliCommand.js';\n\n/** Time to wait after killing pid until process is assumed as stopped */\nconst TRY_KILL_WAIT_MS = 5_000;\n\n// The root of this project. Change this when moving code to another directory\nconst rootDir = tools.getControllerDir();\nconst killAllScriptPath = path.join(rootDir, 'killall.sh');\n\nexport class CLIProcess extends CLICommand {\n constructor(options: CLICommandOptions) {\n super(options);\n }\n\n // These CLI commands have no subcommands, but belong together thematically\n // (start/stop/restart/status)\n\n /**\n * Starts one or more adapters or the js-controller\n *\n * @param args parsed cli arguments\n */\n async start(args: any[]): Promise<void> {\n const adapterName = normalizeAdapterName(args[0]);\n if (!adapterName) {\n await this.startJSController();\n this.options.callback();\n } else if (adapterName === 'all') {\n this.setAllAdaptersEnabled(true);\n } else if (/\\.\\d+$/.test(adapterName)) {\n this.setAdapterInstanceEnabled(adapterName, true);\n } else {\n this.setAdapterEnabled(adapterName, true);\n }\n }\n\n /**\n * Restarts one or more instances or the js-controller\n *\n * @param args parsed cli arguments\n */\n async restart(args: any[]): Promise<void> {\n const adapterName = normalizeAdapterName(args[0]);\n if (!adapterName) {\n await this.restartJSController();\n this.options.callback();\n } else if (/\\.\\d+$/.test(adapterName)) {\n this.setAdapterInstanceEnabled(adapterName, true, /* restartIfRunning */ true);\n } else {\n this.setAdapterEnabled(adapterName, true, /* restartIfRunning */ true);\n }\n }\n\n /**\n * Stops one or more adapters or the js-controller\n *\n * @param args parsed cli arguments\n */\n async stop(args: any[]): Promise<void> {\n const adapterName = normalizeAdapterName(args[0]);\n if (adapterName === undefined) {\n await CLIProcess.stopJSController();\n this.options.callback();\n } else if (adapterName === 'all') {\n this.setAllAdaptersEnabled(false);\n } else if (/\\.\\d+$/.test(adapterName)) {\n this.setAdapterInstanceEnabled(adapterName, false);\n } else {\n this.setAdapterEnabled(adapterName, false);\n }\n }\n\n /**\n * Starts or stops all adapters\n *\n * @param enabled if adapters should be started or stopped\n */\n setAllAdaptersEnabled(enabled: boolean): void {\n const { callback, dbConnect } = this.options;\n dbConnect(async params => {\n const { objects } = params;\n // Enumerate all adapter instances\n const instances = await getInstancesOrderedByStartPrio(objects, console);\n // Create a promise for each. setInstanceEnabled only starts/stops when necessary\n const instancePromises = instances\n .filter(obj => obj.common.enabled !== enabled)\n .map(obj => setInstanceEnabled(objects, obj, enabled));\n // wait for all instances to be started/stopped\n await Promise.all(instancePromises);\n callback();\n });\n }\n\n /**\n * Starts or stops a single or all instances of adapter.\n * If there are multiple instances, all will be started/stopped/restarted\n *\n * @param adapter The adapter to start\n * @param enabled If adapter should be started or stopped\n * @param [restartIfRunning] Whether running instances should be restarted\n */\n setAdapterEnabled(adapter: string, enabled: boolean, restartIfRunning?: boolean): void {\n const { callback, dbConnect } = this.options;\n dbConnect(async params => {\n const { objects } = params;\n\n try {\n // Enumerate all adapter instances\n const adapterInstances = await enumInstances(objects, adapter);\n if (adapterInstances.length === 0) {\n CLI.error.noInstancesFound(adapter);\n return void callback(EXIT_CODES.UNKNOWN_ERROR);\n }\n for (const instance of adapterInstances) {\n await setInstanceEnabled(objects, instance, enabled, restartIfRunning);\n }\n return void callback();\n } catch (e) {\n CLI.error.unknown(e.message);\n return void callback(EXIT_CODES.UNKNOWN_ERROR);\n }\n });\n }\n\n /**\n * Starts or stops a specific adapter instance\n *\n * @param instance The instance to start, e.g. \"adaptername.0\"\n * @param enabled If the instance should be started or stopped\n * @param [restartIfRunning] Whether running instances should be restarted\n */\n setAdapterInstanceEnabled(instance: string, enabled: boolean, restartIfRunning?: boolean): void {\n const { callback, dbConnect } = this.options;\n dbConnect(async params => {\n const { objects } = params;\n\n const obj = (await objects.getObject(`system.adapter.${instance}`)) as\n | ioBroker.InstanceObject\n | ioBroker.AdapterObject;\n\n if (!obj || obj.type !== 'instance') {\n CLI.error.invalidInstance(instance);\n return void callback();\n }\n\n try {\n await setInstanceEnabled(objects, obj, enabled, restartIfRunning);\n return void callback();\n } catch (e) {\n CLI.error.unknown(e.message);\n return void callback(EXIT_CODES.UNKNOWN_ERROR);\n }\n });\n }\n\n /**\n * Starts the JS controller\n */\n async startJSController(): Promise<void> {\n let memoryLimitMB = 0;\n try {\n const config: ioBroker.IoBrokerJson = fs.readJSONSync(tools.getConfigFileName(), { encoding: 'utf-8' });\n if (config?.system?.memoryLimitMB) {\n memoryLimitMB = Math.round(config.system.memoryLimitMB);\n }\n } catch {\n console.warn('Cannot read memoryLimitMB');\n console.warn(\n `May be config file does not exist.\\nPlease call \"${tools.appName} setup first\" to initialize the settings.`,\n );\n }\n\n let pid: number | undefined;\n try {\n pid = await tools.getControllerPid();\n } catch (e) {\n console.error(`Could not read pid file: ${e.message}`);\n }\n\n if (pid) {\n console.log(`Controller is already running with pid ${pid}`);\n return;\n }\n\n const args = [path.join(rootDir, 'controller.js')];\n if (memoryLimitMB) {\n args.push(`--max-old-space-size=${memoryLimitMB}`);\n }\n\n const child = spawn(process.execPath, args, {\n env: process.env,\n detached: true,\n stdio: ['ignore', 'ignore', 'ignore', 'ipc'],\n windowsHide: true,\n cwd: rootDir,\n });\n\n child.unref();\n }\n\n /**\n * Stops the JS controller\n */\n static async stopJSController(): Promise<void> {\n let pid: number | undefined;\n try {\n pid = await tools.getControllerPid();\n } catch (e) {\n console.error(`Could not read pid file: ${e.message}`);\n }\n\n if (!pid) {\n return;\n }\n\n await tryKill(pid);\n\n // On non-Windows OSes start a KILLALL script\n // to make sure nothing keeps running\n if (os.platform() !== 'win32') {\n let data = '';\n if (fs.existsSync(killAllScriptPath)) {\n fs.chmodSync(killAllScriptPath, '777');\n const child = spawn(killAllScriptPath, [], { windowsHide: true });\n child.stdout.on('data', _data => (data += _data.toString().replace(/\\n/g, '')));\n child.stderr.on('data', _data => (data += _data.toString().replace(/\\n/g, '')));\n return new Promise(resolve => {\n child.on('exit', exitCode => {\n console.log(`Exit code for \"killall.sh\": ${exitCode}`);\n resolve();\n });\n });\n }\n console.log('No \"killall.sh\" script found. Just stop.');\n }\n\n try {\n // delete pids.txt file\n fs.unlinkSync(tools.getPidsFileName());\n } catch {\n // ignore\n }\n }\n\n /** Restarts the JS controller */\n async restartJSController(): Promise<void> {\n await CLIProcess.stopJSController();\n await this.startJSController();\n }\n\n /**\n * Checks if ioBroker is running or not\n *\n * @param args parsed cli arguments\n */\n status(args: any[]): void {\n const { callback, dbConnect } = this.options;\n const adapterName = normalizeAdapterName(args[0]);\n const showEntireConfig = adapterName === 'all';\n\n dbConnect(async params => {\n const { objects, states, config, isOffline } = params;\n\n if (!adapterName || showEntireConfig) {\n // we want host info or/and whole config\n const hostAlive = await states.getState(`system.host.${tools.getHostName()}.alive`);\n\n const alive = hostAlive ? (hostAlive.val as boolean) : false;\n CLI.success.controllerStatus(alive);\n console.log();\n\n const hasLocalStatesServer = await isLocalStatesDbServer(config.states.type, config.states.host);\n const hasLocalObjectsServer = await isLocalObjectsDbServer(config.objects.type, config.objects.host);\n\n if (!hasLocalStatesServer && !hasLocalObjectsServer) {\n CLI.success.systemStatus(!isOffline);\n }\n\n console.log();\n if (showEntireConfig) {\n await showAllInstancesStatus(states, objects);\n console.log();\n showConfig(config);\n } else {\n console.log(`Objects type: ${config.objects.type}`);\n console.log(`States type: ${config.states.type}`);\n }\n return void callback(isOffline ? EXIT_CODES.CONTROLLER_NOT_RUNNING : undefined);\n }\n // we want to know the status of an adapter\n if (/\\.\\d+$/.test(adapterName)) {\n // instance specified\n await showInstanceStatus(states, adapterName);\n return void callback();\n }\n const adapterInstances = await enumInstances(objects, adapterName);\n // If there are multiple instances of this adapter, ask the user to specify which one\n if (adapterInstances.length > 1) {\n CLI.error.specifyInstance(\n adapterName,\n adapterInstances.map(obj => obj._id.substring('system.adapter.'.length)),\n );\n return void callback(EXIT_CODES.INVALID_ADAPTER_ID);\n } else if (adapterInstances.length === 0) {\n CLI.error.noInstancesFound(adapterName);\n return void callback(EXIT_CODES.UNKNOWN_ERROR);\n }\n\n const instanceId = adapterInstances[0]._id.split('.').pop();\n await showInstanceStatus(states, `${adapterName}.${instanceId}`);\n return void callback();\n });\n }\n}\n\n/**\n * Outputs the status of all existing adapter instances\n *\n * @param states The States DB\n * @param objects The Objects DB\n */\nasync function showAllInstancesStatus(states: StatesClient, objects: ObjectsClient): Promise<void> {\n const allInstances = await enumInstances(objects);\n for (const instance of allInstances) {\n const instanceId = instance._id.split('.').pop();\n await showInstanceStatus(states, `${instance.common.name}.${instanceId}`);\n }\n return Promise.resolve();\n}\n\n/**\n * Outputs the status of an adapter instance\n *\n * @param states the states object\n * @param adapterInstance <adapterName>.<instanceId>\n */\nasync function showInstanceStatus(states: StatesClient, adapterInstance: string): Promise<void> {\n const state = await states.getState(`system.adapter.${adapterInstance}.alive`);\n if (state?.val === true) {\n console.log(`Instance \"${adapterInstance}\" is running`);\n } else {\n console.log(`Instance \"${adapterInstance}\" is not running`);\n }\n}\n\n/**\n * Prints the config file to the console\n *\n * @param config the ioBroker json file content\n * @param root\n */\nfunction showConfig(config: ioBroker.IoBrokerJson, root?: string[]): void {\n if (!tools.isObject(config)) {\n return;\n }\n root = root || [];\n const prefix = root.join('/').toUpperCase();\n for (const attr of Object.keys(config)) {\n if (attr.match(/comment$/i)) {\n continue;\n }\n if (typeof (config as Record<string, any>)[attr] === 'object') {\n const nextRoot = deepClone(root);\n nextRoot.push(attr);\n showConfig((config as Record<string, any>)[attr], nextRoot);\n } else {\n console.log(`${prefix}${(prefix ? '/' : '') + attr}: ${(config as Record<string, any>)[attr]}`);\n }\n }\n}\n\n/**\n * Sets the enabled state of an instance to the given value\n *\n * @param objects The objects DB\n * @param instanceObj The instance object to change\n * @param enabled Whether the instance should be enabled or not\n * @param force Whether the object should be updated always\n */\nasync function setInstanceEnabled(\n objects: ObjectsClient,\n instanceObj: ioBroker.InstanceObject,\n enabled: boolean,\n force?: boolean,\n): Promise<void> {\n if (!force && instanceObj.common.enabled === enabled) {\n return;\n }\n\n instanceObj.common.enabled = enabled;\n instanceObj.from = getObjectFrom();\n instanceObj.ts = Date.now();\n await objects.setObject(instanceObj._id, instanceObj);\n const instanceName = getInstanceName(instanceObj._id);\n if (enabled) {\n CLI.success.adapterStarted(instanceName);\n } else {\n CLI.success.adapterStopped(instanceName);\n }\n}\n\n/**\n * Kills a process by its PID\n *\n * @param pid The PID of the process to kill\n */\nasync function tryKill(pid: number): Promise<void> {\n try {\n process.kill(pid, 'SIGTERM');\n } catch (e) {\n console.warn(`Could not send \"SIGTERM\" to process ${pid}: ${e.message}`);\n }\n\n await wait(TRY_KILL_WAIT_MS);\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import fs from 'fs-extra';\nimport path from 'node:path';\nimport os from 'node:os';\nimport { spawn } from 'node:child_process';\nimport deepClone from 'deep-clone';\nimport { setTimeout as wait } from 'node:timers/promises';\n\nimport {\n isLocalStatesDbServer,\n isLocalObjectsDbServer,\n getInstancesOrderedByStartPrio,\n} from '@iobroker/js-controller-common';\nimport { tools, EXIT_CODES } from '@iobroker/js-controller-common';\nimport * as CLI from '@/lib/cli/messages.js';\nimport { CLICommand } from '@/lib/cli/cliCommand.js';\nimport { getObjectFrom, getInstanceName, normalizeAdapterName, enumInstances } from '@/lib/cli/cliTools.js';\nimport type { Client as ObjectsClient } from '@iobroker/db-objects-redis';\nimport type { Client as StatesClient } from '@iobroker/db-states-redis';\nimport type { CLICommandOptions } from '@/lib/cli/cliCommand.js';\n\n/** Time to wait after killing pid until process is assumed as stopped */\nconst TRY_KILL_WAIT_MS = 5_000;\n\n// The root of this project. Change this when moving code to another directory\nconst rootDir = tools.getControllerDir();\nconst killAllScriptPath = path.join(rootDir, 'killall.sh');\n\n/** Command ioBroker process control (start/stop/restart/status) ... */\nexport class CLIProcess extends CLICommand {\n /**\n * @param options The command options including context and parameters\n */\n constructor(options: CLICommandOptions) {\n super(options);\n }\n\n // These CLI commands have no subcommands, but belong together thematically\n // (start/stop/restart/status)\n\n /**\n * Starts one or more adapters or the js-controller\n *\n * @param args parsed cli arguments\n */\n async start(args: any[]): Promise<void> {\n const adapterName = normalizeAdapterName(args[0]);\n if (!adapterName) {\n await this.startJSController();\n this.options.callback();\n } else if (adapterName === 'all') {\n this.setAllAdaptersEnabled(true);\n } else if (/\\.\\d+$/.test(adapterName)) {\n this.setAdapterInstanceEnabled(adapterName, true);\n } else {\n this.setAdapterEnabled(adapterName, true);\n }\n }\n\n /**\n * Restarts one or more instances or the js-controller\n *\n * @param args parsed cli arguments\n */\n async restart(args: any[]): Promise<void> {\n const adapterName = normalizeAdapterName(args[0]);\n if (!adapterName) {\n await this.restartJSController();\n this.options.callback();\n } else if (/\\.\\d+$/.test(adapterName)) {\n this.setAdapterInstanceEnabled(adapterName, true, /* restartIfRunning */ true);\n } else {\n this.setAdapterEnabled(adapterName, true, /* restartIfRunning */ true);\n }\n }\n\n /**\n * Stops one or more adapters or the js-controller\n *\n * @param args parsed cli arguments\n */\n async stop(args: any[]): Promise<void> {\n const adapterName = normalizeAdapterName(args[0]);\n if (adapterName === undefined) {\n await CLIProcess.stopJSController();\n this.options.callback();\n } else if (adapterName === 'all') {\n this.setAllAdaptersEnabled(false);\n } else if (/\\.\\d+$/.test(adapterName)) {\n this.setAdapterInstanceEnabled(adapterName, false);\n } else {\n this.setAdapterEnabled(adapterName, false);\n }\n }\n\n /**\n * Starts or stops all adapters\n *\n * @param enabled if adapters should be started or stopped\n */\n setAllAdaptersEnabled(enabled: boolean): void {\n const { callback, dbConnect } = this.options;\n dbConnect(async params => {\n const { objects } = params;\n // Enumerate all adapter instances\n const instances = await getInstancesOrderedByStartPrio(objects, console);\n // Create a promise for each. setInstanceEnabled only starts/stops when necessary\n const instancePromises = instances\n .filter(obj => obj.common.enabled !== enabled)\n .map(obj => setInstanceEnabled(objects, obj, enabled));\n // wait for all instances to be started/stopped\n await Promise.all(instancePromises);\n callback();\n });\n }\n\n /**\n * Starts or stops a single or all instances of adapter.\n * If there are multiple instances, all will be started/stopped/restarted\n *\n * @param adapter The adapter to start\n * @param enabled If adapter should be started or stopped\n * @param [restartIfRunning] Whether running instances should be restarted\n */\n setAdapterEnabled(adapter: string, enabled: boolean, restartIfRunning?: boolean): void {\n const { callback, dbConnect } = this.options;\n dbConnect(async params => {\n const { objects } = params;\n\n try {\n // Enumerate all adapter instances\n const adapterInstances = await enumInstances(objects, adapter);\n if (adapterInstances.length === 0) {\n CLI.error.noInstancesFound(adapter);\n return void callback(EXIT_CODES.UNKNOWN_ERROR);\n }\n for (const instance of adapterInstances) {\n await setInstanceEnabled(objects, instance, enabled, restartIfRunning);\n }\n return void callback();\n } catch (e) {\n CLI.error.unknown(e.message);\n return void callback(EXIT_CODES.UNKNOWN_ERROR);\n }\n });\n }\n\n /**\n * Starts or stops a specific adapter instance\n *\n * @param instance The instance to start, e.g. \"adaptername.0\"\n * @param enabled If the instance should be started or stopped\n * @param [restartIfRunning] Whether running instances should be restarted\n */\n setAdapterInstanceEnabled(instance: string, enabled: boolean, restartIfRunning?: boolean): void {\n const { callback, dbConnect } = this.options;\n dbConnect(async params => {\n const { objects } = params;\n\n const obj = (await objects.getObject(`system.adapter.${instance}`)) as\n | ioBroker.InstanceObject\n | ioBroker.AdapterObject;\n\n if (!obj || obj.type !== 'instance') {\n CLI.error.invalidInstance(instance);\n return void callback();\n }\n\n try {\n await setInstanceEnabled(objects, obj, enabled, restartIfRunning);\n return void callback();\n } catch (e) {\n CLI.error.unknown(e.message);\n return void callback(EXIT_CODES.UNKNOWN_ERROR);\n }\n });\n }\n\n /**\n * Starts the JS controller\n */\n async startJSController(): Promise<void> {\n let memoryLimitMB = 0;\n try {\n const config: ioBroker.IoBrokerJson = fs.readJSONSync(tools.getConfigFileName(), { encoding: 'utf-8' });\n if (config?.system?.memoryLimitMB) {\n memoryLimitMB = Math.round(config.system.memoryLimitMB);\n }\n } catch {\n console.warn('Cannot read memoryLimitMB');\n console.warn(\n `May be config file does not exist.\\nPlease call \"${tools.appName} setup first\" to initialize the settings.`,\n );\n }\n\n let pid: number | undefined;\n try {\n pid = await tools.getControllerPid();\n } catch (e) {\n console.error(`Could not read pid file: ${e.message}`);\n }\n\n if (pid) {\n console.log(`Controller is already running with pid ${pid}`);\n return;\n }\n\n const args = [path.join(rootDir, 'controller.js')];\n if (memoryLimitMB) {\n args.push(`--max-old-space-size=${memoryLimitMB}`);\n }\n\n const child = spawn(process.execPath, args, {\n env: process.env,\n detached: true,\n stdio: ['ignore', 'ignore', 'ignore', 'ipc'],\n windowsHide: true,\n cwd: rootDir,\n });\n\n child.unref();\n }\n\n /**\n * Stops the JS controller\n */\n static async stopJSController(): Promise<void> {\n let pid: number | undefined;\n try {\n pid = await tools.getControllerPid();\n } catch (e) {\n console.error(`Could not read pid file: ${e.message}`);\n }\n\n if (!pid) {\n return;\n }\n\n await tryKill(pid);\n\n // On non-Windows OSes start a KILLALL script\n // to make sure nothing keeps running\n if (os.platform() !== 'win32') {\n let data = '';\n if (fs.existsSync(killAllScriptPath)) {\n fs.chmodSync(killAllScriptPath, '777');\n const child = spawn(killAllScriptPath, [], { windowsHide: true });\n child.stdout.on('data', _data => (data += _data.toString().replace(/\\n/g, '')));\n child.stderr.on('data', _data => (data += _data.toString().replace(/\\n/g, '')));\n return new Promise(resolve => {\n child.on('exit', exitCode => {\n console.log(`Exit code for \"killall.sh\": ${exitCode}`);\n resolve();\n });\n });\n }\n console.log('No \"killall.sh\" script found. Just stop.');\n }\n\n try {\n // delete pids.txt file\n fs.unlinkSync(tools.getPidsFileName());\n } catch {\n // ignore\n }\n }\n\n /** Restarts the JS controller */\n async restartJSController(): Promise<void> {\n await CLIProcess.stopJSController();\n await this.startJSController();\n }\n\n /**\n * Checks if ioBroker is running or not\n *\n * @param args parsed cli arguments\n */\n status(args: any[]): void {\n const { callback, dbConnect } = this.options;\n const adapterName = normalizeAdapterName(args[0]);\n const showEntireConfig = adapterName === 'all';\n\n dbConnect(async params => {\n const { objects, states, config, isOffline } = params;\n\n if (!adapterName || showEntireConfig) {\n // we want host info or/and whole config\n const hostAlive = await states.getState(`system.host.${tools.getHostName()}.alive`);\n\n const alive = hostAlive ? (hostAlive.val as boolean) : false;\n CLI.success.controllerStatus(alive);\n console.log();\n\n const hasLocalStatesServer = await isLocalStatesDbServer(config.states.type, config.states.host);\n const hasLocalObjectsServer = await isLocalObjectsDbServer(config.objects.type, config.objects.host);\n\n if (!hasLocalStatesServer && !hasLocalObjectsServer) {\n CLI.success.systemStatus(!isOffline);\n }\n\n console.log();\n if (showEntireConfig) {\n await showAllInstancesStatus(states, objects);\n console.log();\n showConfig(config);\n } else {\n console.log(`Objects type: ${config.objects.type}`);\n console.log(`States type: ${config.states.type}`);\n }\n return void callback(isOffline ? EXIT_CODES.CONTROLLER_NOT_RUNNING : undefined);\n }\n // we want to know the status of an adapter\n if (/\\.\\d+$/.test(adapterName)) {\n // instance specified\n await showInstanceStatus(states, adapterName);\n return void callback();\n }\n const adapterInstances = await enumInstances(objects, adapterName);\n // If there are multiple instances of this adapter, ask the user to specify which one\n if (adapterInstances.length > 1) {\n CLI.error.specifyInstance(\n adapterName,\n adapterInstances.map(obj => obj._id.substring('system.adapter.'.length)),\n );\n return void callback(EXIT_CODES.INVALID_ADAPTER_ID);\n } else if (adapterInstances.length === 0) {\n CLI.error.noInstancesFound(adapterName);\n return void callback(EXIT_CODES.UNKNOWN_ERROR);\n }\n\n const instanceId = adapterInstances[0]._id.split('.').pop();\n await showInstanceStatus(states, `${adapterName}.${instanceId}`);\n return void callback();\n });\n }\n}\n\n/**\n * Outputs the status of all existing adapter instances\n *\n * @param states The States DB\n * @param objects The Objects DB\n */\nasync function showAllInstancesStatus(states: StatesClient, objects: ObjectsClient): Promise<void> {\n const allInstances = await enumInstances(objects);\n for (const instance of allInstances) {\n const instanceId = instance._id.split('.').pop();\n await showInstanceStatus(states, `${instance.common.name}.${instanceId}`);\n }\n return Promise.resolve();\n}\n\n/**\n * Outputs the status of an adapter instance\n *\n * @param states the states object\n * @param adapterInstance <adapterName>.<instanceId>\n */\nasync function showInstanceStatus(states: StatesClient, adapterInstance: string): Promise<void> {\n const state = await states.getState(`system.adapter.${adapterInstance}.alive`);\n if (state?.val === true) {\n console.log(`Instance \"${adapterInstance}\" is running`);\n } else {\n console.log(`Instance \"${adapterInstance}\" is not running`);\n }\n}\n\n/**\n * Prints the config file to the console\n *\n * @param config the ioBroker json file content\n * @param root The path of the current config section being printed\n */\nfunction showConfig(config: ioBroker.IoBrokerJson, root?: string[]): void {\n if (!tools.isObject(config)) {\n return;\n }\n root = root || [];\n const prefix = root.join('/').toUpperCase();\n for (const attr of Object.keys(config)) {\n if (attr.match(/comment$/i)) {\n continue;\n }\n if (typeof (config as Record<string, any>)[attr] === 'object') {\n const nextRoot = deepClone(root);\n nextRoot.push(attr);\n showConfig((config as Record<string, any>)[attr], nextRoot);\n } else {\n console.log(`${prefix}${(prefix ? '/' : '') + attr}: ${(config as Record<string, any>)[attr]}`);\n }\n }\n}\n\n/**\n * Sets the enabled state of an instance to the given value\n *\n * @param objects The objects DB\n * @param instanceObj The instance object to change\n * @param enabled Whether the instance should be enabled or not\n * @param force Whether the object should be updated always\n */\nasync function setInstanceEnabled(\n objects: ObjectsClient,\n instanceObj: ioBroker.InstanceObject,\n enabled: boolean,\n force?: boolean,\n): Promise<void> {\n if (!force && instanceObj.common.enabled === enabled) {\n return;\n }\n\n instanceObj.common.enabled = enabled;\n instanceObj.from = getObjectFrom();\n instanceObj.ts = Date.now();\n await objects.setObject(instanceObj._id, instanceObj);\n const instanceName = getInstanceName(instanceObj._id);\n if (enabled) {\n CLI.success.adapterStarted(instanceName);\n } else {\n CLI.success.adapterStopped(instanceName);\n }\n}\n\n/**\n * Kills a process by its PID\n *\n * @param pid The PID of the process to kill\n */\nasync function tryKill(pid: number): Promise<void> {\n try {\n process.kill(pid, 'SIGTERM');\n } catch (e) {\n console.warn(`Could not send \"SIGTERM\" to process ${pid}: ${e.message}`);\n }\n\n await wait(TRY_KILL_WAIT_MS);\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["import_js_controller_common", "path", "fs", "os", "deepClone", "wait"]
7
7
  }
@@ -7,6 +7,9 @@ interface CLIStatesOptions extends CLICommandOptions {
7
7
  }
8
8
  /** Command iobroker state ... */
9
9
  export declare class CLIStates extends CLICommand<CLIStatesOptions> {
10
+ /**
11
+ * @param options The command options including context and parameters
12
+ */
10
13
  constructor(options: CLIStatesOptions);
11
14
  /**
12
15
  * Executes a command
@@ -38,6 +38,9 @@ var import_cliTools = require("../../lib/cli/cliTools.js");
38
38
  var rl = __toESM(require("readline-sync"), 1);
39
39
  const ALIAS_STARTS_WITH = "alias.";
40
40
  class CLIStates extends import_cliCommand.CLICommand {
41
+ /**
42
+ * @param options The command options including context and parameters
43
+ */
41
44
  constructor(options) {
42
45
  super(options);
43
46
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/lib/cli/cliStates.ts"],
4
- "sourcesContent": ["import { tools } from '@iobroker/js-controller-common';\nimport { CLICommand, type CLICommandOptions } from './cliCommand.js';\nimport type { Client as ObjectsClient } from '@iobroker/db-objects-redis';\nimport * as CLI from '@/lib/cli/messages.js';\nimport { formatValue } from '@/lib/cli/cliTools.js';\nimport * as rl from 'readline-sync';\n\nconst ALIAS_STARTS_WITH = 'alias.';\n\ntype ResultTransform = (input: ioBroker.State) => string;\n\ninterface CLIStatesOptions extends CLICommandOptions {\n id?: string;\n value?: string | boolean | number;\n ack?: 'true' | 'false' | 0 | 1;\n}\n\n/** Command iobroker state ... */\nexport class CLIStates extends CLICommand<CLIStatesOptions> {\n constructor(options: CLIStatesOptions) {\n super(options);\n }\n\n /**\n * Executes a command\n *\n * @param args parsed cli args\n */\n execute(args: any[]): void {\n const { callback, pretty, showHelp } = this.options;\n const command = args[0];\n let resultTransform: ResultTransform;\n\n switch (command) {\n case 'get':\n resultTransform = obj => formatValue(obj, pretty);\n return this.get_(args, resultTransform);\n case 'getPlain':\n case 'getplain':\n resultTransform = obj => {\n if (!obj) {\n return 'null';\n }\n\n return [obj.val, obj.ack, obj.from, obj.ts, obj.lc].map(line => formatValue(line)).join('\\n');\n };\n return this.get_(args, resultTransform);\n case 'getValue':\n case 'getvalue':\n resultTransform = obj => (obj ? formatValue(obj.val, pretty) : 'null');\n return this.get_(args, resultTransform);\n case 'set':\n return this.set_(args);\n case 'chmod':\n case 'chown':\n CLI.error.wrongCommandPrefix('state', command, 'object');\n return void callback(3);\n case 'delete':\n case 'del':\n return this.delete(args);\n case 'getDBVersion':\n return this.getDBVersion();\n case 'setDBVersion':\n return this.setDBVersion();\n default:\n CLI.error.unknownCommand('state', command);\n showHelp();\n return void callback(3);\n }\n }\n\n /**\n * Get the protocol version\n */\n getDBVersion(): void {\n const { callback, dbConnect } = this.options;\n dbConnect(async params => {\n const { states } = params;\n const version = await states.getProtocolVersion();\n console.log(`Current States DB protocol version: ${version}`);\n return void callback(0);\n });\n }\n\n /**\n * Set protocol version\n */\n setDBVersion(): void {\n const { callback, dbConnect } = this.options;\n dbConnect(async params => {\n const { states } = params;\n\n let answer = rl.question('Changing the protocol version will restart all hosts! Continue? [N/y]', {\n limit: /^(yes|y|n|no)$/i,\n defaultInput: 'no',\n });\n\n answer = answer.toLowerCase();\n\n if (answer !== 'y' && answer !== 'yes') {\n console.log('Protocol version has not been changed!');\n return void callback(0);\n }\n\n try {\n await states.setProtocolVersion(this.options.version);\n } catch (e) {\n console.error(`Cannot update protocol version: ${e.message}`);\n return void callback(1);\n }\n console.log(`States DB protocol updated to version ${this.options.version}`);\n return void callback(0);\n });\n }\n\n /**\n * Checks if state is a binary state\n *\n * @param id id of the state\n * @param objects the objects db\n * @param _obj cached object\n */\n private async _isBinary(id: string, objects: ObjectsClient, _obj?: ioBroker.AnyObject | null): Promise<boolean> {\n const obj = _obj || (await objects.getObject(id));\n\n return !!(obj && ('binary' in obj || (obj.common && 'type' in obj.common && obj.common.type === 'file')));\n }\n\n /**\n * Returns the value of a state\n *\n * @param args parsed cli arguments\n * @param resultTransform transform function for result\n */\n get_(args: any[], resultTransform: ResultTransform): void {\n const { callback, dbConnect } = this.options;\n const id = args[1];\n\n if (!id) {\n CLI.error.stateNotFound(id);\n return;\n }\n\n dbConnect(async params => {\n const { states, objects } = params;\n\n if (id.startsWith(ALIAS_STARTS_WITH)) {\n objects.getObject(id, (err, targetObj) => {\n // alias\n if (targetObj && targetObj.common && 'alias' in targetObj.common && targetObj.common.alias.id) {\n const aliasId =\n typeof targetObj.common.alias.id.read === 'string'\n ? targetObj.common.alias.id.read\n : targetObj.common.alias.id;\n objects.getObject(aliasId, async (_err, sourceObj) => {\n // read target\n try {\n if (await this._isBinary(aliasId, objects, targetObj)) {\n CLI.error.stateBinaryGetUnsupported(aliasId);\n return void callback(1);\n }\n\n const state = await states.getStateAsync(aliasId);\n if (!state) {\n CLI.error.stateNotFound(id);\n } else {\n tools.formatAliasValue({\n sourceCommon: sourceObj?.common as ioBroker.StateCommon | undefined,\n targetCommon: targetObj.common as ioBroker.StateCommon,\n state,\n logger: console,\n logNamespace: '',\n sourceId: sourceObj?._id,\n targetId: targetObj._id,\n });\n console.log(resultTransform(state));\n }\n } catch (e) {\n CLI.error.unknown(e);\n }\n return void callback(0);\n });\n } else {\n CLI.error.unknown(err?.message || `Alias ${id} has no target`);\n return void callback(1); // ?\n }\n });\n } else {\n try {\n if (await this._isBinary(id, objects)) {\n CLI.error.stateBinaryGetUnsupported(id);\n return void callback(1);\n }\n const state = await states.getStateAsync(id);\n if (!state) {\n CLI.error.stateNotFound(id);\n } else {\n console.log(resultTransform(state));\n }\n } catch (e) {\n CLI.error.unknown(e);\n }\n return void callback(0);\n }\n });\n }\n\n /**\n * Set state in database\n *\n * @param args parsed cli arguments\n */\n set_(args: any[]): void {\n const { callback, dbConnect, showHelp, value, ack: ackArg, id } = this.options;\n const force = args.includes('--force') || args.includes('-f');\n\n if (id === undefined) {\n CLI.error.requiredArgumentMissing('id');\n showHelp();\n return void callback(0);\n }\n\n if (value === undefined) {\n CLI.error.requiredArgumentMissing('value');\n showHelp();\n return void callback(0);\n }\n\n let ack = false;\n\n if (ackArg !== undefined) {\n ack = ackArg === 'true' || ackArg === 1;\n }\n\n dbConnect(params => {\n const { states, objects } = params;\n const newVal = { val: value, ack: !!ack };\n\n if (id.startsWith(ALIAS_STARTS_WITH)) {\n objects.getObject(id, async (_err, obj) => {\n if (await this._isBinary(id, objects, obj)) {\n CLI.error.stateBinarySetUnsupported(id);\n return void callback(1);\n }\n // alias\n if (obj?.common?.alias?.id) {\n const aliasId =\n typeof obj.common.alias.id.write === 'string'\n ? obj.common.alias.id.write\n : obj.common.alias.id;\n\n objects.getObject(aliasId, (err, targetObj) => {\n if (err) {\n CLI.error.unknown(err.message);\n return void callback(1); // access error\n }\n if (!obj && !force) {\n CLI.error.objectNotFound(id, 'null');\n return void callback(1); // object not exists\n }\n\n if (obj?.common?.type) {\n if (obj.common.type === 'string') {\n newVal.val = newVal.val.toString();\n } else if (obj.common.type === 'number') {\n newVal.val = Number(newVal.val);\n } else if (obj.common.type === 'boolean') {\n newVal.val = newVal.val.toString();\n newVal.val =\n newVal.val === 'true' ||\n newVal.val === '1' ||\n newVal.val === 'ON' ||\n newVal.val === 'on';\n }\n }\n\n // write target\n states.setState(\n aliasId,\n tools.formatAliasValue({\n sourceCommon: obj.common as ioBroker.StateCommon,\n targetCommon: targetObj?.common as ioBroker.StateCommon | undefined,\n state: newVal as ioBroker.State,\n logger: console,\n logNamespace: '',\n sourceId: obj._id,\n targetId: targetObj?._id,\n }),\n err => {\n if (err) {\n CLI.error.unknown(err.message);\n return void callback(1); // ?\n }\n CLI.success.stateUpdated(id, value, !!ack);\n return void callback(0);\n },\n );\n });\n } else {\n CLI.error.unknown(`Alias ${id} has no target`);\n return void callback(1); // ?\n }\n });\n } else {\n objects.getObject(id, async (err, obj) => {\n if (err) {\n CLI.error.unknown(err.message);\n return void callback(1); // access error\n }\n\n if (await this._isBinary(id, objects, obj)) {\n CLI.error.stateBinarySetUnsupported(id);\n return void callback(1);\n }\n\n if (!obj && !force) {\n CLI.error.objectNotFound(id, 'null');\n return void callback(1); // object not exists\n }\n\n if (obj?.common?.type) {\n if (obj.common.type === 'string') {\n newVal.val = newVal.val.toString();\n } else if (obj.common.type === 'number') {\n newVal.val = Number(newVal.val);\n } else if (obj.common.type === 'boolean') {\n newVal.val = newVal.val.toString();\n newVal.val =\n newVal.val === 'true' ||\n newVal.val === '1' ||\n newVal.val === 'ON' ||\n newVal.val === 'on';\n }\n }\n\n states.setState(id, newVal, err => {\n if (err) {\n CLI.error.unknown(err.message);\n return void callback(1); // ?\n }\n CLI.success.stateUpdated(id, value, !!ack);\n return void callback(0);\n });\n });\n }\n });\n }\n\n /**\n * Deletes a state\n *\n * @param args parsed cli arguments\n */\n delete(args: any[]): void {\n const { callback, dbConnect } = this.options;\n const id: string = args[1];\n if (!id) {\n CLI.error.requiredArgumentMissing('id', 'state delete id');\n return void callback(1);\n }\n\n dbConnect(params => {\n const { states } = params;\n\n states.delState(id, err => {\n if (err) {\n CLI.error.stateNotFound(id, err.message);\n return void callback(3);\n }\n CLI.success.stateDeleted(id);\n return void callback(0);\n });\n });\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { tools } from '@iobroker/js-controller-common';\nimport { CLICommand, type CLICommandOptions } from './cliCommand.js';\nimport type { Client as ObjectsClient } from '@iobroker/db-objects-redis';\nimport * as CLI from '@/lib/cli/messages.js';\nimport { formatValue } from '@/lib/cli/cliTools.js';\nimport * as rl from 'readline-sync';\n\nconst ALIAS_STARTS_WITH = 'alias.';\n\ntype ResultTransform = (input: ioBroker.State) => string;\n\ninterface CLIStatesOptions extends CLICommandOptions {\n id?: string;\n value?: string | boolean | number;\n ack?: 'true' | 'false' | 0 | 1;\n}\n\n/** Command iobroker state ... */\nexport class CLIStates extends CLICommand<CLIStatesOptions> {\n /**\n * @param options The command options including context and parameters\n */\n constructor(options: CLIStatesOptions) {\n super(options);\n }\n\n /**\n * Executes a command\n *\n * @param args parsed cli args\n */\n execute(args: any[]): void {\n const { callback, pretty, showHelp } = this.options;\n const command = args[0];\n let resultTransform: ResultTransform;\n\n switch (command) {\n case 'get':\n resultTransform = obj => formatValue(obj, pretty);\n return this.get_(args, resultTransform);\n case 'getPlain':\n case 'getplain':\n resultTransform = obj => {\n if (!obj) {\n return 'null';\n }\n\n return [obj.val, obj.ack, obj.from, obj.ts, obj.lc].map(line => formatValue(line)).join('\\n');\n };\n return this.get_(args, resultTransform);\n case 'getValue':\n case 'getvalue':\n resultTransform = obj => (obj ? formatValue(obj.val, pretty) : 'null');\n return this.get_(args, resultTransform);\n case 'set':\n return this.set_(args);\n case 'chmod':\n case 'chown':\n CLI.error.wrongCommandPrefix('state', command, 'object');\n return void callback(3);\n case 'delete':\n case 'del':\n return this.delete(args);\n case 'getDBVersion':\n return this.getDBVersion();\n case 'setDBVersion':\n return this.setDBVersion();\n default:\n CLI.error.unknownCommand('state', command);\n showHelp();\n return void callback(3);\n }\n }\n\n /**\n * Get the protocol version\n */\n getDBVersion(): void {\n const { callback, dbConnect } = this.options;\n dbConnect(async params => {\n const { states } = params;\n const version = await states.getProtocolVersion();\n console.log(`Current States DB protocol version: ${version}`);\n return void callback(0);\n });\n }\n\n /**\n * Set protocol version\n */\n setDBVersion(): void {\n const { callback, dbConnect } = this.options;\n dbConnect(async params => {\n const { states } = params;\n\n let answer = rl.question('Changing the protocol version will restart all hosts! Continue? [N/y]', {\n limit: /^(yes|y|n|no)$/i,\n defaultInput: 'no',\n });\n\n answer = answer.toLowerCase();\n\n if (answer !== 'y' && answer !== 'yes') {\n console.log('Protocol version has not been changed!');\n return void callback(0);\n }\n\n try {\n await states.setProtocolVersion(this.options.version);\n } catch (e) {\n console.error(`Cannot update protocol version: ${e.message}`);\n return void callback(1);\n }\n console.log(`States DB protocol updated to version ${this.options.version}`);\n return void callback(0);\n });\n }\n\n /**\n * Checks if state is a binary state\n *\n * @param id id of the state\n * @param objects the objects db\n * @param _obj cached object\n */\n private async _isBinary(id: string, objects: ObjectsClient, _obj?: ioBroker.AnyObject | null): Promise<boolean> {\n const obj = _obj || (await objects.getObject(id));\n\n return !!(obj && ('binary' in obj || (obj.common && 'type' in obj.common && obj.common.type === 'file')));\n }\n\n /**\n * Returns the value of a state\n *\n * @param args parsed cli arguments\n * @param resultTransform transform function for result\n */\n get_(args: any[], resultTransform: ResultTransform): void {\n const { callback, dbConnect } = this.options;\n const id = args[1];\n\n if (!id) {\n CLI.error.stateNotFound(id);\n return;\n }\n\n dbConnect(async params => {\n const { states, objects } = params;\n\n if (id.startsWith(ALIAS_STARTS_WITH)) {\n objects.getObject(id, (err, targetObj) => {\n // alias\n if (targetObj && targetObj.common && 'alias' in targetObj.common && targetObj.common.alias.id) {\n const aliasId =\n typeof targetObj.common.alias.id.read === 'string'\n ? targetObj.common.alias.id.read\n : targetObj.common.alias.id;\n objects.getObject(aliasId, async (_err, sourceObj) => {\n // read target\n try {\n if (await this._isBinary(aliasId, objects, targetObj)) {\n CLI.error.stateBinaryGetUnsupported(aliasId);\n return void callback(1);\n }\n\n const state = await states.getStateAsync(aliasId);\n if (!state) {\n CLI.error.stateNotFound(id);\n } else {\n tools.formatAliasValue({\n sourceCommon: sourceObj?.common as ioBroker.StateCommon | undefined,\n targetCommon: targetObj.common as ioBroker.StateCommon,\n state,\n logger: console,\n logNamespace: '',\n sourceId: sourceObj?._id,\n targetId: targetObj._id,\n });\n console.log(resultTransform(state));\n }\n } catch (e) {\n CLI.error.unknown(e);\n }\n return void callback(0);\n });\n } else {\n CLI.error.unknown(err?.message || `Alias ${id} has no target`);\n return void callback(1); // ?\n }\n });\n } else {\n try {\n if (await this._isBinary(id, objects)) {\n CLI.error.stateBinaryGetUnsupported(id);\n return void callback(1);\n }\n const state = await states.getStateAsync(id);\n if (!state) {\n CLI.error.stateNotFound(id);\n } else {\n console.log(resultTransform(state));\n }\n } catch (e) {\n CLI.error.unknown(e);\n }\n return void callback(0);\n }\n });\n }\n\n /**\n * Set state in database\n *\n * @param args parsed cli arguments\n */\n set_(args: any[]): void {\n const { callback, dbConnect, showHelp, value, ack: ackArg, id } = this.options;\n const force = args.includes('--force') || args.includes('-f');\n\n if (id === undefined) {\n CLI.error.requiredArgumentMissing('id');\n showHelp();\n return void callback(0);\n }\n\n if (value === undefined) {\n CLI.error.requiredArgumentMissing('value');\n showHelp();\n return void callback(0);\n }\n\n let ack = false;\n\n if (ackArg !== undefined) {\n ack = ackArg === 'true' || ackArg === 1;\n }\n\n dbConnect(params => {\n const { states, objects } = params;\n const newVal = { val: value, ack: !!ack };\n\n if (id.startsWith(ALIAS_STARTS_WITH)) {\n objects.getObject(id, async (_err, obj) => {\n if (await this._isBinary(id, objects, obj)) {\n CLI.error.stateBinarySetUnsupported(id);\n return void callback(1);\n }\n // alias\n if (obj?.common?.alias?.id) {\n const aliasId =\n typeof obj.common.alias.id.write === 'string'\n ? obj.common.alias.id.write\n : obj.common.alias.id;\n\n objects.getObject(aliasId, (err, targetObj) => {\n if (err) {\n CLI.error.unknown(err.message);\n return void callback(1); // access error\n }\n if (!obj && !force) {\n CLI.error.objectNotFound(id, 'null');\n return void callback(1); // object not exists\n }\n\n if (obj?.common?.type) {\n if (obj.common.type === 'string') {\n newVal.val = newVal.val.toString();\n } else if (obj.common.type === 'number') {\n newVal.val = Number(newVal.val);\n } else if (obj.common.type === 'boolean') {\n newVal.val = newVal.val.toString();\n newVal.val =\n newVal.val === 'true' ||\n newVal.val === '1' ||\n newVal.val === 'ON' ||\n newVal.val === 'on';\n }\n }\n\n // write target\n states.setState(\n aliasId,\n tools.formatAliasValue({\n sourceCommon: obj.common as ioBroker.StateCommon,\n targetCommon: targetObj?.common as ioBroker.StateCommon | undefined,\n state: newVal as ioBroker.State,\n logger: console,\n logNamespace: '',\n sourceId: obj._id,\n targetId: targetObj?._id,\n }),\n err => {\n if (err) {\n CLI.error.unknown(err.message);\n return void callback(1); // ?\n }\n CLI.success.stateUpdated(id, value, !!ack);\n return void callback(0);\n },\n );\n });\n } else {\n CLI.error.unknown(`Alias ${id} has no target`);\n return void callback(1); // ?\n }\n });\n } else {\n objects.getObject(id, async (err, obj) => {\n if (err) {\n CLI.error.unknown(err.message);\n return void callback(1); // access error\n }\n\n if (await this._isBinary(id, objects, obj)) {\n CLI.error.stateBinarySetUnsupported(id);\n return void callback(1);\n }\n\n if (!obj && !force) {\n CLI.error.objectNotFound(id, 'null');\n return void callback(1); // object not exists\n }\n\n if (obj?.common?.type) {\n if (obj.common.type === 'string') {\n newVal.val = newVal.val.toString();\n } else if (obj.common.type === 'number') {\n newVal.val = Number(newVal.val);\n } else if (obj.common.type === 'boolean') {\n newVal.val = newVal.val.toString();\n newVal.val =\n newVal.val === 'true' ||\n newVal.val === '1' ||\n newVal.val === 'ON' ||\n newVal.val === 'on';\n }\n }\n\n states.setState(id, newVal, err => {\n if (err) {\n CLI.error.unknown(err.message);\n return void callback(1); // ?\n }\n CLI.success.stateUpdated(id, value, !!ack);\n return void callback(0);\n });\n });\n }\n });\n }\n\n /**\n * Deletes a state\n *\n * @param args parsed cli arguments\n */\n delete(args: any[]): void {\n const { callback, dbConnect } = this.options;\n const id: string = args[1];\n if (!id) {\n CLI.error.requiredArgumentMissing('id', 'state delete id');\n return void callback(1);\n }\n\n dbConnect(params => {\n const { states } = params;\n\n states.delState(id, err => {\n if (err) {\n CLI.error.stateNotFound(id, err.message);\n return void callback(3);\n }\n CLI.success.stateDeleted(id);\n return void callback(0);\n });\n });\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["err"]
7
7
  }
@@ -1,4 +1,5 @@
1
1
  import type { EXIT_CODES } from '@iobroker/js-controller-common';
2
+ /** Options for creating an {@link IoBrokerError} */
2
3
  export interface IoBrokerErrorOptions {
3
4
  /** The error message */
4
5
  message: string;
@@ -10,6 +11,9 @@ export interface IoBrokerErrorOptions {
10
11
  */
11
12
  export declare class IoBrokerError extends Error {
12
13
  readonly code: EXIT_CODES;
14
+ /**
15
+ * @param options The error message and ioBroker exit code
16
+ */
13
17
  constructor(options: IoBrokerErrorOptions);
14
18
  }
15
19
  //# sourceMappingURL=customError.d.ts.map
@@ -23,6 +23,9 @@ __export(customError_exports, {
23
23
  module.exports = __toCommonJS(customError_exports);
24
24
  class IoBrokerError extends Error {
25
25
  code;
26
+ /**
27
+ * @param options The error message and ioBroker exit code
28
+ */
26
29
  constructor(options) {
27
30
  super(options.message);
28
31
  this.name = this.constructor.name;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/lib/setup/customError.ts"],
4
- "sourcesContent": ["import type { EXIT_CODES } from '@iobroker/js-controller-common';\n\nexport interface IoBrokerErrorOptions {\n /** The error message */\n message: string;\n /** An ioBroker error code */\n code: EXIT_CODES;\n}\n\n/**\n * A custom ioBroker CLI error to propagate the exit code down\n */\nexport class IoBrokerError extends Error {\n readonly code: EXIT_CODES;\n constructor(options: IoBrokerErrorOptions) {\n super(options.message);\n\n this.name = this.constructor.name;\n\n Error.captureStackTrace(this, this.constructor);\n\n // you may also assign additional properties to your error\n this.code = options.code;\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;AASA;;;;;AAGM,MAAO,sBAAsB,MAAK;EAC3B;EACT,YAAY,SAA6B;AACrC,UAAM,QAAQ,OAAO;AAErB,SAAK,OAAO,KAAK,YAAY;AAE7B,UAAM,kBAAkB,MAAM,KAAK,WAAW;AAG9C,SAAK,OAAO,QAAQ;EACxB;;",
4
+ "sourcesContent": ["import type { EXIT_CODES } from '@iobroker/js-controller-common';\n\n/** Options for creating an {@link IoBrokerError} */\nexport interface IoBrokerErrorOptions {\n /** The error message */\n message: string;\n /** An ioBroker error code */\n code: EXIT_CODES;\n}\n\n/**\n * A custom ioBroker CLI error to propagate the exit code down\n */\nexport class IoBrokerError extends Error {\n readonly code: EXIT_CODES;\n /**\n * @param options The error message and ioBroker exit code\n */\n constructor(options: IoBrokerErrorOptions) {\n super(options.message);\n\n this.name = this.constructor.name;\n\n Error.captureStackTrace(this, this.constructor);\n\n // you may also assign additional properties to your error\n this.code = options.code;\n }\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAUA;;;;;AAGM,MAAO,sBAAsB,MAAK;EAC3B;;;;EAIT,YAAY,SAA6B;AACrC,UAAM,QAAQ,OAAO;AAErB,SAAK,OAAO,KAAK,YAAY;AAE7B,UAAM,kBAAkB,MAAM,KAAK,WAAW;AAG9C,SAAK,OAAO,QAAQ;EACxB;;",
6
6
  "names": []
7
7
  }
@@ -1,25 +1,25 @@
1
1
  /**
2
2
  * Format number in seconds to time text
3
3
  *
4
- * @param seconds
4
+ * @param seconds The number of seconds to format
5
5
  */
6
6
  export declare function formatSeconds(seconds: number): string;
7
7
  /**
8
8
  * Format bytes to MB or GB
9
9
  *
10
- * @param bytes
10
+ * @param bytes The number of bytes to format
11
11
  */
12
12
  export declare function formatRam(bytes: number): string;
13
13
  /**
14
14
  * Format speed
15
15
  *
16
- * @param mhz
16
+ * @param mhz The speed in MHz
17
17
  */
18
18
  export declare function formatSpeed(mhz: number): string;
19
19
  /**
20
20
  * Format bytes to human readable form
21
21
  *
22
- * @param bytes
22
+ * @param bytes The number of bytes to format
23
23
  */
24
24
  export declare function formatBytes(bytes: number): string;
25
25
  //# sourceMappingURL=formatters.d.ts.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/lib/setup/formatters.ts"],
4
- "sourcesContent": ["/**\n * Format number in seconds to time text\n *\n * @param seconds\n */\nexport function formatSeconds(seconds: number): string {\n let _seconds: number | string = seconds;\n\n const days = Math.floor(_seconds / (3_600 * 24));\n _seconds %= 3_600 * 24;\n let hours: number | string = Math.floor(_seconds / 3_600);\n if (hours < 10) {\n hours = `0${hours}`;\n }\n _seconds %= 3_600;\n let minutes: number | string = Math.floor(_seconds / 60);\n if (minutes < 10) {\n minutes = `0${minutes}`;\n }\n _seconds %= 60;\n _seconds = Math.floor(_seconds);\n if (_seconds < 10) {\n _seconds = `0${_seconds}`;\n }\n let text = '';\n if (days) {\n text += `${days}d. `;\n }\n text += `${hours}:${minutes}:${_seconds}`;\n\n return text;\n}\n\n/**\n * Format bytes to MB or GB\n *\n * @param bytes\n */\nexport function formatRam(bytes: number): string {\n const GB = Math.floor((bytes / (1024 * 1024 * 1024)) * 10) / 10;\n bytes %= 1024 * 1024 * 1024;\n const MB = Math.floor((bytes / (1024 * 1024)) * 10) / 10;\n let text = '';\n if (GB > 1) {\n text += `${GB} GB`;\n } else {\n text += `${MB} MB`;\n }\n\n return text;\n}\n\n/**\n * Format speed\n *\n * @param mhz\n */\nexport function formatSpeed(mhz: number): string {\n return `${mhz} MHz`;\n}\n\n/**\n * Format bytes to human readable form\n *\n * @param bytes\n */\nexport function formatBytes(bytes: number): string {\n if (Math.abs(bytes) < 1024) {\n return `${bytes} B`;\n }\n const units = ['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB'];\n let u = -1;\n do {\n bytes /= 1024;\n ++u;\n } while (Math.abs(bytes) >= 1024 && u < units.length - 1);\n return `${bytes.toFixed(1)} ${units[u]}`;\n}\n"],
4
+ "sourcesContent": ["/**\n * Format number in seconds to time text\n *\n * @param seconds The number of seconds to format\n */\nexport function formatSeconds(seconds: number): string {\n let _seconds: number | string = seconds;\n\n const days = Math.floor(_seconds / (3_600 * 24));\n _seconds %= 3_600 * 24;\n let hours: number | string = Math.floor(_seconds / 3_600);\n if (hours < 10) {\n hours = `0${hours}`;\n }\n _seconds %= 3_600;\n let minutes: number | string = Math.floor(_seconds / 60);\n if (minutes < 10) {\n minutes = `0${minutes}`;\n }\n _seconds %= 60;\n _seconds = Math.floor(_seconds);\n if (_seconds < 10) {\n _seconds = `0${_seconds}`;\n }\n let text = '';\n if (days) {\n text += `${days}d. `;\n }\n text += `${hours}:${minutes}:${_seconds}`;\n\n return text;\n}\n\n/**\n * Format bytes to MB or GB\n *\n * @param bytes The number of bytes to format\n */\nexport function formatRam(bytes: number): string {\n const GB = Math.floor((bytes / (1024 * 1024 * 1024)) * 10) / 10;\n bytes %= 1024 * 1024 * 1024;\n const MB = Math.floor((bytes / (1024 * 1024)) * 10) / 10;\n let text = '';\n if (GB > 1) {\n text += `${GB} GB`;\n } else {\n text += `${MB} MB`;\n }\n\n return text;\n}\n\n/**\n * Format speed\n *\n * @param mhz The speed in MHz\n */\nexport function formatSpeed(mhz: number): string {\n return `${mhz} MHz`;\n}\n\n/**\n * Format bytes to human readable form\n *\n * @param bytes The number of bytes to format\n */\nexport function formatBytes(bytes: number): string {\n if (Math.abs(bytes) < 1024) {\n return `${bytes} B`;\n }\n const units = ['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB'];\n let u = -1;\n do {\n bytes /= 1024;\n ++u;\n } while (Math.abs(bytes) >= 1024 && u < units.length - 1);\n return `${bytes.toFixed(1)} ${units[u]}`;\n}\n"],
5
5
  "mappings": ";;;;;;;;;;;;;;;;;;AAAA;;;;;;;;AAKM,SAAU,cAAc,SAAe;AACzC,MAAI,WAA4B;AAEhC,QAAM,OAAO,KAAK,MAAM,YAAY,OAAQ,GAAG;AAC/C,cAAY,OAAQ;AACpB,MAAI,QAAyB,KAAK,MAAM,WAAW,IAAK;AACxD,MAAI,QAAQ,IAAI;AACZ,YAAQ,IAAI,KAAK;EACrB;AACA,cAAY;AACZ,MAAI,UAA2B,KAAK,MAAM,WAAW,EAAE;AACvD,MAAI,UAAU,IAAI;AACd,cAAU,IAAI,OAAO;EACzB;AACA,cAAY;AACZ,aAAW,KAAK,MAAM,QAAQ;AAC9B,MAAI,WAAW,IAAI;AACf,eAAW,IAAI,QAAQ;EAC3B;AACA,MAAI,OAAO;AACX,MAAI,MAAM;AACN,YAAQ,GAAG,IAAI;EACnB;AACA,UAAQ,GAAG,KAAK,IAAI,OAAO,IAAI,QAAQ;AAEvC,SAAO;AACX;AAOM,SAAU,UAAU,OAAa;AACnC,QAAM,KAAK,KAAK,MAAO,SAAS,OAAO,OAAO,QAAS,EAAE,IAAI;AAC7D,WAAS,OAAO,OAAO;AACvB,QAAM,KAAK,KAAK,MAAO,SAAS,OAAO,QAAS,EAAE,IAAI;AACtD,MAAI,OAAO;AACX,MAAI,KAAK,GAAG;AACR,YAAQ,GAAG,EAAE;EACjB,OAAO;AACH,YAAQ,GAAG,EAAE;EACjB;AAEA,SAAO;AACX;AAOM,SAAU,YAAY,KAAW;AACnC,SAAO,GAAG,GAAG;AACjB;AAOM,SAAU,YAAY,OAAa;AACrC,MAAI,KAAK,IAAI,KAAK,IAAI,MAAM;AACxB,WAAO,GAAG,KAAK;EACnB;AACA,QAAM,QAAQ,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK;AACrE,MAAI,IAAI;AACR,KAAG;AACC,aAAS;AACT,MAAE;EACN,SAAS,KAAK,IAAI,KAAK,KAAK,QAAQ,IAAI,MAAM,SAAS;AACvD,SAAO,GAAG,MAAM,QAAQ,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC;AAC1C;",
6
6
  "names": []
7
7
  }
@@ -1,3 +1,8 @@
1
+ /**
2
+ * Check whether the given plugin reports data to an external service (e.g. Sentry)
3
+ *
4
+ * @param name The plugin name to check
5
+ */
1
6
  export declare function isReportingPlugin(name: string): boolean;
2
7
  export declare const PLUGIN_INFOS: {
3
8
  readonly sentry: {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/lib/setup/pluginInfos.ts"],
4
- "sourcesContent": ["// Special Handling to inform users about reporting plugins correctly\nexport function isReportingPlugin(name: string): boolean {\n return name === 'sentry';\n}\n\nexport const PLUGIN_INFOS = {\n sentry: {\n headline: {\n en: 'ATTENTION: Error reporting via Sentry will be activated on next start of ioBroker',\n de: 'ACHTUNG: Die Fehlerberichterstattung \u00FCber Sentry wird beim n\u00E4chsten Start von ioBroker aktiviert',\n ru: '\u0412\u041D\u0418\u041C\u0410\u041D\u0418\u0415: \u041E\u0442\u0447\u0435\u0442 \u043E\u0431 \u043E\u0448\u0438\u0431\u043A\u0430\u0445 \u0447\u0435\u0440\u0435\u0437 Sentry \u0431\u0443\u0434\u0435\u0442 \u0430\u043A\u0442\u0438\u0432\u0438\u0440\u043E\u0432\u0430\u043D \u043F\u0440\u0438 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u043C \u0437\u0430\u043F\u0443\u0441\u043A\u0435 ioBroker',\n pt: 'ATEN\u00C7\u00C3O: O relat\u00F3rio de erros via Sentry ser\u00E1 ativado no pr\u00F3ximo in\u00EDcio do ioBroker',\n nl: 'LET OP: Foutrapportage via Sentry wordt geactiveerd bij de volgende start van ioBroker',\n fr: \"ATTENTION: Le rapport d'erreurs via Sentry sera activ\u00E9 au prochain d\u00E9marrage d'ioBroker\",\n it: 'ATTENZIONE: la segnalazione degli errori tramite Sentry verr\u00E0 attivata al prossimo avvio di ioBroker',\n es: 'ATENCI\u00D3N: el informe de errores a trav\u00E9s de Sentry se activar\u00E1 en el pr\u00F3ximo inicio de ioBroker',\n pl: 'UWAGA: Raportowanie b\u0142\u0119d\u00F3w za po\u015Brednictwem Sentry zostanie aktywowane przy nast\u0119pnym uruchomieniu ioBroker',\n uk: '\u0423\u0412\u0410\u0413\u0410: \u0417\u0432\u0456\u0442 \u043F\u0440\u043E \u043F\u043E\u043C\u0438\u043B\u043A\u0438 \u0447\u0435\u0440\u0435\u0437 Sentry \u0431\u0443\u0434\u0435 \u0430\u043A\u0442\u0438\u0432\u043E\u0432\u0430\u043D\u043E \u043F\u0440\u0438 \u043D\u0430\u0441\u0442\u0443\u043F\u043D\u043E\u043C\u0443 \u0437\u0430\u043F\u0443\u0441\u043A\u0443 ioBroker',\n 'zh-cn': '\u6CE8\u610F\uFF1A\u901A\u8FC7Sentry\u7684\u9519\u8BEF\u62A5\u544A\u5C06\u5728ioBroker\u7684\u4E0B\u4E00\u6B21\u542F\u52A8\u65F6\u88AB\u6FC0\u6D3B',\n },\n text: {\n en: \"ioBroker wants to make sure to deliver the most stable smart home system.\\nTo allow this we decided to implement an automatic error and crash reporting solution into the js-controller and also into adapters. \\n\\nTHIS REPORTING WILL BE ENABLED WITH THE NEXT START OF YOUR IOBROKER!\\n\\nFor any error that leads to the crash of the js-controller or one of the relevant adapters the error details are send to a server. For the js-controller and core adapters this server is located and operated in germany. For community adapters please check the Github Readme of the affected adapter for details which Sentry server is used.\\n\\nIf you want to disable the error reporting you can use the command\\n'iobroker plugin disable sentry'\\nThis command will also make sure that no adapter that runs on this host will send crash reporting data to sentry.\",\n de: \"Wir von ioBroker wollen das stabilste Smart-Home-System bereitstellen.\\nUm dies zu erm\u00F6glichen, haben wir uns entschlossen, eine automatische Fehler- und Crash-Reporting-L\u00F6sung in den js-Controller und auch in Adapter zu implementieren.\\n\\nDIESE BERICHTERSTATTUNG WIRD MIT DEM N\u00C4CHSTEN START IHRES IOBROKERS AKTIVIERT!\\n\\nBei Fehlern, die zum Absturz des js-Controllers oder eines der relevanten Adapter f\u00FChren, werden die Fehlerdetails an einen Server gesendet. F\u00FCr den js-controller und die Haupt-Adapter befindet sich dieser Server in Deutschland. Informationen zu Community-Adaptern sind in der Github-Readme-Datei des betroffenen Adapters zu finden. Dort steht welcher Sentry-Server verwendet wird.\\n\\nDie Fehlerberichterstattung kann, falls gew\u00FCnscht, \u00FCber den Befehl\\n'iobroker plugin disable sentry'\\ndeaktiviert werden. Dieser Befehl stellt auch sicher, dass kein Adapter, der auf diesem Host ausgef\u00FChrt wird, Absturzberichtsdaten an den Sentry-Server sendet.\",\n ru: \"ioBroker \u0445\u043E\u0447\u0435\u0442 \u043E\u0431\u0435\u0441\u043F\u0435\u0447\u0438\u0442\u044C \u0441\u0430\u043C\u0443\u044E \u0441\u0442\u0430\u0431\u0438\u043B\u044C\u043D\u0443\u044E \u0441\u0438\u0441\u0442\u0435\u043C\u0443 \u0443\u043C\u043D\u043E\u0433\u043E \u0434\u043E\u043C\u0430.\\n\u0427\u0442\u043E\u0431\u044B \u0441\u0434\u0435\u043B\u0430\u0442\u044C \u044D\u0442\u043E, \u043C\u044B \u0440\u0435\u0448\u0438\u043B\u0438 \u0432\u043D\u0435\u0434\u0440\u0438\u0442\u044C \u0440\u0435\u0448\u0435\u043D\u0438\u0435 \u0434\u043B\u044F \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0433\u043E \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u043E\u0431 \u043E\u0448\u0438\u0431\u043A\u0430\u0445 \u0438 \u0441\u0431\u043E\u044F\u0445 \u0432 js-\u043A\u043E\u043D\u0442\u0440\u043E\u043B\u043B\u0435\u0440, \u0430 \u0442\u0430\u043A\u0436\u0435 \u0432 \u0430\u0434\u0430\u043F\u0442\u0435\u0440\u044B.\\n\\n\u042D\u0422\u0410 \u041E\u0422\u0427\u0415\u0422\u041D\u041E\u0421\u0422\u042C \u0411\u0423\u0414\u0415\u0422 \u0412\u041A\u041B\u042E\u0427\u0415\u041D\u0410 \u0421 \u0421\u041B\u0415\u0414\u0423\u042E\u0429\u0418\u041C \u0421\u0422\u0410\u0420\u0422\u041E\u041C \u0412\u0410\u0428\u0415\u0413\u041E IOBROKER!\\n\\n\u0414\u043B\u044F \u043B\u044E\u0431\u043E\u0439 \u043E\u0448\u0438\u0431\u043A\u0438, \u043A\u043E\u0442\u043E\u0440\u0430\u044F \u043F\u0440\u0438\u0432\u043E\u0434\u0438\u0442 \u043A \u0441\u0431\u043E\u044E js-\u043A\u043E\u043D\u0442\u0440\u043E\u043B\u043B\u0435\u0440\u0430 \u0438\u043B\u0438 \u043E\u0434\u043D\u043E\u0433\u043E \u0438\u0437 \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044E\u0449\u0438\u0445 \u0430\u0434\u0430\u043F\u0442\u0435\u0440\u043E\u0432, \u043F\u043E\u0434\u0440\u043E\u0431\u043D\u043E\u0441\u0442\u0438 \u043E\u0448\u0438\u0431\u043A\u0438 \u043E\u0442\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0442\u0441\u044F \u043D\u0430 \u0441\u0435\u0440\u0432\u0435\u0440. \u0414\u043B\u044F js-\u043A\u043E\u043D\u0442\u0440\u043E\u043B\u043B\u0435\u0440\u0430 \u0438 \u0431\u0430\u0437\u043E\u0432\u044B\u0445 \u0430\u0434\u0430\u043F\u0442\u0435\u0440\u043E\u0432 \u044D\u0442\u043E\u0442 \u0441\u0435\u0440\u0432\u0435\u0440 \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D \u0438 \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0432 \u0413\u0435\u0440\u043C\u0430\u043D\u0438\u0438. \u0414\u043B\u044F \u0430\u0434\u0430\u043F\u0442\u0435\u0440\u043E\u0432 \u0441\u043E\u043E\u0431\u0449\u0435\u0441\u0442\u0432\u0430, \u043F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430, \u043F\u0440\u043E\u0432\u0435\u0440\u044C\u0442\u0435 Github Readme \u0443\u044F\u0437\u0432\u0438\u043C\u043E\u0433\u043E \u0430\u0434\u0430\u043F\u0442\u0435\u0440\u0430 \u0434\u043B\u044F \u0434\u0435\u0442\u0430\u043B\u0435\u0439, \u043A\u0430\u043A\u043E\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 Sentry \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F.\\n\\n\u0415\u0441\u043B\u0438 \u0432\u044B \u0445\u043E\u0442\u0438\u0442\u0435 \u043E\u0442\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043E\u0442\u0447\u0435\u0442\u044B \u043E\u0431 \u043E\u0448\u0438\u0431\u043A\u0430\u0445, \u0432\u044B \u043C\u043E\u0436\u0435\u0442\u0435 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u043A\u043E\u043C\u0430\u043D\u0434\u0443\\n'iobroker plugin disable sentry'\\n\u042D\u0442\u0430 \u043A\u043E\u043C\u0430\u043D\u0434\u0430 \u0442\u0430\u043A\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u043B\u0435\u0434\u0438\u0442\u044C \u0437\u0430 \u0442\u0435\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0438 \u043E\u0434\u0438\u043D \u0430\u0434\u0430\u043F\u0442\u0435\u0440, \u0440\u0430\u0431\u043E\u0442\u0430\u044E\u0449\u0438\u0439 \u043D\u0430 \u044D\u0442\u043E\u043C \u0445\u043E\u0441\u0442\u0435, \u043D\u0435 \u043E\u0442\u043F\u0440\u0430\u0432\u043B\u044F\u043B \u0434\u0430\u043D\u043D\u044B\u0435 \u043E\u0442\u0447\u0435\u0442\u043E\u0432 \u043E \u0441\u0431\u043E\u044F\u0445 \u0447\u0430\u0441\u043E\u0432\u043E\u043C\u0443.\",\n pt: \"A ioBroker quer garantir o sistema dom\u00E9stico inteligente mais est\u00E1vel.\\nPara permitir isso, decidimos implementar uma solu\u00E7\u00E3o autom\u00E1tica de relat\u00F3rios de erros e falhas no controlador js e tamb\u00E9m nos adaptadores.\\n\\nESTE RELAT\u00D3RIO SER\u00C1 ATIVADO COM O PR\u00D3XIMO IN\u00CDCIO DO SEU IOBROKER!\\n\\nPara qualquer erro que leve ao travamento do controlador js ou de um dos adaptadores relevantes, os detalhes do erro ser\u00E3o enviados para um servidor. Para os controladores js e adaptadores principais, este servidor est\u00E1 localizado e operado na Alemanha. Para adaptadores da comunidade, consulte o Leia-me do Github do adaptador afetado para obter detalhes de qual servidor Sentry \u00E9 usado.\\n\\nSe voc\u00EA deseja desativar o relat\u00F3rio de erros, pode usar o comando\\n'iobroker plugin disable sentry'\\nEste comando tamb\u00E9m garantir\u00E1 que nenhum adaptador executado neste host envie dados de relat\u00F3rio de falha \u00E0 sentinela.\",\n nl: \"ioBroker wil ervoor zorgen dat het het meest stabiele slimme thuissysteem levert.\\nOm dit mogelijk te maken, hebben we besloten om een automatische fout- en crashrapportageoplossing in de js-controller en ook in adapters te implementeren.\\n\\nDEZE RAPPORTAGE WORDT INGESCHAKELD MET DE VOLGENDE START VAN UW IOBROKER!\\n\\nVoor elke fout die leidt tot het crashen van de js-controller of een van de relevante adapters, worden de foutdetails naar een server gestuurd. Voor de js-controller en core-adapters bevindt deze server zich in Duitsland. Raadpleeg voor communityadapters het Github Readme van de betreffende adapter voor details welke Sentry-server wordt gebruikt.\\n\\nAls u de foutrapportage wilt uitschakelen, kunt u de opdracht gebruiken\\n'iobroker plugin disable sentry'\\nDeze opdracht zorgt er ook voor dat geen enkele adapter die op deze host wordt uitgevoerd, crashrapportagegegevens naar de wachtpost verzendt.\",\n fr: \"ioBroker veut s'assurer de fournir le syst\u00E8me de maison intelligente le plus stable.\\nPour permettre cela, nous avons d\u00E9cid\u00E9 d'impl\u00E9menter une solution automatique de rapport d'erreurs et de plantages dans le contr\u00F4leur js et \u00E9galement dans les adaptateurs.\\n\\nCE RAPPORT SERA ACTIV\u00C9 AU PROCHAIN D\u00C9MARRAGE DE VOTRE IOBROKER!\\n\\nPour toute erreur entra\u00EEnant la panne du contr\u00F4leur js ou de l'un des adaptateurs concern\u00E9s, les d\u00E9tails de l'erreur sont envoy\u00E9s \u00E0 un serveur. Pour le contr\u00F4leur js et les adaptateurs principaux, ce serveur est situ\u00E9 et exploit\u00E9 en Allemagne. Pour les adaptateurs de communaut\u00E9, consultez le fichier Lisezmoi Github de l'adaptateur concern\u00E9 pour plus de d\u00E9tails sur le serveur Sentry utilis\u00E9.\\n\\nSi vous souhaitez d\u00E9sactiver le rapport d'erreurs, vous pouvez utiliser la commande\\n'iobroker plugin disable sentry'\\nCette commande s'assurera \u00E9galement qu'aucun adaptateur qui s'ex\u00E9cute sur cet h\u00F4te n'enverra de donn\u00E9es de rapport d'incident \u00E0 la sentinelle.\",\n it: \"ioBroker vuole assicurarsi di fornire il sistema di casa intelligente pi\u00F9 stabile.\\nPer consentire ci\u00F2, abbiamo deciso di implementare una soluzione di segnalazione automatica di errori e arresti anomali nel controller js e anche negli adattatori.\\n\\nQUESTA RENDICONTAZIONE SAR\u00C0 ABILITATA CON IL PROSSIMO INIZIO DEL TUO IOBROKER!\\n\\nPer qualsiasi errore che porta al crash del controller js o di uno dei relativi adattatori, i dettagli dell'errore vengono inviati a un server. Per il controller js e gli adattatori core questo server si trova e funziona in Germania. Per gli adattatori della comunit\u00E0, consultare il file Leggimi di Github dell'adattatore interessato per i dettagli su quale server Sentry viene utilizzato.\\n\\nSe si desidera disabilitare la segnalazione degli errori, \u00E8 possibile utilizzare il comando\\n'iobroker plugin disable sentry'\\nQuesto comando assicurer\u00E0 inoltre che nessun adattatore in esecuzione su questo host invier\u00E0 dati di segnalazione di crash a sentinella.\",\n es: \"ioBroker quiere asegurarse de ofrecer el sistema de hogar inteligente m\u00E1s estable.\\nPara permitir esto, decidimos implementar una soluci\u00F3n autom\u00E1tica de informe de errores y fallas en el controlador js y tambi\u00E9n en los adaptadores.\\n\\n\u00A1ESTE INFORME SER\u00C1 HABILITADO CON EL PR\u00D3XIMO INICIO DE SU IOBROKER!\\n\\nPara cualquier error que provoque el bloqueo del controlador js o de uno de los adaptadores relevantes, los detalles del error se env\u00EDan a un servidor. Para el controlador js y los adaptadores principales, este servidor est\u00E1 ubicado y funciona en Alemania. Para los adaptadores comunitarios, consulte el archivo L\u00E9ame de Github del adaptador afectado para obtener detalles sobre qu\u00E9 servidor Sentry se utiliza.\\n\\nSi desea deshabilitar el informe de errores, puede usar el comando\\n'iobroker plugin disable sentry'\\nEste comando tambi\u00E9n se asegurar\u00E1 de que ning\u00FAn adaptador que se ejecute en este host env\u00EDe datos de informes de fallas al centinela.\",\n pl: 'ioBroker chce zapewni\u0107 najbardziej stabilny system inteligentnego domu.\\nAby to umo\u017Cliwi\u0107, zdecydowali\u015Bmy si\u0119 wdro\u017Cy\u0107 automatyczne raportowanie b\u0142\u0119d\u00F3w i awarii w sterowniku js, a tak\u017Ce w adapterach.\\n\\nNINIEJSZE SPRAWOZDAWCZO\u015A\u0106 B\u0118DZIE W\u0141\u0104CZONA Z NAST\u0118PNYM STARTEM TWOJEGO IOBROKERA!\\n\\nW przypadku ka\u017Cdego b\u0142\u0119du, kt\u00F3ry prowadzi do awarii sterownika js lub jednego z odpowiednich adapter\u00F3w, szczeg\u00F3\u0142y b\u0142\u0119du s\u0105 wysy\u0142ane do serwera. W przypadku kontrolera js i podstawowych adapter\u00F3w serwer ten znajduje si\u0119 i dzia\u0142a w Niemczech. W przypadku adapter\u00F3w spo\u0142eczno\u015Bciowych sprawd\u017A plik Github Readme odpowiedniego adaptera, aby uzyska\u0107 szczeg\u00F3\u0142owe informacje na temat u\u017Cywanego serwera Sentry.\\n\\nJe\u015Bli chcesz wy\u0142\u0105czy\u0107 raportowanie b\u0142\u0119d\u00F3w, mo\u017Cesz u\u017Cy\u0107 polecenia\\n\u201Eiobroker plugin disable sentry\u201D\\nTo polecenie upewni si\u0119 r\u00F3wnie\u017C, \u017Ce \u017Caden adapter dzia\u0142aj\u0105cy na tym ho\u015Bcie nie wy\u015Ble danych raportowania awarii do wartownika.',\n uk: 'ioBroker \u0445\u043E\u0447\u0435 \u0437\u0430\u0431\u0435\u0437\u043F\u0435\u0447\u0438\u0442\u0438 \u043D\u0430\u0439\u0441\u0442\u0430\u0431\u0456\u043B\u044C\u043D\u0456\u0448\u0443 \u0441\u0438\u0441\u0442\u0435\u043C\u0443 \u0440\u043E\u0437\u0443\u043C\u043D\u043E\u0433\u043E \u0431\u0443\u0434\u0438\u043D\u043A\u0443.\\n\u0414\u043B\u044F \u0446\u044C\u043E\u0433\u043E \u043C\u0438 \u0432\u0438\u0440\u0456\u0448\u0438\u043B\u0438 \u0432\u043F\u0440\u043E\u0432\u0430\u0434\u0438\u0442\u0438 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u043D\u0435 \u043F\u043E\u0432\u0456\u0434\u043E\u043C\u043B\u0435\u043D\u043D\u044F \u043F\u0440\u043E \u043F\u043E\u043C\u0438\u043B\u043A\u0438 \u0442\u0430 \u0430\u0432\u0430\u0440\u0456\u0457 \u0432 \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u0435\u0440\u0456 js \u0442\u0430 \u0442\u0430\u043A\u043E\u0436 \u0432 \u0430\u0434\u0430\u043F\u0442\u0435\u0440\u0438.\\n\\n\u0426\u0415 \u0417\u0412\u0406\u0422\u0423\u0412\u0410\u041D\u041D\u042F \u0411\u0423\u0414\u0415 \u0410\u041A\u0422\u0418\u0412\u041E\u0412\u0410\u041D\u041E \u0417 \u041D\u0410\u0421\u0422\u0423\u041F\u041D\u0418\u041C \u0421\u0422\u0410\u0420\u0422\u041E\u041C \u0412\u0410\u0428\u041E\u0413\u041E IOBROKER!\\n\\n\u0414\u043B\u044F \u0431\u0443\u0434\u044C-\u044F\u043A\u043E\u0457 \u043F\u043E\u043C\u0438\u043B\u043A\u0438, \u044F\u043A\u0430 \u043F\u0440\u0438\u0437\u0432\u043E\u0434\u0438\u0442\u044C \u0434\u043E \u0430\u0432\u0430\u0440\u0456\u0457 \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u0435\u0440\u0430 js \u0430\u0431\u043E \u043E\u0434\u043D\u043E\u0433\u043E \u0437 \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u043D\u0438\u0445 \u0430\u0434\u0430\u043F\u0442\u0435\u0440\u0456\u0432, \u0434\u0435\u0442\u0430\u043B\u0456 \u043F\u043E\u043C\u0438\u043B\u043A\u0438 \u043D\u0430\u0434\u0441\u0438\u043B\u0430\u044E\u0442\u044C\u0441\u044F \u043D\u0430 \u0441\u0435\u0440\u0432\u0435\u0440. \u0414\u043B\u044F \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u0435\u0440\u0430 js \u0442\u0430 \u043E\u0441\u043D\u043E\u0432\u043D\u0438\u0445 \u0430\u0434\u0430\u043F\u0442\u0435\u0440\u0456\u0432 \u0446\u0435\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u0440\u043E\u0437\u0442\u0430\u0448\u043E\u0432\u0430\u043D\u0438\u0439 \u0442\u0430 \u043F\u0440\u0430\u0446\u044E\u0454 \u0432 \u041D\u0456\u043C\u0435\u0447\u0447\u0438\u043D\u0456. \u0414\u043B\u044F \u0430\u0434\u0430\u043F\u0442\u0435\u0440\u0456\u0432 \u0441\u043F\u0456\u043B\u044C\u043D\u043E\u0442\u0438 \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u0442\u0435 \u0444\u0430\u0439\u043B Github Readme \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u043D\u043E\u0433\u043E \u0430\u0434\u0430\u043F\u0442\u0435\u0440\u0430 \u0434\u043B\u044F \u043E\u0442\u0440\u0438\u043C\u0430\u043D\u043D\u044F \u0434\u0435\u0442\u0430\u043B\u0435\u0439 \u043F\u0440\u043E \u0442\u0435, \u044F\u043A\u0438\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 Sentry \u0432\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u043E\u0432\u0443\u0454\u0442\u044C\u0441\u044F.\\n\\n\u042F\u043A\u0449\u043E \u0432\u0438 \u0445\u043E\u0447\u0435\u0442\u0435 \u0432\u0438\u043C\u043A\u043D\u0443\u0442\u0438 \u0437\u0432\u0456\u0442 \u043F\u0440\u043E \u043F\u043E\u043C\u0438\u043B\u043A\u0438, \u0432\u0438 \u043C\u043E\u0436\u0435\u0442\u0435 \u0432\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u043E\u0432\u0443\u0432\u0430\u0442\u0438 \u043A\u043E\u043C\u0430\u043D\u0434\u0443\\n\u201Ciobroker plugin disable sentry\u201D\\n\u0426\u044F \u043A\u043E\u043C\u0430\u043D\u0434\u0430 \u0442\u0430\u043A\u043E\u0436 \u043F\u0435\u0440\u0435\u043A\u043E\u043D\u0430\u0454\u0442\u044C\u0441\u044F, \u0449\u043E \u0436\u043E\u0434\u0435\u043D \u0430\u0434\u0430\u043F\u0442\u0435\u0440, \u044F\u043A\u0438\u0439 \u043F\u0440\u0430\u0446\u044E\u0454 \u043D\u0430 \u0446\u044C\u043E\u043C\u0443 \u0445\u043E\u0441\u0442\u0456, \u043D\u0435 \u043D\u0430\u0434\u0441\u0438\u043B\u0430\u0442\u0438\u043C\u0435 \u0434\u0430\u043D\u0456 \u0437\u0432\u0456\u0442\u0443 \u043F\u0440\u043E \u0430\u0432\u0430\u0440\u0456\u044E \u0434\u043E \u0432\u0430\u0440\u0442\u043E\u0432\u043E\u0433\u043E.',\n 'zh-cn':\n 'ioBroker\u5E0C\u671B\u786E\u4FDD\u63D0\u4F9B\u6700\u7A33\u5B9A\u7684\u667A\u80FD\u5BB6\u5C45\u7CFB\u7EDF\u3002\\n\u4E3A\u6B64\uFF0C\u6211\u4EEC\u51B3\u5B9A\u5728js-controller\u548C\u9002\u914D\u5668\u4E2D\u5B9E\u73B0\u81EA\u52A8\u9519\u8BEF\u548C\u5D29\u6E83\u62A5\u544A\u89E3\u51B3\u65B9\u6848\u3002\\n\\n\u60A8\u7684\u70B8\u5F39\u4EBA\u7684\u4E0B\u4E00\u4E2A\u5F00\u59CB\u5C06\u542F\u7528\u6B64\u62A5\u544A\uFF01\\n\\n\u5BF9\u4E8E\u5BFC\u81F4js-controller\u6216\u76F8\u5173\u9002\u914D\u5668\u4E4B\u4E00\u5D29\u6E83\u7684\u4EFB\u4F55\u9519\u8BEF\uFF0C\u9519\u8BEF\u8BE6\u7EC6\u4FE1\u606F\u5C06\u53D1\u9001\u5230\u670D\u52A1\u5668\u3002\u5BF9\u4E8Ejs-controller\u548C\u6838\u5FC3\u9002\u914D\u5668\uFF0C\u6B64\u670D\u52A1\u5668\u4F4D\u4E8E\u5FB7\u56FD\u5E76\u5728\u5176\u4E2D\u8FD0\u884C\u3002\u5BF9\u4E8E\u793E\u533A\u9002\u914D\u5668\uFF0C\u8BF7\u68C0\u67E5\u53D7\u5F71\u54CD\u7684\u9002\u914D\u5668\u7684Github\u81EA\u8FF0\u6587\u4EF6\uFF0C\u4EE5\u4E86\u89E3\u4F7F\u7528\u54EA\u4E2ASentry\u670D\u52A1\u5668\u7684\u8BE6\u7EC6\u4FE1\u606F\u3002\\n\\n\u5982\u679C\u8981\u7981\u7528\u9519\u8BEF\u62A5\u544A\uFF0C\u53EF\u4EE5\u4F7F\u7528\u4EE5\u4E0B\u547D\u4EE4\\n\u201C iobroker plugin disable sentry\u201D\\n\u6B64\u547D\u4EE4\u8FD8\u5C06\u786E\u4FDD\u5728\u6B64\u4E3B\u673A\u4E0A\u8FD0\u884C\u7684\u4EFB\u4F55\u9002\u914D\u5668\u90FD\u4E0D\u4F1A\u5C06\u5D29\u6E83\u62A5\u544A\u6570\u636E\u53D1\u9001\u5230\u54E8\u5175\u3002',\n },\n },\n} as const;\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;AAAA;;;;;;AACM,SAAU,kBAAkB,MAAY;AAC1C,SAAO,SAAS;AACpB;AAEO,MAAM,eAAe;EACxB,QAAQ;IACJ,UAAU;MACN,IAAI;MACJ,IAAI;MACJ,IAAI;MACJ,IAAI;MACJ,IAAI;MACJ,IAAI;MACJ,IAAI;MACJ,IAAI;MACJ,IAAI;MACJ,IAAI;MACJ,SAAS;;IAEb,MAAM;MACF,IAAI;MACJ,IAAI;MACJ,IAAI;MACJ,IAAI;MACJ,IAAI;MACJ,IAAI;MACJ,IAAI;MACJ,IAAI;MACJ,IAAI;MACJ,IAAI;MACJ,SACI;;;;",
4
+ "sourcesContent": ["// Special Handling to inform users about reporting plugins correctly\n/**\n * Check whether the given plugin reports data to an external service (e.g. Sentry)\n *\n * @param name The plugin name to check\n */\nexport function isReportingPlugin(name: string): boolean {\n return name === 'sentry';\n}\n\nexport const PLUGIN_INFOS = {\n sentry: {\n headline: {\n en: 'ATTENTION: Error reporting via Sentry will be activated on next start of ioBroker',\n de: 'ACHTUNG: Die Fehlerberichterstattung \u00FCber Sentry wird beim n\u00E4chsten Start von ioBroker aktiviert',\n ru: '\u0412\u041D\u0418\u041C\u0410\u041D\u0418\u0415: \u041E\u0442\u0447\u0435\u0442 \u043E\u0431 \u043E\u0448\u0438\u0431\u043A\u0430\u0445 \u0447\u0435\u0440\u0435\u0437 Sentry \u0431\u0443\u0434\u0435\u0442 \u0430\u043A\u0442\u0438\u0432\u0438\u0440\u043E\u0432\u0430\u043D \u043F\u0440\u0438 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u043C \u0437\u0430\u043F\u0443\u0441\u043A\u0435 ioBroker',\n pt: 'ATEN\u00C7\u00C3O: O relat\u00F3rio de erros via Sentry ser\u00E1 ativado no pr\u00F3ximo in\u00EDcio do ioBroker',\n nl: 'LET OP: Foutrapportage via Sentry wordt geactiveerd bij de volgende start van ioBroker',\n fr: \"ATTENTION: Le rapport d'erreurs via Sentry sera activ\u00E9 au prochain d\u00E9marrage d'ioBroker\",\n it: 'ATTENZIONE: la segnalazione degli errori tramite Sentry verr\u00E0 attivata al prossimo avvio di ioBroker',\n es: 'ATENCI\u00D3N: el informe de errores a trav\u00E9s de Sentry se activar\u00E1 en el pr\u00F3ximo inicio de ioBroker',\n pl: 'UWAGA: Raportowanie b\u0142\u0119d\u00F3w za po\u015Brednictwem Sentry zostanie aktywowane przy nast\u0119pnym uruchomieniu ioBroker',\n uk: '\u0423\u0412\u0410\u0413\u0410: \u0417\u0432\u0456\u0442 \u043F\u0440\u043E \u043F\u043E\u043C\u0438\u043B\u043A\u0438 \u0447\u0435\u0440\u0435\u0437 Sentry \u0431\u0443\u0434\u0435 \u0430\u043A\u0442\u0438\u0432\u043E\u0432\u0430\u043D\u043E \u043F\u0440\u0438 \u043D\u0430\u0441\u0442\u0443\u043F\u043D\u043E\u043C\u0443 \u0437\u0430\u043F\u0443\u0441\u043A\u0443 ioBroker',\n 'zh-cn': '\u6CE8\u610F\uFF1A\u901A\u8FC7Sentry\u7684\u9519\u8BEF\u62A5\u544A\u5C06\u5728ioBroker\u7684\u4E0B\u4E00\u6B21\u542F\u52A8\u65F6\u88AB\u6FC0\u6D3B',\n },\n text: {\n en: \"ioBroker wants to make sure to deliver the most stable smart home system.\\nTo allow this we decided to implement an automatic error and crash reporting solution into the js-controller and also into adapters. \\n\\nTHIS REPORTING WILL BE ENABLED WITH THE NEXT START OF YOUR IOBROKER!\\n\\nFor any error that leads to the crash of the js-controller or one of the relevant adapters the error details are send to a server. For the js-controller and core adapters this server is located and operated in germany. For community adapters please check the Github Readme of the affected adapter for details which Sentry server is used.\\n\\nIf you want to disable the error reporting you can use the command\\n'iobroker plugin disable sentry'\\nThis command will also make sure that no adapter that runs on this host will send crash reporting data to sentry.\",\n de: \"Wir von ioBroker wollen das stabilste Smart-Home-System bereitstellen.\\nUm dies zu erm\u00F6glichen, haben wir uns entschlossen, eine automatische Fehler- und Crash-Reporting-L\u00F6sung in den js-Controller und auch in Adapter zu implementieren.\\n\\nDIESE BERICHTERSTATTUNG WIRD MIT DEM N\u00C4CHSTEN START IHRES IOBROKERS AKTIVIERT!\\n\\nBei Fehlern, die zum Absturz des js-Controllers oder eines der relevanten Adapter f\u00FChren, werden die Fehlerdetails an einen Server gesendet. F\u00FCr den js-controller und die Haupt-Adapter befindet sich dieser Server in Deutschland. Informationen zu Community-Adaptern sind in der Github-Readme-Datei des betroffenen Adapters zu finden. Dort steht welcher Sentry-Server verwendet wird.\\n\\nDie Fehlerberichterstattung kann, falls gew\u00FCnscht, \u00FCber den Befehl\\n'iobroker plugin disable sentry'\\ndeaktiviert werden. Dieser Befehl stellt auch sicher, dass kein Adapter, der auf diesem Host ausgef\u00FChrt wird, Absturzberichtsdaten an den Sentry-Server sendet.\",\n ru: \"ioBroker \u0445\u043E\u0447\u0435\u0442 \u043E\u0431\u0435\u0441\u043F\u0435\u0447\u0438\u0442\u044C \u0441\u0430\u043C\u0443\u044E \u0441\u0442\u0430\u0431\u0438\u043B\u044C\u043D\u0443\u044E \u0441\u0438\u0441\u0442\u0435\u043C\u0443 \u0443\u043C\u043D\u043E\u0433\u043E \u0434\u043E\u043C\u0430.\\n\u0427\u0442\u043E\u0431\u044B \u0441\u0434\u0435\u043B\u0430\u0442\u044C \u044D\u0442\u043E, \u043C\u044B \u0440\u0435\u0448\u0438\u043B\u0438 \u0432\u043D\u0435\u0434\u0440\u0438\u0442\u044C \u0440\u0435\u0448\u0435\u043D\u0438\u0435 \u0434\u043B\u044F \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0433\u043E \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u043E\u0431 \u043E\u0448\u0438\u0431\u043A\u0430\u0445 \u0438 \u0441\u0431\u043E\u044F\u0445 \u0432 js-\u043A\u043E\u043D\u0442\u0440\u043E\u043B\u043B\u0435\u0440, \u0430 \u0442\u0430\u043A\u0436\u0435 \u0432 \u0430\u0434\u0430\u043F\u0442\u0435\u0440\u044B.\\n\\n\u042D\u0422\u0410 \u041E\u0422\u0427\u0415\u0422\u041D\u041E\u0421\u0422\u042C \u0411\u0423\u0414\u0415\u0422 \u0412\u041A\u041B\u042E\u0427\u0415\u041D\u0410 \u0421 \u0421\u041B\u0415\u0414\u0423\u042E\u0429\u0418\u041C \u0421\u0422\u0410\u0420\u0422\u041E\u041C \u0412\u0410\u0428\u0415\u0413\u041E IOBROKER!\\n\\n\u0414\u043B\u044F \u043B\u044E\u0431\u043E\u0439 \u043E\u0448\u0438\u0431\u043A\u0438, \u043A\u043E\u0442\u043E\u0440\u0430\u044F \u043F\u0440\u0438\u0432\u043E\u0434\u0438\u0442 \u043A \u0441\u0431\u043E\u044E js-\u043A\u043E\u043D\u0442\u0440\u043E\u043B\u043B\u0435\u0440\u0430 \u0438\u043B\u0438 \u043E\u0434\u043D\u043E\u0433\u043E \u0438\u0437 \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044E\u0449\u0438\u0445 \u0430\u0434\u0430\u043F\u0442\u0435\u0440\u043E\u0432, \u043F\u043E\u0434\u0440\u043E\u0431\u043D\u043E\u0441\u0442\u0438 \u043E\u0448\u0438\u0431\u043A\u0438 \u043E\u0442\u043F\u0440\u0430\u0432\u043B\u044F\u044E\u0442\u0441\u044F \u043D\u0430 \u0441\u0435\u0440\u0432\u0435\u0440. \u0414\u043B\u044F js-\u043A\u043E\u043D\u0442\u0440\u043E\u043B\u043B\u0435\u0440\u0430 \u0438 \u0431\u0430\u0437\u043E\u0432\u044B\u0445 \u0430\u0434\u0430\u043F\u0442\u0435\u0440\u043E\u0432 \u044D\u0442\u043E\u0442 \u0441\u0435\u0440\u0432\u0435\u0440 \u0440\u0430\u0441\u043F\u043E\u043B\u043E\u0436\u0435\u043D \u0438 \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442 \u0432 \u0413\u0435\u0440\u043C\u0430\u043D\u0438\u0438. \u0414\u043B\u044F \u0430\u0434\u0430\u043F\u0442\u0435\u0440\u043E\u0432 \u0441\u043E\u043E\u0431\u0449\u0435\u0441\u0442\u0432\u0430, \u043F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430, \u043F\u0440\u043E\u0432\u0435\u0440\u044C\u0442\u0435 Github Readme \u0443\u044F\u0437\u0432\u0438\u043C\u043E\u0433\u043E \u0430\u0434\u0430\u043F\u0442\u0435\u0440\u0430 \u0434\u043B\u044F \u0434\u0435\u0442\u0430\u043B\u0435\u0439, \u043A\u0430\u043A\u043E\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 Sentry \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F.\\n\\n\u0415\u0441\u043B\u0438 \u0432\u044B \u0445\u043E\u0442\u0438\u0442\u0435 \u043E\u0442\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043E\u0442\u0447\u0435\u0442\u044B \u043E\u0431 \u043E\u0448\u0438\u0431\u043A\u0430\u0445, \u0432\u044B \u043C\u043E\u0436\u0435\u0442\u0435 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u043A\u043E\u043C\u0430\u043D\u0434\u0443\\n'iobroker plugin disable sentry'\\n\u042D\u0442\u0430 \u043A\u043E\u043C\u0430\u043D\u0434\u0430 \u0442\u0430\u043A\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u043B\u0435\u0434\u0438\u0442\u044C \u0437\u0430 \u0442\u0435\u043C, \u0447\u0442\u043E\u0431\u044B \u043D\u0438 \u043E\u0434\u0438\u043D \u0430\u0434\u0430\u043F\u0442\u0435\u0440, \u0440\u0430\u0431\u043E\u0442\u0430\u044E\u0449\u0438\u0439 \u043D\u0430 \u044D\u0442\u043E\u043C \u0445\u043E\u0441\u0442\u0435, \u043D\u0435 \u043E\u0442\u043F\u0440\u0430\u0432\u043B\u044F\u043B \u0434\u0430\u043D\u043D\u044B\u0435 \u043E\u0442\u0447\u0435\u0442\u043E\u0432 \u043E \u0441\u0431\u043E\u044F\u0445 \u0447\u0430\u0441\u043E\u0432\u043E\u043C\u0443.\",\n pt: \"A ioBroker quer garantir o sistema dom\u00E9stico inteligente mais est\u00E1vel.\\nPara permitir isso, decidimos implementar uma solu\u00E7\u00E3o autom\u00E1tica de relat\u00F3rios de erros e falhas no controlador js e tamb\u00E9m nos adaptadores.\\n\\nESTE RELAT\u00D3RIO SER\u00C1 ATIVADO COM O PR\u00D3XIMO IN\u00CDCIO DO SEU IOBROKER!\\n\\nPara qualquer erro que leve ao travamento do controlador js ou de um dos adaptadores relevantes, os detalhes do erro ser\u00E3o enviados para um servidor. Para os controladores js e adaptadores principais, este servidor est\u00E1 localizado e operado na Alemanha. Para adaptadores da comunidade, consulte o Leia-me do Github do adaptador afetado para obter detalhes de qual servidor Sentry \u00E9 usado.\\n\\nSe voc\u00EA deseja desativar o relat\u00F3rio de erros, pode usar o comando\\n'iobroker plugin disable sentry'\\nEste comando tamb\u00E9m garantir\u00E1 que nenhum adaptador executado neste host envie dados de relat\u00F3rio de falha \u00E0 sentinela.\",\n nl: \"ioBroker wil ervoor zorgen dat het het meest stabiele slimme thuissysteem levert.\\nOm dit mogelijk te maken, hebben we besloten om een automatische fout- en crashrapportageoplossing in de js-controller en ook in adapters te implementeren.\\n\\nDEZE RAPPORTAGE WORDT INGESCHAKELD MET DE VOLGENDE START VAN UW IOBROKER!\\n\\nVoor elke fout die leidt tot het crashen van de js-controller of een van de relevante adapters, worden de foutdetails naar een server gestuurd. Voor de js-controller en core-adapters bevindt deze server zich in Duitsland. Raadpleeg voor communityadapters het Github Readme van de betreffende adapter voor details welke Sentry-server wordt gebruikt.\\n\\nAls u de foutrapportage wilt uitschakelen, kunt u de opdracht gebruiken\\n'iobroker plugin disable sentry'\\nDeze opdracht zorgt er ook voor dat geen enkele adapter die op deze host wordt uitgevoerd, crashrapportagegegevens naar de wachtpost verzendt.\",\n fr: \"ioBroker veut s'assurer de fournir le syst\u00E8me de maison intelligente le plus stable.\\nPour permettre cela, nous avons d\u00E9cid\u00E9 d'impl\u00E9menter une solution automatique de rapport d'erreurs et de plantages dans le contr\u00F4leur js et \u00E9galement dans les adaptateurs.\\n\\nCE RAPPORT SERA ACTIV\u00C9 AU PROCHAIN D\u00C9MARRAGE DE VOTRE IOBROKER!\\n\\nPour toute erreur entra\u00EEnant la panne du contr\u00F4leur js ou de l'un des adaptateurs concern\u00E9s, les d\u00E9tails de l'erreur sont envoy\u00E9s \u00E0 un serveur. Pour le contr\u00F4leur js et les adaptateurs principaux, ce serveur est situ\u00E9 et exploit\u00E9 en Allemagne. Pour les adaptateurs de communaut\u00E9, consultez le fichier Lisezmoi Github de l'adaptateur concern\u00E9 pour plus de d\u00E9tails sur le serveur Sentry utilis\u00E9.\\n\\nSi vous souhaitez d\u00E9sactiver le rapport d'erreurs, vous pouvez utiliser la commande\\n'iobroker plugin disable sentry'\\nCette commande s'assurera \u00E9galement qu'aucun adaptateur qui s'ex\u00E9cute sur cet h\u00F4te n'enverra de donn\u00E9es de rapport d'incident \u00E0 la sentinelle.\",\n it: \"ioBroker vuole assicurarsi di fornire il sistema di casa intelligente pi\u00F9 stabile.\\nPer consentire ci\u00F2, abbiamo deciso di implementare una soluzione di segnalazione automatica di errori e arresti anomali nel controller js e anche negli adattatori.\\n\\nQUESTA RENDICONTAZIONE SAR\u00C0 ABILITATA CON IL PROSSIMO INIZIO DEL TUO IOBROKER!\\n\\nPer qualsiasi errore che porta al crash del controller js o di uno dei relativi adattatori, i dettagli dell'errore vengono inviati a un server. Per il controller js e gli adattatori core questo server si trova e funziona in Germania. Per gli adattatori della comunit\u00E0, consultare il file Leggimi di Github dell'adattatore interessato per i dettagli su quale server Sentry viene utilizzato.\\n\\nSe si desidera disabilitare la segnalazione degli errori, \u00E8 possibile utilizzare il comando\\n'iobroker plugin disable sentry'\\nQuesto comando assicurer\u00E0 inoltre che nessun adattatore in esecuzione su questo host invier\u00E0 dati di segnalazione di crash a sentinella.\",\n es: \"ioBroker quiere asegurarse de ofrecer el sistema de hogar inteligente m\u00E1s estable.\\nPara permitir esto, decidimos implementar una soluci\u00F3n autom\u00E1tica de informe de errores y fallas en el controlador js y tambi\u00E9n en los adaptadores.\\n\\n\u00A1ESTE INFORME SER\u00C1 HABILITADO CON EL PR\u00D3XIMO INICIO DE SU IOBROKER!\\n\\nPara cualquier error que provoque el bloqueo del controlador js o de uno de los adaptadores relevantes, los detalles del error se env\u00EDan a un servidor. Para el controlador js y los adaptadores principales, este servidor est\u00E1 ubicado y funciona en Alemania. Para los adaptadores comunitarios, consulte el archivo L\u00E9ame de Github del adaptador afectado para obtener detalles sobre qu\u00E9 servidor Sentry se utiliza.\\n\\nSi desea deshabilitar el informe de errores, puede usar el comando\\n'iobroker plugin disable sentry'\\nEste comando tambi\u00E9n se asegurar\u00E1 de que ning\u00FAn adaptador que se ejecute en este host env\u00EDe datos de informes de fallas al centinela.\",\n pl: 'ioBroker chce zapewni\u0107 najbardziej stabilny system inteligentnego domu.\\nAby to umo\u017Cliwi\u0107, zdecydowali\u015Bmy si\u0119 wdro\u017Cy\u0107 automatyczne raportowanie b\u0142\u0119d\u00F3w i awarii w sterowniku js, a tak\u017Ce w adapterach.\\n\\nNINIEJSZE SPRAWOZDAWCZO\u015A\u0106 B\u0118DZIE W\u0141\u0104CZONA Z NAST\u0118PNYM STARTEM TWOJEGO IOBROKERA!\\n\\nW przypadku ka\u017Cdego b\u0142\u0119du, kt\u00F3ry prowadzi do awarii sterownika js lub jednego z odpowiednich adapter\u00F3w, szczeg\u00F3\u0142y b\u0142\u0119du s\u0105 wysy\u0142ane do serwera. W przypadku kontrolera js i podstawowych adapter\u00F3w serwer ten znajduje si\u0119 i dzia\u0142a w Niemczech. W przypadku adapter\u00F3w spo\u0142eczno\u015Bciowych sprawd\u017A plik Github Readme odpowiedniego adaptera, aby uzyska\u0107 szczeg\u00F3\u0142owe informacje na temat u\u017Cywanego serwera Sentry.\\n\\nJe\u015Bli chcesz wy\u0142\u0105czy\u0107 raportowanie b\u0142\u0119d\u00F3w, mo\u017Cesz u\u017Cy\u0107 polecenia\\n\u201Eiobroker plugin disable sentry\u201D\\nTo polecenie upewni si\u0119 r\u00F3wnie\u017C, \u017Ce \u017Caden adapter dzia\u0142aj\u0105cy na tym ho\u015Bcie nie wy\u015Ble danych raportowania awarii do wartownika.',\n uk: 'ioBroker \u0445\u043E\u0447\u0435 \u0437\u0430\u0431\u0435\u0437\u043F\u0435\u0447\u0438\u0442\u0438 \u043D\u0430\u0439\u0441\u0442\u0430\u0431\u0456\u043B\u044C\u043D\u0456\u0448\u0443 \u0441\u0438\u0441\u0442\u0435\u043C\u0443 \u0440\u043E\u0437\u0443\u043C\u043D\u043E\u0433\u043E \u0431\u0443\u0434\u0438\u043D\u043A\u0443.\\n\u0414\u043B\u044F \u0446\u044C\u043E\u0433\u043E \u043C\u0438 \u0432\u0438\u0440\u0456\u0448\u0438\u043B\u0438 \u0432\u043F\u0440\u043E\u0432\u0430\u0434\u0438\u0442\u0438 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u043D\u0435 \u043F\u043E\u0432\u0456\u0434\u043E\u043C\u043B\u0435\u043D\u043D\u044F \u043F\u0440\u043E \u043F\u043E\u043C\u0438\u043B\u043A\u0438 \u0442\u0430 \u0430\u0432\u0430\u0440\u0456\u0457 \u0432 \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u0435\u0440\u0456 js \u0442\u0430 \u0442\u0430\u043A\u043E\u0436 \u0432 \u0430\u0434\u0430\u043F\u0442\u0435\u0440\u0438.\\n\\n\u0426\u0415 \u0417\u0412\u0406\u0422\u0423\u0412\u0410\u041D\u041D\u042F \u0411\u0423\u0414\u0415 \u0410\u041A\u0422\u0418\u0412\u041E\u0412\u0410\u041D\u041E \u0417 \u041D\u0410\u0421\u0422\u0423\u041F\u041D\u0418\u041C \u0421\u0422\u0410\u0420\u0422\u041E\u041C \u0412\u0410\u0428\u041E\u0413\u041E IOBROKER!\\n\\n\u0414\u043B\u044F \u0431\u0443\u0434\u044C-\u044F\u043A\u043E\u0457 \u043F\u043E\u043C\u0438\u043B\u043A\u0438, \u044F\u043A\u0430 \u043F\u0440\u0438\u0437\u0432\u043E\u0434\u0438\u0442\u044C \u0434\u043E \u0430\u0432\u0430\u0440\u0456\u0457 \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u0435\u0440\u0430 js \u0430\u0431\u043E \u043E\u0434\u043D\u043E\u0433\u043E \u0437 \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u043D\u0438\u0445 \u0430\u0434\u0430\u043F\u0442\u0435\u0440\u0456\u0432, \u0434\u0435\u0442\u0430\u043B\u0456 \u043F\u043E\u043C\u0438\u043B\u043A\u0438 \u043D\u0430\u0434\u0441\u0438\u043B\u0430\u044E\u0442\u044C\u0441\u044F \u043D\u0430 \u0441\u0435\u0440\u0432\u0435\u0440. \u0414\u043B\u044F \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u0435\u0440\u0430 js \u0442\u0430 \u043E\u0441\u043D\u043E\u0432\u043D\u0438\u0445 \u0430\u0434\u0430\u043F\u0442\u0435\u0440\u0456\u0432 \u0446\u0435\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u0440\u043E\u0437\u0442\u0430\u0448\u043E\u0432\u0430\u043D\u0438\u0439 \u0442\u0430 \u043F\u0440\u0430\u0446\u044E\u0454 \u0432 \u041D\u0456\u043C\u0435\u0447\u0447\u0438\u043D\u0456. \u0414\u043B\u044F \u0430\u0434\u0430\u043F\u0442\u0435\u0440\u0456\u0432 \u0441\u043F\u0456\u043B\u044C\u043D\u043E\u0442\u0438 \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u0442\u0435 \u0444\u0430\u0439\u043B Github Readme \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u043D\u043E\u0433\u043E \u0430\u0434\u0430\u043F\u0442\u0435\u0440\u0430 \u0434\u043B\u044F \u043E\u0442\u0440\u0438\u043C\u0430\u043D\u043D\u044F \u0434\u0435\u0442\u0430\u043B\u0435\u0439 \u043F\u0440\u043E \u0442\u0435, \u044F\u043A\u0438\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 Sentry \u0432\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u043E\u0432\u0443\u0454\u0442\u044C\u0441\u044F.\\n\\n\u042F\u043A\u0449\u043E \u0432\u0438 \u0445\u043E\u0447\u0435\u0442\u0435 \u0432\u0438\u043C\u043A\u043D\u0443\u0442\u0438 \u0437\u0432\u0456\u0442 \u043F\u0440\u043E \u043F\u043E\u043C\u0438\u043B\u043A\u0438, \u0432\u0438 \u043C\u043E\u0436\u0435\u0442\u0435 \u0432\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u043E\u0432\u0443\u0432\u0430\u0442\u0438 \u043A\u043E\u043C\u0430\u043D\u0434\u0443\\n\u201Ciobroker plugin disable sentry\u201D\\n\u0426\u044F \u043A\u043E\u043C\u0430\u043D\u0434\u0430 \u0442\u0430\u043A\u043E\u0436 \u043F\u0435\u0440\u0435\u043A\u043E\u043D\u0430\u0454\u0442\u044C\u0441\u044F, \u0449\u043E \u0436\u043E\u0434\u0435\u043D \u0430\u0434\u0430\u043F\u0442\u0435\u0440, \u044F\u043A\u0438\u0439 \u043F\u0440\u0430\u0446\u044E\u0454 \u043D\u0430 \u0446\u044C\u043E\u043C\u0443 \u0445\u043E\u0441\u0442\u0456, \u043D\u0435 \u043D\u0430\u0434\u0441\u0438\u043B\u0430\u0442\u0438\u043C\u0435 \u0434\u0430\u043D\u0456 \u0437\u0432\u0456\u0442\u0443 \u043F\u0440\u043E \u0430\u0432\u0430\u0440\u0456\u044E \u0434\u043E \u0432\u0430\u0440\u0442\u043E\u0432\u043E\u0433\u043E.',\n 'zh-cn':\n 'ioBroker\u5E0C\u671B\u786E\u4FDD\u63D0\u4F9B\u6700\u7A33\u5B9A\u7684\u667A\u80FD\u5BB6\u5C45\u7CFB\u7EDF\u3002\\n\u4E3A\u6B64\uFF0C\u6211\u4EEC\u51B3\u5B9A\u5728js-controller\u548C\u9002\u914D\u5668\u4E2D\u5B9E\u73B0\u81EA\u52A8\u9519\u8BEF\u548C\u5D29\u6E83\u62A5\u544A\u89E3\u51B3\u65B9\u6848\u3002\\n\\n\u60A8\u7684\u70B8\u5F39\u4EBA\u7684\u4E0B\u4E00\u4E2A\u5F00\u59CB\u5C06\u542F\u7528\u6B64\u62A5\u544A\uFF01\\n\\n\u5BF9\u4E8E\u5BFC\u81F4js-controller\u6216\u76F8\u5173\u9002\u914D\u5668\u4E4B\u4E00\u5D29\u6E83\u7684\u4EFB\u4F55\u9519\u8BEF\uFF0C\u9519\u8BEF\u8BE6\u7EC6\u4FE1\u606F\u5C06\u53D1\u9001\u5230\u670D\u52A1\u5668\u3002\u5BF9\u4E8Ejs-controller\u548C\u6838\u5FC3\u9002\u914D\u5668\uFF0C\u6B64\u670D\u52A1\u5668\u4F4D\u4E8E\u5FB7\u56FD\u5E76\u5728\u5176\u4E2D\u8FD0\u884C\u3002\u5BF9\u4E8E\u793E\u533A\u9002\u914D\u5668\uFF0C\u8BF7\u68C0\u67E5\u53D7\u5F71\u54CD\u7684\u9002\u914D\u5668\u7684Github\u81EA\u8FF0\u6587\u4EF6\uFF0C\u4EE5\u4E86\u89E3\u4F7F\u7528\u54EA\u4E2ASentry\u670D\u52A1\u5668\u7684\u8BE6\u7EC6\u4FE1\u606F\u3002\\n\\n\u5982\u679C\u8981\u7981\u7528\u9519\u8BEF\u62A5\u544A\uFF0C\u53EF\u4EE5\u4F7F\u7528\u4EE5\u4E0B\u547D\u4EE4\\n\u201C iobroker plugin disable sentry\u201D\\n\u6B64\u547D\u4EE4\u8FD8\u5C06\u786E\u4FDD\u5728\u6B64\u4E3B\u673A\u4E0A\u8FD0\u884C\u7684\u4EFB\u4F55\u9002\u914D\u5668\u90FD\u4E0D\u4F1A\u5C06\u5D29\u6E83\u62A5\u544A\u6570\u636E\u53D1\u9001\u5230\u54E8\u5175\u3002',\n },\n },\n} as const;\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;;;;;;AAMM,SAAU,kBAAkB,MAAY;AAC1C,SAAO,SAAS;AACpB;AAEO,MAAM,eAAe;EACxB,QAAQ;IACJ,UAAU;MACN,IAAI;MACJ,IAAI;MACJ,IAAI;MACJ,IAAI;MACJ,IAAI;MACJ,IAAI;MACJ,IAAI;MACJ,IAAI;MACJ,IAAI;MACJ,IAAI;MACJ,SAAS;;IAEb,MAAM;MACF,IAAI;MACJ,IAAI;MACJ,IAAI;MACJ,IAAI;MACJ,IAAI;MACJ,IAAI;MACJ,IAAI;MACJ,IAAI;MACJ,IAAI;MACJ,IAAI;MACJ,SACI;;;;",
6
6
  "names": []
7
7
  }
@@ -2,14 +2,22 @@ import { EXIT_CODES } from '@iobroker/js-controller-common';
2
2
  import type { Client as StatesRedisClient } from '@iobroker/db-states-redis';
3
3
  import type { Client as ObjectsRedisClient } from '@iobroker/db-objects-redis';
4
4
  import type { CleanDatabaseHandler, ProcessExitCallback, RestartController } from '../_Types.js';
5
+ /** Options for the backup/restore command */
5
6
  export interface CLIBackupRestoreOptions {
7
+ /** Whether this is part of a database migration */
6
8
  dbMigration?: boolean;
9
+ /** The states database client */
7
10
  states: StatesRedisClient;
11
+ /** The objects database client */
8
12
  objects: ObjectsRedisClient;
13
+ /** Callback to exit the process with an exit code */
9
14
  processExit: ProcessExitCallback;
15
+ /** Handler to clean the database */
10
16
  cleanDatabase: CleanDatabaseHandler;
17
+ /** Handler to restart the controller */
11
18
  restartController: RestartController;
12
19
  }
20
+ /** Result returned after restoring a backup */
13
21
  export interface RestoreBackupReturnValue {
14
22
  /** Exit code of the process */
15
23
  exitCode: EXIT_CODES;
@@ -18,6 +26,7 @@ export interface RestoreBackupReturnValue {
18
26
  /** The new objects db connection after restore */
19
27
  objects: ObjectsRedisClient;
20
28
  }
29
+ /** Options for restoring a backup */
21
30
  export interface RestoreBackupOptions {
22
31
  /** backup name, absolute path or index */
23
32
  name: string | number;
@@ -26,6 +35,9 @@ export interface RestoreBackupOptions {
26
35
  /** skip adapter deletion, e.g. for setup custom db migration */
27
36
  dontDeleteAdapters: boolean;
28
37
  }
38
+ /**
39
+ * CLI command to create and restore ioBroker backups
40
+ */
29
41
  export declare class BackupRestore {
30
42
  private readonly hostname;
31
43
  private readonly tmpDir;
@@ -49,14 +61,36 @@ export declare class BackupRestore {
49
61
  private readonly HOSTNAME_PLACEHOLDER_REGEX;
50
62
  /** Postfix for backup name */
51
63
  private readonly BACKUP_POSTFIX;
64
+ /**
65
+ * @param options The states/objects clients and the exit, clean and restart handlers
66
+ */
52
67
  constructor(options: CLIBackupRestoreOptions);
53
68
  private _copyFile;
69
+ /**
70
+ * Recursively copy a directory from the object's file storage to disk
71
+ *
72
+ * @param id The object id owning the files
73
+ * @param srcPath The source directory in the object's file storage
74
+ * @param destPath The destination directory on disk
75
+ */
54
76
  copyDir(id: string, srcPath: string, destPath: string): Promise<void>;
55
77
  /**
56
78
  * Get the directory where backups should be stored
57
79
  */
58
80
  static getBackupDir(): string;
81
+ /**
82
+ * Copy a single file synchronously
83
+ *
84
+ * @param source The source file path
85
+ * @param target The target file or directory path
86
+ */
59
87
  copyFileSync(source: string, target: string): void;
88
+ /**
89
+ * Recursively copy a folder synchronously
90
+ *
91
+ * @param source The source folder path
92
+ * @param target The target folder path
93
+ */
60
94
  copyFolderRecursiveSync(source: string, target: string): void;
61
95
  /**
62
96
  * Removes the temporary backup directory, never throws
@@ -65,6 +65,9 @@ class BackupRestore {
65
65
  HOSTNAME_PLACEHOLDER_REGEX = /\$\$__hostname__\$\$/g;
66
66
  /** Postfix for backup name */
67
67
  BACKUP_POSTFIX = `_backup${import_js_controller_common.tools.appNameLowerCase}`;
68
+ /**
69
+ * @param options The states/objects clients and the exit, clean and restart handlers
70
+ */
68
71
  constructor(options) {
69
72
  options = options || {};
70
73
  if (!options.states) {
@@ -104,6 +107,13 @@ class BackupRestore {
104
107
  console.log(`Can not copy File ${id}${srcPath} to ${destPath}: ${err.message}`);
105
108
  }
106
109
  }
110
+ /**
111
+ * Recursively copy a directory from the object's file storage to disk
112
+ *
113
+ * @param id The object id owning the files
114
+ * @param srcPath The source directory in the object's file storage
115
+ * @param destPath The destination directory on disk
116
+ */
107
117
  async copyDir(id, srcPath, destPath) {
108
118
  import_fs_extra.default.ensureDirSync(destPath);
109
119
  try {
@@ -130,6 +140,12 @@ class BackupRestore {
130
140
  static getBackupDir() {
131
141
  return import_node_path.default.join(import_js_controller_common.tools.getRootDir(), "backups/");
132
142
  }
143
+ /**
144
+ * Copy a single file synchronously
145
+ *
146
+ * @param source The source file path
147
+ * @param target The target file or directory path
148
+ */
133
149
  copyFileSync(source, target) {
134
150
  let targetFile = target;
135
151
  try {
@@ -143,6 +159,12 @@ class BackupRestore {
143
159
  console.error(`Could not copy ${targetFile} to ${source}: ${e.message}`);
144
160
  }
145
161
  }
162
+ /**
163
+ * Recursively copy a folder synchronously
164
+ *
165
+ * @param source The source folder path
166
+ * @param target The target folder path
167
+ */
146
168
  copyFolderRecursiveSync(source, target) {
147
169
  let files = [];
148
170
  if (!import_fs_extra.default.existsSync(target)) {