/**
 * Minified by jsDelivr using Terser v5.39.0.
 * Original file: /npm/iobroker.js-controller@7.1.1/build/cjs/main.js
 *
 * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files
 */
"use strict";var __create=Object.create,__defProp=Object.defineProperty,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__getOwnPropNames=Object.getOwnPropertyNames,__getProtoOf=Object.getPrototypeOf,__hasOwnProp=Object.prototype.hasOwnProperty,__export=(e,o)=>{for(var t in o)__defProp(e,t,{get:o[t],enumerable:!0})},__copyProps=(e,o,t,s)=>{if(o&&"object"==typeof o||"function"==typeof o)for(let r of __getOwnPropNames(o))__hasOwnProp.call(e,r)||r===t||__defProp(e,r,{get:()=>o[r],enumerable:!(s=__getOwnPropDesc(o,r))||s.enumerable});return e},__toESM=(e,o,t)=>(t=null!=e?__create(__getProtoOf(e)):{},__copyProps(!o&&e&&e.__esModule?t:__defProp(t,"default",{value:e,enumerable:!0}),e)),__toCommonJS=e=>__copyProps(__defProp({},"__esModule",{value:!0}),e),main_exports={};__export(main_exports,{init:()=>init}),module.exports=__toCommonJS(main_exports);var __import_meta_url="undefined"==typeof document?new(require("url".replace("","")).URL)("file:"+__filename).href:document.currentScript&&document.currentScript.src||new URL("main.js",document.baseURI).href,import_node_schedule=__toESM(require("node-schedule"),1),import_node_os=__toESM(require("node:os"),1),import_fs_extra=__toESM(require("fs-extra"),1),import_node_path=__toESM(require("node:path"),1),import_node_child_process=__toESM(require("node:child_process"),1),import_semver=__toESM(require("semver"),1),import_restart=__toESM(require("./lib/restart.js"),1),import_pidusage=__toESM(require("pidusage"),1),import_deep_clone=__toESM(require("deep-clone"),1),import_node_util=require("node:util"),import_multihostServer=require("./lib/multihostServer.js"),import_js_controller_common=require("@iobroker/js-controller-common"),import_constants=require("@iobroker/js-controller-common-db/constants"),import_plugin_base=require("@iobroker/plugin-base"),import_blocklistManager=require("./lib/blocklistManager.js"),import_js_controller_cli=require("@iobroker/js-controller-cli"),import_decache=__toESM(require("decache"),1),import_cron_parser=__toESM(require("cron-parser"),1),import_utils=require("./lib/utils.js"),import_adapterAutoUpgradeManager=require("./lib/adapterAutoUpgradeManager.js"),import_tools=require("@iobroker/js-controller-common-db/tools"),import_adapterUpgradeManager=require("./lib/adapterUpgradeManager.js"),import_promises=require("node:timers/promises"),import_objects=require("./lib/objects.js"),url=__toESM(require("node:url"),1),import_node_module=require("node:module");const thisDir=url.fileURLToPath(new URL(".",__import_meta_url||`file://${__filename}`)),require2=(0,import_node_module.createRequire)(__import_meta_url||`file://${__filename}`),VIS_ADAPTERS=["vis","vis-2"],ioPackage=import_fs_extra.default.readJSONSync(import_node_path.default.join(import_js_controller_common.tools.getControllerDir(),"io-package.json")),version=ioPackage.common.version,controllerVersions={};let pluginHandler,notificationHandler,blocklistManager,autoUpgradeManager,upload,Objects,States,logger,requestedRepoUpdates=[];"win32"===import_node_os.default.platform()&&require2("loadavg-windows"),import_js_controller_common.tools.ensureDNSOrder();let isDaemon=!1,callbackId=1;const callbacks={},hostname=import_js_controller_common.tools.getHostName(),controllerDir=import_js_controller_common.tools.getControllerDir();let hostObjectPrefix=`system.host.${hostname}`,hostLogPrefix=`host.${hostname}`;const compactGroupObjectPrefix=".compactgroup",logList=[];let detectIpsCount=0,objectsDisconnectTimeout=null,statesDisconnectTimeout=null,connected=null,lastDiskSizeCheck=0,restartTimeout=null,connectTimeout=null,reportInterval=null,primaryHostInterval=null,isPrimary=!1,isRebootRequired=!1;const PRIMARY_HOST_LOCK_TIME=6e4,VENDOR_BOOTSTRAP_FILE="/opt/iobroker/iob-vendor-secret.json",VENDOR_FILE="/etc/iob-vendor.json",procs={},subscribe={},stopTimeouts={};let states=null,objects=null,storeTimer=null,mhTimer=null,isStopping=null,allInstancesStopped=!0,stopTimeout=1e4,uncaughtExceptionCount=0,installQueue=[],started=!1,inputCount=0,outputCount=0,eventLoopLags=[],mhService=null;const uptimeStart=Date.now();let compactGroupController=!1,compactGroup=null;const compactProcs={},scheduledInstances={};let diskWarningLevel=import_utils.DEFAULT_DISK_WARNING_LEVEL,updateIPsTimer=null,lastDiagSend=null;const config=getConfig();function getErrorText(e){return import_js_controller_common.EXIT_CODES[e]}function getConfig(){const e=import_js_controller_common.tools.getConfigFileName();if(import_fs_extra.default.existsSync(e)){const o=import_fs_extra.default.readJSONSync(e);return o.states||(o.states={type:"jsonl"}),o.objects||(o.objects={type:"jsonl"}),o.system||(o.system={}),o}-1!==process.argv.indexOf("start")?(isDaemon=!0,logger=(0,import_js_controller_common.logger)("info",[import_js_controller_common.tools.appName],!0)):logger=(0,import_js_controller_common.logger)("info",[import_js_controller_common.tools.appName]),logger.error(`${hostLogPrefix} conf/${import_js_controller_common.tools.appName.toLowerCase()}.json missing - call node ${import_js_controller_common.tools.appName.toLowerCase()}.js setup`),process.exit(import_js_controller_common.EXIT_CODES.MISSING_CONFIG_JSON)}function _startMultihost(e,o){const t=import_node_os.default.cpus();mhService=new import_multihostServer.MHServer(hostname,logger,e,{node:process.version,arch:import_node_os.default.arch(),model:t&&t[0]&&t[0].model?t[0].model:"unknown",cpus:t?t.length:1,mem:import_node_os.default.totalmem(),ostype:import_node_os.default.type()},o)}async function startMultihost(e){if(compactGroupController)return;mhTimer&&(clearTimeout(mhTimer),mhTimer=null);const o=e||getConfig();if(o.multihostService?.enabled){if(mhService)try{return void mhService.close((()=>{mhService=null,setImmediate((()=>startMultihost(o)))}))}catch(e){logger.warn(`${hostLogPrefix} Cannot stop multihost discovery server: ${e.message}`)}const e=await(0,import_js_controller_common.isLocalObjectsDbServer)(o.objects.type,o.objects.host,!0),t=await(0,import_js_controller_common.isLocalStatesDbServer)(o.states.type,o.states.host,!0);if(!o.objects.host||e)return logger.warn(`${hostLogPrefix} Multihost Master on this system is not possible, because IP address for objects is ${Array.isArray(o.objects.host)?o.objects.host.join(", "):o.objects.host}. Please allow remote connections to the server by adjusting the IP.`),!1;if(!o.states.host||t)return logger.warn(`${hostLogPrefix} Multihost Master on this system is not possible, because IP address for states is ${Array.isArray(o.states.host)?o.states.host.join(", "):o.states.host}. Please allow remote connections to the server by adjusting the IP.`),!1;if(o.multihostService.secure)if("string"==typeof o.multihostService.password&&o.multihostService.password.length){let e,t;try{e=await objects.getObject(import_constants.SYSTEM_CONFIG_ID)}catch(e){t=e.message}if(e?.native?.secret)if(o.multihostService.password.startsWith("$/aes-192-cbc:"))try{const t=import_js_controller_common.tools.decrypt(e.native.secret,o.multihostService.password);_startMultihost(o,t)}catch(e){logger.error(`${hostLogPrefix} Cannot decrypt password for multihost discovery server: ${e.message}`)}else import_js_controller_common.tools.decryptPhrase(e.native.secret,o.multihostService.password,(e=>_startMultihost(o,e)));else logger.error(`${hostLogPrefix} Cannot start multihost discovery server: no system.config found (err: ${t})`)}else logger.error(`${hostLogPrefix} Cannot start multihost discovery server: secure mode was configured, but no secret was set. Please check the configuration!`);else _startMultihost(o,!1);return o.multihostService.persist||(mhTimer=setTimeout((async()=>{if(mhService)try{mhService.close(),mhService=null,logger.info(`${hostLogPrefix} Multihost discovery server stopped after 15 minutes, because only temporarily activated`),o.multihostService.persist=!1,o.multihostService.enabled=!1;const e=import_js_controller_common.tools.getConfigFileName();await import_fs_extra.default.writeFile(e,JSON.stringify(o,null,2))}catch(e){logger.warn(`${hostLogPrefix} Cannot stop multihost discovery: ${e.message}`)}mhTimer=null}),9e5)),!0}if(mhService){try{mhService.close(),mhService=null}catch(e){logger.warn(`${hostLogPrefix} Cannot stop multihost discovery: ${e.message}`)}return!1}}function startUpdateIPs(){updateIPsTimer||(updateIPsTimer=setInterval((()=>{Date.now()-uptimeStart>3e5&&(clearInterval(updateIPsTimer),updateIPsTimer=setInterval((()=>setIPs()),36e5)),setIPs()}),3e4))}function logRedirect(e,o,t){if(console.log(`================================== > LOG REDIRECT ${o} => ${e} [${t}]`),e)logList.includes(o)||logList.push(o);else{const e=logList.indexOf(o);-1!==e&&logList.splice(e,1)}}function handleDisconnect(){!connected||restartTimeout||isStopping||(statesDisconnectTimeout&&(clearTimeout(statesDisconnectTimeout),statesDisconnectTimeout=null),objectsDisconnectTimeout&&(clearTimeout(objectsDisconnectTimeout),objectsDisconnectTimeout=null),connected=!1,logger.warn(`${hostLogPrefix} Slave controller detected disconnection. Stop all instances.`),compactGroupController?stop(!0):stop(!0,(()=>{restartTimeout=setTimeout((()=>{processMessage({command:"cmdExec",message:{data:"_restart"},from:hostObjectPrefix}),setTimeout((()=>process.exit(import_js_controller_common.EXIT_CODES.JS_CONTROLLER_STOPPED)),1e3)}),1e4)})))}function createStates(e){states=new States({namespace:hostLogPrefix,connection:config.states,logger:logger,hostname:hostname,change:async(e,o)=>{if(states&&objects){if(inputCount++,!e)return logger.error(`${hostLogPrefix} change event with no ID: ${JSON.stringify(o)}`);if(e.startsWith(import_constants.SYSTEM_ADAPTER_PREFIX)&&e.endsWith(".logging")){logRedirect(!!o&&o.val,e.substring(0,e.length-8),e)}else if(compactGroupController||e!==`messagebox.${hostObjectPrefix}`){if(!compactGroupController&&e.match(/^system.adapter.[^.]+\.\d+\.alive$/)){const t=o;if(t&&!t.ack){const o=t.val;let s;try{s=await objects.getObject(e.substring(0,e.length-6))}catch(e){logger.error(`${hostLogPrefix} Cannot read object: ${e.message}`)}if(s?.common&&(s.common.enabled&&!o||!s.common.enabled&&o)){s.common.enabled=!!o,logger.info(`${hostLogPrefix} instance "${s._id}" ${s.common.enabled?"enabled":"disabled"} via .alive`),s.from=hostObjectPrefix,s.ts=Date.now();try{await objects.setObject(s._id,s)}catch(e){logger.error(`${hostLogPrefix} Cannot set object: ${e.message}`)}}}}else if(subscribe[e]){const t=o;for(const o of subscribe[e])procs[o]?(console.log(`Wake up ${e} ${JSON.stringify(t)}`),startInstance(o,!0)):logger.warn(`${hostLogPrefix} controller Adapter subscribed on ${e} does not exist!`)}else if(e===`${hostObjectPrefix}.logLevel`){const e=o;if(!config||!config.log||!e||e.ack)return;let t=config.log.level;if("string"==typeof e.val&&e.val!==t&&(0,import_tools.isLogLevel)(e.val)){config.log.level=e.val;for(const o in logger.transports)logger.transports[o].level!==t||logger.transports[o]._defaultConfigLoglevel||(logger.transports[o].level=e.val);logger.info(`${hostLogPrefix} Loglevel changed from "${t}" to "${e.val}"`),t=e.val}else e.val&&e.val!==t&&logger.info(`${hostLogPrefix} Got invalid loglevel "${e.val}", ignoring`);await states.setState(`${hostObjectPrefix}.logLevel`,{val:t,ack:!0,from:hostObjectPrefix})}else if(e.startsWith(`${hostObjectPrefix}.plugins.`)&&e.endsWith(".enabled")){const t=o;if(!config||!config.log||!t||t.ack)return;const s=`${hostObjectPrefix}.plugins.`.length;let r=e.indexOf(".",s+1);-1===r&&(r=void 0);const n=e.substring(s,r);if(!pluginHandler.pluginExists(n))return;pluginHandler.isPluginActive(n)!==t.val&&(t.val?pluginHandler.isPluginInstantiated(n)||(pluginHandler.instantiatePlugin(n,pluginHandler.getPluginConfig(n),controllerDir),pluginHandler.setDatabaseForPlugin(n,objects,states),await pluginHandler.initPlugin(n,ioPackage)):await pluginHandler.destroy(n)||logger.info(`${hostLogPrefix} Plugin ${n} could not be disabled. Please restart ioBroker to disable it.`))}else if(e===`${hostObjectPrefix}.diskWarning`&&o&&"ack"in o&&!o.ack){const t=(0,import_utils.getDiskWarningLevel)(o);diskWarningLevel=t,await states.setState(e,{val:t,ack:!0})}}else{const e=o;if(e)if(e.callback&&e.callback.ack&&e.callback.id&&callbacks[`_${e.callback.id}`]){callbacks[`_${e.callback.id}`].cb(e.message),delete callbacks[`_${e.callback.id}`];const o=Date.now();for(const e of Object.keys(callbacks))o-callbacks[e].time>36e5&&delete callbacks[e]}else processMessage(e)}}else logger.error(`${hostLogPrefix} Could not handle state change of "${e}", because not connected`)},connected:()=>{statesDisconnectTimeout&&(clearTimeout(statesDisconnectTimeout),statesDisconnectTimeout=null),initMessageQueue(),startAliveInterval(),initializeController(),e&&e()},disconnected:()=>{restartTimeout||(statesDisconnectTimeout&&clearTimeout(statesDisconnectTimeout),statesDisconnectTimeout=setTimeout((()=>{statesDisconnectTimeout=null,handleDisconnect()}),(config.states.connectTimeout||2e3)+(compactGroupController?0:500)))}})}async function initializeController(){if(!states||!objects||connected)return;logger.info(`${hostLogPrefix} connected to Objects and States`);const e={states:states,objects:objects,log:logger,logPrefix:hostLogPrefix,host:hostname};if(notificationHandler=new import_js_controller_common.NotificationHandler(e),ioPackage.notifications)try{await notificationHandler.addConfig(ioPackage.notifications),logger.info(`${hostLogPrefix} added notifications configuration of host`),await notificationHandler.getSetupOfAllAdaptersFromHost()}catch(e){logger.error(`${hostLogPrefix} Could not add notifications config of this host: ${e.message}`)}autoUpgradeManager=new import_adapterAutoUpgradeManager.AdapterAutoUpgradeManager({objects:objects,states:states,logger:logger,logPrefix:hostLogPrefix}),blocklistManager=new import_blocklistManager.BlocklistManager({objects:objects}),checkSystemLocaleSupported(),null===connected?(connected=!0,isStopping||(pluginHandler.setDatabaseForPlugins(objects,states),await pluginHandler.initPlugins(ioPackage),states.subscribe(`${hostObjectPrefix}.plugins.*`),await checkHost(),startMultihost(config),setMeta(),started=!0,getInstances())):(connected=!0,started=!0,isStopping||getInstances())}function createObjects(e){objects=new Objects({namespace:hostLogPrefix,connection:config.objects,controller:!0,logger:logger,hostname:hostname,connected:async()=>{objectsDisconnectTimeout&&(clearTimeout(objectsDisconnectTimeout),objectsDisconnectTimeout=null);try{await objects.subscribePrimaryHost()}catch(e){logger.error(`${hostLogPrefix} Cannot subscribe to primary host expiration: ${e.message}`)}primaryHostInterval||compactGroupController||(primaryHostInterval=setInterval(checkPrimaryHost,3e4)),checkPrimaryHost(),initializeController(),e&&e()},disconnected:()=>{restartTimeout||(isPrimary=!1,objectsDisconnectTimeout&&clearTimeout(objectsDisconnectTimeout),objectsDisconnectTimeout=setTimeout((()=>{objectsDisconnectTimeout=null,handleDisconnect()}),(config.objects.connectTimeout||2e3)+(compactGroupController?0:500)))},change:async(e,o)=>{if(!started||!e.match(/^system\.adapter\.[a-zA-Z0-9-_]+\.[0-9]+$/))return;const t=o,s=e;try{logger.debug(`${hostLogPrefix} object change ${s} (from: ${t?t.from:null})`);const e=procs[s];if(e)if(t?(e.config.common.enabled&&!t.common.enabled&&logger.info(`${hostLogPrefix} "${s}" disabled`),!e.config.common.enabled&&t.common.enabled&&(logger.info(`${hostLogPrefix} "${s}" enabled`),e.downloadRetry=0),compactGroupController||!e.config.common.compactGroup||e.config.common.compactGroup===t.common.compactGroup&&e.config.common.runAsCompactMode===t.common.runAsCompactMode||!compactProcs[e.config.common.compactGroup]?.instances?.includes(s)||compactProcs[e.config.common.compactGroup].instances.splice(compactProcs[e.config.common.compactGroup].instances.indexOf(s),1),e.config=t):(!compactGroupController&&e.config.common.compactGroup&&compactProcs[e.config.common.compactGroup]?.instances?.includes(s)&&compactProcs[e.config.common.compactGroup].instances.splice(compactProcs[e.config.common.compactGroup].instances.indexOf(s),1),await notificationHandler.clearNotifications(null,null,s),e.config.common.enabled=!1,e.config.common.host=null,e.config.deleted=!0,logger.info(`${hostLogPrefix} object deleted ${s}`)),e.process||"schedule"===e.config.common.mode){if(e.restartExpected=!0,await stopInstance(s,!1),!procs[s])return;const o=import_js_controller_common.tools.findIPs();if(checkAndAddInstance(e.config,o)){if(e.config.common.enabled&&("extension"!==e.config.common.mode||!e.config.native.webInstance)){e.restartTimer&&clearTimeout(e.restartTimer);const o=(e.config.common.stopTimeout||500)+2500;e.restartTimer=setTimeout((e=>startInstance(e)),o,s)}}else!compactGroupController&&e.config.common.compactGroup&&compactProcs[e.config.common.compactGroup]?.instances?.includes(s)&&compactProcs[e.config.common.compactGroup].instances.splice(compactProcs[e.config.common.compactGroup].instances.indexOf(s),1),e.restartTimer&&(clearTimeout(e.restartTimer),delete e.restartTimer),await notificationHandler.clearNotifications(null,null,s),delete procs[s]}else if(installQueue.find((e=>e.id===s)))logger.debug(`${hostLogPrefix} ignore object change because the adapter is still in installation/rebuild queue`);else{const o=import_js_controller_common.tools.findIPs();e.config&&checkAndAddInstance(e.config,o)?!e.config.common.enabled||"extension"===e.config.common.mode&&e.config.native.webInstance||startInstance(s):(!compactGroupController&&e.config.common.compactGroup&&compactProcs[e.config.common.compactGroup]?.instances?.includes(s)&&compactProcs[e.config.common.compactGroup].instances.splice(compactProcs[e.config.common.compactGroup].instances.indexOf(s),1),e.restartTimer&&(clearTimeout(e.restartTimer),delete e.restartTimer),delete procs[s])}else if(t?.common){if(!checkAndAddInstance(t,import_js_controller_common.tools.findIPs()))return;const e=procs[s];if(e.config.common.enabled&&("extension"!==e.config.common.mode||!e.config.native.webInstance)){const o=(e.config.common.stopTimeout||500)+2500;e.restartTimer=setTimeout((e=>startInstance(e)),o,s)}}}catch(e){(!compactGroupController||t?.common?.runAsCompactMode&&t.common.compactGroup===compactGroup)&&logger.error(`${hostLogPrefix} cannot process: ${s}: ${e} / ${e.stack}`)}},primaryHostLost:()=>{isStopping||(isPrimary=!1,logger.info("The primary host is no longer active. Checking responsibilities."),checkPrimaryHost())}})}function startAliveInterval(){config.system=config.system||{},config.system.statisticsInterval=Math.round(config.system.statisticsInterval)||15e3,config.system.checkDiskInterval=0!==config.system.checkDiskInterval?Math.round(config.system.checkDiskInterval)||3e5:0,compactGroupController||states.setState(`${hostObjectPrefix}.compactModeEnabled`,{ack:!0,from:hostObjectPrefix,val:config.system.compact||!1}),reportInterval=setInterval(reportStatus,config.system.statisticsInterval),reportStatus(),import_js_controller_common.tools.measureEventLoopLag(1e3,(e=>eventLoopLags.push(e)))}async function checkSystemLocaleSupported(){if(!objects)throw new Error("Objects database not connected");await objects.isSystemLocaleSupported()||await notificationHandler.addMessage({category:"system",scope:"databaseErrors",message:"Your redis server is using an unsupported locale. This can lead to unexpected behavior of your ioBroker installation as well as data loss. Please configure your Redis Server according to https://forum.iobroker.net/topic/52976/wichtiger-hinweis-f%C3%BCr-redis-installationen?_=1678099836122",instance:`system.host.${hostname}`})}async function checkPrimaryHost(){if(!objectsDisconnectTimeout&&!compactGroupController)try{if(isPrimary){!!await objects.extendPrimaryHostLock(6e4)||(isPrimary=!!await objects.setPrimaryHost(6e4))}else isPrimary=!!await objects.setPrimaryHost(6e4)}catch(e){logger.error(`${hostLogPrefix} Could not execute primary host determination: ${e.message}`)}}async function reportStatus(){if(!states)return;const e=hostObjectPrefix;outputCount+=10,states.setState(`${e}.alive`,{val:!0,ack:!0,expire:Math.floor(config.system.statisticsInterval/1e3)+10,from:e});try{(0,import_pidusage.default)(process.pid,((o,t)=>{!o&&states&&states.setState&&t&&(states.setState(`${e}.cpu`,{ack:!0,from:e,val:Math.round(100*t.cpu)/100}),states.setState(`${e}.cputime`,{ack:!0,from:e,val:t.ctime/1e3}),outputCount+=2)}))}catch(e){logger.error(`${hostLogPrefix} Cannot read pidUsage data : ${e.message}`)}try{const o=process.memoryUsage();states.setState(`${e}.memRss`,{val:Math.round(o.rss/10485.76)/100,ack:!0,from:e}),states.setState(`${e}.memHeapTotal`,{val:Math.round(o.heapTotal/10485.76)/100,ack:!0,from:e}),states.setState(`${e}.memHeapUsed`,{val:Math.round(o.heapUsed/10485.76)/100,ack:!0,from:e})}catch(e){logger.error(`${hostLogPrefix} Cannot read memoryUsage data: ${e.message}`)}if(states.setState(`${e}.load`,{val:Math.round(100*import_node_os.default.loadavg()[0])/100,ack:!0,from:e}),states.setState(`${e}.uptime`,{val:Math.round(process.uptime()),ack:!0,from:e}),states.setState(`${e}.mem`,{val:Math.round(100-import_node_os.default.freemem()/import_node_os.default.totalmem()*100),ack:!0,from:e}),states.setState(`${e}.freemem`,{val:Math.round(import_node_os.default.freemem()/1048576),ack:!0,from:e}),import_fs_extra.default.existsSync("/proc/meminfo"))try{const o=import_fs_extra.default.readFileSync("/proc/meminfo","utf8"),t=o&&o.match(/MemAvailable:\s*(\d+)/);t&&t[1]&&(states.setState(`${e}.memAvailable`,{val:Math.round(.001024*parseInt(t[1],10)),ack:!0,from:e}),outputCount++)}catch(e){logger.error(`${hostLogPrefix} Cannot read /proc/meminfo: ${e.message}`)}if(config.system.checkDiskInterval&&Date.now()-lastDiskSizeCheck>=config.system.checkDiskInterval){lastDiskSizeCheck=Date.now();let o=null;try{o=await import_js_controller_common.tools.getDiskInfo()}catch(e){logger.error(`${hostLogPrefix} Cannot read disk size: ${e.message}`)}try{if(o){const t=Math.round((o["Disk size"]||0)/1048576),s=Math.round((o["Disk free"]||0)/1048576),r=s/t*100;r<diskWarningLevel&&await notificationHandler.addMessage({scope:"system",category:"diskSpaceIssues",message:`Your system has only ${r.toFixed(2)} % of disk space left.`,instance:`system.host.${hostname}`}),states.setState(`${e}.diskSize`,{val:t,ack:!0,from:e}),states.setState(`${e}.diskFree`,{val:s,ack:!0,from:e}),outputCount+=2}}catch(e){logger.error(`${hostLogPrefix} Cannot read disk information: ${e.message}`)}}if(states.setState(`${e}.inputCount`,{val:inputCount,ack:!0,from:e}),states.setState(`${e}.outputCount`,{val:outputCount,ack:!0,from:e}),eventLoopLags.length){const o=Math.ceil(eventLoopLags.reduce(((e,o)=>e+o))/eventLoopLags.length);states.setState(`${e}.eventLoopLag`,{val:o,ack:!0,from:e}),eventLoopLags=[]}states.setState(`${e}.compactgroupProcesses`,{val:Object.keys(compactProcs).length,ack:!0,from:e});let o=0,t=0;Object.values(procs).forEach((e=>{e.process&&(e.startedInCompactMode?t++:o++)})),states.setState(`${e}.instancesAsProcess`,{val:o,ack:!0,from:e}),states.setState(`${e}.instancesAsCompact`,{val:t,ack:!0,from:e}),inputCount=0,outputCount=0,!isStopping&&compactGroupController&&started&&0===t&&0===o&&(logger.info(`${hostLogPrefix} Compact group controller ${compactGroup} does not own any processes, stop`),stop(!1))}async function changeHost(e,o,t){for(const s of e)if(s?.value?.common.host===o){const e=s.value;e.common.host=t,logger.info(`${hostLogPrefix} Reassign instance ${e._id.substring(import_constants.SYSTEM_ADAPTER_PREFIX.length)} from ${o} to ${t}`),e.from=`system.host.${import_js_controller_common.tools.getHostName()}`,e.ts=Date.now();try{await objects.setObject(e._id,e)}catch(o){logger.error(`Error changing host of ${e._id}: ${o.message}`)}}}function cleanAutoSubscribe(e,o,t){inputCount++,states.getState(`${o}.subscribes`,(async(s,r)=>{if(!r||!r.val)return setImmediate((()=>t()));let n;try{n=JSON.parse(r.val)}catch{return logger.error(`${hostLogPrefix} Cannot parse subscribes: ${r.val}`),setImmediate((()=>t()))}let a=!1;for(const o of Object.keys(n)){for(const t of Object.keys(n[o]))t===e&&(a=!0,delete n[o][t]);Object.keys(n[o]).length||(a=!0,delete n[o])}a&&(outputCount++,await states.setState(`${o}.subscribes`,n)),setImmediate((()=>t()))}))}function cleanAutoSubscribes(e,o){const t=e.substring(15);objects.getObjectView("system","instance",{startkey:import_constants.SYSTEM_ADAPTER_PREFIX,endkey:`${import_constants.SYSTEM_ADAPTER_PREFIX}香`},((e,s)=>{let r=0;if(s)for(const e of s.rows)e.value?.common.subscribable&&(r++,cleanAutoSubscribe(t,e.id,(()=>! --r&&o&&o())));!r&&o&&o()}))}async function delObjects(e){for(const o of e)if(o?.id){logger.info(`${hostLogPrefix} Delete state "${o.id}"`);try{o.value&&"state"===o.value.type?(await states.delState(o.id),await objects.delObject(o.id)):await objects.delObject(o.id)}catch{}}}async function checkHost(){const e=objects.getStatus();if(compactGroupController||!e.server)return;let o;try{o=await objects.getObjectViewAsync("system","host",{startkey:"system.host.",endkey:"system.host.香"})}catch{}if(1===o?.rows.length&&o?.rows[0].value.common.name!==hostname){const e=o.rows[0].value.common.name,t=o.rows[0].value._id;let s;try{s=await objects.getObjectViewAsync("system","instance",{startkey:import_constants.SYSTEM_ADAPTER_PREFIX,endkey:`${import_constants.SYSTEM_ADAPTER_PREFIX}香`})}catch(e){if(e.message.startsWith("Cannot find "))return}if(!s?.rows||0===s.rows.length)return void logger.info(`${hostLogPrefix} no instances found`);await changeHost(s.rows,e,hostname),logger.info(`${hostLogPrefix} Delete host ${t}`);try{await objects.delObjectAsync(t)}catch{}try{const o=await objects.getObjectViewAsync("system","state",{startkey:`system.host.${e}.`,endkey:`system.host.${e}.香`,include_docs:!0});return void await delObjects(o.rows)}catch{}}}async function collectDiagInfo(e){if("extended"!==e&&"normal"!==e&&"no-city"!==e)return null;let o,t,s,r;try{o=await objects.getObject(import_constants.SYSTEM_CONFIG_ID)}catch(e){t=e}!t&&o?.common||(logger.warn(`System config object is corrupt, please run "${import_js_controller_common.tools.appNameLowerCase} setup first". Error: ${t.message}`),o=o||{common:{}},o.common=o.common||{});try{s=await objects.getObjectAsync("system.meta.uuid")}catch{}s||(s={native:{uuid:"not found"}}),t=null;try{r=await objects.getObjectViewAsync("system","host",{startkey:"system.host.",endkey:"system.host.香"})}catch(e){t=e}const{noCompactInstances:n,noInstances:a}=await _getNumberOfInstances(),i={uuid:s.native.uuid,language:o.common.language,country:"",city:"",hosts:[],node:process.version,arch:import_node_os.default.arch(),docker:import_js_controller_common.tools.isDocker(),adapters:{},statesType:config.states.type,objectsType:config.objects.type,noInstances:a,compactMode:config.system.compact,noCompactInstances:n};if("extended"===e||"no-city"===e){const e=import_node_os.default.cpus();i.country="country"in o.common?o.common.country:"unknown",i.model=e&&e[0]&&e[0].model?e[0].model:"unknown",i.cpus=e?e.length:1,i.mem=import_node_os.default.totalmem(),i.ostype=import_node_os.default.type(),delete i.city}if("extended"===e?i.city="city"in o.common?o.common.city:"unknown":"normal"===e&&(delete i.city,delete i.country),!t&&r?.rows.length){r.rows.sort(((e,o)=>{try{return import_semver.default.lt(e.value.common.installedVersion??"0.0.0",o.value.common.installedVersion??"0.0.0")?1:0}catch{return logger.error(`${hostLogPrefix} Invalid versions: ${e.value.common.installedVersion??"0.0.0"}[${e.value.common.name??"unknown"}] or ${o.value.common.installedVersion??"0.0.0"}[${o.value.common.name??"unknown"}]`),0}}));for(const e of r.rows)i.hosts.push({version:e.value.common.installedVersion,platform:e.value.common.platform,type:e.value.native.os.platform})}r=null,t=null;try{r=await objects.getObjectViewAsync("system","adapter",{startkey:import_constants.SYSTEM_ADAPTER_PREFIX,endkey:`${import_constants.SYSTEM_ADAPTER_PREFIX}香`})}catch(e){t=e}const c=new Set;if(!t&&r?.rows.length)for(const e of r.rows)i.adapters[e.value.common.name]={version:e.value.common.version,platform:e.value.common.platform,installedFrom:e.value.common.installedFrom},VIS_ADAPTERS.includes(e.value.common.name)&&c.add(e.value.common.name);for(const e of c){const{calcProjects:o}=await import("./lib/vis/states.js");try{const t=await o({objects:objects,instance:0,visAdapter:e});let s=null;const r=[];if(t?.length)for(const o of t)o.id===`${e}.0.datapoints.total`&&(s=o.val),r.push({_id:o.id,type:"state",native:{},common:{name:"Datapoints count",role:"state",type:"number",read:!0,write:!1},state:{val:o.val,ack:!0}});null!==s&&(i[e]=s),await extendObjects(r)}catch(e){logger.error(`${hostLogPrefix} cannot call visUtils: ${e.message}`)}}return i}function setIPs(e){if(isStopping)return;const o=e||import_js_controller_common.tools.findIPs();let t=!1;for(const e of o)if("127.0.0.1"!==e&&"::1/128"!==e){t=!0;break}!t&&detectIpsCount<10?(detectIpsCount++,setTimeout((()=>setIPs()),3e4)):t?objects.getObject(`system.host.${hostname}`,((e,t)=>{const s=import_node_os.default.networkInterfaces();!(!e&&t&&t.common&&t.native&&t.native.hardware)||(0,import_node_util.isDeepStrictEqual)(t.native.hardware.networkInterfaces,s)&&(0,import_node_util.isDeepStrictEqual)(t.common.address,o)||(t.common.address=o,t.native.hardware.networkInterfaces=s,t.from=hostObjectPrefix,t.ts=Date.now(),objects.setObject(t._id,t,(e=>e&&logger.error(`${hostLogPrefix} Cannot write host object: ${e.message}`)))),startUpdateIPs()})):logger.info(`${hostLogPrefix} No IPv4 address found after 5 minutes.`)}async function extendObjects(e){for(const o of e){const e=o.state;void 0!==e&&delete o.state;try{await objects.extendObjectAsync(o._id,o),e&&await states.setState(o._id,e)}catch{}}}async function setMeta(){const e=hostObjectPrefix,o=await objects.getObject(e);let t;if(t=compactGroupController?{_id:e,type:"folder",common:{name:hostname+compactGroupObjectPrefix+compactGroup,cmd:`${process.argv[0]} ${`${process.execArgv.join(" ")} `.replace(/--inspect-brk=\d+ /,"")}${process.argv.slice(1).join(" ")}`,hostname:hostname,address:import_js_controller_common.tools.findIPs()},native:{}}:(0,import_tools.getHostObject)(o),o&&(delete o.cmd,delete o.from,delete o.ts,delete o.acl),o&&(0,import_node_util.isDeepStrictEqual)(t,o))setIPs(t.common.address);else{t.from=hostObjectPrefix,t.ts=Date.now();try{await objects.setObject(e,t),setIPs(t.common.address)}catch(e){logger.error(`${hostLogPrefix} Cannot write host object: ${e.message}`)}}config.system.checkDiskInterval=0!==config.system.checkDiskInterval?Math.round(config.system.checkDiskInterval)||3e5:0;const s=(0,import_objects.getHostObjects)({id:e,hostname:hostname,config:config,isCompactGroupController:compactGroupController});objects.getObjectView("system","state",{startkey:`${hostObjectPrefix}.`,endkey:`${hostObjectPrefix}.香`,include_docs:!0},(async(e,o)=>{if(e)logger?.error(`${hostLogPrefix} Could not collect ${hostObjectPrefix} states to check for obsolete states: ${e.message}`);else if(o?.rows){let e=o.rows;compactGroupController||(e=o.rows.filter((e=>!e.id.includes(hostObjectPrefix+compactGroupObjectPrefix))));const t=`${hostObjectPrefix}.plugins.`.length,r=`${hostObjectPrefix}.notifications.`.length,n=e.filter((e=>{const o=s.find((o=>e.id===o._id));if(void 0===o){if(e.id.startsWith(`${hostObjectPrefix}.plugins.`)){let o=e.id.indexOf(".",t+1);return-1===o&&(o=void 0),!pluginHandler.pluginExists(e.id.substring(t,o))}if(e.id.startsWith(`${hostObjectPrefix}.notifications.`))return!notificationHandler.scopeExists(e.id.substring(r))}return void 0===o}));n&&n.length>0&&(await delObjects(n),logger?.info(`${hostLogPrefix} Some obsolete host states deleted.`))}if(await extendObjects(s),!compactGroupController){const e=await import_js_controller_common.tools.createUuid(objects);if(e&&logger?.info(`${hostLogPrefix} Created UUID: ${e}`),import_fs_extra.default.existsSync(VENDOR_BOOTSTRAP_FILE)){logger?.info(`${hostLogPrefix} Detected vendor file: ${import_fs_extra.default.existsSync(VENDOR_BOOTSTRAP_FILE)}`);let e=!1;try{const o=import_fs_extra.default.readJSONSync(VENDOR_BOOTSTRAP_FILE);if(o.password){const{Vendor:t}=await import("@iobroker/js-controller-cli"),s=new t({objects:objects});logger?.info(`${hostLogPrefix} Apply vendor file: ${VENDOR_FILE}`);try{e=await s.checkVendor(VENDOR_FILE,o.password,o.javascriptPassword,logger),logger?.info(`${hostLogPrefix} Vendor information synchronised.`);try{import_fs_extra.default.existsSync(VENDOR_BOOTSTRAP_FILE)&&import_fs_extra.default.unlinkSync(VENDOR_BOOTSTRAP_FILE)}catch(e){logger?.error(`${hostLogPrefix} Cannot delete file ${VENDOR_BOOTSTRAP_FILE}: ${e.message}`)}}catch(e){logger?.error(`${hostLogPrefix} Cannot update vendor information: ${e.message}`);try{import_fs_extra.default.existsSync(VENDOR_BOOTSTRAP_FILE)&&import_fs_extra.default.unlinkSync(VENDOR_BOOTSTRAP_FILE)}catch(e){logger?.error(`${hostLogPrefix} Cannot delete file ${VENDOR_BOOTSTRAP_FILE}: ${e.message}`)}}}}catch(e){logger?.error(`${hostLogPrefix} Cannot parse ${VENDOR_BOOTSTRAP_FILE}: ${e.message}`);try{import_fs_extra.default.existsSync(VENDOR_BOOTSTRAP_FILE)&&import_fs_extra.default.unlinkSync(VENDOR_BOOTSTRAP_FILE)}catch(e){logger?.error(`${hostLogPrefix} Cannot delete file ${VENDOR_BOOTSTRAP_FILE}: ${e.message}`)}}e&&(logger.info(`${hostLogPrefix} Restart js-controller because vendor information updated`),await(0,import_promises.setTimeout)(200),(0,import_restart.default)((()=>!isStopping&&stop(!1))))}}}))}function initMessageQueue(){states.subscribeMessage(hostObjectPrefix)}async function sendTo(e,o,t,s){if(!states)return;void 0===t&&(t=o,o="send");const r={command:o,message:t,from:hostObjectPrefix};e.startsWith(import_constants.SYSTEM_ADAPTER_PREFIX)||e.startsWith("system.host.")||(e=`${import_constants.SYSTEM_ADAPTER_PREFIX}${e}`),s&&("function"==typeof s?(r.callback={message:t,id:callbackId++,ack:!1,time:Date.now()},callbackId>4294967295&&(callbackId=1),callbacks[`_${r.callback.id}`]={cb:s,time:Date.now()}):(r.callback=s,r.callback.ack=!0));try{await states.pushMessage(e,r)}catch(o){logger.error(`${hostLogPrefix} [sendTo] Could not push message "${(0,import_node_util.inspect)(r)}" to "${e}": ${o.message}`),r.callback&&r.callback.id&&("function"==typeof s&&s(o),delete callbacks[`_${r.callback.id}`])}}async function getVersionFromHost(e){const o=await states.getState(`${e}.alive`);return o?.val?new Promise((o=>{let t=setTimeout((()=>{t=null,logger.warn(`${hostLogPrefix} too delayed answer for ${e}`),o(null)}),5e3);sendTo(e,"getVersion",null,(e=>{t&&(clearTimeout(t),t=null,o(e))}))})):(logger.warn(`${hostLogPrefix} "${e}" is offline`),null)}async function uploadAdapter(e){upload||(upload=new import_js_controller_cli.Upload({states:states,objects:objects}));const o=e.msg,t=o?.from?{log:e=>states.pushMessage(o.from,{command:"log",text:e,from:`system.host.${hostname}`}),warn:e=>states.pushMessage(o.from,{command:"warn",text:e,from:`system.host.${hostname}`}),error:e=>states.pushMessage(o.from,{command:"error",text:e,from:`system.host.${hostname}`})}:void 0;await upload.uploadAdapter(e.adapter,!0,!0,"",t),await upload.upgradeAdapterObjects(e.adapter,void 0,t),await upload.uploadAdapter(e.adapter,!1,!0,"",t),o?.callback&&o.from&&sendTo(o.from,o.command,{result:"done"},o.callback)}async function processMessage(e){if(isStopping)logger.debug(`${hostLogPrefix} Ignoring incoming Host message because controller is stopping ${e.command}`);else switch(logger.debug(`${hostLogPrefix} Incoming Host message ${e.command}`),e.command){case"shell":config.system?.allowShellCommands?(logger.info(`${hostLogPrefix} ${import_js_controller_common.tools.appName} execute shell command: ${e.message}`),(0,import_node_child_process.exec)(e.message,{windowsHide:!0},((e,o,t)=>{if(e)return logger.error(`${hostLogPrefix} error: ${e.message}`);logger.info(`${hostLogPrefix} stdout: ${o}`),logger.error(`${hostLogPrefix} stderr: ${t}`)}))):logger.warn(`${hostLogPrefix} ${import_js_controller_common.tools.appName} cannot execute shell command "${e.message}" because not enabled in ${import_js_controller_common.tools.appName.toLowerCase()}.json file`);break;case"cmdExec":{const o=import_node_path.default.join(import_js_controller_common.tools.getControllerDir(),`${import_js_controller_common.tools.appName.toLowerCase()}.js`),t=[...(0,import_tools.getDefaultNodeArgs)(o),o];if(e.message.data&&"string"==typeof e.message.data){const o=e.message.data.split(" ");t.push(...o),logger.info(`${hostLogPrefix} ${import_js_controller_common.tools.appName.toLowerCase()} ${o.join(" ")}`);try{const o=(0,import_node_child_process.spawn)(process.execPath,t,{windowsHide:!0});o.stdout&&o.stdout.on("data",(o=>{o=o.toString().replace(/\n/g,""),logger.info(`${hostLogPrefix} ${import_js_controller_common.tools.appName} ${o}`),e.from&&sendTo(e.from,"cmdStdout",{id:e.message.id,data:o})})),o.stderr&&o.stderr.on("data",(o=>{o=o.toString().replace(/\n/g,""),logger.error(`${hostLogPrefix} ${import_js_controller_common.tools.appName} ${o}`),e.from&&sendTo(e.from,"cmdStderr",{id:e.message.id,data:o})})),o.on("exit",(o=>{logger.info(`${hostLogPrefix} ${import_js_controller_common.tools.appName} exit ${o}`),e.from&&(sendTo(e.from,"cmdExit",{id:e.message.id,data:o}),setTimeout((()=>sendTo(e.from,"cmdExit",{id:e.message.id,data:o})),1e3))}))}catch(o){logger.error(`${hostLogPrefix} ${import_js_controller_common.tools.appName} ${o.message}`),e.from&&sendTo(e.from,"cmdStderr",{id:e.message.id,data:o.message})}}else logger.warn(`${hostLogPrefix} ${import_js_controller_common.tools.appName} Invalid cmdExec object. Expected key "data" with the command as string. Got as "data": ${JSON.stringify(e.message.data)}`);break}case"getRepository":if(e.callback&&e.from){if(requestedRepoUpdates.push({from:e.from,callback:e.callback}),requestedRepoUpdates.length>1)return void logger.debug(`${hostLogPrefix} Repository update already running, registered instance "${e.from}"`);let o;try{o=await objects.getObject(import_constants.SYSTEM_CONFIG_ID)}catch{}if(o?.common?.diag&&o.common.licenseConfirmed&&(!lastDiagSend||Date.now()-lastDiagSend>3e4)){lastDiagSend=Date.now();try{const e=await collectDiagInfo(o.common.diag);e&&import_js_controller_common.tools.sendDiagInfo(e)}catch(e){logger.error(`${hostLogPrefix} cannot collect diagnostics: ${e.message}`)}}const t={},s=await objects.getObjectAsync(import_constants.SYSTEM_REPOSITORIES_ID);let r=!1;if(s?.native?.repositories){let n=!1;import_js_controller_common.tools.isObject(e.message)&&(n=e.message.update,e.message=e.message.repo);let a=e.message||o.common.activeRepo;Array.isArray(a)||(a=[a]);for(const e of a){const o=s.native.repositories[e];if(o){"string"==typeof o&&(s.native.repositories[e]={link:o,json:null},r=!0);const a=s.native.repositories[e];if(!a.json||n){logger.info(`${hostLogPrefix} Updating repository "${e}" under "${a.link}"`);try{if(!a.json||!a.time||!a.hash||Date.now()-new Date(a.time).getTime()>=3e4){const e=await import_js_controller_common.tools.getRepositoryFileAsync(a.link,a.hash,n,a.json);e?.json&&e.changed&&(r=!0,a.json=e.json,a.hash=e.hash||"",a.time=(new Date).toISOString())}a.time||(a.time=(new Date).toISOString(),r=!0)}catch(o){logger.error(`${hostLogPrefix} Error by updating repository "${e}" under "${s.native.repositories[e].link}": ${o.message}`)}}a.json&&Object.assign(t,a.json)}else logger.warn(`${hostLogPrefix} Requested repository "${e}" does not exist in config.`)}if(r||n)try{s.ts=Date.now(),await objects.setObject(import_constants.SYSTEM_REPOSITORIES_ID,s)}catch(e){logger.warn(`${hostLogPrefix} Repository object could not be updated: ${e.message}`)}}for(const o of requestedRepoUpdates)sendTo(o.from,e.command,t,o.callback);requestedRepoUpdates=[];try{await checkAvailableDockerUpdate()}catch(e){logger.warn(`${hostLogPrefix} Could not check for new Docker image: ${e.message}`)}try{await listUpdatableOsPackages()}catch(e){logger.warn(`${hostLogPrefix} Could not check for new OS updates: ${e.message}`)}await checkRebootRequired(),await disableBlocklistedInstances(),r&&await autoUpgradeAdapters()}else logger.error(`${hostLogPrefix} Invalid request ${e.command}. "callback"(${!!e.callback}) or "from"(${!!e.from}) is null`);break;case"getInstalled":if(e.callback&&e.from){const o=await objects.getObjectViewAsync("system","host",{startkey:"system.host.",endkey:"system.host.香"}),t=import_js_controller_common.tools.getInstalledInfo(),s={};if(o?.rows.length)for(const e of o.rows)if(e.id===hostObjectPrefix){const e=(0,import_deep_clone.default)(ioPackage.common);e.host=hostname,e.runningVersion=version,s[hostname]=e}else{const o=await getVersionFromHost(e.id);o&&(s[o.host]=o)}sendTo(e.from,e.command,{...t,hosts:s},e.callback)}else logger.error(`${hostLogPrefix} Invalid request ${e.command}. "callback" or "from" is null`);break;case"getInstalledAdapter":if(e.callback&&e.from&&e.message){const o=import_js_controller_common.tools.getAdapterDir(e.message);let t=null;if(import_fs_extra.default.existsSync(`${o}/io-package.json`))try{t=import_fs_extra.default.readJSONSync(`${o}/io-package.json`)}catch{logger.error(`${hostLogPrefix} cannot read and parse "${o}/io-package.json"`)}sendTo(e.from,e.command,t,e.callback)}else logger.error(`${hostLogPrefix} Invalid request ${e.command}. "callback" or "from" is null`);break;case"getVersion":if(e.callback&&e.from){const o=(0,import_deep_clone.default)(ioPackage.common);o.host=hostname,o.runningVersion=version,sendTo(e.from,e.command,o,e.callback)}else logger.error(`${hostLogPrefix} Invalid request ${e.command}. "callback" or "from" is null`);break;case"getDiagData":if(e.callback&&e.from)if(e.message)try{const o=await collectDiagInfo(e.message);sendTo(e.from,e.command,o,e.callback)}catch{sendTo(e.from,e.command,null,e.callback)}else sendTo(e.from,e.command,null,e.callback);else logger.error(`${hostLogPrefix} Invalid request ${e.command}. "callback" or "from" is null`);break;case"getLocationOnDisk":e.callback&&e.from?sendTo(e.from,e.command,{path:controllerDir,platform:import_node_os.default.platform()},e.callback):logger.error(`${hostLogPrefix} Invalid request ${e.command}. "callback" or "from" is null`);break;case"getDevList":if(e.callback&&e.from){if("linux"===import_node_os.default.platform()){const o=["/dev"];logger.info(`${hostLogPrefix} ls /dev`);const t=(0,import_node_child_process.spawn)("ls",o,{windowsHide:!0});let s="";t.stdout&&t.stdout.on("data",(e=>s+=e.toString())),t.stderr&&t.stderr.on("data",(e=>logger.error(`${hostLogPrefix} ls ${e}`))),t.on("exit",(()=>{s=s.replace(/(\r\n|\n|\r|\t)/gm," ");const o=s.split(" "),t=[];for(let e=0;e<o.length;e++)o[e]=o[e].trim(),o[e]&&t.push(o[e]);sendTo(e.from,e.command,t,e.callback)}));break}sendTo(e.from,e.command,null,e.callback)}else logger.error(`${hostLogPrefix} Invalid request ${e.command}. "callback" or "from" is null`);break;case"getLogs":if(e.callback&&e.from){const o=e.message||200;let t="",s=logger.getFileName();if(import_fs_extra.default.existsSync(s)||(s=`${controllerDir}/../../log/${import_js_controller_common.tools.appName}.log`),import_fs_extra.default.existsSync(s)){const r=import_fs_extra.default.statSync(s),n=r.size>150*o?r.size-150*o:0;import_fs_extra.default.createReadStream(s,{start:n,end:r.size}).on("data",(e=>t+=e.toString())).on("end",(()=>{const o=t.split("\n");n&&o.shift(),o.push(r.size.toString()),sendTo(e.from,e.command,o,e.callback)})).on("error",(()=>sendTo(e.from,e.command,[r.size],e.callback)))}else sendTo(e.from,e.command,[0],e.callback)}else logger.error(`${hostLogPrefix} Invalid request ${e.command}. "callback" or "from" is null`);break;case"getLogFile":if(e.callback&&e.from&&e.message){const o=getConfig();if(o&&o.log&&o.log.transport&&o.log.transport[e.message.transport]){let t=o.log.transport[e.message.transport].filename||"log/";const s=t.replace(/\\/g,"/").split("/");if(s.pop(),t=s.join("/"),"/"!==t[0]&&!t.match(/^\W:/)){const e=["..","..","..",".."];do{e.pop();const o=import_node_path.default.normalize(`${controllerDir}/${e.join("/")}/`)+t;if(import_fs_extra.default.existsSync(o)){t=o;break}}while(e.length)}if(import_fs_extra.default.existsSync(t))try{const o=import_node_path.default.join(t,e.message.filename),s=import_fs_extra.default.lstatSync(o),r=import_fs_extra.default.readFileSync(o);sendTo(e.from,e.command,{data:r,gz:e.message.filename.toLowerCase().endsWith(".gz"),size:s.size},e.callback)}catch(o){sendTo(e.from,e.command,{error:`Cannot read file: ${o}`},e.callback)}else sendTo(e.from,e.command,{error:"Cannot find file"},e.callback)}else sendTo(e.from,e.command,{error:"invalid config"},e.callback)}else logger.error(`${hostLogPrefix} Invalid request ${e.command}. "callback" or "from" is null`);break;case"getLogFiles":if(e.callback&&e.from){const o=getConfig(),t={list:[]};if(o&&o.log&&o.log.transport)for(const e in o.log.transport)if(o.log.transport[e]&&"file"===o.log.transport[e].type){let s=o.log.transport[e].filename||"log/";const r=s.replace(/\\/g,"/").split("/");if(r.pop(),s=r.join("/"),"/"!==s[0]&&!s.match(/^\W:/)){const e=["..","..","..",".."];do{e.pop();const o=import_node_path.default.normalize(`${controllerDir}/${e.join("/")}/`)+s;if(import_fs_extra.default.existsSync(o)){s=o;break}}while(e.length)}try{if(import_fs_extra.default.existsSync(s)){const o=import_fs_extra.default.readdirSync(s);for(const r of o)try{if(!r.endsWith("-audit.json")){const o=import_fs_extra.default.lstatSync(import_node_path.default.join(s,r));o.isDirectory()||t.list.push({fileName:`log/${hostname}/${e}/${r}`,size:o.size})}}catch(e){logger.error(`${hostLogPrefix} cannot check file: ${import_node_path.default.join(s,r)} - ${e.message}`)}}}catch(e){logger.error(`${hostLogPrefix} cannot check files: ${s} - ${e.message}`)}}sendTo(e.from,e.command,t,e.callback)}else logger.error(`${hostLogPrefix} Invalid request ${e.command}. "callback" or "from" is null`);break;case"getHostInfo":if(e.callback&&e.from){let o;try{o=await import_js_controller_common.tools.getHostInfo(objects)}catch(e){return logger.error(`${hostLogPrefix} cannot get getHostInfo: ${e.message}`),null}let t=0;for(const e of Object.values(procs))e.process&&t++;let s=import_node_path.default.normalize(`${controllerDir}/../`);"node_modules"===import_node_path.default.basename(s)&&(s=import_node_path.default.normalize(`${controllerDir}/../../`));const r={...o,"Active instances":t,location:s,Uptime:Math.round((Date.now()-uptimeStart)/1e3)};sendTo(e.from,e.command,r,e.callback)}else logger.error(`${hostLogPrefix} Invalid request ${e.command}. "callback" or "from" is null`);break;case"getHostInfoShort":if(e.callback&&e.from){let o=import_node_path.default.normalize(`${controllerDir}/../`);"node_modules"===import_node_path.default.basename(o)&&(o=import_node_path.default.normalize(`${controllerDir}/../../`));const t=import_node_os.default.cpus(),s=new Date,r={Platform:import_node_os.default.platform(),os:process.platform,Architecture:import_node_os.default.arch(),CPUs:t.length,Speed:import_js_controller_common.tools.isObject(t[0])?t[0].speed:void 0,Model:import_js_controller_common.tools.isObject(t[0])?t[0].model:void 0,RAM:import_node_os.default.totalmem(),"System uptime":Math.round(import_node_os.default.uptime()),"Node.js":process.version,location:o,time:s.getTime(),timeOffset:s.getTimezoneOffset()};"win32"===r.Platform?r.Platform="Windows":"darwin"===r.Platform&&(r.Platform="OSX"),sendTo(e.from,e.command,r,e.callback)}else logger.error(`${hostLogPrefix} Invalid request ${e.command}. "callback" or "from" is null`);break;case"delLogs":{const o=logger.getFileName();import_fs_extra.default.existsSync(`${controllerDir}/log/${import_js_controller_common.tools.appName}.log`)&&import_fs_extra.default.writeFileSync(`${controllerDir}/log/${import_js_controller_common.tools.appName}.log`,""),import_fs_extra.default.existsSync(`${controllerDir}/../../log/${import_js_controller_common.tools.appName}.log`)&&import_fs_extra.default.writeFileSync(`${controllerDir}/../../log/${import_js_controller_common.tools.appName}.log`,""),import_fs_extra.default.existsSync(o)&&import_fs_extra.default.writeFileSync(o,""),e.callback&&e.from&&sendTo(e.from,e.command,null,e.callback);break}case"readDirAsZip":e.callback&&e.from?import_js_controller_common.zipFiles.readDirAsZip(objects,e.message.id,e.message.name,e.message.options,((o,t)=>{sendTo(e.from,e.command,t?{error:o,data:t}:{error:o},e.callback)})):logger.error(`${hostLogPrefix} Invalid request ${e.command}. "callback" or "from" is null`);break;case"writeDirAsZip":try{await import_js_controller_common.zipFiles.writeDirAsZip(objects,e.message.id,e.message.name,Buffer.from(e.message.data,"base64"),e.message.options),e.callback&&e.from&&sendTo(e.from,e.command,{},e.callback)}catch(o){logger.error(`${hostLogPrefix} Cannot write zip file as folder: ${o.message}`),e.callback&&e.from&&sendTo(e.from,e.command,{error:o.message},e.callback)}break;case"readObjectsAsZip":if(e.callback&&e.from){let o;try{o=await import_js_controller_common.zipFiles.readObjectsAsZip(objects,e.message.id,e.message.adapter,e.message.options)}catch(o){return void sendTo(e.from,e.command,{error:o.message},e.callback)}if(e.message.link){const t=Buffer.from(o,"base64");if(e.message.fileStorageNamespace){try{await objects.writeFileAsync(e.message.fileStorageNamespace,`zip/${e.message.link}`,t)}catch(o){return void sendTo(e.from,e.command,{error:o.message},e.callback)}sendTo(e.from,e.command,`${e.message.fileStorageNamespace}/zip/${e.message.link}`,e.callback)}else sendTo(e.from,e.command,{error:`Missing attribute "fileStorageNamespace" use e.g. "admin.0" to save ZIP in file as "zip/${e.message.link}"`},e.callback)}else sendTo(e.from,e.command,{data:o},e.callback)}else logger.error(`${hostLogPrefix} Invalid request ${e.command}. "callback" or "from" is null`);break;case"writeObjectsAsZip":import_js_controller_common.zipFiles.writeObjectsAsZip(objects,e.message.id,e.message.adapter,Buffer.from(e.message.data||"","base64"),e.message.options,(o=>e.callback&&e.from&&sendTo(e.from,e.command,{error:o?.message},e.callback)));break;case"checkLogging":!function(){let e=[];e.push(`Actual Loglist - ${JSON.stringify(logList)}`),states.getKeys(`${import_constants.SYSTEM_ADAPTER_PREFIX}*.logging`,((o,t)=>{t?.length&&states.getStates(t,((o,s)=>{if(s)for(let o=0;o<t.length;o++){const r=s[o];if(r){const s=t[o].substring(0,t[o].length-8).replace(/^io\./,"");!0===r.val?e.push(`Subscriber - ${s} ENABLED`):e.push(`Subscriber - ${s} (disabled)`)}}setTimeout((()=>{for(const o of e)logger.error(`${hostLogPrefix} LOGINFO: ${o}`);e=[]}),3e3)}))}));for(const e of Object.keys(procs))procs[e].process&&(outputCount++,states.setState(`${e}.checkLogging`,{val:!0,ack:!1,from:hostObjectPrefix}))}();break;case"updateMultihost":{const o=startMultihost();e.callback&&sendTo(e.from,e.command,{result:o},e.callback);break}case"upgradeController":{if(!import_js_controller_common.tools.isControllerUiUpgradeSupported()){e.callback&&sendTo(e.from,e.command,{result:!1},e.callback);break}const{version:o,adminInstance:t}=e.message;logger.info(`${hostLogPrefix} Controller will upgrade itself to version ${o}`),await startUpgradeManager({version:o,adminInstance:t,uid:process.getuid?process.getuid():0,gid:process.getgid?process.getgid():0}),e.callback&&sendTo(e.from,e.command,{result:!0},e.callback);break}case"upgradeAdapterWithWebserver":{const{version:o,adapterName:t,useHttps:s,port:r,certPrivateName:n,certPublicName:a}=e.message,i=new import_adapterUpgradeManager.AdapterUpgradeManager({logger:logger,adapterName:t,version:o,useHttps:s,objects:objects,states:states,port:r,certPrivateName:n,certPublicName:a});e.callback&&sendTo(e.from,e.command,{result:!0},e.callback),await i.stopAdapter(),await i.startWebServer(),await i.performUpgrade();break}case"getInterfaces":e.callback&&e.from?sendTo(e.from,e.command,{result:import_node_os.default.networkInterfaces()},e.callback):logger.error(`${hostLogPrefix} Invalid request ${e.command}. "callback" or "from" is null`);break;case"upload":e.message?uploadAdapter({adapter:e.message,msg:e}):logger.error(`${hostLogPrefix} No adapter name is specified for upload command from  ${e.from}`);break;case"rebuildAdapter":if(e.message.id)if(installQueue.some((o=>o.id===e.message.id)))logger.info(`${hostLogPrefix} ${e.message.id} still in installQueue, rebuild will be done with install`),e.callback&&e.from&&sendTo(e.from,e.command,{result:"pending"},e.callback);else{logger.info(`${hostLogPrefix} ${e.message.id} will be rebuilt${e.message.rebuildArgs?` (Args: ${JSON.stringify(e.message.rebuildArgs)})`:""}`);const o={id:e.message.id,rebuild:!0};e.message.rebuildArgs&&(o.rebuildArgs=e.message.rebuildArgs),installQueue.push(o),1===installQueue.length&&installAdapters(),e.callback&&e.from&&sendTo(e.from,e.command,{result:"ok"},e.callback)}else e.callback&&e.from&&sendTo(e.from,e.command,{error:"Adapter to rebuild not provided."},e.callback);break;case"readBaseSettings":if(e.callback&&e.from){const o=import_js_controller_common.tools.getConfigFileName();if(import_fs_extra.default.existsSync(o))try{const t=import_fs_extra.default.readJsonSync(o),s=import_fs_extra.default.lstatSync(o);sendTo(e.from,e.command,{config:t,isActive:uptimeStart>s.mtimeMs},e.callback)}catch{const t=`Cannot parse file ${o}`;logger.error(`${hostLogPrefix} ${t}`),sendTo(e.from,e.command,{error:t},e.callback)}else{const t=`Cannot find file ${o}`;logger.error(`${hostLogPrefix} ${t}`),sendTo(e.from,e.command,{error:t},e.callback)}}else logger.error(`${hostLogPrefix} No adapter name is specified for readBaseSettings command from  ${e.from}`);break;case"writeBaseSettings":{if(!e.message){const o=`No data found on writeBaseSettings from "${e.from}"`;return logger.error(`${hostLogPrefix} ${o}`),sendResponseTo({receivedMsg:e,payload:{error:o}})}const o=import_js_controller_common.tools.getConfigFileName();if(!import_fs_extra.default.existsSync(o)){const o=`No config file exists on writeBaseSettings from "${e.from}"`;return logger.error(`${hostLogPrefix} ${o}`),sendResponseTo({receivedMsg:e,payload:{error:o}})}let t;if("string"==typeof e.message)try{t=JSON.parse(e.message)}catch{return sendResponseTo({receivedMsg:e,payload:{error:`Cannot parse data: "${e.message}"`}})}else t=e.message;if(!t)return sendResponseTo({receivedMsg:e,payload:{error:"Empty config"}});if(!t.system)return sendResponseTo({receivedMsg:e,payload:{error:'Cannot find "system" in data'}});if(!t.objects)return sendResponseTo({receivedMsg:e,payload:{error:'Cannot find "objects" in data'}});if(!t.states)return sendResponseTo({receivedMsg:e,payload:{error:'Cannot find "states" in data'}});if(!t.log)return sendResponseTo({receivedMsg:e,payload:{error:'Cannot find "log" in data'}});try{import_fs_extra.default.writeFileSync(o,JSON.stringify(t,null,2))}catch{return sendResponseTo({receivedMsg:e,payload:{error:`Cannot write file ${o}`}})}return sendResponseTo({receivedMsg:e,payload:{result:"ok"}})}case"addNotification":await notificationHandler.addMessage({scope:e.message.scope,category:e.message.category,message:e.message.message,instance:e.message.instance,contextData:e.message.contextData}),e.callback&&e.from&&sendTo(e.from,e.command,{result:"ok"},e.callback);break;case"clearNotifications":await notificationHandler.clearNotifications(e.message.scope,e.message.category,e.message.instance),e.callback&&e.from&&sendTo(e.from,e.command,{result:"ok"},e.callback);break;case"getNotifications":if(e.callback&&e.from){const o=notificationHandler.getFilteredInformation(e.message.scope,e.message.category,e.message.instance);sendTo(e.from,e.command,{result:o},e.callback)}break;case"updateLicenses":try{const o=await import_js_controller_common.tools.updateLicenses(objects,e.message&&e.message.login,e.message&&e.message.password);logger.info(`${hostLogPrefix} Received ${o.length} licenses: "${o.map((e=>e.product)).join(", ")}"`),e.callback&&e.from&&sendTo(e.from,e.command,{result:o},e.callback)}catch(o){logger.error(`${hostLogPrefix} Cannot read licenses: ${o.message}`),e.callback&&e.from&&sendTo(e.from,e.command,{result:[],error:o.message},e.callback)}break;case"upgradeOsPackages":{const{packages:o,restart:t}=e.message;try{await upgradeOsPackages(o),sendTo(e.from,e.command,{success:!0},e.callback)}catch(o){return void sendTo(e.from,e.command,{error:o.message,success:!1},e.callback)}try{await listUpdatableOsPackages()}catch(e){logger.warn(`${hostLogPrefix} Could not check for new OS updates after upgrade: ${e.message}`)}t&&(logger.info(`${hostLogPrefix} Restart js-controller because desired after package upgrade`),await(0,import_promises.setTimeout)(200),(0,import_restart.default)((()=>!isStopping&&stop(!1))));break}case"restartController":e.callback&&sendTo(e.from,e.command,"",e.callback),await(0,import_promises.setTimeout)(200),(0,import_restart.default)((()=>!isStopping&&stop(!1)));break;case"sendToSentry":{const o=e.message.message,t=e.message.level,s=e.message.extraInfo,r=pluginHandler.getPluginInstance("sentry")?.getSentryObject();if(!r)return void logger.debug(`${hostLogPrefix} Do not send message "${o}" to Sentry, because it is disabled`);r.withScope((e=>{e.setLevel(t);for(const[o,t]of Object.entries(s))e.setExtra(o,t);r.captureMessage(o,"info")}));break}}}async function sendResponseTo(e){const{receivedMsg:o,payload:t}=e;o.callback&&o.from&&await sendTo(o.from,o.command,t,o.callback)}async function getInstances(){if(!objects)throw new Error("Objects database not connected");const e=await(0,import_js_controller_common.getInstancesOrderedByStartPrio)(objects,logger,hostLogPrefix);if(0===e.length)logger.info(`${hostLogPrefix} no instances found`);else{const o=import_js_controller_common.tools.findIPs();compactGroupController||logger.info(`${hostLogPrefix} ${e.length} instance${1===e.length?"":"s"} found`);let t=0;for(const e of Object.values(procs))e.config?.common?.enabled&&(e.config.common.enabled=!1);for(const s of e)if(s.common.preserveSettings&&objects.addPreserveSettings(s.common.preserveSettings),"web"!==s.common.mode&&"none"!==s.common.mode)logger.debug(`${hostLogPrefix} check instance "${s._id}" for host "${s.common.host}"`),console.log(`${hostLogPrefix} check instance "${s._id}" for host "${s.common.host}"`),!checkAndAddInstance(s,o)||!s.common.enabled||"extension"===s.common.mode&&s.native.webInstance||t++;else if(s.common.host===hostname){const e=s._id.split(".")[2],o=import_js_controller_common.tools.getAdapterDir(e);import_fs_extra.default.existsSync(o)||(procs[s._id]={downloadRetry:0,config:{common:{enabled:!1}}},installQueue.push({id:s._id,disabled:!0,version:s.common.installedVersion||s.common.version,installedFrom:s.common.installedFrom}),1===installQueue.length&&installAdapters())}t>0?logger.info(`${hostLogPrefix} starting ${t} instance${t>1?"s":""}`):logger.warn(`${hostLogPrefix} does not start any instances on this host`)}initInstances()}function instanceRelevantForThisController(e,o){if(config.system.compact&&e.common.compact&&(void 0===e.common.runAsCompactMode&&(e.common.runAsCompactMode=!1),void 0===e.common.compactGroup&&(e.common.compactGroup=1)),compactGroupController){if(!config.system.compact||!e.common.compact||!e.common.runAsCompactMode)return!1;if(e.common.runAsCompactMode&&e.common.compactGroup!==compactGroup)return!1}return!0}function checkAndAddInstance(e,o){return!(!o.includes(e.common.host)&&e.common.host&&e.common.host!==hostname)&&(!e.deleted&&(e.common.host||(e.common.host=hostname,objects.setObject(e._id,e,(o=>o?logger.error(`${hostLogPrefix} Cannot update hostname for ${e._id}: ${o.message}`):logger.info(`${hostLogPrefix} Set hostname ${hostname} for ${e._id}`)))),!!instanceRelevantForThisController(e,o)&&(config.system.compact&&e.common.compact&&e.common.runAsCompactMode&&(compactProcs[e.common.compactGroup]=compactProcs[e.common.compactGroup]||{instances:[]}),compactGroupController&&logger.debug(`${hostLogPrefix} instance ${e._id} is managed by this controller`),procs[e._id]=procs[e._id]||{},procs[e._id].config||(procs[e._id].config=(0,import_deep_clone.default)(e)),!0)))}function initInstances(){let e=0;const o=config.system&&config.system.instanceStartInterval||2e3;for(const[t,s]of Object.entries(procs))if(!s.config.common.enabled||"extension"===s.config.common.mode&&s.config.native.webInstance)procs[t].process&&stopInstance(t,!1);else if(t.startsWith(`${import_constants.SYSTEM_ADAPTER_PREFIX}admin`)){if(s.process){logger.info(`${hostLogPrefix} instance "${t}" was not started, because running.`);continue}installQueue.find((e=>e.id===t))||(s.restartTimer&&clearTimeout(s.restartTimer),s.restartTimer=setTimeout((e=>startInstance(e)),o*e,t),e+=2)}for(const[t,s]of Object.entries(procs))if(!s.config.common.enabled||"extension"===s.config.common.mode&&s.config.native.webInstance){const e=t.split(".")[2],o=import_js_controller_common.tools.getAdapterDir(e);import_fs_extra.default.existsSync(o)||(s.downloadRetry=s.downloadRetry||0,installQueue.push({id:t,disabled:!0,version:s.config.common.installedVersion||s.config.common.version,installedFrom:s.config.common.installedFrom}),1===installQueue.length&&installAdapters())}else if(!t.startsWith(`${import_constants.SYSTEM_ADAPTER_PREFIX}admin`)){if(s.process){logger.info(`${hostLogPrefix} instance "${t}" was not started, because already running.`);continue}installQueue.find((e=>e.id===t))||(s.restartTimer&&clearTimeout(s.restartTimer),s.restartTimer=setTimeout((e=>startInstance(e)),o*e,t),s.config.common.onlyWWW||(e+=2))}}function checkVersion(e,o,t){let s=!1;if("js-controller"===e)if(o){if(!import_semver.default.satisfies(ioPackage.common.version,o,{includePrerelease:!0}))throw new Error(`Invalid version of "${e}". Installed "${ioPackage.common.version}", required "${o}"`);s=!0}else s=!0;if(!s){const r=Object.keys(t).filter((o=>t[o]&&t[o].common&&t[o].common.name===e));for(const n of r){if(o&&!import_semver.default.satisfies(t[n].common.version,o,{includePrerelease:!0}))throw new Error(`required adapter "${e}" has wrong version. Installed "${t[n].common.version}", required "${o}"!`);s=!0}}if(!s)throw new Error(`required adapter "${e}" not found!`)}async function checkVersions(e,o,t){const s=await objects.getObjectViewAsync("system","instance",{startkey:import_constants.SYSTEM_ADAPTER_PREFIX,endkey:`${import_constants.SYSTEM_ADAPTER_PREFIX}香`}),r={},n={};s.rows.forEach((e=>{e.value._id&&(n[e.value._id]=e.value)})),Object.keys(n).forEach((e=>{n[e]?.common&&n[e].common.host===hostname&&(r[e]=n[e])})),o=import_js_controller_common.tools.parseDependencies(o),t=import_js_controller_common.tools.parseDependencies(t);try{for(const e of Object.keys(o))checkVersion(e,o[e],r)}catch(t){throw logger.debug(`${hostLogPrefix} ${e} [sameHostDependency]: ${JSON.stringify(o)}`),new Error(`Adapter dependency not fulfilled on "${hostname}": ${t.message}`)}try{for(const e of Object.keys(t))checkVersion(e,t[e],n)}catch(o){throw logger.debug(`${hostLogPrefix} ${e} [globalDependency]: ${JSON.stringify(t)}`),new Error(`Adapter dependency not fulfilled on any host: ${o.message}`)}}function storePids(){storeTimer||(storeTimer=setTimeout((()=>{storeTimer=null;const e=[];for(const o of Object.keys(procs)){const t=procs[o];t.process?.pid&&!t.startedAsCompactGroup&&e.push(t.process.pid)}for(const o of Object.keys(compactProcs)){const t=compactProcs[o];t.process?.pid&&e.push(t.process.pid)}e.push(process.pid);try{import_fs_extra.default.writeFileSync(import_js_controller_common.tools.getPidsFileName(),JSON.stringify(e))}catch(e){logger.error(`${hostLogPrefix} could not store process id list in ${import_js_controller_common.tools.getPidsFileName()}! Please check permissions and user ownership of this file. Was ioBroker started as a different user? Please also check left over processes when stopping ioBroker!\n${e}`),logger.error(`${hostLogPrefix} Please consider running the installation fixer when on Linux.`)}}),1e3))}function installAdapters(){if(!installQueue.length)return;const e=installQueue[0];if(e.inProgress)return;let o=e.id.split(".")[2];e.version&&!e.rebuild&&(o+=`@${e.version}`);const t=e.rebuild?"rebuild":"install";if(compactGroupController&&!e.rebuild)return logger.info(`${hostLogPrefix} adapter ${o} is not installed, installation will be handled by main controller ... waiting `),void setImmediate((()=>{installQueue.shift(),installAdapters()}));const s=procs[e.id];if(s.downloadRetry=s.downloadRetry??0,s?.downloadRetry<4){s.downloadRetry++,e.rebuild?logger.warn(`${hostLogPrefix} adapter "${o}" seems to be installed for a different version of Node.js. Trying to rebuild it... ${procs[e.id].rebuildCounter} attempt`):logger.warn(`${hostLogPrefix} startInstance cannot find adapter "${o}". Try to install it... ${s.downloadRetry} attempt`);const r=import_node_path.default.join(import_js_controller_common.tools.getControllerDir(),`${import_js_controller_common.tools.appName.toLowerCase()}.js`),n=[],a={windowsHide:!0};if(!e.rebuild&&e.installedFrom&&s.downloadRetry<3)if(import_js_controller_common.tools.isShortGithubUrl(e.installedFrom)||e.installedFrom.includes("://"))n.push("url"),n.push(e.installedFrom),n.push(e.id.split(".")[2]);else{n.push("install");let o=e.installedFrom;o.startsWith(`${import_js_controller_common.tools.appName}.`)&&(o=o.substring(import_js_controller_common.tools.appName.length+1)),n.push(o)}else n.push(t),e.rebuild?e.rebuildArgs&&(n.push(`${e.rebuildArgs.module}@${e.rebuildArgs.version}`),e.rebuildArgs.path&&(n.push("--path"),n.push(e.rebuildArgs.path))):n.push(o);logger.info(`${hostLogPrefix} ${import_js_controller_common.tools.appName.toLowerCase()} ${n.join(" ")}${e.rebuild?"":" using "+(s.downloadRetry<3&&e.installedFrom?"installedFrom":"installedVersion")}`),n.unshift(...(0,import_tools.getDefaultNodeArgs)(r),r);try{e.inProgress=!0;const s=(0,import_node_child_process.spawn)(process.execPath,n,a);s.stdout&&s.stdout.on("data",(e=>{e=e.toString().replace(/\n/g,""),logger.info(`${hostLogPrefix} ${import_js_controller_common.tools.appName} npm-${t}: ${e}`)})),s.stderr&&s.stderr.on("data",(e=>{e=e.toString().replace(/\n/g,""),logger.error(`${hostLogPrefix} ${import_js_controller_common.tools.appName} npm-${t}: ${e}`)})),s.on("exit",(o=>{if(logger.info(`${hostLogPrefix} ${import_js_controller_common.tools.appName} npm-${t}: exit ${o}`),o===import_js_controller_common.EXIT_CODES.CANNOT_INSTALL_NPM_PACKET)e.inProgress=!1,installQueue.shift(),installQueue.push(e);else{const o=e=>{procs[e.id]&&(procs[e.id].needsRebuild=!1,e.disabled?logger.debug(`${hostLogPrefix} ${import_js_controller_common.tools.appName} ${t} successful but the instance is disabled`):procs[e.id].config.common.enabled?e.rebuild?objects.extendObject(e.id,{}):startInstance(e.id,e.wakeUp):(logger.info(`${hostLogPrefix} startInstance ${e.id}: instance is disabled but should be started, re-enabling it`),states.setState(`${e.id}.alive`,{val:!0,ack:!1,from:hostObjectPrefix})))};if(e.rebuild){const e=installQueue.filter((e=>e.rebuild));installQueue=installQueue.filter((e=>!e.rebuild)),e.forEach((e=>o(e)))}else installQueue.shift(),o(e)}setTimeout((()=>installAdapters()),1e3)})),s.on("error",(e=>{logger.error(`${hostLogPrefix} Cannot execute "${import_js_controller_common.tools.getControllerDir()}/${import_js_controller_common.tools.appName.toLowerCase()}.js ${t} ${o}: ${e.message}`),setTimeout((()=>{installQueue.shift(),installAdapters()}),1e3)}))}catch(e){logger.error(`${hostLogPrefix} Cannot execute "${import_js_controller_common.tools.getControllerDir()}/${import_js_controller_common.tools.appName.toLowerCase()}.js ${t} ${o}: ${e}`),setTimeout((()=>{installQueue.shift(),installAdapters()}),1e3)}}else e.rebuild?logger.error(`${hostLogPrefix} Cannot rebuild adapter "${o}". To retry it disable/enable the adapter or restart host. Also check the error messages in the log or execute "npm install --production" in adapter directory manually!`):logger.error(`${hostLogPrefix} Cannot download and install adapter "${o}". To retry it disable/enable the adapter or restart host. Also check the error messages in the log!`),setTimeout((()=>{installQueue.shift(),installAdapters()}),500)}function cleanErrors(e,o,t){if(e&&e.errors&&e.errors.length&&!e.startedAsCompactGroup&&(o=o||Date.now(),!(!t&&e.lastCleanErrors&&o-e.lastCleanErrors<1e3)))if(e.lastCleanErrors=o,t){for(let t=0;t<e.errors.length;t++)if(e.errors[t]&&o-e.errors[t].ts<3e4&&e.errors[t].text){const o=e.errors[t].text.replace("[31merror[39m:","").replace("[34mdebug[39m:","debug:").split("\n");for(let e=0;e<o.length;e++)o[e]&&logger.error(`${hostLogPrefix} Caught by controller[${t}]: ${o[e]}`)}e.errors=[]}else for(let t=e.errors.length-1;t>=0;t--)if(o-e.errors[t].ts>3e4){e.errors.splice(0,t);break}}async function startScheduledInstance(e){const o=Object.keys(scheduledInstances);if(!o.length)return void(e&&e());let t=!1;const s=o[0],{adapterDir:r,fileNameFull:n,wakeUp:a}=scheduledInstances[o[0]],i=()=>{let o=config.system&&config.system.instanceStartInterval||2e3;o=t?0:o+2e3,setTimeout((()=>{delete scheduledInstances[s],startScheduledInstance(e)}),o)},c=procs[s];if(!c)return logger.error(`${hostLogPrefix} scheduleJob: Task deleted (${s})`),t=!0,void i();const l=c.config;if(!c.lastStart||Date.now()-c.lastStart>=2e3){if(c.lastStart=Date.now(),!c.process){await states.setState(`${l._id}.sigKill`,{val:0,ack:!1,from:hostObjectPrefix});const e=["--instance",l._id.split(".").pop()||"0","--loglevel",l.common.loglevel||"info"];try{c.process=import_node_child_process.default.fork(n,e,{execArgv:import_js_controller_common.tools.getDefaultNodeArgs(n),windowsHide:!0,cwd:r})}catch(e){logger.error(`${hostLogPrefix} instance ${s} could not be started: ${e.message}`),delete c.process}if(c.process){storePids();const{pid:e}=c.process,o=(0,import_js_controller_common.isInstalledFromNpm)({installedFrom:l.common.installedFrom,adapterName:l.common.name});logger.info(`${hostLogPrefix} instance ${l._id} in version "${l.common.version}"${o?"":` (non-npm: ${l.common.installedFrom})`} started with pid ${c.process.pid}`),c.process.on("exit",((o,t)=>{if(outputCount++,states.setState(`${s}.alive`,{val:!1,ack:!0,from:hostObjectPrefix}),t)logger.warn(`${hostLogPrefix} instance ${s} terminated due to ${t}`);else if(null===o)logger.error(`${hostLogPrefix} instance ${s} terminated abnormally`);else{const t=`${hostLogPrefix} instance ${s} having pid ${e} terminated with code ${o} (${getErrorText(o)||""})`;o&&o!==import_js_controller_common.EXIT_CODES.ADAPTER_REQUESTED_TERMINATION&&o!==import_js_controller_common.EXIT_CODES.NO_ERROR?logger.error(t):logger.info(t)}c.process&&delete c.process,storePids()}))}return void i()}!a&&logger.warn(`${hostLogPrefix} instance ${l._id} already running with pid ${c.process.pid}`),t=!0}else logger.warn(`${hostLogPrefix} instance ${l._id} not started, because start has already been initialized less than 2 seconds ago`),t=!0;i()}async function startInstance(e,o=!1){if(isStopping||!connected||!objects)return;const t=procs[e];if(!t)return void logger.error(`${hostLogPrefix} startInstance ${e}: object not found!`);const s=t.config,r=e.split(".")[2];let n=s.common.mode;if(t.restartTimer&&(clearTimeout(t.restartTimer),delete t.restartTimer),t.restartExpected=!1,o&&(n="daemon"),s.common.dependencies||s.common.globalDependencies)try{await checkVersions(e,s.common.dependencies,s.common.globalDependencies)}catch(o){return void logger.error(`${hostLogPrefix} startInstance ${e} ${o.message}`)}const a=import_js_controller_common.tools.getAdapterDir(r);if(null===a||!import_fs_extra.default.existsSync(a))return t.downloadRetry=t.downloadRetry||0,logger.debug(`${hostLogPrefix} startInstance Queue ${e} for installation`),installQueue.push({id:e,version:s.common.installedVersion||s.common.version,installedFrom:s.common.installedFrom,wakeUp:o}),void(1===installQueue.length&&installAdapters());const i=s.common.loglevel||"info",c=s._id.split(".").pop()||"0",l=s?._id&&s.common?["--instance",c,"--loglevel",i]:["--instance","0","--loglevel","info"],m=[];s.common.memoryLimitMB&&Math.round(s.common.memoryLimitMB)&&m.push(`--max-old-space-size=${Math.round(s.common.memoryLimitMB)}`),Array.isArray(s.common.nodeProcessParams)&&s.common.nodeProcessParams.length&&(m.push(...s.common.nodeProcessParams),s.common.compact&&(s.common.compact=!1,logger.warn(`${hostLogPrefix} Adapter ${s.common.name} has "compact=true" as well as "nodeProcessParams" specified, this is not supported, please report to developer`)));try{if(import_fs_extra.default.readJSONSync(import_node_path.default.join(a,"io-package.json")).common.version!==s.common.version)return logger.warn(`${hostLogPrefix} Detected missing upload of adapter "${r}" - starting upload now.`),void await uploadAdapter({adapter:r})}catch(e){logger.error(`${hostLogPrefix} startInstance ${r}.${c}: Error while ensuring adapter is uploaded: ${e.message}`)}if(await blocklistManager.isAdapterVersionBlocked({version:s.common.version,adapterName:s.common.name})){const o=`Do not start instance "${e}", because the version "${s.common.version}" has been blocked by the developer`;return logger.error(`${hostLogPrefix} ${o}`),void await notificationHandler.addMessage({scope:"system",category:"blockedVersions",message:o,instance:import_constants.SYSTEM_HOST_PREFIX+hostname})}if(s.common.dependencies||s.common.globalDependencies)try{await checkVersions(e,s.common.dependencies,s.common.globalDependencies)}catch(o){return void logger.error(`${hostLogPrefix} startInstance ${e} ${o.message}`)}if(s.common.onlyWWW&&"vis"===r&&(s.common.onlyWWW=!1),s.common.onlyWWW)return void logger.debug(`${hostLogPrefix} startInstance ${r}.${c} only WWW files. Nothing to start`);let d,g;if("extension"!==s.common.mode)try{d=await import_js_controller_common.tools.resolveAdapterMainFile(r)}catch{return void logger.error(`${hostLogPrefix} startInstance ${r}.${c}: cannot find start file!`)}t.downloadRetry=0;try{const e=import_fs_extra.default.readJSONSync(import_node_path.default.join(a,"package.json"));t.engine=e?.engines?.node}catch{logger.error(`${hostLogPrefix} startInstance ${r}.${c}: Cannot read and parse "${a}/package.json"`)}if(!t.engine||import_semver.default.satisfies(process.version.replace(/^v/,""),t.engine)){if(import_fs_extra.default.existsSync("/proc/meminfo"))try{const e=import_fs_extra.default.readFileSync("/proc/meminfo","utf8"),o=e&&e.match(/MemAvailable:\s*(\d+)/);o&&o[1]&&(g=Math.round(.001024*parseInt(o[1],10)))}catch(e){logger.warn(`${hostLogPrefix} Cannot read /proc/meminfo: ${e}`)}else g=Math.round(import_node_os.default.freemem()/1048576);if(void 0!==g&&g<("number"==typeof config.system.memLimitWarn?config.system.memLimitWarn:100)){g<("number"==typeof config.system.memLimitError?config.system.memLimitError:50)?(logger.error(`${hostLogPrefix} Your system has only ${g} MB RAM left available and an additional adapter process is started. Please check your system, settings and active instances to prevent swapping and Out-Of-Memory situations!`),logger.error(`${hostLogPrefix} In future versions, the adapter might not be started!`)):logger.warn(`${hostLogPrefix} Your system has only ${g} MB RAM left available and an additional adapter process is started. Please check your system, settings and active instances to prevent swapping and Out-Of-Memory situations!`);try{await notificationHandler.addMessage({scope:"system",category:"memIssues",message:`Your system has only ${g} MB RAM left available and an additional adapter process is started. Please check your system, settings and active instances to prevent swapping and Out-Of-Memory situations!`,instance:`system.host.${hostname}`})}catch(e){logger.warn(`${hostLogPrefix} Could not add OOM notification: ${e.message}`)}}if(t.startedInCompactMode=!1,t.startedAsCompactGroup=!1,t.config?.notifications)try{await notificationHandler.addConfig(t.config.notifications),logger.debug(`${hostLogPrefix} added notifications configuration of ${e}`)}catch(o){logger.error(`${hostLogPrefix} Could not add notifications config of ${e}: ${o.message}`)}switch(n){case"once":case"daemon":if(t&&!t.process){allInstancesStopped=!1,t.stopping&&delete t.stopping,logger.debug(`${hostLogPrefix} startInstance ${r}.${c} loglevel=${i}, compact=${s.common.compact&&s.common.runAsCompactMode?`true (${s.common.compactGroup})`:"false"}`);const g=(t,r)=>{setInstanceOfflineStates(e);const a=stopTimeouts[e];a?.timeout&&(clearTimeout(a.timeout),a.timeout=null,a.callback&&"function"==typeof a.callback&&(a.callback(),a.callback=null)),cleanAutoSubscribes(e,(async()=>{const a=procs[e];if(a?.config?.common.logTransporter&&(outputCount++,console.log(`================================== > LOG REDIRECT ${e} => false [Process stopped]`),states.setState(`${e}.logging`,{val:!1,ack:!0,from:hostObjectPrefix})),cleanErrors(a,null,t!==import_js_controller_common.EXIT_CODES.START_IMMEDIATELY_AFTER_STOP&&t!==import_js_controller_common.EXIT_CODES.ADAPTER_REQUESTED_TERMINATION),"once"!==n){if(r?logger.warn(`${hostLogPrefix} instance ${e} terminated due to ${r}`):null===t&&logger.error(`${hostLogPrefix} instance ${e} terminated abnormally`),a?.stopping||isStopping||o){if(logger.info(`${hostLogPrefix} instance ${e} terminated with code ${t} (${getErrorText(t)||""})`),a&&(void 0!==a.stopping&&delete a.stopping,a.process&&delete a.process),isStopping){logger.silly(`${hostLogPrefix} Check Stopping ${e}`);for(const e of Object.values(procs))if(e.process)return void logger.silly(`${hostLogPrefix} ${e.config.common.name} still running`);for(const[e,o]of Object.entries(compactProcs))if(o.process)return void logger.silly(`${hostLogPrefix} Compact group ${e} still running`);logger.info(`${hostLogPrefix} All instances are stopped.`),allInstancesStopped=!0}return void storePids()}if(t===import_js_controller_common.EXIT_CODES.ADAPTER_REQUESTED_TERMINATION&&a?.restartExpected)logger.info(`${hostLogPrefix} instance ${e} terminated for restart.`);else if(t===import_js_controller_common.EXIT_CODES.ADAPTER_REQUESTED_TERMINATION)logger.info(`${hostLogPrefix} instance ${e} terminated by request of the instance itself and will not be restarted, before user restarts it.`);else if(t===import_js_controller_common.EXIT_CODES.START_IMMEDIATELY_AFTER_STOP&&a?.config?.common.restartSchedule)logger.info(`${hostLogPrefix} instance ${e} scheduled normal terminated and will be restarted on schedule.`);else if(t===import_js_controller_common.EXIT_CODES.ADAPTER_REQUESTED_REBUILD&&a)logger.info(`${hostLogPrefix} instance ${e} requested a rebuild of its dependencies and will be restarted after that is done.`),a.needsRebuild=!0;else{const o=`${hostLogPrefix} instance ${e} terminated with code ${t} (${getErrorText(t)||""})`;t&&t!==import_js_controller_common.EXIT_CODES.ADAPTER_REQUESTED_TERMINATION&&t!==import_js_controller_common.EXIT_CODES.NO_ERROR&&t!==import_js_controller_common.EXIT_CODES.START_IMMEDIATELY_AFTER_STOP?logger.error(o):logger.info(o)}}if(a?.process&&delete a.process,a?.needsRebuild)if(a.rebuildCounter=a.rebuildCounter??0,a.rebuildCounter++,a.rebuildCounter<4){logger.info(`${hostLogPrefix} Adapter ${e} needs rebuild ${a.rebuildArgs?`of ${a.rebuildArgs.module} `:""}and will be restarted afterwards.`);const o={command:"rebuildAdapter",message:{id:s._id}};a.rebuildArgs&&(o.message.rebuildArgs=a.rebuildArgs,delete a.rebuildArgs),compactGroupController?sendTo(`system.host.${hostname}`,"rebuildAdapter",o):processMessage(o)}else logger.info(`${hostLogPrefix} Rebuild for adapter ${e} not successful in 3 tries. Adapter will not be restarted again. Please execute "npm install --production" in adapter directory manually.`);else if(a&&(a.rebuildCounter=0),t===import_js_controller_common.EXIT_CODES.ADAPTER_REQUESTED_TERMINATION||o||!connected||isStopping||!a?.config?.common.enabled||a.config.native.webInstance||"once"===n)t===import_js_controller_common.EXIT_CODES.ADAPTER_REQUESTED_TERMINATION&&a&&a.restartExpected?logger.info(`${hostLogPrefix} Adapter ${e} will be restarted automatically`):t===import_js_controller_common.EXIT_CODES.ADAPTER_REQUESTED_TERMINATION?logger.info(`${hostLogPrefix} Do not restart adapter ${e} because desired by instance`):"once"!==n?logger.info(`${hostLogPrefix} Do not restart adapter ${e} because disabled or deleted`):logger.info(`${hostLogPrefix} instance ${e} terminated while should be started once`);else{t===import_js_controller_common.EXIT_CODES.UNCAUGHT_EXCEPTION?(a.crashCount=a.crashCount??0,a.crashCount++,logger.debug(`${hostLogPrefix} Crash count of ${e}: ${a.crashCount}`),a.crashResetTimer&&(logger.debug(`${hostLogPrefix} Reset crash timer of ${e}, to be initialized anew`),clearTimeout(a.crashResetTimer)),logger.debug(`${hostLogPrefix} Initialize crash timer of ${e}`),a.crashResetTimer=setTimeout((()=>{logger.debug(`${hostLogPrefix} Cleared crash counter of ${e}, because 10 minutes no crash`),a&&(a.crashCount=0)}),6e5)):(logger.debug(`${hostLogPrefix} Reset crash count of ${e}, because non-crash exit`),a.crashCount=0,a.crashResetTimer&&(logger.debug(`${hostLogPrefix} Cleared crash timer of ${e}, because non-crash exit`),clearTimeout(a.crashResetTimer),delete a.crashResetTimer)),logger.info(`${hostLogPrefix} Restart adapter ${e} because enabled`);const o=!!a.restartTimer;a.restartTimer&&clearTimeout(a.restartTimer),!a.crashCount||a.crashCount<3?a.restartTimer=setTimeout((e=>startInstance(e)),t===import_js_controller_common.EXIT_CODES.START_IMMEDIATELY_AFTER_STOP||a.config.common.restartSchedule||o?1e3:3e4,e):(logger.warn(`${hostLogPrefix} Do not restart adapter ${e} because restart loop detected`),await notificationHandler.addMessage({scope:"system",category:"restartLoop",message:"Restart loop detected",instance:e}),a.crashCount=0,a.crashResetTimer&&(logger.debug(`${hostLogPrefix} Cleared crash timer of ${e}, because adapter stopped`),clearTimeout(a.crashResetTimer),delete a.crashResetTimer))}storePids()}))},p=()=>{const t=procs[e];if(t){if(!t.process)try{t.process=import_node_child_process.default.fork(d,l,{execArgv:[...import_js_controller_common.tools.getDefaultNodeArgs(d),...m],stdio:["ignore","ignore","pipe","ipc"],windowsHide:!0,cwd:a})}catch(e){logger.error(`${hostLogPrefix} instance ${s._id} could not be started: ${e}`)}if(t.startedInCompactMode||t.startedAsCompactGroup||!t.process||states.setState(`${e}.sigKill`,{val:t.process.pid,ack:!0,from:hostObjectPrefix}),t.startedInCompactMode||t.startedAsCompactGroup||!t.process?.stderr||t.process.stderr.on("data",(o=>{const t=procs[e];if(!o||!t||!import_js_controller_common.tools.isObject(t))return;const s=o.toString();console.error(s),(s.includes("NODE_MODULE_VERSION")||s.includes("npm rebuild")||s.includes("Error: The module '")||s.includes("Could not locate the bindings file.")||s.includes("Cannot find module"))&&(1===t.rebuildCounter&&(t.rebuildArgs=_determineRebuildArgsFromLog(s)),t.needsRebuild=!0),t.errors=t.errors||[];const r=Date.now();t.errors.push({ts:r,text:s}),t.errors.length>300&&t.errors.splice(t.errors.length-300),cleanErrors(t,r)})),storePids(),t.startedInCompactMode||t.startedAsCompactGroup||!t.process||t.process.on("exit",g),!o&&t?.process&&t.config.common?.enabled&&("extension"!==t.config.common.mode||!t.config.native.webInstance)&&"once"!==n)if(t.startedInCompactMode)logger.info(`${hostLogPrefix} instance ${s._id} started in COMPACT mode`);else if(t.startedAsCompactGroup)logger.info(`${hostLogPrefix} instance ${s._id} is handled by compact group controller pid ${t.process.pid}`);else{const e=(0,import_js_controller_common.isInstalledFromNpm)({installedFrom:s.common.installedFrom,adapterName:s.common.name});logger.info(`${hostLogPrefix} instance ${s._id} in version "${s.common.version}"${e?"":` (non-npm: ${s.common.installedFrom})`} started with pid ${t.process.pid}`)}}};if(config.system.compact&&s.common.compact&&s.common.runAsCompactMode)if(!compactGroupController&&0===s.common.compactGroup||compactGroupController&&0!==s.common.compactGroup){try{await states.setState(`${e}.sigKill`,{val:0,ack:!1,from:hostObjectPrefix})}catch{}const o=procs[e],t=s?._id&&s.common&&s._id.split(".").pop()||0,n=s?._id&&s.common&&s.common.loglevel||"info";if(d)try{(0,import_decache.default)(d),d.endsWith(".ts")&&require2("@alcalzone/esbuild-register");const e=await(0,import_tools.isAdapterEsmModule)(r)?(await import(`${d}?update=${Date.now()}`)).default:require2(d);o.process={logic:e({logLevel:n,compactInstance:t,compact:!0})},o.process.logic.on("exit",g),o.startedInCompactMode=!0}catch(s){logger.error(`${hostLogPrefix} Cannot start ${r}.${t} in compact mode. Fallback to normal start: ${s.message}`),logger.error(s.stackTrace),o.process&&delete o.process,await states.setState(`${e}.sigKill`,{val:-1,ack:!1,from:hostObjectPrefix})}else logger.warn(`${hostLogPrefix} Cannot start ${r}.${t} in compact mode: Filename invalid`);o.process&&!o.process.kill&&(o.process.kill=()=>(states.setState(`${e}.sigKill`,{val:-1,ack:!1,from:hostObjectPrefix}),!0)),p()}else{const o=s.common.compactGroup;compactProcs[o]=compactProcs[o]||{instances:[]};const r=compactProcs[o];if(!r.process){const e=[o.toString()],n=[];s.common.memoryLimitMB&&Math.round(s.common.memoryLimitMB)&&n.push(`--max-old-space-size=${Math.round(s.common.memoryLimitMB)}`),logger.info(`${hostLogPrefix} start controller for compactgroup ${s.common.compactGroup}`);try{r.process=import_node_child_process.default.fork(import_node_path.default.join(thisDir,"compactgroupController.js"),e,{execArgv:n,stdio:["ignore","ignore","pipe","ipc"],windowsHide:!0})}catch(e){delete r.process,logger.info(`${hostLogPrefix} controller for compactgroup ${s.common.compactGroup} could not be started: ${e}`)}if(r.process){r.process.stderr&&r.process.stderr.on("data",(e=>{const t=compactProcs[o];if(!e||!t||"object"!=typeof t)return;const s=e.toString();console.error(s),t.errors=t.errors||[];const r=Date.now();t.errors.push({ts:r,text:s}),t.errors.length>300&&t.errors.splice(t.errors.length-300),cleanErrors(t,r)}));const e=s.common.compactGroup,n=(o,s)=>{s?logger.warn(`${hostLogPrefix} compactgroup controller ${e} terminated due to ${s}`):null!==o?logger.info(`${hostLogPrefix} compactgroup controller ${e} terminated with code ${o} (${getErrorText(o)||""})`):logger.info(`${hostLogPrefix} compactgroup controller ${e} terminated`),compactProcs[e]&&compactProcs[e].process&&delete compactProcs[e].process;const r=[];compactProcs[e].instances.forEach((e=>r.push(e))),function e(o,t){if(!o.length)return void(t&&t());const s=o.shift();outputCount+=2,states.setState(`${s}.alive`,{val:!1,ack:!0,from:hostObjectPrefix}),states.setState(`${s}.connected`,{val:!1,ack:!0,from:hostObjectPrefix}),cleanAutoSubscribes(s,(()=>{const r=procs[s];(r?.stopping||isStopping)&&void 0!==r?.stopping&&delete r.stopping,r?.process&&delete r.process,e(o,t)}))}(r,(()=>{if(cleanErrors(compactProcs[e],null,!0),isStopping){logger.silly(`${hostLogPrefix} Check after group exit ${e}`);for(const e of Object.values(procs))if(e.process)return void logger.silly(`${hostLogPrefix} ${e.config.common.name} still running`);for(const[e,o]of Object.entries(compactProcs))if(o.process)return void logger.silly(`${hostLogPrefix} Compact group ${e} still running (compact)`);return logger.info(`${hostLogPrefix} All instances are stopped.`),allInstancesStopped=!0,void storePids()}connected&&compactProcs[e].instances.length?(logger.info(`${hostLogPrefix} Restart compact group controller ${e}`),logger.debug(`${hostLogPrefix} Instances: ${JSON.stringify(compactProcs[e].instances)}`),compactProcs[e].instances.forEach((e=>{t.restartTimer&&clearTimeout(t.restartTimer),t.restartTimer=setTimeout((e=>startInstance(e)),o===import_js_controller_common.EXIT_CODES.START_IMMEDIATELY_AFTER_STOP||procs[e].config.common.restartSchedule?1e3:3e4,e)}))):logger.info(`${hostLogPrefix} Do not restart compact group controller ${e} because no instances assigned to him`),storePids()}))};compactProcs[o].process.on("exit",n)}}compactProcs[o].process&&(compactProcs[o].instances.includes(e)||compactProcs[o].instances.push(e),t.process=compactProcs[o].process,t.startedAsCompactGroup=!0),p()}else{try{await states.setState(`${e}.sigKill`,{val:0,ack:!1,from:hostObjectPrefix})}catch{}p()}}else!o&&t&&logger.warn(`${hostLogPrefix} instance ${s._id} ${t.stopping?"still":"already"} running with pid ${t.process.pid}`),t.stopping&&delete t.stopping;break;case"schedule":if(compactGroupController){logger.debug(`${hostLogPrefix} ${s._id} schedule is not started by compact group controller`);break}if(!s.common.schedule){logger.error(`${hostLogPrefix} ${s._id} schedule attribute missing`);break}t.schedule&&(t.schedule.cancel(),logger.info(`${hostLogPrefix} instance canceled schedule ${s._id}`));try{import_cron_parser.default.parseExpression(s.common.schedule)}catch(e){logger.error(`${hostLogPrefix} Cannot schedule start of instance ${s._id}: ${e.message}`);break}if(t.schedule=import_node_schedule.default.scheduleJob((0,import_utils.getCronExpression)({cronExpression:s.common.schedule,connectionType:s.common.connectionType}),(()=>{scheduledInstances[e]={fileNameFull:d,adapterDir:a,wakeUp:o},1===Object.keys(scheduledInstances).length&&startScheduledInstance()})),logger.info(`${hostLogPrefix} instance scheduled ${s._id} ${s.common.schedule}`),s.common.allowInit){try{t.process=import_node_child_process.default.fork(d,l,{execArgv:[...import_js_controller_common.tools.getDefaultNodeArgs(d),...m],windowsHide:!0,cwd:a})}catch(e){logger.info(`${hostLogPrefix} instance ${s._id} could not be started: ${e.message}`)}if(t.process){storePids();const o=(0,import_js_controller_common.isInstalledFromNpm)({installedFrom:s.common.installedFrom,adapterName:s.common.name});logger.info(`${hostLogPrefix} instance ${s._id} in version "${s.common.version}"${o?"":` (non-npm: ${s.common.installedFrom})`} started with pid ${t.process.pid}`),t.process.on("exit",((o,t)=>{cleanAutoSubscribes(e,(()=>{const s=procs[e];if(outputCount++,states.setState(`${e}.alive`,{val:!1,ack:!0,from:hostObjectPrefix}),t)logger.warn(`${hostLogPrefix} instance ${e} terminated due to ${t}`);else if(null===o)logger.error(`${hostLogPrefix} instance ${e} terminated abnormally`);else{const t=`${hostLogPrefix} instance ${e} terminated with code ${o} (${getErrorText(o)||""})`;o&&o!==import_js_controller_common.EXIT_CODES.ADAPTER_REQUESTED_TERMINATION&&o!==import_js_controller_common.EXIT_CODES.NO_ERROR?logger.error(t):logger.info(t)}s&&delete s.process,storePids()}))}))}}break;case"extension":break;default:logger.error(`${hostLogPrefix} ${s._id} has the invalid mode "${n}"`)}}else{logger.warn(`${hostLogPrefix} startInstance ${r}.${c}: required Node.js version ${t.engine}, actual version ${process.version}`);const o=await objects.getObject(e);o?.common?.enabled&&(o.common.enabled=!1,await objects.setObject(o._id,o),logger.warn(`${hostLogPrefix} startInstance ${r}.${c}: instance disabled because of Node.js version mismatch`))}}async function stopInstance(e,o){const t=procs[e];if(!t)return void logger.warn(`${hostLogPrefix} stopInstance unknown instance ${e}`);logger.info(`${hostLogPrefix} stopInstance ${e} (force=${o}, process=${procs[e].process?"true":"false"})`);const s=t.config;if(!s?.common?.mode){if(t.process){if(t.stopping=!0,!t.startedAsCompactGroup)try{t.process.kill()}catch(o){logger.error(`${hostLogPrefix} Cannot stop ${e}: ${JSON.stringify(o)}`)}delete t.process}return t.schedule&&(t.schedule.cancel(),delete t.schedule),void(t.subscribe&&subscribe[t.subscribe]&&subscribe[t.subscribe].includes(e)&&(subscribe[t.subscribe].splice(subscribe[t.subscribe].indexOf(e),1),subscribe[t.subscribe].length||(delete subscribe[t.subscribe],t.subscribe.startsWith("messagebox.")?states.unsubscribeMessage(t.subscribe.substring(11)):states.unsubscribe(t.subscribe))))}const r=stopTimeouts[e]||{};switch(stopTimeouts[e]=r,r.timeout&&(clearTimeout(r.timeout),r.timeout=null),s.common.mode){case"daemon":if(!t.process)return void(t.config?.common.enabled&&!t.startedAsCompactGroup&&!isStopping&&logger.warn(`${hostLogPrefix} stopInstance ${s._id} not running`));if(o&&!t.startedAsCompactGroup){logger.info(`${hostLogPrefix} stopInstance forced ${s._id} killing pid ${t.process.pid}`),t.stopping=!0;try{t.process.kill("SIGKILL")}catch(o){logger.error(`${hostLogPrefix} Cannot stop ${e}: ${JSON.stringify(o)}`)}delete t.process}else{if(s.common.messagebox&&s.common.supportStopInstance||s.common.supportedMessages?.stopInstance){sendTo(s._id,"stopInstance",null,(o=>{const r=stopTimeouts[e];if(r?.timeout&&(clearTimeout(r.timeout),r.timeout=null),logger.info(`${hostLogPrefix} stopInstance self ${s._id} killing pid ${t.process?t.process.pid:"undefined"}${o?`: ${o}`:""}`),t.process&&!t.startedAsCompactGroup){t.stopping=!0;try{t.process.kill("SIGKILL")}catch(o){logger.error(`${hostLogPrefix} Cannot stop ${e}: ${JSON.stringify(o)}`)}delete t.process}"function"==typeof r?.callback&&(r.callback(),r.callback=null)}));const o=s.common.supportStopInstance||s.common.supportedMessages?.stopInstance,n=!0===o?1e3:o||1e3;return new Promise((o=>{r.callback=o,r.timeout=setTimeout((()=>{const o=stopTimeouts[e],t=procs[e];if(o&&(o.timeout=null),t?.process&&!t.startedAsCompactGroup){logger.info(`${hostLogPrefix} stopInstance timeout ${n} ${s._id} killing pid ${t.process.pid}`),t.stopping=!0;try{t.process.kill("SIGKILL")}catch(o){logger.error(`${hostLogPrefix} Cannot stop ${e}: ${JSON.stringify(o)}`)}delete t.process}else!compactGroupController&&t?.process&&delete t.process;o&&"function"==typeof o.callback&&(o.callback(),o.callback=null)}),n)}))}if(!t.startedAsCompactGroup){let o;try{await states.setState(`${e}.sigKill`,{val:-1,ack:!1,from:hostObjectPrefix})}catch(e){o=e}logger.info(`${hostLogPrefix} stopInstance ${s._id} send kill signal`);const t=procs[e],r=stopTimeouts[e];o||t&&(t.stopping=!0);const n=s.common.stopTimeout||1e3;return new Promise((o=>{r.callback=o,r.timeout=setTimeout((()=>{const o=procs[e],t=stopTimeouts[e];if(t&&(t.timeout=null),o?.process&&!o.startedAsCompactGroup){logger.info(`${hostLogPrefix} stopInstance timeout ${s._id} killing pid ${o.process.pid}`),o.stopping=!0;try{o.process.kill("SIGKILL")}catch(o){logger.error(`${hostLogPrefix} Cannot stop ${e}: ${JSON.stringify(o)}`)}delete o.process}t&&"function"==typeof t.callback&&(t.callback(),t.callback=null)}),n)}))}t&&delete t.process}break;case"schedule":t.schedule?(t.schedule.cancel(),delete t.schedule,scheduledInstances[e]&&delete scheduledInstances[e],logger.info(`${hostLogPrefix} stopInstance canceled schedule ${s._id}`)):!isStopping&&logger.debug(`${hostLogPrefix} stopInstance ${s._id} not scheduled`)}}function stopInstances(e,o){let t,s;try{isStopping=isStopping||Date.now();const r=Date.now()-isStopping;logger.debug(`${hostLogPrefix} stop isStopping=${r} isDaemon=${isDaemon} allInstancesStopped=${allInstancesStopped}`),r>=stopTimeout&&(t&&clearTimeout(t),"function"==typeof o&&o(!0),o=null);for(const o of Object.keys(procs))stopInstance(o,e);if(e||isDaemon){for(const e of Object.keys(compactProcs)){const o=compactProcs[e];o.process&&o.process.kill()}e&&(allInstancesStopped=!0)}!function e(){s=null,allInstancesStopped?(t&&clearTimeout(t),"function"==typeof o&&o(),o=null):s=setTimeout(e,200)}()}catch(e){logger.error(`${hostLogPrefix} ${e.message}`),t&&clearTimeout(t),s&&clearTimeout(s),"function"==typeof o&&o(),o=null}t=setTimeout((()=>{t=null,s&&clearTimeout(s),"function"==typeof o&&o(!0),o=null}),stopTimeout)}function stop(e,o){void 0===e&&(e=!1),mhService&&(mhService.close(),mhService=null),primaryHostInterval&&(clearInterval(primaryHostInterval),primaryHostInterval=null),updateIPsTimer&&(clearInterval(updateIPsTimer),updateIPsTimer=null),reportInterval&&(clearInterval(reportInterval),reportInterval=null),isStopping||stopInstances(e,(async t=>{await pluginHandler.destroyAll(),notificationHandler&&notificationHandler.storeNotifications();try{isPrimary&&(await objects.releasePrimaryHost(),isPrimary=!1)}catch{}if(objects&&objects.destroy&&await objects.destroy(),!states||e)return logger.info(`${hostLogPrefix} ${t?"force terminating":"terminated"}. Could not reset alive status for instances`),"function"==typeof o?void o():void setTimeout((()=>process.exit(import_js_controller_common.EXIT_CODES.JS_CONTROLLER_STOPPED)),1e3);outputCount++;try{await states.setState(`${hostObjectPrefix}.alive`,{val:!1,ack:!0,from:hostObjectPrefix}),await states.setState(`${hostObjectPrefix}.pid`,{val:null,ack:!0,from:hostObjectPrefix})}catch{}if(logger.info(`${hostLogPrefix} ${t?"force terminating":"terminated"}`),t){for(const e of Object.keys(procs))procs[e].process&&procs[e].config&&procs[e].config.common&&procs[e].config.common.name&&logger.info(`${hostLogPrefix} Adapter ${procs[e].config.common.name} still running`);for(const e of Object.keys(compactProcs))compactProcs[e].process&&logger.info(`${hostLogPrefix} Compact group controller ${e} still running`)}states?.destroy&&await states.destroy(),"function"!=typeof o?setTimeout((()=>{try{storeTimer&&clearTimeout(storeTimer),import_fs_extra.default.unlinkSync(import_js_controller_common.tools.getPidsFileName())}catch(e){"ENOENT"!==e.code&&logger.error(`${hostLogPrefix} Could not delete ${import_js_controller_common.tools.getPidsFileName()}: ${e}`)}process.exit(import_js_controller_common.EXIT_CODES.JS_CONTROLLER_STOPPED)}),1e3):o()}))}async function init(e){let o=`${import_js_controller_common.tools.appName}.js-controller`;e?(compactGroupController=!0,compactGroup=e,hostObjectPrefix+=compactGroupObjectPrefix+compactGroup,hostLogPrefix+=compactGroupObjectPrefix+compactGroup,o+=compactGroupObjectPrefix+compactGroup,isDaemon=!0):stopTimeout+=5e3,import_fs_extra.default.existsSync(VENDOR_BOOTSTRAP_FILE)&&setTimeout((()=>{try{import_fs_extra.default.existsSync(VENDOR_BOOTSTRAP_FILE)&&(import_fs_extra.default.unlinkSync(VENDOR_BOOTSTRAP_FILE),logger?.info(`${hostLogPrefix} Deleted ${VENDOR_BOOTSTRAP_FILE}`))}catch(e){logger?.error(`${hostLogPrefix} Cannot delete ${VENDOR_BOOTSTRAP_FILE}: ${e.message}`)}}),3e4),process.title=o;const t=await(0,import_js_controller_common.isLocalObjectsDbServer)(config.objects.type,config.objects.host);Objects=t&&!compactGroupController?(await import(`@iobroker/db-objects-${config.objects.type}`)).Server:await(0,import_js_controller_common.getObjectsConstructor)();const s=await(0,import_js_controller_common.isLocalStatesDbServer)(config.states.type,config.states.host);States=s&&!compactGroupController?(await import(`@iobroker/db-states-${config.states.type}`)).Server:await(0,import_js_controller_common.getStatesConstructor)(),config.log.noStdout&&process.argv&&(process.argv.includes("--console")||process.argv.includes("--logs")||process.argv.includes("--debug"))&&(config.log.noStdout=!1),process.argv.includes("start")&&!compactGroupController&&(isDaemon=!0,config.log.noStdout=!0);try{logger=(0,import_js_controller_common.logger)(config.log)}catch(e){if("EACCES_LOG"===e.code){console.error(`Could not access logging directory "${e.path}", fallback to default`);const o=getConfig(),t=import_js_controller_common.tools.getConfigFileName(),s="log/iobroker";o.log.transport.file1.filename=s,import_fs_extra.default.writeFileSync(t,JSON.stringify(o,null,2)),config.log.transport.file1.filename=s,logger=import_js_controller_common.logger.logger(config.log),logger.warn(`${hostLogPrefix} Your logging path "${e.path}" was invalid, it has been changed to "${s}"`)}else console.error(`Error initializing logger: ${e.stack}`),process.exit(import_js_controller_common.EXIT_CODES.UNKNOWN_ERROR)}compactGroupController||logger.activateDateChecker(!0,config.log.maxDays);if(logger.transports.find((e=>"NT"===e.name)).on("logged",(e=>{e.from=hostLogPrefix;for(const o of logList)states.pushLog(o,e)})),compactGroupController)logger.info(`${hostLogPrefix} ${import_js_controller_common.tools.appName}.js-controller version ${version} ${ioPackage.common.name} starting`);else{logger.info(`${hostLogPrefix} ${import_js_controller_common.tools.appName}.js-controller version ${version} ${ioPackage.common.name} starting`),logger.info(`${hostLogPrefix} Copyright (c) 2014-2024 bluefox, 2014 hobbyquaker`),logger.info(`${hostLogPrefix} hostname: ${hostname}, node: ${process.version}`),logger.info(`${hostLogPrefix} ip addresses: ${import_js_controller_common.tools.findIPs().join(" ")}`);if(controllerDir.toLowerCase().includes(`${import_node_path.default.sep}node_modules${import_node_path.default.sep}${o.toLowerCase()}`)&&!import_js_controller_common.tools.isDevServerInstallation())try{if(import_fs_extra.default.existsSync(`${controllerDir}/../../package.json`)){import_fs_extra.default.readJSONSync(`${controllerDir}/../../package.json`).version||import_fs_extra.default.writeFileSync(`${controllerDir}/../../package.json`,JSON.stringify({name:"iobroker.core",version:"1.0.0",private:!0},null,2))}else import_fs_extra.default.writeFileSync(`${controllerDir}/../../package.json`,JSON.stringify({name:"iobroker.core",version:"1.0.0",private:!0},null,2))}catch(e){console.error(`Cannot create "${controllerDir}/../../package.json": ${e}`)}}let r;try{r=import_fs_extra.default.readJSONSync(`${controllerDir}/package.json`)}catch{logger.error(`${hostLogPrefix} Can not read js-controller package.json`)}if(r?.engines?.node){let e;try{e=!import_semver.default.satisfies(process.version,r.engines.node)}catch{e=!0}e&&(logger.error(`${hostLogPrefix} ioBroker requires Node.js in version ${r.engines.node}, you have ${process.version}`),logger.error(`${hostLogPrefix} Please upgrade your Node.js version. See https://forum.iobroker.net/topic/22867/how-to-node-js-f%C3%BCr-iobroker-richtig-updaten`),console.error(`ioBroker requires Node.js in version ${r.engines.node}, you have ${process.version}`),console.error("Please upgrade your Node.js version. See https://forum.iobroker.net/topic/22867/how-to-node-js-f%C3%BCr-iobroker-richtig-updaten"),process.exit(import_js_controller_common.EXIT_CODES.INVALID_NODE_VERSION))}const n={scope:"controller",namespace:hostObjectPrefix,logNamespace:hostLogPrefix,log:logger,iobrokerConfig:config,parentPackage:r,controllerVersion:version};pluginHandler=new import_plugin_base.PluginHandler(n),pluginHandler.addPlugins(ioPackage.common.plugins,controllerDir);try{pluginHandler.addPlugins(config.plugins,controllerDir)}catch(e){logger.error(`${hostLogPrefix} Cannot load plugins ${JSON.stringify(config.plugins)}: ${e}`),console.error(`Cannot load plugins ${JSON.stringify(config.plugins)}: ${e}`)}createObjects((async()=>{objects.subscribe(`${import_constants.SYSTEM_ADAPTER_PREFIX}*`);try{const e=await objects.getObjectViewAsync("system","host");for(const o of e.rows)o.value?.common?.installedVersion&&(controllerVersions[o.id]=o.value.common.installedVersion)}catch{}createStates((async()=>{if(!states||!objects)throw new Error("States or objects have not been initialized yet");connectTimeout&&(clearTimeout(connectTimeout),connectTimeout=null),states.subscribe(`${import_constants.SYSTEM_ADAPTER_PREFIX}*.logging`),states.subscribe(`${import_constants.SYSTEM_ADAPTER_PREFIX}*.alive`),states.subscribe(`${hostObjectPrefix}.diskWarning`);const e=await states.getState(`${hostObjectPrefix}.diskWarning`);if(e&&(diskWarningLevel=(0,import_utils.getDiskWarningLevel)(e)),states.setState(`${hostObjectPrefix}.logLevel`,{val:config.log.level,ack:!0,from:hostObjectPrefix}),states.subscribe(`${hostObjectPrefix}.logLevel`),!compactGroupController)try{const e=process.version.replace(/^v/,""),o=await states.getStateAsync(`${hostObjectPrefix}.nodeVersion`);if((!o||o.val!==e)&&(logger.info(`${hostLogPrefix} Node.js version has changed from ${o?o.val:"unknown"} to ${e}`),"linux"===import_node_os.default.platform()&&"true"!==process.env.IOB_NO_SETCAP)){const e=["cap_net_admin","cap_net_bind_service","cap_net_raw"];await import_js_controller_common.tools.setExecutableCapabilities(process.execPath,e,!0,!0,!0),logger.info(`${hostLogPrefix} Successfully updated capabilities "${e.join(", ")}" for ${process.execPath}`)}await states.setState(`${hostObjectPrefix}.nodeVersion`,{val:e,ack:!0,from:hostObjectPrefix})}catch(e){logger.warn(`${hostLogPrefix} Error while trying to update capabilities after detecting new Node.js version: ${e.message}`)}let o;try{o=await states.getKeys(`${import_constants.SYSTEM_ADAPTER_PREFIX}*.logging`)}catch{}if(o?.length){const e=o.map((e=>e.replace(/\.logging$/,"")));let t;try{t=await objects.getObjects(e)}catch{return}const s=o.filter(((e,o)=>!t[o]));let r;o=o.filter(((e,o)=>t[o]));try{r=await states.getStates(o)}catch{}if(r)for(let e=0;e<o.length;e++){const t=r[e];!0===t?.val&&logRedirect(!0,o[e].substring(0,o[e].length-8).replace(/^io\./,""),"starting")}s.length&&s.forEach((e=>{logger.warn(`${hostLogPrefix} logger ${e} was deleted`),states.delState(e)}))}}))})),connectTimeout=setTimeout((()=>{connectTimeout=null,logger.error(`${hostLogPrefix} No connection to databases possible, restart`),!compactGroupController&&processMessage({command:"cmdExec",message:{data:"_restart"},from:hostObjectPrefix}),setTimeout((()=>process.exit(import_js_controller_common.EXIT_CODES.JS_CONTROLLER_STOPPED)),compactGroupController?0:1e3)}),3e4);const a=e=>compactGroupController?(console.error(e.message),e.stack&&console.error(e.stack),void stop(!1)):(console.error(e.message),e.stack&&console.error(e.stack),uncaughtExceptionCount?(console.error(e.message),e.stack&&console.error(e.stack),void process.exit(import_js_controller_common.EXIT_CODES.UNCAUGHT_EXCEPTION)):(uncaughtExceptionCount++,"object"==typeof e?"EADDRINUSE"===e.errno?(logger.error(`${hostLogPrefix} Another instance is running or some application uses port!`),logger.error(`${hostLogPrefix} uncaught exception: ${e.message}`)):(logger.error(`${hostLogPrefix} uncaught exception: ${e.message}`),logger.error(`${hostLogPrefix} ${e.stack}`)):(logger.error(`${hostLogPrefix} uncaught exception: ${e}`),logger.error(`${hostLogPrefix} ${e.stack}`)),stop(!1),void processMessage({command:"cmdExec",message:{data:"_restart"},from:hostObjectPrefix})));process.on("SIGINT",(()=>{logger.info(`${hostLogPrefix} received SIGINT`),stop(!1)})),process.on("SIGTERM",(()=>{logger.info(`${hostLogPrefix} received SIGTERM`),stop(!1)})),process.on("uncaughtException",a),process.on("unhandledRejection",a)}function _determineRebuildArgsFromLog(e){let o;if(e.includes("Could not locate the bindings file.")&&(o=e.match(/→ (.+)$/gm),o&&o.shift()),o||(o=e.match(/'.+'/g)),o){let e=o[0].replace(/'/g,"");if(import_node_path.default.isAbsolute(e)){e=import_node_path.default.dirname(e);const o=import_node_path.default.parse(process.cwd()).root;for(;e!==o;){const o=import_node_path.default.join(e,"package.json");if(import_fs_extra.default.pathExistsSync(o))try{const t=import_fs_extra.default.readJsonSync(o);return e=import_node_path.default.join(e,".."),{path:e,module:t.name,version:t.version}}catch(e){return void logger.error(`${hostLogPrefix} Could not determine rebuild arguments: ${e.message}`)}else e=import_node_path.default.join(e,"..")}}}}async function _getNumberOfInstances(){try{let e=0;const o=await objects.getObjectViewAsync("system","instance",{startkey:import_constants.SYSTEM_ADAPTER_PREFIX,endkey:`${import_constants.SYSTEM_ADAPTER_PREFIX}香`}),t=o.rows.length;if(config.system.compact)for(const t of o.rows){const o=await states.getStateAsync(`${t.id}.compactMode`);o?.val&&e++}return{noInstances:t,noCompactInstances:e}}catch{return{noInstances:null,noCompactInstances:null}}}async function setInstanceOfflineStates(e){outputCount+=2,await states.setState(`${e}.alive`,{val:!1,ack:!0,from:hostObjectPrefix}),await states.setState(`${e}.connected`,{val:!1,ack:!0,from:hostObjectPrefix});const o=e.substring(import_constants.SYSTEM_ADAPTER_PREFIX.length),t=await states.getState(`${o}.info.connection`);!0===t?.val&&(outputCount++,await states.setState(o,{val:!1,ack:!0,from:hostObjectPrefix}))}async function checkAvailableDockerUpdate(){if(!import_js_controller_common.tools.getDockerInformation().isOfficial||!states)return;const{isNew:e,lastUpdated:o,version:t}=await import_js_controller_common.tools.getNewestDockerImageVersion();if(!e)return;const s=`${hostObjectPrefix}.availableDockerBuild`,r=(await states.getState(s))?.val;await states.setState(s,{val:o,ack:!0}),r!==o&&await notificationHandler.addMessage({scope:"system",category:"dockerUpdate",message:`${t} (${o})`,instance:`system.host.${hostname}`})}async function listUpdatableOsPackages(){if(import_js_controller_common.tools.isDocker()||!states)return;const e=new import_js_controller_cli.PacketManager;await e.ready();const o=await e.listUpgradeablePackages(),t=`${hostObjectPrefix}.osPackageUpdates`,s=await states.getState(t);if(await states.setState(t,{val:JSON.stringify(o),ack:!0}),!o.length)return void await notificationHandler.clearNotifications("system","packageUpdates",`system.host.${hostname}`);const r="string"==typeof s?.val?JSON.parse(s.val):[];o.some((e=>!r.includes(e)))&&await notificationHandler.addMessage({scope:"system",category:"packageUpdates",message:o.join("\n"),instance:`system.host.${hostname}`})}async function upgradeOsPackages(e){const o=new import_js_controller_cli.PacketManager;await o.ready(),await o.upgrade(e)}async function startUpgradeManager(e){const{version:o,adminInstance:t,uid:s,gid:r}=e,n=require2.resolve("./lib/upgradeManager");let a;a=await import_js_controller_common.tools.isIoBrokerInstalledAsSystemd()?(0,import_node_child_process.spawn)("sudo",["systemd-run","--no-ask-password",process.execPath,n,o,t.toString(),s.toString(),r.toString()],{detached:!0,stdio:"ignore"}):(0,import_node_child_process.spawn)(process.execPath,[n,o,t.toString(),s.toString(),r.toString()],{detached:!0,stdio:"ignore"}),a.unref()}async function checkRebootRequired(){if("linux"!==process.platform||isRebootRequired)return;const e="/var/run/reboot-required.pkgs";if(isRebootRequired=await import_fs_extra.default.pathExists("/var/run/reboot-required"),!isRebootRequired)return;let o="At least one package update requires a system reboot";try{o=`The following package updates require a restart of the system: ${(await import_fs_extra.default.readFile(e,{encoding:"utf-8"})).split("\n").join(", ")}`}catch(o){"ENOENT"!==o.code&&logger.error(`${hostLogPrefix} Could not read file "${e}": ${o.message}`)}await notificationHandler.addMessage({scope:"system",category:"systemRebootRequired",message:o,instance:`system.host.${hostname}`})}async function autoUpgradeAdapters(){try{if(!await autoUpgradeManager.isAutoUpgradeEnabled())return void logger.debug(`${hostLogPrefix} Automatic adapter upgrades are disabled for the current repository`);const{upgradedAdapters:e,failedAdapters:o}=await autoUpgradeManager.upgradeAdapters();e.length&&await notificationHandler.addMessage({scope:"system",category:"automaticAdapterUpgradeSuccessful",message:e.map((e=>`${e.name}: ${e.oldVersion} -> ${e.newVersion}`)).join("\n"),instance:`system.host.${hostname}`}),o.length&&await notificationHandler.addMessage({scope:"system",category:"automaticAdapterUpgradeFailed",message:o.map((e=>`${e.name}: ${e.oldVersion} -> ${e.newVersion}`)).join("\n"),instance:`system.host.${hostname}`})}catch(e){logger.error(`${hostLogPrefix} An error occurred while processing automatic adapter upgrades: ${e.message}`)}}async function disableBlocklistedInstances(){let e;try{e=await blocklistManager.disableAllBlocklistedInstances()}catch(e){return void logger.error(`${hostLogPrefix} Could not check if blocklisted adapters need to be disabled: ${e.message}`)}for(const o of e){const e=`Instance "${o._id}" has been stopped and disabled because the version "${o.common.version}" has been blocked by the developer`;logger.error(`${hostLogPrefix} ${e}`),await notificationHandler.addMessage({scope:"system",category:"blockedVersions",message:e,instance:import_constants.SYSTEM_HOST_PREFIX+hostname})}}const modulePath=url.fileURLToPath(__import_meta_url||`file://${__filename}`);process.argv[1]===modulePath&&init();
//# sourceMappingURL=/sm/1aebbf1290eb8701aa01470be2518590575c428fc9cc8de23e1104fdecf8e727.map