From d02401b1c28377026f4b4682ed017d5895eb9245 Mon Sep 17 00:00:00 2001 From: LouisLam Date: Sun, 27 Jun 2021 16:10:55 +0800 Subject: [PATCH] many update --- package.json | 1 + server/model/monitor.js | 43 +++++++++++++++++++++- server/server.js | 60 ++++++++++++++++++++++++++---- src/assets/vars.scss | 1 + src/components/HeartbeatBar.vue | 57 ++++++++++++++++++++--------- src/layouts/EmptyLayout.vue | 13 +++++++ src/main.js | 19 +++++++--- src/mixins/socket.js | 65 +++++++++++++++++++++++++++++++-- src/pages/Dashboard.vue | 26 ++++++------- src/pages/DashboardHome.vue | 42 +++++++++++++++++++-- src/pages/Details.vue | 50 ++++++++++++++++++------- src/pages/EditMonitor.vue | 57 ++++++++++++++++++----------- 12 files changed, 345 insertions(+), 89 deletions(-) create mode 100644 src/layouts/EmptyLayout.vue diff --git a/package.json b/package.json index 107cf1ae..867af2b1 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,7 @@ "version": "0.0.0", "scripts": { "dev": "vite", + "dev-server": "node server/server.js", "build": "vite build", "serve": "vite preview" }, diff --git a/server/model/monitor.js b/server/model/monitor.js index 1b25270f..9c491146 100644 --- a/server/model/monitor.js +++ b/server/model/monitor.js @@ -1,6 +1,18 @@ const dayjs = require("dayjs"); +const utc = require('dayjs/plugin/utc') +var timezone = require('dayjs/plugin/timezone') +dayjs.extend(utc) +dayjs.extend(timezone) +const axios = require("axios"); +const {R} = require("redbean-node"); const {BeanModel} = require("redbean-node/dist/bean-model"); + +/** + * status: + * 0 = DOWN + * 1 = UP + */ class Monitor extends BeanModel { toJSON() { @@ -16,9 +28,36 @@ class Monitor extends BeanModel { } start(io) { - const beat = () => { + const beat = async () => { console.log(`Monitor ${this.id}: Heartbeat`) - io.to(this.user_id).emit("heartbeat", dayjs().unix()); + + let bean = R.dispense("heartbeat") + bean.monitor_id = this.id; + bean.time = R.isoDateTime(dayjs.utc()); + bean.status = 0; + + try { + if (this.type === "http") { + let startTime = dayjs().valueOf(); + let res = await axios.get(this.url) + bean.msg = `${res.status} - ${res.statusText}` + bean.ping = dayjs().valueOf() - startTime; + bean.status = 1; + } + + } catch (error) { + bean.msg = error.message; + } + + io.to(this.user_id).emit("heartbeat", { + monitorID: this.id, + status: bean.status, + time: bean.time, + msg: bean.msg, + ping: bean.ping, + }); + + await R.store(bean) } beat(); diff --git a/server/server.js b/server/server.js index e30f6e7e..e9f62c49 100644 --- a/server/server.js +++ b/server/server.js @@ -4,7 +4,6 @@ const http = require('http'); const server = http.createServer(app); const { Server } = require("socket.io"); const io = new Server(server); -const axios = require('axios'); const dayjs = require("dayjs"); const {R} = require("redbean-node"); const passwordHash = require('password-hash'); @@ -12,7 +11,6 @@ const jwt = require('jsonwebtoken'); const Monitor = require("./model/monitor"); const {sleep} = require("./util"); - let stop = false; let interval = 6000; let totalClient = 0; @@ -21,12 +19,11 @@ let loadFromDatabase = true; let monitorList = {}; (async () => { - R.setup('sqlite', { - filename: '../data/kuma.db' + filename: './data/kuma.db' }); R.freeze(true) - await R.autoloadModels("./model"); + await R.autoloadModels("./server/model"); await initDatabase(); @@ -118,15 +115,54 @@ let monitorList = {}; bean.user_id = socket.userID await R.store(bean) + await startMonitor(socket.userID, bean.id); + await sendMonitorList(socket); + callback({ ok: true, msg: "Added Successfully.", monitorID: bean.id }); + } catch (e) { + callback({ + ok: false, + msg: e.message + }); + } + }); + + socket.on("editMonitor", async (monitor, callback) => { + try { + checkLogin(socket) + + let bean = await R.findOne("monitor", " id = ? ", [ monitor.id ]) + + if (bean.user_id !== socket.userID) { + throw new Error("Permission denied.") + } + + bean.name = monitor.name + bean.type = monitor.type + bean.url = monitor.url + bean.interval = monitor.interval + + await R.store(bean) + + if (bean.active) { + await restartMonitor(socket.userID, bean.id) + } + await sendMonitorList(socket); + callback({ + ok: true, + msg: "Saved.", + monitorID: bean.id + }); + } catch (e) { + console.log(e) callback({ ok: false, msg: e.message @@ -294,14 +330,14 @@ async function afterLogin(socket, user) { } async function getMonitorJSONList(userID) { - let result = []; + let result = {}; - let monitorList = await R.find("monitor", " user_id = ? ORDER BY weight DESC ", [ + let monitorList = await R.find("monitor", " user_id = ? ORDER BY active DESC, name ASC ", [ userID ]) for (let monitor of monitorList) { - result.push(monitor.toJSON()) + result[monitor.id] = monitor.toJSON(); } return result; @@ -346,10 +382,18 @@ async function startMonitor(userID, monitorID) { monitorID ]) + if (monitor.id in monitorList) { + monitorList[monitor.id].stop(); + } + monitorList[monitor.id] = monitor; monitor.start(io) } +async function restartMonitor(userID, monitorID) { + return await startMonitor(userID, monitorID) +} + async function pauseMonitor(userID, monitorID) { await checkOwner(userID, monitorID) diff --git a/src/assets/vars.scss b/src/assets/vars.scss index dd1bcc0b..31b0262d 100644 --- a/src/assets/vars.scss +++ b/src/assets/vars.scss @@ -1,4 +1,5 @@ $primary: #5CDD8B; +$danger: #DC3545; $link-color: #111; $border-radius: 50rem; diff --git a/src/components/HeartbeatBar.vue b/src/components/HeartbeatBar.vue index bba0fa54..ede199ee 100644 --- a/src/components/HeartbeatBar.vue +++ b/src/components/HeartbeatBar.vue @@ -1,7 +1,7 @@