@iobroker/js-controller-cli 7.1.3-alpha.0-20260607-0a6edee6f → 7.2.0

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.
@@ -17,8 +17,6 @@ export interface SetupCommandOptions {
17
17
  export declare class Setup {
18
18
  /** Object IDs which are not allowed to exist but could be generated due to errors in the past */
19
19
  private readonly KNOWN_GARBAGE_OBJECT_IDS;
20
- /** Adapter core version supported by this js-controller */
21
- private readonly SUPPORTED_ADAPTER_CORE_VERSION;
22
20
  /** Default name for redis sentinels */
23
21
  private readonly DEFAULT_SENTINEL_NAME;
24
22
  private readonly processExit;
@@ -67,9 +65,9 @@ export declare class Setup {
67
65
  */
68
66
  private _ensureHostObject;
69
67
  /**
70
- * Add or update adapter-core in supported version in the overrides field of the root package.json and call install there to apply it
68
+ * Remove, if required, adapter-core in the overrides field of the root package.json and call install there to apply it
71
69
  */
72
- private addOrUpdateAdapterCoreRequirement;
70
+ private removeAdapterCoreRequirement;
73
71
  /**
74
72
  * Create the adapters object per host if not yet existing
75
73
  */
@@ -58,8 +58,6 @@ const CONTROLLER_DIR = import_js_controller_common.tools.getControllerDir();
58
58
  class Setup {
59
59
  /** Object IDs which are not allowed to exist but could be generated due to errors in the past */
60
60
  KNOWN_GARBAGE_OBJECT_IDS = ["null", "undefined"];
61
- /** Adapter core version supported by this js-controller */
62
- SUPPORTED_ADAPTER_CORE_VERSION = "^3.3.2";
63
61
  /** Default name for redis sentinels */
64
62
  DEFAULT_SENTINEL_NAME = "mymaster";
65
63
  processExit;
@@ -167,9 +165,9 @@ class Setup {
167
165
  await this._fixWindowsControllerJs();
168
166
  }
169
167
  try {
170
- await this.addOrUpdateAdapterCoreRequirement();
168
+ await this.removeAdapterCoreRequirement();
171
169
  } catch (e) {
172
- console.error(`Could not add "@iobroker/adapter-core" requirement: ${e.message}`);
170
+ console.error(`Could not remove "@iobroker/adapter-core" override: ${e.message}`);
173
171
  }
174
172
  await this._cleanupInstallation();
175
173
  if (!("syncFileDirectory" in this.objects) || !("dirExists" in this.objects)) {
@@ -823,22 +821,25 @@ Please DO NOT copy files manually into ioBroker storage directories!`);
823
821
  }
824
822
  }
825
823
  /**
826
- * Add or update adapter-core in supported version in the overrides field of the root package.json and call install there to apply it
824
+ * Remove, if required, adapter-core in the overrides field of the root package.json and call install there to apply it
827
825
  */
828
- async addOrUpdateAdapterCoreRequirement() {
826
+ async removeAdapterCoreRequirement() {
829
827
  if (import_js_controller_common.tools.isDevInstallation()) {
830
828
  return;
831
829
  }
832
830
  const rootDir = import_js_controller_common.tools.getRootDir();
833
831
  const packPath = import_node_path.default.join(rootDir, "package.json");
834
832
  const packJson = await import_fs_extra.default.readJson(packPath);
835
- if (packJson.overrides?.["@iobroker/adapter-core"] === this.SUPPORTED_ADAPTER_CORE_VERSION) {
836
- console.log(`The supported version of "@iobroker/adapter-core" is already specified as "${this.SUPPORTED_ADAPTER_CORE_VERSION}"`);
833
+ if (!packJson.overrides?.["@iobroker/adapter-core"]) {
834
+ console.log(`The "@iobroker/adapter-core" override is already removed`);
837
835
  return;
838
836
  }
839
- packJson.overrides = { "@iobroker/adapter-core": this.SUPPORTED_ADAPTER_CORE_VERSION };
840
- await import_fs_extra.default.writeFile(packPath, JSON.stringify(packJson));
841
- console.log(`Successfully specified supported "@iobroker/adapter-core" version as "${this.SUPPORTED_ADAPTER_CORE_VERSION}"`);
837
+ delete packJson.overrides["@iobroker/adapter-core"];
838
+ if (!Object.keys(packJson.overrides).length) {
839
+ delete packJson.overrides;
840
+ }
841
+ await import_fs_extra.default.writeJson(packPath, packJson, { spaces: 4 });
842
+ console.log(`Successfully removed override for "@iobroker/adapter-core"`);
842
843
  }
843
844
  /**
844
845
  * Create the adapters object per host if not yet existing
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/lib/setup/setupSetup.ts", "../../../../../../node_modules/@alcalzone/esm2cjs/shims/import.meta.url/shim.js"],
4
- "sourcesContent": ["/**\n * Setup\n *\n * Copyright 2013-2024 bluefox <dogafox@gmail.com>\n *\n * MIT License\n *\n */\nimport fs from 'fs-extra';\nimport path from 'node:path';\n\nimport type { CleanDatabaseHandler, IoPackage, ProcessExitCallback, RestartController } from '@/lib/_Types.js';\nimport type { Client as StatesRedisClient } from '@iobroker/db-states-redis';\nimport type { Client as ObjectsRedisClient } from '@iobroker/db-objects-redis';\n\nimport { EXIT_CODES, tools } from '@iobroker/js-controller-common';\nimport {\n statesDbHasServer,\n isLocalStatesDbServer,\n isLocalObjectsDbServer,\n objectsDbHasServer,\n performObjectsInterview,\n performStatesInterview,\n} from '@iobroker/js-controller-common';\nimport { resetDbConnect, dbConnectAsync } from '@/lib/setup/dbConnection.js';\nimport { BackupRestore } from '@/lib/setup/setupBackup.js';\nimport crypto from 'node:crypto';\nimport deepClone from 'deep-clone';\nimport * as pluginInfos from '@/lib/setup/pluginInfos.js';\nimport rl from 'readline-sync';\nimport { FORBIDDEN_CHARS, getHostObject } from '@iobroker/js-controller-common-db/tools';\nimport os from 'node:os';\nimport { SYSTEM_ADAPTER_PREFIX, SYSTEM_HOST_PREFIX } from '@iobroker/js-controller-common-db/constants';\nimport { Upload } from '@/lib/setup/setupUpload.js';\nimport { createRequire } from 'node:module';\nimport * as url from 'node:url';\n\n// eslint-disable-next-line unicorn/prefer-module\nconst thisDir = url.fileURLToPath(new URL('.', import.meta.url || `file://${__filename}`));\n// eslint-disable-next-line unicorn/prefer-module\nconst require = createRequire(import.meta.url || `file://${__filename}`);\n\nconst COLOR_RED = '\\x1b[31m';\nconst COLOR_YELLOW = '\\x1b[33m';\nconst COLOR_RESET = '\\x1b[0m';\nconst COLOR_GREEN = '\\x1b[32m';\nconst CONTROLLER_DIR = tools.getControllerDir();\n\nexport interface CLISetupOptions {\n cleanDatabase: CleanDatabaseHandler;\n processExit: ProcessExitCallback;\n params: Record<string, any>;\n restartController: RestartController;\n}\n\nexport interface SetupCommandOptions {\n /** Callback called afterward */\n callback: (isCreated?: boolean) => void;\n /** Used for setup first run, does setup process even though config file already exists */\n ignoreIfExist: boolean;\n /** If redis should be setup */\n useRedis: boolean;\n}\n\nexport class Setup {\n /** Object IDs which are not allowed to exist but could be generated due to errors in the past */\n private readonly KNOWN_GARBAGE_OBJECT_IDS = ['null', 'undefined'];\n /** Adapter core version supported by this js-controller */\n private readonly SUPPORTED_ADAPTER_CORE_VERSION = '^3.3.2';\n /** Default name for redis sentinels */\n private readonly DEFAULT_SENTINEL_NAME = 'mymaster';\n private readonly processExit: ProcessExitCallback;\n private states: StatesRedisClient | undefined;\n private objects: ObjectsRedisClient | undefined;\n private readonly params: Record<string, any>;\n private readonly cleanDatabase: CleanDatabaseHandler;\n private readonly restartController: RestartController;\n\n constructor(options: CLISetupOptions) {\n this.processExit = options.processExit;\n this.params = options.params;\n this.cleanDatabase = options.cleanDatabase;\n this.restartController = options.restartController;\n\n this.dbSetup = this.dbSetup.bind(this);\n }\n\n async informAboutPlugins(systemConfig?: ioBroker.SystemConfigObject | null): Promise<void> {\n if (!this.states) {\n throw new Error('States not set up, call setupObjects first');\n }\n\n let ioPackage: IoPackage | undefined;\n let ioConfig: ioBroker.IoBrokerJson | undefined;\n\n const configFile = tools.getConfigFileName();\n try {\n ioPackage = JSON.parse(fs.readFileSync(path.join(CONTROLLER_DIR, 'io-package.json'), 'utf8'));\n } catch {\n console.error('Cannot read js-controller io-package.json. Ignore plugins defined there.');\n }\n try {\n ioConfig = JSON.parse(fs.readFileSync(configFile, 'utf8'));\n } catch {\n console.error('Can not read js-controller config file. Ignore plugins defined there.');\n }\n\n const plugins: Record<string, any> = {};\n if (ioPackage?.common?.plugins) {\n for (const [plugin, pluginData] of Object.entries(ioPackage.common.plugins)) {\n if (pluginData.enabled !== false) {\n plugins[plugin] = pluginData;\n }\n }\n }\n\n if (ioConfig?.plugins) {\n for (const [plugin, pluginData] of Object.entries(ioConfig.plugins)) {\n if (!plugins[plugin] && pluginData.enabled !== false) {\n plugins[plugin] = pluginData;\n }\n }\n }\n\n let systemLang = 'en';\n let systemDiag = 'extended';\n if (systemConfig?.common) {\n systemDiag = systemConfig.common.diag || 'extended';\n systemLang = systemConfig.common.language || 'en';\n }\n\n for (const plugin of Object.keys(plugins)) {\n // @ts-expect-error it is our testing style\n const pluginInfo = pluginInfos.PLUGIN_INFOS[plugin];\n if (!pluginInfo) {\n // We do not have relevant information to display\n continue;\n }\n if (systemDiag === 'none' && pluginInfos.isReportingPlugin(plugin)) {\n // Reporting plugins respect \"diag\" and do not send information if diag is disabled\n continue;\n }\n\n let enabledState;\n try {\n enabledState = await this.states.getStateAsync(\n `system.host.${tools.getHostName()}.plugins.${plugin}.enabled`,\n );\n } catch {\n // ignore\n }\n if (enabledState && enabledState.val !== undefined) {\n // already configured, so do not output again\n continue;\n }\n\n const infoHeadLine = pluginInfo.headline[systemLang] || pluginInfo.headline.en;\n const infoText = pluginInfo.text[systemLang] || pluginInfo.text.en;\n\n console.error(COLOR_RED);\n console.error(infoHeadLine);\n console.error(COLOR_YELLOW);\n console.error(infoText);\n console.error();\n console.error(COLOR_RESET);\n }\n }\n\n /**\n * Called after io-package objects are created (hence object view functionalities are now available)\n *\n * @param systemConfig the system config object\n * @param callback callback function\n */\n async setupReady(\n systemConfig: ioBroker.SystemConfigObject | undefined | null,\n callback: () => void,\n ): Promise<void> {\n if (!callback) {\n console.log(`database setup done. You can add adapters and start ${tools.appName} now`);\n return this.processExit(EXIT_CODES.NO_ERROR);\n }\n\n if (!this.objects) {\n throw new Error('Objects not set up, call setupObjects first');\n }\n\n try {\n await this._ensureHostObject();\n } catch (e) {\n console.error(`Could not ensure host object exists: ${e.message}`);\n }\n\n try {\n await this._ensureAdaptersPerHostObject();\n } catch (e) {\n console.error(`Could not ensure that adapters object for this host exists: ${e.message}`);\n }\n\n if (process.platform === 'win32') {\n // TODO: remove this fix after controller v6\n await this._fixWindowsControllerJs();\n }\n\n try {\n await this.addOrUpdateAdapterCoreRequirement();\n } catch (e) {\n console.error(`Could not add \"@iobroker/adapter-core\" requirement: ${e.message}`);\n }\n\n await this._cleanupInstallation();\n\n // special methods which are only there on objects server\n // TODO this check will lead to objects being never in the following code\n if (!('syncFileDirectory' in this.objects) || !('dirExists' in this.objects)) {\n await this.informAboutPlugins(systemConfig);\n return void callback();\n }\n\n // check meta.user\n try {\n const objExists = await this.objects.objectExists('meta.user');\n if (objExists) {\n // check if dir is missing\n // @ts-expect-error due to check above type gets never, we should add the methods to the interface in db\n const dirExists = this.objects.dirExists('meta.user');\n if (!dirExists) {\n // create meta.user, so users see them as upload target\n await this.objects.mkdirAsync('meta.user');\n console.log('Successfully created \"meta.user\" directory');\n }\n }\n } catch (e) {\n console.warn(`Could not create directory \"meta.user\": ${e.message}`);\n }\n\n try {\n // @ts-expect-error due to check above type gets never, we should add the methods to the interface in db\n const { numberSuccess, notifications } = this.objects.syncFileDirectory();\n numberSuccess &&\n console.log(\n `${numberSuccess} file(s) successfully synchronized with ioBroker storage.\nPlease DO NOT copy files manually into ioBroker storage directories!`,\n );\n if (notifications.length) {\n console.log();\n console.log('The following notifications happened during sync: ');\n notifications.forEach((el: string) => console.log(`- ${el}`));\n console.log();\n }\n await this.informAboutPlugins(systemConfig);\n return void callback();\n } catch (e) {\n console.error(`Error on file directory sync: ${e.message}`);\n await this.informAboutPlugins(systemConfig);\n return void callback();\n }\n }\n\n async dbSetup(iopkg: IoPackage, ignoreExisting: boolean, callback: () => void): Promise<void> {\n if (!this.objects) {\n throw new Error('Objects not set up, call setupObjects first');\n }\n\n if (iopkg.objects?.length > 0) {\n const obj = iopkg.objects.pop()!;\n\n let existingObj: ioBroker.Object | undefined | null;\n try {\n existingObj = await this.objects.getObject(obj._id);\n } catch {\n // ignore\n }\n if (!existingObj || existingObj._id.startsWith('_design/')) {\n obj.from = `system.host.${tools.getHostName()}.cli`;\n obj.ts = Date.now();\n await this.objects.setObjectAsync(obj._id, obj);\n console.log(`object \"${obj._id}\" ${!existingObj ? 'created' : 'updated'}`);\n setTimeout(this.dbSetup, 25, iopkg, ignoreExisting, callback);\n } else {\n if (!ignoreExisting) {\n console.log(`object \"${obj._id}\" already exists`);\n }\n setTimeout(this.dbSetup, 25, iopkg, ignoreExisting, callback);\n }\n } else {\n await tools.createUuid(this.objects);\n let configObj: ioBroker.SystemConfigObject | null | undefined;\n // check if encrypt secret exists\n try {\n configObj = await this.objects.getObject('system.config');\n } catch {\n return this.setupReady(configObj, callback);\n }\n\n const configFixed = await this.fixConfig(configObj);\n\n if (configFixed) {\n await this.objects.setObject('system.config', configObj!);\n }\n\n return this.setupReady(configObj, callback);\n }\n }\n\n /**\n * Fix the config object if existing\n *\n * @param configObj the current system.config object\n */\n private async fixConfig(configObj: ioBroker.SystemConfigObject | null | undefined): Promise<boolean> {\n let configFixed = false;\n\n if (!configObj) {\n return configFixed;\n }\n\n if (configObj.type !== 'config') {\n configObj.type = 'config';\n configObj.from = `system.host.${tools.getHostName()}.cli`;\n configObj.ts = Date.now();\n configFixed = true;\n }\n\n if (!configObj.native?.secret) {\n const buf = crypto.randomBytes(24);\n configObj.native ||= {};\n configObj.native.secret = buf.toString('hex');\n configObj.from = `system.host.${tools.getHostName()}.cli`;\n configObj.ts = Date.now();\n await this.objects!.setObject('system.config', configObj);\n }\n\n if (!configObj.common.adapterAutoUpgrade && configObj.common.activeRepo.length) {\n const repoName = configObj.common.activeRepo[0];\n\n configObj.common.adapterAutoUpgrade = {\n defaultPolicy: 'none',\n repositories: {\n [repoName]: true,\n },\n };\n }\n\n return configFixed;\n }\n\n /**\n * Creates objects and does object related cleanup\n *\n * @param callback callback function\n * @param checkCertificateOnly if only certificate check is desired\n */\n async setupObjects(callback: () => void, checkCertificateOnly?: boolean): Promise<void> {\n const { states: _states, objects: _objects } = await dbConnectAsync(false, this.params);\n this.objects = _objects;\n this.states = _states;\n const iopkg = fs.readJsonSync(path.join(CONTROLLER_DIR, 'io-package.json'));\n\n await this._maybeMigrateSets();\n\n if (checkCertificateOnly) {\n let certObj: ioBroker.Object | undefined;\n if (iopkg?.objects) {\n for (const obj of iopkg.objects) {\n if (obj?._id === 'system.certificates') {\n certObj = obj;\n break;\n }\n }\n }\n\n if (certObj) {\n let obj: ioBroker.Object | null | undefined = null;\n try {\n obj = await this.objects.getObjectAsync('system.certificates');\n } catch {\n // ignore\n }\n\n if (obj?.native?.certificates?.defaultPublic !== undefined) {\n let cert = tools.getCertificateInfo(obj.native.certificates.defaultPublic);\n\n if (cert) {\n const dateCertStart = cert.validityNotBefore.getTime();\n const dateCertEnd = cert.validityNotAfter.getTime();\n\n // check if the certificate is invalid (too old, longer then 825 days or key length too short)\n if (\n dateCertEnd <= Date.now() ||\n cert.keyLength < 2048 ||\n dateCertEnd - dateCertStart > tools.MAX_CERT_VALIDITY\n ) {\n // generate new certificates\n if (cert.certificateFilename) {\n console.log(\n `Existing file certificate (${cert.certificateFilename}) is invalid (too old, validity longer then 345 days or keylength too short). Please check it!`,\n );\n } else {\n console.log(\n 'Existing earlier generated certificate is invalid (too old, validity longer then 365 days or keylength too short). Generating new Certificate!',\n );\n cert = null;\n }\n }\n }\n if (!cert) {\n const newCert = tools.generateDefaultCertificates();\n\n obj.native.certificates.defaultPrivate = newCert.defaultPrivate;\n obj.native.certificates.defaultPublic = newCert.defaultPublic;\n\n try {\n await this.objects.setObjectAsync(obj._id, obj);\n console.log(`object ${obj._id} updated`);\n } catch {\n //ignore\n }\n this.dbSetup(iopkg, true, callback);\n return;\n }\n }\n this.dbSetup(iopkg, true, callback);\n } else {\n this.dbSetup(iopkg, true, callback);\n }\n } else {\n this.dbSetup(iopkg, false, callback);\n }\n }\n\n /**\n * Asks the user if he wants to migrate objects if it makes sense and performs migration according to input\n *\n * @param newConfig - updated config\n * @param oldConfig - previous config\n */\n async migrateObjects(newConfig: ioBroker.IoBrokerJson, oldConfig: ioBroker.IoBrokerJson): Promise<EXIT_CODES> {\n // allow migration if one of the db types changed or host changed of redis\n const oldStatesHasServer = await statesDbHasServer(oldConfig.states.type);\n const oldObjectsHasServer = await statesDbHasServer(oldConfig.objects.type);\n const newStatesHasServer = await statesDbHasServer(newConfig.states.type);\n const newObjectsHasServer = await statesDbHasServer(newConfig.objects.type);\n\n const oldStatesLocalServer = await isLocalStatesDbServer(oldConfig.states.type, oldConfig.states.host);\n const oldObjectsLocalServer = await isLocalObjectsDbServer(oldConfig.objects.type, oldConfig.objects.host);\n const newStatesLocalServer = await isLocalStatesDbServer(newConfig.states.type, newConfig.states.host);\n const newObjectsLocalServer = await isLocalObjectsDbServer(newConfig.objects.type, newConfig.objects.host);\n\n if (\n oldConfig &&\n (oldConfig.states.type !== newConfig.states.type ||\n oldConfig.objects.type !== newConfig.objects.type ||\n (!oldStatesHasServer && oldConfig.states.host !== newConfig.states.host) ||\n (!oldObjectsHasServer && oldConfig.objects.host !== newConfig.objects.host))\n ) {\n let fromMaster: boolean | null = oldStatesLocalServer || oldObjectsLocalServer;\n let toMaster: boolean | null = newStatesLocalServer || newObjectsLocalServer;\n\n if (!oldStatesHasServer && !oldObjectsHasServer) {\n fromMaster = null; // Master can not be detected, check new\n }\n if (!newStatesHasServer && !newObjectsHasServer) {\n toMaster = null; // new\n }\n\n let allowMigration;\n if (fromMaster) {\n if (!toMaster) {\n const answer = rl.question(\n `Please choose if this is a Master/single host (enter \"m\") or a Slave host (enter \"S\") you are about to edit. For Slave hosts the data migration will be skipped. [S/m]: `,\n {\n limit: /^[SsMm]?$/,\n defaultInput: 'S',\n },\n );\n allowMigration = !(answer === 'S' || answer === 's');\n } else {\n const answer = rl.question(\n `This host appears to be a Master or a Single host system. Is this correct? [Y/n]: `,\n {\n limit: /^[YyNnJj]?$/,\n defaultInput: 'Y',\n },\n );\n allowMigration = answer === 'Y' || answer === 'y' || answer === 'J' || answer === 'j';\n }\n } else {\n if (toMaster) {\n const answer = rl.question(\n `It appears that you want to convert this slave host into a Master or Single host system. Is this correct? [Y/n]: `,\n {\n limit: /^[YyNnJj]?$/,\n defaultInput: 'Y',\n },\n );\n allowMigration = answer === 'Y' || answer === 'y' || answer === 'J' || answer === 'j';\n } else {\n const answer = rl.question(\n `This host appears to be an ioBroker SLAVE system. Migration will be skipped. Is this correct? [Y/n]: `,\n {\n limit: /^[YyNnJj]?$/,\n defaultInput: 'Y',\n },\n );\n allowMigration = !(answer === 'Y' || answer === 'y' || answer === 'J' || answer === 'j');\n }\n }\n\n if (oldObjectsHasServer && !newObjectsHasServer) {\n console.log(COLOR_YELLOW);\n if (allowMigration) {\n console.log('');\n console.log('');\n console.log('Important #2: If you already did the migration on an other host');\n console.log('please *do not* migrate again! This can destroy your system!');\n console.log('');\n console.log('');\n console.log('Important #3: The process will migrate all files that were officially');\n console.log('uploaded into the ioBroker system. If you have manually copied files into');\n console.log('iobroker-data/files/... into own directories then these files will NOT be');\n console.log('migrated! Make sure all files are in adapter directories inside the files');\n console.log('directory!');\n }\n console.log(COLOR_RESET);\n }\n\n // FileDB -> JSONL migration is handled in the DB classes. Skip migration if both DBs are changed from File -> JsonL\n if (\n (oldConfig.states.type === newConfig.states.type ||\n (oldConfig.states.type === 'file' && newConfig.states.type === 'jsonl')) &&\n (oldConfig.objects.type === newConfig.objects.type ||\n (oldConfig.objects.type === 'file' && newConfig.objects.type === 'jsonl'))\n ) {\n console.log('Explicit migration from file to jsonl is not necessary, skipping...');\n allowMigration = false;\n }\n\n let answer = 'N';\n if (allowMigration) {\n console.log();\n answer = rl.question(\n `Do you want to migrate objects and states from \"${oldConfig.objects.type}/${oldConfig.states.type}\" to \"${newConfig.objects.type}/${newConfig.states.type}\" [y/N]: `,\n {\n limit: /^[YyNnJj]?$/,\n defaultInput: 'N',\n },\n );\n\n if (\n newConfig.objects.type !== oldConfig.objects.type &&\n (answer === 'Y' || answer === 'y' || answer === 'J' || answer === 'j')\n ) {\n console.log(COLOR_YELLOW);\n answer = rl.question(\n `Migrating the objects database will overwrite all objects! Are you sure that this is not a slave host and you want to migrate the data? [y/N]: `,\n {\n limit: /^[YyNnJj]?$/,\n defaultInput: 'N',\n },\n );\n console.log(COLOR_RESET);\n }\n }\n\n if (answer === 'Y' || answer === 'y' || answer === 'J' || answer === 'j') {\n console.log(`Connecting to previous DB \"${oldConfig.states.type}/${oldConfig.objects.type}\"...`);\n\n const { objects: objectsOld, states: statesOld, isOffline } = await dbConnectAsync(false, this.params);\n\n if (!isOffline) {\n console.error(COLOR_RED);\n console.error('Cannot migrate DB while js-controller is still running!');\n console.error(`Please stop ioBroker and try again. No settings have been changed.${COLOR_RESET}`);\n return EXIT_CODES.CONTROLLER_RUNNING;\n }\n\n // TODO: rm this if processExit is gone from BackupRestore\n // eslint-disable-next-line no-async-promise-executor\n return new Promise(async resolve => {\n const backupCreate = new BackupRestore({\n states: statesOld,\n objects: objectsOld,\n cleanDatabase: this.cleanDatabase,\n restartController: this.restartController,\n processExit: resolve,\n });\n\n console.log('Creating backup ...');\n console.log(`${COLOR_GREEN}This can take some time ... please be patient!${COLOR_RESET}`);\n\n // TODO: this can call processExit internally we want to get rid of this in the future\n let filePath = await backupCreate.createBackup('', true);\n const origBackupPath = filePath;\n filePath = filePath.replace('.tar.gz', '-migration.tar.gz');\n try {\n fs.renameSync(origBackupPath, filePath);\n } catch {\n filePath = origBackupPath;\n console.log('[Not Critical Error] Could not rename Backup file');\n }\n\n console.log(`Backup created: ${filePath}`);\n await resetDbConnect();\n\n console.log(`updating conf/${tools.appName.toLowerCase()}.json`);\n fs.writeFileSync(`${tools.getConfigFileName()}.bak`, JSON.stringify(oldConfig, null, 2));\n fs.writeFileSync(tools.getConfigFileName(), JSON.stringify(newConfig, null, 2));\n\n console.log('');\n console.log(\n `Connecting to new DB \"${newConfig.states.type}/${newConfig.objects.type}\" (can take up to 20s) ...`,\n );\n\n const { objects: objectsNew, states: statesNew } = await dbConnectAsync(true, {\n ...this.params,\n timeout: 20_000,\n });\n\n this.objects = objectsNew;\n this.states = statesNew;\n\n if (!statesNew || !objectsNew) {\n console.error(COLOR_RED);\n console.log(\n `New Database could not be connected. Please check your settings. No settings have been changed.${COLOR_RESET}`,\n );\n\n console.log(`restoring conf/${tools.appName.toLowerCase()}.json`);\n fs.writeFileSync(tools.getConfigFileName(), JSON.stringify(oldConfig, null, 2));\n fs.unlinkSync(`${tools.getConfigFileName()}.bak`);\n\n return resolve(EXIT_CODES.MIGRATION_ERROR);\n }\n\n const backupRestore = new BackupRestore({\n states: statesNew,\n objects: objectsNew,\n cleanDatabase: this.cleanDatabase,\n restartController: this.restartController,\n processExit: resolve,\n dbMigration: true,\n });\n console.log('Restore backup ...');\n console.log(`${COLOR_GREEN}This can take some time ... please be patient!${COLOR_RESET}`);\n const { objects, states, exitCode } = await backupRestore.restoreBackup({\n name: filePath,\n force: false,\n dontDeleteAdapters: true,\n });\n\n this.objects = objects;\n this.states = states;\n\n if (exitCode) {\n console.log(`Error happened during restore. Exit-Code: ${exitCode}`);\n console.log();\n console.log(`restoring conf/${tools.appName.toLowerCase()}.json`);\n fs.writeFileSync(tools.getConfigFileName(), JSON.stringify(oldConfig, null, 2));\n fs.unlinkSync(`${tools.getConfigFileName()}.bak`);\n } else {\n await this._maybeMigrateSets();\n console.log('Backup restored - Migration successful');\n console.log(COLOR_YELLOW);\n console.log('Important: If your system consists of multiple hosts please execute ');\n console.log('\"iobroker upload all\" on the master AFTER all other hosts/slaves have ');\n console.log('also been updated to this states/objects database configuration AND are');\n console.log(`running!${COLOR_RESET}`);\n }\n\n resolve(exitCode ? EXIT_CODES.MIGRATION_ERROR : EXIT_CODES.NO_ERROR);\n });\n } else if (!newObjectsHasServer) {\n console.log('');\n console.log('No Database migration was done.');\n console.log(\n `${COLOR_YELLOW}If this was done on your master host please execute \"iobroker setup first\" to newly initialize all objects.${COLOR_RESET}`,\n );\n console.log('');\n }\n }\n console.log(`updating conf/${tools.appName.toLowerCase()}.json`);\n fs.writeFileSync(tools.getConfigFileName(), JSON.stringify(newConfig, null, 2));\n return EXIT_CODES.NO_ERROR;\n }\n\n async setupCustom(): Promise<EXIT_CODES> {\n let config: ioBroker.IoBrokerJson;\n // read actual configuration\n try {\n if (fs.existsSync(tools.getConfigFileName())) {\n config = fs.readJsonSync(tools.getConfigFileName());\n } else {\n config = fs.readJsonSync(path.join(CONTROLLER_DIR, 'conf', `${tools.appName.toLowerCase()}-dist.json`));\n }\n } catch {\n config = fs.readJsonSync(path.join(CONTROLLER_DIR, 'conf', `${tools.appName.toLowerCase()}-dist.json`));\n }\n const originalConfig: ioBroker.IoBrokerJson = deepClone(config);\n\n const currentObjectsType = originalConfig.objects.type || 'jsonl';\n const currentStatesType = originalConfig.states.type || 'jsonl';\n console.log('Current configuration:');\n console.log('- Objects database:');\n console.log(` - Type: ${originalConfig.objects.type}`);\n console.log(\n ` - Host/Unix Socket: ${Array.isArray(originalConfig.objects.host) ? originalConfig.objects.host.join(',') : originalConfig.objects.host}`,\n );\n console.log(\n ` - Port: ${Array.isArray(originalConfig.objects.port) ? originalConfig.objects.port.join(',') : originalConfig.objects.port}`,\n );\n if (Array.isArray(originalConfig.objects.host)) {\n console.log(\n ` - Sentinel-Master-Name: ${\n originalConfig.objects.sentinelName\n ? originalConfig.objects.sentinelName\n : this.DEFAULT_SENTINEL_NAME\n }`,\n );\n }\n console.log('- States database:');\n console.log(` - Type: ${originalConfig.states.type}`);\n console.log(\n ` - Host/Unix Socket: ${Array.isArray(originalConfig.states.host) ? originalConfig.states.host.join(',') : originalConfig.states.host}`,\n );\n console.log(\n ` - Port: ${Array.isArray(originalConfig.states.port) ? originalConfig.states.port.join(',') : originalConfig.states.port}`,\n );\n if (Array.isArray(originalConfig.states.host)) {\n console.log(\n ` - Sentinel-Master-Name: ${\n originalConfig.states.sentinelName ? originalConfig.states.sentinelName : this.DEFAULT_SENTINEL_NAME\n }`,\n );\n }\n\n const hasObjectsServer = await objectsDbHasServer(originalConfig.objects.type);\n const hasStatesServer = await statesDbHasServer(originalConfig.states.type);\n\n if (hasObjectsServer || hasStatesServer) {\n console.log(`- Data Directory: ${tools.getDefaultDataDir()}`);\n }\n if (originalConfig?.system?.hostname) {\n console.log(`- Host name: ${originalConfig.system.hostname}`);\n }\n console.log('');\n\n let oType = rl.question(\n `Type of objects DB [(j)sonl, (f)ile, (r)edis, ...], default [${currentObjectsType}]: `,\n {\n defaultInput: currentObjectsType,\n },\n );\n oType = oType.toLowerCase();\n\n if (oType === 'r') {\n oType = 'redis';\n } else if (oType === 'f') {\n oType = 'file';\n } else if (oType === 'j') {\n oType = 'jsonl';\n }\n\n let getDefaultObjectsPort;\n try {\n const path = require.resolve(`@iobroker/db-objects-${oType}`);\n\n getDefaultObjectsPort = require(path).getDefaultPort;\n } catch {\n console.log(`${COLOR_RED}Unknown objects type: ${oType}${COLOR_RESET}`);\n if (oType !== 'file' && oType !== 'redis') {\n console.log(COLOR_YELLOW);\n console.log(`Please check that the objects db type you entered is really correct!`);\n console.log(`If yes please use \"npm i @iobroker/db-objects-${oType}\" to install it manually.`);\n console.log(`You also need to make sure you stay up to date with this package in the future!`);\n console.log(COLOR_RESET);\n }\n return EXIT_CODES.INVALID_ARGUMENTS;\n }\n\n if (oType === 'redis' && originalConfig.objects.type !== 'redis') {\n console.log(COLOR_YELLOW);\n console.log('When Objects and Files are stored in a Redis database please consider the following:');\n console.log('1. All data will be stored in RAM, make sure to have enough free RAM available!');\n console.log(\n '2. Make sure to check Redis persistence options to make sure a Redis problem will not cause data loss!',\n );\n console.log('3. The Redis persistence files can get big, make sure not to use an SD card to store them.');\n console.log(COLOR_RESET);\n }\n\n const defaultObjectsHost =\n oType === originalConfig.objects.type ? originalConfig.objects.host : tools.getLocalAddress();\n let oHost: string | string[] = rl.question(\n `Host / Unix Socket of objects DB(${oType}), default[${\n Array.isArray(defaultObjectsHost) ? defaultObjectsHost.join(',') : defaultObjectsHost\n }]: `,\n {\n defaultInput: Array.isArray(defaultObjectsHost) ? defaultObjectsHost.join(',') : defaultObjectsHost,\n },\n );\n oHost = oHost.toLowerCase();\n\n const op = getDefaultObjectsPort(oHost);\n const oSentinel = oType === 'redis' && oHost.includes(',');\n\n if (oSentinel) {\n oHost = oHost.split(',').map(host => host.trim());\n }\n\n const defaultObjectsPort =\n oType === originalConfig.objects.type && oHost === originalConfig.objects.host\n ? originalConfig.objects.port\n : op;\n\n const userObjPort = rl.question(\n `Port of objects DB(${oType}), default[${\n Array.isArray(defaultObjectsPort) ? defaultObjectsPort.join(',') : defaultObjectsPort\n }]: `,\n {\n defaultInput: Array.isArray(defaultObjectsPort) ? defaultObjectsPort.join(',') : defaultObjectsPort,\n limit: /^[0-9, ]+$/,\n },\n );\n let oPort: number | number[];\n if (userObjPort.includes(',')) {\n try {\n oPort = userObjPort.split(',').map(port => {\n const parsedPort = parseInt(port.trim(), 10);\n if (isNaN(parsedPort)) {\n console.log(`${COLOR_RED}Invalid objects port: ${parsedPort}${COLOR_RESET}`);\n throw new Error(`Invalid objects port: ${parsedPort}`);\n } else {\n return parsedPort;\n }\n });\n } catch {\n return EXIT_CODES.INVALID_ARGUMENTS;\n }\n } else {\n oPort = parseInt(userObjPort, 10);\n if (isNaN(oPort)) {\n console.log(`${COLOR_RED}Invalid objects port: ${oPort}${COLOR_RESET}`);\n return EXIT_CODES.INVALID_ARGUMENTS;\n }\n }\n\n config.objects = await performObjectsInterview({ dbType: oType, config: config.objects });\n\n let oSentinelName = null;\n if (oSentinel) {\n const defaultSentinelName = originalConfig.objects.sentinelName\n ? originalConfig.objects.sentinelName\n : this.DEFAULT_SENTINEL_NAME;\n oSentinelName = rl.question(`Objects Redis Sentinel Master Name [${defaultSentinelName}]: `, {\n defaultInput: defaultSentinelName,\n });\n }\n\n let defaultStatesType = currentStatesType;\n try {\n require.resolve(`@iobroker/db-states-${oType}`);\n defaultStatesType = oType as 'jsonl' | 'file' | 'redis'; // if states db is also available with same type we use as default\n } catch {\n // ignore, unchanged\n }\n\n let sType = rl.question(\n `Type of states DB [(j)sonl, (f)file, (r)edis, ...], default [${defaultStatesType}]: `,\n {\n defaultInput: defaultStatesType,\n },\n );\n sType = sType.toLowerCase();\n\n if (sType === 'r') {\n sType = 'redis';\n } else if (sType === 'f') {\n sType = 'file';\n } else if (sType === 'j') {\n sType = 'jsonl';\n }\n\n let getDefaultStatesPort;\n try {\n const path = require.resolve(`@iobroker/db-states-${sType}`);\n\n getDefaultStatesPort = require(path).getDefaultPort;\n } catch {\n console.log(`${COLOR_RED}Unknown states type: ${sType}${COLOR_RESET}`);\n if (sType !== 'file' && sType !== 'redis') {\n console.log(COLOR_YELLOW);\n console.log(`Please check that the states db type you entered is really correct!`);\n console.log(`If yes please use \"npm i @iobroker/db-states-${sType}\" to install it manually.`);\n console.log(`You also need to make sure you stay up to date with this package in the future!`);\n console.log(COLOR_RESET);\n }\n return EXIT_CODES.INVALID_ARGUMENTS;\n }\n\n if (sType === 'redis' && originalConfig.states.type !== 'redis' && oType !== 'redis') {\n console.log(COLOR_YELLOW);\n console.log('When States are stored in a Redis database please make sure to configure Redis');\n console.log('persistence to make sure a Redis problem will not cause data loss!');\n console.log(COLOR_RESET);\n }\n\n let defaultStatesHost =\n sType === originalConfig.states.type ? originalConfig.states.host : oHost || tools.getLocalAddress();\n if (sType === oType) {\n defaultStatesHost = oHost;\n }\n let sHost: string | string[] = rl.question(\n `Host / Unix Socket of states DB (${sType}), default[${\n Array.isArray(defaultStatesHost) ? defaultStatesHost.join(',') : defaultStatesHost\n }]: `,\n {\n defaultInput: Array.isArray(defaultStatesHost) ? defaultStatesHost.join(',') : defaultStatesHost,\n },\n );\n sHost = sHost.toLowerCase();\n\n const sp = getDefaultStatesPort(sHost);\n const sSentinel = sType === 'redis' && sHost.includes(',');\n\n if (sSentinel) {\n sHost = sHost.split(',').map(host => host.trim());\n }\n\n let defaultStatesPort =\n sType === originalConfig.states.type && sHost === originalConfig.states.host\n ? originalConfig.states.port\n : sp;\n\n const statesHasServer = await statesDbHasServer(sType);\n\n if (sType === oType && !statesHasServer && sHost === oHost) {\n defaultStatesPort = oPort;\n }\n const userStatePort = rl.question(\n `Port of states DB (${sType}), default[${\n Array.isArray(defaultStatesPort) ? defaultStatesPort.join(',') : defaultStatesPort\n }]: `,\n {\n defaultInput: Array.isArray(defaultStatesPort) ? defaultStatesPort.join(',') : defaultStatesPort,\n limit: /^[0-9, ]+$/,\n },\n );\n let sPort: number | number[];\n if (userStatePort.includes(',')) {\n sPort = [];\n sPort = userStatePort.split(',').map(port => {\n try {\n const parsedPort = parseInt(port.trim(), 10);\n if (isNaN(parsedPort)) {\n console.log(`${COLOR_RED}Invalid states port: ${parsedPort}${COLOR_RESET}`);\n throw new Error(`Invalid states port: ${parsedPort}`);\n } else {\n return parsedPort;\n }\n } catch {\n return EXIT_CODES.INVALID_ARGUMENTS;\n }\n });\n } else {\n sPort = parseInt(userStatePort, 10);\n if (isNaN(sPort)) {\n console.log(`${COLOR_RED}Invalid states port: ${sPort}${COLOR_RESET}`);\n return EXIT_CODES.INVALID_ARGUMENTS;\n }\n }\n\n config.states = await performStatesInterview({ dbType: sType, config: config.states });\n\n let sSentinelName = null;\n if (sSentinel) {\n const defaultSentinelName = originalConfig.states.sentinelName\n ? originalConfig.states.sentinelName\n : oSentinelName && oPort === sPort\n ? oSentinelName\n : this.DEFAULT_SENTINEL_NAME;\n sSentinelName = rl.question(`States Redis Sentinel Master Name [${defaultSentinelName}]: `, {\n defaultInput: defaultSentinelName,\n });\n }\n\n let dir: string | undefined;\n let hname: string;\n\n const hasLocalObjectsServer = await isLocalObjectsDbServer(oType, oHost);\n const hasLocalStatesServer = await isLocalStatesDbServer(sType, sHost);\n\n if (hasLocalStatesServer || hasLocalObjectsServer) {\n let validDataDir = false;\n\n while (!validDataDir) {\n dir = rl.question(`Data directory (file), default[${tools.getDefaultDataDir()}]: `, {\n defaultInput: tools.getDefaultDataDir(),\n });\n\n const validationInfo = tools.validateDataDir(dir);\n\n validDataDir = validationInfo.valid;\n\n if (!validDataDir) {\n console.warn(\n `${COLOR_YELLOW}The data directory is invalid. ${validationInfo.reason}${COLOR_RESET}`,\n );\n console.warn(`The current directory resolves to \"${validationInfo.path}\"`);\n }\n }\n\n hname = rl.question(\n `Host name of this machine [${\n originalConfig && originalConfig.system\n ? originalConfig.system.hostname || os.hostname()\n : os.hostname()\n }]: `,\n {\n defaultInput: (originalConfig && originalConfig.system && originalConfig.system.hostname) || '',\n },\n );\n } else {\n hname = rl.question(`Host name of this machine [${os.hostname()}]: `, {\n defaultInput: '',\n });\n }\n\n if (hname.match(/\\s/)) {\n console.log(`${COLOR_RED}Invalid host name: ${hname}${COLOR_RESET}`);\n return EXIT_CODES.INVALID_ARGUMENTS;\n }\n\n config.system ||= {} as ioBroker.IoBrokerJson['system'];\n config.system.hostname = hname;\n config.objects.host = oHost;\n config.objects.type = oType as 'jsonl' | 'file' | 'redis';\n config.objects.port = oPort;\n config.states.host = sHost;\n config.states.type = sType as 'jsonl' | 'file' | 'redis';\n config.states.port = sPort;\n config.states.dataDir = undefined;\n config.objects.dataDir = undefined;\n if (dir) {\n config.objects.dataDir = dir;\n }\n if (dir) {\n config.states.dataDir = dir;\n }\n if (\n config.objects.type === 'redis' &&\n oSentinel &&\n oSentinelName &&\n oSentinelName !== this.DEFAULT_SENTINEL_NAME\n ) {\n config.objects.sentinelName = oSentinelName;\n }\n if (\n config.states.type === 'redis' &&\n sSentinel &&\n sSentinelName &&\n sSentinelName !== this.DEFAULT_SENTINEL_NAME\n ) {\n config.states.sentinelName = sSentinelName;\n }\n\n return await this.migrateObjects(config, originalConfig);\n }\n\n /**\n * Checks if single host setup and if so migrates and activates Redis Sets Usage\n */\n private async _maybeMigrateSets(): Promise<void> {\n if (!this.objects) {\n throw new Error('Objects not set up, call setupObjects first');\n }\n\n try {\n // if we have a single host system, we need to ensure that existing objects are migrated to sets before doing anything else\n if (await tools.isSingleHost(this.objects)) {\n await this.objects.activateSets();\n const noMigrated = await this.objects.migrateToSets();\n\n if (noMigrated) {\n console.log(`Successfully migrated ${noMigrated} objects to Redis Sets`);\n }\n }\n } catch (e) {\n console.warn(`Could not migrate objects to corresponding sets: ${e.message}`);\n }\n }\n\n /**\n * Ensure that host object exists\n */\n private async _ensureHostObject(): Promise<void> {\n if (!this.objects) {\n throw new Error('Objects not set up, call setupObjects first');\n }\n\n const hostname = tools.getHostName();\n\n const id = `system.host.${hostname}`;\n const objExists = await this.objects.objectExists(id);\n\n if (!objExists) {\n await this.objects.setObject(id, getHostObject());\n console.log(`Created host object \"${id}\"`);\n }\n }\n\n /**\n * Add or update adapter-core in supported version in the overrides field of the root package.json and call install there to apply it\n */\n private async addOrUpdateAdapterCoreRequirement(): Promise<void> {\n if (tools.isDevInstallation()) {\n return;\n }\n\n const rootDir = tools.getRootDir();\n const packPath = path.join(rootDir, 'package.json');\n const packJson = await fs.readJson(packPath);\n\n if (packJson.overrides?.['@iobroker/adapter-core'] === this.SUPPORTED_ADAPTER_CORE_VERSION) {\n console.log(\n `The supported version of \"@iobroker/adapter-core\" is already specified as \"${this.SUPPORTED_ADAPTER_CORE_VERSION}\"`,\n );\n return;\n }\n\n packJson.overrides = { '@iobroker/adapter-core': this.SUPPORTED_ADAPTER_CORE_VERSION };\n\n await fs.writeFile(packPath, JSON.stringify(packJson));\n\n console.log(\n `Successfully specified supported \"@iobroker/adapter-core\" version as \"${this.SUPPORTED_ADAPTER_CORE_VERSION}\"`,\n );\n }\n\n /**\n * Create the adapters object per host if not yet existing\n */\n private async _ensureAdaptersPerHostObject(): Promise<void> {\n if (!this.objects) {\n throw new Error('Objects not set up, call setupObjects first');\n }\n\n if (!this.states) {\n throw new Error('States not set up, call setupObjects first');\n }\n\n const hostname = tools.getHostName();\n const adaptersId = `system.host.${hostname}.adapter`;\n\n const adaptersExist = await this.objects.objectExists(adaptersId);\n\n if (adaptersExist) {\n return;\n }\n\n console.log(`Creating adapter objects for host \"${hostname}\"`);\n\n await this.objects.setObject(adaptersId, {\n type: 'folder',\n common: {\n name: {\n en: 'Installed adapters',\n de: 'Installierte Adapter',\n ru: '\u0423\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043D\u044B\u0435 \u0430\u0434\u0430\u043F\u0442\u0435\u0440\u044B',\n pt: 'Adaptadores instalados',\n nl: 'Ge\u00EFnstalleerde adapters',\n fr: 'Adaptateurs install\u00E9s',\n it: 'Adattatori installati',\n es: 'Adaptadores instalados',\n pl: 'Zainstalowane adaptery',\n uk: '\u0412\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u0456 \u0430\u0434\u0430\u043F\u0442\u0435\u0440\u0438',\n 'zh-cn': '\u5DF2\u5B89\u88C5\u7684\u9002\u914D\u5668',\n },\n desc: {\n en: 'Installed adapters on this host',\n de: 'Installierte Adapter auf diesem Host',\n ru: '\u0423\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043D\u044B\u0435 \u0430\u0434\u0430\u043F\u0442\u0435\u0440\u044B \u043D\u0430 \u044D\u0442\u043E\u043C \u0445\u043E\u0441\u0442\u0435',\n pt: 'Adaptadores instalados neste anfitri\u00E3o',\n nl: 'Ge\u00EFnstalleerde adapters op deze host',\n fr: 'Adaptateurs install\u00E9s sur cet h\u00F4te',\n it: 'Adattatori installati su questo host',\n es: 'Adaptadores instalados en este host',\n pl: 'Zainstalowane karty na tym ho\u015Bcie',\n uk: '\u0412\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u0456 \u0430\u0434\u0430\u043F\u0442\u0435\u0440\u0438 \u043D\u0430 \u0446\u044C\u043E\u043C\u0443 \u0445\u043E\u0441\u0442\u0456',\n 'zh-cn': '\u8BE5\u4E3B\u673A\u4E0A\u5DF2\u5B89\u88C5\u7684\u9002\u914D\u5668',\n },\n },\n native: {},\n });\n\n const adaptersView = await this.objects.getObjectViewAsync('system', 'adapter', {\n startkey: SYSTEM_ADAPTER_PREFIX,\n endkey: `${SYSTEM_ADAPTER_PREFIX}\\u9999`,\n });\n\n const rootPackJson = await fs.readJSON(path.join(tools.getRootDir(), 'package.json'));\n\n const setupUpload = new Upload({ objects: this.objects, states: this.states });\n\n for (const row of adaptersView.rows) {\n const { name } = row.value.common;\n\n if (!rootPackJson.dependencies[`iobroker.${name}`]) {\n continue;\n }\n\n await setupUpload.upgradeAdapterObjects(name);\n }\n }\n\n /**\n * Replace the `controller.js` file in the root directory to work with ESM\n */\n async _fixWindowsControllerJs(): Promise<void> {\n const content = `import('./node_modules/iobroker.js-controller/controller.js');`;\n const filePath = path.join(tools.getRootDir(), 'controller.js');\n\n try {\n await fs.writeFile(filePath, content, { encoding: 'utf-8' });\n } catch (e) {\n console.error(`Could not fix \"${filePath}\": ${e.message}`);\n }\n }\n\n /**\n * Perform multiple cleanup operations, to clean up inconsistent states due to past bugs or edge case errors\n */\n private async _cleanupInstallation(): Promise<void> {\n console.log('Clean up binary states ...');\n try {\n await this._cleanupBinaryStates();\n } catch (e) {\n console.error(`Cannot clean up binary states: ${e.message}`);\n }\n\n console.log('Clean up invalid group assignments ...');\n try {\n await this._cleanupInvalidGroupAssignments();\n } catch (e) {\n console.error(`Cannot clean up invalid user group assignments: ${e.message}`);\n }\n\n console.log('Clean up garbage objects ...');\n try {\n await this._cleanupGarbageObjects();\n } catch (e) {\n console.error(`Cannot clean up garbage objects: ${e.message}`);\n }\n\n console.log('Clean up leftover adapters ...');\n try {\n await this._cleanupLeftoverAdapters();\n } catch (e) {\n console.error(`Cannot clean up leftover adapters: ${e.message}`);\n }\n\n console.log('Clean up objects and states with forbidden characters ...');\n try {\n await this._cleanupForbiddenIds();\n } catch (e) {\n console.error(`Cannot clean up objects and states with forbidden IDs: ${e.message}`);\n }\n }\n\n /**\n * Cleanup adapter objects from already removed adapters, which are still there due to errors or past bugs\n */\n private async _cleanupLeftoverAdapters(): Promise<void> {\n if (!this.objects) {\n throw new Error('Objects not set up, call setupObjects first');\n }\n\n const hostsView = await this.objects.getObjectViewAsync('system', 'host', {\n startkey: SYSTEM_HOST_PREFIX,\n endkey: `${SYSTEM_HOST_PREFIX}\\u9999`,\n });\n\n const hostIds = hostsView.rows.map(row => row.id);\n\n for (const hostId of hostIds) {\n const hasAdapters = await this.objects.objectExists(`${hostId}.adapter`);\n\n if (!hasAdapters) {\n console.log(\n `Skipping cleanup leftover adapters, because host \"${hostId}\" is not yet migrated to a supporting controller version`,\n );\n return;\n }\n }\n\n const adaptersViewPerHost = await this.objects.getObjectViewAsync('system', 'adapter', {\n startkey: SYSTEM_HOST_PREFIX,\n endkey: `${SYSTEM_HOST_PREFIX}\\u9999`,\n });\n\n const installedAdapterNames = adaptersViewPerHost.rows.map(row => row.value.common.name);\n\n const adaptersView = await this.objects.getObjectViewAsync('system', 'adapter', {\n startkey: SYSTEM_ADAPTER_PREFIX,\n endkey: `${SYSTEM_ADAPTER_PREFIX}\\u9999`,\n });\n\n for (const row of adaptersView.rows) {\n if (!installedAdapterNames.includes(row.value.common.name)) {\n await this.objects.delObject(row.id);\n console.log(`Cleaned up leftover adapter object \"${row.id}\"`);\n }\n }\n }\n\n /**\n * Cleanup all states and objects which contain forbidden chars in their id\n */\n private async _cleanupForbiddenIds(): Promise<void> {\n if (!this.objects) {\n throw new Error('Objects not set up, call setupObjects first');\n }\n\n if (!this.states) {\n throw new Error('States not set up, call setupObjects first');\n }\n\n const objIds = await this.objects.getKeys('*');\n\n if (objIds) {\n for (const id of objIds) {\n if (FORBIDDEN_CHARS.test(id)) {\n await this.objects.delObject(id);\n console.log(`Deleted object \"${id}\" because it contains forbidden characters`);\n }\n }\n }\n\n const stateIds = await this.states.getKeys('*');\n\n if (stateIds) {\n for (const id of stateIds) {\n if (FORBIDDEN_CHARS.test(id)) {\n await this.states.delState(id);\n console.log(`Deleted state \"${id}\" because it contains forbidden characters`);\n }\n }\n }\n }\n\n /**\n * Cleanup objects which are known to be created on accident in the past by adapters or controller\n */\n private async _cleanupGarbageObjects(): Promise<void> {\n if (!this.objects) {\n throw new Error('Objects not set up, call setupObjects first');\n }\n\n for (const garbageId of this.KNOWN_GARBAGE_OBJECT_IDS) {\n const isExisting = await this.objects.objectExists(garbageId);\n\n if (isExisting) {\n await this.objects.delObject(garbageId);\n console.log(`Successfully removed garbage object \"${garbageId}\"`);\n }\n }\n }\n\n /**\n * Removes all binary state related objects and states\n */\n private async _cleanupBinaryStates(): Promise<void> {\n if (!this.objects) {\n throw new Error('Objects not set up, call setupObjects first');\n }\n\n if (!this.states) {\n throw new Error('States not set up, call setupObjects first');\n }\n\n const hostsView = await this.objects.getObjectViewAsync('system', 'host', {\n startkey: SYSTEM_HOST_PREFIX,\n endkey: `${SYSTEM_HOST_PREFIX}\\u9999`,\n });\n\n const hostIds = hostsView.rows.map(row => row.id);\n\n for (const hostId of hostIds) {\n const zipId = `${hostId}.zip`;\n const zipFolderExists = await this.objects.objectExists(zipId);\n\n if (!zipFolderExists) {\n continue;\n }\n\n await this.objects.delObject(zipId);\n console.log(`Deleted object \"${zipId}\" during binary state clean up`);\n }\n\n const statesView = await this.objects.getObjectViewAsync('system', 'state', {\n startkey: '',\n endkey: '\\u9999',\n });\n\n for (const row of statesView.rows) {\n if ((row.value.common.type as ioBroker.CommonType | 'file') === 'file') {\n await this.objects.delObject(row.id);\n await this.states.delState(row.id);\n console.log(`Deleted object \"${row.id}\" during binary state clean up`);\n }\n }\n }\n\n /**\n * Removes non-existing users from groups\n */\n private async _cleanupInvalidGroupAssignments(): Promise<void> {\n if (!this.objects) {\n throw new Error('Objects not set up, call setupObjects first');\n }\n\n const usersView = await this.objects.getObjectViewAsync('system', 'user');\n const groupView = await this.objects.getObjectViewAsync('system', 'group');\n\n const existingUsers = usersView.rows.map(obj => obj.value._id);\n\n for (const group of groupView.rows) {\n // reference for readability\n const groupMembers = group.value.common.members;\n\n if (!Array.isArray(groupMembers)) {\n // fix legacy objects\n const obj = group.value;\n obj.common.members = [];\n await this.objects.setObjectAsync(obj._id, obj);\n continue;\n }\n\n let changed = false;\n\n for (let i = groupMembers.length - 1; i >= 0; i--) {\n if (!existingUsers.includes(groupMembers[i])) {\n // we have found a non-existing user, so remove it\n changed = true;\n console.log(`Removed non-existing user \"${groupMembers[i]}\" from group \"${group.value._id}\"`);\n groupMembers.splice(i, 1);\n }\n }\n\n if (changed) {\n await this.objects.setObjectAsync(group.value._id, group.value);\n }\n }\n }\n\n /**\n * Set up the installation with config file, host object, scripts etc\n *\n * @param options setup options\n */\n setup(options: SetupCommandOptions): void {\n const { ignoreIfExist, useRedis, callback } = options;\n\n let config: ioBroker.IoBrokerJson;\n let isCreated = false;\n const platform = os.platform();\n const otherInstallDirs = [];\n\n // copy reinstall.js file into root\n if (fs.existsSync(path.join(CONTROLLER_DIR, '..', '..', 'node_modules'))) {\n try {\n if (fs.existsSync(path.join(CONTROLLER_DIR, 'reinstall.js'))) {\n fs.writeFileSync(\n path.join(CONTROLLER_DIR, '..', '..', 'reinstall.js'),\n fs.readFileSync(path.join(CONTROLLER_DIR, 'reinstall.js')),\n );\n }\n } catch (e) {\n console.warn(`Cannot write file. Not critical: ${e.message}`);\n }\n }\n // Delete files for other OS\n if (platform.startsWith('win')) {\n otherInstallDirs.push(path.join(CONTROLLER_DIR, tools.appName));\n otherInstallDirs.push(path.join(CONTROLLER_DIR, tools.appName.substring(0, 3)));\n otherInstallDirs.push(path.join(CONTROLLER_DIR, 'killall.sh'));\n otherInstallDirs.push(path.join(CONTROLLER_DIR, 'reinstall.sh'));\n } else {\n // copy scripts to root directory\n if (fs.existsSync(path.join(CONTROLLER_DIR, '..', '..', 'node_modules'))) {\n const startFile = `#!/usr/bin/env node\nrequire('${path.normalize(`${thisDir}/..`)}/setup').execute();`;\n\n try {\n if (fs.existsSync(path.join(CONTROLLER_DIR, 'killall.sh'))) {\n fs.writeFileSync(\n path.join(CONTROLLER_DIR, '..', '..', 'killall.sh'),\n fs.readFileSync(path.join(CONTROLLER_DIR, 'killall.sh')),\n { mode: 492 /* 0754 */ },\n );\n }\n if (fs.existsSync(path.join(CONTROLLER_DIR, 'reinstall.sh'))) {\n fs.writeFileSync(\n path.join(CONTROLLER_DIR, '..', '..', 'reinstall.sh'),\n fs.readFileSync(path.join(CONTROLLER_DIR, 'reinstall.sh')),\n { mode: 492 /* 0754 */ },\n );\n }\n if (!fs.existsSync(path.join(CONTROLLER_DIR, '..', '..', `${tools.appName.substring(0, 3)}`))) {\n fs.writeFileSync(\n path.join(CONTROLLER_DIR, '..', '..', `${tools.appName.substring(0, 3)}`),\n startFile,\n {\n mode: 492 /* 0754 */,\n },\n );\n }\n if (!fs.existsSync(path.join(CONTROLLER_DIR, '..', '..', `${tools.appName}`))) {\n fs.writeFileSync(path.join(CONTROLLER_DIR, '..', '..', `${tools.appName}`), startFile, {\n mode: 492 /* 0754 */,\n });\n }\n } catch (e) {\n console.warn(`Cannot write file. Not critical: ${e.message}`);\n }\n }\n }\n\n for (let t = 0; t < otherInstallDirs.length; t++) {\n if (fs.existsSync(otherInstallDirs[t])) {\n const stat = fs.statSync(otherInstallDirs[t]);\n if (stat.isDirectory()) {\n const files = fs.readdirSync(otherInstallDirs[t]);\n for (let f = 0; f < files.length; f++) {\n fs.unlinkSync(path.join(otherInstallDirs[t], files[f]));\n }\n fs.rmdirSync(otherInstallDirs[t]);\n } else {\n try {\n fs.unlinkSync(otherInstallDirs[t]);\n } catch (e) {\n console.warn(`Cannot delete file. Not critical: ${e.message}`);\n }\n }\n }\n }\n\n // Create log and tmp directory\n if (!fs.existsSync(`${CONTROLLER_DIR}/tmp`)) {\n fs.mkdirSync(`${CONTROLLER_DIR}/tmp`);\n }\n\n const configFileName = tools.getConfigFileName();\n\n // only change config if non-existing - else setup custom has to be used\n if (!fs.existsSync(configFileName)) {\n isCreated = true;\n config = fs.readJsonSync(path.join(CONTROLLER_DIR, 'conf', `${tools.appName.toLowerCase()}-dist.json`));\n\n console.log(`creating conf/${tools.appName.toLowerCase()}.json`);\n config.objects.host = this.params.objects || tools.getLocalAddress();\n config.states.host = this.params.states || tools.getLocalAddress();\n if (useRedis) {\n config.states.type = 'redis';\n config.states.port = this.params.port || 6379;\n config.objects.type = 'redis';\n config.objects.port = this.params.port || 6379;\n }\n\n // this path is relative to js-controller\n config.dataDir = tools.getDefaultDataDir();\n\n fs.mkdirSync(path.join(CONTROLLER_DIR, config.dataDir), { recursive: true });\n\n const dirName = path.dirname(configFileName);\n\n if (!fs.existsSync(dirName)) {\n fs.mkdirSync(dirName.replace(/\\\\/g, '/'), { recursive: true });\n }\n\n // Create default data dir\n fs.writeFileSync(configFileName, JSON.stringify(config, null, 2));\n\n try {\n // Create\n if (\n thisDir\n .toLowerCase()\n .replace(/\\\\/g, '/')\n .includes(`node_modules/${tools.appName.toLowerCase()}.js-controller`)\n ) {\n const parts = config.dataDir.split('/');\n // Remove appName-data/\n parts.pop();\n parts.pop();\n const path_ = parts.join('/');\n\n if (!fs.existsSync(path.join(CONTROLLER_DIR, path_, 'log'))) {\n fs.mkdirSync(path.join(CONTROLLER_DIR, path_, 'log'));\n }\n } else {\n if (!fs.existsSync(path.join(CONTROLLER_DIR, 'log'))) {\n fs.mkdirSync(path.join(CONTROLLER_DIR, 'log'));\n }\n }\n } catch (e) {\n console.log(`Non-critical error: ${e.message}`);\n }\n } else if (ignoreIfExist) {\n // it is a setup first run and config exists yet\n this.setupObjects(() => callback?.(), true);\n return;\n }\n\n this.setupObjects(() => callback?.(isCreated));\n }\n}\n", "export const __import_meta_url =\n typeof document === 'undefined' ? new (require('url'.replace('', '')).URL)('file:' + __filename).href :\n (document.currentScript && document.currentScript.src || new URL('main.js', document.baseURI).href)\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Setup\n *\n * Copyright 2013-2024 bluefox <dogafox@gmail.com>\n *\n * MIT License\n *\n */\nimport fs from 'fs-extra';\nimport path from 'node:path';\n\nimport type { CleanDatabaseHandler, IoPackage, ProcessExitCallback, RestartController } from '@/lib/_Types.js';\nimport type { Client as StatesRedisClient } from '@iobroker/db-states-redis';\nimport type { Client as ObjectsRedisClient } from '@iobroker/db-objects-redis';\n\nimport { EXIT_CODES, tools } from '@iobroker/js-controller-common';\nimport {\n statesDbHasServer,\n isLocalStatesDbServer,\n isLocalObjectsDbServer,\n objectsDbHasServer,\n performObjectsInterview,\n performStatesInterview,\n} from '@iobroker/js-controller-common';\nimport { resetDbConnect, dbConnectAsync } from '@/lib/setup/dbConnection.js';\nimport { BackupRestore } from '@/lib/setup/setupBackup.js';\nimport crypto from 'node:crypto';\nimport deepClone from 'deep-clone';\nimport * as pluginInfos from '@/lib/setup/pluginInfos.js';\nimport rl from 'readline-sync';\nimport { FORBIDDEN_CHARS, getHostObject } from '@iobroker/js-controller-common-db/tools';\nimport os from 'node:os';\nimport { SYSTEM_ADAPTER_PREFIX, SYSTEM_HOST_PREFIX } from '@iobroker/js-controller-common-db/constants';\nimport { Upload } from '@/lib/setup/setupUpload.js';\nimport { createRequire } from 'node:module';\nimport * as url from 'node:url';\n\n// eslint-disable-next-line unicorn/prefer-module\nconst thisDir = url.fileURLToPath(new URL('.', import.meta.url || `file://${__filename}`));\n// eslint-disable-next-line unicorn/prefer-module\nconst require = createRequire(import.meta.url || `file://${__filename}`);\n\nconst COLOR_RED = '\\x1b[31m';\nconst COLOR_YELLOW = '\\x1b[33m';\nconst COLOR_RESET = '\\x1b[0m';\nconst COLOR_GREEN = '\\x1b[32m';\nconst CONTROLLER_DIR = tools.getControllerDir();\n\nexport interface CLISetupOptions {\n cleanDatabase: CleanDatabaseHandler;\n processExit: ProcessExitCallback;\n params: Record<string, any>;\n restartController: RestartController;\n}\n\nexport interface SetupCommandOptions {\n /** Callback called afterward */\n callback: (isCreated?: boolean) => void;\n /** Used for setup first run, does setup process even though config file already exists */\n ignoreIfExist: boolean;\n /** If redis should be setup */\n useRedis: boolean;\n}\n\nexport class Setup {\n /** Object IDs which are not allowed to exist but could be generated due to errors in the past */\n private readonly KNOWN_GARBAGE_OBJECT_IDS = ['null', 'undefined'];\n /** Default name for redis sentinels */\n private readonly DEFAULT_SENTINEL_NAME = 'mymaster';\n private readonly processExit: ProcessExitCallback;\n private states: StatesRedisClient | undefined;\n private objects: ObjectsRedisClient | undefined;\n private readonly params: Record<string, any>;\n private readonly cleanDatabase: CleanDatabaseHandler;\n private readonly restartController: RestartController;\n\n constructor(options: CLISetupOptions) {\n this.processExit = options.processExit;\n this.params = options.params;\n this.cleanDatabase = options.cleanDatabase;\n this.restartController = options.restartController;\n\n this.dbSetup = this.dbSetup.bind(this);\n }\n\n async informAboutPlugins(systemConfig?: ioBroker.SystemConfigObject | null): Promise<void> {\n if (!this.states) {\n throw new Error('States not set up, call setupObjects first');\n }\n\n let ioPackage: IoPackage | undefined;\n let ioConfig: ioBroker.IoBrokerJson | undefined;\n\n const configFile = tools.getConfigFileName();\n try {\n ioPackage = JSON.parse(fs.readFileSync(path.join(CONTROLLER_DIR, 'io-package.json'), 'utf8'));\n } catch {\n console.error('Cannot read js-controller io-package.json. Ignore plugins defined there.');\n }\n try {\n ioConfig = JSON.parse(fs.readFileSync(configFile, 'utf8'));\n } catch {\n console.error('Can not read js-controller config file. Ignore plugins defined there.');\n }\n\n const plugins: Record<string, any> = {};\n if (ioPackage?.common?.plugins) {\n for (const [plugin, pluginData] of Object.entries(ioPackage.common.plugins)) {\n if (pluginData.enabled !== false) {\n plugins[plugin] = pluginData;\n }\n }\n }\n\n if (ioConfig?.plugins) {\n for (const [plugin, pluginData] of Object.entries(ioConfig.plugins)) {\n if (!plugins[plugin] && pluginData.enabled !== false) {\n plugins[plugin] = pluginData;\n }\n }\n }\n\n let systemLang = 'en';\n let systemDiag = 'extended';\n if (systemConfig?.common) {\n systemDiag = systemConfig.common.diag || 'extended';\n systemLang = systemConfig.common.language || 'en';\n }\n\n for (const plugin of Object.keys(plugins)) {\n // @ts-expect-error it is our testing style\n const pluginInfo = pluginInfos.PLUGIN_INFOS[plugin];\n if (!pluginInfo) {\n // We do not have relevant information to display\n continue;\n }\n if (systemDiag === 'none' && pluginInfos.isReportingPlugin(plugin)) {\n // Reporting plugins respect \"diag\" and do not send information if diag is disabled\n continue;\n }\n\n let enabledState;\n try {\n enabledState = await this.states.getStateAsync(\n `system.host.${tools.getHostName()}.plugins.${plugin}.enabled`,\n );\n } catch {\n // ignore\n }\n if (enabledState && enabledState.val !== undefined) {\n // already configured, so do not output again\n continue;\n }\n\n const infoHeadLine = pluginInfo.headline[systemLang] || pluginInfo.headline.en;\n const infoText = pluginInfo.text[systemLang] || pluginInfo.text.en;\n\n console.error(COLOR_RED);\n console.error(infoHeadLine);\n console.error(COLOR_YELLOW);\n console.error(infoText);\n console.error();\n console.error(COLOR_RESET);\n }\n }\n\n /**\n * Called after io-package objects are created (hence object view functionalities are now available)\n *\n * @param systemConfig the system config object\n * @param callback callback function\n */\n async setupReady(\n systemConfig: ioBroker.SystemConfigObject | undefined | null,\n callback: () => void,\n ): Promise<void> {\n if (!callback) {\n console.log(`database setup done. You can add adapters and start ${tools.appName} now`);\n return this.processExit(EXIT_CODES.NO_ERROR);\n }\n\n if (!this.objects) {\n throw new Error('Objects not set up, call setupObjects first');\n }\n\n try {\n await this._ensureHostObject();\n } catch (e) {\n console.error(`Could not ensure host object exists: ${e.message}`);\n }\n\n try {\n await this._ensureAdaptersPerHostObject();\n } catch (e) {\n console.error(`Could not ensure that adapters object for this host exists: ${e.message}`);\n }\n\n if (process.platform === 'win32') {\n // TODO: remove this fix after controller v6\n await this._fixWindowsControllerJs();\n }\n\n try {\n await this.removeAdapterCoreRequirement();\n } catch (e) {\n console.error(`Could not remove \"@iobroker/adapter-core\" override: ${e.message}`);\n }\n\n await this._cleanupInstallation();\n\n // special methods which are only there on objects server\n // TODO this check will lead to objects being never in the following code\n if (!('syncFileDirectory' in this.objects) || !('dirExists' in this.objects)) {\n await this.informAboutPlugins(systemConfig);\n return void callback();\n }\n\n // check meta.user\n try {\n const objExists = await this.objects.objectExists('meta.user');\n if (objExists) {\n // check if dir is missing\n // @ts-expect-error due to check above type gets never, we should add the methods to the interface in db\n const dirExists = this.objects.dirExists('meta.user');\n if (!dirExists) {\n // create meta.user, so users see them as upload target\n await this.objects.mkdirAsync('meta.user');\n console.log('Successfully created \"meta.user\" directory');\n }\n }\n } catch (e) {\n console.warn(`Could not create directory \"meta.user\": ${e.message}`);\n }\n\n try {\n // @ts-expect-error due to check above type gets never, we should add the methods to the interface in db\n const { numberSuccess, notifications } = this.objects.syncFileDirectory();\n numberSuccess &&\n console.log(\n `${numberSuccess} file(s) successfully synchronized with ioBroker storage.\nPlease DO NOT copy files manually into ioBroker storage directories!`,\n );\n if (notifications.length) {\n console.log();\n console.log('The following notifications happened during sync: ');\n notifications.forEach((el: string) => console.log(`- ${el}`));\n console.log();\n }\n await this.informAboutPlugins(systemConfig);\n return void callback();\n } catch (e) {\n console.error(`Error on file directory sync: ${e.message}`);\n await this.informAboutPlugins(systemConfig);\n return void callback();\n }\n }\n\n async dbSetup(iopkg: IoPackage, ignoreExisting: boolean, callback: () => void): Promise<void> {\n if (!this.objects) {\n throw new Error('Objects not set up, call setupObjects first');\n }\n\n if (iopkg.objects?.length > 0) {\n const obj = iopkg.objects.pop()!;\n\n let existingObj: ioBroker.Object | undefined | null;\n try {\n existingObj = await this.objects.getObject(obj._id);\n } catch {\n // ignore\n }\n if (!existingObj || existingObj._id.startsWith('_design/')) {\n obj.from = `system.host.${tools.getHostName()}.cli`;\n obj.ts = Date.now();\n await this.objects.setObjectAsync(obj._id, obj);\n console.log(`object \"${obj._id}\" ${!existingObj ? 'created' : 'updated'}`);\n setTimeout(this.dbSetup, 25, iopkg, ignoreExisting, callback);\n } else {\n if (!ignoreExisting) {\n console.log(`object \"${obj._id}\" already exists`);\n }\n setTimeout(this.dbSetup, 25, iopkg, ignoreExisting, callback);\n }\n } else {\n await tools.createUuid(this.objects);\n let configObj: ioBroker.SystemConfigObject | null | undefined;\n // check if encrypt secret exists\n try {\n configObj = await this.objects.getObject('system.config');\n } catch {\n return this.setupReady(configObj, callback);\n }\n\n const configFixed = await this.fixConfig(configObj);\n\n if (configFixed) {\n await this.objects.setObject('system.config', configObj!);\n }\n\n return this.setupReady(configObj, callback);\n }\n }\n\n /**\n * Fix the config object if existing\n *\n * @param configObj the current system.config object\n */\n private async fixConfig(configObj: ioBroker.SystemConfigObject | null | undefined): Promise<boolean> {\n let configFixed = false;\n\n if (!configObj) {\n return configFixed;\n }\n\n if (configObj.type !== 'config') {\n configObj.type = 'config';\n configObj.from = `system.host.${tools.getHostName()}.cli`;\n configObj.ts = Date.now();\n configFixed = true;\n }\n\n if (!configObj.native?.secret) {\n const buf = crypto.randomBytes(24);\n configObj.native ||= {};\n configObj.native.secret = buf.toString('hex');\n configObj.from = `system.host.${tools.getHostName()}.cli`;\n configObj.ts = Date.now();\n await this.objects!.setObject('system.config', configObj);\n }\n\n if (!configObj.common.adapterAutoUpgrade && configObj.common.activeRepo.length) {\n const repoName = configObj.common.activeRepo[0];\n\n configObj.common.adapterAutoUpgrade = {\n defaultPolicy: 'none',\n repositories: {\n [repoName]: true,\n },\n };\n }\n\n return configFixed;\n }\n\n /**\n * Creates objects and does object related cleanup\n *\n * @param callback callback function\n * @param checkCertificateOnly if only certificate check is desired\n */\n async setupObjects(callback: () => void, checkCertificateOnly?: boolean): Promise<void> {\n const { states: _states, objects: _objects } = await dbConnectAsync(false, this.params);\n this.objects = _objects;\n this.states = _states;\n const iopkg = fs.readJsonSync(path.join(CONTROLLER_DIR, 'io-package.json'));\n\n await this._maybeMigrateSets();\n\n if (checkCertificateOnly) {\n let certObj: ioBroker.Object | undefined;\n if (iopkg?.objects) {\n for (const obj of iopkg.objects) {\n if (obj?._id === 'system.certificates') {\n certObj = obj;\n break;\n }\n }\n }\n\n if (certObj) {\n let obj: ioBroker.Object | null | undefined = null;\n try {\n obj = await this.objects.getObjectAsync('system.certificates');\n } catch {\n // ignore\n }\n\n if (obj?.native?.certificates?.defaultPublic !== undefined) {\n let cert = tools.getCertificateInfo(obj.native.certificates.defaultPublic);\n\n if (cert) {\n const dateCertStart = cert.validityNotBefore.getTime();\n const dateCertEnd = cert.validityNotAfter.getTime();\n\n // check if the certificate is invalid (too old, longer then 825 days or key length too short)\n if (\n dateCertEnd <= Date.now() ||\n cert.keyLength < 2048 ||\n dateCertEnd - dateCertStart > tools.MAX_CERT_VALIDITY\n ) {\n // generate new certificates\n if (cert.certificateFilename) {\n console.log(\n `Existing file certificate (${cert.certificateFilename}) is invalid (too old, validity longer then 345 days or keylength too short). Please check it!`,\n );\n } else {\n console.log(\n 'Existing earlier generated certificate is invalid (too old, validity longer then 365 days or keylength too short). Generating new Certificate!',\n );\n cert = null;\n }\n }\n }\n if (!cert) {\n const newCert = tools.generateDefaultCertificates();\n\n obj.native.certificates.defaultPrivate = newCert.defaultPrivate;\n obj.native.certificates.defaultPublic = newCert.defaultPublic;\n\n try {\n await this.objects.setObjectAsync(obj._id, obj);\n console.log(`object ${obj._id} updated`);\n } catch {\n //ignore\n }\n this.dbSetup(iopkg, true, callback);\n return;\n }\n }\n this.dbSetup(iopkg, true, callback);\n } else {\n this.dbSetup(iopkg, true, callback);\n }\n } else {\n this.dbSetup(iopkg, false, callback);\n }\n }\n\n /**\n * Asks the user if he wants to migrate objects if it makes sense and performs migration according to input\n *\n * @param newConfig - updated config\n * @param oldConfig - previous config\n */\n async migrateObjects(newConfig: ioBroker.IoBrokerJson, oldConfig: ioBroker.IoBrokerJson): Promise<EXIT_CODES> {\n // allow migration if one of the db types changed or host changed of redis\n const oldStatesHasServer = await statesDbHasServer(oldConfig.states.type);\n const oldObjectsHasServer = await statesDbHasServer(oldConfig.objects.type);\n const newStatesHasServer = await statesDbHasServer(newConfig.states.type);\n const newObjectsHasServer = await statesDbHasServer(newConfig.objects.type);\n\n const oldStatesLocalServer = await isLocalStatesDbServer(oldConfig.states.type, oldConfig.states.host);\n const oldObjectsLocalServer = await isLocalObjectsDbServer(oldConfig.objects.type, oldConfig.objects.host);\n const newStatesLocalServer = await isLocalStatesDbServer(newConfig.states.type, newConfig.states.host);\n const newObjectsLocalServer = await isLocalObjectsDbServer(newConfig.objects.type, newConfig.objects.host);\n\n if (\n oldConfig &&\n (oldConfig.states.type !== newConfig.states.type ||\n oldConfig.objects.type !== newConfig.objects.type ||\n (!oldStatesHasServer && oldConfig.states.host !== newConfig.states.host) ||\n (!oldObjectsHasServer && oldConfig.objects.host !== newConfig.objects.host))\n ) {\n let fromMaster: boolean | null = oldStatesLocalServer || oldObjectsLocalServer;\n let toMaster: boolean | null = newStatesLocalServer || newObjectsLocalServer;\n\n if (!oldStatesHasServer && !oldObjectsHasServer) {\n fromMaster = null; // Master can not be detected, check new\n }\n if (!newStatesHasServer && !newObjectsHasServer) {\n toMaster = null; // new\n }\n\n let allowMigration;\n if (fromMaster) {\n if (!toMaster) {\n const answer = rl.question(\n `Please choose if this is a Master/single host (enter \"m\") or a Slave host (enter \"S\") you are about to edit. For Slave hosts the data migration will be skipped. [S/m]: `,\n {\n limit: /^[SsMm]?$/,\n defaultInput: 'S',\n },\n );\n allowMigration = !(answer === 'S' || answer === 's');\n } else {\n const answer = rl.question(\n `This host appears to be a Master or a Single host system. Is this correct? [Y/n]: `,\n {\n limit: /^[YyNnJj]?$/,\n defaultInput: 'Y',\n },\n );\n allowMigration = answer === 'Y' || answer === 'y' || answer === 'J' || answer === 'j';\n }\n } else {\n if (toMaster) {\n const answer = rl.question(\n `It appears that you want to convert this slave host into a Master or Single host system. Is this correct? [Y/n]: `,\n {\n limit: /^[YyNnJj]?$/,\n defaultInput: 'Y',\n },\n );\n allowMigration = answer === 'Y' || answer === 'y' || answer === 'J' || answer === 'j';\n } else {\n const answer = rl.question(\n `This host appears to be an ioBroker SLAVE system. Migration will be skipped. Is this correct? [Y/n]: `,\n {\n limit: /^[YyNnJj]?$/,\n defaultInput: 'Y',\n },\n );\n allowMigration = !(answer === 'Y' || answer === 'y' || answer === 'J' || answer === 'j');\n }\n }\n\n if (oldObjectsHasServer && !newObjectsHasServer) {\n console.log(COLOR_YELLOW);\n if (allowMigration) {\n console.log('');\n console.log('');\n console.log('Important #2: If you already did the migration on an other host');\n console.log('please *do not* migrate again! This can destroy your system!');\n console.log('');\n console.log('');\n console.log('Important #3: The process will migrate all files that were officially');\n console.log('uploaded into the ioBroker system. If you have manually copied files into');\n console.log('iobroker-data/files/... into own directories then these files will NOT be');\n console.log('migrated! Make sure all files are in adapter directories inside the files');\n console.log('directory!');\n }\n console.log(COLOR_RESET);\n }\n\n // FileDB -> JSONL migration is handled in the DB classes. Skip migration if both DBs are changed from File -> JsonL\n if (\n (oldConfig.states.type === newConfig.states.type ||\n (oldConfig.states.type === 'file' && newConfig.states.type === 'jsonl')) &&\n (oldConfig.objects.type === newConfig.objects.type ||\n (oldConfig.objects.type === 'file' && newConfig.objects.type === 'jsonl'))\n ) {\n console.log('Explicit migration from file to jsonl is not necessary, skipping...');\n allowMigration = false;\n }\n\n let answer = 'N';\n if (allowMigration) {\n console.log();\n answer = rl.question(\n `Do you want to migrate objects and states from \"${oldConfig.objects.type}/${oldConfig.states.type}\" to \"${newConfig.objects.type}/${newConfig.states.type}\" [y/N]: `,\n {\n limit: /^[YyNnJj]?$/,\n defaultInput: 'N',\n },\n );\n\n if (\n newConfig.objects.type !== oldConfig.objects.type &&\n (answer === 'Y' || answer === 'y' || answer === 'J' || answer === 'j')\n ) {\n console.log(COLOR_YELLOW);\n answer = rl.question(\n `Migrating the objects database will overwrite all objects! Are you sure that this is not a slave host and you want to migrate the data? [y/N]: `,\n {\n limit: /^[YyNnJj]?$/,\n defaultInput: 'N',\n },\n );\n console.log(COLOR_RESET);\n }\n }\n\n if (answer === 'Y' || answer === 'y' || answer === 'J' || answer === 'j') {\n console.log(`Connecting to previous DB \"${oldConfig.states.type}/${oldConfig.objects.type}\"...`);\n\n const { objects: objectsOld, states: statesOld, isOffline } = await dbConnectAsync(false, this.params);\n\n if (!isOffline) {\n console.error(COLOR_RED);\n console.error('Cannot migrate DB while js-controller is still running!');\n console.error(`Please stop ioBroker and try again. No settings have been changed.${COLOR_RESET}`);\n return EXIT_CODES.CONTROLLER_RUNNING;\n }\n\n // TODO: rm this if processExit is gone from BackupRestore\n // eslint-disable-next-line no-async-promise-executor\n return new Promise(async resolve => {\n const backupCreate = new BackupRestore({\n states: statesOld,\n objects: objectsOld,\n cleanDatabase: this.cleanDatabase,\n restartController: this.restartController,\n processExit: resolve,\n });\n\n console.log('Creating backup ...');\n console.log(`${COLOR_GREEN}This can take some time ... please be patient!${COLOR_RESET}`);\n\n // TODO: this can call processExit internally we want to get rid of this in the future\n let filePath = await backupCreate.createBackup('', true);\n const origBackupPath = filePath;\n filePath = filePath.replace('.tar.gz', '-migration.tar.gz');\n try {\n fs.renameSync(origBackupPath, filePath);\n } catch {\n filePath = origBackupPath;\n console.log('[Not Critical Error] Could not rename Backup file');\n }\n\n console.log(`Backup created: ${filePath}`);\n await resetDbConnect();\n\n console.log(`updating conf/${tools.appName.toLowerCase()}.json`);\n fs.writeFileSync(`${tools.getConfigFileName()}.bak`, JSON.stringify(oldConfig, null, 2));\n fs.writeFileSync(tools.getConfigFileName(), JSON.stringify(newConfig, null, 2));\n\n console.log('');\n console.log(\n `Connecting to new DB \"${newConfig.states.type}/${newConfig.objects.type}\" (can take up to 20s) ...`,\n );\n\n const { objects: objectsNew, states: statesNew } = await dbConnectAsync(true, {\n ...this.params,\n timeout: 20_000,\n });\n\n this.objects = objectsNew;\n this.states = statesNew;\n\n if (!statesNew || !objectsNew) {\n console.error(COLOR_RED);\n console.log(\n `New Database could not be connected. Please check your settings. No settings have been changed.${COLOR_RESET}`,\n );\n\n console.log(`restoring conf/${tools.appName.toLowerCase()}.json`);\n fs.writeFileSync(tools.getConfigFileName(), JSON.stringify(oldConfig, null, 2));\n fs.unlinkSync(`${tools.getConfigFileName()}.bak`);\n\n return resolve(EXIT_CODES.MIGRATION_ERROR);\n }\n\n const backupRestore = new BackupRestore({\n states: statesNew,\n objects: objectsNew,\n cleanDatabase: this.cleanDatabase,\n restartController: this.restartController,\n processExit: resolve,\n dbMigration: true,\n });\n console.log('Restore backup ...');\n console.log(`${COLOR_GREEN}This can take some time ... please be patient!${COLOR_RESET}`);\n const { objects, states, exitCode } = await backupRestore.restoreBackup({\n name: filePath,\n force: false,\n dontDeleteAdapters: true,\n });\n\n this.objects = objects;\n this.states = states;\n\n if (exitCode) {\n console.log(`Error happened during restore. Exit-Code: ${exitCode}`);\n console.log();\n console.log(`restoring conf/${tools.appName.toLowerCase()}.json`);\n fs.writeFileSync(tools.getConfigFileName(), JSON.stringify(oldConfig, null, 2));\n fs.unlinkSync(`${tools.getConfigFileName()}.bak`);\n } else {\n await this._maybeMigrateSets();\n console.log('Backup restored - Migration successful');\n console.log(COLOR_YELLOW);\n console.log('Important: If your system consists of multiple hosts please execute ');\n console.log('\"iobroker upload all\" on the master AFTER all other hosts/slaves have ');\n console.log('also been updated to this states/objects database configuration AND are');\n console.log(`running!${COLOR_RESET}`);\n }\n\n resolve(exitCode ? EXIT_CODES.MIGRATION_ERROR : EXIT_CODES.NO_ERROR);\n });\n } else if (!newObjectsHasServer) {\n console.log('');\n console.log('No Database migration was done.');\n console.log(\n `${COLOR_YELLOW}If this was done on your master host please execute \"iobroker setup first\" to newly initialize all objects.${COLOR_RESET}`,\n );\n console.log('');\n }\n }\n console.log(`updating conf/${tools.appName.toLowerCase()}.json`);\n fs.writeFileSync(tools.getConfigFileName(), JSON.stringify(newConfig, null, 2));\n return EXIT_CODES.NO_ERROR;\n }\n\n async setupCustom(): Promise<EXIT_CODES> {\n let config: ioBroker.IoBrokerJson;\n // read actual configuration\n try {\n if (fs.existsSync(tools.getConfigFileName())) {\n config = fs.readJsonSync(tools.getConfigFileName());\n } else {\n config = fs.readJsonSync(path.join(CONTROLLER_DIR, 'conf', `${tools.appName.toLowerCase()}-dist.json`));\n }\n } catch {\n config = fs.readJsonSync(path.join(CONTROLLER_DIR, 'conf', `${tools.appName.toLowerCase()}-dist.json`));\n }\n const originalConfig: ioBroker.IoBrokerJson = deepClone(config);\n\n const currentObjectsType = originalConfig.objects.type || 'jsonl';\n const currentStatesType = originalConfig.states.type || 'jsonl';\n console.log('Current configuration:');\n console.log('- Objects database:');\n console.log(` - Type: ${originalConfig.objects.type}`);\n console.log(\n ` - Host/Unix Socket: ${Array.isArray(originalConfig.objects.host) ? originalConfig.objects.host.join(',') : originalConfig.objects.host}`,\n );\n console.log(\n ` - Port: ${Array.isArray(originalConfig.objects.port) ? originalConfig.objects.port.join(',') : originalConfig.objects.port}`,\n );\n if (Array.isArray(originalConfig.objects.host)) {\n console.log(\n ` - Sentinel-Master-Name: ${\n originalConfig.objects.sentinelName\n ? originalConfig.objects.sentinelName\n : this.DEFAULT_SENTINEL_NAME\n }`,\n );\n }\n console.log('- States database:');\n console.log(` - Type: ${originalConfig.states.type}`);\n console.log(\n ` - Host/Unix Socket: ${Array.isArray(originalConfig.states.host) ? originalConfig.states.host.join(',') : originalConfig.states.host}`,\n );\n console.log(\n ` - Port: ${Array.isArray(originalConfig.states.port) ? originalConfig.states.port.join(',') : originalConfig.states.port}`,\n );\n if (Array.isArray(originalConfig.states.host)) {\n console.log(\n ` - Sentinel-Master-Name: ${\n originalConfig.states.sentinelName ? originalConfig.states.sentinelName : this.DEFAULT_SENTINEL_NAME\n }`,\n );\n }\n\n const hasObjectsServer = await objectsDbHasServer(originalConfig.objects.type);\n const hasStatesServer = await statesDbHasServer(originalConfig.states.type);\n\n if (hasObjectsServer || hasStatesServer) {\n console.log(`- Data Directory: ${tools.getDefaultDataDir()}`);\n }\n if (originalConfig?.system?.hostname) {\n console.log(`- Host name: ${originalConfig.system.hostname}`);\n }\n console.log('');\n\n let oType = rl.question(\n `Type of objects DB [(j)sonl, (f)ile, (r)edis, ...], default [${currentObjectsType}]: `,\n {\n defaultInput: currentObjectsType,\n },\n );\n oType = oType.toLowerCase();\n\n if (oType === 'r') {\n oType = 'redis';\n } else if (oType === 'f') {\n oType = 'file';\n } else if (oType === 'j') {\n oType = 'jsonl';\n }\n\n let getDefaultObjectsPort;\n try {\n const path = require.resolve(`@iobroker/db-objects-${oType}`);\n\n getDefaultObjectsPort = require(path).getDefaultPort;\n } catch {\n console.log(`${COLOR_RED}Unknown objects type: ${oType}${COLOR_RESET}`);\n if (oType !== 'file' && oType !== 'redis') {\n console.log(COLOR_YELLOW);\n console.log(`Please check that the objects db type you entered is really correct!`);\n console.log(`If yes please use \"npm i @iobroker/db-objects-${oType}\" to install it manually.`);\n console.log(`You also need to make sure you stay up to date with this package in the future!`);\n console.log(COLOR_RESET);\n }\n return EXIT_CODES.INVALID_ARGUMENTS;\n }\n\n if (oType === 'redis' && originalConfig.objects.type !== 'redis') {\n console.log(COLOR_YELLOW);\n console.log('When Objects and Files are stored in a Redis database please consider the following:');\n console.log('1. All data will be stored in RAM, make sure to have enough free RAM available!');\n console.log(\n '2. Make sure to check Redis persistence options to make sure a Redis problem will not cause data loss!',\n );\n console.log('3. The Redis persistence files can get big, make sure not to use an SD card to store them.');\n console.log(COLOR_RESET);\n }\n\n const defaultObjectsHost =\n oType === originalConfig.objects.type ? originalConfig.objects.host : tools.getLocalAddress();\n let oHost: string | string[] = rl.question(\n `Host / Unix Socket of objects DB(${oType}), default[${\n Array.isArray(defaultObjectsHost) ? defaultObjectsHost.join(',') : defaultObjectsHost\n }]: `,\n {\n defaultInput: Array.isArray(defaultObjectsHost) ? defaultObjectsHost.join(',') : defaultObjectsHost,\n },\n );\n oHost = oHost.toLowerCase();\n\n const op = getDefaultObjectsPort(oHost);\n const oSentinel = oType === 'redis' && oHost.includes(',');\n\n if (oSentinel) {\n oHost = oHost.split(',').map(host => host.trim());\n }\n\n const defaultObjectsPort =\n oType === originalConfig.objects.type && oHost === originalConfig.objects.host\n ? originalConfig.objects.port\n : op;\n\n const userObjPort = rl.question(\n `Port of objects DB(${oType}), default[${\n Array.isArray(defaultObjectsPort) ? defaultObjectsPort.join(',') : defaultObjectsPort\n }]: `,\n {\n defaultInput: Array.isArray(defaultObjectsPort) ? defaultObjectsPort.join(',') : defaultObjectsPort,\n limit: /^[0-9, ]+$/,\n },\n );\n let oPort: number | number[];\n if (userObjPort.includes(',')) {\n try {\n oPort = userObjPort.split(',').map(port => {\n const parsedPort = parseInt(port.trim(), 10);\n if (isNaN(parsedPort)) {\n console.log(`${COLOR_RED}Invalid objects port: ${parsedPort}${COLOR_RESET}`);\n throw new Error(`Invalid objects port: ${parsedPort}`);\n } else {\n return parsedPort;\n }\n });\n } catch {\n return EXIT_CODES.INVALID_ARGUMENTS;\n }\n } else {\n oPort = parseInt(userObjPort, 10);\n if (isNaN(oPort)) {\n console.log(`${COLOR_RED}Invalid objects port: ${oPort}${COLOR_RESET}`);\n return EXIT_CODES.INVALID_ARGUMENTS;\n }\n }\n\n config.objects = await performObjectsInterview({ dbType: oType, config: config.objects });\n\n let oSentinelName = null;\n if (oSentinel) {\n const defaultSentinelName = originalConfig.objects.sentinelName\n ? originalConfig.objects.sentinelName\n : this.DEFAULT_SENTINEL_NAME;\n oSentinelName = rl.question(`Objects Redis Sentinel Master Name [${defaultSentinelName}]: `, {\n defaultInput: defaultSentinelName,\n });\n }\n\n let defaultStatesType = currentStatesType;\n try {\n require.resolve(`@iobroker/db-states-${oType}`);\n defaultStatesType = oType as 'jsonl' | 'file' | 'redis'; // if states db is also available with same type we use as default\n } catch {\n // ignore, unchanged\n }\n\n let sType = rl.question(\n `Type of states DB [(j)sonl, (f)file, (r)edis, ...], default [${defaultStatesType}]: `,\n {\n defaultInput: defaultStatesType,\n },\n );\n sType = sType.toLowerCase();\n\n if (sType === 'r') {\n sType = 'redis';\n } else if (sType === 'f') {\n sType = 'file';\n } else if (sType === 'j') {\n sType = 'jsonl';\n }\n\n let getDefaultStatesPort;\n try {\n const path = require.resolve(`@iobroker/db-states-${sType}`);\n\n getDefaultStatesPort = require(path).getDefaultPort;\n } catch {\n console.log(`${COLOR_RED}Unknown states type: ${sType}${COLOR_RESET}`);\n if (sType !== 'file' && sType !== 'redis') {\n console.log(COLOR_YELLOW);\n console.log(`Please check that the states db type you entered is really correct!`);\n console.log(`If yes please use \"npm i @iobroker/db-states-${sType}\" to install it manually.`);\n console.log(`You also need to make sure you stay up to date with this package in the future!`);\n console.log(COLOR_RESET);\n }\n return EXIT_CODES.INVALID_ARGUMENTS;\n }\n\n if (sType === 'redis' && originalConfig.states.type !== 'redis' && oType !== 'redis') {\n console.log(COLOR_YELLOW);\n console.log('When States are stored in a Redis database please make sure to configure Redis');\n console.log('persistence to make sure a Redis problem will not cause data loss!');\n console.log(COLOR_RESET);\n }\n\n let defaultStatesHost =\n sType === originalConfig.states.type ? originalConfig.states.host : oHost || tools.getLocalAddress();\n if (sType === oType) {\n defaultStatesHost = oHost;\n }\n let sHost: string | string[] = rl.question(\n `Host / Unix Socket of states DB (${sType}), default[${\n Array.isArray(defaultStatesHost) ? defaultStatesHost.join(',') : defaultStatesHost\n }]: `,\n {\n defaultInput: Array.isArray(defaultStatesHost) ? defaultStatesHost.join(',') : defaultStatesHost,\n },\n );\n sHost = sHost.toLowerCase();\n\n const sp = getDefaultStatesPort(sHost);\n const sSentinel = sType === 'redis' && sHost.includes(',');\n\n if (sSentinel) {\n sHost = sHost.split(',').map(host => host.trim());\n }\n\n let defaultStatesPort =\n sType === originalConfig.states.type && sHost === originalConfig.states.host\n ? originalConfig.states.port\n : sp;\n\n const statesHasServer = await statesDbHasServer(sType);\n\n if (sType === oType && !statesHasServer && sHost === oHost) {\n defaultStatesPort = oPort;\n }\n const userStatePort = rl.question(\n `Port of states DB (${sType}), default[${\n Array.isArray(defaultStatesPort) ? defaultStatesPort.join(',') : defaultStatesPort\n }]: `,\n {\n defaultInput: Array.isArray(defaultStatesPort) ? defaultStatesPort.join(',') : defaultStatesPort,\n limit: /^[0-9, ]+$/,\n },\n );\n let sPort: number | number[];\n if (userStatePort.includes(',')) {\n sPort = [];\n sPort = userStatePort.split(',').map(port => {\n try {\n const parsedPort = parseInt(port.trim(), 10);\n if (isNaN(parsedPort)) {\n console.log(`${COLOR_RED}Invalid states port: ${parsedPort}${COLOR_RESET}`);\n throw new Error(`Invalid states port: ${parsedPort}`);\n } else {\n return parsedPort;\n }\n } catch {\n return EXIT_CODES.INVALID_ARGUMENTS;\n }\n });\n } else {\n sPort = parseInt(userStatePort, 10);\n if (isNaN(sPort)) {\n console.log(`${COLOR_RED}Invalid states port: ${sPort}${COLOR_RESET}`);\n return EXIT_CODES.INVALID_ARGUMENTS;\n }\n }\n\n config.states = await performStatesInterview({ dbType: sType, config: config.states });\n\n let sSentinelName = null;\n if (sSentinel) {\n const defaultSentinelName = originalConfig.states.sentinelName\n ? originalConfig.states.sentinelName\n : oSentinelName && oPort === sPort\n ? oSentinelName\n : this.DEFAULT_SENTINEL_NAME;\n sSentinelName = rl.question(`States Redis Sentinel Master Name [${defaultSentinelName}]: `, {\n defaultInput: defaultSentinelName,\n });\n }\n\n let dir: string | undefined;\n let hname: string;\n\n const hasLocalObjectsServer = await isLocalObjectsDbServer(oType, oHost);\n const hasLocalStatesServer = await isLocalStatesDbServer(sType, sHost);\n\n if (hasLocalStatesServer || hasLocalObjectsServer) {\n let validDataDir = false;\n\n while (!validDataDir) {\n dir = rl.question(`Data directory (file), default[${tools.getDefaultDataDir()}]: `, {\n defaultInput: tools.getDefaultDataDir(),\n });\n\n const validationInfo = tools.validateDataDir(dir);\n\n validDataDir = validationInfo.valid;\n\n if (!validDataDir) {\n console.warn(\n `${COLOR_YELLOW}The data directory is invalid. ${validationInfo.reason}${COLOR_RESET}`,\n );\n console.warn(`The current directory resolves to \"${validationInfo.path}\"`);\n }\n }\n\n hname = rl.question(\n `Host name of this machine [${\n originalConfig && originalConfig.system\n ? originalConfig.system.hostname || os.hostname()\n : os.hostname()\n }]: `,\n {\n defaultInput: (originalConfig && originalConfig.system && originalConfig.system.hostname) || '',\n },\n );\n } else {\n hname = rl.question(`Host name of this machine [${os.hostname()}]: `, {\n defaultInput: '',\n });\n }\n\n if (hname.match(/\\s/)) {\n console.log(`${COLOR_RED}Invalid host name: ${hname}${COLOR_RESET}`);\n return EXIT_CODES.INVALID_ARGUMENTS;\n }\n\n config.system ||= {} as ioBroker.IoBrokerJson['system'];\n config.system.hostname = hname;\n config.objects.host = oHost;\n config.objects.type = oType as 'jsonl' | 'file' | 'redis';\n config.objects.port = oPort;\n config.states.host = sHost;\n config.states.type = sType as 'jsonl' | 'file' | 'redis';\n config.states.port = sPort;\n config.states.dataDir = undefined;\n config.objects.dataDir = undefined;\n if (dir) {\n config.objects.dataDir = dir;\n }\n if (dir) {\n config.states.dataDir = dir;\n }\n if (\n config.objects.type === 'redis' &&\n oSentinel &&\n oSentinelName &&\n oSentinelName !== this.DEFAULT_SENTINEL_NAME\n ) {\n config.objects.sentinelName = oSentinelName;\n }\n if (\n config.states.type === 'redis' &&\n sSentinel &&\n sSentinelName &&\n sSentinelName !== this.DEFAULT_SENTINEL_NAME\n ) {\n config.states.sentinelName = sSentinelName;\n }\n\n return await this.migrateObjects(config, originalConfig);\n }\n\n /**\n * Checks if single host setup and if so migrates and activates Redis Sets Usage\n */\n private async _maybeMigrateSets(): Promise<void> {\n if (!this.objects) {\n throw new Error('Objects not set up, call setupObjects first');\n }\n\n try {\n // if we have a single host system, we need to ensure that existing objects are migrated to sets before doing anything else\n if (await tools.isSingleHost(this.objects)) {\n await this.objects.activateSets();\n const noMigrated = await this.objects.migrateToSets();\n\n if (noMigrated) {\n console.log(`Successfully migrated ${noMigrated} objects to Redis Sets`);\n }\n }\n } catch (e) {\n console.warn(`Could not migrate objects to corresponding sets: ${e.message}`);\n }\n }\n\n /**\n * Ensure that host object exists\n */\n private async _ensureHostObject(): Promise<void> {\n if (!this.objects) {\n throw new Error('Objects not set up, call setupObjects first');\n }\n\n const hostname = tools.getHostName();\n\n const id = `system.host.${hostname}`;\n const objExists = await this.objects.objectExists(id);\n\n if (!objExists) {\n await this.objects.setObject(id, getHostObject());\n console.log(`Created host object \"${id}\"`);\n }\n }\n\n /**\n * Remove, if required, adapter-core in the overrides field of the root package.json and call install there to apply it\n */\n private async removeAdapterCoreRequirement(): Promise<void> {\n if (tools.isDevInstallation()) {\n return;\n }\n\n const rootDir = tools.getRootDir();\n const packPath = path.join(rootDir, 'package.json');\n const packJson = await fs.readJson(packPath);\n\n if (!packJson.overrides?.['@iobroker/adapter-core']) {\n console.log(`The \"@iobroker/adapter-core\" override is already removed`);\n return;\n }\n\n delete packJson.overrides['@iobroker/adapter-core'];\n if (!Object.keys(packJson.overrides).length) {\n delete packJson.overrides;\n }\n await fs.writeJson(packPath, packJson, { spaces: 4 });\n console.log(`Successfully removed override for \"@iobroker/adapter-core\"`);\n }\n\n /**\n * Create the adapters object per host if not yet existing\n */\n private async _ensureAdaptersPerHostObject(): Promise<void> {\n if (!this.objects) {\n throw new Error('Objects not set up, call setupObjects first');\n }\n\n if (!this.states) {\n throw new Error('States not set up, call setupObjects first');\n }\n\n const hostname = tools.getHostName();\n const adaptersId = `system.host.${hostname}.adapter`;\n\n const adaptersExist = await this.objects.objectExists(adaptersId);\n\n if (adaptersExist) {\n return;\n }\n\n console.log(`Creating adapter objects for host \"${hostname}\"`);\n\n await this.objects.setObject(adaptersId, {\n type: 'folder',\n common: {\n name: {\n en: 'Installed adapters',\n de: 'Installierte Adapter',\n ru: '\u0423\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043D\u044B\u0435 \u0430\u0434\u0430\u043F\u0442\u0435\u0440\u044B',\n pt: 'Adaptadores instalados',\n nl: 'Ge\u00EFnstalleerde adapters',\n fr: 'Adaptateurs install\u00E9s',\n it: 'Adattatori installati',\n es: 'Adaptadores instalados',\n pl: 'Zainstalowane adaptery',\n uk: '\u0412\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u0456 \u0430\u0434\u0430\u043F\u0442\u0435\u0440\u0438',\n 'zh-cn': '\u5DF2\u5B89\u88C5\u7684\u9002\u914D\u5668',\n },\n desc: {\n en: 'Installed adapters on this host',\n de: 'Installierte Adapter auf diesem Host',\n ru: '\u0423\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043D\u044B\u0435 \u0430\u0434\u0430\u043F\u0442\u0435\u0440\u044B \u043D\u0430 \u044D\u0442\u043E\u043C \u0445\u043E\u0441\u0442\u0435',\n pt: 'Adaptadores instalados neste anfitri\u00E3o',\n nl: 'Ge\u00EFnstalleerde adapters op deze host',\n fr: 'Adaptateurs install\u00E9s sur cet h\u00F4te',\n it: 'Adattatori installati su questo host',\n es: 'Adaptadores instalados en este host',\n pl: 'Zainstalowane karty na tym ho\u015Bcie',\n uk: '\u0412\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u0456 \u0430\u0434\u0430\u043F\u0442\u0435\u0440\u0438 \u043D\u0430 \u0446\u044C\u043E\u043C\u0443 \u0445\u043E\u0441\u0442\u0456',\n 'zh-cn': '\u8BE5\u4E3B\u673A\u4E0A\u5DF2\u5B89\u88C5\u7684\u9002\u914D\u5668',\n },\n },\n native: {},\n });\n\n const adaptersView = await this.objects.getObjectViewAsync('system', 'adapter', {\n startkey: SYSTEM_ADAPTER_PREFIX,\n endkey: `${SYSTEM_ADAPTER_PREFIX}\\u9999`,\n });\n\n const rootPackJson = await fs.readJSON(path.join(tools.getRootDir(), 'package.json'));\n\n const setupUpload = new Upload({ objects: this.objects, states: this.states });\n\n for (const row of adaptersView.rows) {\n const { name } = row.value.common;\n\n if (!rootPackJson.dependencies[`iobroker.${name}`]) {\n continue;\n }\n\n await setupUpload.upgradeAdapterObjects(name);\n }\n }\n\n /**\n * Replace the `controller.js` file in the root directory to work with ESM\n */\n async _fixWindowsControllerJs(): Promise<void> {\n const content = `import('./node_modules/iobroker.js-controller/controller.js');`;\n const filePath = path.join(tools.getRootDir(), 'controller.js');\n\n try {\n await fs.writeFile(filePath, content, { encoding: 'utf-8' });\n } catch (e) {\n console.error(`Could not fix \"${filePath}\": ${e.message}`);\n }\n }\n\n /**\n * Perform multiple cleanup operations, to clean up inconsistent states due to past bugs or edge case errors\n */\n private async _cleanupInstallation(): Promise<void> {\n console.log('Clean up binary states ...');\n try {\n await this._cleanupBinaryStates();\n } catch (e) {\n console.error(`Cannot clean up binary states: ${e.message}`);\n }\n\n console.log('Clean up invalid group assignments ...');\n try {\n await this._cleanupInvalidGroupAssignments();\n } catch (e) {\n console.error(`Cannot clean up invalid user group assignments: ${e.message}`);\n }\n\n console.log('Clean up garbage objects ...');\n try {\n await this._cleanupGarbageObjects();\n } catch (e) {\n console.error(`Cannot clean up garbage objects: ${e.message}`);\n }\n\n console.log('Clean up leftover adapters ...');\n try {\n await this._cleanupLeftoverAdapters();\n } catch (e) {\n console.error(`Cannot clean up leftover adapters: ${e.message}`);\n }\n\n console.log('Clean up objects and states with forbidden characters ...');\n try {\n await this._cleanupForbiddenIds();\n } catch (e) {\n console.error(`Cannot clean up objects and states with forbidden IDs: ${e.message}`);\n }\n }\n\n /**\n * Cleanup adapter objects from already removed adapters, which are still there due to errors or past bugs\n */\n private async _cleanupLeftoverAdapters(): Promise<void> {\n if (!this.objects) {\n throw new Error('Objects not set up, call setupObjects first');\n }\n\n const hostsView = await this.objects.getObjectViewAsync('system', 'host', {\n startkey: SYSTEM_HOST_PREFIX,\n endkey: `${SYSTEM_HOST_PREFIX}\\u9999`,\n });\n\n const hostIds = hostsView.rows.map(row => row.id);\n\n for (const hostId of hostIds) {\n const hasAdapters = await this.objects.objectExists(`${hostId}.adapter`);\n\n if (!hasAdapters) {\n console.log(\n `Skipping cleanup leftover adapters, because host \"${hostId}\" is not yet migrated to a supporting controller version`,\n );\n return;\n }\n }\n\n const adaptersViewPerHost = await this.objects.getObjectViewAsync('system', 'adapter', {\n startkey: SYSTEM_HOST_PREFIX,\n endkey: `${SYSTEM_HOST_PREFIX}\\u9999`,\n });\n\n const installedAdapterNames = adaptersViewPerHost.rows.map(row => row.value.common.name);\n\n const adaptersView = await this.objects.getObjectViewAsync('system', 'adapter', {\n startkey: SYSTEM_ADAPTER_PREFIX,\n endkey: `${SYSTEM_ADAPTER_PREFIX}\\u9999`,\n });\n\n for (const row of adaptersView.rows) {\n if (!installedAdapterNames.includes(row.value.common.name)) {\n await this.objects.delObject(row.id);\n console.log(`Cleaned up leftover adapter object \"${row.id}\"`);\n }\n }\n }\n\n /**\n * Cleanup all states and objects which contain forbidden chars in their id\n */\n private async _cleanupForbiddenIds(): Promise<void> {\n if (!this.objects) {\n throw new Error('Objects not set up, call setupObjects first');\n }\n\n if (!this.states) {\n throw new Error('States not set up, call setupObjects first');\n }\n\n const objIds = await this.objects.getKeys('*');\n\n if (objIds) {\n for (const id of objIds) {\n if (FORBIDDEN_CHARS.test(id)) {\n await this.objects.delObject(id);\n console.log(`Deleted object \"${id}\" because it contains forbidden characters`);\n }\n }\n }\n\n const stateIds = await this.states.getKeys('*');\n\n if (stateIds) {\n for (const id of stateIds) {\n if (FORBIDDEN_CHARS.test(id)) {\n await this.states.delState(id);\n console.log(`Deleted state \"${id}\" because it contains forbidden characters`);\n }\n }\n }\n }\n\n /**\n * Cleanup objects which are known to be created on accident in the past by adapters or controller\n */\n private async _cleanupGarbageObjects(): Promise<void> {\n if (!this.objects) {\n throw new Error('Objects not set up, call setupObjects first');\n }\n\n for (const garbageId of this.KNOWN_GARBAGE_OBJECT_IDS) {\n const isExisting = await this.objects.objectExists(garbageId);\n\n if (isExisting) {\n await this.objects.delObject(garbageId);\n console.log(`Successfully removed garbage object \"${garbageId}\"`);\n }\n }\n }\n\n /**\n * Removes all binary state related objects and states\n */\n private async _cleanupBinaryStates(): Promise<void> {\n if (!this.objects) {\n throw new Error('Objects not set up, call setupObjects first');\n }\n\n if (!this.states) {\n throw new Error('States not set up, call setupObjects first');\n }\n\n const hostsView = await this.objects.getObjectViewAsync('system', 'host', {\n startkey: SYSTEM_HOST_PREFIX,\n endkey: `${SYSTEM_HOST_PREFIX}\\u9999`,\n });\n\n const hostIds = hostsView.rows.map(row => row.id);\n\n for (const hostId of hostIds) {\n const zipId = `${hostId}.zip`;\n const zipFolderExists = await this.objects.objectExists(zipId);\n\n if (!zipFolderExists) {\n continue;\n }\n\n await this.objects.delObject(zipId);\n console.log(`Deleted object \"${zipId}\" during binary state clean up`);\n }\n\n const statesView = await this.objects.getObjectViewAsync('system', 'state', {\n startkey: '',\n endkey: '\\u9999',\n });\n\n for (const row of statesView.rows) {\n if ((row.value.common.type as ioBroker.CommonType | 'file') === 'file') {\n await this.objects.delObject(row.id);\n await this.states.delState(row.id);\n console.log(`Deleted object \"${row.id}\" during binary state clean up`);\n }\n }\n }\n\n /**\n * Removes non-existing users from groups\n */\n private async _cleanupInvalidGroupAssignments(): Promise<void> {\n if (!this.objects) {\n throw new Error('Objects not set up, call setupObjects first');\n }\n\n const usersView = await this.objects.getObjectViewAsync('system', 'user');\n const groupView = await this.objects.getObjectViewAsync('system', 'group');\n\n const existingUsers = usersView.rows.map(obj => obj.value._id);\n\n for (const group of groupView.rows) {\n // reference for readability\n const groupMembers = group.value.common.members;\n\n if (!Array.isArray(groupMembers)) {\n // fix legacy objects\n const obj = group.value;\n obj.common.members = [];\n await this.objects.setObjectAsync(obj._id, obj);\n continue;\n }\n\n let changed = false;\n\n for (let i = groupMembers.length - 1; i >= 0; i--) {\n if (!existingUsers.includes(groupMembers[i])) {\n // we have found a non-existing user, so remove it\n changed = true;\n console.log(`Removed non-existing user \"${groupMembers[i]}\" from group \"${group.value._id}\"`);\n groupMembers.splice(i, 1);\n }\n }\n\n if (changed) {\n await this.objects.setObjectAsync(group.value._id, group.value);\n }\n }\n }\n\n /**\n * Set up the installation with config file, host object, scripts etc\n *\n * @param options setup options\n */\n setup(options: SetupCommandOptions): void {\n const { ignoreIfExist, useRedis, callback } = options;\n\n let config: ioBroker.IoBrokerJson;\n let isCreated = false;\n const platform = os.platform();\n const otherInstallDirs = [];\n\n // copy reinstall.js file into root\n if (fs.existsSync(path.join(CONTROLLER_DIR, '..', '..', 'node_modules'))) {\n try {\n if (fs.existsSync(path.join(CONTROLLER_DIR, 'reinstall.js'))) {\n fs.writeFileSync(\n path.join(CONTROLLER_DIR, '..', '..', 'reinstall.js'),\n fs.readFileSync(path.join(CONTROLLER_DIR, 'reinstall.js')),\n );\n }\n } catch (e) {\n console.warn(`Cannot write file. Not critical: ${e.message}`);\n }\n }\n // Delete files for other OS\n if (platform.startsWith('win')) {\n otherInstallDirs.push(path.join(CONTROLLER_DIR, tools.appName));\n otherInstallDirs.push(path.join(CONTROLLER_DIR, tools.appName.substring(0, 3)));\n otherInstallDirs.push(path.join(CONTROLLER_DIR, 'killall.sh'));\n otherInstallDirs.push(path.join(CONTROLLER_DIR, 'reinstall.sh'));\n } else {\n // copy scripts to root directory\n if (fs.existsSync(path.join(CONTROLLER_DIR, '..', '..', 'node_modules'))) {\n const startFile = `#!/usr/bin/env node\nrequire('${path.normalize(`${thisDir}/..`)}/setup').execute();`;\n\n try {\n if (fs.existsSync(path.join(CONTROLLER_DIR, 'killall.sh'))) {\n fs.writeFileSync(\n path.join(CONTROLLER_DIR, '..', '..', 'killall.sh'),\n fs.readFileSync(path.join(CONTROLLER_DIR, 'killall.sh')),\n { mode: 492 /* 0754 */ },\n );\n }\n if (fs.existsSync(path.join(CONTROLLER_DIR, 'reinstall.sh'))) {\n fs.writeFileSync(\n path.join(CONTROLLER_DIR, '..', '..', 'reinstall.sh'),\n fs.readFileSync(path.join(CONTROLLER_DIR, 'reinstall.sh')),\n { mode: 492 /* 0754 */ },\n );\n }\n if (!fs.existsSync(path.join(CONTROLLER_DIR, '..', '..', `${tools.appName.substring(0, 3)}`))) {\n fs.writeFileSync(\n path.join(CONTROLLER_DIR, '..', '..', `${tools.appName.substring(0, 3)}`),\n startFile,\n {\n mode: 492 /* 0754 */,\n },\n );\n }\n if (!fs.existsSync(path.join(CONTROLLER_DIR, '..', '..', `${tools.appName}`))) {\n fs.writeFileSync(path.join(CONTROLLER_DIR, '..', '..', `${tools.appName}`), startFile, {\n mode: 492 /* 0754 */,\n });\n }\n } catch (e) {\n console.warn(`Cannot write file. Not critical: ${e.message}`);\n }\n }\n }\n\n for (let t = 0; t < otherInstallDirs.length; t++) {\n if (fs.existsSync(otherInstallDirs[t])) {\n const stat = fs.statSync(otherInstallDirs[t]);\n if (stat.isDirectory()) {\n const files = fs.readdirSync(otherInstallDirs[t]);\n for (let f = 0; f < files.length; f++) {\n fs.unlinkSync(path.join(otherInstallDirs[t], files[f]));\n }\n fs.rmdirSync(otherInstallDirs[t]);\n } else {\n try {\n fs.unlinkSync(otherInstallDirs[t]);\n } catch (e) {\n console.warn(`Cannot delete file. Not critical: ${e.message}`);\n }\n }\n }\n }\n\n // Create log and tmp directory\n if (!fs.existsSync(`${CONTROLLER_DIR}/tmp`)) {\n fs.mkdirSync(`${CONTROLLER_DIR}/tmp`);\n }\n\n const configFileName = tools.getConfigFileName();\n\n // only change config if non-existing - else setup custom has to be used\n if (!fs.existsSync(configFileName)) {\n isCreated = true;\n config = fs.readJsonSync(path.join(CONTROLLER_DIR, 'conf', `${tools.appName.toLowerCase()}-dist.json`));\n\n console.log(`creating conf/${tools.appName.toLowerCase()}.json`);\n config.objects.host = this.params.objects || tools.getLocalAddress();\n config.states.host = this.params.states || tools.getLocalAddress();\n if (useRedis) {\n config.states.type = 'redis';\n config.states.port = this.params.port || 6379;\n config.objects.type = 'redis';\n config.objects.port = this.params.port || 6379;\n }\n\n // this path is relative to js-controller\n config.dataDir = tools.getDefaultDataDir();\n\n fs.mkdirSync(path.join(CONTROLLER_DIR, config.dataDir), { recursive: true });\n\n const dirName = path.dirname(configFileName);\n\n if (!fs.existsSync(dirName)) {\n fs.mkdirSync(dirName.replace(/\\\\/g, '/'), { recursive: true });\n }\n\n // Create default data dir\n fs.writeFileSync(configFileName, JSON.stringify(config, null, 2));\n\n try {\n // Create\n if (\n thisDir\n .toLowerCase()\n .replace(/\\\\/g, '/')\n .includes(`node_modules/${tools.appName.toLowerCase()}.js-controller`)\n ) {\n const parts = config.dataDir.split('/');\n // Remove appName-data/\n parts.pop();\n parts.pop();\n const path_ = parts.join('/');\n\n if (!fs.existsSync(path.join(CONTROLLER_DIR, path_, 'log'))) {\n fs.mkdirSync(path.join(CONTROLLER_DIR, path_, 'log'));\n }\n } else {\n if (!fs.existsSync(path.join(CONTROLLER_DIR, 'log'))) {\n fs.mkdirSync(path.join(CONTROLLER_DIR, 'log'));\n }\n }\n } catch (e) {\n console.log(`Non-critical error: ${e.message}`);\n }\n } else if (ignoreIfExist) {\n // it is a setup first run and config exists yet\n this.setupObjects(() => callback?.(), true);\n return;\n }\n\n this.setupObjects(() => callback?.(isCreated));\n }\n}\n", "export const __import_meta_url =\n typeof document === 'undefined' ? new (require('url'.replace('', '')).URL)('file:' + __filename).href :\n (document.currentScript && document.currentScript.src || new URL('main.js', document.baseURI).href)\n"],
5
+ "mappings": "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",
6
6
  "names": ["import_js_controller_common", "require", "fs", "path", "crypto", "answer", "rl", "deepClone", "os"]
7
7
  }
@@ -17,8 +17,6 @@ export interface SetupCommandOptions {
17
17
  export declare class Setup {
18
18
  /** Object IDs which are not allowed to exist but could be generated due to errors in the past */
19
19
  private readonly KNOWN_GARBAGE_OBJECT_IDS;
20
- /** Adapter core version supported by this js-controller */
21
- private readonly SUPPORTED_ADAPTER_CORE_VERSION;
22
20
  /** Default name for redis sentinels */
23
21
  private readonly DEFAULT_SENTINEL_NAME;
24
22
  private readonly processExit;
@@ -67,9 +65,9 @@ export declare class Setup {
67
65
  */
68
66
  private _ensureHostObject;
69
67
  /**
70
- * Add or update adapter-core in supported version in the overrides field of the root package.json and call install there to apply it
68
+ * Remove, if required, adapter-core in the overrides field of the root package.json and call install there to apply it
71
69
  */
72
- private addOrUpdateAdapterCoreRequirement;
70
+ private removeAdapterCoreRequirement;
73
71
  /**
74
72
  * Create the adapters object per host if not yet existing
75
73
  */
@@ -1 +1 @@
1
- {"version":3,"file":"setupSetup.d.ts","sourceRoot":"","sources":["../../../../src/lib/setup/setupSetup.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,oBAAoB,EAAE,SAAS,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAI/G,OAAO,EAAE,UAAU,EAAS,MAAM,gCAAgC,CAAC;AAiCnE,MAAM,WAAW,eAAe;IAC5B,aAAa,EAAE,oBAAoB,CAAC;IACpC,WAAW,EAAE,mBAAmB,CAAC;IACjC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5B,iBAAiB,EAAE,iBAAiB,CAAC;CACxC;AAED,MAAM,WAAW,mBAAmB;IAChC,gCAAgC;IAChC,QAAQ,EAAE,CAAC,SAAS,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IACxC,0FAA0F;IAC1F,aAAa,EAAE,OAAO,CAAC;IACvB,+BAA+B;IAC/B,QAAQ,EAAE,OAAO,CAAC;CACrB;AAED,qBAAa,KAAK;IACd,iGAAiG;IACjG,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAyB;IAClE,2DAA2D;IAC3D,OAAO,CAAC,QAAQ,CAAC,8BAA8B,CAAY;IAC3D,uCAAuC;IACvC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAc;IACpD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAsB;IAClD,OAAO,CAAC,MAAM,CAAgC;IAC9C,OAAO,CAAC,OAAO,CAAiC;IAChD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;IAC7C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAuB;IACrD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAoB;gBAE1C,OAAO,EAAE,eAAe;IAS9B,kBAAkB,CAAC,YAAY,CAAC,EAAE,QAAQ,CAAC,kBAAkB,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAiF1F;;;;;OAKG;IACG,UAAU,CACZ,YAAY,EAAE,QAAQ,CAAC,kBAAkB,GAAG,SAAS,GAAG,IAAI,EAC5D,QAAQ,EAAE,MAAM,IAAI,GACrB,OAAO,CAAC,IAAI,CAAC;IAkFV,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IA8C7F;;;;OAIG;YACW,SAAS;IAqCvB;;;;;OAKG;IACG,YAAY,CAAC,QAAQ,EAAE,MAAM,IAAI,EAAE,oBAAoB,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IA8EvF;;;;;OAKG;IACG,cAAc,CAAC,SAAS,EAAE,QAAQ,CAAC,YAAY,EAAE,SAAS,EAAE,QAAQ,CAAC,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC;IAyPvG,WAAW,IAAI,OAAO,CAAC,UAAU,CAAC;IA+XxC;;OAEG;YACW,iBAAiB;IAoB/B;;OAEG;YACW,iBAAiB;IAgB/B;;OAEG;YACW,iCAAiC;IAyB/C;;OAEG;YACW,4BAA4B;IAyE1C;;OAEG;IACG,uBAAuB,IAAI,OAAO,CAAC,IAAI,CAAC;IAW9C;;OAEG;YACW,oBAAoB;IAqClC;;OAEG;YACW,wBAAwB;IA2CtC;;OAEG;YACW,oBAAoB;IAgClC;;OAEG;YACW,sBAAsB;IAepC;;OAEG;YACW,oBAAoB;IA0ClC;;OAEG;YACW,+BAA+B;IAuC7C;;;;OAIG;IACH,KAAK,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI;CA4J5C"}
1
+ {"version":3,"file":"setupSetup.d.ts","sourceRoot":"","sources":["../../../../src/lib/setup/setupSetup.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,oBAAoB,EAAE,SAAS,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAI/G,OAAO,EAAE,UAAU,EAAS,MAAM,gCAAgC,CAAC;AAiCnE,MAAM,WAAW,eAAe;IAC5B,aAAa,EAAE,oBAAoB,CAAC;IACpC,WAAW,EAAE,mBAAmB,CAAC;IACjC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5B,iBAAiB,EAAE,iBAAiB,CAAC;CACxC;AAED,MAAM,WAAW,mBAAmB;IAChC,gCAAgC;IAChC,QAAQ,EAAE,CAAC,SAAS,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IACxC,0FAA0F;IAC1F,aAAa,EAAE,OAAO,CAAC;IACvB,+BAA+B;IAC/B,QAAQ,EAAE,OAAO,CAAC;CACrB;AAED,qBAAa,KAAK;IACd,iGAAiG;IACjG,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAyB;IAClE,uCAAuC;IACvC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAc;IACpD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAsB;IAClD,OAAO,CAAC,MAAM,CAAgC;IAC9C,OAAO,CAAC,OAAO,CAAiC;IAChD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;IAC7C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAuB;IACrD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAoB;gBAE1C,OAAO,EAAE,eAAe;IAS9B,kBAAkB,CAAC,YAAY,CAAC,EAAE,QAAQ,CAAC,kBAAkB,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAiF1F;;;;;OAKG;IACG,UAAU,CACZ,YAAY,EAAE,QAAQ,CAAC,kBAAkB,GAAG,SAAS,GAAG,IAAI,EAC5D,QAAQ,EAAE,MAAM,IAAI,GACrB,OAAO,CAAC,IAAI,CAAC;IAkFV,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IA8C7F;;;;OAIG;YACW,SAAS;IAqCvB;;;;;OAKG;IACG,YAAY,CAAC,QAAQ,EAAE,MAAM,IAAI,EAAE,oBAAoB,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IA8EvF;;;;;OAKG;IACG,cAAc,CAAC,SAAS,EAAE,QAAQ,CAAC,YAAY,EAAE,SAAS,EAAE,QAAQ,CAAC,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC;IAyPvG,WAAW,IAAI,OAAO,CAAC,UAAU,CAAC;IA+XxC;;OAEG;YACW,iBAAiB;IAoB/B;;OAEG;YACW,iBAAiB;IAgB/B;;OAEG;YACW,4BAA4B;IAsB1C;;OAEG;YACW,4BAA4B;IAyE1C;;OAEG;IACG,uBAAuB,IAAI,OAAO,CAAC,IAAI,CAAC;IAW9C;;OAEG;YACW,oBAAoB;IAqClC;;OAEG;YACW,wBAAwB;IA2CtC;;OAEG;YACW,oBAAoB;IAgClC;;OAEG;YACW,sBAAsB;IAepC;;OAEG;YACW,oBAAoB;IA0ClC;;OAEG;YACW,+BAA+B;IAuC7C;;;;OAIG;IACH,KAAK,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI;CA4J5C"}