implement keyword monitor

pull/6/head
LouisLam 3 years ago
parent ef028794ac
commit 1d64f643b1

@ -28,6 +28,7 @@ class Monitor extends BeanModel {
active: this.active, active: this.active,
type: this.type, type: this.type,
interval: this.interval, interval: this.interval,
keyword: this.keyword,
}; };
} }
@ -57,12 +58,25 @@ class Monitor extends BeanModel {
} }
try { try {
if (this.type === "http") { if (this.type === "http" || this.type === "keyword") {
let startTime = dayjs().valueOf(); let startTime = dayjs().valueOf();
let res = await axios.get(this.url) let res = await axios.get(this.url)
bean.msg = `${res.status} - ${res.statusText}` bean.msg = `${res.status} - ${res.statusText}`
bean.ping = dayjs().valueOf() - startTime; bean.ping = dayjs().valueOf() - startTime;
if (this.type === "http") {
bean.status = 1;
} else {
if (res.data.includes(this.keyword)) {
bean.msg += ", keyword is found"
bean.status = 1; bean.status = 1;
} else {
throw new Error(bean.msg + ", but keyword is not found")
}
}
} else if (this.type === "port") { } else if (this.type === "port") {
bean.ping = await tcping(this.hostname, this.port); bean.ping = await tcping(this.hostname, this.port);

@ -147,6 +147,7 @@ let monitorList = {};
bean.interval = monitor.interval bean.interval = monitor.interval
bean.hostname = monitor.hostname; bean.hostname = monitor.hostname;
bean.port = monitor.port; bean.port = monitor.port;
bean.keyword = monitor.keyword;
await R.store(bean) await R.store(bean)

@ -1,9 +1,13 @@
<template> <template>
<h1> {{ monitor.name }}</h1> <h1> {{ monitor.name }}</h1>
<p class="url"> <p class="url">
<a :href="monitor.url" target="_blank" v-if="monitor.type === 'http'">{{ monitor.url }}</a> <a :href="monitor.url" target="_blank" v-if="monitor.type === 'http' || monitor.type === 'keyword' ">{{ monitor.url }}</a>
<span v-if="monitor.type === 'port'">TCP Ping {{ monitor.hostname }}:{{ monitor.port }}</span> <span v-if="monitor.type === 'port'">TCP Ping {{ monitor.hostname }}:{{ monitor.port }}</span>
<span v-if="monitor.type === 'ping'">Ping: {{ monitor.hostname }}</span> <span v-if="monitor.type === 'ping'">Ping: {{ monitor.hostname }}</span>
<span v-if="monitor.type === 'keyword'">
<br />
<span>Keyword:</span> <span style="color: black">{{ monitor.keyword }}</span>
</span>
</p> </p>
<div class="functions"> <div class="functions">

@ -22,11 +22,16 @@
<input type="text" class="form-control" id="name" v-model="monitor.name" required> <input type="text" class="form-control" id="name" v-model="monitor.name" required>
</div> </div>
<div class="mb-3" v-if="monitor.type === 'http' "> <div class="mb-3" v-if="monitor.type === 'http' || monitor.type === 'keyword' ">
<label for="url" class="form-label">URL</label> <label for="url" class="form-label">URL</label>
<input type="url" class="form-control" id="url" v-model="monitor.url" pattern="https?://.+" required> <input type="url" class="form-control" id="url" v-model="monitor.url" pattern="https?://.+" required>
</div> </div>
<div class="mb-3" v-if="monitor.type === 'keyword' ">
<label for="keyword" class="form-label">Keyword <span style="color: #AAA">(search keyword in plain html response)</span></label>
<input type="text" class="form-control" id="keyword" v-model="monitor.keyword" required>
</div>
<div class="mb-3" v-if="monitor.type === 'port' || monitor.type === 'ping' "> <div class="mb-3" v-if="monitor.type === 'port' || monitor.type === 'ping' ">
<label for="hostname" class="form-label">Hostname</label> <label for="hostname" class="form-label">Hostname</label>
<input type="text" class="form-control" id="hostname" v-model="monitor.hostname" required> <input type="text" class="form-control" id="hostname" v-model="monitor.hostname" required>

Loading…
Cancel
Save