@iobroker/js-controller-cli 7.2.3-alpha.9-20260711-3ea5f3c89 → 7.2.4

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 (214) hide show
  1. package/build/cjs/index.js +3 -3
  2. package/build/cjs/lib/_Types.d.ts +1 -8
  3. package/build/cjs/lib/cli/cliCert.d.ts +4 -7
  4. package/build/cjs/lib/cli/cliCert.js +6 -10
  5. package/build/cjs/lib/cli/cliCert.js.map +2 -2
  6. package/build/cjs/lib/cli/cliCommand.d.ts +14 -45
  7. package/build/cjs/lib/cli/cliCommand.js +1 -8
  8. package/build/cjs/lib/cli/cliCommand.js.map +2 -2
  9. package/build/cjs/lib/cli/cliCompact.d.ts +2 -5
  10. package/build/cjs/lib/cli/cliCompact.js +2 -9
  11. package/build/cjs/lib/cli/cliCompact.js.map +2 -2
  12. package/build/cjs/lib/cli/cliDebug.d.ts +2 -5
  13. package/build/cjs/lib/cli/cliDebug.js +1 -8
  14. package/build/cjs/lib/cli/cliDebug.js.map +2 -2
  15. package/build/cjs/lib/cli/cliHost.d.ts +10 -13
  16. package/build/cjs/lib/cli/cliHost.js +5 -13
  17. package/build/cjs/lib/cli/cliHost.js.map +2 -2
  18. package/build/cjs/lib/cli/cliLogs.d.ts +3 -9
  19. package/build/cjs/lib/cli/cliLogs.js +1 -12
  20. package/build/cjs/lib/cli/cliLogs.js.map +2 -2
  21. package/build/cjs/lib/cli/cliMessage.d.ts +1 -2
  22. package/build/cjs/lib/cli/cliMessage.js +0 -5
  23. package/build/cjs/lib/cli/cliMessage.js.map +2 -2
  24. package/build/cjs/lib/cli/cliObjects.d.ts +18 -21
  25. package/build/cjs/lib/cli/cliObjects.js +33 -51
  26. package/build/cjs/lib/cli/cliObjects.js.map +2 -2
  27. package/build/cjs/lib/cli/cliPlugin.d.ts +3 -3
  28. package/build/cjs/lib/cli/cliPlugin.js +0 -6
  29. package/build/cjs/lib/cli/cliPlugin.js.map +2 -2
  30. package/build/cjs/lib/cli/cliProcess.d.ts +4 -8
  31. package/build/cjs/lib/cli/cliProcess.js +16 -27
  32. package/build/cjs/lib/cli/cliProcess.js.map +3 -3
  33. package/build/cjs/lib/cli/cliStates.d.ts +4 -7
  34. package/build/cjs/lib/cli/cliStates.js +6 -14
  35. package/build/cjs/lib/cli/cliStates.js.map +2 -2
  36. package/build/cjs/lib/cli/cliTools.js +0 -11
  37. package/build/cjs/lib/cli/cliTools.js.map +1 -1
  38. package/build/cjs/lib/cli/messages.js +46 -47
  39. package/build/cjs/lib/cli/messages.js.map +1 -1
  40. package/build/cjs/lib/setup/customError.d.ts +0 -4
  41. package/build/cjs/lib/setup/customError.js +0 -7
  42. package/build/cjs/lib/setup/customError.js.map +2 -2
  43. package/build/cjs/lib/setup/dbConnection.js +64 -69
  44. package/build/cjs/lib/setup/dbConnection.js.map +3 -3
  45. package/build/cjs/lib/setup/formatters.d.ts +4 -4
  46. package/build/cjs/lib/setup/formatters.js +0 -5
  47. package/build/cjs/lib/setup/formatters.js.map +2 -2
  48. package/build/cjs/lib/setup/multihostClient.js +2 -6
  49. package/build/cjs/lib/setup/multihostClient.js.map +1 -1
  50. package/build/cjs/lib/setup/pluginInfos.d.ts +0 -5
  51. package/build/cjs/lib/setup/pluginInfos.js +0 -2
  52. package/build/cjs/lib/setup/pluginInfos.js.map +2 -2
  53. package/build/cjs/lib/setup/setupBackup.d.ts +0 -34
  54. package/build/cjs/lib/setup/setupBackup.js +12 -46
  55. package/build/cjs/lib/setup/setupBackup.js.map +3 -3
  56. package/build/cjs/lib/setup/setupInstall.d.ts +15 -38
  57. package/build/cjs/lib/setup/setupInstall.js +26 -44
  58. package/build/cjs/lib/setup/setupInstall.js.map +2 -2
  59. package/build/cjs/lib/setup/setupLicense.d.ts +0 -8
  60. package/build/cjs/lib/setup/setupLicense.js +0 -7
  61. package/build/cjs/lib/setup/setupLicense.js.map +2 -2
  62. package/build/cjs/lib/setup/setupList.d.ts +1 -55
  63. package/build/cjs/lib/setup/setupList.js +24 -78
  64. package/build/cjs/lib/setup/setupList.js.map +3 -3
  65. package/build/cjs/lib/setup/setupMultihost.js +9 -12
  66. package/build/cjs/lib/setup/setupMultihost.js.map +3 -3
  67. package/build/cjs/lib/setup/setupPacketManager.d.ts +0 -10
  68. package/build/cjs/lib/setup/setupPacketManager.js +6 -16
  69. package/build/cjs/lib/setup/setupPacketManager.js.map +2 -2
  70. package/build/cjs/lib/setup/setupRepo.d.ts +0 -6
  71. package/build/cjs/lib/setup/setupRepo.js +11 -28
  72. package/build/cjs/lib/setup/setupRepo.js.map +2 -2
  73. package/build/cjs/lib/setup/setupSetup.d.ts +0 -27
  74. package/build/cjs/lib/setup/setupSetup.js +33 -52
  75. package/build/cjs/lib/setup/setupSetup.js.map +3 -3
  76. package/build/cjs/lib/setup/setupUpgrade.d.ts +2 -8
  77. package/build/cjs/lib/setup/setupUpgrade.js +10 -19
  78. package/build/cjs/lib/setup/setupUpgrade.js.map +2 -2
  79. package/build/cjs/lib/setup/setupUpload.d.ts +1 -72
  80. package/build/cjs/lib/setup/setupUpload.js +6 -74
  81. package/build/cjs/lib/setup/setupUpload.js.map +2 -2
  82. package/build/cjs/lib/setup/setupUsers.d.ts +14 -23
  83. package/build/cjs/lib/setup/setupUsers.js +15 -58
  84. package/build/cjs/lib/setup/setupUsers.js.map +2 -2
  85. package/build/cjs/lib/setup/setupVendor.d.ts +1 -9
  86. package/build/cjs/lib/setup/setupVendor.js +6 -13
  87. package/build/cjs/lib/setup/setupVendor.js.map +2 -2
  88. package/build/cjs/lib/setup/setupVisDebug.d.ts +2 -11
  89. package/build/cjs/lib/setup/setupVisDebug.js +15 -21
  90. package/build/cjs/lib/setup/setupVisDebug.js.map +3 -3
  91. package/build/cjs/lib/setup/utils.d.ts +1 -1
  92. package/build/cjs/lib/setup/utils.js +9 -13
  93. package/build/cjs/lib/setup/utils.js.map +3 -3
  94. package/build/cjs/lib/setup.js +330 -269
  95. package/build/cjs/lib/setup.js.map +3 -3
  96. package/build/esm/lib/_Types.d.ts +1 -8
  97. package/build/esm/lib/_Types.d.ts.map +1 -1
  98. package/build/esm/lib/cli/cliCert.d.ts +4 -7
  99. package/build/esm/lib/cli/cliCert.d.ts.map +1 -1
  100. package/build/esm/lib/cli/cliCert.js +6 -6
  101. package/build/esm/lib/cli/cliCert.js.map +1 -1
  102. package/build/esm/lib/cli/cliCommand.d.ts +14 -45
  103. package/build/esm/lib/cli/cliCommand.d.ts.map +1 -1
  104. package/build/esm/lib/cli/cliCommand.js +1 -4
  105. package/build/esm/lib/cli/cliCommand.js.map +1 -1
  106. package/build/esm/lib/cli/cliCompact.d.ts +2 -5
  107. package/build/esm/lib/cli/cliCompact.d.ts.map +1 -1
  108. package/build/esm/lib/cli/cliCompact.js +2 -5
  109. package/build/esm/lib/cli/cliCompact.js.map +1 -1
  110. package/build/esm/lib/cli/cliDebug.d.ts +2 -5
  111. package/build/esm/lib/cli/cliDebug.d.ts.map +1 -1
  112. package/build/esm/lib/cli/cliDebug.js +1 -4
  113. package/build/esm/lib/cli/cliDebug.js.map +1 -1
  114. package/build/esm/lib/cli/cliHost.d.ts +10 -13
  115. package/build/esm/lib/cli/cliHost.d.ts.map +1 -1
  116. package/build/esm/lib/cli/cliHost.js +5 -8
  117. package/build/esm/lib/cli/cliHost.js.map +1 -1
  118. package/build/esm/lib/cli/cliLogs.d.ts +3 -9
  119. package/build/esm/lib/cli/cliLogs.d.ts.map +1 -1
  120. package/build/esm/lib/cli/cliLogs.js +1 -8
  121. package/build/esm/lib/cli/cliLogs.js.map +1 -1
  122. package/build/esm/lib/cli/cliMessage.d.ts +1 -2
  123. package/build/esm/lib/cli/cliMessage.d.ts.map +1 -1
  124. package/build/esm/lib/cli/cliMessage.js +0 -1
  125. package/build/esm/lib/cli/cliMessage.js.map +1 -1
  126. package/build/esm/lib/cli/cliObjects.d.ts +18 -21
  127. package/build/esm/lib/cli/cliObjects.d.ts.map +1 -1
  128. package/build/esm/lib/cli/cliObjects.js +38 -44
  129. package/build/esm/lib/cli/cliObjects.js.map +1 -1
  130. package/build/esm/lib/cli/cliPlugin.d.ts +3 -3
  131. package/build/esm/lib/cli/cliPlugin.d.ts.map +1 -1
  132. package/build/esm/lib/cli/cliPlugin.js +1 -1
  133. package/build/esm/lib/cli/cliPlugin.js.map +1 -1
  134. package/build/esm/lib/cli/cliProcess.d.ts +4 -8
  135. package/build/esm/lib/cli/cliProcess.d.ts.map +1 -1
  136. package/build/esm/lib/cli/cliProcess.js +4 -7
  137. package/build/esm/lib/cli/cliProcess.js.map +1 -1
  138. package/build/esm/lib/cli/cliStates.d.ts +4 -7
  139. package/build/esm/lib/cli/cliStates.d.ts.map +1 -1
  140. package/build/esm/lib/cli/cliStates.js +2 -6
  141. package/build/esm/lib/cli/cliStates.js.map +1 -1
  142. package/build/esm/lib/setup/customError.d.ts +0 -4
  143. package/build/esm/lib/setup/customError.d.ts.map +1 -1
  144. package/build/esm/lib/setup/customError.js +0 -3
  145. package/build/esm/lib/setup/customError.js.map +1 -1
  146. package/build/esm/lib/setup/dbConnection.d.ts.map +1 -1
  147. package/build/esm/lib/setup/dbConnection.js +13 -10
  148. package/build/esm/lib/setup/dbConnection.js.map +1 -1
  149. package/build/esm/lib/setup/formatters.d.ts +4 -4
  150. package/build/esm/lib/setup/formatters.js +4 -4
  151. package/build/esm/lib/setup/pluginInfos.d.ts +0 -5
  152. package/build/esm/lib/setup/pluginInfos.d.ts.map +1 -1
  153. package/build/esm/lib/setup/pluginInfos.js +0 -5
  154. package/build/esm/lib/setup/pluginInfos.js.map +1 -1
  155. package/build/esm/lib/setup/setupBackup.d.ts +0 -34
  156. package/build/esm/lib/setup/setupBackup.d.ts.map +1 -1
  157. package/build/esm/lib/setup/setupBackup.js +12 -46
  158. package/build/esm/lib/setup/setupBackup.js.map +1 -1
  159. package/build/esm/lib/setup/setupInstall.d.ts +15 -38
  160. package/build/esm/lib/setup/setupInstall.d.ts.map +1 -1
  161. package/build/esm/lib/setup/setupInstall.js +24 -40
  162. package/build/esm/lib/setup/setupInstall.js.map +1 -1
  163. package/build/esm/lib/setup/setupLicense.d.ts +0 -8
  164. package/build/esm/lib/setup/setupLicense.d.ts.map +1 -1
  165. package/build/esm/lib/setup/setupLicense.js +0 -6
  166. package/build/esm/lib/setup/setupLicense.js.map +1 -1
  167. package/build/esm/lib/setup/setupList.d.ts +1 -55
  168. package/build/esm/lib/setup/setupList.d.ts.map +1 -1
  169. package/build/esm/lib/setup/setupList.js +8 -61
  170. package/build/esm/lib/setup/setupList.js.map +1 -1
  171. package/build/esm/lib/setup/setupMultihost.d.ts.map +1 -1
  172. package/build/esm/lib/setup/setupMultihost.js +6 -5
  173. package/build/esm/lib/setup/setupMultihost.js.map +1 -1
  174. package/build/esm/lib/setup/setupPacketManager.d.ts +0 -10
  175. package/build/esm/lib/setup/setupPacketManager.d.ts.map +1 -1
  176. package/build/esm/lib/setup/setupPacketManager.js +0 -9
  177. package/build/esm/lib/setup/setupPacketManager.js.map +1 -1
  178. package/build/esm/lib/setup/setupRepo.d.ts +0 -6
  179. package/build/esm/lib/setup/setupRepo.d.ts.map +1 -1
  180. package/build/esm/lib/setup/setupRepo.js +14 -30
  181. package/build/esm/lib/setup/setupRepo.js.map +1 -1
  182. package/build/esm/lib/setup/setupSetup.d.ts +0 -27
  183. package/build/esm/lib/setup/setupSetup.d.ts.map +1 -1
  184. package/build/esm/lib/setup/setupSetup.js +21 -36
  185. package/build/esm/lib/setup/setupSetup.js.map +1 -1
  186. package/build/esm/lib/setup/setupUpgrade.d.ts +2 -8
  187. package/build/esm/lib/setup/setupUpgrade.d.ts.map +1 -1
  188. package/build/esm/lib/setup/setupUpgrade.js +6 -14
  189. package/build/esm/lib/setup/setupUpgrade.js.map +1 -1
  190. package/build/esm/lib/setup/setupUpload.d.ts +1 -72
  191. package/build/esm/lib/setup/setupUpload.d.ts.map +1 -1
  192. package/build/esm/lib/setup/setupUpload.js +5 -72
  193. package/build/esm/lib/setup/setupUpload.js.map +1 -1
  194. package/build/esm/lib/setup/setupUsers.d.ts +14 -23
  195. package/build/esm/lib/setup/setupUsers.d.ts.map +1 -1
  196. package/build/esm/lib/setup/setupUsers.js +14 -56
  197. package/build/esm/lib/setup/setupUsers.js.map +1 -1
  198. package/build/esm/lib/setup/setupVendor.d.ts +1 -9
  199. package/build/esm/lib/setup/setupVendor.d.ts.map +1 -1
  200. package/build/esm/lib/setup/setupVendor.js +1 -7
  201. package/build/esm/lib/setup/setupVendor.js.map +1 -1
  202. package/build/esm/lib/setup/setupVisDebug.d.ts +2 -11
  203. package/build/esm/lib/setup/setupVisDebug.d.ts.map +1 -1
  204. package/build/esm/lib/setup/setupVisDebug.js +14 -21
  205. package/build/esm/lib/setup/setupVisDebug.js.map +1 -1
  206. package/build/esm/lib/setup/utils.d.ts +1 -1
  207. package/build/esm/lib/setup/utils.d.ts.map +1 -1
  208. package/build/esm/lib/setup/utils.js +4 -2
  209. package/build/esm/lib/setup/utils.js.map +1 -1
  210. package/build/esm/lib/setup.d.ts.map +1 -1
  211. package/build/esm/lib/setup.js +211 -162
  212. package/build/esm/lib/setup.js.map +1 -1
  213. package/build/tsconfig.build.tsbuildinfo +1 -1
  214. package/package.json +14 -14
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/lib/cli/cliObjects.ts"],
4
- "sourcesContent": ["import { CLICommand, type CLICommandOptions } from './cliCommand.js';\n\nimport * as CLI from './messages.js';\nimport { formatValue } from './cliTools.js';\nimport { tools, EXIT_CODES } from '@iobroker/js-controller-common';\nimport type { Client as ObjectsClient } from '@iobroker/db-objects-redis';\nimport type { Client as StatesClient } from '@iobroker/db-states-redis';\n\ninterface ParsedPropPathAndAssignment {\n propPath?: string;\n value: unknown;\n}\n\n/** Command iobroker object ... */\nexport class CLIObjects extends CLICommand {\n /**\n * @param options The command options including context and parameters\n */\n constructor(options: CLICommandOptions) {\n super(options);\n }\n\n /**\n * Executes a command\n *\n * @param args The command arguments (the first is the sub-command)\n */\n execute(args: string[]): void {\n const { callback, showHelp } = this.options;\n const command = args[0];\n\n switch (command) {\n case 'chmod':\n return this.chmod(args);\n case 'chown':\n return this.chown(args);\n case 'list':\n case 'l':\n return this.list(args);\n case 'get':\n return this.get(args);\n case 'set':\n return this.set(args);\n case 'extend':\n return this.extend(args);\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 case 'activateSets':\n return this.activateSets();\n case 'deactivateSets':\n return this.deactivateSets();\n default:\n CLI.error.unknownCommand('object', command);\n showHelp();\n return void callback(3);\n }\n }\n\n /**\n * Activates the usage of Redis Sets\n */\n activateSets(): void {\n const { callback, dbConnect } = this.options;\n dbConnect(async params => {\n const { states, objects } = params;\n\n const useSetsIndicator = await objects.getMeta('objects.features.useSets');\n\n if (!useSetsIndicator || !parseInt(useSetsIndicator)) {\n // all hosts need to be stopped for this\n if (await tools.isHostRunning(objects, states)) {\n console.log('Cannot activate the usage of Redis Sets while one or more hosts are running');\n return void callback(EXIT_CODES.CONTROLLER_RUNNING);\n }\n\n await objects.activateSets();\n const noMigrated = await objects.migrateToSets();\n\n if (noMigrated) {\n console.log(`Successfully migrated ${noMigrated} objects to Redis Sets`);\n }\n console.log(\n `Successfully activated the usage of Redis Sets. Please make sure to only use js-controller 4.0 or higher on all hosts!`,\n );\n } else {\n console.log('Redis Sets are already activated.');\n }\n return void callback(EXIT_CODES.NO_ERROR);\n });\n }\n\n /**\n * Deactivates the usage of Redis Sets\n */\n deactivateSets(): void {\n const { callback, dbConnect } = this.options;\n dbConnect(async params => {\n const { objects } = params;\n const useSetsIndicator = await objects.getMeta('objects.features.useSets');\n\n if (useSetsIndicator && parseInt(useSetsIndicator)) {\n await objects.deactivateSets();\n console.log(`Successfully deactivated the usage of Redis Sets.`);\n } else {\n console.log('Redis Sets are already deactivated.');\n }\n return void callback(EXIT_CODES.NO_ERROR);\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 { objects } = params;\n\n const version = await objects.getProtocolVersion();\n console.log(`Current Objects DB protocol version: ${version}`);\n return void callback(EXIT_CODES.NO_ERROR);\n });\n }\n\n /**\n * Set protocol version\n */\n setDBVersion(): void {\n const { callback, dbConnect } = this.options;\n dbConnect(async params => {\n const { objects } = params;\n const rl = await import('readline-sync');\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(EXIT_CODES.NO_ERROR);\n }\n\n try {\n await objects.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(`Objects DB protocol updated to version ${this.options.version}`);\n return void callback(EXIT_CODES.NO_ERROR);\n });\n }\n\n /**\n * Changes access rights for all objects matching the pattern\n *\n * @param args The command arguments (object mode, state mode and pattern)\n */\n chmod(args: (string | number | undefined)[]): void {\n const { callback, dbConnect } = this.options;\n let [modeObject, modeState, pattern] = args.slice(1);\n\n // Yargs converts numeric string to number, so we can use that to test\n // Afterwards we parse them ourselves, but with base16\n if (typeof modeObject !== 'number') {\n CLI.error.requiredArgumentMissing('mode', 'object chmod 644 system.*');\n return void callback(1);\n }\n modeObject = parseInt(modeObject.toString(), 16);\n\n if (typeof modeState === 'number') {\n // a mode for the state was given, convert it\n modeState = parseInt(modeState.toString(), 16);\n } else {\n pattern = modeState;\n modeState = undefined;\n }\n\n if (pattern === undefined) {\n CLI.error.requiredArgumentMissing('pattern', 'object chmod 644 system.*');\n return void callback(1);\n }\n\n dbConnect(params => {\n const { objects, states } = params;\n\n return objects.chmodObject(\n pattern as string,\n { user: 'system.user.admin', object: modeObject, state: modeState },\n (err, processed) => {\n // Print the new object rights\n return this.printObjectList(objects, states, err?.message, processed);\n },\n );\n });\n }\n\n /**\n * Changes owner for all objects matching the pattern\n *\n * @param args The command arguments (user, group and pattern)\n */\n chown(args: (string | undefined)[]): void {\n const { callback, dbConnect } = this.options;\n let [user, group, pattern] = args.slice(1);\n\n if (!pattern) {\n pattern = group;\n group = undefined;\n }\n\n if (!user) {\n CLI.error.requiredArgumentMissing('user', 'object chown user system.*');\n return void callback(1);\n } else if (!user.startsWith('system.user.')) {\n user = `system.user.${user}`;\n }\n if (group && !group.startsWith('system.group.')) {\n group = `system.group.${group}`;\n }\n\n if (!pattern) {\n CLI.error.requiredArgumentMissing('pattern', 'object chown user system.*');\n return void callback(1);\n }\n dbConnect(params => {\n const { objects, states } = params;\n\n return objects.chownObject(\n pattern,\n {\n user: 'system.user.admin',\n owner: user as ioBroker.ObjectIDs.User,\n ownerGroup: group as ioBroker.ObjectIDs.Group,\n },\n (err, processed) => {\n // Print the new object rights\n return this.printObjectList(objects, states, err?.message, processed);\n },\n );\n });\n }\n\n /**\n * Lists all objects matching a pattern and their access rights\n *\n * @param args The command arguments (the pattern to match)\n */\n list(args: string[]): void {\n const { callback, dbConnect } = this.options;\n let pattern: { startkey: string; endkey: string } | undefined;\n if (typeof args[1] === 'string') {\n pattern = { startkey: args[1].replace('*', ''), endkey: args[1].replace('*', '\\u9999') };\n }\n\n dbConnect(params => {\n const { objects, states } = params;\n\n objects.getObjectList(pattern, { user: 'system.user.admin', sorted: true }, (err, processed) => {\n this.printObjectList(\n objects,\n states,\n err?.message,\n processed && processed.rows && processed.rows.map(r => r.value),\n ).catch(e => console.error(`Cannot print object list: ${e.message}`));\n return void callback(EXIT_CODES.NO_ERROR);\n });\n });\n }\n\n /**\n * Retrieves an object or its property from the DB and prints it\n *\n * @param args The command arguments (the object id and optional property path)\n */\n get(args: string[]): void {\n const { callback, pretty, dbConnect } = this.options;\n const [id, propPath] = args.slice(1);\n if (!id) {\n CLI.error.requiredArgumentMissing('id', 'object get id [propertypath]');\n return void callback(1);\n }\n\n // If propPath is passed, the given property will be retrieved instead.\n // For example: `\"native.something[2].onething\"` selects `onething` of the 3rd array element of `object.native.something`.\n\n dbConnect(params => {\n const { objects } = params;\n\n objects.getObject(id, (err, res) => {\n if (err || !res) {\n CLI.error.objectNotFound(id, err?.message);\n return void callback(3);\n }\n if (typeof propPath === 'string') {\n // We want to select a part of the object\n try {\n res = deepSelectProperty(res, propPath);\n } catch {\n CLI.error.objectPropertyNotFound(id, propPath);\n return void callback(3);\n }\n }\n console.log(formatValue(res, pretty));\n return void callback(EXIT_CODES.NO_ERROR);\n });\n });\n }\n\n /**\n * Updates an object or its property with the given value\n *\n * @param args The command arguments (the object id and the value to set)\n */\n set(args: string[]): void {\n const { callback, dbConnect } = this.options;\n const id: string = args[1];\n if (!id) {\n CLI.error.requiredArgumentMissing('id', 'object set id [propertypath=]value');\n return void callback(1);\n }\n\n const lastArg = args.length >= 2 ? args.slice(2).join(' ') : undefined;\n const parsedArg = parsePropPathAndAssignment(lastArg!);\n if (!parsedArg) {\n CLI.error.invalidPropertyOrValue();\n return void callback(3);\n }\n const { propPath, value } = parsedArg;\n\n dbConnect(params => {\n const { objects } = params;\n\n const doSetObject = (obj: any): void => {\n objects.setObject(id, obj, (err: Error | null | undefined) => {\n if (err) {\n CLI.error.cannotUpdateObject(id, err.message);\n return void callback(1);\n }\n CLI.success.objectUpdated(id);\n return void callback(EXIT_CODES.NO_ERROR);\n });\n };\n if (!propPath) {\n // We set the entire object, no need to retrieve it first\n doSetObject(value);\n } else {\n // We want to update a part of the object\n // Retrieve the object first\n objects.getObject(id, async (err, res) => {\n if (err || !res) {\n CLI.error.objectNotFound(id, err?.message);\n return void callback(3);\n }\n try {\n deepSetProperty(res, propPath, value);\n } catch {\n CLI.error.objectPropertyNotFound(id, propPath);\n return void callback(3);\n }\n\n // auto encrypt -> only do that here, no one configures an instance by setting the whole object,\n // else it would be copied and probably already encrypted\n if (\n /^system\\.adapter\\.(?<adapterName>.+)\\.(?<instanceNr>\\d+)$/g.test(id) &&\n 'encryptedNative' in res\n ) {\n await this._autoEncrypt(objects, res, propPath, value as string);\n }\n\n doSetObject(res);\n });\n }\n });\n }\n\n /**\n * Encrypts all newly set properties of encryptedNative - currently customized for propPath\n *\n * @param objects - objects db instance\n * @param res - object which will be adapted\n * @param propPath - path of the changed property\n * @param value - value which has been newly set to the property\n */\n private async _autoEncrypt(\n objects: ObjectsClient,\n res: ioBroker.AnyObject,\n propPath: string,\n value: string,\n ): Promise<void> {\n // input: it's an instance object and has encrypted native, was a native value set?\n if (/^native\\..+[^.]$/g.test(propPath) && typeof value === 'string') {\n // single native property\n const prop = propPath.split('.')[1];\n if ('encryptedNative' in res && res.encryptedNative?.includes(prop)) {\n try {\n const config = await objects.getObjectAsync('system.config');\n res.native[prop] = tools.encrypt(config!.native.secret, res.native[prop]);\n } catch (e) {\n console.error(`Could not auto-encrypt property \"${prop}\": ${e.message}`);\n }\n }\n } else if (propPath === 'native' && tools.isObject(value)) {\n // whole native attribute\n let config;\n for (const prop of Object.keys(value)) {\n if (\n typeof (res.native as Record<string, any>)[prop] === 'string' &&\n 'encryptedNative' in res &&\n res.encryptedNative?.includes(prop)\n ) {\n try {\n config = config || (await objects.getObjectAsync('system.config'))!;\n res.native[prop] = tools.encrypt(config.native.secret, res.native[prop]);\n } catch (e) {\n console.error(`Could not auto-encrypt property \"${prop}\": ${e.message}`);\n }\n }\n }\n }\n }\n\n /**\n * Extends an object with the given value\n *\n * @param args The command arguments (the object id and the value to extend with)\n */\n extend(args: string[]): void {\n const { callback, dbConnect } = this.options;\n const id: string = args[1];\n if (!id) {\n CLI.error.requiredArgumentMissing('id', 'object extend id <json-value>');\n return void callback(1);\n }\n\n const lastArg = args.length >= 2 ? args.slice(2).join(' ') : undefined;\n const parsedArg = parsePropPathAndAssignment(lastArg!);\n // extend does not accept a property path, so error when one is passed\n if (!parsedArg || parsedArg.propPath) {\n CLI.error.invalidJSONValue();\n return void callback(3);\n }\n const { value } = parsedArg;\n\n dbConnect(async params => {\n const { objects } = params;\n\n try {\n await objects.extendObject(id, value as any);\n CLI.success.objectUpdated(id);\n return void callback(EXIT_CODES.NO_ERROR);\n } catch (err) {\n CLI.error.cannotUpdateObject(id, err.message);\n return void callback(1);\n }\n });\n }\n\n /**\n * Collects all objects for specific path\n *\n * @param objects class\n * @param params parameters for getObjectView\n */\n async _collectObjects(objects: ObjectsClient, params: ioBroker.GetObjectViewParams): Promise<ioBroker.AnyObject[]> {\n const types = [\n 'state',\n 'channel',\n 'device',\n 'enum',\n 'instance',\n 'host',\n 'adapter',\n 'meta',\n 'config',\n 'group',\n 'user',\n 'script',\n ];\n const result: ioBroker.AnyObject[] = [];\n\n for (const type of types) {\n try {\n const res = await objects.getObjectViewAsync('system', type, params);\n res.rows.forEach(item => {\n if (item.value) {\n result.push(item.value);\n }\n });\n } catch {\n // ignore\n }\n }\n return result;\n }\n\n /**\n * Delete all object from list sequentially\n *\n * @param objects class\n * @param ids IDs\n * @param callback Called with the exit code once all objects have been deleted\n */\n async _deleteObjects(objects: ObjectsClient, ids: string[], callback: (exitCode: number) => void): Promise<void> {\n if (!ids || !ids.length) {\n return tools.maybeCallback(callback, EXIT_CODES.NO_ERROR);\n }\n let allEnums;\n\n try {\n // cache all enums, else it will be slow to delete many objects\n allEnums = await tools.getAllEnums(objects);\n } catch (e) {\n console.error(`Could not retrieve all enums: ${e.message}`);\n }\n\n for (const id of ids) {\n try {\n await objects.delObjectAsync(id);\n await tools.removeIdFromAllEnums(objects, id, allEnums);\n } catch (e) {\n console.warn(`Could not delete object or remove \"${id}\" from enums: ${e.message}`);\n }\n }\n return tools.maybeCallback(callback, EXIT_CODES.NO_ERROR);\n }\n\n /**\n * Deletes an object\n *\n * @param args The command arguments (the object id to delete)\n */\n delete(args: string[]): void {\n const { callback, dbConnect } = this.options;\n const id: string = args[1];\n if (!id) {\n CLI.error.requiredArgumentMissing('id', 'object delete id');\n return void callback(1);\n }\n\n dbConnect(async params => {\n const { objects } = params;\n\n if (id.endsWith('*')) {\n const params = {\n startkey: id.replace(/\\*/g, ''),\n endkey: id.replace(/\\*/g, '\\u9999'),\n };\n\n const result = await this._collectObjects(objects, params);\n if (!result || !result.length) {\n console.log('No IDs found for this pattern.');\n return void callback(EXIT_CODES.NO_ERROR);\n }\n const ids = result.map(item => item._id);\n\n // if no auto confirmation, ask user\n if (!this.options.f && this.options.y && !this.options.yes) {\n const rl = (await import('node:readline')).createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n rl.question(`${result.length} object(s) will be deleted. Are you sure? [y/N]: `, answer => {\n rl.close();\n if (\n answer === 'y' ||\n answer === 'yes' ||\n answer === 'j' ||\n answer === 'ja' ||\n answer === '\u0434\u0430' ||\n answer === '\u0434'\n ) {\n return this._deleteObjects(objects, ids, callback);\n }\n console.log('Aborted.');\n return void callback(3);\n });\n } else {\n return this._deleteObjects(objects, ids, callback);\n }\n } else {\n // only one object\n objects.delObject(id, async err => {\n if (err) {\n CLI.error.objectNotFound(id, err.message);\n callback(3);\n } else {\n try {\n await tools.removeIdFromAllEnums(objects, id);\n CLI.success.objectDeleted(id);\n callback(EXIT_CODES.NO_ERROR);\n } catch (e) {\n CLI.error.cannotDeleteObjectFromEnums(id, e.message);\n callback(3);\n }\n }\n });\n }\n });\n }\n\n /**\n * Prints a list of objects and its access properties\n *\n * @param objects objects db\n * @param states states db\n * @param err An error (if one occurred)\n * @param objList The object list to print\n */\n async printObjectList(\n objects: ObjectsClient,\n states: StatesClient,\n err: string | undefined,\n objList?: ioBroker.AnyObject[],\n ): Promise<void> {\n // TODO: is this supposed to be here?\n const { callback } = this.options;\n if (err) {\n console.error(err);\n return void callback(33);\n }\n if (objList !== null && objList !== undefined) {\n const { List } = await import('../setup/setupList.js');\n const list = new List({\n states,\n objects,\n processExit: callback,\n });\n list.showObjectHeader();\n objList.forEach(list.showObject);\n }\n setTimeout(callback, 1_000);\n }\n}\n\n/**\n * Reverses a string\n *\n * @param str The string to reverse\n */\nfunction reverseString(str: string): string {\n return Array.from(str).reverse().join('');\n}\n\n/**\n * Normalizes a property path for use in deepSelectProperty and deepSetProperty\n *\n * @param path The property path to normalize\n */\nfunction normalizePropertyPath(path: string): string {\n // Basically we want to support paths like \"obj[1][2]\", but the other methods expect \"obj.[1].[2]\"\n // So we need to replace all occurences of square brackets without leading dots\n // JS Regex only supports negative lookbehind in ES 2018, so we fake it using reversed strings and\n // negative lookahead\n const arrayIndexRegex = /(]\\d+\\[)(?!\\.)/g; // Reversing the string reverses the brackets too\n let ret = reverseString(path);\n // Append the dot to each bracket, since we're going to reverse it\n ret = ret.replace(arrayIndexRegex, '$1.');\n return reverseString(ret);\n}\n\n/**\n * Selects a property of an object or its sub-objects and returns it if it exists. E.g.\n * `deepSelectProperty(obj, \"common.asdf.qwer\")` => `obj.common.asdf.qwer`\n *\n * @param object The object to select a property from\n * @param path The property path to search for\n */\nfunction deepSelectProperty(object: ioBroker.AnyObject, path: string): any {\n /**\n * @param obj The current (sub-)object being traversed\n * @param pathArr The remaining property path segments\n */\n function _deepSelectProperty(obj: any, pathArr: string[]): unknown {\n // are we there yet? then return obj\n if (!pathArr.length) {\n return obj;\n }\n // go deeper\n let propName = pathArr.shift()!;\n if (/\\[\\d+]/.test(propName)) {\n // this is an array index\n // @ts-expect-error // TODO: fix it - this is not ts fashion, assigning numbers to the string array here\n propName = parseInt(propName.slice(1, -1));\n }\n return _deepSelectProperty(obj[propName], pathArr);\n }\n path = normalizePropertyPath(path);\n return _deepSelectProperty(object, path.split('.'));\n}\n\n/**\n * Changes a property of an object or its sub-objects if it exists. Opposite of `deepSelectProperty`.\n *\n * @param object The object to replace a property in\n * @param path The property path to search for\n * @param value The value to set at the given property path\n */\nfunction deepSetProperty(object: ioBroker.AnyObject, path: string, value: any): void {\n /**\n * @param obj The current (sub-)object being traversed\n * @param pathArr The remaining property path segments\n */\n function _deepSetProperty(obj: any, pathArr: string[]): void {\n // are we there yet? then return obj\n if (pathArr.length === 1) {\n obj[pathArr[0]] = value;\n return;\n }\n // go deeper\n let propName = pathArr.shift()!;\n if (/\\[\\d+]/.test(propName)) {\n // this is an array index\n // @ts-expect-error // TODO: fix it - this is not ts fashion, assigning numbers to the string array here\n propName = parseInt(propName.slice(1, -1));\n }\n _deepSetProperty(obj[propName], pathArr);\n }\n path = normalizePropertyPath(path);\n _deepSetProperty(object, path.split('.'));\n}\n\n/**\n * Tries to parse a CLI argument that could be used to set an object\n *\n * @param arg The CLI argument containing the value to be set\n */\nfunction parseCLIValue(arg: string): any {\n try {\n // JSON.parse does not allow plain strings\n return JSON.parse(arg);\n } catch {\n // arg is a string\n return arg;\n }\n}\n\n/**\n * Tries to parse a CLI argument of the form [propPath=]value.\n *\n * @param arg The CLI argument containing an optional prop path and a JSON value\n */\nfunction parsePropPathAndAssignment(arg: string): ParsedPropPathAndAssignment | undefined {\n const equalsIndex = arg.indexOf('=');\n if (equalsIndex > -1) {\n // This might contain a propPath AND a value\n const propPath = arg.substr(0, equalsIndex);\n const valueString = arg.substr(equalsIndex + 1);\n // For partial assignments, allow strings as the value\n const value = parseCLIValue(valueString);\n return { propPath, value };\n }\n // This is a full assignment, allow only objects\n try {\n const value = JSON.parse(arg);\n if (!tools.isObject(value)) {\n return undefined;\n }\n return { value };\n } catch {\n // nope!\n return undefined;\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { CLICommand, type CLICommandOptions } from './cliCommand.js';\n\nimport * as CLI from './messages.js';\nimport { formatValue } from './cliTools.js';\nimport { tools, EXIT_CODES } from '@iobroker/js-controller-common';\nimport type { Client as ObjectsClient } from '@iobroker/db-objects-redis';\nimport type { Client as StatesClient } from '@iobroker/db-states-redis';\n\ninterface ParsedPropPathAndAssignment {\n propPath?: string;\n value: unknown;\n}\n\n/** Command iobroker object ... */\nexport class CLIObjects extends CLICommand {\n constructor(options: CLICommandOptions) {\n super(options);\n }\n\n /**\n * Executes a command\n *\n * @param args\n */\n execute(args: any[]): void {\n const { callback, showHelp } = this.options;\n const command = args[0];\n\n switch (command) {\n case 'chmod':\n return this.chmod(args);\n case 'chown':\n return this.chown(args);\n case 'list':\n case 'l':\n return this.list(args);\n case 'get':\n return this.get(args);\n case 'set':\n return this.set(args);\n case 'extend':\n return this.extend(args);\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 case 'activateSets':\n return this.activateSets();\n case 'deactivateSets':\n return this.deactivateSets();\n default:\n CLI.error.unknownCommand('object', command);\n showHelp();\n return void callback(3);\n }\n }\n\n /**\n * Activates the usage of Redis Sets\n */\n activateSets(): void {\n const { callback, dbConnect } = this.options;\n dbConnect(async params => {\n const { states, objects } = params;\n\n const useSetsIndicator = await objects.getMeta('objects.features.useSets');\n\n if (!useSetsIndicator || !parseInt(useSetsIndicator)) {\n // all hosts need to be stopped for this\n if (await tools.isHostRunning(objects, states)) {\n console.log('Cannot activate the usage of Redis Sets while one or more hosts are running');\n return void callback(EXIT_CODES.CONTROLLER_RUNNING);\n }\n\n await objects.activateSets();\n const noMigrated = await objects.migrateToSets();\n\n if (noMigrated) {\n console.log(`Successfully migrated ${noMigrated} objects to Redis Sets`);\n }\n console.log(\n `Successfully activated the usage of Redis Sets. Please make sure to only use js-controller 4.0 or higher on all hosts!`,\n );\n } else {\n console.log('Redis Sets are already activated.');\n }\n return void callback(EXIT_CODES.NO_ERROR);\n });\n }\n\n /**\n * Deactivates the usage of Redis Sets\n */\n deactivateSets(): void {\n const { callback, dbConnect } = this.options;\n dbConnect(async params => {\n const { objects } = params;\n const useSetsIndicator = await objects.getMeta('objects.features.useSets');\n\n if (useSetsIndicator && parseInt(useSetsIndicator)) {\n await objects.deactivateSets();\n console.log(`Successfully deactivated the usage of Redis Sets.`);\n } else {\n console.log('Redis Sets are already deactivated.');\n }\n return void callback(EXIT_CODES.NO_ERROR);\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 { objects } = params;\n\n const version = await objects.getProtocolVersion();\n console.log(`Current Objects DB protocol version: ${version}`);\n return void callback(EXIT_CODES.NO_ERROR);\n });\n }\n\n /**\n * Set protocol version\n */\n setDBVersion(): void {\n const { callback, dbConnect } = this.options;\n dbConnect(async params => {\n const { objects } = params;\n const rl = await import('readline-sync');\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(EXIT_CODES.NO_ERROR);\n }\n\n try {\n await objects.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(`Objects DB protocol updated to version ${this.options.version}`);\n return void callback(EXIT_CODES.NO_ERROR);\n });\n }\n\n /**\n * Changes access rights for all objects matching the pattern\n *\n * @param args\n */\n chmod(args: any[]): void {\n const { callback, dbConnect } = this.options;\n let [modeObject, modeState, pattern] = args.slice(1);\n\n // Yargs converts numeric string to number, so we can use that to test\n // Afterwards we parse them ourselves, but with base16\n if (typeof modeObject !== 'number') {\n CLI.error.requiredArgumentMissing('mode', 'object chmod 644 system.*');\n return void callback(1);\n }\n modeObject = parseInt(modeObject.toString(), 16);\n\n if (typeof modeState === 'number') {\n // a mode for the state was given, convert it\n modeState = parseInt(modeState.toString(), 16);\n } else {\n pattern = modeState;\n modeState = undefined;\n }\n\n if (pattern === undefined) {\n CLI.error.requiredArgumentMissing('pattern', 'object chmod 644 system.*');\n return void callback(1);\n }\n\n dbConnect(params => {\n const { objects, states } = params;\n\n objects.chmodObject(\n pattern,\n { user: 'system.user.admin', object: modeObject, state: modeState },\n (err, processed) => {\n // Print the new object rights\n this.printObjectList(objects, states, err?.message, processed);\n },\n );\n });\n }\n\n /**\n * Changes owner for all objects matching the pattern\n *\n * @param args\n */\n chown(args: any[]): void {\n const { callback, dbConnect } = this.options;\n let [user, group, pattern] = args.slice(1);\n\n if (!pattern) {\n pattern = group;\n group = undefined;\n }\n\n if (!user) {\n CLI.error.requiredArgumentMissing('user', 'object chown user system.*');\n return void callback(1);\n } else if (!user.startsWith('system.user.')) {\n user = `system.user.${user}`;\n }\n if (group && !group.startsWith('system.group.')) {\n group = `system.group.${group}`;\n }\n\n if (!pattern) {\n CLI.error.requiredArgumentMissing('pattern', 'object chown user system.*');\n return void callback(1);\n }\n dbConnect(params => {\n const { objects, states } = params;\n\n objects.chownObject(\n pattern,\n { user: 'system.user.admin', owner: user, ownerGroup: group },\n (err, processed) => {\n // Print the new object rights\n this.printObjectList(objects, states, err?.message, processed);\n },\n );\n });\n }\n\n /**\n * Lists all objects matching a pattern and their access rights\n *\n * @param args\n */\n list(args: any[]): void {\n const { callback, dbConnect } = this.options;\n let pattern = args[1];\n if (typeof pattern === 'string') {\n pattern = { startkey: pattern.replace('*', ''), endkey: pattern.replace('*', '\\u9999') };\n }\n\n dbConnect(params => {\n const { objects, states } = params;\n\n objects.getObjectList(pattern, { user: 'system.user.admin', sorted: true }, (err, processed) => {\n this.printObjectList(\n objects,\n states,\n err?.message,\n processed && processed.rows && processed.rows.map(r => r.value),\n );\n return void callback(EXIT_CODES.NO_ERROR);\n });\n });\n }\n\n /**\n * Retrieves an object or its property from the DB and prints it\n *\n * @param args\n */\n get(args: any[]): void {\n const { callback, pretty, dbConnect } = this.options;\n const [id, propPath] = args.slice(1);\n if (!id) {\n CLI.error.requiredArgumentMissing('id', 'object get id [propertypath]');\n return void callback(1);\n }\n\n // If propPath is passed, the given property will be retrieved instead.\n // For example: `\"native.something[2].onething\"` selects `onething` of the 3rd array element of `object.native.something`.\n\n dbConnect(params => {\n const { objects } = params;\n\n objects.getObject(id, (err, res) => {\n if (err || !res) {\n CLI.error.objectNotFound(id, err?.message);\n return void callback(3);\n }\n if (typeof propPath === 'string') {\n // We want to select a part of the object\n try {\n res = deepSelectProperty(res, propPath);\n } catch {\n CLI.error.objectPropertyNotFound(id, propPath);\n return void callback(3);\n }\n }\n console.log(formatValue(res, pretty));\n return void callback(EXIT_CODES.NO_ERROR);\n });\n });\n }\n\n /**\n * Updates an object or its property with the given value\n *\n * @param args\n */\n set(args: any[]): void {\n const { callback, dbConnect } = this.options;\n const id: string = args[1];\n if (!id) {\n CLI.error.requiredArgumentMissing('id', 'object set id [propertypath=]value');\n return void callback(1);\n }\n\n const lastArg = args.length >= 2 ? args.slice(2).join(' ') : undefined;\n const parsedArg = parsePropPathAndAssignment(lastArg!);\n if (!parsedArg) {\n CLI.error.invalidPropertyOrValue();\n return void callback(3);\n }\n const { propPath, value } = parsedArg;\n\n dbConnect(params => {\n const { objects } = params;\n\n const doSetObject = (obj: any): void => {\n objects.setObject(id, obj, err => {\n if (err) {\n CLI.error.cannotUpdateObject(id, err.message);\n return void callback(1);\n }\n CLI.success.objectUpdated(id);\n return void callback(EXIT_CODES.NO_ERROR);\n });\n };\n if (!propPath) {\n // We set the entire object, no need to retrieve it first\n doSetObject(value as any);\n } else {\n // We want to update a part of the object\n // Retrieve the object first\n objects.getObject(id, async (err, res) => {\n if (err || !res) {\n CLI.error.objectNotFound(id, err?.message);\n return void callback(3);\n }\n try {\n deepSetProperty(res, propPath, value);\n } catch {\n CLI.error.objectPropertyNotFound(id, propPath);\n return void callback(3);\n }\n\n // auto encrypt -> only do that here, no one configures an instance by setting the whole object,\n // else it would be copied and probably already encrypted\n if (\n /^system\\.adapter\\.(?<adapterName>.+)\\.(?<instanceNr>\\d+)$/g.test(id) &&\n 'encryptedNative' in res\n ) {\n await this._autoEncrypt(objects, res, propPath, value);\n }\n\n doSetObject(res);\n });\n }\n });\n }\n\n /**\n * Encrypts all newly set properties of encryptedNative - currently customized for propPath\n *\n * @param objects - objects db instance\n * @param res - object which will be adapted\n * @param propPath - path of the changed property\n * @param value - value which has been newly set to the property\n */\n private async _autoEncrypt(\n objects: ObjectsClient,\n res: ioBroker.AnyObject,\n propPath: string,\n value: any,\n ): Promise<void> {\n // input: it's an instance object and has encrypted native, was a native value set?\n if (/^native\\..+[^.]$/g.test(propPath) && typeof value === 'string') {\n // single native property\n const prop = propPath.split('.')[1];\n if ('encryptedNative' in res && res.encryptedNative?.includes(prop)) {\n try {\n const config = await objects.getObjectAsync('system.config');\n res.native[prop] = tools.encrypt(config!.native.secret, res.native[prop]);\n } catch (e) {\n console.error(`Could not auto-encrypt property \"${prop}\": ${e.message}`);\n }\n }\n } else if (propPath === 'native' && tools.isObject(value)) {\n // whole native attribute\n let config;\n for (const prop in value) {\n if (\n typeof (res.native as Record<string, any>)[prop] === 'string' &&\n 'encryptedNative' in res &&\n res.encryptedNative?.includes(prop)\n ) {\n try {\n config = config || (await objects.getObjectAsync('system.config'))!;\n res.native[prop] = tools.encrypt(config.native.secret, res.native[prop]);\n } catch (e) {\n console.error(`Could not auto-encrypt property \"${prop}\": ${e.message}`);\n }\n }\n }\n }\n }\n\n /**\n * Extends an object with the given value\n *\n * @param args\n */\n extend(args: any[]): void {\n const { callback, dbConnect } = this.options;\n const id: string = args[1];\n if (!id) {\n CLI.error.requiredArgumentMissing('id', 'object extend id <json-value>');\n return void callback(1);\n }\n\n const lastArg = args.length >= 2 ? args.slice(2).join(' ') : undefined;\n const parsedArg = parsePropPathAndAssignment(lastArg!);\n // extend does not accept a property path, so error when one is passed\n if (!parsedArg || parsedArg.propPath) {\n CLI.error.invalidJSONValue();\n return void callback(3);\n }\n const { value } = parsedArg;\n\n dbConnect(params => {\n const { objects } = params;\n\n objects.extendObject(id, value as any, null, err => {\n if (err) {\n CLI.error.cannotUpdateObject(id, err.message);\n return void callback(1);\n }\n CLI.success.objectUpdated(id);\n return void callback(EXIT_CODES.NO_ERROR);\n });\n });\n }\n\n /**\n * Collects all object for specific path\n *\n * @param objects class\n * @param params parameters for getObjectView\n */\n async _collectObjects(objects: ObjectsClient, params: ioBroker.GetObjectViewParams): Promise<ioBroker.AnyObject[]> {\n const types = [\n 'state',\n 'channel',\n 'device',\n 'enum',\n 'instance',\n 'host',\n 'adapter',\n 'meta',\n 'config',\n 'group',\n 'user',\n 'script',\n ];\n const result: ioBroker.AnyObject[] = [];\n\n for (const type of types) {\n try {\n const res = await objects.getObjectViewAsync('system', type, params);\n res.rows.forEach(item => {\n if (item.value) {\n result.push(item.value);\n }\n });\n } catch {\n // ignore\n }\n }\n return result;\n }\n\n /**\n * Delete all object from list sequentially\n *\n * @param objects class\n * @param ids IDs\n * @param callback\n */\n async _deleteObjects(objects: ObjectsClient, ids: string[], callback: (exitCode: number) => void): Promise<void> {\n if (!ids || !ids.length) {\n return tools.maybeCallback(callback, EXIT_CODES.NO_ERROR);\n }\n let allEnums;\n\n try {\n // cache all enums, else it will be slow to delete many objects\n allEnums = await tools.getAllEnums(objects);\n } catch (e) {\n console.error(`Could not retrieve all enums: ${e.message}`);\n }\n\n for (const id of ids) {\n try {\n await objects.delObjectAsync(id);\n await tools.removeIdFromAllEnums(objects, id, allEnums);\n } catch (e) {\n console.warn(`Could not delete object or remove \"${id}\" from enums: ${e.message}`);\n }\n }\n return tools.maybeCallback(callback, EXIT_CODES.NO_ERROR);\n }\n\n /**\n * Deletes an object\n *\n * @param args\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', 'object delete id');\n return void callback(1);\n }\n\n dbConnect(async params => {\n const { objects } = params;\n\n if (id.endsWith('*')) {\n const params = {\n startkey: id.replace(/\\*/g, ''),\n endkey: id.replace(/\\*/g, '\\u9999'),\n };\n\n const result = await this._collectObjects(objects, params);\n if (!result || !result.length) {\n console.log('No IDs found for this pattern.');\n return void callback(EXIT_CODES.NO_ERROR);\n }\n const ids = result.map(item => item._id);\n\n // if no auto confirmation, ask user\n if (!this.options.f && this.options.y && !this.options.yes) {\n const rl = (await import('node:readline')).createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n rl.question(`${result.length} object(s) will be deleted. Are you sure? [y/N]: `, answer => {\n rl.close();\n if (\n answer === 'y' ||\n answer === 'yes' ||\n answer === 'j' ||\n answer === 'ja' ||\n answer === '\u0434\u0430' ||\n answer === '\u0434'\n ) {\n this._deleteObjects(objects, ids, callback);\n } else {\n console.log('Aborted.');\n return void callback(3);\n }\n });\n } else {\n this._deleteObjects(objects, ids, callback);\n }\n } else {\n // only one object\n objects.delObject(id, async err => {\n if (err) {\n CLI.error.objectNotFound(id, err.message);\n callback(3);\n } else {\n try {\n await tools.removeIdFromAllEnums(objects, id);\n CLI.success.objectDeleted(id);\n callback(EXIT_CODES.NO_ERROR);\n } catch (e) {\n CLI.error.cannotDeleteObjectFromEnums(id, e.message);\n callback(3);\n }\n }\n });\n }\n });\n }\n\n /**\n * Prints a list of objects and its access properties\n *\n * @param objects objects db\n * @param states states db\n * @param err An error (if one occurred)\n * @param objList The object list to print\n */\n async printObjectList(\n objects: ObjectsClient,\n states: StatesClient,\n err: string | undefined,\n objList?: ioBroker.AnyObject[],\n ): Promise<void> {\n // TODO: is this supposed to be here?\n const { callback } = this.options;\n if (err) {\n console.error(err);\n return void callback(33);\n }\n if (objList !== null && objList !== undefined) {\n const { List } = await import('../setup/setupList.js');\n const list = new List({\n states,\n objects,\n processExit: callback,\n });\n list.showObjectHeader();\n objList.forEach(list.showObject);\n }\n setTimeout(callback, 1_000);\n }\n}\n\n/**\n * Reverses a string\n *\n * @param str The string to reverse\n */\nfunction reverseString(str: string): string {\n return Array.from(str).reverse().join('');\n}\n\n/**\n * Normalizes a property path for use in deepSelectProperty and deepSetProperty\n *\n * @param path The property path to normalize\n */\nfunction normalizePropertyPath(path: string): string {\n // Basically we want to support paths like \"obj[1][2]\", but the other methods expect \"obj.[1].[2]\"\n // So we need to replace all occurences of square brackets without leading dots\n // JS Regex only supports negative lookbehind in ES 2018, so we fake it using reversed strings and\n // negative lookahead\n const arrayIndexRegex = /(]\\d+\\[)(?!\\.)/g; // Reversing the string reverses the brackets too\n let ret = reverseString(path);\n // Append the dot to each bracket, since we're going to reverse it\n ret = ret.replace(arrayIndexRegex, '$1.');\n return reverseString(ret);\n}\n\n/**\n * Selects a property of an object or its sub-objects and returns it if it exists. E.g.\n * `deepSelectProperty(obj, \"common.asdf.qwer\")` => `obj.common.asdf.qwer`\n *\n * @param object The object to select a property from\n * @param path The property path to search for\n */\nfunction deepSelectProperty(object: ioBroker.AnyObject, path: string): any {\n /**\n * @param obj\n * @param pathArr\n */\n function _deepSelectProperty(obj: any, pathArr: string[]): unknown {\n // are we there yet? then return obj\n if (!pathArr.length) {\n return obj;\n }\n // go deeper\n let propName = pathArr.shift()!;\n if (/\\[\\d+]/.test(propName)) {\n // this is an array index\n // @ts-expect-error // TODO: fix it - this is not ts fashion, assigning numbers to the string array here\n propName = parseInt(propName.slice(1, -1));\n }\n return _deepSelectProperty(obj[propName], pathArr);\n }\n path = normalizePropertyPath(path);\n return _deepSelectProperty(object, path.split('.'));\n}\n\n/**\n * Changes a property of an object or its sub-objects if it exists. Opposite of `deepSelectProperty`.\n *\n * @param object The object to replace a property in\n * @param path The property path to search for\n * @param value\n */\nfunction deepSetProperty(object: ioBroker.AnyObject, path: string, value: any): void {\n /**\n * @param obj\n * @param pathArr\n */\n function _deepSetProperty(obj: any, pathArr: string[]): void {\n // are we there yet? then return obj\n if (pathArr.length === 1) {\n obj[pathArr[0]] = value;\n return;\n }\n // go deeper\n let propName = pathArr.shift()!;\n if (/\\[\\d+]/.test(propName)) {\n // this is an array index\n // @ts-expect-error // TODO: fix it - this is not ts fashion, assigning numbers to the string array here\n propName = parseInt(propName.slice(1, -1));\n }\n _deepSetProperty(obj[propName], pathArr);\n }\n path = normalizePropertyPath(path);\n _deepSetProperty(object, path.split('.'));\n}\n\n/**\n * Tries to parse a CLI argument that could be used to set an object\n *\n * @param arg The CLI argument containing the value to be set\n */\nfunction parseCLIValue(arg: string): any {\n try {\n // JSON.parse does not allow plain strings\n return JSON.parse(arg);\n } catch {\n // arg is a string\n return arg;\n }\n}\n\n/**\n * Tries to parse a CLI argument of the form [propPath=]value.\n *\n * @param arg The CLI argument containing an optional prop path and a JSON value\n */\nfunction parsePropPathAndAssignment(arg: string): ParsedPropPathAndAssignment | undefined {\n const equalsIndex = arg.indexOf('=');\n if (equalsIndex > -1) {\n // This might contain a propPath AND a value\n const propPath = arg.substr(0, equalsIndex);\n const valueString = arg.substr(equalsIndex + 1);\n // For partial assignments, allow strings as the value\n const value = parseCLIValue(valueString);\n return { propPath, value };\n }\n // This is a full assignment, allow only objects\n try {\n const value = JSON.parse(arg);\n if (!tools.isObject(value)) {\n return undefined;\n }\n return { value };\n } catch {\n // nope!\n return undefined;\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["params"]
7
7
  }
@@ -14,20 +14,20 @@ export declare class CLIPlugin extends CLICommand<CLIPluginOptions> {
14
14
  *
15
15
  * @param args parsed cli args
16
16
  */
17
- execute(args: string[]): void;
17
+ execute(args: any[]): void;
18
18
  /**
19
19
  * Enables or disables the given plugin
20
20
  *
21
21
  * @param args the parsed CLI args
22
22
  * @param enabled if plugin should be enabled
23
23
  */
24
- set(args: string[], enabled: boolean): void;
24
+ set(args: any[], enabled: boolean): void;
25
25
  /**
26
26
  * Prints the status of the given plugin
27
27
  *
28
28
  * @param args the parsed CLI arguments
29
29
  */
30
- status(args: string[]): void;
30
+ status(args: any[]): void;
31
31
  }
32
32
  export {};
33
33
  //# sourceMappingURL=cliPlugin.d.ts.map
@@ -5,7 +5,6 @@ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
5
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
6
  var __getProtoOf = Object.getPrototypeOf;
7
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
8
- var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
9
8
  var __export = (target, all) => {
10
9
  for (var name in all)
11
10
  __defProp(target, name, { get: all[name], enumerable: true });
@@ -43,9 +42,6 @@ var import_node_module = require("node:module");
43
42
  const require2 = (0, import_node_module.createRequire)(__import_meta_url || `file://${__filename}`);
44
43
  const controllerIoPackPath = require2.resolve("iobroker.js-controller/io-package.json");
45
44
  class CLIPlugin extends import_cliCommand.CLICommand {
46
- static {
47
- __name(this, "CLIPlugin");
48
- }
49
45
  /** @param options the cli command options */
50
46
  constructor(options) {
51
47
  super(options);
@@ -246,7 +242,6 @@ function pluginExists(pluginName, iobrokerJson, adapter) {
246
242
  }
247
243
  return !!(iobrokerJson?.plugins && pluginName in iobrokerJson.plugins);
248
244
  }
249
- __name(pluginExists, "pluginExists");
250
245
  function pluginEnabled(pluginName, adapter, systemConfig, iobrokerJson) {
251
246
  if (systemConfig?.common?.diag === "none") {
252
247
  return false;
@@ -264,7 +259,6 @@ function pluginEnabled(pluginName, adapter, systemConfig, iobrokerJson) {
264
259
  }
265
260
  return true;
266
261
  }
267
- __name(pluginEnabled, "pluginEnabled");
268
262
  // Annotate the CommonJS export names for ESM import in node:
269
263
  0 && (module.exports = {
270
264
  CLIPlugin
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/lib/cli/cliPlugin.ts", "../../../../../../node_modules/@alcalzone/esm2cjs/shims/import.meta.url/shim.js"],
4
- "sourcesContent": ["import * as CLI from './messages.js';\nimport { type CLICommandOptions, CLICommand } from './cliCommand.js';\nimport { getObjectFrom } from './cliTools.js';\nimport { tools } from '@iobroker/js-controller-common';\nimport fs from 'fs-extra';\nimport path from 'node:path';\nimport { createRequire } from 'node:module';\n\n// eslint-disable-next-line unicorn/prefer-module\nconst require = createRequire(import.meta.url || `file://${__filename}`);\n\nconst controllerIoPackPath = require.resolve('iobroker.js-controller/io-package.json');\n\ninterface CLIPluginOptions extends CLICommandOptions {\n /** If plugin is scoped on adapter */\n adapter?: string;\n /** If plugin is scoped on instance */\n instance?: string;\n}\n\n/** Command iobroker plugin <enable/disable/status> <pluginname> [--host this/hostname] ... */\nexport class CLIPlugin extends CLICommand<CLIPluginOptions> {\n /** @param options the cli command options */\n constructor(options: CLIPluginOptions) {\n super(options);\n }\n\n /**\n * Executes a command\n *\n * @param args parsed cli args\n */\n execute(args: string[]): void {\n const { callback, showHelp } = this.options;\n const command = args[0];\n\n switch (command) {\n case 'on':\n case 'enable':\n return this.set(args, true);\n case 'off':\n case 'disable':\n return this.set(args, false);\n case 'status':\n return this.status(args);\n default:\n CLI.error.unknownCommand('plugin', command);\n showHelp();\n return void callback(3);\n }\n }\n\n /**\n * Enables or disables the given plugin\n *\n * @param args the parsed CLI args\n * @param enabled if plugin should be enabled\n */\n set(args: string[], enabled: boolean): void {\n const { callback, dbConnect } = this.options;\n const pluginName: string = args[1];\n if (!pluginName) {\n CLI.error.requiredArgumentMissing('pluginName', 'plugin enable <pluginname>');\n return void callback(34);\n }\n\n let hostname: string;\n let instance: string;\n\n if (this.options.adapter || this.options.instance) {\n instance = (this.options.adapter || this.options.instance) as string;\n // default to instance 0\n if (!/\\.\\d+$/.test(instance)) {\n instance += '.0';\n }\n } else {\n // Use host if no adapter was specified and fallback to the current one\n hostname = this.options.host as string;\n if (!hostname || hostname === 'this') {\n hostname = tools.getHostName();\n }\n }\n\n dbConnect(async params => {\n const { states, objects, config: iobrokerJson } = params;\n\n try {\n // Check if the host or instance exists\n let objectNamespace: string;\n if (hostname) {\n objectNamespace = `system.host.${hostname}`;\n const hostObject = await objects.getObject(objectNamespace);\n if (!hostObject) {\n CLI.error.hostDoesNotExist(hostname);\n return void callback(30);\n }\n } else {\n objectNamespace = `system.adapter.${instance}`;\n const instanceObject = await objects.getObject(objectNamespace);\n if (!instanceObject) {\n CLI.error.invalidInstance(instance);\n return void callback(30);\n }\n }\n\n // Check if the plugin is defined\n if (!pluginExists(pluginName, iobrokerJson, instance)) {\n CLI.error.pluginNotDefined(pluginName, hostname, instance);\n return void callback(30);\n }\n\n // Create the plugin state if it does not exist\n const pluginsFolderId = `${objectNamespace}.plugins`;\n if (!(await objects.getObjectAsync(pluginsFolderId))) {\n await objects.setObject(pluginsFolderId, {\n type: 'folder',\n common: {\n name: `${hostname ? 'host' : 'instance'}: plugin states`,\n },\n native: {},\n });\n }\n const pluginFolderId = `${objectNamespace}.plugins.${pluginName}`;\n if (!(await objects.getObjectAsync(pluginFolderId))) {\n await objects.setObject(pluginFolderId, {\n type: 'folder',\n common: {\n name: `${pluginName}: plugin states`,\n },\n native: {},\n });\n }\n const pluginEnabledId = `${pluginFolderId}.enabled`;\n if (!(await objects.getObjectAsync(pluginEnabledId))) {\n await objects.setObject(pluginEnabledId, {\n type: 'state',\n common: {\n name: 'Plugin enabled',\n type: 'boolean',\n read: true,\n write: true,\n role: 'value',\n },\n native: {},\n });\n }\n\n // Update the state\n await states.setStateAsync(pluginEnabledId, {\n val: enabled,\n from: getObjectFrom(),\n });\n\n // Notify the user that we are done\n CLI.success.pluginEnabledOrDisabled(pluginName, hostname, instance, enabled);\n return void callback();\n } catch (err) {\n CLI.error.unknown(err.message);\n return void callback(1);\n }\n });\n }\n\n /**\n * Prints the status of the given plugin\n *\n * @param args the parsed CLI arguments\n */\n status(args: string[]): void {\n const { callback, dbConnect } = this.options;\n const pluginName = args[1];\n if (!pluginName) {\n CLI.error.requiredArgumentMissing('pluginName', 'plugin status <pluginname>');\n return void callback(34);\n }\n\n let hostname: string;\n let instance: string;\n\n if (this.options.adapter || this.options.instance) {\n instance = (this.options.adapter || this.options.instance) as string;\n // default to instance 0\n if (!/\\.\\d+$/.test(instance)) {\n instance += '.0';\n }\n } else {\n // Use host if no adapter was specified and fallback to the current one\n hostname = this.options.host as string;\n if (!hostname || hostname === 'this') {\n hostname = tools.getHostName();\n }\n }\n\n dbConnect(async params => {\n const { states, objects, config: iobrokerJson } = params;\n\n try {\n // Check if the host or instance exists\n let objectNamespace: string;\n if (hostname) {\n objectNamespace = `system.host.${hostname}`;\n const hostObject = await objects.getObject(objectNamespace);\n if (!hostObject) {\n CLI.error.hostDoesNotExist(hostname);\n return void callback(30);\n }\n } else {\n objectNamespace = `system.adapter.${instance}`;\n const instanceObject = await objects.getObject(objectNamespace);\n if (!instanceObject) {\n CLI.error.invalidInstance(instance);\n return void callback(30);\n }\n }\n\n // Check if the plugin is defined\n if (!pluginExists(pluginName, iobrokerJson, instance)) {\n CLI.error.pluginNotDefined(pluginName, hostname, instance);\n return void callback(30);\n }\n\n const pluginEnabledId = `${objectNamespace}.plugins.${pluginName}.enabled`;\n\n // Read the state\n try {\n const val = (await states.getStateAsync(pluginEnabledId))?.val;\n\n if (typeof val === 'boolean') {\n CLI.success.pluginStatus(pluginName, hostname, instance, val);\n return void callback();\n }\n } catch {\n /* ignore */\n }\n\n // If the state could not be read or had no value, fall back to the configuration\n const enabled = pluginEnabled(\n pluginName,\n instance,\n await objects.getObjectAsync('system.config'),\n iobrokerJson,\n );\n CLI.success.pluginStatus(pluginName, hostname, instance, enabled);\n return void callback();\n } catch (err) {\n CLI.error.unknown(err.message);\n return void callback(1);\n }\n });\n }\n}\n\n/**\n * Checks if a plugin exists and can be configured\n *\n * @param pluginName The name of the plugin to check\n * @param iobrokerJson The contents of iobroker.json\n * @param [adapter] (optional) - If passed, the adapter configuration will be searched for defined plugins instead of js-controller\n */\nfunction pluginExists(pluginName: string, iobrokerJson?: ioBroker.IoBrokerJson, adapter?: string): boolean {\n // 1. check if the plugin is defined in io-package.json\n try {\n const ioPackPath = adapter ? path.join(tools.getAdapterDir(adapter)!, 'io-package.json') : controllerIoPackPath;\n const ioPack = fs.readJSONSync(ioPackPath, { encoding: 'utf8' });\n if (ioPack?.common?.plugins && pluginName in ioPack.common.plugins) {\n return true;\n }\n } catch {\n /* ignore */\n }\n\n // 2. check if the plugin is defined in iobroker.json\n return !!(iobrokerJson?.plugins && pluginName in iobrokerJson.plugins);\n}\n\n/**\n * Checks if a plugin exists and can be configured\n *\n * @param pluginName name of the plugin, e.g. `sentry`\n * @param adapter If defined, the adapter configuration will be searched for defined plugins instead of js-controller\n * @param systemConfig The system.config object\n * @param iobrokerJson The contents of iobroker.json\n */\nfunction pluginEnabled(\n pluginName: string,\n adapter?: string,\n systemConfig?: ioBroker.SystemConfigObject | null,\n iobrokerJson?: ioBroker.IoBrokerJson,\n): boolean {\n // 1. check if diagnostics are disabled in ioBroker\n if (systemConfig?.common?.diag === 'none') {\n return false;\n }\n\n // 2. check if the plugin is disabled in io-package.json\n try {\n const ioPackPath = adapter ? path.join(tools.getAdapterDir(adapter)!, 'io-package.json') : controllerIoPackPath;\n const ioPack = fs.readJSONSync(ioPackPath, { encoding: 'utf8' });\n if (\n ioPack?.common?.plugins &&\n pluginName in ioPack.common.plugins &&\n ioPack.common.plugins[pluginName].enabled === false\n ) {\n return false;\n }\n } catch {\n /* ignore */\n }\n\n // 3. check if the plugin is disabled in iobroker.json\n if (\n iobrokerJson?.plugins &&\n pluginName in iobrokerJson.plugins &&\n iobrokerJson.plugins[pluginName].enabled === false\n ) {\n return false;\n }\n\n // default: enabled\n return true;\n}\n", "export const __import_meta_url =\n typeof document === 'undefined' ? new (require('url'.replace('', '')).URL)('file:' + __filename).href :\n (document.currentScript && document.currentScript.src || new URL('main.js', document.baseURI).href)\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;ACAO,IAAM,oBACX,OAAO,aAAa,cAAc,KAAK,QAAQ,MAAM,QAAQ,IAAI,EAAE,CAAC,GAAE,IAAK,UAAU,UAAU,EAAE,OAC9F,SAAS,iBAAiB,SAAS,cAAc,OAAO,IAAI,IAAI,WAAW,SAAS,OAAO,EAAE;ADFlG,UAAqB;AACrB,wBAAmD;AACnD,sBAA8B;AAC9B,kCAAsB;AACtB,sBAAe;AACf,uBAAiB;AACjB,yBAA8B;AAG9B,MAAMA,eAAU,kCAAc,qBAAmB,UAAU,UAAU,EAAE;AAEvE,MAAM,uBAAuBA,SAAQ,QAAQ,wCAAwC;AAU/E,MAAO,kBAAkB,6BAA4B;EArB3D,OAqB2D;;;;EAEvD,YAAY,SAAyB;AACjC,UAAM,OAAO;EACjB;;;;;;EAOA,QAAQ,MAAc;AAClB,UAAM,EAAE,UAAU,SAAQ,IAAK,KAAK;AACpC,UAAM,UAAU,KAAK,CAAC;AAEtB,YAAQ,SAAS;MACb,KAAK;MACL,KAAK;AACD,eAAO,KAAK,IAAI,MAAM,IAAI;MAC9B,KAAK;MACL,KAAK;AACD,eAAO,KAAK,IAAI,MAAM,KAAK;MAC/B,KAAK;AACD,eAAO,KAAK,OAAO,IAAI;MAC3B;AACI,YAAI,MAAM,eAAe,UAAU,OAAO;AAC1C,iBAAQ;AACR,eAAO,KAAK,SAAS,CAAC;IAC9B;EACJ;;;;;;;EAQA,IAAI,MAAgB,SAAgB;AAChC,UAAM,EAAE,UAAU,UAAS,IAAK,KAAK;AACrC,UAAM,aAAqB,KAAK,CAAC;AACjC,QAAI,CAAC,YAAY;AACb,UAAI,MAAM,wBAAwB,cAAc,4BAA4B;AAC5E,aAAO,KAAK,SAAS,EAAE;IAC3B;AAEA,QAAI;AACJ,QAAI;AAEJ,QAAI,KAAK,QAAQ,WAAW,KAAK,QAAQ,UAAU;AAC/C,iBAAY,KAAK,QAAQ,WAAW,KAAK,QAAQ;AAEjD,UAAI,CAAC,SAAS,KAAK,QAAQ,GAAG;AAC1B,oBAAY;MAChB;IACJ,OAAO;AAEH,iBAAW,KAAK,QAAQ;AACxB,UAAI,CAAC,YAAY,aAAa,QAAQ;AAClC,mBAAW,kCAAM,YAAW;MAChC;IACJ;AAEA,cAAU,OAAM,WAAS;AACrB,YAAM,EAAE,QAAQ,SAAS,QAAQ,aAAY,IAAK;AAElD,UAAI;AAEA,YAAI;AACJ,YAAI,UAAU;AACV,4BAAkB,eAAe,QAAQ;AACzC,gBAAM,aAAa,MAAM,QAAQ,UAAU,eAAe;AAC1D,cAAI,CAAC,YAAY;AACb,gBAAI,MAAM,iBAAiB,QAAQ;AACnC,mBAAO,KAAK,SAAS,EAAE;UAC3B;QACJ,OAAO;AACH,4BAAkB,kBAAkB,QAAQ;AAC5C,gBAAM,iBAAiB,MAAM,QAAQ,UAAU,eAAe;AAC9D,cAAI,CAAC,gBAAgB;AACjB,gBAAI,MAAM,gBAAgB,QAAQ;AAClC,mBAAO,KAAK,SAAS,EAAE;UAC3B;QACJ;AAGA,YAAI,CAAC,aAAa,YAAY,cAAc,QAAQ,GAAG;AACnD,cAAI,MAAM,iBAAiB,YAAY,UAAU,QAAQ;AACzD,iBAAO,KAAK,SAAS,EAAE;QAC3B;AAGA,cAAM,kBAAkB,GAAG,eAAe;AAC1C,YAAI,CAAE,MAAM,QAAQ,eAAe,eAAe,GAAI;AAClD,gBAAM,QAAQ,UAAU,iBAAiB;YACrC,MAAM;YACN,QAAQ;cACJ,MAAM,GAAG,WAAW,SAAS,UAAU;;YAE3C,QAAQ,CAAA;WACX;QACL;AACA,cAAM,iBAAiB,GAAG,eAAe,YAAY,UAAU;AAC/D,YAAI,CAAE,MAAM,QAAQ,eAAe,cAAc,GAAI;AACjD,gBAAM,QAAQ,UAAU,gBAAgB;YACpC,MAAM;YACN,QAAQ;cACJ,MAAM,GAAG,UAAU;;YAEvB,QAAQ,CAAA;WACX;QACL;AACA,cAAM,kBAAkB,GAAG,cAAc;AACzC,YAAI,CAAE,MAAM,QAAQ,eAAe,eAAe,GAAI;AAClD,gBAAM,QAAQ,UAAU,iBAAiB;YACrC,MAAM;YACN,QAAQ;cACJ,MAAM;cACN,MAAM;cACN,MAAM;cACN,OAAO;cACP,MAAM;;YAEV,QAAQ,CAAA;WACX;QACL;AAGA,cAAM,OAAO,cAAc,iBAAiB;UACxC,KAAK;UACL,UAAM,+BAAa;SACtB;AAGD,YAAI,QAAQ,wBAAwB,YAAY,UAAU,UAAU,OAAO;AAC3E,eAAO,KAAK,SAAQ;MACxB,SAAS,KAAK;AACV,YAAI,MAAM,QAAQ,IAAI,OAAO;AAC7B,eAAO,KAAK,SAAS,CAAC;MAC1B;IACJ,CAAC;EACL;;;;;;EAOA,OAAO,MAAc;AACjB,UAAM,EAAE,UAAU,UAAS,IAAK,KAAK;AACrC,UAAM,aAAa,KAAK,CAAC;AACzB,QAAI,CAAC,YAAY;AACb,UAAI,MAAM,wBAAwB,cAAc,4BAA4B;AAC5E,aAAO,KAAK,SAAS,EAAE;IAC3B;AAEA,QAAI;AACJ,QAAI;AAEJ,QAAI,KAAK,QAAQ,WAAW,KAAK,QAAQ,UAAU;AAC/C,iBAAY,KAAK,QAAQ,WAAW,KAAK,QAAQ;AAEjD,UAAI,CAAC,SAAS,KAAK,QAAQ,GAAG;AAC1B,oBAAY;MAChB;IACJ,OAAO;AAEH,iBAAW,KAAK,QAAQ;AACxB,UAAI,CAAC,YAAY,aAAa,QAAQ;AAClC,mBAAW,kCAAM,YAAW;MAChC;IACJ;AAEA,cAAU,OAAM,WAAS;AACrB,YAAM,EAAE,QAAQ,SAAS,QAAQ,aAAY,IAAK;AAElD,UAAI;AAEA,YAAI;AACJ,YAAI,UAAU;AACV,4BAAkB,eAAe,QAAQ;AACzC,gBAAM,aAAa,MAAM,QAAQ,UAAU,eAAe;AAC1D,cAAI,CAAC,YAAY;AACb,gBAAI,MAAM,iBAAiB,QAAQ;AACnC,mBAAO,KAAK,SAAS,EAAE;UAC3B;QACJ,OAAO;AACH,4BAAkB,kBAAkB,QAAQ;AAC5C,gBAAM,iBAAiB,MAAM,QAAQ,UAAU,eAAe;AAC9D,cAAI,CAAC,gBAAgB;AACjB,gBAAI,MAAM,gBAAgB,QAAQ;AAClC,mBAAO,KAAK,SAAS,EAAE;UAC3B;QACJ;AAGA,YAAI,CAAC,aAAa,YAAY,cAAc,QAAQ,GAAG;AACnD,cAAI,MAAM,iBAAiB,YAAY,UAAU,QAAQ;AACzD,iBAAO,KAAK,SAAS,EAAE;QAC3B;AAEA,cAAM,kBAAkB,GAAG,eAAe,YAAY,UAAU;AAGhE,YAAI;AACA,gBAAM,OAAO,MAAM,OAAO,cAAc,eAAe,IAAI;AAE3D,cAAI,OAAO,QAAQ,WAAW;AAC1B,gBAAI,QAAQ,aAAa,YAAY,UAAU,UAAU,GAAG;AAC5D,mBAAO,KAAK,SAAQ;UACxB;QACJ,QAAQ;QAER;AAGA,cAAM,UAAU,cACZ,YACA,UACA,MAAM,QAAQ,eAAe,eAAe,GAC5C,YAAY;AAEhB,YAAI,QAAQ,aAAa,YAAY,UAAU,UAAU,OAAO;AAChE,eAAO,KAAK,SAAQ;MACxB,SAAS,KAAK;AACV,YAAI,MAAM,QAAQ,IAAI,OAAO;AAC7B,eAAO,KAAK,SAAS,CAAC;MAC1B;IACJ,CAAC;EACL;;AAUJ,SAAS,aAAa,YAAoB,cAAsC,SAAgB;AAE5F,MAAI;AACA,UAAM,aAAa,UAAU,iBAAAC,QAAK,KAAK,kCAAM,cAAc,OAAO,GAAI,iBAAiB,IAAI;AAC3F,UAAM,SAAS,gBAAAC,QAAG,aAAa,YAAY,EAAE,UAAU,OAAM,CAAE;AAC/D,QAAI,QAAQ,QAAQ,WAAW,cAAc,OAAO,OAAO,SAAS;AAChE,aAAO;IACX;EACJ,QAAQ;EAER;AAGA,SAAO,CAAC,EAAE,cAAc,WAAW,cAAc,aAAa;AAClE;AAdS;AAwBT,SAAS,cACL,YACA,SACA,cACA,cAAoC;AAGpC,MAAI,cAAc,QAAQ,SAAS,QAAQ;AACvC,WAAO;EACX;AAGA,MAAI;AACA,UAAM,aAAa,UAAU,iBAAAD,QAAK,KAAK,kCAAM,cAAc,OAAO,GAAI,iBAAiB,IAAI;AAC3F,UAAM,SAAS,gBAAAC,QAAG,aAAa,YAAY,EAAE,UAAU,OAAM,CAAE;AAC/D,QACI,QAAQ,QAAQ,WAChB,cAAc,OAAO,OAAO,WAC5B,OAAO,OAAO,QAAQ,UAAU,EAAE,YAAY,OAChD;AACE,aAAO;IACX;EACJ,QAAQ;EAER;AAGA,MACI,cAAc,WACd,cAAc,aAAa,WAC3B,aAAa,QAAQ,UAAU,EAAE,YAAY,OAC/C;AACE,WAAO;EACX;AAGA,SAAO;AACX;AArCS;",
4
+ "sourcesContent": ["import * as CLI from './messages.js';\nimport { type CLICommandOptions, CLICommand } from './cliCommand.js';\nimport { getObjectFrom } from './cliTools.js';\nimport { tools } from '@iobroker/js-controller-common';\nimport fs from 'fs-extra';\nimport path from 'node:path';\nimport { createRequire } from 'node:module';\n\n// eslint-disable-next-line unicorn/prefer-module\nconst require = createRequire(import.meta.url || `file://${__filename}`);\n\nconst controllerIoPackPath = require.resolve('iobroker.js-controller/io-package.json');\n\ninterface CLIPluginOptions extends CLICommandOptions {\n /** If plugin is scoped on adapter */\n adapter?: string;\n /** If plugin is scoped on instance */\n instance?: string;\n}\n\n/** Command iobroker plugin <enable/disable/status> <pluginname> [--host this/hostname] ... */\nexport class CLIPlugin extends CLICommand<CLIPluginOptions> {\n /** @param options the cli command options */\n constructor(options: CLIPluginOptions) {\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, showHelp } = this.options;\n const command = args[0];\n\n switch (command) {\n case 'on':\n case 'enable':\n return this.set(args, true);\n case 'off':\n case 'disable':\n return this.set(args, false);\n case 'status':\n return this.status(args);\n default:\n CLI.error.unknownCommand('plugin', command);\n showHelp();\n return void callback(3);\n }\n }\n\n /**\n * Enables or disables the given plugin\n *\n * @param args the parsed CLI args\n * @param enabled if plugin should be enabled\n */\n set(args: any[], enabled: boolean): void {\n const { callback, dbConnect } = this.options;\n const pluginName: string = args[1];\n if (!pluginName) {\n CLI.error.requiredArgumentMissing('pluginName', 'plugin enable <pluginname>');\n return void callback(34);\n }\n\n let hostname: string;\n let instance: string;\n\n if (this.options.adapter || this.options.instance) {\n instance = (this.options.adapter || this.options.instance) as string;\n // default to instance 0\n if (!/\\.\\d+$/.test(instance)) {\n instance += '.0';\n }\n } else {\n // Use host if no adapter was specified and fallback to the current one\n hostname = this.options.host;\n if (!hostname || hostname === 'this') {\n hostname = tools.getHostName();\n }\n }\n\n dbConnect(async params => {\n const { states, objects, config: iobrokerJson } = params;\n\n try {\n // Check if the host or instance exists\n let objectNamespace: string;\n if (hostname) {\n objectNamespace = `system.host.${hostname}`;\n const hostObject = await objects.getObject(objectNamespace);\n if (!hostObject) {\n CLI.error.hostDoesNotExist(hostname);\n return void callback(30);\n }\n } else {\n objectNamespace = `system.adapter.${instance}`;\n const instanceObject = await objects.getObject(objectNamespace);\n if (!instanceObject) {\n CLI.error.invalidInstance(instance);\n return void callback(30);\n }\n }\n\n // Check if the plugin is defined\n if (!pluginExists(pluginName, iobrokerJson, instance)) {\n CLI.error.pluginNotDefined(pluginName, hostname, instance);\n return void callback(30);\n }\n\n // Create the plugin state if it does not exist\n const pluginsFolderId = `${objectNamespace}.plugins`;\n if (!(await objects.getObjectAsync(pluginsFolderId))) {\n await objects.setObject(pluginsFolderId, {\n type: 'folder',\n common: {\n name: `${hostname ? 'host' : 'instance'}: plugin states`,\n },\n native: {},\n });\n }\n const pluginFolderId = `${objectNamespace}.plugins.${pluginName}`;\n if (!(await objects.getObjectAsync(pluginFolderId))) {\n await objects.setObject(pluginFolderId, {\n type: 'folder',\n common: {\n name: `${pluginName}: plugin states`,\n },\n native: {},\n });\n }\n const pluginEnabledId = `${pluginFolderId}.enabled`;\n if (!(await objects.getObjectAsync(pluginEnabledId))) {\n await objects.setObject(pluginEnabledId, {\n type: 'state',\n common: {\n name: 'Plugin enabled',\n type: 'boolean',\n read: true,\n write: true,\n role: 'value',\n },\n native: {},\n });\n }\n\n // Update the state\n await states.setStateAsync(pluginEnabledId, {\n val: enabled,\n from: getObjectFrom(),\n });\n\n // Notify the user that we are done\n CLI.success.pluginEnabledOrDisabled(pluginName, hostname, instance, enabled);\n return void callback();\n } catch (err) {\n CLI.error.unknown(err.message);\n return void callback(1);\n }\n });\n }\n\n /**\n * Prints the status of the given plugin\n *\n * @param args the parsed CLI arguments\n */\n status(args: any[]): void {\n const { callback, dbConnect } = this.options;\n const pluginName = args[1];\n if (!pluginName) {\n CLI.error.requiredArgumentMissing('pluginName', 'plugin status <pluginname>');\n return void callback(34);\n }\n\n let hostname: string;\n let instance: string;\n\n if (this.options.adapter || this.options.instance) {\n instance = (this.options.adapter || this.options.instance) as string;\n // default to instance 0\n if (!/\\.\\d+$/.test(instance)) {\n instance += '.0';\n }\n } else {\n // Use host if no adapter was specified and fallback to the current one\n hostname = this.options.host;\n if (!hostname || hostname === 'this') {\n hostname = tools.getHostName();\n }\n }\n\n dbConnect(async params => {\n const { states, objects, config: iobrokerJson } = params;\n\n try {\n // Check if the host or instance exists\n let objectNamespace: string;\n if (hostname) {\n objectNamespace = `system.host.${hostname}`;\n const hostObject = await objects.getObject(objectNamespace);\n if (!hostObject) {\n CLI.error.hostDoesNotExist(hostname);\n return void callback(30);\n }\n } else {\n objectNamespace = `system.adapter.${instance}`;\n const instanceObject = await objects.getObject(objectNamespace);\n if (!instanceObject) {\n CLI.error.invalidInstance(instance);\n return void callback(30);\n }\n }\n\n // Check if the plugin is defined\n if (!pluginExists(pluginName, iobrokerJson, instance)) {\n CLI.error.pluginNotDefined(pluginName, hostname, instance);\n return void callback(30);\n }\n\n const pluginEnabledId = `${objectNamespace}.plugins.${pluginName}.enabled`;\n\n // Read the state\n try {\n const val = (await states.getStateAsync(pluginEnabledId))?.val;\n\n if (typeof val === 'boolean') {\n CLI.success.pluginStatus(pluginName, hostname, instance, val);\n return void callback();\n }\n } catch {\n /* ignore */\n }\n\n // If the state could not be read or had no value, fall back to the configuration\n const enabled = pluginEnabled(\n pluginName,\n instance,\n await objects.getObjectAsync('system.config'),\n iobrokerJson,\n );\n CLI.success.pluginStatus(pluginName, hostname, instance, enabled);\n return void callback();\n } catch (err) {\n CLI.error.unknown(err.message);\n return void callback(1);\n }\n });\n }\n}\n\n/**\n * Checks if a plugin exists and can be configured\n *\n * @param pluginName\n * @param iobrokerJson The contents of iobroker.json\n * @param [adapter] (optional) - If passed, the adapter configuration will be searched for defined plugins instead of js-controller\n */\nfunction pluginExists(pluginName: string, iobrokerJson?: ioBroker.IoBrokerJson, adapter?: string): boolean {\n // 1. check if the plugin is defined in io-package.json\n try {\n const ioPackPath = adapter ? path.join(tools.getAdapterDir(adapter)!, 'io-package.json') : controllerIoPackPath;\n const ioPack = fs.readJSONSync(ioPackPath, { encoding: 'utf8' });\n if (ioPack?.common?.plugins && pluginName in ioPack.common.plugins) {\n return true;\n }\n } catch {\n /* ignore */\n }\n\n // 2. check if the plugin is defined in iobroker.json\n return !!(iobrokerJson?.plugins && pluginName in iobrokerJson.plugins);\n}\n\n/**\n * Checks if a plugin exists and can be configured\n *\n * @param pluginName name of the plugin, e.g. `sentry`\n * @param adapter If defined, the adapter configuration will be searched for defined plugins instead of js-controller\n * @param systemConfig The system.config object\n * @param iobrokerJson The contents of iobroker.json\n */\nfunction pluginEnabled(\n pluginName: string,\n adapter?: string,\n systemConfig?: ioBroker.SystemConfigObject | null,\n iobrokerJson?: ioBroker.IoBrokerJson,\n): boolean {\n // 1. check if diagnostics are disabled in ioBroker\n if (systemConfig?.common?.diag === 'none') {\n return false;\n }\n\n // 2. check if the plugin is disabled in io-package.json\n try {\n const ioPackPath = adapter ? path.join(tools.getAdapterDir(adapter)!, 'io-package.json') : controllerIoPackPath;\n const ioPack = fs.readJSONSync(ioPackPath, { encoding: 'utf8' });\n if (\n ioPack?.common?.plugins &&\n pluginName in ioPack.common.plugins &&\n ioPack.common.plugins[pluginName].enabled === false\n ) {\n return false;\n }\n } catch {\n /* ignore */\n }\n\n // 3. check if the plugin is disabled in iobroker.json\n if (\n iobrokerJson?.plugins &&\n pluginName in iobrokerJson.plugins &&\n iobrokerJson.plugins[pluginName].enabled === false\n ) {\n return false;\n }\n\n // default: enabled\n return true;\n}\n", "export const __import_meta_url =\n typeof document === 'undefined' ? new (require('url'.replace('', '')).URL)('file:' + __filename).href :\n (document.currentScript && document.currentScript.src || new URL('main.js', document.baseURI).href)\n"],
5
+ "mappings": "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",
6
6
  "names": ["require", "path", "fs"]
7
7
  }
@@ -1,29 +1,25 @@
1
1
  import { CLICommand } from '../../lib/cli/cliCommand.js';
2
2
  import type { CLICommandOptions } from '../../lib/cli/cliCommand.js';
3
- /** Command ioBroker process control (start/stop/restart/status) ... */
4
3
  export declare class CLIProcess extends CLICommand {
5
- /**
6
- * @param options The command options including context and parameters
7
- */
8
4
  constructor(options: CLICommandOptions);
9
5
  /**
10
6
  * Starts one or more adapters or the js-controller
11
7
  *
12
8
  * @param args parsed cli arguments
13
9
  */
14
- start(args: string[]): Promise<void>;
10
+ start(args: any[]): Promise<void>;
15
11
  /**
16
12
  * Restarts one or more instances or the js-controller
17
13
  *
18
14
  * @param args parsed cli arguments
19
15
  */
20
- restart(args: string[]): Promise<void>;
16
+ restart(args: any[]): Promise<void>;
21
17
  /**
22
18
  * Stops one or more adapters or the js-controller
23
19
  *
24
20
  * @param args parsed cli arguments
25
21
  */
26
- stop(args: string[]): Promise<void>;
22
+ stop(args: any[]): Promise<void>;
27
23
  /**
28
24
  * Starts or stops all adapters
29
25
  *
@@ -62,6 +58,6 @@ export declare class CLIProcess extends CLICommand {
62
58
  *
63
59
  * @param args parsed cli arguments
64
60
  */
65
- status(args: string[]): void;
61
+ status(args: any[]): void;
66
62
  }
67
63
  //# sourceMappingURL=cliProcess.d.ts.map
@@ -5,7 +5,6 @@ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
5
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
6
  var __getProtoOf = Object.getPrototypeOf;
7
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
8
- var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
9
8
  var __export = (target, all) => {
10
9
  for (var name in all)
11
10
  __defProp(target, name, { get: all[name], enumerable: true });
@@ -39,19 +38,14 @@ var import_node_child_process = require("node:child_process");
39
38
  var import_deep_clone = __toESM(require("deep-clone"), 1);
40
39
  var import_promises = require("node:timers/promises");
41
40
  var import_js_controller_common = require("@iobroker/js-controller-common");
41
+ var import_js_controller_common2 = require("@iobroker/js-controller-common");
42
42
  var CLI = __toESM(require("../../lib/cli/messages.js"), 1);
43
43
  var import_cliCommand = require("../../lib/cli/cliCommand.js");
44
44
  var import_cliTools = require("../../lib/cli/cliTools.js");
45
45
  const TRY_KILL_WAIT_MS = 5e3;
46
- const rootDir = import_js_controller_common.tools.getControllerDir();
46
+ const rootDir = import_js_controller_common2.tools.getControllerDir();
47
47
  const killAllScriptPath = import_node_path.default.join(rootDir, "killall.sh");
48
48
  class CLIProcess extends import_cliCommand.CLICommand {
49
- static {
50
- __name(this, "CLIProcess");
51
- }
52
- /**
53
- * @param options The command options including context and parameters
54
- */
55
49
  constructor(options) {
56
50
  super(options);
57
51
  }
@@ -150,7 +144,7 @@ class CLIProcess extends import_cliCommand.CLICommand {
150
144
  const adapterInstances = await (0, import_cliTools.enumInstances)(objects, adapter);
151
145
  if (adapterInstances.length === 0) {
152
146
  CLI.error.noInstancesFound(adapter);
153
- return void callback(import_js_controller_common.EXIT_CODES.UNKNOWN_ERROR);
147
+ return void callback(import_js_controller_common2.EXIT_CODES.UNKNOWN_ERROR);
154
148
  }
155
149
  for (const instance of adapterInstances) {
156
150
  await setInstanceEnabled(objects, instance, enabled, restartIfRunning);
@@ -158,7 +152,7 @@ class CLIProcess extends import_cliCommand.CLICommand {
158
152
  return void callback();
159
153
  } catch (e) {
160
154
  CLI.error.unknown(e.message);
161
- return void callback(import_js_controller_common.EXIT_CODES.UNKNOWN_ERROR);
155
+ return void callback(import_js_controller_common2.EXIT_CODES.UNKNOWN_ERROR);
162
156
  }
163
157
  });
164
158
  }
@@ -183,7 +177,7 @@ class CLIProcess extends import_cliCommand.CLICommand {
183
177
  return void callback();
184
178
  } catch (e) {
185
179
  CLI.error.unknown(e.message);
186
- return void callback(import_js_controller_common.EXIT_CODES.UNKNOWN_ERROR);
180
+ return void callback(import_js_controller_common2.EXIT_CODES.UNKNOWN_ERROR);
187
181
  }
188
182
  });
189
183
  }
@@ -193,18 +187,18 @@ class CLIProcess extends import_cliCommand.CLICommand {
193
187
  async startJSController() {
194
188
  let memoryLimitMB = 0;
195
189
  try {
196
- const config = import_fs_extra.default.readJSONSync(import_js_controller_common.tools.getConfigFileName(), { encoding: "utf-8" });
190
+ const config = import_fs_extra.default.readJSONSync(import_js_controller_common2.tools.getConfigFileName(), { encoding: "utf-8" });
197
191
  if (config?.system?.memoryLimitMB) {
198
192
  memoryLimitMB = Math.round(config.system.memoryLimitMB);
199
193
  }
200
194
  } catch {
201
195
  console.warn("Cannot read memoryLimitMB");
202
196
  console.warn(`May be config file does not exist.
203
- Please call "${import_js_controller_common.tools.appName} setup first" to initialize the settings.`);
197
+ Please call "${import_js_controller_common2.tools.appName} setup first" to initialize the settings.`);
204
198
  }
205
199
  let pid;
206
200
  try {
207
- pid = await import_js_controller_common.tools.getControllerPid();
201
+ pid = await import_js_controller_common2.tools.getControllerPid();
208
202
  } catch (e) {
209
203
  console.error(`Could not read pid file: ${e.message}`);
210
204
  }
@@ -231,7 +225,7 @@ Please call "${import_js_controller_common.tools.appName} setup first" to initia
231
225
  static async stopJSController() {
232
226
  let pid;
233
227
  try {
234
- pid = await import_js_controller_common.tools.getControllerPid();
228
+ pid = await import_js_controller_common2.tools.getControllerPid();
235
229
  } catch (e) {
236
230
  console.error(`Could not read pid file: ${e.message}`);
237
231
  }
@@ -256,7 +250,7 @@ Please call "${import_js_controller_common.tools.appName} setup first" to initia
256
250
  console.log('No "killall.sh" script found. Just stop.');
257
251
  }
258
252
  try {
259
- import_fs_extra.default.unlinkSync(import_js_controller_common.tools.getPidsFileName());
253
+ import_fs_extra.default.unlinkSync(import_js_controller_common2.tools.getPidsFileName());
260
254
  } catch {
261
255
  }
262
256
  }
@@ -277,7 +271,7 @@ Please call "${import_js_controller_common.tools.appName} setup first" to initia
277
271
  dbConnect(async (params) => {
278
272
  const { objects, states, config, isOffline } = params;
279
273
  if (!adapterName || showEntireConfig) {
280
- const hostAlive = await states.getState(`system.host.${import_js_controller_common.tools.getHostName()}.alive`);
274
+ const hostAlive = await states.getState(`system.host.${import_js_controller_common2.tools.getHostName()}.alive`);
281
275
  const alive = hostAlive ? hostAlive.val : false;
282
276
  CLI.success.controllerStatus(alive);
283
277
  console.log();
@@ -295,7 +289,7 @@ Please call "${import_js_controller_common.tools.appName} setup first" to initia
295
289
  console.log(`Objects type: ${config.objects.type}`);
296
290
  console.log(`States type: ${config.states.type}`);
297
291
  }
298
- return void callback(isOffline ? import_js_controller_common.EXIT_CODES.CONTROLLER_NOT_RUNNING : void 0);
292
+ return void callback(isOffline ? import_js_controller_common2.EXIT_CODES.CONTROLLER_NOT_RUNNING : void 0);
299
293
  }
300
294
  if (/\.\d+$/.test(adapterName)) {
301
295
  await showInstanceStatus(states, adapterName);
@@ -304,10 +298,10 @@ Please call "${import_js_controller_common.tools.appName} setup first" to initia
304
298
  const adapterInstances = await (0, import_cliTools.enumInstances)(objects, adapterName);
305
299
  if (adapterInstances.length > 1) {
306
300
  CLI.error.specifyInstance(adapterName, adapterInstances.map((obj) => obj._id.substring("system.adapter.".length)));
307
- return void callback(import_js_controller_common.EXIT_CODES.INVALID_ADAPTER_ID);
301
+ return void callback(import_js_controller_common2.EXIT_CODES.INVALID_ADAPTER_ID);
308
302
  } else if (adapterInstances.length === 0) {
309
303
  CLI.error.noInstancesFound(adapterName);
310
- return void callback(import_js_controller_common.EXIT_CODES.UNKNOWN_ERROR);
304
+ return void callback(import_js_controller_common2.EXIT_CODES.UNKNOWN_ERROR);
311
305
  }
312
306
  const instanceId = adapterInstances[0]._id.split(".").pop();
313
307
  await showInstanceStatus(states, `${adapterName}.${instanceId}`);
@@ -323,7 +317,6 @@ async function showAllInstancesStatus(states, objects) {
323
317
  }
324
318
  return Promise.resolve();
325
319
  }
326
- __name(showAllInstancesStatus, "showAllInstancesStatus");
327
320
  async function showInstanceStatus(states, adapterInstance) {
328
321
  const state = await states.getState(`system.adapter.${adapterInstance}.alive`);
329
322
  if (state?.val === true) {
@@ -332,12 +325,11 @@ async function showInstanceStatus(states, adapterInstance) {
332
325
  console.log(`Instance "${adapterInstance}" is not running`);
333
326
  }
334
327
  }
335
- __name(showInstanceStatus, "showInstanceStatus");
336
328
  function showConfig(config, root) {
337
- if (!import_js_controller_common.tools.isObject(config)) {
329
+ if (!import_js_controller_common2.tools.isObject(config)) {
338
330
  return;
339
331
  }
340
- root ||= [];
332
+ root = root || [];
341
333
  const prefix = root.join("/").toUpperCase();
342
334
  for (const attr of Object.keys(config)) {
343
335
  if (attr.match(/comment$/i)) {
@@ -352,7 +344,6 @@ function showConfig(config, root) {
352
344
  }
353
345
  }
354
346
  }
355
- __name(showConfig, "showConfig");
356
347
  async function setInstanceEnabled(objects, instanceObj, enabled, force) {
357
348
  if (!force && instanceObj.common.enabled === enabled) {
358
349
  return;
@@ -368,7 +359,6 @@ async function setInstanceEnabled(objects, instanceObj, enabled, force) {
368
359
  CLI.success.adapterStopped(instanceName);
369
360
  }
370
361
  }
371
- __name(setInstanceEnabled, "setInstanceEnabled");
372
362
  async function tryKill(pid) {
373
363
  try {
374
364
  process.kill(pid, "SIGTERM");
@@ -377,7 +367,6 @@ async function tryKill(pid) {
377
367
  }
378
368
  await (0, import_promises.setTimeout)(TRY_KILL_WAIT_MS);
379
369
  }
380
- __name(tryKill, "tryKill");
381
370
  // Annotate the CommonJS export names for ESM import in node:
382
371
  0 && (module.exports = {
383
372
  CLIProcess