From d9fa67ae0300ecd88d587c5bb6abb35fb5dcc72a Mon Sep 17 00:00:00 2001 From: Mario Garrido Date: Tue, 1 Jul 2025 05:36:58 +0100 Subject: [PATCH 1/7] Monitor GameDig: Resolve domain to IP before request --- server/model/monitor.js | 16 ---------- server/monitor-types/gamedig.js | 56 +++++++++++++++++++++++++++++++++ server/uptime-kuma-server.js | 2 ++ src/pages/EditMonitor.vue | 28 ++++++++++++----- 4 files changed, 78 insertions(+), 24 deletions(-) create mode 100644 server/monitor-types/gamedig.js diff --git a/server/model/monitor.js b/server/model/monitor.js index 3be8267c9..c492c9e7b 100644 --- a/server/model/monitor.js +++ b/server/model/monitor.js @@ -20,7 +20,6 @@ const version = require("../../package.json").version; const apicache = require("../modules/apicache"); const { UptimeKumaServer } = require("../uptime-kuma-server"); const { DockerHost } = require("../docker"); -const Gamedig = require("gamedig"); const jwt = require("jsonwebtoken"); const crypto = require("crypto"); const { UptimeCalculator } = require("../uptime-calculator"); @@ -702,21 +701,6 @@ class Monitor extends BeanModel { } else { throw new Error("Server not found on Steam"); } - } else if (this.type === "gamedig") { - try { - const state = await Gamedig.query({ - type: this.game, - host: this.hostname, - port: this.port, - givenPortOnly: this.getGameDigGivenPortOnly(), - }); - - bean.msg = state.name; - bean.status = UP; - bean.ping = state.ping; - } catch (e) { - throw new Error(e.message); - } } else if (this.type === "docker") { log.debug("monitor", `[${this.name}] Prepare Options for Axios`); diff --git a/server/monitor-types/gamedig.js b/server/monitor-types/gamedig.js new file mode 100644 index 000000000..b1fa64347 --- /dev/null +++ b/server/monitor-types/gamedig.js @@ -0,0 +1,56 @@ +const { MonitorType } = require("./monitor-type"); +const { UP, DOWN } = require("../../src/util"); +const Gamedig = require("gamedig"); +const dns = require("dns").promises; + +class GameDigMonitorType extends MonitorType { + name = "gamedig"; + + /** + * @inheritdoc + */ + async check(monitor, heartbeat, server) { + heartbeat.status = DOWN; + + let host = monitor.hostname; + + if (monitor.gamedigResolveHostToIP) { + host = await this.resolveHostname(monitor.hostname); + } + + try { + const state = await Gamedig.query({ + type: monitor.game, + host: host, + port: monitor.port, + givenPortOnly: Boolean(monitor.gamedigGivenPortOnly), + }); + + heartbeat.msg = state.name; + heartbeat.status = UP; + heartbeat.ping = state.ping; + } catch (e) { + throw new Error(e.message); + } + } + + /** + * Resolves a domain name to its IPv4 address. + * + * @param {string} hostname - The domain name to resolve (e.g., "example.dyndns.org"). + * @returns {Promise} - The resolved IP address. + * @throws Will throw an error if the DNS resolution fails. + */ + async resolveHostname(hostname) { + try { + const result = await dns.lookup(hostname); + return result.address; + } catch (err) { + throw new Error(`DNS resolution failed for ${hostname}: ${err.message}`); + } + } +} + +module.exports = { + GameDigMonitorType, +}; diff --git a/server/uptime-kuma-server.js b/server/uptime-kuma-server.js index a04e6bd49..0ea60178c 100644 --- a/server/uptime-kuma-server.js +++ b/server/uptime-kuma-server.js @@ -118,6 +118,7 @@ class UptimeKumaServer { UptimeKumaServer.monitorTypeList["snmp"] = new SNMPMonitorType(); UptimeKumaServer.monitorTypeList["mongodb"] = new MongodbMonitorType(); UptimeKumaServer.monitorTypeList["rabbitmq"] = new RabbitMqMonitorType(); + UptimeKumaServer.monitorTypeList["gamedig"] = new GameDigMonitorType(); UptimeKumaServer.monitorTypeList["manual"] = new ManualMonitorType(); // Allow all CORS origins (polling) in development @@ -559,5 +560,6 @@ const { GroupMonitorType } = require("./monitor-types/group"); const { SNMPMonitorType } = require("./monitor-types/snmp"); const { MongodbMonitorType } = require("./monitor-types/mongodb"); const { RabbitMqMonitorType } = require("./monitor-types/rabbitmq"); +const { GameDigMonitorType } = require("./monitor-types/gamedig"); const { ManualMonitorType } = require("./monitor-types/manual"); const Monitor = require("./model/monitor"); diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue index 1b7af4184..01a4425ae 100644 --- a/src/pages/EditMonitor.vue +++ b/src/pages/EditMonitor.vue @@ -201,14 +201,25 @@ -
- - -
+