Added DNS Monitor Type

This commit is contained in:
Ponkhy
2021-08-23 00:05:48 +02:00
parent 2912ca1248
commit c79be19ec3
6 changed files with 204 additions and 2 deletions

View File

@@ -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;

View File

@@ -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()) {

View File

@@ -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)

View File

@@ -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,