mirror of
https://github.com/louislam/uptime-kuma.git
synced 2025-06-01 19:32:34 +02:00
feat(conditions): enforce all records to be checked
This commit is contained in:
parent
9857770cc7
commit
d338274214
1 changed files with 63 additions and 13 deletions
|
@ -5,7 +5,9 @@ const { dnsResolve } = require("../util-server");
|
||||||
const { R } = require("redbean-node");
|
const { R } = require("redbean-node");
|
||||||
const { ConditionVariable } = require("../monitor-conditions/variables");
|
const { ConditionVariable } = require("../monitor-conditions/variables");
|
||||||
const { defaultStringOperators } = require("../monitor-conditions/operators");
|
const { defaultStringOperators } = require("../monitor-conditions/operators");
|
||||||
const { ConditionExpressionGroup } = require("../monitor-conditions/expression");
|
const {
|
||||||
|
ConditionExpressionGroup,
|
||||||
|
} = require("../monitor-conditions/expression");
|
||||||
const { evaluateExpressionGroup } = require("../monitor-conditions/evaluator");
|
const { evaluateExpressionGroup } = require("../monitor-conditions/evaluator");
|
||||||
|
|
||||||
class DnsMonitorType extends MonitorType {
|
class DnsMonitorType extends MonitorType {
|
||||||
|
@ -14,9 +16,13 @@ class DnsMonitorType extends MonitorType {
|
||||||
supportsConditions = true;
|
supportsConditions = true;
|
||||||
|
|
||||||
conditionVariables = [
|
conditionVariables = [
|
||||||
new ConditionVariable("record", defaultStringOperators ),
|
new ConditionVariable("record", defaultStringOperators),
|
||||||
];
|
];
|
||||||
|
|
||||||
|
enforceAllConditions = process.env.UPTIME_KUMA_CONDITIONS_ALL
|
||||||
|
? process.env.UPTIME_KUMA_CONDITIONS_ALL !== "0"
|
||||||
|
: false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @inheritdoc
|
* @inheritdoc
|
||||||
*/
|
*/
|
||||||
|
@ -24,12 +30,18 @@ class DnsMonitorType extends MonitorType {
|
||||||
let startTime = dayjs().valueOf();
|
let startTime = dayjs().valueOf();
|
||||||
let dnsMessage = "";
|
let dnsMessage = "";
|
||||||
|
|
||||||
let dnsRes = await dnsResolve(monitor.hostname, monitor.dns_resolve_server, monitor.port, monitor.dns_resolve_type);
|
let dnsRes = await dnsResolve(
|
||||||
|
monitor.hostname,
|
||||||
|
monitor.dns_resolve_server,
|
||||||
|
monitor.port,
|
||||||
|
monitor.dns_resolve_type
|
||||||
|
);
|
||||||
heartbeat.ping = dayjs().valueOf() - startTime;
|
heartbeat.ping = dayjs().valueOf() - startTime;
|
||||||
|
|
||||||
const conditions = ConditionExpressionGroup.fromMonitor(monitor);
|
const conditions = ConditionExpressionGroup.fromMonitor(monitor);
|
||||||
let conditionsResult = true;
|
let conditionsResult = true;
|
||||||
const handleConditions = (data) => conditions ? evaluateExpressionGroup(conditions, data) : true;
|
const handleConditions = (data) =>
|
||||||
|
conditions ? evaluateExpressionGroup(conditions, data) : true;
|
||||||
|
|
||||||
switch (monitor.dns_resolve_type) {
|
switch (monitor.dns_resolve_type) {
|
||||||
case "A":
|
case "A":
|
||||||
|
@ -37,7 +49,9 @@ class DnsMonitorType extends MonitorType {
|
||||||
case "TXT":
|
case "TXT":
|
||||||
case "PTR":
|
case "PTR":
|
||||||
dnsMessage = `Records: ${dnsRes.join(" | ")}`;
|
dnsMessage = `Records: ${dnsRes.join(" | ")}`;
|
||||||
conditionsResult = dnsRes.some(record => handleConditions({ record }));
|
conditionsResult = this.enforceAllConditions
|
||||||
|
? dnsRes.every((record) => handleConditions({ record }))
|
||||||
|
: dnsRes.some((record) => handleConditions({ record }));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "CNAME":
|
case "CNAME":
|
||||||
|
@ -47,17 +61,36 @@ class DnsMonitorType extends MonitorType {
|
||||||
|
|
||||||
case "CAA":
|
case "CAA":
|
||||||
dnsMessage = dnsRes[0].issue;
|
dnsMessage = dnsRes[0].issue;
|
||||||
conditionsResult = handleConditions({ record: dnsRes[0].issue });
|
conditionsResult = handleConditions({
|
||||||
|
record: dnsRes[0].issue,
|
||||||
|
});
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "MX":
|
case "MX":
|
||||||
dnsMessage = dnsRes.map(record => `Hostname: ${record.exchange} - Priority: ${record.priority}`).join(" | ");
|
dnsMessage = dnsRes
|
||||||
conditionsResult = dnsRes.some(record => handleConditions({ record: record.exchange }));
|
.map(
|
||||||
|
(record) =>
|
||||||
|
`Hostname: ${record.exchange} - Priority: ${record.priority}`
|
||||||
|
)
|
||||||
|
.join(" | ");
|
||||||
|
conditionsResult = this.enforceAllConditions
|
||||||
|
? dnsRes.every((record) =>
|
||||||
|
handleConditions({ record: record.exchange })
|
||||||
|
)
|
||||||
|
: dnsRes.some((record) =>
|
||||||
|
handleConditions({ record: record.exchange })
|
||||||
|
);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "NS":
|
case "NS":
|
||||||
dnsMessage = `Servers: ${dnsRes.join(" | ")}`;
|
dnsMessage = `Servers: ${dnsRes.join(" | ")}`;
|
||||||
conditionsResult = dnsRes.some(record => handleConditions({ record }));
|
conditionsResult = this.enforceAllConditions
|
||||||
|
? dnsRes.every((record) =>
|
||||||
|
handleConditions({ record })
|
||||||
|
) :
|
||||||
|
dnsRes.some((record) =>
|
||||||
|
handleConditions({ record })
|
||||||
|
);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "SOA":
|
case "SOA":
|
||||||
|
@ -66,13 +99,30 @@ class DnsMonitorType extends MonitorType {
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "SRV":
|
case "SRV":
|
||||||
dnsMessage = dnsRes.map(record => `Name: ${record.name} | Port: ${record.port} | Priority: ${record.priority} | Weight: ${record.weight}`).join(" | ");
|
dnsMessage = dnsRes
|
||||||
conditionsResult = dnsRes.some(record => handleConditions({ record: record.name }));
|
.map(
|
||||||
|
(record) =>
|
||||||
|
`Name: ${record.name} | Port: ${record.port} | Priority: ${record.priority} | Weight: ${record.weight}`
|
||||||
|
)
|
||||||
|
.join(" | ");
|
||||||
|
conditionsResult = this.enforceAllConditions
|
||||||
|
? dnsRes.every((record) =>
|
||||||
|
handleConditions({ record: record.name })
|
||||||
|
)
|
||||||
|
: dnsRes.some((record) =>
|
||||||
|
handleConditions({ record: record.name })
|
||||||
|
);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (monitor.dns_last_result !== dnsMessage && dnsMessage !== undefined) {
|
if (
|
||||||
await R.exec("UPDATE `monitor` SET dns_last_result = ? WHERE id = ? ", [ dnsMessage, monitor.id ]);
|
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.msg = dnsMessage;
|
||||||
|
|
Loading…
Add table
Reference in a new issue