mirror of
https://github.com/louislam/uptime-kuma.git
synced 2025-08-09 06:27:04 +08:00
Added DNS Monitor Type
This commit is contained in:
@@ -9,7 +9,7 @@ class Database {
|
||||
|
||||
static templatePath = "./db/kuma.db"
|
||||
static path = "./data/kuma.db";
|
||||
static latestVersion = 6;
|
||||
static latestVersion = 7;
|
||||
static noReject = true;
|
||||
static sqliteInstance = null;
|
||||
|
||||
|
@@ -7,7 +7,7 @@ dayjs.extend(timezone)
|
||||
const axios = require("axios");
|
||||
const { Prometheus } = require("../prometheus");
|
||||
const { debug, UP, DOWN, PENDING, flipStatus, TimeLogger } = require("../../src/util");
|
||||
const { tcping, ping, checkCertificate, checkStatusCode } = require("../util-server");
|
||||
const { tcping, ping, dnsResolve, checkCertificate, checkStatusCode } = require("../util-server");
|
||||
const { R } = require("redbean-node");
|
||||
const { BeanModel } = require("redbean-node/dist/bean-model");
|
||||
const { Notification } = require("../notification")
|
||||
@@ -48,6 +48,8 @@ class Monitor extends BeanModel {
|
||||
upsideDown: this.isUpsideDown(),
|
||||
maxredirects: this.maxredirects,
|
||||
accepted_statuscodes: this.getAcceptedStatuscodes(),
|
||||
dns_resolve_type: this.dns_resolve_type,
|
||||
dns_resolve_server: this.dns_resolve_server,
|
||||
notificationIDList,
|
||||
};
|
||||
}
|
||||
@@ -175,6 +177,44 @@ class Monitor extends BeanModel {
|
||||
bean.ping = await ping(this.hostname);
|
||||
bean.msg = ""
|
||||
bean.status = UP;
|
||||
} else if (this.type === "dns") {
|
||||
let startTime = dayjs().valueOf();
|
||||
|
||||
var dnsRes = await dnsResolve(this.hostname, this.dns_resolve_server, this.dns_resolve_type);
|
||||
|
||||
var dnsMessage = "";
|
||||
|
||||
if (this.dns_resolve_type == 'A' || this.dns_resolve_type == 'AAAA' || this.dns_resolve_type == 'CNAME' || this.dns_resolve_type == 'PTR') {
|
||||
var dnsMessage = dnsRes[0];
|
||||
} else if (this.dns_resolve_type == 'CAA') {
|
||||
var dnsMessage = dnsRes[0].issue;
|
||||
} else if (this.dns_resolve_type == 'MX') {
|
||||
dnsRes.forEach(record => {
|
||||
dnsMessage += `Server: ${record.exchange} - Priority: ${record.priority} | `;
|
||||
});
|
||||
var dnsMessage = dnsMessage.slice(0, -2)
|
||||
} else if (this.dns_resolve_type == 'NS') {
|
||||
dnsRes.forEach(record => {
|
||||
dnsMessage += `Server: ${record} | `;
|
||||
});
|
||||
var dnsMessage = dnsMessage.slice(0, -2)
|
||||
} 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} | `;
|
||||
});
|
||||
var dnsMessage = dnsMessage.slice(0, -2)
|
||||
} else if (this.dns_resolve_type == 'TXT') {
|
||||
dnsRes.forEach(record => {
|
||||
dnsMessage += `Record: ${record} | `;
|
||||
});
|
||||
var dnsMessage = dnsMessage.slice(0, -2)
|
||||
}
|
||||
|
||||
bean.msg = dnsMessage;
|
||||
bean.ping = dayjs().valueOf() - startTime;
|
||||
bean.status = UP;
|
||||
}
|
||||
|
||||
if (this.isUpsideDown()) {
|
||||
|
@@ -293,6 +293,8 @@ let indexHTML = fs.readFileSync("./dist/index.html").toString();
|
||||
bean.upsideDown = monitor.upsideDown;
|
||||
bean.maxredirects = monitor.maxredirects;
|
||||
bean.accepted_statuscodes_json = JSON.stringify(monitor.accepted_statuscodes);
|
||||
bean.dns_resolve_type = monitor.dns_resolve_type;
|
||||
bean.dns_resolve_server = monitor.dns_resolve_server;
|
||||
|
||||
await R.store(bean)
|
||||
|
||||
|
@@ -4,6 +4,7 @@ const { R } = require("redbean-node");
|
||||
const { debug } = require("../src/util");
|
||||
const passwordHash = require("./password-hash");
|
||||
const dayjs = require("dayjs");
|
||||
const { Resolver } = require('dns');
|
||||
|
||||
/**
|
||||
* Init or reset JWT secret
|
||||
@@ -76,6 +77,30 @@ exports.pingAsync = function (hostname, ipv6 = false) {
|
||||
});
|
||||
}
|
||||
|
||||
exports.dnsResolve = function (hostname, resolver_server, rrtype) {
|
||||
const resolver = new Resolver();
|
||||
resolver.setServers([resolver_server]);
|
||||
return new Promise((resolve, reject) => {
|
||||
if (rrtype == 'PTR') {
|
||||
resolver.reverse(hostname, (err, records) => {
|
||||
if (err) {
|
||||
reject(err);
|
||||
} else {
|
||||
resolve(records);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
resolver.resolve(hostname, rrtype, (err, records) => {
|
||||
if (err) {
|
||||
reject(err);
|
||||
} else {
|
||||
resolve(records);
|
||||
}
|
||||
});
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
exports.setting = async function (key) {
|
||||
let value = await R.getCell("SELECT `value` FROM setting WHERE `key` = ? ", [
|
||||
key,
|
||||
|
Reference in New Issue
Block a user