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

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 +24 -42
  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 +21 -38
  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/setup/setupUpload.ts"],
4
- "sourcesContent": ["/**\n * Upload adapter files into DB\n *\n * Copyright 2013-2024 bluefox <dogafox@gmail.com>\n *\n * MIT License\n *\n */\n\nimport fs from 'fs-extra';\nimport { tools } from '@iobroker/js-controller-common';\nimport deepClone from 'deep-clone';\nimport { isDeepStrictEqual } from 'node:util';\nimport axios from 'axios';\nimport mime from 'mime-types';\nimport { join } from 'node:path';\nimport type { Client as StatesRedisClient } from '@iobroker/db-states-redis';\nimport type { Client as ObjectsRedisClient } from '@iobroker/db-objects-redis';\nimport type { InternalLogger } from '@iobroker/js-controller-common-db/tools';\n\nconst hostname = tools.getHostName();\n\n/** Options for the upload command */\nexport interface CLIUploadOptions {\n /** The states database client */\n states: StatesRedisClient;\n /** The objects database client */\n objects: ObjectsRedisClient;\n}\n\ninterface File {\n adapter: string;\n path: string;\n}\n\ninterface Logger extends InternalLogger {\n log(message: string): void;\n}\n\n/** Logger without noisy levels */\ntype MinimalLogger = Omit<Logger, 'info' | 'silly' | 'debug'>;\n\n/**\n * CLI command to upload adapter files into the objects database\n */\nexport class Upload {\n private readonly states: StatesRedisClient;\n private readonly objects: ObjectsRedisClient;\n private readonly regApp = new RegExp(`/${tools.appName.replace(/\\./g, '\\\\.')}\\\\.`, 'i');\n private callbackId = 1;\n private readonly sendToHostFromCliAsync: (...args: any[]) => Promise<any>;\n private callbacks: Record<string, any> = {};\n private lastProgressUpdate = Date.now();\n\n /**\n * @param _options The states and objects database clients\n */\n constructor(_options: CLIUploadOptions) {\n const options = _options || {};\n\n if (!options.states) {\n throw new Error('Invalid arguments: states is missing');\n }\n if (!options.objects) {\n throw new Error('Invalid arguments: objects is missing');\n }\n\n this.states = options.states;\n this.objects = options.objects;\n this.sendToHostFromCliAsync = tools.promisifyNoError(this.sendToHostFromCli);\n }\n\n /**\n * Filter the given hosts to those that are currently alive\n *\n * @param hosts The hosts to check\n */\n async checkHostsIfAlive(hosts: string[]): Promise<string[]> {\n const result = [];\n if (hosts) {\n for (const host of hosts) {\n const state = await this.states.getStateAsync(`${host}.alive`);\n if (state?.val) {\n result.push(host);\n }\n }\n }\n return result;\n }\n\n /**\n * Get the list of known hosts\n *\n * @param onlyAlive Whether to only return hosts that are currently alive\n */\n async getHosts(onlyAlive: boolean): Promise<string[]> {\n const hosts = [];\n try {\n const arr = await this.objects.getObjectListAsync({\n startkey: 'system.host.',\n endkey: 'system.host.\\u9999',\n });\n if (arr?.rows) {\n for (const row of arr.rows) {\n if (row.value.type !== 'host') {\n continue;\n }\n hosts.push(row.value._id);\n }\n }\n } catch (e) {\n // ignore\n console.warn(`Cannot read hosts: ${e.message}`);\n }\n\n if (onlyAlive) {\n return this.checkHostsIfAlive(hosts);\n }\n return hosts;\n }\n\n /**\n * Check if some adapters must be restarted because of the given adapter's files and restart them\n *\n * @param adapter The adapter whose dependents should be restarted\n */\n async checkRestartOther(adapter: string): Promise<void> {\n const adapterDir = tools.getAdapterDir(adapter);\n\n if (!adapterDir) {\n console.error(`Adapter directory of adapter \"${adapter}\" not found`);\n return;\n }\n\n try {\n const adapterConf = await fs.readJSON(join(adapterDir, 'io-package.json'));\n if (adapterConf.common.restartAdapters) {\n if (!Array.isArray(adapterConf.common.restartAdapters)) {\n // it's not an array, now it can only be a single adapter as string\n if (typeof adapterConf.common.restartAdapters !== 'string') {\n return;\n }\n adapterConf.common.restartAdapters = [adapterConf.common.restartAdapters];\n }\n\n if (adapterConf.common.restartAdapters.length && adapterConf.common.restartAdapters[0]) {\n const instances = await tools.getAllInstances(adapterConf.common.restartAdapters, this.objects);\n if (instances?.length) {\n for (const instance of instances) {\n try {\n const obj = await this.objects.getObjectAsync(instance);\n // if instance is enabled\n if (obj?.common?.enabled) {\n obj.common.enabled = false; // disable instance\n\n obj.from = `system.host.${tools.getHostName()}.cli`;\n obj.ts = Date.now();\n\n await this.objects.setObjectAsync(obj._id, obj);\n\n obj.common.enabled = true; // enable instance\n obj.ts = Date.now();\n\n await this.objects.setObjectAsync(obj._id, obj);\n console.log(`Adapter \"${obj._id}\" restarted.`);\n }\n } catch (e) {\n console.error(`Cannot restart adapter \"${instance}\": ${e.message}`);\n }\n }\n }\n }\n }\n } catch (e) {\n console.error(`Cannot parse ${adapterDir}/io-package.json: ${e.message}`);\n }\n }\n\n /**\n * Send a message to a host from the CLI\n *\n * @param host The target host id\n * @param command The command to send\n * @param message The message payload\n * @param callback Called with the host's response\n */\n sendToHostFromCli(\n host: string,\n command: string,\n message: ioBroker.MessagePayload,\n callback: ioBroker.MessageCallback | null,\n ): void {\n const time = Date.now();\n const from = `system.host.${hostname}_cli_${time}`;\n\n const timeout = setTimeout(() => {\n if (callback) {\n callback();\n }\n callback = null;\n this.states.unsubscribeMessage(from).catch(e => console.error(`Cannot unsubscribe: ${e.message}`));\n // @ts-expect-error todo: I don't think this works\n this.states.onChange = null;\n }, 60_000);\n\n // @ts-expect-error todo: I don't think this works\n this.states.onChange = (id, msg) => {\n if (id.endsWith(from)) {\n if (msg.command === 'log' || msg.command === 'error' || msg.command === 'warn') {\n // @ts-expect-error\n console[msg.command](`${host} -> ${msg.text}`);\n } else if (callback) {\n callback(msg && msg.message);\n callback = null;\n clearTimeout(timeout);\n this.states.unsubscribeMessage(from).catch(e => console.error(`Cannot unsubscribe: ${e.message}`));\n // @ts-expect-error\n this.states.onChange = null;\n }\n }\n };\n\n this.states.subscribeMessage(from, () => {\n const obj = {\n command,\n message: message,\n from: `system.host.${hostname}_cli_${time}`,\n callback: {\n message,\n id: this.callbackId++,\n ack: false,\n time,\n },\n } as const;\n\n if (this.callbackId > 0xffffffff) {\n this.callbackId = 1;\n }\n\n this.callbacks[`_${obj.callback.id}`] = { cb: callback };\n\n // we cannot receive answers from hosts in CLI, so this command is \"fire and forget\"\n this.states.pushMessage(host, obj).catch(e => console.error(`Cannot push message: ${e.message}`));\n });\n }\n\n /**\n * Upload the files of all given adapters from every host\n *\n * @param adapters The adapters to upload\n */\n async uploadAdapterFullAsync(adapters: string[]): Promise<void> {\n if (adapters?.length) {\n const liveHosts = await this.getHosts(true);\n for (const adapter of adapters) {\n // Find the host which has this adapter\n const instances = await tools.getInstances(adapter, this.objects, true);\n // try to find instance on this host\n let instance = instances.find(obj => obj?.common?.host === hostname);\n\n // try to find enabled instance on live host\n instance =\n instance || instances.find(obj => obj?.common?.enabled && liveHosts.includes(obj.common.host));\n\n // try to find any instance\n instance = instance || instances.find(obj => obj?.common && liveHosts.includes(obj.common.host));\n\n if (instance && instance.common.host !== hostname) {\n console.log(`Send upload command to host \"${instance.common.host}\"... `);\n // send upload message to the host\n const response = await this.sendToHostFromCliAsync(instance.common.host, 'upload', adapter);\n if (response) {\n console.log(`Upload result: ${response.result}`);\n } else {\n console.error(`No answer from ${instance.common.host}`);\n }\n } else {\n if (!instance) {\n // no one alive instance found\n const adapterDir = tools.getAdapterDir(adapter);\n if (!adapterDir || !fs.existsSync(adapterDir)) {\n console.warn(\n `No alive host found which has the adapter ${adapter} installed! No upload possible. Skipped.`,\n );\n continue;\n }\n }\n\n // try to upload on this host. It will print an error if the adapter directory not found\n await this.uploadAdapter(adapter, true, true);\n await this.upgradeAdapterObjects(adapter);\n await this.uploadAdapter(adapter, false, true);\n }\n }\n }\n }\n\n /**\n * Uploads a file\n *\n * @param source source path\n * @param target target path\n */\n async uploadFile(source: string, target: string): Promise<string> {\n target = target.replace(/\\\\/g, '/');\n source = source.replace(/\\\\/g, '/');\n if (target[0] === '/') {\n target = target.substring(1);\n }\n if (target[target.length - 1] === '/') {\n let name = source.split('/').pop()!;\n name = name.split('?')[0];\n if (!name.includes('.')) {\n name = 'index.html';\n }\n target += name;\n }\n const parts = target.split('/');\n const adapter = parts[0];\n parts.splice(0, 1);\n target = parts.join('/');\n\n if (source.match(/^http:\\/\\/|^https:\\/\\//)) {\n try {\n const result = await axios(source, {\n responseType: 'arraybuffer',\n validateStatus: status => status === 200,\n });\n if (result?.data) {\n await this.objects.writeFileAsync(adapter, target, result.data);\n } else {\n console.error(`Empty response from URL \"${source}\"`);\n throw new Error(`Empty response from URL \"${source}\"`);\n }\n } catch (e) {\n let result;\n if (e.response) {\n // The request was made and the server responded with a status code\n // that falls out of the range of 2xx\n result = e.response.data || e.response.status;\n } else if (e.request) {\n // The request was made but no response was received\n // `err.request` is an instance of XMLHttpRequest in the browser and an instance of\n // http.ClientRequest in node.js\n result = e.request;\n } else {\n // Something happened in setting up the request that triggered an Error\n result = e.message;\n }\n console.error(`Cannot get URL \"${source}\": ${result}`);\n throw new Error(result);\n }\n } else {\n try {\n await this.objects.writeFileAsync(adapter, target, fs.readFileSync(source));\n } catch (e) {\n console.error(`Cannot read file \"${source}\": ${e.message}`);\n throw e;\n }\n }\n\n return `${adapter}/${target}`;\n }\n\n /**\n * Delete the given files from the objects database\n *\n * @param files The files to delete\n * @param logger Logger used to report errors\n */\n async eraseFiles(files: File[], logger: MinimalLogger | typeof console): Promise<void> {\n if (files?.length) {\n for (const file of files) {\n try {\n await this.objects.unlinkAsync(file.adapter, file.path);\n } catch (e) {\n logger.error(`Cannot delete file \"${file.path}\": ${e}`);\n }\n }\n }\n }\n\n /**\n * Collect Files of an adapter specific directory from the ioBroker storage\n *\n * @param adapter Adapter name\n * @param path path in the adapter specific storage space\n * @param logger Logger instance\n */\n async collectExistingFilesToDelete(\n adapter: string,\n path: string,\n logger: MinimalLogger | typeof console,\n ): Promise<{\n filesToDelete: File[];\n dirs: File[];\n }> {\n let _files: File[] = [];\n let _dirs: File[] = [];\n let files: ioBroker.ReadDirResult[];\n try {\n files = await this.objects.readDirAsync(adapter, path);\n } catch {\n // ignore err\n files = [];\n }\n\n if (files?.length) {\n for (const file of files) {\n if (file.file === '.' || file.file === '..') {\n continue;\n }\n const newPath = path + file.file;\n if (file.isDir) {\n if (!_dirs.find(e => e.path === newPath)) {\n _dirs.push({ adapter, path: newPath });\n }\n try {\n const result = await this.collectExistingFilesToDelete(adapter, `${newPath}/`, logger);\n if (result.filesToDelete) {\n _files = _files.concat(result.filesToDelete);\n }\n\n _dirs = _dirs.concat(result.dirs);\n } catch (e) {\n logger.warn(`Cannot delete folder \"${adapter}${newPath}/\": ${e.message}`);\n }\n } else if (!_files.find(e => e.path === newPath)) {\n _files.push({ adapter, path: newPath });\n }\n }\n }\n\n return { filesToDelete: _files, dirs: _dirs };\n }\n\n /**\n * Upload the files of a single adapter into the objects database\n *\n * @param adapter The adapter whose files are uploaded\n * @param isAdmin Whether the admin files should be uploaded\n * @param files The files to upload\n * @param id The upload state id used to report progress\n * @param logger Logger used to report progress\n */\n async upload(\n adapter: string,\n isAdmin: boolean,\n files: string[],\n id: string,\n logger: MinimalLogger | typeof console,\n ): Promise<string> {\n const uploadID = `system.adapter.${adapter}.upload`;\n\n await this.states.setState(uploadID, { val: 0, ack: true });\n\n for (let f = 0; f < files.length; f++) {\n const file = files[f];\n // do not upload '.gitignore' files. Todo: add other exceptions\n if (file === '.gitignore') {\n continue;\n }\n\n const mimeType = mime.lookup(file);\n let attNameArr = file.split(this.regApp);\n // try to find anyway if adapter is not lower case\n if (attNameArr.length === 1 && file.toLowerCase().includes(tools.appName.toLowerCase())) {\n attNameArr = ['', file.substring(tools.appName.length + 2)];\n }\n\n let attName = attNameArr.pop()!;\n attName = attName.split('/').slice(2).join('/');\n\n const remainingFiles = files.length - f - 1;\n\n if (remainingFiles >= 100) {\n (!f || !(remainingFiles % 50)) &&\n logger.log(`upload [${remainingFiles}] ${id} ${file} ${attName} ${mimeType}`);\n } else if (remainingFiles > 20) {\n if (!f || !(remainingFiles % 10)) {\n logger.log(`upload [${remainingFiles}] ${id} ${file} ${attName} ${mimeType}`);\n }\n } else {\n logger.log(`upload [${remainingFiles}] ${id} ${file} ${attName} ${mimeType}`);\n }\n\n // Update upload indicator\n if (!isAdmin) {\n const now = Date.now();\n if (now - this.lastProgressUpdate > 1_000) {\n this.lastProgressUpdate = now;\n await this.states.setState(uploadID, {\n val: Math.round((1_000 * (files.length - f)) / files.length) / 10,\n ack: true,\n });\n }\n }\n\n try {\n const content = await fs.readFile(file);\n await this.objects.writeFileAsync(id, attName, content, { mimeType: mimeType || undefined });\n } catch (e) {\n console.error(`Error: Cannot upload ${file}: ${e.message}`);\n }\n }\n\n // Set upload progress to 0;\n if (!isAdmin && files.length) {\n await this.states.setState(uploadID, { val: 0, ack: true });\n }\n\n return adapter;\n }\n\n // Read synchronous all files recursively from local directory\n /**\n * Recursively collect all file paths below the given directory\n *\n * @param dir The directory to walk\n * @param _results Accumulator of results collected so far\n */\n walk(dir: string, _results?: string[]): string[] {\n const results = _results || [];\n try {\n if (fs.existsSync(dir)) {\n const list = fs.readdirSync(dir);\n list.map(file => {\n const stat = fs.statSync(`${dir}/${file}`);\n if (stat.isDirectory()) {\n this.walk(`${dir}/${file}`, results);\n } else {\n if (!file.endsWith('.npmignore') && !file.endsWith('.gitignore')) {\n results.push(`${dir}/${file}`);\n }\n }\n });\n }\n } catch (e) {\n console.error(e);\n }\n\n return results;\n }\n\n /**\n * Upload given adapter\n *\n * @param adapter adapter name\n * @param isAdmin if admin folder should be uploaded too\n * @param forceUpload if upload should be forced\n * @param subTree subtree path to upload\n * @param _logger logger instance\n */\n async uploadAdapter(\n adapter: string,\n isAdmin: boolean,\n forceUpload: boolean,\n subTree?: string,\n _logger?: MinimalLogger,\n ): Promise<string> {\n const id = adapter + (isAdmin ? '.admin' : '');\n const adapterDir = tools.getAdapterDir(adapter);\n let dir = adapterDir ? adapterDir + (isAdmin ? '/admin' : '/www') : '';\n\n const logger = _logger || console;\n\n if (subTree && dir) {\n dir += `/${subTree}`;\n }\n if (adapterDir === null || !fs.existsSync(adapterDir)) {\n console.log(\n `INFO: Directory \"${\n adapterDir || `for ${adapter}${isAdmin ? '.admin' : ''}`\n }\" does not exist. Nothing was uploaded or deleted.`,\n );\n return adapter;\n }\n\n let cfg;\n try {\n cfg = await fs.readJSON(`${adapterDir}/io-package.json`);\n } catch (e) {\n // file not parsable or does not exist\n console.error(`Could not read io-package.json: ${e.message}`);\n }\n\n if (!fs.existsSync(dir)) {\n // www folder have not all adapters. So show warning only for admin folder\n // widgets do not have www folder, but they have onlyWWW flag\n (isAdmin || (cfg?.common?.onlyWWW && !cfg.common.visWidgets)) &&\n console.log(\n `INFO: Directory \"${\n dir || `for ${adapter}${isAdmin ? '.admin' : ''}`\n }\" was not found! Nothing was uploaded or deleted.`,\n );\n\n if (isAdmin) {\n return adapter;\n }\n await this.checkRestartOther(adapter);\n return adapter;\n }\n\n // check for common.wwwDontUpload (required for legacy adapters and admin)\n if (!isAdmin && cfg?.common?.wwwDontUpload) {\n return adapter;\n }\n\n // Create \"upload progress\" object if not exists\n if (!isAdmin) {\n let obj;\n const uploadID = `system.adapter.${adapter}.upload`;\n try {\n obj = await this.objects.getObject(uploadID);\n } catch {\n // ignore\n }\n if (!obj) {\n await this.objects.setObject(uploadID, {\n _id: uploadID,\n type: 'state',\n common: {\n name: `${adapter}.upload`,\n type: 'number',\n role: 'indicator.state',\n unit: '%',\n min: 0,\n max: 100,\n def: 0,\n desc: 'Upload process indicator',\n read: true,\n write: false,\n },\n from: `system.host.${tools.getHostName()}.cli`,\n ts: Date.now(),\n native: {},\n });\n }\n // Set indicator to 0\n await this.states.setState(uploadID, { val: 0, ack: true });\n }\n\n let result;\n try {\n result = await this.objects.getObjectAsync(id);\n } catch {\n // ignore\n }\n // Read all names with subtrees from local directory\n const files = this.walk(dir);\n if (!result) {\n // @ts-expect-error types needed admin is not allowed for meta, but it should be allowed\n await this.objects.setObjectAsync(id, {\n type: 'meta',\n common: {\n name: id.split('.').pop()!,\n type: isAdmin ? 'admin' : 'www',\n },\n from: `system.host.${tools.getHostName()}.cli`,\n ts: Date.now(),\n native: {},\n });\n forceUpload = true;\n }\n\n if (forceUpload) {\n // only skip if explicitly opted out\n // The visualization check is needed as user of legacy systems often stored files inside adapter directories like `vis`\n // in the long term, such adapters should explicitly opt out, so we can hopefully remove this line in 2-3 versions (current 5.0)\n if (\n cfg?.common?.eraseOnUpload !== false &&\n !(cfg?.common?.eraseOnUpload === undefined && cfg?.common?.type === 'visualization')\n ) {\n const { filesToDelete } = await this.collectExistingFilesToDelete(\n isAdmin ? `${adapter}.admin` : adapter,\n '/',\n logger,\n );\n // delete old files, before upload of new\n await this.eraseFiles(filesToDelete, logger);\n }\n if (!isAdmin) {\n await this.checkRestartOther(adapter);\n await new Promise<void>(resolve => setTimeout(() => resolve(), 25));\n await this.upload(adapter, isAdmin, files, id, logger);\n } else {\n await this.upload(adapter, isAdmin, files, id, logger);\n }\n }\n return adapter;\n }\n\n /**\n * Deep-merge additional values into the native section of an object\n *\n * @param target The target object to extend\n * @param additional The additional values to merge in\n */\n extendNative(target: Record<string, any>, additional: Record<string, unknown>): Record<string, any> {\n if (tools.isObject(additional)) {\n for (const [attr, attrData] of Object.entries(additional)) {\n if (target[attr] === undefined) {\n target[attr] = attrData;\n } else if (tools.isObject(attrData)) {\n try {\n target[attr] = target[attr] || {};\n } catch {\n console.warn(`Cannot update attribute ${attr} of native`);\n }\n if (typeof target[attr] === 'object' && target[attr] !== null) {\n this.extendNative(target[attr], attrData);\n }\n }\n }\n }\n return target;\n }\n\n /**\n * Merge additional values into the common section of an instance object, preserving some attributes\n *\n * @param target The target common object to extend\n * @param additional The additional values to merge in\n * @param instance The instance id the common belongs to\n */\n extendCommon(\n target: Record<string, any>,\n additional: Record<string, any>,\n instance: string,\n ): ioBroker.InstanceCommon {\n if (tools.isObject(additional)) {\n const preserveAttributes = [\n 'title',\n 'schedule',\n 'restartSchedule',\n 'mode',\n 'loglevel',\n 'enabled',\n 'custom',\n 'tier',\n ];\n\n // Object attributes that should be completely replaced, not merged\n const replaceAttributes = ['adminUI', 'adminTab', 'adminColumns'];\n\n for (const [attr, attrData] of Object.entries(additional)) {\n // preserve these attributes, except, they were undefined before and preserve titleLang if current titleLang is of type string (changed by user)\n if (preserveAttributes.includes(attr) || (attr === 'titleLang' && typeof target[attr] === 'string')) {\n if (target[attr] === undefined) {\n target[attr] = attrData;\n }\n } else if (\n typeof attrData !== 'object' ||\n attrData instanceof Array ||\n replaceAttributes.includes(attr)\n ) {\n try {\n target[attr] = attrData;\n\n // dataFolder can have wildcards\n if (attr === 'dataFolder' && target.dataFolder && target.dataFolder.includes('%INSTANCE%')) {\n target.dataFolder = target.dataFolder.replace(/%INSTANCE%/g, instance);\n }\n } catch {\n console.warn(`Cannot update attribute ${attr} of common`);\n }\n } else {\n target[attr] = target[attr] || {};\n if (typeof target[attr] !== 'object') {\n target[attr] = {}; // here we clean the simple value with object\n }\n\n this.extendCommon(target[attr], attrData, instance);\n }\n }\n }\n return target as ioBroker.InstanceCommon;\n }\n\n /**\n * Extends the `system.instance.adapter.<instanceNumber>` objects with the native properties from adapters io-package.json\n *\n * @param name name of the adapter\n * @param ioPack parsed io-package content\n * @param hostname name of the host where the adapter is installed on\n * @param logger instance of logger\n */\n async _upgradeAdapterObjectsHelper(\n name: string,\n ioPack: ioBroker.AdapterObject,\n hostname: string,\n logger: MinimalLogger | typeof console,\n ): Promise<string> {\n // Update all instances of this host\n const res = await this.objects.getObjectViewAsync('system', 'instance', {\n startkey: `system.adapter.${name}.`,\n endkey: `system.adapter.${name}.\\u9999`,\n });\n\n if (res) {\n for (const row of res.rows) {\n if (row.value?.common.host === hostname) {\n const _obj = await this.objects.getObject(row.id);\n const newObject = deepClone(_obj) as ioBroker.InstanceObject;\n\n // TODO: refactor the following assignments into a method, where we can define which attributes need a real override and their defaults\n\n // all common settings should be taken from new one\n newObject.common = this.extendCommon(\n newObject.common,\n ioPack.common,\n newObject._id.split('.').pop()!,\n );\n newObject.native = this.extendNative(newObject.native, ioPack.native);\n\n // protected/encryptedNative and notifications also need to be updated\n newObject.protectedNative = ioPack.protectedNative || [];\n newObject.encryptedNative = ioPack.encryptedNative || [];\n newObject.notifications = ioPack.notifications || [];\n // update instanceObjects and objects\n newObject.instanceObjects = ioPack.instanceObjects || [];\n newObject.objects = ioPack.objects || [];\n\n newObject.common.version = ioPack.common.version;\n newObject.common.installedVersion = ioPack.common.version;\n newObject.common.installedFrom = ioPack.common.installedFrom;\n\n // do not merge visWidgets and localLinks\n if (ioPack.common.visWidgets) {\n newObject.common.visWidgets = ioPack.common.visWidgets;\n } else {\n delete newObject.common.visWidgets;\n }\n\n if (ioPack.common.localLinks) {\n newObject.common.localLinks = ioPack.common.localLinks;\n } else {\n delete newObject.common.localLinks;\n }\n\n if (!ioPack.common.compact && newObject.common.compact) {\n newObject.common.compact = ioPack.common.compact;\n }\n\n // Compare objects to reduce restarts of instances\n if (!isDeepStrictEqual(newObject, _obj)) {\n logger.log(`Update \"${newObject._id}\"`);\n\n newObject.from = `system.host.${tools.getHostName()}.cli`;\n newObject.ts = Date.now();\n\n await this.objects.setObjectAsync(newObject._id, newObject);\n }\n }\n }\n }\n\n // updates only \"_design/system\" and co \"_design/*\"\n if (Array.isArray(ioPack.objects)) {\n for (const obj of ioPack.objects) {\n if (name === 'js-controller' && !obj._id.startsWith('_design/')) {\n continue;\n }\n\n obj.from = `system.host.${hostname}.cli`;\n obj.ts = Date.now();\n\n try {\n await this.objects.setObjectAsync(obj._id, obj);\n } catch (e) {\n logger.error(`Cannot update object: ${e}`);\n }\n }\n }\n\n return name;\n }\n\n /**\n * Create object from io-package json\n *\n * @param name adapter name\n * @param ioPack IoPack content\n * @param logger logger instance\n */\n async upgradeAdapterObjects(\n name: string,\n ioPack?: ioBroker.AdapterObject,\n logger: MinimalLogger | typeof console = console,\n ): Promise<string> {\n const adapterDir = tools.getAdapterDir(name);\n let ioPackFile;\n try {\n ioPackFile = fs.readJSONSync(`${adapterDir}/io-package.json`);\n } catch {\n if (adapterDir) {\n logger.error(`Cannot find io-package.json in ${adapterDir}`);\n } else {\n logger.error(`Cannot find io-package.json for \"${name}\"`);\n }\n ioPackFile = null;\n }\n\n ioPack = ioPack || ioPackFile;\n\n if (ioPack) {\n logger.log(\n `Updating objects from io-package.json for adapter \"${name}\" with version \"${ioPack.common.version}\"`,\n );\n // Always update installedFrom from File on disk if exists and set\n if (ioPackFile?.common?.installedFrom) {\n ioPack.common = ioPack.common || {};\n ioPack.common.installedFrom = ioPackFile.common.installedFrom;\n }\n // Not existing? Why ever ... we recreate\n let _obj;\n try {\n _obj = await this.objects.getObject(`system.adapter.${name}`);\n } catch {\n // ignore err\n }\n const obj: Omit<ioBroker.AdapterObject, '_id'> = _obj || {\n common: ioPack.common,\n native: ioPack.native,\n type: 'adapter',\n instanceObjects: [],\n objects: [],\n };\n\n obj.common = ioPack.common || {};\n obj.native = ioPack.native || {};\n // protected/encryptedNative and notifications also need to be updated\n obj.protectedNative = ioPack.protectedNative || [];\n obj.encryptedNative = ioPack.encryptedNative || [];\n obj.notifications = ioPack.notifications || [];\n // update instanceObjects and objects\n obj.instanceObjects = ioPack.instanceObjects || [];\n obj.objects = ioPack.objects || [];\n\n obj.type = 'adapter';\n\n obj.common.installedVersion = ioPack.common.version;\n\n if (obj.common.news) {\n delete obj.common.news; // remove this information as it could be big, but it will be taken from repo\n }\n\n const hostname = tools.getHostName();\n\n obj.from = `system.host.${hostname}.cli`;\n obj.ts = Date.now();\n\n try {\n await this.objects.setObject(`system.adapter.${name}`, obj);\n await this.objects.setObject(`system.host.${hostname}.adapter.${name}`, obj);\n } catch (e) {\n logger.error(\n `Cannot set \"system.adapter.${name}\" and \"system.host.${hostname}.adapters.${name}\": ${e.message}`,\n );\n }\n\n await this._upgradeAdapterObjectsHelper(name, ioPack, hostname, logger);\n }\n\n return name;\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Upload adapter files into DB\n *\n * Copyright 2013-2024 bluefox <dogafox@gmail.com>\n *\n * MIT License\n *\n */\n\nimport fs from 'fs-extra';\nimport { tools } from '@iobroker/js-controller-common';\nimport deepClone from 'deep-clone';\nimport { isDeepStrictEqual } from 'node:util';\nimport axios from 'axios';\nimport mime from 'mime-types';\nimport { join } from 'node:path';\nimport type { Client as StatesRedisClient } from '@iobroker/db-states-redis';\nimport type { Client as ObjectsRedisClient } from '@iobroker/db-objects-redis';\nimport type { InternalLogger } from '@iobroker/js-controller-common-db/tools';\n\nconst hostname = tools.getHostName();\n\nexport interface CLIUploadOptions {\n states: StatesRedisClient;\n objects: ObjectsRedisClient;\n}\n\ninterface File {\n adapter: string;\n path: string;\n}\n\ninterface Logger extends InternalLogger {\n log(message: string): void;\n}\n\n/** Logger without noisy levels */\ntype MinimalLogger = Omit<Logger, 'info' | 'silly' | 'debug'>;\n\nexport class Upload {\n private readonly states: StatesRedisClient;\n private readonly objects: ObjectsRedisClient;\n private readonly regApp = new RegExp(`/${tools.appName.replace(/\\./g, '\\\\.')}\\\\.`, 'i');\n private callbackId = 1;\n private readonly sendToHostFromCliAsync: (...args: any[]) => Promise<any>;\n private callbacks: Record<string, any> = {};\n private lastProgressUpdate = Date.now();\n\n constructor(_options: CLIUploadOptions) {\n const options = _options || {};\n\n if (!options.states) {\n throw new Error('Invalid arguments: states is missing');\n }\n if (!options.objects) {\n throw new Error('Invalid arguments: objects is missing');\n }\n\n this.states = options.states;\n this.objects = options.objects;\n this.sendToHostFromCliAsync = tools.promisifyNoError(this.sendToHostFromCli);\n }\n\n async checkHostsIfAlive(hosts: string[]): Promise<string[]> {\n const result = [];\n if (hosts) {\n for (const host of hosts) {\n const state = await this.states.getStateAsync(`${host}.alive`);\n if (state?.val) {\n result.push(host);\n }\n }\n }\n return result;\n }\n\n async getHosts(onlyAlive: boolean): Promise<string[]> {\n const hosts = [];\n try {\n const arr = await this.objects.getObjectListAsync({\n startkey: 'system.host.',\n endkey: 'system.host.\\u9999',\n });\n if (arr?.rows) {\n for (const row of arr.rows) {\n if (row.value.type !== 'host') {\n continue;\n }\n hosts.push(row.value._id);\n }\n }\n } catch (e) {\n // ignore\n console.warn(`Cannot read hosts: ${e.message}`);\n }\n\n if (onlyAlive) {\n return this.checkHostsIfAlive(hosts);\n }\n return hosts;\n }\n\n // Check if some adapters must be restarted and restart them\n async checkRestartOther(adapter: string): Promise<void> {\n const adapterDir = tools.getAdapterDir(adapter);\n\n if (!adapterDir) {\n console.error(`Adapter directory of adapter \"${adapter}\" not found`);\n return;\n }\n\n try {\n const adapterConf = await fs.readJSON(join(adapterDir, 'io-package.json'));\n if (adapterConf.common.restartAdapters) {\n if (!Array.isArray(adapterConf.common.restartAdapters)) {\n // it's not an array, now it can only be a single adapter as string\n if (typeof adapterConf.common.restartAdapters !== 'string') {\n return;\n }\n adapterConf.common.restartAdapters = [adapterConf.common.restartAdapters];\n }\n\n if (adapterConf.common.restartAdapters.length && adapterConf.common.restartAdapters[0]) {\n const instances = await tools.getAllInstances(adapterConf.common.restartAdapters, this.objects);\n if (instances?.length) {\n for (const instance of instances) {\n try {\n const obj = await this.objects.getObjectAsync(instance);\n // if instance is enabled\n if (obj?.common?.enabled) {\n obj.common.enabled = false; // disable instance\n\n obj.from = `system.host.${tools.getHostName()}.cli`;\n obj.ts = Date.now();\n\n await this.objects.setObjectAsync(obj._id, obj);\n\n obj.common.enabled = true; // enable instance\n obj.ts = Date.now();\n\n await this.objects.setObjectAsync(obj._id, obj);\n console.log(`Adapter \"${obj._id}\" restarted.`);\n }\n } catch (e) {\n console.error(`Cannot restart adapter \"${instance}\": ${e.message}`);\n }\n }\n }\n }\n }\n } catch (e) {\n console.error(`Cannot parse ${adapterDir}/io-package.json: ${e.message}`);\n }\n }\n\n sendToHostFromCli(\n host: string,\n command: string,\n message: ioBroker.MessagePayload,\n callback: ioBroker.MessageCallback | null,\n ): void {\n const time = Date.now();\n const from = `system.host.${hostname}_cli_${time}`;\n\n const timeout = setTimeout(() => {\n if (callback) {\n callback();\n }\n callback = null;\n this.states.unsubscribeMessage(from);\n // @ts-expect-error todo: I don't think this works\n this.states.onChange = null;\n }, 60_000);\n\n // @ts-expect-error todo: I don't think this works\n this.states.onChange = (id, msg) => {\n if (id.endsWith(from)) {\n if (msg.command === 'log' || msg.command === 'error' || msg.command === 'warn') {\n // @ts-expect-error\n console[msg.command](`${host} -> ${msg.text}`);\n } else if (callback) {\n callback(msg && msg.message);\n callback = null;\n clearTimeout(timeout);\n this.states.unsubscribeMessage(from);\n // @ts-expect-error\n this.states.onChange = null;\n }\n }\n };\n\n this.states.subscribeMessage(from, () => {\n const obj = {\n command,\n message: message,\n from: `system.host.${hostname}_cli_${time}`,\n callback: {\n message,\n id: this.callbackId++,\n ack: false,\n time,\n },\n } as const;\n\n if (this.callbackId > 0xffffffff) {\n this.callbackId = 1;\n }\n\n this.callbacks[`_${obj.callback.id}`] = { cb: callback };\n\n // we cannot receive answers from hosts in CLI, so this command is \"fire and forget\"\n this.states.pushMessage(host, obj);\n });\n }\n\n async uploadAdapterFullAsync(adapters: string[]): Promise<void> {\n if (adapters?.length) {\n const liveHosts = await this.getHosts(true);\n for (const adapter of adapters) {\n // Find the host which has this adapter\n const instances = await tools.getInstances(adapter, this.objects, true);\n // try to find instance on this host\n let instance = instances.find(obj => obj?.common?.host === hostname);\n\n // try to find enabled instance on live host\n instance =\n instance || instances.find(obj => obj?.common?.enabled && liveHosts.includes(obj.common.host));\n\n // try to find any instance\n instance = instance || instances.find(obj => obj?.common && liveHosts.includes(obj.common.host));\n\n if (instance && instance.common.host !== hostname) {\n console.log(`Send upload command to host \"${instance.common.host}\"... `);\n // send upload message to the host\n const response = await this.sendToHostFromCliAsync(instance.common.host, 'upload', adapter);\n if (response) {\n console.log(`Upload result: ${response.result}`);\n } else {\n console.error(`No answer from ${instance.common.host}`);\n }\n } else {\n if (!instance) {\n // no one alive instance found\n const adapterDir = tools.getAdapterDir(adapter);\n if (!adapterDir || !fs.existsSync(adapterDir)) {\n console.warn(\n `No alive host found which has the adapter ${adapter} installed! No upload possible. Skipped.`,\n );\n continue;\n }\n }\n\n // try to upload on this host. It will print an error if the adapter directory not found\n await this.uploadAdapter(adapter, true, true);\n await this.upgradeAdapterObjects(adapter);\n await this.uploadAdapter(adapter, false, true);\n }\n }\n }\n }\n\n /**\n * Uploads a file\n *\n * @param source source path\n * @param target target path\n */\n async uploadFile(source: string, target: string): Promise<string> {\n target = target.replace(/\\\\/g, '/');\n source = source.replace(/\\\\/g, '/');\n if (target[0] === '/') {\n target = target.substring(1);\n }\n if (target[target.length - 1] === '/') {\n let name = source.split('/').pop()!;\n name = name.split('?')[0];\n if (!name.includes('.')) {\n name = 'index.html';\n }\n target += name;\n }\n const parts = target.split('/');\n const adapter = parts[0];\n parts.splice(0, 1);\n target = parts.join('/');\n\n if (source.match(/^http:\\/\\/|^https:\\/\\//)) {\n try {\n const result = await axios(source, {\n responseType: 'arraybuffer',\n validateStatus: status => status === 200,\n });\n if (result?.data) {\n await this.objects.writeFileAsync(adapter, target, result.data);\n } else {\n console.error(`Empty response from URL \"${source}\"`);\n throw new Error(`Empty response from URL \"${source}\"`);\n }\n } catch (e) {\n let result;\n if (e.response) {\n // The request was made and the server responded with a status code\n // that falls out of the range of 2xx\n result = e.response.data || e.response.status;\n } else if (e.request) {\n // The request was made but no response was received\n // `err.request` is an instance of XMLHttpRequest in the browser and an instance of\n // http.ClientRequest in node.js\n result = e.request;\n } else {\n // Something happened in setting up the request that triggered an Error\n result = e.message;\n }\n console.error(`Cannot get URL \"${source}\": ${result}`);\n throw new Error(result);\n }\n } else {\n try {\n await this.objects.writeFileAsync(adapter, target, fs.readFileSync(source));\n } catch (e) {\n console.error(`Cannot read file \"${source}\": ${e.message}`);\n throw e;\n }\n }\n\n return `${adapter}/${target}`;\n }\n\n async eraseFiles(files: any[], logger: MinimalLogger | typeof console): Promise<void> {\n if (files && files.length) {\n for (const file of files) {\n try {\n await this.objects.unlinkAsync(file.adapter, file.path);\n } catch (e) {\n logger.error(`Cannot delete file \"${file.path}\": ${e}`);\n }\n }\n }\n }\n\n /**\n * Collect Files of an adapter specific directory from the ioBroker storage\n *\n * @param adapter Adapter name\n * @param path path in the adapter specific storage space\n * @param logger Logger instance\n */\n async collectExistingFilesToDelete(\n adapter: string,\n path: string,\n logger: MinimalLogger | typeof console,\n ): Promise<{\n filesToDelete: File[];\n dirs: File[];\n }> {\n let _files: File[] = [];\n let _dirs: File[] = [];\n let files: ioBroker.ReadDirResult[];\n try {\n files = await this.objects.readDirAsync(adapter, path);\n } catch {\n // ignore err\n files = [];\n }\n\n if (files?.length) {\n for (const file of files) {\n if (file.file === '.' || file.file === '..') {\n continue;\n }\n const newPath = path + file.file;\n if (file.isDir) {\n if (!_dirs.find(e => e.path === newPath)) {\n _dirs.push({ adapter, path: newPath });\n }\n try {\n const result = await this.collectExistingFilesToDelete(adapter, `${newPath}/`, logger);\n if (result.filesToDelete) {\n _files = _files.concat(result.filesToDelete);\n }\n\n _dirs = _dirs.concat(result.dirs);\n } catch (e) {\n logger.warn(`Cannot delete folder \"${adapter}${newPath}/\": ${e.message}`);\n }\n } else if (!_files.find(e => e.path === newPath)) {\n _files.push({ adapter, path: newPath });\n }\n }\n }\n\n return { filesToDelete: _files, dirs: _dirs };\n }\n\n async upload(\n adapter: string,\n isAdmin: boolean,\n files: string[],\n id: string,\n logger: MinimalLogger | typeof console,\n ): Promise<string> {\n const uploadID = `system.adapter.${adapter}.upload`;\n\n await this.states.setState(uploadID, { val: 0, ack: true });\n\n for (let f = 0; f < files.length; f++) {\n const file = files[f];\n // do not upload '.gitignore' files. Todo: add other exceptions\n if (file === '.gitignore') {\n continue;\n }\n\n const mimeType = mime.lookup(file);\n let attNameArr = file.split(this.regApp);\n // try to find anyway if adapter is not lower case\n if (attNameArr.length === 1 && file.toLowerCase().includes(tools.appName.toLowerCase())) {\n attNameArr = ['', file.substring(tools.appName.length + 2)];\n }\n\n let attName = attNameArr.pop()!;\n attName = attName.split('/').slice(2).join('/');\n\n const remainingFiles = files.length - f - 1;\n\n if (remainingFiles >= 100) {\n (!f || !(remainingFiles % 50)) &&\n logger.log(`upload [${remainingFiles}] ${id} ${file} ${attName} ${mimeType}`);\n } else if (remainingFiles > 20) {\n if (!f || !(remainingFiles % 10)) {\n logger.log(`upload [${remainingFiles}] ${id} ${file} ${attName} ${mimeType}`);\n }\n } else {\n logger.log(`upload [${remainingFiles}] ${id} ${file} ${attName} ${mimeType}`);\n }\n\n // Update upload indicator\n if (!isAdmin) {\n const now = Date.now();\n if (now - this.lastProgressUpdate > 1_000) {\n this.lastProgressUpdate = now;\n await this.states.setState(uploadID, {\n val: Math.round((1_000 * (files.length - f)) / files.length) / 10,\n ack: true,\n });\n }\n }\n\n try {\n const content = await fs.readFile(file);\n await this.objects.writeFileAsync(id, attName, content, { mimeType: mimeType || undefined });\n } catch (e) {\n console.error(`Error: Cannot upload ${file}: ${e.message}`);\n }\n }\n\n // Set upload progress to 0;\n if (!isAdmin && files.length) {\n await this.states.setState(uploadID, { val: 0, ack: true });\n }\n\n return adapter;\n }\n\n // Read synchronous all files recursively from local directory\n walk(dir: string, _results?: string[]): string[] {\n const results = _results || [];\n try {\n if (fs.existsSync(dir)) {\n const list = fs.readdirSync(dir);\n list.map(file => {\n const stat = fs.statSync(`${dir}/${file}`);\n if (stat.isDirectory()) {\n this.walk(`${dir}/${file}`, results);\n } else {\n if (!file.endsWith('.npmignore') && !file.endsWith('.gitignore')) {\n results.push(`${dir}/${file}`);\n }\n }\n });\n }\n } catch (e) {\n console.error(e);\n }\n\n return results;\n }\n\n /**\n * Upload given adapter\n *\n * @param adapter adapter name\n * @param isAdmin if admin folder should be uploaded too\n * @param forceUpload if upload should be forced\n * @param subTree subtree path to upload\n * @param _logger logger instance\n */\n async uploadAdapter(\n adapter: string,\n isAdmin: boolean,\n forceUpload: boolean,\n subTree?: string,\n _logger?: MinimalLogger,\n ): Promise<string> {\n const id = adapter + (isAdmin ? '.admin' : '');\n const adapterDir = tools.getAdapterDir(adapter);\n let dir = adapterDir ? adapterDir + (isAdmin ? '/admin' : '/www') : '';\n\n const logger = _logger || console;\n\n if (subTree && dir) {\n dir += `/${subTree}`;\n }\n if (adapterDir === null || !fs.existsSync(adapterDir)) {\n console.log(\n `INFO: Directory \"${\n adapterDir || `for ${adapter}${isAdmin ? '.admin' : ''}`\n }\" does not exist. Nothing was uploaded or deleted.`,\n );\n return adapter;\n }\n\n let cfg;\n try {\n cfg = await fs.readJSON(`${adapterDir}/io-package.json`);\n } catch (e) {\n // file not parsable or does not exist\n console.error(`Could not read io-package.json: ${e.message}`);\n }\n\n if (!fs.existsSync(dir)) {\n // www folder have not all adapters. So show warning only for admin folder\n // widgets do not have www folder, but they have onlyWWW flag\n (isAdmin || (cfg?.common?.onlyWWW && !cfg.common.visWidgets)) &&\n console.log(\n `INFO: Directory \"${\n dir || `for ${adapter}${isAdmin ? '.admin' : ''}`\n }\" was not found! Nothing was uploaded or deleted.`,\n );\n\n if (isAdmin) {\n return adapter;\n }\n await this.checkRestartOther(adapter);\n return adapter;\n }\n\n // check for common.wwwDontUpload (required for legacy adapters and admin)\n if (!isAdmin && cfg?.common?.wwwDontUpload) {\n return adapter;\n }\n\n // Create \"upload progress\" object if not exists\n if (!isAdmin) {\n let obj;\n const uploadID = `system.adapter.${adapter}.upload`;\n try {\n obj = await this.objects.getObject(uploadID);\n } catch {\n // ignore\n }\n if (!obj) {\n await this.objects.setObject(uploadID, {\n _id: uploadID,\n type: 'state',\n common: {\n name: `${adapter}.upload`,\n type: 'number',\n role: 'indicator.state',\n unit: '%',\n min: 0,\n max: 100,\n def: 0,\n desc: 'Upload process indicator',\n read: true,\n write: false,\n },\n from: `system.host.${tools.getHostName()}.cli`,\n ts: Date.now(),\n native: {},\n });\n }\n // Set indicator to 0\n await this.states.setState(uploadID, { val: 0, ack: true });\n }\n\n let result;\n try {\n result = await this.objects.getObjectAsync(id);\n } catch {\n // ignore\n }\n // Read all names with subtrees from local directory\n const files = this.walk(dir);\n if (!result) {\n // @ts-expect-error types needed admin is not allowed for meta, but it should be allowed\n await this.objects.setObjectAsync(id, {\n type: 'meta',\n common: {\n name: id.split('.').pop()!,\n type: isAdmin ? 'admin' : 'www',\n },\n from: `system.host.${tools.getHostName()}.cli`,\n ts: Date.now(),\n native: {},\n });\n forceUpload = true;\n }\n\n if (forceUpload) {\n // only skip if explicitly opted out\n // The visualization check is needed as user of legacy systems often stored files inside adapter directories like `vis`\n // in the long term, such adapters should explicitly opt out, so we can hopefully remove this line in 2-3 versions (current 5.0)\n if (\n cfg?.common?.eraseOnUpload !== false &&\n !(cfg?.common?.eraseOnUpload === undefined && cfg?.common?.type === 'visualization')\n ) {\n const { filesToDelete } = await this.collectExistingFilesToDelete(\n isAdmin ? `${adapter}.admin` : adapter,\n '/',\n logger,\n );\n // delete old files, before upload of new\n await this.eraseFiles(filesToDelete, logger);\n }\n if (!isAdmin) {\n await this.checkRestartOther(adapter);\n await new Promise<void>(resolve => setTimeout(() => resolve(), 25));\n await this.upload(adapter, isAdmin, files, id, logger);\n } else {\n await this.upload(adapter, isAdmin, files, id, logger);\n }\n }\n return adapter;\n }\n\n extendNative(target: Record<string, any>, additional: Record<string, unknown>): Record<string, any> {\n if (tools.isObject(additional)) {\n for (const [attr, attrData] of Object.entries(additional)) {\n if (target[attr] === undefined) {\n target[attr] = attrData;\n } else if (tools.isObject(attrData)) {\n try {\n target[attr] = target[attr] || {};\n } catch {\n console.warn(`Cannot update attribute ${attr} of native`);\n }\n if (typeof target[attr] === 'object' && target[attr] !== null) {\n this.extendNative(target[attr], attrData);\n }\n }\n }\n }\n return target;\n }\n\n extendCommon(\n target: Record<string, any>,\n additional: Record<string, any>,\n instance: string,\n ): ioBroker.InstanceCommon {\n if (tools.isObject(additional)) {\n const preserveAttributes = [\n 'title',\n 'schedule',\n 'restartSchedule',\n 'mode',\n 'loglevel',\n 'enabled',\n 'custom',\n 'tier',\n ];\n\n // Object attributes that should be completely replaced, not merged\n const replaceAttributes = ['adminUI', 'adminTab', 'adminColumns'];\n\n for (const [attr, attrData] of Object.entries(additional)) {\n // preserve these attributes, except, they were undefined before and preserve titleLang if current titleLang is of type string (changed by user)\n if (preserveAttributes.includes(attr) || (attr === 'titleLang' && typeof target[attr] === 'string')) {\n if (target[attr] === undefined) {\n target[attr] = attrData;\n }\n } else if (\n typeof attrData !== 'object' ||\n attrData instanceof Array ||\n replaceAttributes.includes(attr)\n ) {\n try {\n target[attr] = attrData;\n\n // dataFolder can have wildcards\n if (attr === 'dataFolder' && target.dataFolder && target.dataFolder.includes('%INSTANCE%')) {\n target.dataFolder = target.dataFolder.replace(/%INSTANCE%/g, instance);\n }\n } catch {\n console.warn(`Cannot update attribute ${attr} of common`);\n }\n } else {\n target[attr] = target[attr] || {};\n if (typeof target[attr] !== 'object') {\n target[attr] = {}; // here we clean the simple value with object\n }\n\n this.extendCommon(target[attr], attrData, instance);\n }\n }\n }\n return target as ioBroker.InstanceCommon;\n }\n\n /**\n * Extends the `system.instance.adapter.<instanceNumber>` objects with the native properties from adapters io-package.json\n *\n * @param name name of the adapter\n * @param ioPack parsed io-package content\n * @param hostname name of the host where the adapter is installed on\n * @param logger instance of logger\n */\n async _upgradeAdapterObjectsHelper(\n name: string,\n ioPack: ioBroker.AdapterObject,\n hostname: string,\n logger: MinimalLogger | typeof console,\n ): Promise<string> {\n // Update all instances of this host\n const res = await this.objects.getObjectViewAsync('system', 'instance', {\n startkey: `system.adapter.${name}.`,\n endkey: `system.adapter.${name}.\\u9999`,\n });\n\n if (res) {\n for (const row of res.rows) {\n if (row.value?.common.host === hostname) {\n const _obj = await this.objects.getObject(row.id);\n const newObject = deepClone(_obj) as ioBroker.InstanceObject;\n\n // TODO: refactor the following assignments into a method, where we can define which attributes need a real override and their defaults\n\n // all common settings should be taken from new one\n newObject.common = this.extendCommon(\n newObject.common,\n ioPack.common,\n newObject._id.split('.').pop()!,\n );\n newObject.native = this.extendNative(newObject.native, ioPack.native);\n\n // protected/encryptedNative and notifications also need to be updated\n newObject.protectedNative = ioPack.protectedNative || [];\n newObject.encryptedNative = ioPack.encryptedNative || [];\n newObject.notifications = ioPack.notifications || [];\n // update instanceObjects and objects\n newObject.instanceObjects = ioPack.instanceObjects || [];\n newObject.objects = ioPack.objects || [];\n\n newObject.common.version = ioPack.common.version;\n newObject.common.installedVersion = ioPack.common.version;\n newObject.common.installedFrom = ioPack.common.installedFrom;\n\n // do not merge visWidgets and localLinks\n if (ioPack.common.visWidgets) {\n newObject.common.visWidgets = ioPack.common.visWidgets;\n } else {\n delete newObject.common.visWidgets;\n }\n\n if (ioPack.common.localLinks) {\n newObject.common.localLinks = ioPack.common.localLinks;\n } else {\n delete newObject.common.localLinks;\n }\n\n if (!ioPack.common.compact && newObject.common.compact) {\n newObject.common.compact = ioPack.common.compact;\n }\n\n // Compare objects to reduce restarts of instances\n if (!isDeepStrictEqual(newObject, _obj)) {\n logger.log(`Update \"${newObject._id}\"`);\n\n newObject.from = `system.host.${tools.getHostName()}.cli`;\n newObject.ts = Date.now();\n\n await this.objects.setObjectAsync(newObject._id, newObject);\n }\n }\n }\n }\n\n // updates only \"_design/system\" and co \"_design/*\"\n if (Array.isArray(ioPack.objects)) {\n for (const obj of ioPack.objects) {\n if (name === 'js-controller' && !obj._id.startsWith('_design/')) {\n continue;\n }\n\n obj.from = `system.host.${hostname}.cli`;\n obj.ts = Date.now();\n\n try {\n await this.objects.setObjectAsync(obj._id, obj);\n } catch (e) {\n logger.error(`Cannot update object: ${e}`);\n }\n }\n }\n\n return name;\n }\n\n /**\n * Create object from io-package json\n *\n * @param name adapter name\n * @param ioPack IoPack content\n * @param logger logger instance\n */\n async upgradeAdapterObjects(\n name: string,\n ioPack?: ioBroker.AdapterObject,\n logger: MinimalLogger | typeof console = console,\n ): Promise<string> {\n const adapterDir = tools.getAdapterDir(name);\n let ioPackFile;\n try {\n ioPackFile = fs.readJSONSync(`${adapterDir}/io-package.json`);\n } catch {\n if (adapterDir) {\n logger.error(`Cannot find io-package.json in ${adapterDir}`);\n } else {\n logger.error(`Cannot find io-package.json for \"${name}\"`);\n }\n ioPackFile = null;\n }\n\n ioPack = ioPack || ioPackFile;\n\n if (ioPack) {\n logger.log(\n `Updating objects from io-package.json for adapter \"${name}\" with version \"${ioPack.common.version}\"`,\n );\n // Always update installedFrom from File on disk if exists and set\n if (ioPackFile?.common?.installedFrom) {\n ioPack.common = ioPack.common || {};\n ioPack.common.installedFrom = ioPackFile.common.installedFrom;\n }\n // Not existing? Why ever ... we recreate\n let _obj;\n try {\n _obj = await this.objects.getObject(`system.adapter.${name}`);\n } catch {\n // ignore err\n }\n const obj: Omit<ioBroker.AdapterObject, '_id'> = _obj || {\n common: ioPack.common,\n native: ioPack.native,\n type: 'adapter',\n instanceObjects: [],\n objects: [],\n };\n\n obj.common = ioPack.common || {};\n obj.native = ioPack.native || {};\n // protected/encryptedNative and notifications also need to be updated\n obj.protectedNative = ioPack.protectedNative || [];\n obj.encryptedNative = ioPack.encryptedNative || [];\n obj.notifications = ioPack.notifications || [];\n // update instanceObjects and objects\n obj.instanceObjects = ioPack.instanceObjects || [];\n obj.objects = ioPack.objects || [];\n\n obj.type = 'adapter';\n\n obj.common.installedVersion = ioPack.common.version;\n\n if (obj.common.news) {\n delete obj.common.news; // remove this information as it could be big, but it will be taken from repo\n }\n\n const hostname = tools.getHostName();\n\n obj.from = `system.host.${hostname}.cli`;\n obj.ts = Date.now();\n\n try {\n await this.objects.setObject(`system.adapter.${name}`, obj);\n await this.objects.setObject(`system.host.${hostname}.adapter.${name}`, obj);\n } catch (e) {\n logger.error(\n `Cannot set \"system.adapter.${name}\" and \"system.host.${hostname}.adapters.${name}\": ${e.message}`,\n );\n }\n\n await this._upgradeAdapterObjectsHelper(name, ioPack, hostname, logger);\n }\n\n return name;\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["fs", "axios", "mime", "hostname", "deepClone"]
7
7
  }
@@ -1,28 +1,19 @@
1
1
  import type { ProcessExitCallback } from '../_Types.js';
2
2
  import type { Client as ObjectsRedisClient } from '@iobroker/db-objects-redis';
3
- /** Options for the users command */
4
3
  export interface CLIUsersOptions {
5
- /** Callback to exit the process with an exit code */
6
4
  processExit: ProcessExitCallback;
7
- /** The objects database client */
8
5
  objects: ObjectsRedisClient;
9
6
  }
10
- /**
11
- * CLI command to manage ioBroker users and groups
12
- */
13
7
  export declare class Users {
14
8
  private readonly objects;
15
9
  private readonly processExit;
16
- /**
17
- * @param options The objects database client and the process-exit callback
18
- */
19
10
  constructor(options: CLIUsersOptions);
20
11
  /**
21
12
  * Adds new user to system
22
13
  *
23
14
  * @param username name of the user which will be added
24
15
  * @param pw password
25
- * @param callback Called once the user has been added
16
+ * @param callback
26
17
  */
27
18
  addUser(username: string, pw: string, callback: ioBroker.ErrorCallback): void;
28
19
  /**
@@ -36,7 +27,7 @@ export declare class Users {
36
27
  *
37
28
  * @param username name of the user to set password for
38
29
  * @param pw password
39
- * @param callback Called once the password has been set
30
+ * @param callback
40
31
  */
41
32
  setPassword(username: string, pw: string, callback: ioBroker.ErrorCallback): void;
42
33
  /**
@@ -44,14 +35,14 @@ export declare class Users {
44
35
  *
45
36
  * @param username name of the user to check password
46
37
  * @param pw password
47
- * @param callback Called with whether the password is correct
38
+ * @param callback
48
39
  */
49
40
  checkPassword(username: string, pw: string, callback: (err?: Error | null, isOk?: boolean) => void): void;
50
41
  /**
51
42
  * Deletes user from system
52
43
  *
53
44
  * @param username name of the user to delete
54
- * @param callback Called once the user has been deleted
45
+ * @param callback
55
46
  */
56
47
  delUser(username: string, callback: ioBroker.ErrorCallback): void;
57
48
  /**
@@ -59,7 +50,7 @@ export declare class Users {
59
50
  *
60
51
  * @param username user which will be added to the group
61
52
  * @param groupName name of the group where the user will be added to
62
- * @param callback Called once the user has been added to the group
53
+ * @param callback
63
54
  */
64
55
  addUserToGroup(username: string, groupName: string, callback: ioBroker.ErrorCallback): void;
65
56
  /**
@@ -68,7 +59,7 @@ export declare class Users {
68
59
  * @param username user which sohuld be created
69
60
  * @param groupName default group for the new user
70
61
  * @param password user password
71
- * @param callback Called once the user has been created
62
+ * @param callback
72
63
  */
73
64
  addUserPrompt(username: string, groupName: string, password: string, callback: ioBroker.ErrorCallback): void;
74
65
  /**
@@ -76,7 +67,7 @@ export declare class Users {
76
67
  *
77
68
  * @param username name of the user to set password for
78
69
  * @param password password of user
79
- * @param callback Called once the password has been set
70
+ * @param callback
80
71
  */
81
72
  setUserPassword(username: string, password: string, callback: ioBroker.ErrorCallback): Promise<void>;
82
73
  /**
@@ -84,7 +75,7 @@ export declare class Users {
84
75
  *
85
76
  * @param username name of the user which will be activated
86
77
  * @param enable true if it should be enabled else false
87
- * @param callback Called once the user has been enabled or disabled
78
+ * @param callback
88
79
  */
89
80
  enableUser(username: string, enable: boolean, callback: ioBroker.ErrorCallback): void;
90
81
  /**
@@ -92,21 +83,21 @@ export declare class Users {
92
83
  *
93
84
  * @param username name of the user to check password for
94
85
  * @param password password to check
95
- * @param callback Called with whether the password is valid
86
+ * @param callback
96
87
  */
97
88
  checkUserPassword(username: string, password: string, callback: ioBroker.ErrorCallback): void;
98
89
  /**
99
90
  * Get user object
100
91
  *
101
92
  * @param username name of the user to get object of
102
- * @param callback Called with the user object
93
+ * @param callback
103
94
  */
104
95
  getUser(username: string, callback: (err?: Error | null, enabled?: boolean) => void): void;
105
96
  /**
106
97
  * Get group object
107
98
  *
108
99
  * @param group groupname
109
- * @param callback Called with the group object
100
+ * @param callback
110
101
  */
111
102
  getGroup(group: string, callback: (err?: Error | null, enabled?: boolean, members?: string[]) => void): void;
112
103
  /**
@@ -114,7 +105,7 @@ export declare class Users {
114
105
  *
115
106
  * @param group groupname
116
107
  * @param enable if enable or disable
117
- * @param callback Called once the group has been enabled or disabled
108
+ * @param callback
118
109
  */
119
110
  enableGroup(group: string, enable: boolean, callback: ioBroker.ErrorCallback): void;
120
111
  /**
@@ -127,7 +118,7 @@ export declare class Users {
127
118
  * Remove group
128
119
  *
129
120
  * @param group groupname
130
- * @param callback Called once the group has been removed
121
+ * @param callback
131
122
  */
132
123
  delGroup(group: string, callback: ioBroker.ErrorCallback): void;
133
124
  /**
@@ -135,7 +126,7 @@ export declare class Users {
135
126
  *
136
127
  * @param username name of the user which will be removed from group
137
128
  * @param groupName name of the group user will be removed from
138
- * @param callback Called once the user has been removed from the group
129
+ * @param callback
139
130
  */
140
131
  removeUserFromGroup(username: string, groupName: string, callback: ioBroker.ErrorCallback): void;
141
132
  }
@@ -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 });
@@ -35,14 +34,8 @@ module.exports = __toCommonJS(setupUsers_exports);
35
34
  var import_js_controller_common = require("@iobroker/js-controller-common");
36
35
  var import_prompt = __toESM(require("prompt"), 1);
37
36
  class Users {
38
- static {
39
- __name(this, "Users");
40
- }
41
37
  objects;
42
38
  processExit;
43
- /**
44
- * @param options The objects database client and the process-exit callback
45
- */
46
39
  constructor(options) {
47
40
  if (!options.objects) {
48
41
  throw new Error("Invalid arguments: objects is missing");
@@ -58,7 +51,7 @@ class Users {
58
51
  *
59
52
  * @param username name of the user which will be added
60
53
  * @param pw password
61
- * @param callback Called once the user has been added
54
+ * @param callback
62
55
  */
63
56
  addUser(username, pw, callback) {
64
57
  const _user = username.replace(/\s/g, "_").toLowerCase();
@@ -104,7 +97,7 @@ class Users {
104
97
  *
105
98
  * @param username name of the user to set password for
106
99
  * @param pw password
107
- * @param callback Called once the password has been set
100
+ * @param callback
108
101
  */
109
102
  setPassword(username, pw, callback) {
110
103
  const _user = username.replace(/\s/g, "_").toLowerCase();
@@ -130,7 +123,7 @@ class Users {
130
123
  *
131
124
  * @param username name of the user to check password
132
125
  * @param pw password
133
- * @param callback Called with whether the password is correct
126
+ * @param callback
134
127
  */
135
128
  checkPassword(username, pw, callback) {
136
129
  const _user = username.replace(/\s/g, "_").toLowerCase();
@@ -147,7 +140,7 @@ class Users {
147
140
  * Deletes user from system
148
141
  *
149
142
  * @param username name of the user to delete
150
- * @param callback Called once the user has been deleted
143
+ * @param callback
151
144
  */
152
145
  delUser(username, callback) {
153
146
  if (!username) {
@@ -200,7 +193,7 @@ class Users {
200
193
  *
201
194
  * @param username user which will be added to the group
202
195
  * @param groupName name of the group where the user will be added to
203
- * @param callback Called once the user has been added to the group
196
+ * @param callback
204
197
  */
205
198
  addUserToGroup(username, groupName, callback) {
206
199
  let _user = username.replace(/\s/g, "_").toLowerCase();
@@ -239,7 +232,7 @@ class Users {
239
232
  * @param username user which sohuld be created
240
233
  * @param groupName default group for the new user
241
234
  * @param password user password
242
- * @param callback Called once the user has been created
235
+ * @param callback
243
236
  */
244
237
  addUserPrompt(username, groupName, password2, callback) {
245
238
  if (!username) {
@@ -313,7 +306,7 @@ class Users {
313
306
  *
314
307
  * @param username name of the user to set password for
315
308
  * @param password password of user
316
- * @param callback Called once the password has been set
309
+ * @param callback
317
310
  */
318
311
  async setUserPassword(username, password2, callback) {
319
312
  if (!username) {
@@ -372,7 +365,7 @@ class Users {
372
365
  *
373
366
  * @param username name of the user which will be activated
374
367
  * @param enable true if it should be enabled else false
375
- * @param callback Called once the user has been enabled or disabled
368
+ * @param callback
376
369
  */
377
370
  enableUser(username, enable, callback) {
378
371
  if (!username) {
@@ -404,7 +397,7 @@ class Users {
404
397
  *
405
398
  * @param username name of the user to check password for
406
399
  * @param password password to check
407
- * @param callback Called with whether the password is valid
400
+ * @param callback
408
401
  */
409
402
  checkUserPassword(username, password2, callback) {
410
403
  if (!username && !password2) {
@@ -470,7 +463,7 @@ class Users {
470
463
  * Get user object
471
464
  *
472
465
  * @param username name of the user to get object of
473
- * @param callback Called with the user object
466
+ * @param callback
474
467
  */
475
468
  getUser(username, callback) {
476
469
  this.objects.getObject(`system.user.${username}`, (err, obj) => {
@@ -487,7 +480,7 @@ class Users {
487
480
  * Get group object
488
481
  *
489
482
  * @param group groupname
490
- * @param callback Called with the group object
483
+ * @param callback
491
484
  */
492
485
  getGroup(group, callback) {
493
486
  this.objects.getObject(`system.group.${group}`, (err, obj) => {
@@ -505,7 +498,7 @@ class Users {
505
498
  *
506
499
  * @param group groupname
507
500
  * @param enable if enable or disable
508
- * @param callback Called once the group has been enabled or disabled
501
+ * @param callback
509
502
  */
510
503
  enableGroup(group, enable, callback) {
511
504
  if (!group) {
@@ -544,47 +537,11 @@ class Users {
544
537
  throw new Error("Group yet exists");
545
538
  } else {
546
539
  await this.objects.setObject(`system.group.${_group}`, {
547
- _id: `system.group.${_group}`,
548
540
  type: "group",
549
541
  common: {
550
542
  name: group,
551
543
  enabled: true,
552
- members: [],
553
- acl: {
554
- file: {
555
- read: false,
556
- list: false,
557
- write: false,
558
- create: false,
559
- delete: false
560
- },
561
- object: {
562
- read: false,
563
- list: false,
564
- write: false,
565
- create: false,
566
- delete: false
567
- },
568
- users: {
569
- read: false,
570
- list: false,
571
- write: false,
572
- create: false,
573
- delete: false
574
- },
575
- state: {
576
- read: false,
577
- list: false,
578
- write: false,
579
- create: false,
580
- delete: false
581
- },
582
- other: {
583
- execute: false,
584
- sendto: false,
585
- http: false
586
- }
587
- }
544
+ members: []
588
545
  },
589
546
  from: `system.host.${import_js_controller_common.tools.getHostName()}.cli`,
590
547
  ts: Date.now(),
@@ -596,7 +553,7 @@ class Users {
596
553
  * Remove group
597
554
  *
598
555
  * @param group groupname
599
- * @param callback Called once the group has been removed
556
+ * @param callback
600
557
  */
601
558
  delGroup(group, callback) {
602
559
  const _group = group.replace(/\s/g, "_");
@@ -617,7 +574,7 @@ class Users {
617
574
  *
618
575
  * @param username name of the user which will be removed from group
619
576
  * @param groupName name of the group user will be removed from
620
- * @param callback Called once the user has been removed from the group
577
+ * @param callback
621
578
  */
622
579
  removeUserFromGroup(username, groupName, callback) {
623
580
  const _group = groupName.replace(/\s/g, "_");