/**
 * Minified by jsDelivr using Terser v5.39.0.
 * Original file: /npm/iobroker.backitup@3.3.17/main.js
 *
 * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files
 */
"use strict";const fs=require("node:fs"),path=require("node:path"),utils=require("@iobroker/adapter-core"),schedule=require("node-schedule"),tools=require("./lib/tools"),executeScripts=require("./lib/execute"),systemCheck=require("./lib/systemCheck"),TokenRefresher=require("./lib/tokenRefresher"),adapterName=require("./package.json").name.split(".").pop();let adapter,timerOutput,timerOutput2,timerUmount1,timerUmount2,timerMain,slaveTimeOut,waitToSlaveBackup,dlServer,ulServer,http,https,systemLang="de";const backupConfig={},backupTimeSchedules=[];let taskRunning=!1,dropBoxTokenRefresher=null;const bashDir=path.join(utils.getAbsoluteDefaultDataDir(),adapterName).replace(/\\/g,"/");function decrypt(e,a){let r="";for(let t=0;t<a.length;t++)r+=String.fromCharCode(e[t%e.length].charCodeAt(0)^a.charCodeAt(t));return r}async function updateAccessTokens(e){if(dropBoxTokenRefresher)try{const a=await dropBoxTokenRefresher.getAccessToken();Object.keys(e).forEach((r=>{e[r]&&"object"==typeof e[r]&&(e[r].dropbox?e[r].dropbox.accessToken=a:Object.keys(e[r]).forEach((t=>{e[r][t]&&e[r][t].dropbox&&(e[r][t].dropbox.accessToken=a)})))}))}catch(e){adapter.log.error(`Cannot get access tokens for DropBox: ${e}`)}}async function startBackup(e,a){if(taskRunning)return setTimeout(startBackup,1e4,e,a);taskRunning=!0;try{executeScripts(adapter,e,(e=>{taskRunning=!1,a&&a(e)})),adapter.log.debug("Backup has started ...")}catch(e){adapter.log.warn(`Backup error: ${e.stack}`),adapter.log.warn(`Backup error: ${e} ... please check your config and and try again!!`)}}function startAdapter(e){return e=e||{},Object.assign(e,{name:adapterName}),adapter=new utils.Adapter(e),adapter.on("stateChange",(async(e,a)=>{if(dropBoxTokenRefresher?.onStateChange(e,a),e===`${adapter.namespace}.info.dropboxTokens`&&(await updateAccessTokens(backupConfig),adapter.log.debug("Config Update for Dropbox Token")),a&&(!0===a.val||"true"===a.val)&&!a.ack&&(e===`${adapter.namespace}.oneClick.iobroker`||e===`${adapter.namespace}.oneClick.ccu`)){const a=await systemCheck.storageSizeCheck(adapter,adapterName,adapter.log),r=e.split(".").pop();if(a&&a.ready&&!0===a.ready||!0===adapter.config.cifsEnabled){let e;try{e=JSON.parse(JSON.stringify(backupConfig[r])),e.enabled=!0,e.deleteBackupAfter=0}catch(e){adapter.log.warn(`backup error: ${e.stack}`),adapter.log.warn(`backup error: ${e} ... please check your config and try again!!`)}startBackup(e,(e=>{e?adapter.log.error(`[${r}] ${e}`):adapter.log.debug(`[${r}] exec: done`),timerOutput=setTimeout((()=>adapter.getState("output.line",((e,a)=>{a&&"[EXIT] 0"===a.val?(adapter.setState(`history.${r}Success`,!0,!0),adapter.setState(`history.${r}LastTime`,tools.getTimeString(systemLang),!0),adapter.config.onedriveEnabled&&"Single"===adapter.config.hostType&&renewOnedriveToken()):(adapter.setState(`history.${r}LastTime`,`error: ${tools.getTimeString(systemLang)}`,!0),adapter.setState(`history.${r}Success`,!1,!0))}))),500),adapter.setState(`oneClick.${r}`,!1,!0),adapter.config.slaveInstance&&"iobroker"===r&&"Master"===adapter.config.hostType&&(adapter.log.debug("Slave backup from BackItUp-Master is started ..."),startSlaveBackup(adapter.config.slaveInstance[0],null))}))}else adapter.log.error(`A local backup is currently not possible. The storage space is currently only ${a&&a.diskFree?a.diskFree:null} MB`),systemCheck.systemMessage(adapter,tools._("A local backup is currently not possible. Please check your System!",systemLang)),adapter.setState(`oneClick.${r}`,!1,!0),adapter.setState("output.line",`[EXIT] ${tools._("A local backup is currently not possible. Please check your System!",systemLang)}`,!0)}})),adapter.on("ready",(async()=>{try{await main(adapter)}catch(e){}})),adapter.on("unload",(e=>{try{if(dropBoxTokenRefresher?.destroy(),adapter.log.info("cleaned everything up..."),timerOutput2&&clearTimeout(timerOutput2),timerOutput&&clearTimeout(timerOutput),timerUmount1&&clearTimeout(timerUmount1),timerUmount2&&clearTimeout(timerUmount2),timerMain&&clearTimeout(timerMain),slaveTimeOut&&clearTimeout(slaveTimeOut),waitToSlaveBackup&&clearTimeout(waitToSlaveBackup),dlServer){try{dlServer.closeAllConnections()}catch(e){adapter.log.debug(`Download server Connections could not be closed: ${e}`)}try{dlServer.close()}catch(e){adapter.log.debug(`Download server Connections could not be closed: ${e}`)}}if(ulServer){try{ulServer.closeAllConnections()}catch(e){adapter.log.debug(`Upload server connections could not be closed: ${e}`)}try{ulServer.close()}catch(e){adapter.log.debug(`Upload server connections could not be closed: ${e}`)}}}catch(e){console.log(`Cannot unload: ${e}`)}e()})),adapter.on("message",(async e=>{if(e)switch(e.command){case"list":try{const a=require("./lib/list");adapter.log.debug("Reading backup list..."),await updateAccessTokens(backupConfig),a(e.message,backupConfig,adapter.log,(a=>{adapter.log.debug(`Backup list was read: ${JSON.stringify(a)}`),e.callback&&adapter.sendTo(e.from,e.command,a,e.callback)}))}catch(e){adapter.log.debug("Backup list cannot be read ...")}break;case"authGoogleDrive":const a=require("./lib/googleDriveLib");if(e.callback){(new a).getAuthorizeUrl().then((a=>adapter.sendTo(e.from,e.command,{url:a},e.callback)))}break;case"authDropbox":e.callback&&TokenRefresher.getAuthUrl("https://oauth2.iobroker.in/dropbox").then((a=>adapter.sendTo(e.from,e.command,{url:a},e.callback)));break;case"authOnedrive":const r=require("./lib/oneDriveLib");if(e.message&&e.message.code){(new r).getRefreshToken(e.message.code,adapter.log).then((a=>adapter.sendTo(e.from,e.command,{done:!0,json:a},e.callback))).catch((a=>adapter.sendTo(e.from,e.command,{error:a},e.callback)))}else if(e.callback){(new r).getAuthorizeUrl(adapter.log).then((a=>adapter.sendTo(e.from,e.command,{url:a},e.callback))).catch((a=>adapter.sendTo(e.from,e.command,{error:a},e.callback)))}break;case"restore":if(e.message){e.message.stopIOB&&await getCerts(e.from),adapter.log.info(`DATA: ${JSON.stringify(e.message)}`),await updateAccessTokens(backupConfig);require("./lib/restore").restore(adapter,backupConfig,e.message.type,e.message.fileName,e.message.currentTheme,e.message.currentProtocol,bashDir,adapter.log,(a=>e.callback&&adapter.sendTo(e.from,e.command,a,e.callback)))}else e.callback&&e.callback({error:"Invalid parameters"});break;case"uploadFile":if(e.message&&e.message.protocol){if(ulServer&&ulServer._connectionKey&&ulServer.listening)adapter.log.debug(`Upload server is running on Port ${ulServer.address().port}...`);else{"https:"===e.message.protocol&&await getCerts(e.from);try{ulFileServer(e.message.protocol)}catch(e){adapter.log.debug("Upload server cannot started")}}try{adapter.sendTo(e.from,e.command,{listenPort:ulServer.address().port},e.callback)}catch(a){adapter.sendTo(e.from,e.command,{e:a},e.callback)}}else e.callback&&e.callback({error:"Invalid parameters"});break;case"getFile":if(e.message&&e.message.type&&e.message.fileName&&e.message.protocol){if(dlServer&&dlServer._connectionKey&&dlServer.listening)adapter.log.debug(`Download server is running on port ${dlServer.address().port}...`);else{"https:"===e.message.protocol&&await getCerts(e.from);try{dlFileServer(e.message.protocol)}catch(e){adapter.log.debug("Downloadserver cannot started")}}const a=e.message.fileName.split("/").pop();if("local"!==e.message.type){const r=path.join(tools.getIobDir(),"backups"),t=path.join(r,a),i=require("./lib/restore");await updateAccessTokens(backupConfig),i.getFile(backupConfig,e.message.type,e.message.fileName,t,adapter.log,(r=>{if(!r&&fs.existsSync(t))try{adapter.sendTo(e.from,e.command,{fileName:a,listenPort:dlServer.address().port},e.callback)}catch(a){adapter.sendTo(e.from,e.command,{error:a},e.callback)}else adapter.log.warn(`File ${t} not found`)}))}else if(fs.existsSync(e.message.fileName))try{adapter.sendTo(e.from,e.command,{fileName:a,listenPort:dlServer.address().port},e.callback)}catch(a){adapter.sendTo(e.from,e.command,{error:a},e.callback)}}else e.callback&&e.callback({error:"Invalid parameters"});break;case"serverClose":e.message&&e.message.downloadFinish&&!e.message.uploadFinish?(adapter.log.debug("Download finished..."),adapter.sendTo(e.from,e.command,{serverClose:!0},e.callback)):e.message&&e.message.uploadFinish&&!e.message.downloadFinish?(adapter.log.debug("Upload finished..."),adapter.sendTo(e.from,e.command,{serverClose:!0},e.callback)):e.callback&&e.callback({error:"Invalid parameters"});break;case"getTelegramUser":if(e&&e.message){const a=e.message.config.instance?e.message.config.instance:adapter.config.telegramInstance;adapter.getForeignState(`${a}.communicate.users`,((a,r)=>{if(a&&adapter.log.error(a),r&&r.val)try{adapter.sendTo(e.from,e.command,r.val,e.callback)}catch(a){a&&adapter.log.error(a),adapter.log.error("Cannot parse stored user IDs from Telegram!")}}))}break;case"getSystemInfo":if(e){let a=process.platform,r=!1;if(fs.existsSync("/opt/scripts/.docker_config/.thisisdocker"))a="docker",fs.existsSync("/opt/scripts/.docker_config/.backitup")&&(r=!0);else{process.platform.startsWith("win")&&(a="win")}try{adapter.sendTo(e.from,e.command,{systemOS:a,dockerDB:r,backupDir:path.join(tools.getIobDir(),"backups")},e.callback)}catch(e){e&&adapter.log.error(e)}}break;case"getFileSystemInfo":if(e){const a=await systemCheck.storageSizeCheck(adapter,adapterName,adapter.log);if(a)try{adapter.sendTo(e.from,e.command,a,e.callback)}catch(e){e&&adapter.log.error(e)}}break;case"testWebDAV":if(e.message){const{createClient:a}=await import("webdav"),r=new(require("node:https").Agent)({rejectUnauthorized:Boolean(e.message.config.signedCertificates)});a(e.message.config.host,{username:e.message.config.username,password:e.message.config.password,maxBodyLength:1/0,httpsAgent:r}).getDirectoryContents("").then((a=>e.callback&&adapter.sendTo(e.from,e.command,a,e.callback))).catch((a=>adapter.sendTo(e.from,e.command,{error:JSON.stringify(a.message)},e.callback)))}break;case"slaveBackup":if(e?.message)if("Slave"===adapter.config.hostType){adapter.log.debug("Slave Backup started ...");const a="iobroker";let r;try{r=JSON.parse(JSON.stringify(backupConfig[a])),r.enabled=!0,r.deleteBackupAfter=e.message.config.deleteAfter?e.message.config.deleteAfter:0}catch(e){adapter.log.warn(`backup error: ${e} ... please check your config and try again!!`)}startBackup(r,(r=>{r?adapter.log.error(`[${a}] ${r}`):adapter.log.debug(`[${a}] exec: done`),timerOutput=setTimeout((()=>adapter.getState("output.line",((r,t)=>{if(t&&"[EXIT] 0"===t.val){adapter.setState(`history.${a}Success`,!0,!0),adapter.setState(`history.${a}LastTime`,tools.getTimeString(systemLang),!0);try{adapter.sendTo(e.from,e.command,t.val,e.callback)}catch(r){r&&adapter.log.error(r),adapter.log.error("slave Backup not finish!")}adapter.config.onedriveEnabled&&renewOnedriveToken()}else if(adapter.setState(`history.${a}LastTime`,`error: ${tools.getTimeString(systemLang)}`,!0),adapter.setState(`history.${a}Success`,!1,!0),t&&t.val)try{adapter.sendTo(e.from,e.command,t.val,e.callback)}catch(r){r&&adapter.log.error(r),adapter.log.error("slave Backup not finish!")}}))),500),adapter.setState(`oneClick.${a}`,!1,!0)}))}else adapter.log.warn("Your BackItUp Instance is not configured as a slave"),adapter.sendTo(e.from,e.command,"not configured as a slave",e.callback);break;case"slaveInstance":if(e&&"slaveInstance"===e.command&&e.message&&e.message.instance){let a=[];const r=await adapter.getObjectViewAsync("system","instance",{startkey:`system.adapter.${e.message.instance}.`,endkey:`system.adapter.${e.message.instance}.香`}).catch((e=>adapter.log.error(e)));r&&r.rows&&0!=r.rows.length&&r.rows.forEach((async e=>{e.id.replace("system.adapter.","")!=adapter.namespace&&a.push({label:e.id.replace("system.adapter.",""),value:e.id.replace("system.adapter.","")})})),adapter.sendTo(e.from,e.command,a,e.callback)}break;case"getLog":const t=path.join(bashDir,`${adapter.namespace}.log`).replace(/\\/g,"/");if(fs.existsSync(t)&&(e?.message.backupName||e?.message.timestamp)){const a=fs.readFileSync(t,"utf8"),r=JSON.parse(a),i=e?.message.backupName?e.message.backupName:null,o=e?.message.timestamp;let n=!1;r.forEach(((a,t)=>{a.hasOwnProperty(o)?(n=!0,adapter.log.debug("Printing logs of previous backup"),adapter.sendTo(e.from,e.command,a[o],e.callback)):null!==i&&a.hasOwnProperty(i)?(n=!0,adapter.log.debug("Printing logs of previous backup"),adapter.sendTo(e.from,e.command,a[i],e.callback)):r.length-1!=t||n||(adapter.log.debug("No Backuplogs found"),adapter.sendTo(e.from,e.command,tools._("No log is available for this backup",systemLang),e.callback))}))}}})),adapter}async function checkStates(){const e=await adapter.getStateAsync("history.html");e&&null!==e.val||await adapter.setStateAsync("history.html",{val:`<span class="backup-type-total">${tools._("No backups yet",systemLang)}</span>`,ack:!0});const a=await adapter.getStateAsync("history.iobrokerLastTime");a&&null!==a.val||await adapter.setStateAsync("history.iobrokerLastTime",{val:tools._("No backups yet",systemLang),ack:!0});const r=await adapter.getStateAsync("history.ccuLastTime");r&&null!==r.val||await adapter.setStateAsync("history.ccuLastTime",{val:tools._("No backups yet",systemLang),ack:!0});const t=await adapter.getStateAsync("oneClick.iobroker");t&&null!==t.val&&!0!==t.val||await adapter.setStateAsync("oneClick.iobroker",{val:!1,ack:!0});const i=await adapter.getStateAsync("oneClick.ccu");i&&null!==i.val&&!0!==i.val||await adapter.setStateAsync("oneClick.ccu",{val:!1,ack:!0});const o=await adapter.getStateAsync("history.ccuSuccess");o&&null!==o.val||await adapter.setStateAsync("history.ccuSuccess",{val:!1,ack:!0});const n=await adapter.getStateAsync("history.iobrokerSuccess");n&&null!==n.val||await adapter.setStateAsync("history.iobrokerSuccess",{val:!1,ack:!0});const s=await adapter.getStateAsync("history.json");s&&null!==s.val||await adapter.setStateAsync("history.json",{val:"[]",ack:!0})}function createBackupSchedule(){for(const e in backupConfig){if(!backupConfig.hasOwnProperty(e))continue;const a=backupConfig[e];if(!0===a.enabled||"true"===a.enabled){let r=a.ownCron?a.cronjob:a.time.split(":");const t=a.ownCron?`with Cronjob "${a.cronjob}"`:`at ${a.time} every ${a.everyXDays} day(s)`;adapter.log.info(`[${e}] backup will be activated ${t}`),backupTimeSchedules[e]&&backupTimeSchedules[e].cancel();const i=a.ownCron?r:`10 ${r[1]} ${r[0]} */${a.everyXDays} * * `;backupTimeSchedules[e]=schedule.scheduleJob(i,(async()=>{const a=await systemCheck.storageSizeCheck(adapter,adapterName,adapter.log);a&&a.ready&&!0===a.ready||!0===adapter.config.cifsEnabled?(adapter.setState(`oneClick.${e}`,!0,!0),startBackup(backupConfig[e],(a=>{a?adapter.log.error(`[${e}] ${a}`):adapter.log.debug(`[${e}] exec: done`),timerOutput2=setTimeout((()=>adapter.getState("output.line",((a,r)=>{r&&"[EXIT] 0"===r.val?(adapter.setState(`history.${e}Success`,!0,!0),adapter.setState(`history.${e}LastTime`,tools.getTimeString(systemLang),!0),adapter.config.onedriveEnabled&&"Single"===adapter.config.hostType&&renewOnedriveToken()):(adapter.setState(`history.${e}LastTime`,`error: ${tools.getTimeString(systemLang)}`,!0),adapter.setState(`history.${e}Success`,!1,!0))}))),500),nextBackup(!1,e),adapter.setState(`oneClick.${e}`,!1,!0),adapter.config.slaveInstance&&"iobroker"===e&&"Master"===adapter.config.hostType&&(adapter.log.debug("Slave backup from BackItUp-Master is started ..."),startSlaveBackup(adapter.config.slaveInstance[0],null))}))):(adapter.log.error(`A local backup is currently not possible. The storage space is currently only ${a&&a.diskFree?a.diskFree:null} MB`),systemCheck.systemMessage(adapter,tools._("A local backup is currently not possible. Please check your System!",systemLang)))})),a.debugging&&adapter.log.debug(`[${e}] ${i}`)}else backupTimeSchedules[e]&&(adapter.log.info(`[${e}] backup deactivated`),backupTimeSchedules[e].cancel(),backupTimeSchedules[e]=null)}}async function initConfig(e){return new Promise((async a=>{let r;"CIFS"===adapter.config.cifsMount&&(adapter.config.cifsMount=""),void 0===adapter.config.redisEnabled&&(adapter.config.redisEnabled=adapter.config.backupRedis);try{r=path.resolve(__dirname,"../iobroker.js-controller/iobroker.js")}catch(e){adapter.log.error(`Unable to read iobroker path: +${e}`)}decryptEvents(e);const t={enabled:adapter.config.notificationEnabled,notificationsType:adapter.config.notificationsType,type:"message",instance:adapter.config.telegramInstance,SilentNotice:adapter.config.telegramSilentNotice,NoticeType:adapter.config.telegramNoticeType,User:adapter.config.telegramUser,onlyError:adapter.config.telegramOnlyError,telegramWaiting:1e3*adapter.config.telegramWaitToSend,hostName:adapter.config.minimalNameSuffix?adapter.config.minimalNameSuffix.replace(/[.;, ]/g,"_"):"",ignoreErrors:adapter.config.ignoreErrors,systemLang:systemLang},i={enabled:adapter.config.notificationEnabled,notificationsType:adapter.config.notificationsType,type:"message",instance:adapter.config.whatsappInstance,NoticeType:adapter.config.whatsappNoticeType,onlyError:adapter.config.whatsappOnlyError,whatsappWaiting:1e3*adapter.config.whatsappWaitToSend,hostName:adapter.config.minimalNameSuffix?adapter.config.minimalNameSuffix.replace(/[.;, ]/g,"_"):"",ignoreErrors:adapter.config.ignoreErrors,systemLang:systemLang},o={enabled:adapter.config.notificationEnabled,notificationsType:adapter.config.notificationsType,type:"message",instance:adapter.config.gotifyInstance,NoticeType:adapter.config.gotifyNoticeType,onlyError:adapter.config.gotifyOnlyError,gotifyWaiting:1e3*adapter.config.gotifyWaitToSend,hostName:adapter.config.minimalNameSuffix?adapter.config.minimalNameSuffix.replace(/[.;, ]/g,"_"):"",ignoreErrors:adapter.config.ignoreErrors,systemLang:systemLang},n={enabled:adapter.config.notificationEnabled,notificationsType:adapter.config.notificationsType,type:"message",instance:adapter.config.signalInstance,NoticeType:adapter.config.signalNoticeType,onlyError:adapter.config.signalOnlyError,signalWaiting:1e3*adapter.config.signalWaitToSend,hostName:adapter.config.minimalNameSuffix?adapter.config.minimalNameSuffix.replace(/[.;, ]/g,"_"):"",ignoreErrors:adapter.config.ignoreErrors,systemLang:systemLang},s={enabled:adapter.config.notificationEnabled,notificationsType:adapter.config.notificationsType,type:"message",instance:adapter.config.matrixInstance,NoticeType:adapter.config.matrixNoticeType,onlyError:adapter.config.matrixOnlyError,matrixWaiting:1e3*adapter.config.matrixWaitToSend,hostName:adapter.config.minimalNameSuffix?adapter.config.minimalNameSuffix.replace(/[.;, ]/g,"_"):"",ignoreErrors:adapter.config.ignoreErrors,systemLang:systemLang},c={enabled:adapter.config.notificationEnabled,notificationsType:adapter.config.notificationsType,type:"message",instance:adapter.config.discordInstance,NoticeType:adapter.config.discordNoticeType,target:adapter.config.discordTarget,onlyError:adapter.config.discordOnlyError,discordWaiting:1e3*adapter.config.discordWaitToSend,hostName:adapter.config.minimalNameSuffix?adapter.config.minimalNameSuffix.replace(/[.;, ]/g,"_"):"",ignoreErrors:adapter.config.ignoreErrors,systemLang:systemLang},d={enabled:adapter.config.notificationEnabled,notificationsType:adapter.config.notificationsType,type:"message",instance:adapter.config.pushoverInstance,SilentNotice:adapter.config.pushoverSilentNotice,NoticeType:adapter.config.pushoverNoticeType,deviceID:adapter.config.pushoverDeviceID,onlyError:adapter.config.pushoverOnlyError,pushoverWaiting:1e3*adapter.config.pushoverWaitToSend,hostName:adapter.config.minimalNameSuffix?adapter.config.minimalNameSuffix.replace(/[.;, ]/g,"_"):"",ignoreErrors:adapter.config.ignoreErrors,systemLang:systemLang},p={enabled:adapter.config.notificationEnabled,notificationsType:adapter.config.notificationsType,type:"message",instance:adapter.config.emailInstance,NoticeType:adapter.config.emailNoticeType,emailReceiver:adapter.config.emailReceiver,emailSender:adapter.config.emailSender,onlyError:adapter.config.emailOnlyError,emailWaiting:1e3*adapter.config.emailWaitToSend,hostName:adapter.config.minimalNameSuffix?adapter.config.minimalNameSuffix.replace(/[.;, ]/g,"_"):"",ignoreErrors:adapter.config.ignoreErrors,systemLang:systemLang},g={type:"message",ignoreErrors:adapter.config.ignoreErrors,bashDir:bashDir,entriesNumber:adapter.config.historyEntriesNumber,systemLang:systemLang},l={enabled:!0,type:"message",entriesNumber:adapter.config.historyEntriesNumber,ignoreErrors:adapter.config.ignoreErrors,systemLang:systemLang},f={enabled:!0,type:"message",entriesNumber:adapter.config.historyEntriesNumber,ignoreErrors:adapter.config.ignoreErrors,systemLang:systemLang},b={enabled:adapter.config.ftpEnabled,type:"storage",source:adapter.config.restoreSource,host:adapter.config.ftpHost,debugging:adapter.config.debugLevel,deleteOldBackup:adapter.config.ftpDeleteOldBackup,ftpDeleteAfter:adapter.config.ftpDeleteAfter,advancedDelete:adapter.config.advancedDelete,ownDir:adapter.config.ftpOwnDir,bkpType:adapter.config.restoreType,dir:!0===adapter.config.ftpOwnDir?null:adapter.config.ftpDir,dirMinimal:adapter.config.ftpMinimalDir,user:adapter.config.ftpUser,pass:adapter.config.ftpPassword||"",port:adapter.config.ftpPort||21,secure:adapter.config.ftpSecure||!1,signedCertificates:adapter.config.ftpSignedCertificates||!0,ignoreErrors:adapter.config.ignoreErrors};let u="";if(adapter.config.dropboxEnabled){dropBoxTokenRefresher=new TokenRefresher(adapter,"info.dropboxTokens","https://oauth2.iobroker.in/dropbox");try{u=await dropBoxTokenRefresher.getAccessToken()}catch(e){adapter.log.error(`No DropBox token found: ${e}`)}}const m={enabled:adapter.config.dropboxEnabled,type:"storage",source:adapter.config.restoreSource,debugging:adapter.config.debugLevel,deleteOldBackup:adapter.config.dropboxDeleteOldBackup,dropboxDeleteAfter:adapter.config.dropboxDeleteAfter,advancedDelete:adapter.config.advancedDelete,accessToken:"custom"===adapter.config.dropboxTokenType?adapter.config.dropboxAccessToken:u,dropboxAccessJson:adapter.config.dropboxAccessJson,dropboxTokenType:adapter.config.dropboxTokenType,ownDir:adapter.config.dropboxOwnDir,bkpType:adapter.config.restoreType,dir:!0===adapter.config.dropboxOwnDir?null:adapter.config.dropboxDir,dirMinimal:adapter.config.dropboxMinimalDir,ignoreErrors:adapter.config.ignoreErrors},y={enabled:adapter.config.onedriveEnabled,type:"storage",source:adapter.config.restoreSource,debugging:adapter.config.debugLevel,deleteOldBackup:adapter.config.onedriveDeleteOldBackup,onedriveDeleteAfter:adapter.config.onedriveDeleteAfter,advancedDelete:adapter.config.advancedDelete,onedriveAccessJson:adapter.config.onedriveAccessJson,ownDir:adapter.config.onedriveOwnDir,bkpType:adapter.config.restoreType,dir:!0===adapter.config.onedriveOwnDir?null:adapter.config.onedriveDir,dirMinimal:adapter.config.onedriveMinimalDir,ignoreErrors:adapter.config.ignoreErrors},h={enabled:adapter.config.webdavEnabled,type:"storage",source:adapter.config.restoreSource,debugging:adapter.config.debugLevel,deleteOldBackup:adapter.config.webdavDeleteOldBackup,webdavDeleteAfter:adapter.config.webdavDeleteAfter,advancedDelete:adapter.config.advancedDelete,username:adapter.config.webdavUsername,pass:adapter.config.webdavPassword||"",url:adapter.config.webdavURL,ownDir:adapter.config.webdavOwnDir,bkpType:adapter.config.restoreType,dir:!0===adapter.config.webdavOwnDir?null:adapter.config.webdavDir,dirMinimal:adapter.config.webdavMinimalDir,signedCertificates:adapter.config.webdavSignedCertificates,ignoreErrors:adapter.config.ignoreErrors},v={enabled:adapter.config.googledriveEnabled,type:"storage",source:adapter.config.restoreSource,debugging:adapter.config.debugLevel,deleteOldBackup:adapter.config.googledriveDeleteOldBackup,googledriveDeleteAfter:adapter.config.googledriveDeleteAfter,advancedDelete:adapter.config.advancedDelete,accessJson:adapter.config.googledriveAccessTokens||adapter.config.googledriveAccessJson,newToken:!!adapter.config.googledriveAccessTokens,ownDir:adapter.config.googledriveOwnDir,bkpType:adapter.config.restoreType,dir:!0===adapter.config.googledriveOwnDir?null:adapter.config.googledriveDir,dirMinimal:adapter.config.googledriveMinimalDir,ignoreErrors:adapter.config.ignoreErrors},D={enabled:adapter.config.cifsEnabled,mountType:adapter.config.connectType,type:"storage",source:adapter.config.restoreSource,mount:adapter.config.cifsMount,debugging:adapter.config.debugLevel,fileDir:bashDir,wakeOnLAN:adapter.config.wakeOnLAN,macAd:adapter.config.macAd,wolTime:adapter.config.wolWait,wolPort:adapter.config.wolPort||9,wolExtra:adapter.config.wolExtra,smb:adapter.config.smbType,sudo:adapter.config.sudoMount,cifsDomain:adapter.config.cifsDomain,clientInodes:adapter.config.noserverino,cacheLoose:adapter.config.cacheLoose,deleteOldBackup:adapter.config.cifsDeleteOldBackup,ownDir:adapter.config.cifsOwnDir,bkpType:adapter.config.restoreType,dir:!0===adapter.config.cifsOwnDir?null:adapter.config.cifsDir,dirMinimal:adapter.config.cifsMinimalDir,user:adapter.config.cifsUser,pass:adapter.config.cifsPassword||"",expertMount:adapter.config.expertMount,ignoreErrors:adapter.config.ignoreErrors};backupConfig.iobroker={name:"iobroker",type:"creator",workDir:r,enabled:adapter.config.minimalEnabled,time:adapter.config.minimalTime,cronjob:adapter.config.iobrokerCronJob,ownCron:adapter.config.iobrokerCron,debugging:adapter.config.debugLevel,slaveBackup:adapter.config.hostType,everyXDays:adapter.config.minimalEveryXDays,nameSuffix:adapter.config.minimalNameSuffix.replace(/[.;, ]/g,"_"),deleteBackupAfter:adapter.config.minimalDeleteAfter,ftp:Object.assign({},b,!0===adapter.config.ftpOwnDir?{dir:adapter.config.ftpMinimalDir}:{}),cifs:Object.assign({},D,!0===adapter.config.cifsOwnDir?{dir:adapter.config.cifsMinimalDir}:{}),dropbox:Object.assign({},m,!0===adapter.config.dropboxOwnDir?{dir:adapter.config.dropboxMinimalDir}:{}),onedrive:Object.assign({},y,!0===adapter.config.onedriveOwnDir?{dir:adapter.config.onedriveMinimalDir}:{}),webdav:Object.assign({},h,!0===adapter.config.webdavOwnDir?{dir:adapter.config.webdavMinimalDir}:{}),googledrive:Object.assign({},v,!0===adapter.config.googledriveOwnDir?{dir:adapter.config.googledriveMinimalDir}:{}),ignoreErrors:adapter.config.ignoreErrors,mysql:{enabled:void 0===adapter.config.mySqlEnabled||adapter.config.mySqlEnabled,type:"creator",ftp:Object.assign({},b,!0===adapter.config.ftpOwnDir?{dir:adapter.config.ftpMinimalDir}:{}),cifs:Object.assign({},D,!0===adapter.config.cifsOwnDir?{dir:adapter.config.cifsMinimalDir}:{}),dropbox:Object.assign({},m,!0===adapter.config.dropboxOwnDir?{dir:adapter.config.dropboxMinimalDir}:{}),onedrive:Object.assign({},y,!0===adapter.config.onedriveOwnDir?{dir:adapter.config.onedriveMinimalDir}:{}),webdav:Object.assign({},h,!0===adapter.config.webdavOwnDir?{dir:adapter.config.webdavMinimalDir}:{}),googledrive:Object.assign({},v,!0===adapter.config.googledriveOwnDir?{dir:adapter.config.googledriveMinimalDir}:{}),nameSuffix:adapter.config.minimalNameSuffix.replace(/[.;, ]/g,"_"),mysqlQuick:adapter.config.mysqlQuick,slaveSuffix:"Slave"===adapter.config.hostType?adapter.config.slaveNameSuffix:"",hostType:adapter.config.hostType,mysqlSingleTransaction:adapter.config.mysqlSingleTransaction,dbName:adapter.config.mySqlName,user:adapter.config.mySqlUser,pass:adapter.config.mySqlPassword||"",deleteBackupAfter:adapter.config.mySqlDeleteAfter,host:adapter.config.mySqlHost,port:adapter.config.mySqlPort,mySqlEvents:adapter.config.mySqlEvents,mySqlMulti:adapter.config.mySqlMulti,ignoreErrors:adapter.config.ignoreErrors,skipSSL:adapter.config.mysqlSkipSSL,exe:adapter.config.mySqlDumpExe},sqlite:{enabled:void 0===adapter.config.sqliteEnabled||adapter.config.sqliteEnabled,type:"creator",ftp:Object.assign({},b,!0===adapter.config.ftpOwnDir?{dir:adapter.config.ftpMinimalDir}:{}),cifs:Object.assign({},D,!0===adapter.config.cifsOwnDir?{dir:adapter.config.cifsMinimalDir}:{}),dropbox:Object.assign({},m,!0===adapter.config.dropboxOwnDir?{dir:adapter.config.dropboxMinimalDir}:{}),onedrive:Object.assign({},y,!0===adapter.config.onedriveOwnDir?{dir:adapter.config.onedriveMinimalDir}:{}),webdav:Object.assign({},h,!0===adapter.config.webdavOwnDir?{dir:adapter.config.webdavMinimalDir}:{}),googledrive:Object.assign({},v,!0===adapter.config.googledriveOwnDir?{dir:adapter.config.googledriveMinimalDir}:{}),nameSuffix:adapter.config.minimalNameSuffix.replace(/[.;, ]/g,"_"),slaveSuffix:"Slave"===adapter.config.hostType?adapter.config.slaveNameSuffix:"",hostType:adapter.config.hostType,deleteBackupAfter:adapter.config.sqliteDeleteAfter,ignoreErrors:adapter.config.ignoreErrors,filePth:adapter.config.sqlitePath,exe:adapter.config.sqliteDumpExe},dir:tools.getIobDir(),influxDB:{enabled:void 0===adapter.config.influxDBEnabled||adapter.config.influxDBEnabled,type:"creator",ftp:Object.assign({},b,!0===adapter.config.ftpOwnDir?{dir:adapter.config.ftpMinimalDir}:{}),cifs:Object.assign({},D,!0===adapter.config.cifsOwnDir?{dir:adapter.config.cifsMinimalDir}:{}),dropbox:Object.assign({},m,!0===adapter.config.dropboxOwnDir?{dir:adapter.config.dropboxMinimalDir}:{}),onedrive:Object.assign({},y,!0===adapter.config.onedriveOwnDir?{dir:adapter.config.onedriveMinimalDir}:{}),webdav:Object.assign({},h,!0===adapter.config.webdavOwnDir?{dir:adapter.config.webdavMinimalDir}:{}),googledrive:Object.assign({},v,!0===adapter.config.googledriveOwnDir?{dir:adapter.config.googledriveMinimalDir}:{}),nameSuffix:adapter.config.minimalNameSuffix.replace(/[.;, ]/g,"_"),slaveSuffix:"Slave"===adapter.config.hostType?adapter.config.slaveNameSuffix:"",hostType:adapter.config.hostType,deleteBackupAfter:adapter.config.influxDBDeleteAfter,dbName:adapter.config.influxDBName,host:adapter.config.influxDBHost,port:adapter.config.influxDBPort?adapter.config.influxDBPort:"1.x"==adapter.config.influxDBVersion?8088:8086,dbversion:adapter.config.influxDBVersion,token:adapter.config.influxDBToken,protocol:adapter.config.influxDBProtocol,exe:adapter.config.influxDBDumpExe,dbType:adapter.config.influxDBType,influxDBEvents:adapter.config.influxDBEvents,influxDBMulti:adapter.config.influxDBMulti,ignoreErrors:adapter.config.ignoreErrors,deleteDataBase:adapter.config.deleteOldDataBase},pgsql:{enabled:void 0===adapter.config.pgSqlEnabled||adapter.config.pgSqlEnabled,type:"creator",ftp:Object.assign({},b,!0===adapter.config.ftpOwnDir?{dir:adapter.config.ftpMinimalDir}:{}),cifs:Object.assign({},D,!0===adapter.config.cifsOwnDir?{dir:adapter.config.cifsMinimalDir}:{}),dropbox:Object.assign({},m,!0===adapter.config.dropboxOwnDir?{dir:adapter.config.dropboxMinimalDir}:{}),onedrive:Object.assign({},y,!0===adapter.config.onedriveOwnDir?{dir:adapter.config.onedriveMinimalDir}:{}),webdav:Object.assign({},h,!0===adapter.config.webdavOwnDir?{dir:adapter.config.webdavMinimalDir}:{}),googledrive:Object.assign({},v,!0===adapter.config.googledriveOwnDir?{dir:adapter.config.googledriveMinimalDir}:{}),nameSuffix:adapter.config.minimalNameSuffix.replace(/[.;, ]/g,"_"),slaveSuffix:"Slave"===adapter.config.hostType?adapter.config.slaveNameSuffix:"",hostType:adapter.config.hostType,dbName:adapter.config.pgSqlName,user:adapter.config.pgSqlUser,pass:adapter.config.pgSqlPassword||"",deleteBackupAfter:adapter.config.pgSqlDeleteAfter,host:adapter.config.pgSqlHost,port:adapter.config.pgSqlPort,pgSqlEvents:adapter.config.pgSqlEvents,pgSqlMulti:adapter.config.pgSqlMulti,ignoreErrors:adapter.config.ignoreErrors,exe:adapter.config.pgSqlDumpExe},redis:{enabled:adapter.config.redisEnabled,type:"creator",ftp:Object.assign({},b,!0===adapter.config.ftpOwnDir?{dir:adapter.config.ftpMinimalDir}:{}),cifs:Object.assign({},D,!0===adapter.config.cifsOwnDir?{dir:adapter.config.cifsMinimalDir}:{}),dropbox:Object.assign({},m,!0===adapter.config.dropboxOwnDir?{dir:adapter.config.dropboxMinimalDir}:{}),onedrive:Object.assign({},y,!0===adapter.config.onedriveOwnDir?{dir:adapter.config.onedriveMinimalDir}:{}),webdav:Object.assign({},h,!0===adapter.config.webdavOwnDir?{dir:adapter.config.webdavMinimalDir}:{}),googledrive:Object.assign({},v,!0===adapter.config.googledriveOwnDir?{dir:adapter.config.googledriveMinimalDir}:{}),aof:adapter.config.redisAOFactive,nameSuffix:adapter.config.minimalNameSuffix.replace(/[.;, ]/g,"_"),slaveSuffix:"Slave"===adapter.config.hostType?adapter.config.slaveNameSuffix:"",hostType:adapter.config.hostType,path:adapter.config.redisPath||"/var/lib/redis",redisType:adapter.config.redisType,host:adapter.config.redisHost,port:adapter.config.redisPort,user:adapter.config.redisUser,pass:adapter.config.redisPassword||"",ignoreErrors:adapter.config.ignoreErrors},historyDB:{enabled:adapter.config.historyEnabled,type:"creator",ftp:Object.assign({},b,!0===adapter.config.ftpOwnDir?{dir:adapter.config.ftpMinimalDir}:{}),cifs:Object.assign({},D,!0===adapter.config.cifsOwnDir?{dir:adapter.config.cifsMinimalDir}:{}),dropbox:Object.assign({},m,!0===adapter.config.dropboxOwnDir?{dir:adapter.config.dropboxMinimalDir}:{}),onedrive:Object.assign({},y,!0===adapter.config.onedriveOwnDir?{dir:adapter.config.onedriveMinimalDir}:{}),webdav:Object.assign({},h,!0===adapter.config.webdavOwnDir?{dir:adapter.config.webdavMinimalDir}:{}),googledrive:Object.assign({},v,!0===adapter.config.googledriveOwnDir?{dir:adapter.config.googledriveMinimalDir}:{}),path:adapter.config.historyPath,nameSuffix:adapter.config.minimalNameSuffix.replace(/[.;, ]/g,"_"),slaveSuffix:"Slave"===adapter.config.hostType?adapter.config.slaveNameSuffix:"",hostType:adapter.config.hostType,ignoreErrors:adapter.config.ignoreErrors},zigbee:{enabled:adapter.config.zigbeeEnabled,type:"creator",ftp:Object.assign({},b,!0===adapter.config.ftpOwnDir?{dir:adapter.config.ftpMinimalDir}:{}),cifs:Object.assign({},D,!0===adapter.config.cifsOwnDir?{dir:adapter.config.cifsMinimalDir}:{}),dropbox:Object.assign({},m,!0===adapter.config.dropboxOwnDir?{dir:adapter.config.dropboxMinimalDir}:{}),onedrive:Object.assign({},y,!0===adapter.config.onedriveOwnDir?{dir:adapter.config.onedriveMinimalDir}:{}),webdav:Object.assign({},h,!0===adapter.config.webdavOwnDir?{dir:adapter.config.webdavMinimalDir}:{}),googledrive:Object.assign({},v,!0===adapter.config.googledriveOwnDir?{dir:adapter.config.googledriveMinimalDir}:{}),path:path.join(tools.getIobDir(),"iobroker-data"),nameSuffix:adapter.config.minimalNameSuffix.replace(/[.;, ]/g,"_"),slaveSuffix:"Slave"===adapter.config.hostType?adapter.config.slaveNameSuffix:"",hostType:adapter.config.hostType,ignoreErrors:adapter.config.ignoreErrors},esphome:{enabled:adapter.config.esphomeEnabled,type:"creator",ftp:Object.assign({},b,!0===adapter.config.ftpOwnDir?{dir:adapter.config.ftpMinimalDir}:{}),cifs:Object.assign({},D,!0===adapter.config.cifsOwnDir?{dir:adapter.config.cifsMinimalDir}:{}),dropbox:Object.assign({},m,!0===adapter.config.dropboxOwnDir?{dir:adapter.config.dropboxMinimalDir}:{}),onedrive:Object.assign({},y,!0===adapter.config.onedriveOwnDir?{dir:adapter.config.onedriveMinimalDir}:{}),webdav:Object.assign({},h,!0===adapter.config.webdavOwnDir?{dir:adapter.config.webdavMinimalDir}:{}),googledrive:Object.assign({},v,!0===adapter.config.googledriveOwnDir?{dir:adapter.config.googledriveMinimalDir}:{}),path:path.join(tools.getIobDir(),"iobroker-data"),nameSuffix:adapter.config.minimalNameSuffix.replace(/[.;, ]/g,"_"),slaveSuffix:"Slave"===adapter.config.hostType?adapter.config.slaveNameSuffix:"",hostType:adapter.config.hostType,ignoreErrors:adapter.config.ignoreErrors},zigbee2mqtt:{enabled:adapter.config.zigbee2mqttEnabled,type:"creator",ftp:Object.assign({},b,!0===adapter.config.ftpOwnDir?{dir:adapter.config.ftpMinimalDir}:{}),cifs:Object.assign({},D,!0===adapter.config.cifsOwnDir?{dir:adapter.config.cifsMinimalDir}:{}),dropbox:Object.assign({},m,!0===adapter.config.dropboxOwnDir?{dir:adapter.config.dropboxMinimalDir}:{}),onedrive:Object.assign({},y,!0===adapter.config.onedriveOwnDir?{dir:adapter.config.onedriveMinimalDir}:{}),webdav:Object.assign({},h,!0===adapter.config.webdavOwnDir?{dir:adapter.config.webdavMinimalDir}:{}),googledrive:Object.assign({},v,!0===adapter.config.googledriveOwnDir?{dir:adapter.config.googledriveMinimalDir}:{}),path:adapter.config.zigbee2mqttPath,z2mType:adapter.config.zigbee2mqttType,z2mUsername:adapter.config.zigbee2mqttUser,z2mPassword:adapter.config.zigbee2mqttPassword,z2mUrl:adapter.config.zigbee2mqttHost,z2mPort:adapter.config.zigbee2mqttPort,z2mBaseTopic:adapter.config.zigbee2mqttBaseTopic,z2mAuth:adapter.config.zigbee2mqttAuth,nameSuffix:adapter.config.minimalNameSuffix.replace(/[.;, ]/g,"_"),slaveSuffix:"Slave"===adapter.config.hostType?adapter.config.slaveNameSuffix:"",hostType:adapter.config.hostType,ignoreErrors:adapter.config.ignoreErrors},nodered:{enabled:adapter.config.noderedEnabled,type:"creator",ftp:Object.assign({},b,!0===adapter.config.ftpOwnDir?{dir:adapter.config.ftpMinimalDir}:{}),cifs:Object.assign({},D,!0===adapter.config.cifsOwnDir?{dir:adapter.config.cifsMinimalDir}:{}),dropbox:Object.assign({},m,!0===adapter.config.dropboxOwnDir?{dir:adapter.config.dropboxMinimalDir}:{}),onedrive:Object.assign({},y,!0===adapter.config.onedriveOwnDir?{dir:adapter.config.onedriveMinimalDir}:{}),webdav:Object.assign({},h,!0===adapter.config.webdavOwnDir?{dir:adapter.config.webdavMinimalDir}:{}),googledrive:Object.assign({},v,!0===adapter.config.googledriveOwnDir?{dir:adapter.config.googledriveMinimalDir}:{}),path:path.join(tools.getIobDir(),"iobroker-data"),nameSuffix:adapter.config.minimalNameSuffix.replace(/[.;, ]/g,"_"),slaveSuffix:"Slave"===adapter.config.hostType?adapter.config.slaveNameSuffix:"",hostType:adapter.config.hostType,ignoreErrors:adapter.config.ignoreErrors},yahka:{enabled:adapter.config.yahkaEnabled,type:"creator",ftp:Object.assign({},b,!0===adapter.config.ftpOwnDir?{dir:adapter.config.ftpMinimalDir}:{}),cifs:Object.assign({},D,!0===adapter.config.cifsOwnDir?{dir:adapter.config.cifsMinimalDir}:{}),dropbox:Object.assign({},m,!0===adapter.config.dropboxOwnDir?{dir:adapter.config.dropboxMinimalDir}:{}),onedrive:Object.assign({},y,!0===adapter.config.onedriveOwnDir?{dir:adapter.config.onedriveMinimalDir}:{}),webdav:Object.assign({},h,!0===adapter.config.webdavOwnDir?{dir:adapter.config.webdavMinimalDir}:{}),googledrive:Object.assign({},v,!0===adapter.config.googledriveOwnDir?{dir:adapter.config.googledriveMinimalDir}:{}),path:path.join(tools.getIobDir(),"iobroker-data"),nameSuffix:adapter.config.minimalNameSuffix.replace(/[.;, ]/g,"_"),slaveSuffix:"Slave"===adapter.config.hostType?adapter.config.slaveNameSuffix:"",hostType:adapter.config.hostType,ignoreErrors:adapter.config.ignoreErrors},jarvis:{enabled:adapter.config.jarvisEnabled,type:"creator",ftp:Object.assign({},b,!0===adapter.config.ftpOwnDir?{dir:adapter.config.ftpMinimalDir}:{}),cifs:Object.assign({},D,!0===adapter.config.cifsOwnDir?{dir:adapter.config.cifsMinimalDir}:{}),dropbox:Object.assign({},m,!0===adapter.config.dropboxOwnDir?{dir:adapter.config.dropboxMinimalDir}:{}),onedrive:Object.assign({},y,!0===adapter.config.onedriveOwnDir?{dir:adapter.config.onedriveMinimalDir}:{}),webdav:Object.assign({},h,!0===adapter.config.webdavOwnDir?{dir:adapter.config.webdavMinimalDir}:{}),googledrive:Object.assign({},v,!0===adapter.config.googledriveOwnDir?{dir:adapter.config.googledriveMinimalDir}:{}),path:path.join(tools.getIobDir(),"iobroker-data"),nameSuffix:adapter.config.minimalNameSuffix.replace(/[.;, ]/g,"_"),slaveSuffix:"Slave"===adapter.config.hostType?adapter.config.slaveNameSuffix:"",hostType:adapter.config.hostType,ignoreErrors:adapter.config.ignoreErrors},javascripts:{enabled:adapter.config.javascriptsEnabled,type:"creator",ftp:Object.assign({},b,!0===adapter.config.ftpOwnDir?{dir:adapter.config.ftpMinimalDir}:{}),cifs:Object.assign({},D,!0===adapter.config.cifsOwnDir?{dir:adapter.config.cifsMinimalDir}:{}),dropbox:Object.assign({},m,!0===adapter.config.dropboxOwnDir?{dir:adapter.config.dropboxMinimalDir}:{}),onedrive:Object.assign({},y,!0===adapter.config.onedriveOwnDir?{dir:adapter.config.onedriveMinimalDir}:{}),webdav:Object.assign({},h,!0===adapter.config.webdavOwnDir?{dir:adapter.config.webdavMinimalDir}:{}),googledrive:Object.assign({},v,!0===adapter.config.googledriveOwnDir?{dir:adapter.config.googledriveMinimalDir}:{}),slaveSuffix:"Slave"===adapter.config.hostType?adapter.config.slaveNameSuffix:"",hostType:adapter.config.hostType,nameSuffix:adapter.config.minimalNameSuffix.replace(/[.;, ]/g,"_"),ignoreErrors:adapter.config.ignoreErrors},grafana:{enabled:adapter.config.grafanaEnabled,type:"creator",ftp:Object.assign({},b,!0===adapter.config.ftpOwnDir?{dir:adapter.config.ftpMinimalDir}:{}),cifs:Object.assign({},D,!0===adapter.config.cifsOwnDir?{dir:adapter.config.cifsMinimalDir}:{}),dropbox:Object.assign({},m,!0===adapter.config.dropboxOwnDir?{dir:adapter.config.dropboxMinimalDir}:{}),onedrive:Object.assign({},y,!0===adapter.config.onedriveOwnDir?{dir:adapter.config.onedriveMinimalDir}:{}),webdav:Object.assign({},h,!0===adapter.config.webdavOwnDir?{dir:adapter.config.webdavMinimalDir}:{}),googledrive:Object.assign({},v,!0===adapter.config.googledriveOwnDir?{dir:adapter.config.googledriveMinimalDir}:{}),host:adapter.config.grafanaHost,port:adapter.config.grafanaPort,protocol:adapter.config.grafanaProtocol,apiKey:adapter.config.grafanaApiKey,nameSuffix:adapter.config.minimalNameSuffix.replace(/[.;, ]/g,"_"),slaveSuffix:"Slave"===adapter.config.hostType?adapter.config.slaveNameSuffix:"",hostType:adapter.config.hostType,ignoreErrors:adapter.config.ignoreErrors,signedCertificates:"https"!=adapter.config.grafanaProtocol||adapter.config.grafanaSignedCertificates},historyHTML:l,historyJSON:f,telegram:t,email:p,pushover:d,whatsapp:i,gotify:o,signal:n,matrix:s,discord:c,notification:g},backupConfig.ccu={name:"ccu",type:"creator",enabled:adapter.config.ccuEnabled,time:adapter.config.ccuTime,cronjob:adapter.config.ccuCronJob,ownCron:adapter.config.ccuCron,debugging:adapter.config.debugLevel,everyXDays:adapter.config.ccuEveryXDays,nameSuffix:adapter.config.ccuNameSuffix,deleteBackupAfter:adapter.config.ccuDeleteAfter,signedCertificates:adapter.config.ccuSignedCertificates,ignoreErrors:adapter.config.ignoreErrors,ftp:Object.assign({},b,!0===adapter.config.ftpOwnDir?{dir:adapter.config.ftpCcuDir}:{}),cifs:Object.assign({},D,!0===adapter.config.cifsOwnDir?{dir:adapter.config.cifsCcuDir}:{}),dropbox:Object.assign({},m,!0===adapter.config.dropboxOwnDir?{dir:adapter.config.dropboxCcuDir}:{}),onedrive:Object.assign({},y,!0===adapter.config.onedriveOwnDir?{dir:adapter.config.onedriveCcuDir}:{}),webdav:Object.assign({},h,!0===adapter.config.webdavOwnDir?{dir:adapter.config.webdavCcuDir}:{}),googledrive:Object.assign({},v,!0===adapter.config.googledriveOwnDir?{dir:adapter.config.googledriveCcuDir}:{}),historyHTML:l,historyJSON:f,telegram:t,email:p,pushover:d,whatsapp:i,gotify:o,signal:n,matrix:s,discord:c,notification:g,host:adapter.config.ccuHost,user:adapter.config.ccuUser,usehttps:adapter.config.ccuUsehttps,pass:adapter.config.ccuPassword||"",ccuEvents:adapter.config.ccuEvents,ccuMulti:adapter.config.ccuMulti},a()}))}function readLogFile(){try{const e=path.join(tools.getIobDir(),"backups","logs.txt").replace(/\\/g,"/");if(fs.existsSync(e)){adapter.log.debug("Printing logs of previous backup");const a=fs.readFileSync(e).toString().split("\n");a.forEach(((e,r)=>a[r]=e.replace(/\r$|^\r/,""))),a.forEach((e=>{(e=e.trim())&&(e.startsWith("[ERROR]")?adapter.log.error(e):adapter.log.debug(e),adapter.setState("output.line",e,!0))})),adapter.setState("output.line","[EXIT] 0",!0),fs.unlinkSync(e)}}catch(e){adapter.log.warn(`Cannot read log file: ${e}`)}}function createBashScripts(){const e=process.platform.startsWith("win");fs.existsSync(bashDir)||(fs.mkdirSync(bashDir),adapter.log.debug("BackItUp data-directory created"));const a=path.join(bashDir,`${adapter.namespace}.log`);if(fs.existsSync(a)||fs.writeFileSync(a,"[]"),e){adapter.log.debug(`BackItUp has recognized a ${process.platform} system`);try{fs.writeFileSync(`${bashDir}/stopIOB.bat`,`start "" "${path.join(bashDir,"external.bat")}"`)}catch(e){adapter.log.error(`cannot create stopIOB.bat: ${e}Please run "iobroker fix"`)}try{fs.writeFileSync(`${bashDir}/external.bat`,`cd "${path.join(tools.getIobDir())}"\ncall iobroker stop\ntimeout /T 15\nif exist "${path.join(bashDir,".redis.info")}" (\nredis-server --service-stop\n)\nif exist "${path.join(bashDir,".redis.info")}" (\ncd "${path.join(__dirname,"lib")}"\n) else (\ncd "${path.join(bashDir)}"\n)\nnode restore.js`),fs.chmodSync(`${bashDir}/external.bat`,508)}catch(e){adapter.log.error(`cannot create external.sh: ${e}Please run "iobroker fix"`)}try{fs.writeFileSync(`${bashDir}/startIOB.bat`,`if exist "${path.join(bashDir,".redis.info")}" (\nredis-server --service-start\n)\ncd "${path.join(tools.getIobDir())}"\ncall iobroker host this\ncall iobroker start\nif exist "${path.join(bashDir,".startAll")}" (\ncd "${path.join(tools.getIobDir(),"node_modules/iobroker.js-controller")}"\nnode iobroker.js start all\n)`)}catch(e){adapter.log.error(`cannot create startIOB.bat: ${e}Please run "iobroker fix"`)}}else if(fs.existsSync("/opt/scripts/.docker_config/.thisisdocker")){adapter.log.debug("BackItUp has recognized a Docker system");try{fs.writeFileSync(`${bashDir}/stopIOB.sh`,`#!/bin/bash\n# iobroker stop for restore\nbash ${bashDir}/external.sh`),fs.chmodSync(`${bashDir}/stopIOB.sh`,508)}catch(e){adapter.log.error(`cannot create stopIOB.sh: ${e}Please run "iobroker fix"`)}try{fs.writeFileSync(`${bashDir}/startIOB.sh`,`#!/bin/bash\n# iobroker start after restore\nif [ -f ${bashDir}/.startAll ]; then\ncd "${path.join(tools.getIobDir())}"\niobroker start all;\nfi\nsleep 6\nbash /opt/scripts/maintenance.sh off -y`),fs.chmodSync(`${bashDir}/startIOB.sh`,508)}catch(e){adapter.log.error(`cannot create startIOB.sh: ${e}Please run "iobroker fix"`)}try{fs.writeFileSync(`${bashDir}/external.sh`,`#!/bin/bash\n# restore\nbash /opt/scripts/maintenance.sh on -y -kbn\nsleep 3\nif [ -f ${bashDir}/.redis.info ]; then\ncd "${path.join(__dirname,"lib")}"\nelse\ncd "${bashDir}"\nfi\nnode restore.js`),fs.chmodSync(`${bashDir}/external.sh`,508)}catch(e){adapter.log.error(`cannot create external.sh: ${e}Please run "iobroker fix"`)}}else{adapter.log.debug(`BackItUp has recognized a ${process.platform} system`);try{fs.writeFileSync(`${bashDir}/stopIOB.sh`,`# iobroker stop for restore\nsudo systemd-run --uid=iobroker bash ${bashDir}/external.sh`),fs.chmodSync(`${bashDir}/stopIOB.sh`,508)}catch(e){adapter.log.error(`cannot create stopIOB.sh: ${e}Please run "iobroker fix"`)}try{fs.writeFileSync(`${bashDir}/startIOB.sh`,`# iobroker start after restore\nif [ -f ${bashDir}/.redis.info ]; then\nredis-cli shutdown nosave && echo "[DEBUG] [redis] Redis restart successfully"\nfi\nif [ -f ${bashDir}/.startAll ]; then\ncd "${path.join(tools.getIobDir())}"\nbash iobroker start all && echo "[EXIT] **** iobroker start upload all now... ****"\nfi\ncd "${path.join(tools.getIobDir())}"\nbash iobroker host this && echo "[DEBUG] [iobroker] Host this successfully"\nbash iobroker start && echo "[EXIT] **** iobroker restart now... ****"`),fs.chmodSync(`${bashDir}/startIOB.sh`,508)}catch(e){adapter.log.error(`cannot create startIOB.sh: ${e}Please run "iobroker fix"`)}try{fs.writeFileSync(`${bashDir}/external.sh`,`# restore\ncd "${path.join(tools.getIobDir())}"\nbash iobroker stop && echo "[DEBUG] [iobroker] iobroker stop successfully"\nif [ -f ${bashDir}/.redis.info ]; then\ncd "${path.join(__dirname,"lib")}"\nelse\ncd "${bashDir}"\nfi\nnode restore.js`),fs.chmodSync(`${bashDir}/external.sh`,508)}catch(e){adapter.log.error(`cannot create external.sh: ${e}Please run "iobroker fix"`)}}}function umount(){const e=path.join(tools.getIobDir(),"backups"),a=require("node:child_process");fs.existsSync(`${bashDir}/.mount`)&&a.exec(`mount | grep -o "${e}"`,((r,t,i)=>{t.includes(e)?(adapter.log.debug("mount activ... umount in 2 Seconds!!"),timerUmount1=setTimeout((()=>a.exec(`${adapter.config.sudoMount?"sudo umount":"umount"} ${e}`,((r,t,i)=>{if(r)adapter.log.debug("umount: device is busy... wait 5 Minutes!!"),timerUmount2=setTimeout((()=>a.exec(`${adapter.config.sudoMount?"sudo umount":"umount"} -l ${e}`,((e,a,r)=>{if(e)adapter.log.error(e);else{adapter.log.debug("umount successfully completed");try{fs.existsSync(`${bashDir}/.mount`)&&fs.unlinkSync(`${bashDir}/.mount`)}catch(e){adapter.log.debug('file ".mount" not deleted ...')}}}))),3e5);else{adapter.log.debug("umount successfully completed");try{fs.existsSync(`${bashDir}/.mount`)&&fs.unlinkSync(`${bashDir}/.mount`)}catch(e){adapter.log.debug('file ".mount" not deleted ...')}}}))),2e3)):adapter.log.debug("mount inactiv!!")}))}function createBackupDir(){if(!fs.existsSync(path.join(tools.getIobDir(),"backups")))try{fs.mkdirSync(path.join(tools.getIobDir(),"backups")),adapter.log.debug("Created BackupDir")}catch(e){adapter.log.warn(`Backup folder not created: ${e}! Please run "iobroker fix" and try again or create the backup folder manually!!`)}}function deleteHideFiles(){fs.existsSync(`${bashDir}/.redis.info`)&&fs.unlinkSync(`${bashDir}/.redis.info`)}function delTmp(){if(fs.existsSync(path.join(tools.getIobDir(),"backups/tmp")))try{fs.rmdirSync(path.join(tools.getIobDir(),"backups/tmp")),adapter.log.debug("delete tmp files")}catch(e){adapter.log.warn(`can not delete tmp files: ${e}Please run "iobroker fix" and try again or delete the tmp folder manually!!`)}}function setStartAll(){if(adapter.config.startAllRestore&&!fs.existsSync(`${bashDir}/.startAll`))try{fs.writeFileSync(`${bashDir}/.startAll`,"Start all Adapter after Restore"),adapter.log.debug("Start all Adapter after Restore enabled")}catch(e){adapter.log.warn(`can not create startAll files: ${e}Please run "iobroker fix" and try again`)}else if(!adapter.config.startAllRestore&&fs.existsSync(`${bashDir}/.startAll`))try{fs.unlinkSync(`${bashDir}/.startAll`),adapter.log.debug("Start all Adapter after Restore disabled")}catch(e){adapter.log.warn(`can not delete startAll file: ${e}Please run "iobroker fix" and try again`)}}function getName(e,a,r){try{const t=e.split("_");parseInt(t[0],10).toString()!==t[0]&&t.shift();const i="cifs"===r?"NAS":r;return adapter.log.debug(e?`detect backup file ${a} from ${i}: ${e}`:"No backup name was found"),new Date(t[0],parseInt(t[1],10)-1,parseInt(t[2].split("-")[0],10),parseInt(t[2].split("-")[1],10),parseInt(t[3],10))}catch(e){e&&adapter.log.warn("No backup name was found")}}async function detectLatestBackupFile(e){try{let a,r=Object.keys(backupConfig.iobroker).filter((e=>"object"==typeof backupConfig.iobroker[e]&&"storage"===backupConfig.iobroker[e].type&&!0===backupConfig.iobroker[e].enabled));await updateAccessTokens(backupConfig);const t=require("./lib/list");try{a=r.map((a=>new Promise((r=>t(a,backupConfig,e.log,(e=>{let t=null;if(e&&e.data&&"undefined"!==e.data){let r=0,i=e.data;Object.keys(i).forEach((e=>{i[e].iobroker&&i[e].iobroker.filter((e=>e.size)).forEach((e=>{r++;const i=getName(e.name,r,a);(!t||t.date<i)&&(t=e,t.date=i,t.storage=a)}))})),e=null,i=null}r(t)}))))))}catch(a){e.log.warn(`No backup file was found: ${a}`)}Promise.all(a).then((a=>{let r;if((a=a.filter((e=>e))).length){if(a.sort(((e,a)=>e.date>a.date?1:e.date<a.date?-1:0)),r=a[0],void 0!==r.date)try{r.date=r.date.toISOString()}catch(a){e.log.warn(`No backup file date was found: ${a}`)}}else r=null;e.setState("info.latestBackup",r?JSON.stringify(r):"",!0),e.log.debug(r?`detect last backup file: ${r.name}`:"No backup file was found"),a=null})),a=null,r=null}catch(a){e.log.warn(`No backup file was found: ${a}`)}}async function nextBackup(e,a){const{CronExpressionParser:r}=await import("cron-parser");if(adapter.config.ccuEnabled&&e||"ccu"===a){const e=adapter.config.ccuCron?adapter.config.ccuCronJob:adapter.config.ccuTime.split(":"),a=adapter.config.ccuCron?e:`00 ${e[1]} ${e[0]} */${adapter.config.ccuEveryXDays} * *`;try{const e={currentDate:new Date},t=r.parse(a,e).next();await adapter.setStateAsync("info.ccuNextTime",tools.getNextTimeString(systemLang,t),!0)}catch(e){adapter.log.warn(`Your configured CCU cronjob is not correct: ${e}`)}}else adapter.config.ccuEnabled||await adapter.setStateAsync("info.ccuNextTime","none",!0);if(adapter.config.minimalEnabled&&e||"iobroker"===a){const e=adapter.config.iobrokerCron?adapter.config.iobrokerCronJob:adapter.config.minimalTime.split(":"),a=adapter.config.iobrokerCron?e:`00 ${e[1]} ${e[0]} */${adapter.config.minimalEveryXDays} * *`;try{const e={currentDate:new Date},t=r.parse(a,e).next();await adapter.setStateAsync("info.iobrokerNextTime",tools.getNextTimeString(systemLang,t),!0)}catch(e){adapter.log.warn(`Your configured iobroker cronjob is not correct: ${e}`)}}else adapter.config.minimalEnabled||await adapter.setStateAsync("info.iobrokerNextTime","none",!0)}async function startSlaveBackup(e,a){let r=1e3;null==a&&(a=0);try{const a=await adapter.getForeignStateAsync(`system.adapter.${e}.alive`);a&&!1===a.val&&(r=1e4,adapter.log.debug(`Try to start ${e}`),await adapter.setForeignStateAsync(`system.adapter.${e}.alive`,!0))}catch(e){adapter.log.error(`error on slave State: ${e}`)}waitToSlaveBackup=setTimeout((async()=>{try{const r=await adapter.getForeignStateAsync(`system.adapter.${e}.alive`);if(r&&r.val&&!0===r.val){const r=await adapter.sendToAsync(e,"slaveBackup",{config:{deleteAfter:adapter.config.minimalDeleteAfter}});if(r?adapter.log.debug(`Slave Backup from ${e} is finish with result: ${r}`):adapter.log.debug(`Slave Backup error from ${e}`),adapter.config.stopSlaveAfter&&(await adapter.setForeignStateAsync(`system.adapter.${e}.alive`,!1),adapter.log.debug(`${e} is stopped after backup`)),a++,adapter.config.slaveInstance.length>1&&a!=adapter.config.slaveInstance.length)return slaveTimeOut=setTimeout(startSlaveBackup,3e3,adapter.config.slaveInstance[a],a);adapter.log.debug("slave backups are completed"),adapter.config.onedriveEnabled&&renewOnedriveToken()}else{if(a++,adapter.log.warn(`${e} is not running. The slave backup for this instance is not possible`),adapter.config.slaveInstance.length>1&&a!=adapter.config.slaveInstance.length)return slaveTimeOut=setTimeout(startSlaveBackup,3e3,adapter.config.slaveInstance[a],a);adapter.log.debug("slave backups are completed"),adapter.config.onedriveEnabled&&renewOnedriveToken()}}catch(e){adapter.log.error(`error on slave Backup: ${e}`)}}),r)}function decryptEvents(e){if(adapter.config.ccuEvents&&adapter.config.ccuMulti)for(let a=0;a<adapter.config.ccuEvents.length;a++)if(adapter.config.ccuEvents[a].pass){const r=adapter.config.ccuEvents[a].pass;adapter.config.ccuEvents[a].pass=r?decrypt(e,r):""}if(adapter.config.mySqlEvents&&adapter.config.mySqlMulti)for(let a=0;a<adapter.config.mySqlEvents.length;a++)if(adapter.config.mySqlEvents[a].pass){const r=adapter.config.mySqlEvents[a].pass;adapter.config.mySqlEvents[a].pass=r?decrypt(e,r):""}if(adapter.config.pgSqlEvents&&adapter.config.pgSqlMulti)for(let a=0;a<adapter.config.pgSqlEvents.length;a++)if(adapter.config.pgSqlEvents[a].pass){const r=adapter.config.pgSqlEvents[a].pass;adapter.config.pgSqlEvents[a].pass=r?decrypt(e,r):""}}function clearBashDir(){if(fs.existsSync(bashDir)){const e=require("fs-extra"),a=path.join(bashDir,"restore");try{fs.existsSync(path.join(bashDir,"restore.js"))&&fs.unlinkSync(path.join(bashDir,"restore.js")),fs.existsSync(path.join(bashDir,"restore.json"))&&fs.unlinkSync(path.join(bashDir,"restore.json")),fs.existsSync(a)&&e.removeSync(a),fs.existsSync(path.join(bashDir,"iob.key"))&&fs.unlinkSync(path.join(bashDir,"iob.key")),fs.existsSync(path.join(bashDir,"iob.crt"))&&fs.unlinkSync(path.join(bashDir,"iob.crt"))}catch(e){adapter.log.debug(`old restore files could not be deleted: ${e}`)}}}async function getCerts(e){const a=await adapter.getForeignObjectAsync(e);if(a&&a.native&&a.native.certPrivate&&a.native.certPublic){const e=await adapter.getForeignObjectAsync("system.certificates");if(e&&e.native&&e.native.certificates)try{e.native.certificates[`${a.native.certPrivate}`].startsWith("/")&&fs.existsSync(path.join(e.native.certificates[`${a.native.certPrivate}`]))?fs.writeFileSync(path.join(bashDir,"iob.key"),fs.readFileSync(path.join(e.native.certificates[`${a.native.certPrivate}`]),"utf8")):fs.writeFileSync(path.join(bashDir,"iob.key"),e.native.certificates[`${a.native.certPrivate}`]),e.native.certificates[`${a.native.certPublic}`].startsWith("/")&&fs.existsSync(path.join(e.native.certificates[`${a.native.certPublic}`]))?fs.writeFileSync(path.join(bashDir,"iob.crt"),fs.readFileSync(path.join(e.native.certificates[`${a.native.certPublic}`]),"utf8")):fs.writeFileSync(path.join(bashDir,"iob.crt"),e.native.certificates[`${a.native.certPublic}`])}catch(e){adapter.log.debug("no certificates found")}}}function dlFileServer(e){const a=require("express"),r=a();if(dlServer&&dlServer._connectionKey){try{dlServer.closeAllConnections()}catch(e){adapter.log.debug(`Download server Connections could not be closed: ${e}`)}try{dlServer.close()}catch(e){adapter.log.debug(`Download server Connections could not be closed: ${e}`)}}const t=fs.existsSync("/opt/scripts/.docker_config/.thisisdocker")?9081:0;let i;if(r.use(a.static(path.join(tools.getIobDir(),"backups"))),"https:"===e){https=https||require("node:https");let e="",a="";if(fs.existsSync(path.join(bashDir,"iob.key"))&&fs.existsSync(path.join(bashDir,"iob.crt")))try{e=fs.readFileSync(path.join(bashDir,"iob.key"),"utf8"),a=fs.readFileSync(path.join(bashDir,"iob.crt"),"utf8")}catch(e){adapter.log.debug("no certificates found")}try{i=https.createServer({key:e,cert:a},r)}catch(e){adapter.log.debug(`The https server cannot be created: ${e}`)}}else{http=http||require("node:http");try{i=http.createServer(r)}catch(e){adapter.log.debug(`The http server cannot be created: ${e}`)}}try{dlServer=i.listen(t),adapter.log.debug(`Download ${e.replace(":","")} server started on port ${dlServer.address().port}`)}catch(e){adapter.log.debug("Download server cannot be started")}}function ulFileServer(e){const a=require("express"),r=require("multer"),t=require("cors");try{ulServer.closeAllConnections()}catch(e){adapter.log.debug("Upload server connections could not be closed")}try{ulServer.close()}catch(e){adapter.log.debug("Upload server connections could not be closed")}const i=fs.existsSync("/opt/scripts/.docker_config/.thisisdocker")?9082:0,o=path.join(tools.getIobDir(),"backups"),n=a();n.use(t());const s=r.diskStorage({destination:(e,a,r)=>r(null,o),filename:function(e,a,r){adapter.log.debug(`Upload from ${a.originalname} started...`),r(null,a.originalname)}}),c=r({storage:s});let d;if(n.post("/",c.single("files"),((e,a)=>{adapter.log.debug(e.file),a.json({message:"File(s) uploaded successfully"})})),"https:"===e){https=https||require("node:https");let e="",a="";if(fs.existsSync(path.join(bashDir,"iob.key"))&&fs.existsSync(path.join(bashDir,"iob.crt")))try{e=fs.readFileSync(path.join(bashDir,"iob.key"),"utf8"),a=fs.readFileSync(path.join(bashDir,"iob.crt"),"utf8")}catch(e){adapter.log.debug("no certificates found")}try{d=https.createServer({key:e,cert:a},n)}catch(e){adapter.log.debug(`The https upload server cannot be created: ${e}`)}}else{http=http||require("node:http");try{d=http.createServer(n)}catch(e){adapter.log.debug(`The http upload server cannot be created: ${e}`)}}try{ulServer=d.listen(i),adapter.log.debug(`Upload ${e.replace(":","")} server started on port ${ulServer.address().port}`)}catch(e){adapter.log.debug("Upload server cannot be started")}}async function renewOnedriveToken(){const e=new(require("./lib/oneDriveLib"));let a,r=new Date;if(""!=adapter.config.onedriveLastTokenRenew){const e=new Date(adapter.config.onedriveLastTokenRenew);a=parseInt((r-e)/864e5)}a>=30||!adapter.config.onedriveLastTokenRenew?(adapter.log.debug("Renew Onedrive Refresh-Token"),e.renewToken(adapter.config.onedriveAccessJson,adapter.log).then((e=>{adapter.extendForeignObject(`system.adapter.${adapter.namespace}`,{native:{onedriveAccessJson:e,onedriveLastTokenRenew:`${`0${r.getMonth()+1}`.slice(-2)}/${`0${r.getDate()}`.slice(-2)}/${r.getFullYear()}`}})})).catch((e=>{adapter.log.error(e?JSON.stringify(e):"An update of the Onedrive refresh token has failed. Please check your system!"),adapter.registerNotification("backitup","onedriveWarn",e?JSON.stringify(e):"An update of the Onedrive refresh token has failed. Please check your system!")}))):adapter.log.debug(`Renew Onedrive Refresh-Token in ${30-a} days`)}async function main(e){createBashScripts(),readLogFile(),fs.existsSync(path.join(tools.getIobDir(),"backups"))||createBackupDir(),fs.existsSync(`${bashDir}/.redis.info`)&&deleteHideFiles(),fs.existsSync(path.join(tools.getIobDir(),"backups/tmp"))&&delTmp(),clearBashDir(),timerMain=setTimeout((function(){fs.existsSync(`${bashDir}/.mount`)&&umount(),e.config.startAllRestore&&!fs.existsSync(`${bashDir}/.startAll`)&&setStartAll()}),1e4),e.getForeignObject("system.config",(async(a,r)=>{r?.common?.language&&(systemLang=r.common.language),await initConfig(r?.native?.secret||"Zgfr56gFe87jJOM"),checkStates(),"Slave"!==e.config.hostType&&(createBackupSchedule(),nextBackup(!0,null),detectLatestBackupFile(e))})),e.subscribeStates("oneClick.*"),e.subscribeStates("info.dropboxTokens")}module&&module.parent?module.exports=startAdapter:startAdapter();
//# sourceMappingURL=/sm/0708a92cb97e315f61f49ba11177467fa300f2369cf07af5b120ce1196444ca2.map