From 91f34dde79190a30162d7faa20ecbf44dafd2551 Mon Sep 17 00:00:00 2001 From: Fabian Triebsch Date: Wed, 4 Jun 2025 13:25:43 +0200 Subject: [PATCH] added option to force ipv4 or ipv6 for http(s) monitor type --- .../2025-06-03-0000-add-force-ipv4-ipv6.js | 13 +++++++++++++ server/model/monitor.js | 14 ++++++++++++++ server/server.js | 1 + src/pages/EditMonitor.vue | 16 ++++++++++++++++ 4 files changed, 44 insertions(+) create mode 100644 db/knex_migrations/2025-06-03-0000-add-force-ipv4-ipv6.js diff --git a/db/knex_migrations/2025-06-03-0000-add-force-ipv4-ipv6.js b/db/knex_migrations/2025-06-03-0000-add-force-ipv4-ipv6.js new file mode 100644 index 000000000..af6011cb3 --- /dev/null +++ b/db/knex_migrations/2025-06-03-0000-add-force-ipv4-ipv6.js @@ -0,0 +1,13 @@ +exports.up = function (knex) { + return knex.schema + .alterTable("monitor", function (table) { + table.boolean("force_ip").defaultTo(null); + }); +}; + +exports.down = function (knex) { + return knex.schema + .alterTable("monitor", function (table) { + table.dropColumn("force_ip"); + }); +}; diff --git a/server/model/monitor.js b/server/model/monitor.js index 741fb940e..8cbd8b16b 100644 --- a/server/model/monitor.js +++ b/server/model/monitor.js @@ -160,6 +160,7 @@ class Monitor extends BeanModel { smtpSecurity: this.smtpSecurity, rabbitmqNodes: JSON.parse(this.rabbitmqNodes), conditions: JSON.parse(this.conditions), + forceIp: this.forceIp, // ping advanced options ping_numeric: this.isPingNumeric(), @@ -426,10 +427,18 @@ class Monitor extends BeanModel { } } + const agentFamily = this.forceIp ? (this.forceIp === "ipv4" ? 4 : 6) : undefined; + const httpsAgentOptions = { maxCachedSessions: 0, // Use Custom agent to disable session reuse (https://github.com/nodejs/node/issues/3940) rejectUnauthorized: !this.getIgnoreTls(), secureOptions: crypto.constants.SSL_OP_LEGACY_SERVER_CONNECT, + ...(agentFamily ? { family: agentFamily } : {}) + }; + + const httpAgentOptions = { + maxCachedSessions: 0, + ...(agentFamily ? { family: agentFamily } : {}) }; log.debug("monitor", `[${this.name}] Prepare Options for axios`); @@ -491,6 +500,7 @@ class Monitor extends BeanModel { if (proxy && proxy.active) { const { httpAgent, httpsAgent } = Proxy.createAgents(proxy, { httpsAgentOptions: httpsAgentOptions, + httpAgentOptions: httpAgentOptions, }); options.proxy = false; @@ -499,6 +509,10 @@ class Monitor extends BeanModel { } } + if (!options.httpAgent) { + options.httpAgent = new http.Agent(httpAgentOptions); + } + if (!options.httpsAgent) { let jar = new CookieJar(); let httpsCookieAgentOptions = { diff --git a/server/server.js b/server/server.js index cba02174d..ad9ec1080 100644 --- a/server/server.js +++ b/server/server.js @@ -792,6 +792,7 @@ let needSetup = false; bean.url = monitor.url; bean.method = monitor.method; bean.body = monitor.body; + bean.forceIp = monitor.forceIp; bean.headers = monitor.headers; bean.basic_auth_user = monitor.basic_auth_user; bean.basic_auth_pass = monitor.basic_auth_pass; diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue index 95b29aa58..a998ee374 100644 --- a/src/pages/EditMonitor.vue +++ b/src/pages/EditMonitor.vue @@ -906,6 +906,21 @@ +
+ + +
+
@@ -1129,6 +1144,7 @@ const monitorDefaults = { parent: null, url: "https://", method: "GET", + forceIp: null, interval: 60, retryInterval: 60, resendInterval: 0,