feat(conditions): enforce all records to be checked

This commit is contained in:
Luis Briceño 2025-03-20 09:27:34 -05:00
parent 9857770cc7
commit d338274214

View file

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