@iobroker/js-controller-cli 7.2.3 → 8.0.0-alpha.2-20260923-99da17fcc
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/cjs/index.js +3 -3
- package/build/cjs/lib/_Types.d.ts +8 -1
- package/build/cjs/lib/cli/cliCert.d.ts +7 -4
- package/build/cjs/lib/cli/cliCert.js +10 -6
- package/build/cjs/lib/cli/cliCert.js.map +2 -2
- package/build/cjs/lib/cli/cliCommand.d.ts +63 -15
- package/build/cjs/lib/cli/cliCommand.js +8 -1
- package/build/cjs/lib/cli/cliCommand.js.map +2 -2
- package/build/cjs/lib/cli/cliCompact.d.ts +5 -2
- package/build/cjs/lib/cli/cliCompact.js +9 -2
- package/build/cjs/lib/cli/cliCompact.js.map +2 -2
- package/build/cjs/lib/cli/cliDebug.d.ts +5 -2
- package/build/cjs/lib/cli/cliDebug.js +8 -1
- package/build/cjs/lib/cli/cliDebug.js.map +2 -2
- package/build/cjs/lib/cli/cliHost.d.ts +13 -10
- package/build/cjs/lib/cli/cliHost.js +13 -5
- package/build/cjs/lib/cli/cliHost.js.map +2 -2
- package/build/cjs/lib/cli/cliLogs.d.ts +9 -3
- package/build/cjs/lib/cli/cliLogs.js +12 -1
- package/build/cjs/lib/cli/cliLogs.js.map +2 -2
- package/build/cjs/lib/cli/cliMessage.d.ts +2 -1
- package/build/cjs/lib/cli/cliMessage.js +5 -0
- package/build/cjs/lib/cli/cliMessage.js.map +2 -2
- package/build/cjs/lib/cli/cliObjects.d.ts +21 -18
- package/build/cjs/lib/cli/cliObjects.js +51 -33
- package/build/cjs/lib/cli/cliObjects.js.map +2 -2
- package/build/cjs/lib/cli/cliPlugin.d.ts +3 -3
- package/build/cjs/lib/cli/cliPlugin.js +6 -0
- package/build/cjs/lib/cli/cliPlugin.js.map +2 -2
- package/build/cjs/lib/cli/cliProcess.d.ts +17 -7
- package/build/cjs/lib/cli/cliProcess.js +77 -24
- package/build/cjs/lib/cli/cliProcess.js.map +3 -3
- package/build/cjs/lib/cli/cliStates.d.ts +7 -4
- package/build/cjs/lib/cli/cliStates.js +14 -6
- package/build/cjs/lib/cli/cliStates.js.map +2 -2
- package/build/cjs/lib/cli/cliTools.js +11 -0
- package/build/cjs/lib/cli/cliTools.js.map +1 -1
- package/build/cjs/lib/cli/messages.js +47 -46
- package/build/cjs/lib/cli/messages.js.map +1 -1
- package/build/cjs/lib/progressBar.d.ts +59 -0
- package/build/cjs/lib/progressBar.js +115 -0
- package/build/cjs/lib/progressBar.js.map +7 -0
- package/build/cjs/lib/setup/customError.d.ts +4 -0
- package/build/cjs/lib/setup/customError.js +7 -0
- package/build/cjs/lib/setup/customError.js.map +2 -2
- package/build/cjs/lib/setup/dbConnection.js +69 -64
- package/build/cjs/lib/setup/dbConnection.js.map +3 -3
- package/build/cjs/lib/setup/formatters.d.ts +4 -4
- package/build/cjs/lib/setup/formatters.js +5 -0
- package/build/cjs/lib/setup/formatters.js.map +2 -2
- package/build/cjs/lib/setup/multihostClient.js +6 -2
- package/build/cjs/lib/setup/multihostClient.js.map +1 -1
- package/build/cjs/lib/setup/pluginInfos.d.ts +5 -0
- package/build/cjs/lib/setup/pluginInfos.js +2 -0
- package/build/cjs/lib/setup/pluginInfos.js.map +2 -2
- package/build/cjs/lib/setup/setupBackup.d.ts +53 -0
- package/build/cjs/lib/setup/setupBackup.js +125 -14
- package/build/cjs/lib/setup/setupBackup.js.map +3 -3
- package/build/cjs/lib/setup/setupInstall.d.ts +66 -15
- package/build/cjs/lib/setup/setupInstall.js +282 -28
- package/build/cjs/lib/setup/setupInstall.js.map +2 -2
- package/build/cjs/lib/setup/setupLicense.d.ts +13 -0
- package/build/cjs/lib/setup/setupLicense.js +33 -2
- package/build/cjs/lib/setup/setupLicense.js.map +2 -2
- package/build/cjs/lib/setup/setupList.d.ts +55 -1
- package/build/cjs/lib/setup/setupList.js +78 -24
- package/build/cjs/lib/setup/setupList.js.map +3 -3
- package/build/cjs/lib/setup/setupMultihost.d.ts +7 -0
- package/build/cjs/lib/setup/setupMultihost.js +78 -11
- package/build/cjs/lib/setup/setupMultihost.js.map +3 -3
- package/build/cjs/lib/setup/setupPacketManager.d.ts +10 -0
- package/build/cjs/lib/setup/setupPacketManager.js +16 -6
- package/build/cjs/lib/setup/setupPacketManager.js.map +2 -2
- package/build/cjs/lib/setup/setupRepo.d.ts +19 -0
- package/build/cjs/lib/setup/setupRepo.js +141 -13
- package/build/cjs/lib/setup/setupRepo.js.map +2 -2
- package/build/cjs/lib/setup/setupSetup.d.ts +34 -0
- package/build/cjs/lib/setup/setupSetup.js +209 -35
- package/build/cjs/lib/setup/setupSetup.js.map +3 -3
- package/build/cjs/lib/setup/setupUpgrade.d.ts +13 -2
- package/build/cjs/lib/setup/setupUpgrade.js +72 -12
- package/build/cjs/lib/setup/setupUpgrade.js.map +2 -2
- package/build/cjs/lib/setup/setupUpload.d.ts +77 -1
- package/build/cjs/lib/setup/setupUpload.js +152 -9
- package/build/cjs/lib/setup/setupUpload.js.map +2 -2
- package/build/cjs/lib/setup/setupUsers.d.ts +44 -14
- package/build/cjs/lib/setup/setupUsers.js +330 -17
- package/build/cjs/lib/setup/setupUsers.js.map +2 -2
- package/build/cjs/lib/setup/setupVendor.d.ts +14 -1
- package/build/cjs/lib/setup/setupVendor.js +40 -8
- package/build/cjs/lib/setup/setupVendor.js.map +2 -2
- package/build/cjs/lib/setup/setupVisDebug.d.ts +16 -2
- package/build/cjs/lib/setup/setupVisDebug.js +41 -17
- package/build/cjs/lib/setup/setupVisDebug.js.map +3 -3
- package/build/cjs/lib/setup/utils.d.ts +1 -1
- package/build/cjs/lib/setup/utils.js +13 -9
- package/build/cjs/lib/setup/utils.js.map +3 -3
- package/build/cjs/lib/setup.d.ts +1 -1
- package/build/cjs/lib/setup.js +858 -1758
- package/build/cjs/lib/setup.js.map +3 -3
- package/build/esm/lib/_Types.d.ts +8 -1
- package/build/esm/lib/_Types.d.ts.map +1 -1
- package/build/esm/lib/cli/cliCert.d.ts +7 -4
- package/build/esm/lib/cli/cliCert.d.ts.map +1 -1
- package/build/esm/lib/cli/cliCert.js +6 -6
- package/build/esm/lib/cli/cliCert.js.map +1 -1
- package/build/esm/lib/cli/cliCommand.d.ts +63 -15
- package/build/esm/lib/cli/cliCommand.d.ts.map +1 -1
- package/build/esm/lib/cli/cliCommand.js +4 -1
- package/build/esm/lib/cli/cliCommand.js.map +1 -1
- package/build/esm/lib/cli/cliCompact.d.ts +5 -2
- package/build/esm/lib/cli/cliCompact.d.ts.map +1 -1
- package/build/esm/lib/cli/cliCompact.js +5 -2
- package/build/esm/lib/cli/cliCompact.js.map +1 -1
- package/build/esm/lib/cli/cliDebug.d.ts +5 -2
- package/build/esm/lib/cli/cliDebug.d.ts.map +1 -1
- package/build/esm/lib/cli/cliDebug.js +4 -1
- package/build/esm/lib/cli/cliDebug.js.map +1 -1
- package/build/esm/lib/cli/cliHost.d.ts +13 -10
- package/build/esm/lib/cli/cliHost.d.ts.map +1 -1
- package/build/esm/lib/cli/cliHost.js +8 -5
- package/build/esm/lib/cli/cliHost.js.map +1 -1
- package/build/esm/lib/cli/cliLogs.d.ts +9 -3
- package/build/esm/lib/cli/cliLogs.d.ts.map +1 -1
- package/build/esm/lib/cli/cliLogs.js +8 -1
- package/build/esm/lib/cli/cliLogs.js.map +1 -1
- package/build/esm/lib/cli/cliMessage.d.ts +2 -1
- package/build/esm/lib/cli/cliMessage.d.ts.map +1 -1
- package/build/esm/lib/cli/cliMessage.js +1 -0
- package/build/esm/lib/cli/cliMessage.js.map +1 -1
- package/build/esm/lib/cli/cliObjects.d.ts +21 -18
- package/build/esm/lib/cli/cliObjects.d.ts.map +1 -1
- package/build/esm/lib/cli/cliObjects.js +44 -38
- package/build/esm/lib/cli/cliObjects.js.map +1 -1
- package/build/esm/lib/cli/cliPlugin.d.ts +3 -3
- package/build/esm/lib/cli/cliPlugin.d.ts.map +1 -1
- package/build/esm/lib/cli/cliPlugin.js +1 -1
- package/build/esm/lib/cli/cliPlugin.js.map +1 -1
- package/build/esm/lib/cli/cliProcess.d.ts +17 -7
- package/build/esm/lib/cli/cliProcess.d.ts.map +1 -1
- package/build/esm/lib/cli/cliProcess.js +73 -12
- package/build/esm/lib/cli/cliProcess.js.map +1 -1
- package/build/esm/lib/cli/cliStates.d.ts +7 -4
- package/build/esm/lib/cli/cliStates.d.ts.map +1 -1
- package/build/esm/lib/cli/cliStates.js +6 -2
- package/build/esm/lib/cli/cliStates.js.map +1 -1
- package/build/esm/lib/progressBar.d.ts +59 -0
- package/build/esm/lib/progressBar.d.ts.map +1 -0
- package/build/esm/lib/progressBar.js +104 -0
- package/build/esm/lib/progressBar.js.map +1 -0
- package/build/esm/lib/setup/customError.d.ts +4 -0
- package/build/esm/lib/setup/customError.d.ts.map +1 -1
- package/build/esm/lib/setup/customError.js +3 -0
- package/build/esm/lib/setup/customError.js.map +1 -1
- package/build/esm/lib/setup/dbConnection.d.ts.map +1 -1
- package/build/esm/lib/setup/dbConnection.js +10 -13
- package/build/esm/lib/setup/dbConnection.js.map +1 -1
- package/build/esm/lib/setup/formatters.d.ts +4 -4
- package/build/esm/lib/setup/formatters.js +4 -4
- package/build/esm/lib/setup/pluginInfos.d.ts +5 -0
- package/build/esm/lib/setup/pluginInfos.d.ts.map +1 -1
- package/build/esm/lib/setup/pluginInfos.js +5 -0
- package/build/esm/lib/setup/pluginInfos.js.map +1 -1
- package/build/esm/lib/setup/setupBackup.d.ts +53 -0
- package/build/esm/lib/setup/setupBackup.d.ts.map +1 -1
- package/build/esm/lib/setup/setupBackup.js +132 -13
- package/build/esm/lib/setup/setupBackup.js.map +1 -1
- package/build/esm/lib/setup/setupInstall.d.ts +66 -15
- package/build/esm/lib/setup/setupInstall.d.ts.map +1 -1
- package/build/esm/lib/setup/setupInstall.js +309 -23
- package/build/esm/lib/setup/setupInstall.js.map +1 -1
- package/build/esm/lib/setup/setupLicense.d.ts +13 -0
- package/build/esm/lib/setup/setupLicense.d.ts.map +1 -1
- package/build/esm/lib/setup/setupLicense.js +31 -1
- package/build/esm/lib/setup/setupLicense.js.map +1 -1
- package/build/esm/lib/setup/setupList.d.ts +55 -1
- package/build/esm/lib/setup/setupList.d.ts.map +1 -1
- package/build/esm/lib/setup/setupList.js +61 -8
- package/build/esm/lib/setup/setupList.js.map +1 -1
- package/build/esm/lib/setup/setupMultihost.d.ts +7 -0
- package/build/esm/lib/setup/setupMultihost.d.ts.map +1 -1
- package/build/esm/lib/setup/setupMultihost.js +85 -6
- package/build/esm/lib/setup/setupMultihost.js.map +1 -1
- package/build/esm/lib/setup/setupPacketManager.d.ts +10 -0
- package/build/esm/lib/setup/setupPacketManager.d.ts.map +1 -1
- package/build/esm/lib/setup/setupPacketManager.js +9 -0
- package/build/esm/lib/setup/setupPacketManager.js.map +1 -1
- package/build/esm/lib/setup/setupRepo.d.ts +19 -0
- package/build/esm/lib/setup/setupRepo.d.ts.map +1 -1
- package/build/esm/lib/setup/setupRepo.js +164 -14
- package/build/esm/lib/setup/setupRepo.js.map +1 -1
- package/build/esm/lib/setup/setupSetup.d.ts +34 -0
- package/build/esm/lib/setup/setupSetup.d.ts.map +1 -1
- package/build/esm/lib/setup/setupSetup.js +218 -21
- package/build/esm/lib/setup/setupSetup.js.map +1 -1
- package/build/esm/lib/setup/setupUpgrade.d.ts +13 -2
- package/build/esm/lib/setup/setupUpgrade.d.ts.map +1 -1
- package/build/esm/lib/setup/setupUpgrade.js +70 -6
- package/build/esm/lib/setup/setupUpgrade.js.map +1 -1
- package/build/esm/lib/setup/setupUpload.d.ts +77 -1
- package/build/esm/lib/setup/setupUpload.d.ts.map +1 -1
- package/build/esm/lib/setup/setupUpload.js +164 -7
- package/build/esm/lib/setup/setupUpload.js.map +1 -1
- package/build/esm/lib/setup/setupUsers.d.ts +44 -14
- package/build/esm/lib/setup/setupUsers.d.ts.map +1 -1
- package/build/esm/lib/setup/setupUsers.js +346 -14
- package/build/esm/lib/setup/setupUsers.js.map +1 -1
- package/build/esm/lib/setup/setupVendor.d.ts +14 -1
- package/build/esm/lib/setup/setupVendor.d.ts.map +1 -1
- package/build/esm/lib/setup/setupVendor.js +33 -2
- package/build/esm/lib/setup/setupVendor.js.map +1 -1
- package/build/esm/lib/setup/setupVisDebug.d.ts +16 -2
- package/build/esm/lib/setup/setupVisDebug.d.ts.map +1 -1
- package/build/esm/lib/setup/setupVisDebug.js +39 -14
- package/build/esm/lib/setup/setupVisDebug.js.map +1 -1
- package/build/esm/lib/setup/utils.d.ts +1 -1
- package/build/esm/lib/setup/utils.d.ts.map +1 -1
- package/build/esm/lib/setup/utils.js +2 -4
- package/build/esm/lib/setup/utils.js.map +1 -1
- package/build/esm/lib/setup.d.ts +1 -1
- package/build/esm/lib/setup.d.ts.map +1 -1
- package/build/esm/lib/setup.js +959 -1910
- package/build/esm/lib/setup.js.map +1 -1
- package/build/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +14 -14
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/lib/setup/setupRepo.ts"],
|
|
4
|
-
"sourcesContent": ["import { tools, EXIT_CODES } from '@iobroker/js-controller-common';\nimport axios from 'axios';\nimport fs from 'fs-extra';\nimport type { Client as ObjectsRedisClient } from '@iobroker/db-objects-redis';\nimport type { Client as StatesRedisClient } from '@iobroker/db-states-redis';\nimport { BETA_REPO_URL, isIntegerLikeInput, isVersionIgnored, STABLE_REPO_URL } from '@/lib/setup/utils.js';\nimport path from 'node:path';\nimport { SYSTEM_CONFIG_ID, SYSTEM_REPOSITORIES_ID } from '@iobroker/js-controller-common-db/constants';\n\n/** The options passed to the Repo constructor */\nexport interface CLIRepoOptions {\n /** Instance of objects DB */\n objects: ObjectsRedisClient;\n /** Instance of states DB */\n states: StatesRedisClient;\n}\n\n/**\n * All possible Repo Flags which can be passed to the `show` method\n */\nexport interface RepoFlags {\n /** Also list not installed adapters */\n a?: boolean;\n /** Also list not installed adapters */\n all?: boolean;\n /** Only list updatable adapters */\n u?: boolean;\n /** Only list updatable adapters */\n updatable?: boolean;\n /** Force update even if hash hasn't changed */\n f?: boolean;\n /** Force update even if hash hasn't changed */\n force?: boolean;\n}\n\ntype RepoActiveInfo =\n | {\n /** If the repo is active */\n isActive: true;\n /** Name of the repository */\n name: string;\n }\n | {\n /** If the repo is active */\n isActive: false;\n };\n\ninterface RepoActiveOptions {\n /** Url to check if active */\n url: string;\n /** System config object */\n sysConfObj: ioBroker.SystemConfigObject;\n /** Repository object */\n repoObj: ioBroker.RepositoryObject;\n}\n\nexport class Repo {\n private readonly defaultSystemRepo: ioBroker.RepositoryObject;\n private readonly objects: ObjectsRedisClient;\n private readonly states: StatesRedisClient;\n private readonly controllerVersion: string;\n\n constructor(options: CLIRepoOptions) {\n if (!options?.objects) {\n throw new Error('Invalid arguments: objects is missing');\n }\n if (!options?.states) {\n throw new Error('Invalid arguments: states is missing');\n }\n\n const ioPackage = fs.readJSONSync(path.join(tools.getControllerDir(), 'io-package.json'));\n this.controllerVersion = ioPackage.common.version;\n\n this.objects = options.objects;\n this.states = options.states;\n\n this.defaultSystemRepo = {\n common: {\n name: 'System repositories',\n dontDelete: true,\n },\n native: {\n repositories: {\n stable: {\n link: STABLE_REPO_URL,\n json: null,\n },\n beta: {\n link: BETA_REPO_URL,\n json: null,\n },\n },\n },\n _id: SYSTEM_REPOSITORIES_ID,\n type: 'config',\n };\n }\n\n /**\n * Get the repository name by index\n * Throws if the index does not exist\n *\n * @param repoIndex repo name or index\n */\n async getNameByIndex(repoIndex: number): Promise<string> {\n const obj = await this.objects.getObject(SYSTEM_REPOSITORIES_ID);\n if (!obj?.native?.repositories) {\n throw new Error('No repositories setup!');\n }\n\n const repoNames = Object.keys(obj.native.repositories);\n if (!repoNames[repoIndex]) {\n throw new Error(`No repository for index \"${repoIndex}\" found`);\n }\n\n return repoNames[repoIndex];\n }\n\n /**\n * Update the given repository and returns new repo content\n *\n * @param repoName name of the repository\n * @param force force update even if same hash\n * @param systemConfig content of `system.config` object\n * @param systemRepos content of `system.repositories` object\n */\n private async updateRepo(\n repoName: string,\n force: boolean | undefined,\n systemConfig?: ioBroker.OtherObject,\n systemRepos?: ioBroker.RepositoryObject,\n ): Promise<null | ioBroker.RepositoryJson> {\n if (!repoName) {\n const sysConfig = systemConfig || (await this.objects.getObject(SYSTEM_CONFIG_ID));\n repoName = sysConfig!.common.activeRepo;\n }\n\n const oldRepos = systemRepos || (await this.objects.getObject(SYSTEM_REPOSITORIES_ID));\n if (!oldRepos?.native.repositories?.[repoName]) {\n console.log(`Error: repository \"${repoName}\" not found in the \"${SYSTEM_REPOSITORIES_ID}\"`);\n return null;\n }\n\n const urlOrPath = oldRepos.native.repositories[repoName].link;\n const hashUrl = urlOrPath.replace(/\\.json$/, '-hash.json');\n let hash;\n\n if (\n !force &&\n oldRepos.native.repositories[repoName].hash &&\n oldRepos.native.repositories[repoName].json &&\n (urlOrPath.startsWith('http://') || urlOrPath.startsWith('https://'))\n ) {\n try {\n hash = await axios({ url: hashUrl, timeout: 10_000 });\n } catch (e) {\n console.error(`Cannot download repository hash file from \"${hashUrl}\": ${e.message}`);\n }\n if (hash?.data && oldRepos.native.repositories[repoName].hash === hash.data.hash) {\n return oldRepos.native.repositories[repoName].json;\n }\n }\n\n let data;\n\n if (urlOrPath.startsWith('http://') || urlOrPath.startsWith('https://')) {\n if (!hash) {\n try {\n hash = await axios({ url: hashUrl, timeout: 10000 });\n } catch (e) {\n console.error(`Cannot download repository hash file from \"${hashUrl}\": ${e.message}`);\n }\n }\n\n const agent = `${tools.appName}, RND: CLI, Node:${process.version}, V:${this.controllerVersion}`;\n try {\n data = await axios({\n url: urlOrPath,\n timeout: 10_000,\n headers: { 'User-Agent': agent },\n });\n if (data.data) {\n data = data.data;\n } else {\n data = null;\n }\n } catch (e) {\n console.error(`Cannot download repository file from \"${urlOrPath}\": ${e.message}`);\n data = null;\n }\n } else {\n if (fs.existsSync(urlOrPath)) {\n try {\n data = JSON.parse(fs.readFileSync(urlOrPath).toString('utf8'));\n } catch (err) {\n console.error(`Error: Cannot read or parse file \"${urlOrPath}\": ${err.message}`);\n }\n } else {\n console.error(`Error: Cannot find file \"${urlOrPath}\"`);\n }\n }\n\n let changed;\n if (data) {\n oldRepos.native.repositories[repoName].json = data;\n changed = true;\n }\n if (hash?.data) {\n oldRepos.native.repositories[repoName].hash = hash.data.hash;\n changed = true;\n }\n if (changed) {\n oldRepos.from = `system.host.${tools.getHostName()}.cli`;\n oldRepos.ts = Date.now();\n await this.objects.setObject(SYSTEM_REPOSITORIES_ID, oldRepos);\n }\n\n return oldRepos.native.repositories[repoName].json;\n }\n\n /**\n * Show repo on CLI\n *\n * @param repoUrl url of the repository\n * @param flags CLI flags\n */\n async showRepo(repoUrl: string | string[], flags: RepoFlags): Promise<void> {\n // Get the repositories\n const systemConfig = await this.objects.getObject(SYSTEM_CONFIG_ID);\n const systemRepos = await this.objects.getObject(SYSTEM_REPOSITORIES_ID);\n if (!systemConfig) {\n console.error(`Error: Object \"${SYSTEM_CONFIG_ID}\" not found`);\n } else if (!systemRepos) {\n console.error(`Error: Object \"${SYSTEM_REPOSITORIES_ID}\" not found`);\n } else if (!systemRepos.native || !systemRepos.native.repositories) {\n console.error(`Error: no repositories found in the \"${SYSTEM_REPOSITORIES_ID}\"`);\n } else {\n repoUrl = repoUrl || systemConfig.common.activeRepo;\n\n if (!Array.isArray(repoUrl)) {\n repoUrl = [repoUrl];\n }\n\n console.log(`Used ${repoUrl.length > 1 ? 'repositories' : 'repository'}: ${repoUrl.join(', ')}`);\n\n const allSources = {};\n\n for (const url of repoUrl) {\n const repo = systemRepos.native.repositories[url];\n // If known repository\n if (repo) {\n if (typeof repo === 'string') {\n systemRepos.native.repositories[url] = {\n link: repo,\n json: null,\n hash: '',\n };\n }\n\n const sources = await this.updateRepo(url, flags.force || flags.f, systemConfig, systemRepos);\n sources && Object.assign(allSources, sources);\n } else {\n console.error(\n `Error: unknown repository is active - \"${url}\". Known: ${Object.keys(\n systemRepos.native.repositories,\n ).join(', ')}`,\n );\n }\n }\n\n try {\n // update variables of every admin instance\n await this.updateInfo(allSources);\n } catch {\n // not important if fails\n }\n\n return this.showRepoResult(allSources, flags);\n }\n }\n\n /**\n * Show the repo result on CLI\n *\n * @param sources Repo JSON sources\n * @param flags CLI flags\n */\n private async showRepoResult(sources: Record<string, any>, flags: RepoFlags): Promise<void> {\n const installed = tools.getInstalledInfo();\n const adapters = Object.keys(sources).sort();\n\n for (const name of adapters) {\n let updatable = false;\n let text = sources[name].controller ? 'Controller ' : 'Adapter ';\n text += `\"${name}\"`;\n text = text.padEnd(11 + 15);\n\n if (sources[name].version) {\n text += `: ${sources[name].version}`;\n }\n text = text.padEnd(11 + 15 + 11);\n\n if (!(flags.all || flags.a) && !installed[name]) {\n continue;\n }\n\n if (installed[name]?.version) {\n text += `, installed ${installed[name].version}`;\n try {\n // tools.upToDate can throw if a version is invalid\n if (\n sources[name].version !== installed[name].version &&\n sources[name].version &&\n !tools.upToDate(sources[name].version, installed[name].version)\n ) {\n updatable = true;\n text = text.padEnd(11 + 15 + 11 + 18);\n const isIgnored = await isVersionIgnored({\n adapterName: name,\n objects: this.objects,\n version: sources[name].version,\n });\n\n text += isIgnored ? ' [Ignored]' : ' [Updatable]';\n }\n } catch (e) {\n console.error(`Cannot determine update info of \"${name}\": ${e.message}`);\n }\n }\n if ((flags.updatable || flags.u) && !updatable) {\n continue;\n }\n console.log(text);\n }\n }\n\n /**\n * Update Admin info states with number of updates\n *\n * @param sources the repository object\n */\n private async updateInfo(sources: Record<string, any>): Promise<void> {\n const installed = tools.getInstalledInfo();\n const list: string[] = [];\n\n for (const name of Object.keys(sources)) {\n if (installed[name] && installed[name].version && sources[name].version) {\n try {\n // tools.upToDate can throw if a version is invalid\n if (\n sources[name].version !== installed[name].version &&\n !tools.upToDate(sources[name].version, installed[name].version)\n ) {\n // remove the first part of the name\n const n = name.indexOf('.');\n list.push(n === -1 ? name : name.substring(n + 1));\n }\n } catch (e) {\n console.error(`Cannot determine update info of \"${name}\": ${e.message}`);\n }\n }\n }\n\n const objs = await this.objects.getObjectViewAsync('system', 'instance', {\n startkey: 'system.adapter.admin',\n endkey: 'system.adapter.admin\\u9999',\n });\n\n if (objs?.rows?.length) {\n const listStr = list.join(', ');\n for (const row of objs.rows) {\n if (row?.value?.type === 'instance') {\n await this.states.setState(`${row.id}.info.updatesNumber`, { val: list.length, ack: true });\n await this.states.setState(`${row.id}.info.updatesList`, { val: listStr, ack: true });\n }\n }\n }\n }\n\n /**\n * Show the current status of Repo on CLI\n */\n async showRepoStatus(): Promise<number> {\n try {\n const obj = await this.objects.getObject(SYSTEM_REPOSITORIES_ID);\n const objCfg = await this.objects.getObject(SYSTEM_CONFIG_ID);\n\n if (!obj) {\n console.error('List is empty');\n return EXIT_CODES.CANNOT_GET_REPO_LIST;\n } else if (obj.native.repositories) {\n console.table(\n Object.entries(obj.native.repositories).map(([key, value]) => {\n return {\n name: key,\n url: value.link,\n 'auto upgrade': objCfg?.common.adapterAutoUpgrade?.repositories[key] ?? false,\n };\n }),\n );\n\n if (objCfg?.common) {\n let activeRepo = objCfg.common.activeRepo;\n if (typeof activeRepo === 'string') {\n activeRepo = [activeRepo];\n }\n console.log(`\\nActive repo(s): ${activeRepo.join(', ')}`);\n console.log(`Upgrade policy: ${objCfg.common.adapterAutoUpgrade?.defaultPolicy ?? 'none'}`);\n }\n } else {\n console.error('List is empty');\n return EXIT_CODES.CANNOT_GET_REPO_LIST;\n }\n } catch (err) {\n console.error(`Cannot get list: ${err}`);\n }\n return EXIT_CODES.CANNOT_GET_REPO_LIST;\n }\n\n /**\n * Add new repo\n *\n * @param repoName name of new repo\n * @param repoUrl url of new repo\n */\n async add(repoName: string, repoUrl: string): Promise<void> {\n const sysRepoObj = await this.objects.getObject(SYSTEM_REPOSITORIES_ID);\n const obj = sysRepoObj || this.defaultSystemRepo;\n\n if (obj.native.repositories[repoName]) {\n throw new Error(`Repository \"${repoName}\" yet exists: ${obj.native.repositories[repoName].link}`);\n } else {\n if (isIntegerLikeInput(repoName)) {\n throw new Error(\n `Invalid name \"${repoName}\"! A repository name is not allowed to contain only numbers.`,\n );\n }\n\n obj.native.repositories[repoName] = {\n link: repoUrl,\n json: null,\n };\n obj.from = `system.host.${tools.getHostName()}.cli`;\n obj.ts = Date.now();\n await this.objects.setObject(SYSTEM_REPOSITORIES_ID, obj);\n }\n }\n\n /**\n * Remove repository from sources\n *\n * @param repoName name of repository to remove\n */\n async del(repoName: string): Promise<void> {\n const obj = await this.objects.getObject(SYSTEM_CONFIG_ID);\n if (\n (obj?.common.activeRepo &&\n typeof obj.common.activeRepo === 'string' &&\n obj.common.activeRepo === repoName) ||\n (obj?.common.activeRepo && Array.isArray(obj.common.activeRepo) && obj.common.activeRepo.includes(repoName))\n ) {\n throw new Error(`Cannot delete active repository: ${repoName}`);\n } else {\n const repoObj = await this.objects.getObject(SYSTEM_REPOSITORIES_ID);\n if (repoObj) {\n if (!repoObj.native.repositories[repoName]) {\n throw new Error(`Repository \"${repoName}\" not found.`);\n } else {\n delete repoObj.native.repositories[repoName];\n repoObj.from = `system.host.${tools.getHostName()}.cli`;\n repoObj.ts = Date.now();\n await this.objects.setObject(SYSTEM_REPOSITORIES_ID, repoObj);\n }\n }\n }\n }\n\n /**\n * Checks if stable repo is active\n *\n * @param options the system config object and the repository object\n */\n private getRepoActiveInfo(options: RepoActiveOptions): RepoActiveInfo {\n const { repoObj, sysConfObj, url } = options;\n\n const name = sysConfObj.common.activeRepo.find(\n activeRepo => repoObj.native.repositories[activeRepo].link === url,\n );\n\n return name ? { isActive: true, name } : { isActive: false };\n }\n\n /**\n * Set specific repo as active one\n *\n * @param repoName name of the repository to activate\n */\n async setActive(repoName: string): Promise<void> {\n const sysRepoObj = await this.objects.getObject(SYSTEM_REPOSITORIES_ID);\n const obj = sysRepoObj || this.defaultSystemRepo;\n\n if (!obj.native.repositories[repoName]) {\n throw new Error(`Repository \"${repoName}\" not found.`);\n }\n\n const confObj = await this.objects.getObject(SYSTEM_CONFIG_ID);\n if (typeof confObj?.common.activeRepo === 'string') {\n confObj.common.activeRepo = [confObj.common.activeRepo];\n }\n\n if (!confObj || confObj.common.activeRepo.includes(repoName)) {\n return;\n }\n\n confObj.common.activeRepo.push(repoName);\n\n const stableInfo = this.getRepoActiveInfo({\n url: STABLE_REPO_URL,\n sysConfObj: confObj,\n repoObj: obj,\n });\n\n const betaInfo = this.getRepoActiveInfo({\n url: BETA_REPO_URL,\n sysConfObj: confObj,\n repoObj: obj,\n });\n\n if (stableInfo.isActive && betaInfo.isActive) {\n const posStable = confObj.common.activeRepo.indexOf(stableInfo.name);\n const posBeta = confObj.common.activeRepo.indexOf(betaInfo.name);\n\n if (posStable < posBeta) {\n // put beta in front of stable, so stable will override adapters\n confObj.common.activeRepo.splice(posBeta, 1);\n confObj.common.activeRepo.splice(posStable, 0, betaInfo.name);\n console.info(\n `Ensured that stable repository \"${stableInfo.name}\" has priority over beta repository \"${betaInfo.name}\"`,\n );\n }\n }\n\n if (confObj.common.activeRepo.length > 1) {\n console.info('More than one repository is active. Please be sure, that this is a desired constellation!');\n }\n\n confObj.from = `system.host.${tools.getHostName()}.cli`;\n confObj.ts = Date.now();\n await this.objects.setObject(SYSTEM_CONFIG_ID, confObj);\n }\n\n /**\n * Set given repo as inactive\n *\n * @param repoName name of the repository\n */\n async setInactive(repoName: string): Promise<void> {\n const confObj = (await this.objects.getObject(SYSTEM_CONFIG_ID))!;\n if (typeof confObj?.common.activeRepo === 'string') {\n confObj.common.activeRepo = [confObj.common.activeRepo];\n }\n\n const pos = confObj.common.activeRepo.indexOf(repoName);\n if (pos !== -1) {\n confObj.common.activeRepo.splice(pos, 1);\n confObj.from = `system.host.${tools.getHostName()}.cli`;\n confObj.ts = Date.now();\n await this.objects.setObject(SYSTEM_CONFIG_ID, confObj);\n }\n }\n\n /**\n * Renames existing repository if old name and link matches, renaming will not be performed if a repo with the new name already exists\n *\n * @param oldName - name of the current repository\n * @param newName - target name\n * @param repoUrl - hyperlink of the repository\n */\n async rename(oldName: string, newName: string, repoUrl: string): Promise<void> {\n let repoObj;\n let sysConfigObj;\n try {\n sysConfigObj = await this.objects.getObject(SYSTEM_CONFIG_ID);\n repoObj = await this.objects.getObject(SYSTEM_REPOSITORIES_ID);\n } catch (err) {\n throw new Error(`Could not rename repository \"${oldName}\" to \"${newName}\": ${err.message}`);\n }\n\n if (isIntegerLikeInput(newName)) {\n throw new Error(`Invalid name \"${newName}\"! A repository name is not allowed to contain only numbers.`);\n }\n\n if (!repoObj) {\n return;\n }\n\n if (\n repoObj.native.repositories[oldName] &&\n repoObj.native.repositories[oldName].link === repoUrl &&\n !repoObj.native.repositories[newName]\n ) {\n repoObj.native.repositories[newName] = repoObj.native.repositories[oldName];\n delete repoObj.native.repositories[oldName];\n\n try {\n await this.objects.setObject(SYSTEM_REPOSITORIES_ID, repoObj);\n console.log(`Renamed repository \"${oldName} to \"${newName}\"`);\n } catch (e) {\n throw new Error(`Could not rename repository \"${oldName}\" to \"${newName}\": ${e.message}`);\n }\n\n // if we changed the name of the activeRepo, we should set newName as active repo\n if (\n sysConfigObj?.common &&\n ((typeof sysConfigObj.common.activeRepo === 'string' && sysConfigObj.common.activeRepo === oldName) ||\n (Array.isArray(sysConfigObj.common.activeRepo) && sysConfigObj.common.activeRepo.includes(oldName)))\n ) {\n if (typeof sysConfigObj.common.activeRepo === 'string') {\n sysConfigObj.common.activeRepo = [sysConfigObj.common.activeRepo];\n }\n const pos = sysConfigObj.common.activeRepo.indexOf(oldName);\n sysConfigObj.common.activeRepo.splice(pos, 1, newName);\n\n try {\n await this.objects.setObject(SYSTEM_CONFIG_ID, sysConfigObj);\n } catch (e) {\n throw new Error(`Could not set \"${newName}\" as active repository: ${e.message}`);\n }\n }\n }\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import axios from 'axios';\nimport fs from 'fs-extra';\nimport path from 'node:path';\n\nimport { tools, EXIT_CODES } from '@iobroker/js-controller-common';\nimport type { Client as ObjectsRedisClient } from '@iobroker/db-objects-redis';\nimport type { Client as StatesRedisClient } from '@iobroker/db-states-redis';\nimport { SYSTEM_CONFIG_ID, SYSTEM_REPOSITORIES_ID } from '@iobroker/js-controller-common-db/constants';\nimport { BETA_REPO_URL, isIntegerLikeInput, isVersionIgnored, STABLE_REPO_URL } from '@/lib/setup/utils.js';\nimport type { ProcessCommandOptions } from '@/lib/cli/cliCommand.js';\nimport { dbConnect, dbConnectAsync } from '@/lib/setup/dbConnection.js';\n\n/** The options passed to the Repo constructor */\nexport interface CLIRepoOptions {\n /** Instance of objects DB */\n objects: ObjectsRedisClient;\n /** Instance of states DB */\n states: StatesRedisClient;\n}\n\n/**\n * All possible Repo Flags which can be passed to the `show` method\n */\nexport interface RepoFlags {\n /** Also list not installed adapters */\n a?: boolean;\n /** Also list not installed adapters */\n all?: boolean;\n /** Only list updatable adapters */\n u?: boolean;\n /** Only list updatable adapters */\n updatable?: boolean;\n /** Force update even if hash hasn't changed */\n f?: boolean;\n /** Force update even if hash hasn't changed */\n force?: boolean;\n}\n\ntype RepoActiveInfo =\n | {\n /** If the repo is active */\n isActive: true;\n /** Name of the repository */\n name: string;\n }\n | {\n /** If the repo is active */\n isActive: false;\n };\n\ninterface RepoActiveOptions {\n /** Url to check if active */\n url: string;\n /** System config object */\n sysConfObj: ioBroker.SystemConfigObject;\n /** Repository object */\n repoObj: ioBroker.RepositoryObject;\n}\n\n/**\n * CLI command to manage the ioBroker repositories\n */\nexport class Repo {\n private readonly defaultSystemRepo: ioBroker.RepositoryObject;\n private readonly objects: ObjectsRedisClient;\n private readonly states: StatesRedisClient;\n private readonly controllerVersion: string;\n\n /**\n * @param options The objects/states clients and the controller version\n */\n constructor(options: CLIRepoOptions) {\n if (!options?.objects) {\n throw new Error('Invalid arguments: objects is missing');\n }\n if (!options?.states) {\n throw new Error('Invalid arguments: states is missing');\n }\n\n const ioPackage = fs.readJSONSync(path.join(tools.getControllerDir(), 'io-package.json'));\n this.controllerVersion = ioPackage.common.version;\n\n this.objects = options.objects;\n this.states = options.states;\n\n this.defaultSystemRepo = {\n common: {\n name: 'System repositories',\n dontDelete: true,\n },\n native: {\n repositories: {\n stable: {\n link: STABLE_REPO_URL,\n json: null,\n },\n beta: {\n link: BETA_REPO_URL,\n json: null,\n },\n },\n },\n _id: SYSTEM_REPOSITORIES_ID,\n type: 'config',\n };\n }\n\n /**\n * Get the repository name by index\n * Throws if the index does not exist\n *\n * @param repoIndex repo name or index\n */\n async getNameByIndex(repoIndex: number): Promise<string> {\n const obj = await this.objects.getObject(SYSTEM_REPOSITORIES_ID);\n if (!obj?.native?.repositories) {\n throw new Error('No repositories setup!');\n }\n\n const repoNames = Object.keys(obj.native.repositories);\n if (!repoNames[repoIndex]) {\n throw new Error(`No repository for index \"${repoIndex}\" found`);\n }\n\n return repoNames[repoIndex];\n }\n\n /**\n * Update the given repository and returns new repo content\n *\n * @param repoName name of the repository\n * @param force force update even if same hash\n * @param systemConfig content of `system.config` object\n * @param systemRepos content of `system.repositories` object\n */\n private async updateRepo(\n repoName: string,\n force: boolean | undefined,\n systemConfig?: ioBroker.OtherObject,\n systemRepos?: ioBroker.RepositoryObject,\n ): Promise<null | ioBroker.RepositoryJson> {\n if (!repoName) {\n const sysConfig = systemConfig || (await this.objects.getObject(SYSTEM_CONFIG_ID));\n repoName = sysConfig!.common.activeRepo;\n }\n\n const oldRepos = systemRepos || (await this.objects.getObject(SYSTEM_REPOSITORIES_ID));\n if (!oldRepos?.native.repositories?.[repoName]) {\n console.log(`Error: repository \"${repoName}\" not found in the \"${SYSTEM_REPOSITORIES_ID}\"`);\n return null;\n }\n\n const urlOrPath = oldRepos.native.repositories[repoName].link;\n const hashUrl = urlOrPath.replace(/\\.json$/, '-hash.json');\n let hash;\n\n if (\n !force &&\n oldRepos.native.repositories[repoName].hash &&\n oldRepos.native.repositories[repoName].json &&\n (urlOrPath.startsWith('http://') || urlOrPath.startsWith('https://'))\n ) {\n try {\n hash = await axios({ url: hashUrl, timeout: 10_000 });\n } catch (e) {\n console.error(`Cannot download repository hash file from \"${hashUrl}\": ${e.message}`);\n }\n if (hash?.data && oldRepos.native.repositories[repoName].hash === hash.data.hash) {\n return oldRepos.native.repositories[repoName].json;\n }\n }\n\n let data;\n\n if (urlOrPath.startsWith('http://') || urlOrPath.startsWith('https://')) {\n if (!hash) {\n try {\n hash = await axios({ url: hashUrl, timeout: 10000 });\n } catch (e) {\n console.error(`Cannot download repository hash file from \"${hashUrl}\": ${e.message}`);\n }\n }\n\n const agent = `${tools.appName}, RND: CLI, Node:${process.version}, V:${this.controllerVersion}`;\n try {\n data = await axios({\n url: urlOrPath,\n timeout: 10_000,\n headers: { 'User-Agent': agent },\n });\n if (data.data) {\n data = data.data;\n } else {\n data = null;\n }\n } catch (e) {\n console.error(`Cannot download repository file from \"${urlOrPath}\": ${e.message}`);\n data = null;\n }\n } else {\n if (fs.existsSync(urlOrPath)) {\n try {\n data = JSON.parse(fs.readFileSync(urlOrPath).toString('utf8'));\n } catch (err) {\n console.error(`Error: Cannot read or parse file \"${urlOrPath}\": ${err.message}`);\n }\n } else {\n console.error(`Error: Cannot find file \"${urlOrPath}\"`);\n }\n }\n\n let changed;\n if (data) {\n oldRepos.native.repositories[repoName].json = data;\n changed = true;\n }\n if (hash?.data) {\n oldRepos.native.repositories[repoName].hash = hash.data.hash;\n changed = true;\n }\n if (changed) {\n oldRepos.from = `system.host.${tools.getHostName()}.cli`;\n oldRepos.ts = Date.now();\n await this.objects.setObject(SYSTEM_REPOSITORIES_ID, oldRepos);\n }\n\n return oldRepos.native.repositories[repoName].json;\n }\n\n /**\n * Show repo on CLI\n *\n * @param repoUrl url of the repository\n * @param flags CLI flags\n */\n async showRepo(repoUrl: string | string[], flags: RepoFlags): Promise<void> {\n // Get the repositories\n const systemConfig = await this.objects.getObject(SYSTEM_CONFIG_ID);\n const systemRepos = await this.objects.getObject(SYSTEM_REPOSITORIES_ID);\n if (!systemConfig) {\n console.error(`Error: Object \"${SYSTEM_CONFIG_ID}\" not found`);\n } else if (!systemRepos) {\n console.error(`Error: Object \"${SYSTEM_REPOSITORIES_ID}\" not found`);\n } else if (!systemRepos.native || !systemRepos.native.repositories) {\n console.error(`Error: no repositories found in the \"${SYSTEM_REPOSITORIES_ID}\"`);\n } else {\n repoUrl = repoUrl || systemConfig.common.activeRepo;\n\n if (!Array.isArray(repoUrl)) {\n repoUrl = [repoUrl];\n }\n\n console.log(`Used ${repoUrl.length > 1 ? 'repositories' : 'repository'}: ${repoUrl.join(', ')}`);\n\n const allSources: ioBroker.RepositoryJson = {} as ioBroker.RepositoryJson;\n\n for (const url of repoUrl) {\n const repo = systemRepos.native.repositories[url];\n // If known repository\n if (repo) {\n if (typeof repo === 'string') {\n systemRepos.native.repositories[url] = {\n link: repo,\n json: null,\n hash: '',\n };\n }\n\n const sources = await this.updateRepo(url, flags.force || flags.f, systemConfig, systemRepos);\n if (sources) {\n Object.assign(allSources, sources);\n }\n } else {\n console.error(\n `Error: unknown repository is active - \"${url}\". Known: ${Object.keys(\n systemRepos.native.repositories,\n ).join(', ')}`,\n );\n }\n }\n\n try {\n // update variables of every admin instance\n await this.updateInfo(allSources);\n } catch {\n // not important if fails\n }\n\n return this.showRepoResult(allSources, flags);\n }\n }\n\n /**\n * Show the repo result on CLI\n *\n * @param sources Repo JSON sources\n * @param flags CLI flags\n */\n private async showRepoResult(sources: ioBroker.RepositoryJson, flags: RepoFlags): Promise<void> {\n const installed = tools.getInstalledInfo();\n const adapters = Object.keys(sources).sort();\n\n for (const name of adapters) {\n let updatable = false;\n if (name === 'repoInfo') {\n continue;\n }\n const adapter = sources[name] as ioBroker.RepositoryJsonAdapterContent;\n let text = adapter.controller ? 'Controller ' : 'Adapter ';\n text += `\"${name}\"`;\n text = text.padEnd(11 + 15);\n\n if (adapter.version) {\n text += `: ${adapter.version}`;\n }\n text = text.padEnd(11 + 15 + 11);\n\n if (!(flags.all || flags.a) && !installed[name]) {\n continue;\n }\n\n if (installed[name]?.version) {\n text += `, installed ${installed[name].version}`;\n try {\n // tools.upToDate can throw if a version is invalid\n if (\n adapter.version !== installed[name].version &&\n adapter.version &&\n !tools.upToDate(adapter.version, installed[name].version)\n ) {\n updatable = true;\n text = text.padEnd(11 + 15 + 11 + 18);\n const isIgnored = await isVersionIgnored({\n adapterName: name,\n objects: this.objects,\n version: adapter.version,\n });\n\n text += isIgnored ? ' [Ignored]' : ' [Updatable]';\n }\n } catch (e) {\n console.error(`Cannot determine update info of \"${name}\": ${e.message}`);\n }\n }\n if ((flags.updatable || flags.u) && !updatable) {\n continue;\n }\n console.log(text);\n }\n }\n\n /**\n * Update Admin info states with number of updates\n *\n * @param sources the repository object\n */\n private async updateInfo(sources: ioBroker.RepositoryJson): Promise<void> {\n const installed = tools.getInstalledInfo();\n const list: string[] = [];\n\n for (const name in sources) {\n if (name === 'repoInfo') {\n continue;\n }\n const adapter = sources[name] as ioBroker.RepositoryJsonAdapterContent;\n if (installed[name]?.version && adapter.version) {\n try {\n // tools.upToDate can throw if a version is invalid\n if (\n adapter.version !== installed[name].version &&\n !tools.upToDate(adapter.version, installed[name].version)\n ) {\n // remove the first part of the name\n const n = name.indexOf('.');\n list.push(n === -1 ? name : name.substring(n + 1));\n }\n } catch (e) {\n console.error(`Cannot determine update info of \"${name}\": ${e.message}`);\n }\n }\n }\n\n const objs = await this.objects.getObjectViewAsync('system', 'instance', {\n startkey: 'system.adapter.admin',\n endkey: 'system.adapter.admin\\u9999',\n });\n\n if (objs?.rows?.length) {\n const listStr = list.join(', ');\n for (const row of objs.rows) {\n if (row?.value?.type === 'instance') {\n await this.states.setState(`${row.id}.info.updatesNumber`, { val: list.length, ack: true });\n await this.states.setState(`${row.id}.info.updatesList`, { val: listStr, ack: true });\n }\n }\n }\n }\n\n /**\n * Show the current status of Repo on CLI\n */\n async showRepoStatus(): Promise<number> {\n try {\n const obj = await this.objects.getObject(SYSTEM_REPOSITORIES_ID);\n const objCfg = await this.objects.getObject(SYSTEM_CONFIG_ID);\n\n if (!obj) {\n console.error('List is empty');\n return EXIT_CODES.CANNOT_GET_REPO_LIST;\n } else if (obj.native.repositories) {\n console.table(\n Object.entries(obj.native.repositories).map(([key, value]) => {\n return {\n name: key,\n url: value.link,\n 'auto upgrade': objCfg?.common.adapterAutoUpgrade?.repositories[key] ?? false,\n };\n }),\n );\n\n if (objCfg?.common) {\n let activeRepo = objCfg.common.activeRepo;\n if (typeof activeRepo === 'string') {\n activeRepo = [activeRepo];\n }\n console.log(`\\nActive repo(s): ${activeRepo.join(', ')}`);\n console.log(`Upgrade policy: ${objCfg.common.adapterAutoUpgrade?.defaultPolicy ?? 'none'}`);\n }\n } else {\n console.error('List is empty');\n return EXIT_CODES.CANNOT_GET_REPO_LIST;\n }\n } catch (err) {\n console.error(`Cannot get list: ${err}`);\n }\n return EXIT_CODES.CANNOT_GET_REPO_LIST;\n }\n\n /**\n * Add new repo\n *\n * @param repoName name of new repo\n * @param repoUrl url of new repo\n */\n async add(repoName: string, repoUrl: string): Promise<void> {\n const sysRepoObj = await this.objects.getObject(SYSTEM_REPOSITORIES_ID);\n const obj = sysRepoObj || this.defaultSystemRepo;\n\n if (obj.native.repositories[repoName]) {\n throw new Error(`Repository \"${repoName}\" yet exists: ${obj.native.repositories[repoName].link}`);\n } else {\n if (isIntegerLikeInput(repoName)) {\n throw new Error(\n `Invalid name \"${repoName}\"! A repository name is not allowed to contain only numbers.`,\n );\n }\n\n obj.native.repositories[repoName] = {\n link: repoUrl,\n json: null,\n };\n obj.from = `system.host.${tools.getHostName()}.cli`;\n obj.ts = Date.now();\n await this.objects.setObject(SYSTEM_REPOSITORIES_ID, obj);\n }\n }\n\n /**\n * Remove repository from sources\n *\n * @param repoName name of repository to remove\n */\n async del(repoName: string): Promise<void> {\n const obj = await this.objects.getObject(SYSTEM_CONFIG_ID);\n if (\n (obj?.common.activeRepo &&\n typeof obj.common.activeRepo === 'string' &&\n obj.common.activeRepo === repoName) ||\n (obj?.common.activeRepo && Array.isArray(obj.common.activeRepo) && obj.common.activeRepo.includes(repoName))\n ) {\n throw new Error(`Cannot delete active repository: ${repoName}`);\n } else {\n const repoObj = await this.objects.getObject(SYSTEM_REPOSITORIES_ID);\n if (repoObj) {\n if (!repoObj.native.repositories[repoName]) {\n throw new Error(`Repository \"${repoName}\" not found.`);\n } else {\n delete repoObj.native.repositories[repoName];\n repoObj.from = `system.host.${tools.getHostName()}.cli`;\n repoObj.ts = Date.now();\n await this.objects.setObject(SYSTEM_REPOSITORIES_ID, repoObj);\n }\n }\n }\n }\n\n /**\n * Checks if stable repo is active\n *\n * @param options the system config object and the repository object\n */\n private getRepoActiveInfo(options: RepoActiveOptions): RepoActiveInfo {\n const { repoObj, sysConfObj, url } = options;\n\n const name = sysConfObj.common.activeRepo.find(\n activeRepo => repoObj.native.repositories[activeRepo].link === url,\n );\n\n return name ? { isActive: true, name } : { isActive: false };\n }\n\n /**\n * Set specific repo as active one\n *\n * @param repoName name of the repository to activate\n */\n async setActive(repoName: string): Promise<void> {\n const sysRepoObj = await this.objects.getObject(SYSTEM_REPOSITORIES_ID);\n const obj = sysRepoObj || this.defaultSystemRepo;\n\n if (!obj.native.repositories[repoName]) {\n throw new Error(`Repository \"${repoName}\" not found.`);\n }\n\n const confObj = await this.objects.getObject(SYSTEM_CONFIG_ID);\n if (typeof confObj?.common.activeRepo === 'string') {\n confObj.common.activeRepo = [confObj.common.activeRepo];\n }\n\n if (!confObj || confObj.common.activeRepo.includes(repoName)) {\n return;\n }\n\n confObj.common.activeRepo.push(repoName);\n\n const stableInfo = this.getRepoActiveInfo({\n url: STABLE_REPO_URL,\n sysConfObj: confObj,\n repoObj: obj,\n });\n\n const betaInfo = this.getRepoActiveInfo({\n url: BETA_REPO_URL,\n sysConfObj: confObj,\n repoObj: obj,\n });\n\n if (stableInfo.isActive && betaInfo.isActive) {\n const posStable = confObj.common.activeRepo.indexOf(stableInfo.name);\n const posBeta = confObj.common.activeRepo.indexOf(betaInfo.name);\n\n if (posStable < posBeta) {\n // put beta in front of stable, so stable will override adapters\n confObj.common.activeRepo.splice(posBeta, 1);\n confObj.common.activeRepo.splice(posStable, 0, betaInfo.name);\n console.info(\n `Ensured that stable repository \"${stableInfo.name}\" has priority over beta repository \"${betaInfo.name}\"`,\n );\n }\n }\n\n if (confObj.common.activeRepo.length > 1) {\n console.info('More than one repository is active. Please be sure, that this is a desired constellation!');\n }\n\n confObj.from = `system.host.${tools.getHostName()}.cli`;\n confObj.ts = Date.now();\n await this.objects.setObject(SYSTEM_CONFIG_ID, confObj);\n }\n\n /**\n * Set given repo as inactive\n *\n * @param repoName name of the repository\n */\n async setInactive(repoName: string): Promise<void> {\n const confObj = (await this.objects.getObject(SYSTEM_CONFIG_ID))!;\n if (typeof confObj?.common.activeRepo === 'string') {\n confObj.common.activeRepo = [confObj.common.activeRepo];\n }\n\n const pos = confObj.common.activeRepo.indexOf(repoName);\n if (pos !== -1) {\n confObj.common.activeRepo.splice(pos, 1);\n confObj.from = `system.host.${tools.getHostName()}.cli`;\n confObj.ts = Date.now();\n await this.objects.setObject(SYSTEM_CONFIG_ID, confObj);\n }\n }\n\n /**\n * Renames existing repository if old name and link matches, renaming will not be performed if a repo with the new name already exists\n *\n * @param oldName - name of the current repository\n * @param newName - target name\n * @param repoUrl - hyperlink of the repository\n */\n async rename(oldName: string, newName: string, repoUrl: string): Promise<void> {\n let repoObj;\n let sysConfigObj;\n try {\n sysConfigObj = await this.objects.getObject(SYSTEM_CONFIG_ID);\n repoObj = await this.objects.getObject(SYSTEM_REPOSITORIES_ID);\n } catch (err) {\n throw new Error(`Could not rename repository \"${oldName}\" to \"${newName}\": ${err.message}`);\n }\n\n if (isIntegerLikeInput(newName)) {\n throw new Error(`Invalid name \"${newName}\"! A repository name is not allowed to contain only numbers.`);\n }\n\n if (!repoObj) {\n return;\n }\n\n if (\n repoObj.native.repositories[oldName] &&\n repoObj.native.repositories[oldName].link === repoUrl &&\n !repoObj.native.repositories[newName]\n ) {\n repoObj.native.repositories[newName] = repoObj.native.repositories[oldName];\n delete repoObj.native.repositories[oldName];\n\n try {\n await this.objects.setObject(SYSTEM_REPOSITORIES_ID, repoObj);\n console.log(`Renamed repository \"${oldName} to \"${newName}\"`);\n } catch (e) {\n throw new Error(`Could not rename repository \"${oldName}\" to \"${newName}\": ${e.message}`);\n }\n\n // if we changed the name of the activeRepo, we should set newName as active repo\n if (\n sysConfigObj?.common &&\n ((typeof sysConfigObj.common.activeRepo === 'string' && sysConfigObj.common.activeRepo === oldName) ||\n (Array.isArray(sysConfigObj.common.activeRepo) && sysConfigObj.common.activeRepo.includes(oldName)))\n ) {\n if (typeof sysConfigObj.common.activeRepo === 'string') {\n sysConfigObj.common.activeRepo = [sysConfigObj.common.activeRepo];\n }\n const pos = sysConfigObj.common.activeRepo.indexOf(oldName);\n sysConfigObj.common.activeRepo.splice(pos, 1, newName);\n\n try {\n await this.objects.setObject(SYSTEM_CONFIG_ID, sysConfigObj);\n } catch (e) {\n throw new Error(`Could not set \"${newName}\" as active repository: ${e.message}`);\n }\n }\n }\n }\n}\n\n/**\n * Handles the `update` CLI command\n *\n * @param options the process command options\n */\nexport function processCommandUpdate(options: ProcessCommandOptions): void {\n const { args, params, callback } = options;\n\n const repoUrl = args[0]; // Repo url or name\n dbConnect(params, async ({ objects, states }) => {\n const repo = new Repo({\n objects,\n states,\n });\n\n await repo.showRepo(repoUrl, params);\n setTimeout(callback, 1_000);\n });\n}\n\n/**\n * Handles the `repo` CLI command\n *\n * @param options the process command options\n */\nexport async function processCommandRepo(options: ProcessCommandOptions): Promise<void> {\n const { args, params, callback } = options;\n\n let repoUrlOrCommand: string | undefined = args[0]; // Repo url or name or \"add\" / \"del\" / \"set\" / \"show\" / \"addset\" / \"unset\"\n let repoName: string | undefined = args[1]; // Repo url or name\n let repoUrl: string | undefined = args[2]; // Repo url or name\n if (\n repoUrlOrCommand !== 'add' &&\n repoUrlOrCommand !== 'del' &&\n repoUrlOrCommand !== 'set' &&\n repoUrlOrCommand !== 'show' &&\n repoUrlOrCommand !== 'addset' &&\n repoUrlOrCommand !== 'unset'\n ) {\n repoUrl = repoUrlOrCommand;\n repoUrlOrCommand = 'show';\n }\n\n const { objects, states } = await dbConnectAsync(false, params);\n const repo = new Repo({\n objects,\n states,\n });\n\n if (repoUrlOrCommand === 'show') {\n try {\n await repo.showRepoStatus();\n return void callback();\n } catch (e) {\n console.error(`Cannot show repository status: ${e.message}`);\n return void callback(EXIT_CODES.INVALID_REPO);\n }\n }\n\n if (\n repoUrlOrCommand === 'add' ||\n repoUrlOrCommand === 'del' ||\n repoUrlOrCommand === 'set' ||\n repoUrlOrCommand === 'addset' ||\n repoUrlOrCommand === 'unset'\n ) {\n if (!repoName || !repoName.match(/[-_\\w]+/)) {\n console.error(`Invalid repository name: \"${repoName}\"`);\n return void callback(EXIT_CODES.INVALID_ARGUMENTS);\n }\n\n if (isIntegerLikeInput(repoName)) {\n try {\n repoName = await repo.getNameByIndex(parseInt(repoName));\n } catch (e) {\n console.error(e.message);\n return void callback(EXIT_CODES.INVALID_ARGUMENTS);\n }\n }\n\n if (repoUrlOrCommand === 'add' || repoUrlOrCommand === 'addset') {\n if (!repoUrl) {\n console.warn(\n `Please define repository URL or path: ${tools.appName.toLowerCase()} add <repoName> <repoUrlOrPath>`,\n );\n return void callback(EXIT_CODES.INVALID_ARGUMENTS);\n }\n try {\n await repo.add(repoName, repoUrl);\n\n if (repoUrlOrCommand === 'addset') {\n await repo.setActive(repoName);\n console.log(`Repository \"${repoName}\" set as active: \"${repoUrl}\"`);\n await repo.showRepoStatus();\n return void callback();\n }\n console.log(`Repository \"${repoName}\" added as \"${repoUrl}\"`);\n await repo.showRepoStatus();\n return void callback();\n } catch (e) {\n console.error(`Cannot add repository location: ${e.message}`);\n return void callback(EXIT_CODES.INVALID_REPO);\n }\n } else if (repoUrlOrCommand === 'set') {\n try {\n await repo.setActive(repoName);\n console.log(`Repository \"${repoName}\" set as active.`);\n await repo.showRepoStatus();\n return void callback();\n } catch (e) {\n console.error(`Cannot activate repository: ${e.message}`);\n return void callback(EXIT_CODES.INVALID_REPO);\n }\n } else if (repoUrlOrCommand === 'del') {\n try {\n await repo.del(repoName);\n console.log(`Repository \"${repoName}\" deleted.`);\n await repo.showRepoStatus();\n return void callback();\n } catch (e) {\n console.error(`Cannot remove repository: ${e.message}`);\n return void callback(EXIT_CODES.INVALID_REPO);\n }\n } else if (repoUrlOrCommand === 'unset') {\n try {\n await repo.setInactive(repoName);\n console.log(`Repository \"${repoName}\" deactivated.`);\n await repo.showRepoStatus();\n return void callback();\n } catch (e) {\n console.error(`Cannot deactivate repository: ${e.message}`);\n return void callback(EXIT_CODES.INVALID_REPO);\n }\n } else {\n console.warn(`Unknown repo command: ${repoUrlOrCommand as string}`);\n return void callback(EXIT_CODES.INVALID_ARGUMENTS);\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["fs", "path", "axios"]
|
|
7
7
|
}
|
|
@@ -1,11 +1,18 @@
|
|
|
1
1
|
import type { CleanDatabaseHandler, IoPackage, ProcessExitCallback, RestartController } from '../../lib/_Types.js';
|
|
2
|
+
import type { ProcessCommandOptions } from '../../lib/cli/cliCommand.js';
|
|
2
3
|
import { EXIT_CODES } from '@iobroker/js-controller-common';
|
|
4
|
+
/** Options for the setup command */
|
|
3
5
|
export interface CLISetupOptions {
|
|
6
|
+
/** Handler to clean the database */
|
|
4
7
|
cleanDatabase: CleanDatabaseHandler;
|
|
8
|
+
/** Callback to exit the process with an exit code */
|
|
5
9
|
processExit: ProcessExitCallback;
|
|
10
|
+
/** Parsed CLI parameters */
|
|
6
11
|
params: Record<string, any>;
|
|
12
|
+
/** Handler to restart the controller */
|
|
7
13
|
restartController: RestartController;
|
|
8
14
|
}
|
|
15
|
+
/** Options for running the setup command */
|
|
9
16
|
export interface SetupCommandOptions {
|
|
10
17
|
/** Callback called afterward */
|
|
11
18
|
callback: (isCreated?: boolean) => void;
|
|
@@ -14,6 +21,9 @@ export interface SetupCommandOptions {
|
|
|
14
21
|
/** If redis should be setup */
|
|
15
22
|
useRedis: boolean;
|
|
16
23
|
}
|
|
24
|
+
/**
|
|
25
|
+
* CLI command that performs the initial ioBroker setup (databases, config and objects)
|
|
26
|
+
*/
|
|
17
27
|
export declare class Setup {
|
|
18
28
|
/** Object IDs which are not allowed to exist but could be generated due to errors in the past */
|
|
19
29
|
private readonly KNOWN_GARBAGE_OBJECT_IDS;
|
|
@@ -25,7 +35,15 @@ export declare class Setup {
|
|
|
25
35
|
private readonly params;
|
|
26
36
|
private readonly cleanDatabase;
|
|
27
37
|
private readonly restartController;
|
|
38
|
+
/**
|
|
39
|
+
* @param options Handlers for cleaning the DB, exiting and restarting, plus the CLI parameters
|
|
40
|
+
*/
|
|
28
41
|
constructor(options: CLISetupOptions);
|
|
42
|
+
/**
|
|
43
|
+
* Print information about the plugins configured for the controller
|
|
44
|
+
*
|
|
45
|
+
* @param systemConfig The system.config object, used to read the active repository
|
|
46
|
+
*/
|
|
29
47
|
informAboutPlugins(systemConfig?: ioBroker.SystemConfigObject | null): Promise<void>;
|
|
30
48
|
/**
|
|
31
49
|
* Called after io-package objects are created (hence object view functionalities are now available)
|
|
@@ -34,6 +52,13 @@ export declare class Setup {
|
|
|
34
52
|
* @param callback callback function
|
|
35
53
|
*/
|
|
36
54
|
setupReady(systemConfig: ioBroker.SystemConfigObject | undefined | null, callback: () => void): Promise<void>;
|
|
55
|
+
/**
|
|
56
|
+
* Create the initial set of objects and design documents in the database
|
|
57
|
+
*
|
|
58
|
+
* @param iopkg The io-package.json of the controller
|
|
59
|
+
* @param ignoreExisting Whether to proceed even if the config already exists
|
|
60
|
+
* @param callback Called once the database has been set up
|
|
61
|
+
*/
|
|
37
62
|
dbSetup(iopkg: IoPackage, ignoreExisting: boolean, callback: () => void): Promise<void>;
|
|
38
63
|
/**
|
|
39
64
|
* Fix the config object if existing
|
|
@@ -55,6 +80,9 @@ export declare class Setup {
|
|
|
55
80
|
* @param oldConfig - previous config
|
|
56
81
|
*/
|
|
57
82
|
migrateObjects(newConfig: ioBroker.IoBrokerJson, oldConfig: ioBroker.IoBrokerJson): Promise<EXIT_CODES>;
|
|
83
|
+
/**
|
|
84
|
+
* Interactively configure the databases and write the configuration file
|
|
85
|
+
*/
|
|
58
86
|
setupCustom(): Promise<EXIT_CODES>;
|
|
59
87
|
/**
|
|
60
88
|
* Checks if single host setup and if so migrates and activates Redis Sets Usage
|
|
@@ -107,4 +135,10 @@ export declare class Setup {
|
|
|
107
135
|
*/
|
|
108
136
|
setup(options: SetupCommandOptions): void;
|
|
109
137
|
}
|
|
138
|
+
/**
|
|
139
|
+
* Process the `setup` command
|
|
140
|
+
*
|
|
141
|
+
* @param options the command options
|
|
142
|
+
*/
|
|
143
|
+
export declare function processCommandSetup(options: ProcessCommandOptions): Promise<void>;
|
|
110
144
|
//# sourceMappingURL=setupSetup.d.ts.map
|
|
@@ -5,6 +5,7 @@ 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 });
|
|
8
9
|
var __export = (target, all) => {
|
|
9
10
|
for (var name in all)
|
|
10
11
|
__defProp(target, name, { get: all[name], enumerable: true });
|
|
@@ -28,26 +29,29 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
28
29
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
30
|
var setupSetup_exports = {};
|
|
30
31
|
__export(setupSetup_exports, {
|
|
31
|
-
Setup: () => Setup
|
|
32
|
+
Setup: () => Setup,
|
|
33
|
+
processCommandSetup: () => processCommandSetup
|
|
32
34
|
});
|
|
33
35
|
module.exports = __toCommonJS(setupSetup_exports);
|
|
34
36
|
var __import_meta_url = typeof document === "undefined" ? new (require("url".replace("", ""))).URL("file:" + __filename).href : document.currentScript && document.currentScript.src || new URL("main.js", document.baseURI).href;
|
|
35
37
|
var import_fs_extra = __toESM(require("fs-extra"), 1);
|
|
36
38
|
var import_node_path = __toESM(require("node:path"), 1);
|
|
37
|
-
var
|
|
38
|
-
var import_js_controller_common2 = require("@iobroker/js-controller-common");
|
|
39
|
-
var import_dbConnection = require("../../lib/setup/dbConnection.js");
|
|
40
|
-
var import_setupBackup = require("../../lib/setup/setupBackup.js");
|
|
39
|
+
var import_node_os = __toESM(require("node:os"), 1);
|
|
41
40
|
var import_node_crypto = __toESM(require("node:crypto"), 1);
|
|
42
41
|
var import_deep_clone = __toESM(require("deep-clone"), 1);
|
|
43
|
-
var
|
|
42
|
+
var url = __toESM(require("node:url"), 1);
|
|
43
|
+
var import_node_module = require("node:module");
|
|
44
|
+
var import_node_util = require("node:util");
|
|
44
45
|
var import_readline_sync = __toESM(require("readline-sync"), 1);
|
|
46
|
+
var import_cliCert = require("../../lib/cli/cliCert.js");
|
|
47
|
+
var import_js_controller_common = require("@iobroker/js-controller-common");
|
|
45
48
|
var import_tools = require("@iobroker/js-controller-common-db/tools");
|
|
46
|
-
var import_node_os = __toESM(require("node:os"), 1);
|
|
47
49
|
var import_constants = require("@iobroker/js-controller-common-db/constants");
|
|
50
|
+
var import_dbConnection = require("../../lib/setup/dbConnection.js");
|
|
51
|
+
var import_utils = require("../../lib/setup/utils.js");
|
|
52
|
+
var import_setupBackup = require("../../lib/setup/setupBackup.js");
|
|
53
|
+
var pluginInfos = __toESM(require("../../lib/setup/pluginInfos.js"), 1);
|
|
48
54
|
var import_setupUpload = require("../../lib/setup/setupUpload.js");
|
|
49
|
-
var import_node_module = require("node:module");
|
|
50
|
-
var url = __toESM(require("node:url"), 1);
|
|
51
55
|
const thisDir = url.fileURLToPath(new URL(".", __import_meta_url || `file://${__filename}`));
|
|
52
56
|
const require2 = (0, import_node_module.createRequire)(__import_meta_url || `file://${__filename}`);
|
|
53
57
|
const COLOR_RED = "\x1B[31m";
|
|
@@ -56,6 +60,9 @@ const COLOR_RESET = "\x1B[0m";
|
|
|
56
60
|
const COLOR_GREEN = "\x1B[32m";
|
|
57
61
|
const CONTROLLER_DIR = import_js_controller_common.tools.getControllerDir();
|
|
58
62
|
class Setup {
|
|
63
|
+
static {
|
|
64
|
+
__name(this, "Setup");
|
|
65
|
+
}
|
|
59
66
|
/** Object IDs which are not allowed to exist but could be generated due to errors in the past */
|
|
60
67
|
KNOWN_GARBAGE_OBJECT_IDS = ["null", "undefined"];
|
|
61
68
|
/** Default name for redis sentinels */
|
|
@@ -66,6 +73,9 @@ class Setup {
|
|
|
66
73
|
params;
|
|
67
74
|
cleanDatabase;
|
|
68
75
|
restartController;
|
|
76
|
+
/**
|
|
77
|
+
* @param options Handlers for cleaning the DB, exiting and restarting, plus the CLI parameters
|
|
78
|
+
*/
|
|
69
79
|
constructor(options) {
|
|
70
80
|
this.processExit = options.processExit;
|
|
71
81
|
this.params = options.params;
|
|
@@ -73,6 +83,11 @@ class Setup {
|
|
|
73
83
|
this.restartController = options.restartController;
|
|
74
84
|
this.dbSetup = this.dbSetup.bind(this);
|
|
75
85
|
}
|
|
86
|
+
/**
|
|
87
|
+
* Print information about the plugins configured for the controller
|
|
88
|
+
*
|
|
89
|
+
* @param systemConfig The system.config object, used to read the active repository
|
|
90
|
+
*/
|
|
76
91
|
async informAboutPlugins(systemConfig) {
|
|
77
92
|
if (!this.states) {
|
|
78
93
|
throw new Error("States not set up, call setupObjects first");
|
|
@@ -204,6 +219,13 @@ Please DO NOT copy files manually into ioBroker storage directories!`);
|
|
|
204
219
|
return void callback();
|
|
205
220
|
}
|
|
206
221
|
}
|
|
222
|
+
/**
|
|
223
|
+
* Create the initial set of objects and design documents in the database
|
|
224
|
+
*
|
|
225
|
+
* @param iopkg The io-package.json of the controller
|
|
226
|
+
* @param ignoreExisting Whether to proceed even if the config already exists
|
|
227
|
+
* @param callback Called once the database has been set up
|
|
228
|
+
*/
|
|
207
229
|
async dbSetup(iopkg, ignoreExisting, callback) {
|
|
208
230
|
if (!this.objects) {
|
|
209
231
|
throw new Error("Objects not set up, call setupObjects first");
|
|
@@ -328,17 +350,14 @@ Please DO NOT copy files manually into ioBroker storage directories!`);
|
|
|
328
350
|
console.log(`object ${obj._id} updated`);
|
|
329
351
|
} catch {
|
|
330
352
|
}
|
|
331
|
-
this.dbSetup(iopkg, true, callback);
|
|
332
|
-
return;
|
|
353
|
+
return this.dbSetup(iopkg, true, callback);
|
|
333
354
|
}
|
|
334
355
|
}
|
|
335
|
-
this.dbSetup(iopkg, true, callback);
|
|
336
|
-
} else {
|
|
337
|
-
this.dbSetup(iopkg, true, callback);
|
|
356
|
+
return this.dbSetup(iopkg, true, callback);
|
|
338
357
|
}
|
|
339
|
-
|
|
340
|
-
this.dbSetup(iopkg, false, callback);
|
|
358
|
+
return this.dbSetup(iopkg, true, callback);
|
|
341
359
|
}
|
|
360
|
+
return this.dbSetup(iopkg, false, callback);
|
|
342
361
|
}
|
|
343
362
|
/**
|
|
344
363
|
* Asks the user if he wants to migrate objects if it makes sense and performs migration according to input
|
|
@@ -347,14 +366,14 @@ Please DO NOT copy files manually into ioBroker storage directories!`);
|
|
|
347
366
|
* @param oldConfig - previous config
|
|
348
367
|
*/
|
|
349
368
|
async migrateObjects(newConfig, oldConfig) {
|
|
350
|
-
const oldStatesHasServer = await (0,
|
|
351
|
-
const oldObjectsHasServer = await (0,
|
|
352
|
-
const newStatesHasServer = await (0,
|
|
353
|
-
const newObjectsHasServer = await (0,
|
|
354
|
-
const oldStatesLocalServer = await (0,
|
|
355
|
-
const oldObjectsLocalServer = await (0,
|
|
356
|
-
const newStatesLocalServer = await (0,
|
|
357
|
-
const newObjectsLocalServer = await (0,
|
|
369
|
+
const oldStatesHasServer = await (0, import_js_controller_common.statesDbHasServer)(oldConfig.states.type);
|
|
370
|
+
const oldObjectsHasServer = await (0, import_js_controller_common.statesDbHasServer)(oldConfig.objects.type);
|
|
371
|
+
const newStatesHasServer = await (0, import_js_controller_common.statesDbHasServer)(newConfig.states.type);
|
|
372
|
+
const newObjectsHasServer = await (0, import_js_controller_common.statesDbHasServer)(newConfig.objects.type);
|
|
373
|
+
const oldStatesLocalServer = await (0, import_js_controller_common.isLocalStatesDbServer)(oldConfig.states.type, oldConfig.states.host);
|
|
374
|
+
const oldObjectsLocalServer = await (0, import_js_controller_common.isLocalObjectsDbServer)(oldConfig.objects.type, oldConfig.objects.host);
|
|
375
|
+
const newStatesLocalServer = await (0, import_js_controller_common.isLocalStatesDbServer)(newConfig.states.type, newConfig.states.host);
|
|
376
|
+
const newObjectsLocalServer = await (0, import_js_controller_common.isLocalObjectsDbServer)(newConfig.objects.type, newConfig.objects.host);
|
|
358
377
|
if (oldConfig && (oldConfig.states.type !== newConfig.states.type || oldConfig.objects.type !== newConfig.objects.type || !oldStatesHasServer && oldConfig.states.host !== newConfig.states.host || !oldObjectsHasServer && oldConfig.objects.host !== newConfig.objects.host)) {
|
|
359
378
|
let fromMaster = oldStatesLocalServer || oldObjectsLocalServer;
|
|
360
379
|
let toMaster = newStatesLocalServer || newObjectsLocalServer;
|
|
@@ -525,6 +544,9 @@ Please DO NOT copy files manually into ioBroker storage directories!`);
|
|
|
525
544
|
import_fs_extra.default.writeFileSync(import_js_controller_common.tools.getConfigFileName(), JSON.stringify(newConfig, null, 2));
|
|
526
545
|
return import_js_controller_common.EXIT_CODES.NO_ERROR;
|
|
527
546
|
}
|
|
547
|
+
/**
|
|
548
|
+
* Interactively configure the databases and write the configuration file
|
|
549
|
+
*/
|
|
528
550
|
async setupCustom() {
|
|
529
551
|
let config;
|
|
530
552
|
try {
|
|
@@ -554,8 +576,8 @@ Please DO NOT copy files manually into ioBroker storage directories!`);
|
|
|
554
576
|
if (Array.isArray(originalConfig.states.host)) {
|
|
555
577
|
console.log(` - Sentinel-Master-Name: ${originalConfig.states.sentinelName ? originalConfig.states.sentinelName : this.DEFAULT_SENTINEL_NAME}`);
|
|
556
578
|
}
|
|
557
|
-
const hasObjectsServer = await (0,
|
|
558
|
-
const hasStatesServer = await (0,
|
|
579
|
+
const hasObjectsServer = await (0, import_js_controller_common.objectsDbHasServer)(originalConfig.objects.type);
|
|
580
|
+
const hasStatesServer = await (0, import_js_controller_common.statesDbHasServer)(originalConfig.states.type);
|
|
559
581
|
if (hasObjectsServer || hasStatesServer) {
|
|
560
582
|
console.log(`- Data Directory: ${import_js_controller_common.tools.getDefaultDataDir()}`);
|
|
561
583
|
}
|
|
@@ -634,7 +656,7 @@ Please DO NOT copy files manually into ioBroker storage directories!`);
|
|
|
634
656
|
return import_js_controller_common.EXIT_CODES.INVALID_ARGUMENTS;
|
|
635
657
|
}
|
|
636
658
|
}
|
|
637
|
-
config.objects = await (0,
|
|
659
|
+
config.objects = await (0, import_js_controller_common.performObjectsInterview)({ dbType: oType, config: config.objects });
|
|
638
660
|
let oSentinelName = null;
|
|
639
661
|
if (oSentinel) {
|
|
640
662
|
const defaultSentinelName = originalConfig.objects.sentinelName ? originalConfig.objects.sentinelName : this.DEFAULT_SENTINEL_NAME;
|
|
@@ -694,7 +716,7 @@ Please DO NOT copy files manually into ioBroker storage directories!`);
|
|
|
694
716
|
sHost = sHost.split(",").map((host) => host.trim());
|
|
695
717
|
}
|
|
696
718
|
let defaultStatesPort = sType === originalConfig.states.type && sHost === originalConfig.states.host ? originalConfig.states.port : sp;
|
|
697
|
-
const statesHasServer = await (0,
|
|
719
|
+
const statesHasServer = await (0, import_js_controller_common.statesDbHasServer)(sType);
|
|
698
720
|
if (sType === oType && !statesHasServer && sHost === oHost) {
|
|
699
721
|
defaultStatesPort = oPort;
|
|
700
722
|
}
|
|
@@ -725,7 +747,7 @@ Please DO NOT copy files manually into ioBroker storage directories!`);
|
|
|
725
747
|
return import_js_controller_common.EXIT_CODES.INVALID_ARGUMENTS;
|
|
726
748
|
}
|
|
727
749
|
}
|
|
728
|
-
config.states = await (0,
|
|
750
|
+
config.states = await (0, import_js_controller_common.performStatesInterview)({ dbType: sType, config: config.states });
|
|
729
751
|
let sSentinelName = null;
|
|
730
752
|
if (sSentinel) {
|
|
731
753
|
const defaultSentinelName = originalConfig.states.sentinelName ? originalConfig.states.sentinelName : oSentinelName && oPort === sPort ? oSentinelName : this.DEFAULT_SENTINEL_NAME;
|
|
@@ -735,8 +757,8 @@ Please DO NOT copy files manually into ioBroker storage directories!`);
|
|
|
735
757
|
}
|
|
736
758
|
let dir;
|
|
737
759
|
let hname;
|
|
738
|
-
const hasLocalObjectsServer = await (0,
|
|
739
|
-
const hasLocalStatesServer = await (0,
|
|
760
|
+
const hasLocalObjectsServer = await (0, import_js_controller_common.isLocalObjectsDbServer)(oType, oHost);
|
|
761
|
+
const hasLocalStatesServer = await (0, import_js_controller_common.isLocalStatesDbServer)(sType, sHost);
|
|
740
762
|
if (hasLocalStatesServer || hasLocalObjectsServer) {
|
|
741
763
|
let validDataDir = false;
|
|
742
764
|
while (!validDataDir) {
|
|
@@ -908,7 +930,8 @@ Please DO NOT copy files manually into ioBroker storage directories!`);
|
|
|
908
930
|
* Replace the `controller.js` file in the root directory to work with ESM
|
|
909
931
|
*/
|
|
910
932
|
async _fixWindowsControllerJs() {
|
|
911
|
-
const content = `import('./node_modules/iobroker.js-controller/controller.js')
|
|
933
|
+
const content = `import('./node_modules/iobroker.js-controller/controller.js');
|
|
934
|
+
`;
|
|
912
935
|
const filePath = import_node_path.default.join(import_js_controller_common.tools.getRootDir(), "controller.js");
|
|
913
936
|
try {
|
|
914
937
|
await import_fs_extra.default.writeFile(filePath, content, { encoding: "utf-8" });
|
|
@@ -1213,14 +1236,165 @@ require('${import_node_path.default.normalize(`${thisDir}/..`)}/setup').execute(
|
|
|
1213
1236
|
console.log(`Non-critical error: ${e.message}`);
|
|
1214
1237
|
}
|
|
1215
1238
|
} else if (ignoreIfExist) {
|
|
1216
|
-
this.setupObjects(() => callback?.(), true);
|
|
1239
|
+
this.setupObjects(() => callback?.(), true).catch((e) => console.error(`Cannot setup objects: ${e.message}`));
|
|
1217
1240
|
return;
|
|
1218
1241
|
}
|
|
1219
|
-
this.setupObjects(() => callback?.(isCreated));
|
|
1242
|
+
this.setupObjects(() => callback?.(isCreated)).catch((e) => console.error(`Cannot setup objects: ${e.message}`));
|
|
1243
|
+
}
|
|
1244
|
+
}
|
|
1245
|
+
async function processCommandSetup(options) {
|
|
1246
|
+
const { args, params, callback, commandOptions, cleanDatabase, restartController } = options;
|
|
1247
|
+
const setup = new Setup({
|
|
1248
|
+
processExit: callback,
|
|
1249
|
+
cleanDatabase,
|
|
1250
|
+
restartController,
|
|
1251
|
+
params
|
|
1252
|
+
});
|
|
1253
|
+
if (args[0] === "custom" || params.custom) {
|
|
1254
|
+
const exitCode = await setup.setupCustom();
|
|
1255
|
+
callback(exitCode);
|
|
1256
|
+
return;
|
|
1257
|
+
}
|
|
1258
|
+
let isFirst = false;
|
|
1259
|
+
let isRedis = false;
|
|
1260
|
+
for (const arg of args) {
|
|
1261
|
+
if (arg === "first") {
|
|
1262
|
+
isFirst = true;
|
|
1263
|
+
} else if (arg === "redis") {
|
|
1264
|
+
isRedis = true;
|
|
1265
|
+
}
|
|
1220
1266
|
}
|
|
1267
|
+
isRedis = params.redis || isRedis;
|
|
1268
|
+
isFirst = params.first || isFirst;
|
|
1269
|
+
setup.setup({
|
|
1270
|
+
callback: /* @__PURE__ */ __name(async () => {
|
|
1271
|
+
const { states, objects } = await (0, import_dbConnection.dbConnectAsync)(false, params);
|
|
1272
|
+
if (isFirst) {
|
|
1273
|
+
const { Install } = await import("../../lib/setup/setupInstall.js");
|
|
1274
|
+
const install = new Install({
|
|
1275
|
+
objects,
|
|
1276
|
+
states,
|
|
1277
|
+
processExit: callback,
|
|
1278
|
+
params
|
|
1279
|
+
});
|
|
1280
|
+
const initialInstances = ["admin", "discovery", "backitup"];
|
|
1281
|
+
for (const instance of initialInstances) {
|
|
1282
|
+
try {
|
|
1283
|
+
const adapterInstalled = !!require2.resolve(`${import_js_controller_common.tools.appName.toLowerCase()}.${instance}`);
|
|
1284
|
+
if (adapterInstalled) {
|
|
1285
|
+
let otherInstanceExists = false;
|
|
1286
|
+
try {
|
|
1287
|
+
const res = await objects.getObjectViewAsync("system", "instance", {
|
|
1288
|
+
startkey: `system.adapter.${instance}`,
|
|
1289
|
+
endkey: `system.adapter.${instance}\u9999`
|
|
1290
|
+
});
|
|
1291
|
+
otherInstanceExists = !!res.rows.length;
|
|
1292
|
+
} catch {
|
|
1293
|
+
}
|
|
1294
|
+
if (!otherInstanceExists) {
|
|
1295
|
+
await install.createInstance(instance, {
|
|
1296
|
+
enabled: true,
|
|
1297
|
+
ignoreIfExists: true
|
|
1298
|
+
});
|
|
1299
|
+
}
|
|
1300
|
+
}
|
|
1301
|
+
} catch {
|
|
1302
|
+
}
|
|
1303
|
+
}
|
|
1304
|
+
await new Promise((resolve) => {
|
|
1305
|
+
const cert = new import_cliCert.CLICert({ ...commandOptions, callback: resolve });
|
|
1306
|
+
cert.create().catch((e) => console.error(`Cannot create certificate: ${e.message}`));
|
|
1307
|
+
});
|
|
1308
|
+
}
|
|
1309
|
+
const { Repo } = await import("../../lib/setup/setupRepo.js");
|
|
1310
|
+
const repo = new Repo({ objects, states });
|
|
1311
|
+
try {
|
|
1312
|
+
await repo.rename("default", "stable", import_utils.STABLE_REPO_URL);
|
|
1313
|
+
await repo.rename("latest", "beta", import_utils.BETA_REPO_URL);
|
|
1314
|
+
} catch (err) {
|
|
1315
|
+
console.warn(`Cannot rename: ${err.message}`);
|
|
1316
|
+
}
|
|
1317
|
+
try {
|
|
1318
|
+
await objects.delObjectAsync("system.adapter.js-controller");
|
|
1319
|
+
} catch {
|
|
1320
|
+
}
|
|
1321
|
+
try {
|
|
1322
|
+
const configFile = import_js_controller_common.tools.getConfigFileName();
|
|
1323
|
+
const configOrig = import_fs_extra.default.readJSONSync(configFile);
|
|
1324
|
+
const config = (0, import_deep_clone.default)(configOrig);
|
|
1325
|
+
config.objects.options = config.objects.options || {
|
|
1326
|
+
auth_pass: null,
|
|
1327
|
+
retry_max_delay: 5e3
|
|
1328
|
+
};
|
|
1329
|
+
if (config.objects.options.retry_max_delay === 15e3 || !config.objects.options.retry_max_delay) {
|
|
1330
|
+
config.objects.options.retry_max_delay = 5e3;
|
|
1331
|
+
}
|
|
1332
|
+
config.states.options = config.states.options || {
|
|
1333
|
+
auth_pass: null,
|
|
1334
|
+
retry_max_delay: 5e3
|
|
1335
|
+
};
|
|
1336
|
+
if (config.states.options.retry_max_delay === 15e3 || !config.states.options.retry_max_delay) {
|
|
1337
|
+
config.states.options.retry_max_delay = 5e3;
|
|
1338
|
+
}
|
|
1339
|
+
let migrated = "";
|
|
1340
|
+
if (config.states.type === "file") {
|
|
1341
|
+
config.states.type = "jsonl";
|
|
1342
|
+
const hasLocalStatesServer = await (0, import_js_controller_common.isLocalStatesDbServer)("file", config.states.host);
|
|
1343
|
+
if (hasLocalStatesServer) {
|
|
1344
|
+
console.log('States DB type migrated from "file" to "jsonl"');
|
|
1345
|
+
migrated += "States";
|
|
1346
|
+
}
|
|
1347
|
+
}
|
|
1348
|
+
if (config.objects.type === "file") {
|
|
1349
|
+
config.objects.type = "jsonl";
|
|
1350
|
+
const hasLocalObjectsServer = await (0, import_js_controller_common.isLocalObjectsDbServer)("file", config.objects.host);
|
|
1351
|
+
if (hasLocalObjectsServer) {
|
|
1352
|
+
console.log('Objects DB type migrated from "file" to "jsonl"');
|
|
1353
|
+
migrated += migrated ? " and Objects" : "Objects";
|
|
1354
|
+
}
|
|
1355
|
+
}
|
|
1356
|
+
if (migrated) {
|
|
1357
|
+
const { NotificationHandler } = await import("@iobroker/js-controller-common");
|
|
1358
|
+
const hostname = import_js_controller_common.tools.getHostName();
|
|
1359
|
+
const notificationSettings = {
|
|
1360
|
+
states,
|
|
1361
|
+
objects,
|
|
1362
|
+
log: console,
|
|
1363
|
+
logPrefix: "",
|
|
1364
|
+
host: hostname
|
|
1365
|
+
};
|
|
1366
|
+
const notificationHandler = new NotificationHandler(notificationSettings);
|
|
1367
|
+
try {
|
|
1368
|
+
const ioPackage = import_fs_extra.default.readJsonSync(import_node_path.default.join(import_js_controller_common.tools.getControllerDir(), "io-package.json"));
|
|
1369
|
+
await notificationHandler.addConfig(ioPackage.notifications);
|
|
1370
|
+
await notificationHandler.addMessage({
|
|
1371
|
+
scope: "system",
|
|
1372
|
+
category: "fileToJsonl",
|
|
1373
|
+
message: `Migrated: ${migrated}`,
|
|
1374
|
+
instance: `system.host.${hostname}`
|
|
1375
|
+
});
|
|
1376
|
+
notificationHandler.storeNotifications();
|
|
1377
|
+
} catch (e) {
|
|
1378
|
+
console.warn(`Could not add File-to-JSONL notification: ${e.message}`);
|
|
1379
|
+
}
|
|
1380
|
+
}
|
|
1381
|
+
if (!(0, import_node_util.isDeepStrictEqual)(config, configOrig)) {
|
|
1382
|
+
import_fs_extra.default.writeFileSync(configFile, JSON.stringify(config, null, 2));
|
|
1383
|
+
console.log("ioBroker configuration updated");
|
|
1384
|
+
}
|
|
1385
|
+
} catch (err) {
|
|
1386
|
+
console.log(`Could not update ioBroker configuration: ${err.message}`);
|
|
1387
|
+
}
|
|
1388
|
+
return void callback();
|
|
1389
|
+
}, "callback"),
|
|
1390
|
+
ignoreIfExist: isFirst,
|
|
1391
|
+
useRedis: isRedis
|
|
1392
|
+
});
|
|
1221
1393
|
}
|
|
1394
|
+
__name(processCommandSetup, "processCommandSetup");
|
|
1222
1395
|
// Annotate the CommonJS export names for ESM import in node:
|
|
1223
1396
|
0 && (module.exports = {
|
|
1224
|
-
Setup
|
|
1397
|
+
Setup,
|
|
1398
|
+
processCommandSetup
|
|
1225
1399
|
});
|
|
1226
1400
|
//# sourceMappingURL=setupSetup.js.map
|