mirror of
https://github.com/louislam/uptime-kuma.git
synced 2024-11-27 03:50:12 +03:00
Chore: Extracted the dns monitor to its own monitor-type (#3413)
* extracted the dns monitor to its own monitor-type * linting fixes * another formatting fix * Fix: Improve dnsMessage handling (#3614) * fixed docs * fixed formatting changes
This commit is contained in:
parent
f0c54be43f
commit
d6af9162c1
3 changed files with 59 additions and 41 deletions
|
@ -5,7 +5,7 @@ const { Prometheus } = require("../prometheus");
|
||||||
const { log, UP, DOWN, PENDING, MAINTENANCE, flipStatus, TimeLogger, MAX_INTERVAL_SECOND, MIN_INTERVAL_SECOND,
|
const { log, UP, DOWN, PENDING, MAINTENANCE, flipStatus, TimeLogger, MAX_INTERVAL_SECOND, MIN_INTERVAL_SECOND,
|
||||||
SQL_DATETIME_FORMAT
|
SQL_DATETIME_FORMAT
|
||||||
} = require("../../src/util");
|
} = require("../../src/util");
|
||||||
const { tcping, ping, dnsResolve, checkCertificate, checkStatusCode, getTotalClientInRoom, setting, mssqlQuery, postgresQuery, mysqlQuery, mqttAsync, setSetting, httpNtlm, radius, grpcQuery,
|
const { tcping, ping, checkCertificate, checkStatusCode, getTotalClientInRoom, setting, mssqlQuery, postgresQuery, mysqlQuery, mqttAsync, setSetting, httpNtlm, radius, grpcQuery,
|
||||||
redisPingAsync, mongodbPing, kafkaProducerAsync, getOidcTokenClientCredentials,
|
redisPingAsync, mongodbPing, kafkaProducerAsync, getOidcTokenClientCredentials,
|
||||||
} = require("../util-server");
|
} = require("../util-server");
|
||||||
const { R } = require("redbean-node");
|
const { R } = require("redbean-node");
|
||||||
|
@ -584,46 +584,6 @@ class Monitor extends BeanModel {
|
||||||
bean.ping = await ping(this.hostname, this.packetSize);
|
bean.ping = await ping(this.hostname, this.packetSize);
|
||||||
bean.msg = "";
|
bean.msg = "";
|
||||||
bean.status = UP;
|
bean.status = UP;
|
||||||
} else if (this.type === "dns") {
|
|
||||||
let startTime = dayjs().valueOf();
|
|
||||||
let dnsMessage = "";
|
|
||||||
|
|
||||||
let dnsRes = await dnsResolve(this.hostname, this.dns_resolve_server, this.port, this.dns_resolve_type);
|
|
||||||
bean.ping = dayjs().valueOf() - startTime;
|
|
||||||
|
|
||||||
if (this.dns_resolve_type === "A" || this.dns_resolve_type === "AAAA" || this.dns_resolve_type === "TXT" || this.dns_resolve_type === "PTR") {
|
|
||||||
dnsMessage += "Records: ";
|
|
||||||
dnsMessage += dnsRes.join(" | ");
|
|
||||||
} else if (this.dns_resolve_type === "CNAME") {
|
|
||||||
dnsMessage += dnsRes[0];
|
|
||||||
} else if (this.dns_resolve_type === "CAA") {
|
|
||||||
dnsMessage += dnsRes[0].issue;
|
|
||||||
} else if (this.dns_resolve_type === "MX") {
|
|
||||||
dnsRes.forEach(record => {
|
|
||||||
dnsMessage += `Hostname: ${record.exchange} - Priority: ${record.priority} | `;
|
|
||||||
});
|
|
||||||
dnsMessage = dnsMessage.slice(0, -2);
|
|
||||||
} else if (this.dns_resolve_type === "NS") {
|
|
||||||
dnsMessage += "Servers: ";
|
|
||||||
dnsMessage += dnsRes.join(" | ");
|
|
||||||
} else if (this.dns_resolve_type === "SOA") {
|
|
||||||
dnsMessage += `NS-Name: ${dnsRes.nsname} | Hostmaster: ${dnsRes.hostmaster} | Serial: ${dnsRes.serial} | Refresh: ${dnsRes.refresh} | Retry: ${dnsRes.retry} | Expire: ${dnsRes.expire} | MinTTL: ${dnsRes.minttl}`;
|
|
||||||
} else if (this.dns_resolve_type === "SRV") {
|
|
||||||
dnsRes.forEach(record => {
|
|
||||||
dnsMessage += `Name: ${record.name} | Port: ${record.port} | Priority: ${record.priority} | Weight: ${record.weight} | `;
|
|
||||||
});
|
|
||||||
dnsMessage = dnsMessage.slice(0, -2);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.dnsLastResult !== dnsMessage && dnsMessage !== undefined) {
|
|
||||||
R.exec("UPDATE `monitor` SET dns_last_result = ? WHERE id = ? ", [
|
|
||||||
dnsMessage,
|
|
||||||
this.id
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
bean.msg = dnsMessage;
|
|
||||||
bean.status = UP;
|
|
||||||
} else if (this.type === "push") { // Type: Push
|
} else if (this.type === "push") { // Type: Push
|
||||||
log.debug("monitor", `[${this.name}] Checking monitor at ${dayjs().format("YYYY-MM-DD HH:mm:ss.SSS")}`);
|
log.debug("monitor", `[${this.name}] Checking monitor at ${dayjs().format("YYYY-MM-DD HH:mm:ss.SSS")}`);
|
||||||
const bufferTime = 1000; // 1s buffer to accommodate clock differences
|
const bufferTime = 1000; // 1s buffer to accommodate clock differences
|
||||||
|
|
56
server/monitor-types/dns.js
Normal file
56
server/monitor-types/dns.js
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
const { MonitorType } = require("./monitor-type");
|
||||||
|
const { UP } = require("../../src/util");
|
||||||
|
const dayjs = require("dayjs");
|
||||||
|
const { dnsResolve } = require("../util-server");
|
||||||
|
const { R } = require("redbean-node");
|
||||||
|
|
||||||
|
class DnsMonitorType extends MonitorType {
|
||||||
|
|
||||||
|
name = "dns";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @inheritdoc
|
||||||
|
*/
|
||||||
|
async check(monitor, heartbeat, _server) {
|
||||||
|
let startTime = dayjs().valueOf();
|
||||||
|
let dnsMessage = "";
|
||||||
|
|
||||||
|
let dnsRes = await dnsResolve(monitor.hostname, monitor.dns_resolve_server, monitor.port, monitor.dns_resolve_type);
|
||||||
|
heartbeat.ping = dayjs().valueOf() - startTime;
|
||||||
|
|
||||||
|
if (monitor.dns_resolve_type === "A" || monitor.dns_resolve_type === "AAAA" || monitor.dns_resolve_type === "TXT" || monitor.dns_resolve_type === "PTR") {
|
||||||
|
dnsMessage += "Records: ";
|
||||||
|
dnsMessage += dnsRes.join(" | ");
|
||||||
|
} else if (monitor.dns_resolve_type === "CNAME" || monitor.dns_resolve_type === "PTR") {
|
||||||
|
dnsMessage += dnsRes[0];
|
||||||
|
} else if (monitor.dns_resolve_type === "CAA") {
|
||||||
|
dnsMessage += dnsRes[0].issue;
|
||||||
|
} else if (monitor.dns_resolve_type === "MX") {
|
||||||
|
dnsRes.forEach(record => {
|
||||||
|
dnsMessage += `Hostname: ${record.exchange} - Priority: ${record.priority} | `;
|
||||||
|
});
|
||||||
|
dnsMessage = dnsMessage.slice(0, -2);
|
||||||
|
} else if (monitor.dns_resolve_type === "NS") {
|
||||||
|
dnsMessage += "Servers: ";
|
||||||
|
dnsMessage += dnsRes.join(" | ");
|
||||||
|
} else if (monitor.dns_resolve_type === "SOA") {
|
||||||
|
dnsMessage += `NS-Name: ${dnsRes.nsname} | Hostmaster: ${dnsRes.hostmaster} | Serial: ${dnsRes.serial} | Refresh: ${dnsRes.refresh} | Retry: ${dnsRes.retry} | Expire: ${dnsRes.expire} | MinTTL: ${dnsRes.minttl}`;
|
||||||
|
} else if (monitor.dns_resolve_type === "SRV") {
|
||||||
|
dnsRes.forEach(record => {
|
||||||
|
dnsMessage += `Name: ${record.name} | Port: ${record.port} | Priority: ${record.priority} | Weight: ${record.weight} | `;
|
||||||
|
});
|
||||||
|
dnsMessage = dnsMessage.slice(0, -2);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (monitor.dns_last_result !== dnsMessage && dnsMessage !== undefined) {
|
||||||
|
await R.exec("UPDATE `monitor` SET dns_last_result = ? WHERE id = ? ", [ dnsMessage, monitor.id ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
heartbeat.msg = dnsMessage;
|
||||||
|
heartbeat.status = UP;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
DnsMonitorType,
|
||||||
|
};
|
|
@ -110,6 +110,7 @@ class UptimeKumaServer {
|
||||||
// Set Monitor Types
|
// Set Monitor Types
|
||||||
UptimeKumaServer.monitorTypeList["real-browser"] = new RealBrowserMonitorType();
|
UptimeKumaServer.monitorTypeList["real-browser"] = new RealBrowserMonitorType();
|
||||||
UptimeKumaServer.monitorTypeList["tailscale-ping"] = new TailscalePing();
|
UptimeKumaServer.monitorTypeList["tailscale-ping"] = new TailscalePing();
|
||||||
|
UptimeKumaServer.monitorTypeList["dns"] = new DnsMonitorType();
|
||||||
|
|
||||||
this.io = new Server(this.httpServer);
|
this.io = new Server(this.httpServer);
|
||||||
}
|
}
|
||||||
|
@ -419,3 +420,4 @@ module.exports = {
|
||||||
// Must be at the end to avoid circular dependencies
|
// Must be at the end to avoid circular dependencies
|
||||||
const { RealBrowserMonitorType } = require("./monitor-types/real-browser-monitor-type");
|
const { RealBrowserMonitorType } = require("./monitor-types/real-browser-monitor-type");
|
||||||
const { TailscalePing } = require("./monitor-types/tailscale-ping");
|
const { TailscalePing } = require("./monitor-types/tailscale-ping");
|
||||||
|
const { DnsMonitorType } = require("./monitor-types/dns");
|
||||||
|
|
Loading…
Reference in a new issue