diff --git a/server/model/monitor.js b/server/model/monitor.js index 19b771e..66ff390 100644 --- a/server/model/monitor.js +++ b/server/model/monitor.js @@ -49,13 +49,7 @@ class Monitor extends BeanModel { } const tags = await R.getAll("SELECT mt.*, tag.name, tag.color FROM monitor_tag mt JOIN tag ON mt.tag_id = tag.id WHERE mt.monitor_id = ?", [this.id]); - const checks = await R.getAll("SELECT mc.* FROM monitor_checks mc WHERE mc.monitor_id = ?", [this.id]); - - checks.forEach(check => { - if (MONITOR_CHECK_SELECTOR_TYPES.includes(check.type) && typeof check.value === "string" && check.value.startsWith("{")) { - check.value = JSON.parse(check.value); - } - }); + const checks = await this.getMonitorChecks(); return { id: this.id, @@ -168,7 +162,7 @@ class Monitor extends BeanModel { debug("Cert Info Query Time: " + (dayjs().valueOf() - certInfoStartTime) + "ms"); - validateMonitorChecks(res, this.checks, bean); + validateMonitorChecks(res, await this.getMonitorChecks(), bean); if (this.type === "http") { bean.status = UP; } else { @@ -497,11 +491,29 @@ class Monitor extends BeanModel { /** * Send Uptime * @param duration : int Hours + * @param io + * @param monitorID + * @param userID */ static async sendUptime(duration, io, monitorID, userID) { const uptime = await this.calcUptime(duration, monitorID); io.to(userID).emit("uptime", monitorID, duration, uptime); } + + async getMonitorChecks() { + const checks = await R.getAll("SELECT mc.* FROM monitor_checks mc WHERE mc.monitor_id = ?", [this.id]); + + checks.forEach(check => { + if (MONITOR_CHECK_SELECTOR_TYPES.includes(check.type) && typeof check.value === "string" && check.value.startsWith("{")) { + check.value = JSON.parse(check.value); + } + if (check.type === "HTTP_STATUS_CODE_SHOULD_EQUAL" && typeof check.value === "string" && check.value.startsWith("[")) { + check.value = JSON.parse(check.value); + } + }); + + return checks; + } } module.exports = Monitor; diff --git a/server/server.js b/server/server.js index 10d1dd5..e0f49c4 100644 --- a/server/server.js +++ b/server/server.js @@ -539,17 +539,17 @@ exports.entryPage = "dashboard"; let trx = await R.begin(); try { // delete existing checks for monitor - const existingMonitorChecks = await R.find("monitor_checks", " monitor_id = ?", [bean.id]); - await trx.trashAll(existingMonitorChecks); + await trx.exec("DELETE FROM `monitor_checks` WHERE monitor_id = ?", [bean.id]); // Replace them with new checks for (let i = 0; i < (checks || []).length; i++) { let checkBean = trx.dispense("monitor_checks"); - checks[i].monitor_id = bean.id; - checks[i].value = typeof checks[i].value === "object" ? JSON.stringify(checks[i].value) : checks[i].value; - checkBean.import(checks[i]); + checkBean.type = checks[i].type; + checkBean.value = typeof checks[i].value === "object" ? JSON.stringify(checks[i].value) : checks[i].value; + checkBean.monitor_id = bean.id; await trx.store(checkBean); } + await trx.commit(); } catch (err) { await trx.rollback(); throw err; diff --git a/server/validate-monitor-checks.js b/server/validate-monitor-checks.js index f88f403..aefc97b 100644 --- a/server/validate-monitor-checks.js +++ b/server/validate-monitor-checks.js @@ -4,9 +4,8 @@ const get = require("lodash.get"); function validateMonitorChecks(res, checks, bean) { const responseText = typeof data === "string" ? res.data : JSON.stringify(res.data); - let checkObj; - (this.checks || []).forEach(check => { + (checks || []).forEach(check => { switch (check.type) { case "HTTP_STATUS_CODE_SHOULD_EQUAL": if (checkStatusCode(res.status, check.value)) { @@ -54,42 +53,38 @@ function validateMonitorChecks(res, checks, bean) { break; case "RESPONSE_SELECTOR_SHOULD_EQUAL": - checkObj = JSON.parse(check.value); - if (get(res, checkObj.selector) === checkObj.value) { - bean.msg += `, response selector equals '${checkObj.value}'`; + if (get(res.data, check.value.selectorPath) === check.value.selectorValue) { + bean.msg += `, response selector equals '${check.value.selectorValue}'`; bean.status = UP; } else { - throw new Error(`${bean.msg}, but response selector '${checkObj.selector}' does not equal '${checkObj.value}'`); + throw new Error(`${bean.msg}, but response selector '${check.value.selectorPath}' does not equal '${check.value.selectorValue}'`); } break; case "RESPONSE_SELECTOR_SHOULD_NOT_EQUAL": - checkObj = JSON.parse(check.value); - if (get(res, checkObj.selector) !== checkObj.value) { - bean.msg += `, response selector does not equal '${checkObj.value}'`; + if (get(res.data, check.value.selectorPath) !== check.value.selectorValue) { + bean.msg += `, response selector does not equal '${check.value.selectorValue}'`; bean.status = UP; } else { - throw new Error(`${bean.msg}, but response selector '${checkObj.selector}' does equal '${checkObj.value}'`); + throw new Error(`${bean.msg}, but response selector '${check.value.selectorPath}' does equal '${check.value.selectorValue}'`); } break; case "RESPONSE_SELECTOR_SHOULD_MATCH_REGEX": - checkObj = JSON.parse(check.value); - if (get(res, checkObj.selector).test(new RegExp(checkObj.value))) { - bean.msg += `, response selector matches regex '${checkObj.value}'`; + if (get(res.data, check.value.selectorPath).test(new RegExp(check.value.selectorValue))) { + bean.msg += `, response selector matches regex '${check.value.selectorValue}'`; bean.status = UP; } else { - throw new Error(`${bean.msg}, but response selector '${checkObj.selector}' does not match regex '${checkObj.value}'`); + throw new Error(`${bean.msg}, but response selector '${check.value.selectorPath}' does not match regex '${check.value.selectorValue}'`); } break; case "RESPONSE_SELECTOR_SHOULD_NOT_MATCH_REGEX": - checkObj = JSON.parse(check.value); - if (!get(res, checkObj.selector).test(new RegExp(checkObj.value))) { - bean.msg += `, response selector does not match regex '${checkObj.value}'`; + if (!get(res.data, check.value.selectorPath).test(new RegExp(check.value.selectorValue))) { + bean.msg += `, response selector does not match regex '${check.value.selectorValue}'`; bean.status = UP; } else { - throw new Error(`${bean.msg}, but response selector '${checkObj.selector}' does match regex '${checkObj.value}'`); + throw new Error(`${bean.msg}, but response selector '${check.value.selectorPath}' does match regex '${check.value.selectorValue}'`); } break; diff --git a/src/components/MonitorCheckEditor.vue b/src/components/MonitorCheckEditor.vue index aa1aa01..21c3e23 100644 --- a/src/components/MonitorCheckEditor.vue +++ b/src/components/MonitorCheckEditor.vue @@ -43,7 +43,7 @@ :max-height="600" :taggable="true" :modelValue="monitorCheck.value" - @update:modelValue="changeValue($event.target.value)" + @update:model-value="changeValue" >