From 966dfa6f88bf56077a58c42d307c34d9f94774c4 Mon Sep 17 00:00:00 2001 From: Louis Lam Date: Sat, 14 Oct 2023 23:38:31 +0800 Subject: [PATCH] Drop backup (#3892) * Drop backup * Fix warning --- server/server.js | 211 --------------------------- src/components/settings/Backup.vue | 225 ----------------------------- src/pages/Settings.vue | 3 - src/router.js | 5 - 4 files changed, 444 deletions(-) delete mode 100644 src/components/settings/Backup.vue diff --git a/server/server.js b/server/server.js index 03f1cff2a..d03c715db 100644 --- a/server/server.js +++ b/server/server.js @@ -65,8 +65,6 @@ log.debug("server", "Importing http-graceful-shutdown"); const gracefulShutdown = require("http-graceful-shutdown"); log.debug("server", "Importing prometheus-api-metrics"); const prometheusAPIMetrics = require("prometheus-api-metrics"); -log.debug("server", "Importing compare-versions"); -const compareVersions = require("compare-versions"); const { passwordStrength } = require("check-password-strength"); log.debug("server", "Importing 2FA Modules"); @@ -91,9 +89,6 @@ log.debug("server", "Importing Notification"); const { Notification } = require("./notification"); Notification.init(); -log.debug("server", "Importing Proxy"); -const { Proxy } = require("./proxy"); - log.debug("server", "Importing Database"); const Database = require("./database"); @@ -1434,212 +1429,6 @@ let needSetup = false; } }); - socket.on("uploadBackup", async (uploadedJSON, importHandle, callback) => { - try { - checkLogin(socket); - - let backupData = JSON.parse(uploadedJSON); - - log.info("manage", `Importing Backup, User ID: ${socket.userID}, Version: ${backupData.version}`); - - let notificationListData = backupData.notificationList; - let proxyListData = backupData.proxyList; - let monitorListData = backupData.monitorList; - - let version17x = compareVersions.compare(backupData.version, "1.7.0", ">="); - - // If the import option is "overwrite" it'll clear most of the tables, except "settings" and "user" - if (importHandle === "overwrite") { - // Stops every monitor first, so it doesn't execute any heartbeat while importing - for (let id in server.monitorList) { - let monitor = server.monitorList[id]; - await monitor.stop(); - } - await R.exec("DELETE FROM heartbeat"); - await R.exec("DELETE FROM monitor_notification"); - await R.exec("DELETE FROM monitor_tls_info"); - await R.exec("DELETE FROM notification"); - await R.exec("DELETE FROM monitor_tag"); - await R.exec("DELETE FROM tag"); - await R.exec("DELETE FROM monitor"); - await R.exec("DELETE FROM proxy"); - } - - // Only starts importing if the backup file contains at least one notification - if (notificationListData.length >= 1) { - // Get every existing notification name and puts them in one simple string - let notificationNameList = await R.getAll("SELECT name FROM notification"); - let notificationNameListString = JSON.stringify(notificationNameList); - - for (let i = 0; i < notificationListData.length; i++) { - // Only starts importing the notification if the import option is "overwrite", "keep" or "skip" but the notification doesn't exists - if ((importHandle === "skip" && notificationNameListString.includes(notificationListData[i].name) === false) || importHandle === "keep" || importHandle === "overwrite") { - - let notification = JSON.parse(notificationListData[i].config); - await Notification.save(notification, null, socket.userID); - - } - } - } - - // Only starts importing if the backup file contains at least one proxy - if (proxyListData && proxyListData.length >= 1) { - const proxies = await R.findAll("proxy"); - - // Loop over proxy list and save proxies - for (const proxy of proxyListData) { - const exists = proxies.find(item => item.id === proxy.id); - - // Do not process when proxy already exists in import handle is skip and keep - if ([ "skip", "keep" ].includes(importHandle) && !exists) { - return; - } - - // Save proxy as new entry if exists update exists one - await Proxy.save(proxy, exists ? proxy.id : undefined, proxy.userId); - } - } - - // Only starts importing if the backup file contains at least one monitor - if (monitorListData.length >= 1) { - // Get every existing monitor name and puts them in one simple string - let monitorNameList = await R.getAll("SELECT name FROM monitor"); - let monitorNameListString = JSON.stringify(monitorNameList); - - for (let i = 0; i < monitorListData.length; i++) { - // Only starts importing the monitor if the import option is "overwrite", "keep" or "skip" but the notification doesn't exists - if ((importHandle === "skip" && monitorNameListString.includes(monitorListData[i].name) === false) || importHandle === "keep" || importHandle === "overwrite") { - - // Define in here every new variable for monitors which where implemented after the first version of the Import/Export function (1.6.0) - // --- Start --- - - // Define default values - let retryInterval = 0; - let timeout = monitorListData[i].timeout || (monitorListData[i].interval * 0.8); // fallback to old value - - /* - Only replace the default value with the backup file data for the specific version, where it appears the first time - More information about that where "let version" will be defined - */ - if (version17x) { - retryInterval = monitorListData[i].retryInterval; - } - - // --- End --- - - let monitor = { - // Define the new variable from earlier here - name: monitorListData[i].name, - description: monitorListData[i].description, - type: monitorListData[i].type, - url: monitorListData[i].url, - method: monitorListData[i].method || "GET", - body: monitorListData[i].body, - headers: monitorListData[i].headers, - authMethod: monitorListData[i].authMethod, - basic_auth_user: monitorListData[i].basic_auth_user, - basic_auth_pass: monitorListData[i].basic_auth_pass, - authWorkstation: monitorListData[i].authWorkstation, - authDomain: monitorListData[i].authDomain, - timeout, - interval: monitorListData[i].interval, - retryInterval: retryInterval, - resendInterval: monitorListData[i].resendInterval || 0, - hostname: monitorListData[i].hostname, - maxretries: monitorListData[i].maxretries, - port: monitorListData[i].port, - keyword: monitorListData[i].keyword, - invertKeyword: monitorListData[i].invertKeyword, - ignoreTls: monitorListData[i].ignoreTls, - upsideDown: monitorListData[i].upsideDown, - maxredirects: monitorListData[i].maxredirects, - accepted_statuscodes: monitorListData[i].accepted_statuscodes, - dns_resolve_type: monitorListData[i].dns_resolve_type, - dns_resolve_server: monitorListData[i].dns_resolve_server, - notificationIDList: monitorListData[i].notificationIDList, - proxy_id: monitorListData[i].proxy_id || null, - }; - - if (monitorListData[i].pushToken) { - monitor.pushToken = monitorListData[i].pushToken; - } - - let bean = R.dispense("monitor"); - - let notificationIDList = monitor.notificationIDList; - delete monitor.notificationIDList; - - monitor.accepted_statuscodes_json = JSON.stringify(monitor.accepted_statuscodes); - delete monitor.accepted_statuscodes; - - bean.import(monitor); - bean.user_id = socket.userID; - await R.store(bean); - - // Only for backup files with the version 1.7.0 or higher, since there was the tag feature implemented - if (version17x) { - // Only import if the specific monitor has tags assigned - for (const oldTag of monitorListData[i].tags) { - - // Check if tag already exists and get data -> - let tag = await R.findOne("tag", " name = ?", [ - oldTag.name, - ]); - - let tagId; - if (!tag) { - // -> If it doesn't exist, create new tag from backup file - let beanTag = R.dispense("tag"); - beanTag.name = oldTag.name; - beanTag.color = oldTag.color; - await R.store(beanTag); - - tagId = beanTag.id; - } else { - // -> If it already exist, set tagId to value from database - tagId = tag.id; - } - - // Assign the new created tag to the monitor - await R.exec("INSERT INTO monitor_tag (tag_id, monitor_id, value) VALUES (?, ?, ?)", [ - tagId, - bean.id, - oldTag.value, - ]); - - } - } - - await updateMonitorNotification(bean.id, notificationIDList); - - // If monitor was active start it immediately, otherwise pause it - if (monitorListData[i].active === 1) { - await startMonitor(socket.userID, bean.id); - } else { - await pauseMonitor(socket.userID, bean.id); - } - - } - } - - await sendNotificationList(socket); - await server.sendMonitorList(socket); - } - - callback({ - ok: true, - msg: "successBackupRestored", - msgi18n: true, - }); - - } catch (e) { - callback({ - ok: false, - msg: e.message, - }); - } - }); - socket.on("clearEvents", async (monitorID, callback) => { try { checkLogin(socket); diff --git a/src/components/settings/Backup.vue b/src/components/settings/Backup.vue deleted file mode 100644 index 1452541f2..000000000 --- a/src/components/settings/Backup.vue +++ /dev/null @@ -1,225 +0,0 @@ - - - - - diff --git a/src/pages/Settings.vue b/src/pages/Settings.vue index ce867b144..4598dfb61 100644 --- a/src/pages/Settings.vue +++ b/src/pages/Settings.vue @@ -113,9 +113,6 @@ export default { proxies: { title: this.$t("Proxies"), }, - backup: { - title: this.$t("Backup"), - }, about: { title: this.$t("About"), }, diff --git a/src/router.js b/src/router.js index e77a1137d..0ceb139f9 100644 --- a/src/router.js +++ b/src/router.js @@ -30,7 +30,6 @@ import Tags from "./components/settings/Tags.vue"; import MonitorHistory from "./components/settings/MonitorHistory.vue"; const Security = () => import("./components/settings/Security.vue"); import Proxies from "./components/settings/Proxies.vue"; -import Backup from "./components/settings/Backup.vue"; import About from "./components/settings/About.vue"; const routes = [ @@ -126,10 +125,6 @@ const routes = [ path: "proxies", component: Proxies, }, - { - path: "backup", - component: Backup, - }, { path: "about", component: About,