diff --git a/server/server.js b/server/server.js index 9ba0b9c..fd82e6c 100644 --- a/server/server.js +++ b/server/server.js @@ -804,6 +804,78 @@ let indexHTML = fs.readFileSync("./dist/index.html").toString(); } }); + socket.on("uploadBackup", async (uploadedJSON, callback) => { + try { + checkLogin(socket) + + let backupData = JSON.parse(uploadedJSON); + + console.log(`Importing Backup, User ID: ${socket.userID}, Version: ${backupData.version}`) + + let notificationList = backupData.notificationList; + let monitorList = backupData.monitorList; + + if (notificationList.length >= 1) { + for (let i = 0; i < notificationList.length; i++) { + let notification = JSON.parse(notificationList[i].config); + await Notification.save(notification, null, socket.userID) + } + } + + if (monitorList.length >= 1) { + for (let i = 0; i < monitorList.length; i++) { + let monitor = { + name: monitorList[i].name, + type: monitorList[i].type, + url: monitorList[i].url, + interval: monitorList[i].interval, + hostname: monitorList[i].hostname, + maxretries: monitorList[i].maxretries, + port: monitorList[i].port, + keyword: monitorList[i].keyword, + ignoreTls: monitorList[i].ignoreTls, + upsideDown: monitorList[i].upsideDown, + maxredirects: monitorList[i].maxredirects, + accepted_statuscodes: monitorList[i].accepted_statuscodes, + dns_resolve_type: monitorList[i].dns_resolve_type, + dns_resolve_server: monitorList[i].dns_resolve_server, + notificationIDList: {}, + } + + 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) + + await updateMonitorNotification(bean.id, notificationIDList) + + await startMonitor(socket.userID, bean.id); + } + + await sendNotificationList(socket) + await sendMonitorList(socket); + } + + callback({ + ok: true, + msg: "Backup successfully restored.", + }); + + } catch (e) { + callback({ + ok: false, + msg: e.message, + }); + } + }); + debug("added all socket handlers") // *************************** diff --git a/src/languages/de-DE.js b/src/languages/de-DE.js index 9945bdf..cbeccd5 100644 --- a/src/languages/de-DE.js +++ b/src/languages/de-DE.js @@ -113,6 +113,9 @@ export default { "Create your admin account": "Erstelle dein Admin Konto", "Repeat Password": "Wiederhole das Passwort", "Resource Record Type": "Resource Record Type", + "Import/Export Backup": "Import/Export Backup", + "Export": "Export", + "Import": "Import", respTime: "Antw. Zeit (ms)", notAvailableShort: "N/A", Create: "Erstellen", diff --git a/src/languages/en.js b/src/languages/en.js index 4351607..2a2acf6 100644 --- a/src/languages/en.js +++ b/src/languages/en.js @@ -110,6 +110,9 @@ export default { "Last Result": "Last Result", "Create your admin account": "Create your admin account", "Repeat Password": "Repeat Password", + "Import/Export Backup": "Import/Export Backup", + "Export": "Export", + "Import": "Import", respTime: "Resp. Time (ms)", notAvailableShort: "N/A", Create: "Create", diff --git a/src/mixins/socket.js b/src/mixins/socket.js index 672027f..3a4f7f7 100644 --- a/src/mixins/socket.js +++ b/src/mixins/socket.js @@ -265,6 +265,10 @@ export default { clearStatistics(callback) { socket.emit("clearStatistics", callback) }, + + uploadBackup(uploadedJSON, callback) { + socket.emit("uploadBackup", uploadedJSON, callback) + }, }, computed: { diff --git a/src/pages/Settings.vue b/src/pages/Settings.vue index 151df2c..5ca9fab 100644 --- a/src/pages/Settings.vue +++ b/src/pages/Settings.vue @@ -120,6 +120,14 @@ +