diff --git a/package-lock.json b/package-lock.json index d5f1699f6..c86453e52 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,7 +32,7 @@ "express-basic-auth": "~1.2.1", "express-static-gzip": "~2.1.7", "form-data": "~4.0.0", - "gamedig": "~4.1.0", + "gamedig": "^4.2.0", "html-escaper": "^3.0.3", "http-graceful-shutdown": "~3.1.7", "http-proxy-agent": "~5.0.0", @@ -65,6 +65,7 @@ "playwright-core": "~1.35.1", "prom-client": "~13.2.0", "prometheus-api-metrics": "~3.2.1", + "promisify-child-process": "~4.1.2", "protobufjs": "~7.2.4", "qs": "~6.10.4", "redbean-node": "~0.3.0", @@ -8529,9 +8530,9 @@ } }, "node_modules/gamedig": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/gamedig/-/gamedig-4.1.0.tgz", - "integrity": "sha512-jvLUEakihJgpiw9t9yQRsbcemeALeTNlnaWY1gvYdwI63ZlkxznTaLqX5K/eluRTTCtAWNW3YceT6NVjyAZIwA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/gamedig/-/gamedig-4.2.0.tgz", + "integrity": "sha512-UwV9gT1PrOTxjwGzj9/i8XJLx9QqmzFtrRJnRLqN7fZWEIRHjbuUpx2b6Y3v/5QyRDFP+vaB3Pm0hw3Xg4RnOQ==", "dependencies": { "cheerio": "^1.0.0-rc.10", "gbxremote": "^0.2.1", @@ -12943,6 +12944,14 @@ "node": ">=10" } }, + "node_modules/promisify-child-process": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/promisify-child-process/-/promisify-child-process-4.1.2.tgz", + "integrity": "sha512-APnkIgmaHNJpkAn7k+CrJSi9WMuff5ctYFbD0CO2XIPkM8yO7d/ShouU2clywbpHV/DUsyc4bpJCsNgddNtx4g==", + "engines": { + "node": ">=8" + } + }, "node_modules/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", diff --git a/package.json b/package.json index 3d4ac3fb0..36a7d9b4b 100644 --- a/package.json +++ b/package.json @@ -96,7 +96,7 @@ "express-basic-auth": "~1.2.1", "express-static-gzip": "~2.1.7", "form-data": "~4.0.0", - "gamedig": "~4.1.0", + "gamedig": "^4.2.0", "html-escaper": "^3.0.3", "http-graceful-shutdown": "~3.1.7", "http-proxy-agent": "~5.0.0", @@ -129,6 +129,7 @@ "playwright-core": "~1.35.1", "prom-client": "~13.2.0", "prometheus-api-metrics": "~3.2.1", + "promisify-child-process": "~4.1.2", "protobufjs": "~7.2.4", "qs": "~6.10.4", "redbean-node": "~0.3.0", diff --git a/server/monitor-types/real-browser-monitor-type.js b/server/monitor-types/real-browser-monitor-type.js index 4003c68eb..bda1b57c6 100644 --- a/server/monitor-types/real-browser-monitor-type.js +++ b/server/monitor-types/real-browser-monitor-type.js @@ -43,6 +43,7 @@ if (process.platform === "win32") { "/usr/bin/chromium", "/usr/bin/chromium-browser", "/usr/bin/google-chrome", + "/snap/bin/chromium", // Ubuntu ]; } else if (process.platform === "darwin") { allowedList = [ diff --git a/server/monitor-types/tailscale-ping.js b/server/monitor-types/tailscale-ping.js index 2f26894fc..1549ac4ef 100644 --- a/server/monitor-types/tailscale-ping.js +++ b/server/monitor-types/tailscale-ping.js @@ -1,6 +1,6 @@ const { MonitorType } = require("./monitor-type"); const { UP } = require("../../src/util"); -const childProcess = require("child_process"); +const childProcessAsync = require("promisify-child-process"); /** * A TailscalePing class extends the MonitorType. @@ -37,12 +37,9 @@ class TailscalePing extends MonitorType { */ async runTailscalePing(hostname, interval) { let timeout = interval * 1000 * 0.8; - let res = childProcess.spawnSync("tailscale", [ "ping", hostname ], { + let res = await childProcessAsync.spawn("tailscale", [ "ping", "--c", "1", hostname ], { timeout: timeout }); - if (res.error) { - throw new Error(`Execution error: ${res.error.message}`); - } if (res.stderr && res.stderr.toString()) { throw new Error(`Error in output: ${res.stderr.toString()}`); } diff --git a/server/notification-providers/apprise.js b/server/notification-providers/apprise.js index b624b9101..811993585 100644 --- a/server/notification-providers/apprise.js +++ b/server/notification-providers/apprise.js @@ -1,5 +1,5 @@ const NotificationProvider = require("./notification-provider"); -const childProcess = require("child_process"); +const childProcessAsync = require("promisify-child-process"); class Apprise extends NotificationProvider { @@ -14,7 +14,7 @@ class Apprise extends NotificationProvider { args.push("-t"); args.push(notification.title); } - const s = childProcess.spawnSync("apprise", args); + const s = await childProcessAsync.spawn("apprise", args); const output = (s.stdout) ? s.stdout.toString() : "ERROR: maybe apprise not found"; diff --git a/server/server.js b/server/server.js index f21288938..cde0f3814 100644 --- a/server/server.js +++ b/server/server.js @@ -1335,9 +1335,9 @@ let needSetup = false; // Update nscd status if (previousNSCDStatus !== data.nscd) { if (data.nscd) { - server.startNSCDServices(); + await server.startNSCDServices(); } else { - server.stopNSCDServices(); + await server.stopNSCDServices(); } } diff --git a/server/uptime-kuma-server.js b/server/uptime-kuma-server.js index 67321abca..f55dcde35 100644 --- a/server/uptime-kuma-server.js +++ b/server/uptime-kuma-server.js @@ -10,7 +10,7 @@ const util = require("util"); const { CacheableDnsHttpAgent } = require("./cacheable-dns-http-agent"); const { Settings } = require("./settings"); const dayjs = require("dayjs"); -const childProcess = require("child_process"); +const childProcessAsync = require("promisify-child-process"); const path = require("path"); const axios = require("axios"); // DO NOT IMPORT HERE IF THE MODULES USED `UptimeKumaServer.getInstance()`, put at the bottom of this file instead. @@ -372,7 +372,7 @@ class UptimeKumaServer { let enable = await Settings.get("nscd"); if (enable || enable === null) { - this.startNSCDServices(); + await this.startNSCDServices(); } } @@ -384,7 +384,7 @@ class UptimeKumaServer { let enable = await Settings.get("nscd"); if (enable || enable === null) { - this.stopNSCDServices(); + await this.stopNSCDServices(); } } @@ -393,11 +393,11 @@ class UptimeKumaServer { * For now, only used in Docker * @returns {void} */ - startNSCDServices() { + async startNSCDServices() { if (process.env.UPTIME_KUMA_IS_CONTAINER) { try { log.info("services", "Starting nscd"); - childProcess.execSync("sudo service nscd start", { stdio: "pipe" }); + await childProcessAsync.exec("sudo service nscd start"); } catch (e) { log.info("services", "Failed to start nscd"); } @@ -408,11 +408,11 @@ class UptimeKumaServer { * Stop all system services * @returns {void} */ - stopNSCDServices() { + async stopNSCDServices() { if (process.env.UPTIME_KUMA_IS_CONTAINER) { try { log.info("services", "Stopping nscd"); - childProcess.execSync("sudo service nscd stop"); + await childProcessAsync.exec("sudo service nscd stop"); } catch (e) { log.info("services", "Failed to stop nscd"); } diff --git a/src/components/ActionInput.vue b/src/components/ActionInput.vue index fe3504b17..44c9e586f 100644 --- a/src/components/ActionInput.vue +++ b/src/components/ActionInput.vue @@ -8,9 +8,9 @@ :placeholder="placeholder" :disabled="!enabled" > - + - + @@ -66,6 +66,13 @@ export default { action: { type: Function, default: () => {}, + }, + /** + * The aria-label of the action button + */ + actionAriaLabel: { + type: String, + required: true, } }, emits: [ "update:modelValue" ], diff --git a/src/components/ActionSelect.vue b/src/components/ActionSelect.vue index 78daebc26..b163cd3a0 100644 --- a/src/components/ActionSelect.vue +++ b/src/components/ActionSelect.vue @@ -1,11 +1,11 @@ - + {{ option.label }} - - - + + + @@ -20,6 +20,13 @@ export default { type: Array, default: () => [], }, + /** + * The id of the form which will be targeted by a {}, }, + /** + * The aria-label of the action button + */ + actionAriaLabel: { + type: String, + required: true, + }, /** * Whether the action button is disabled. * @example true diff --git a/src/components/settings/Notifications.vue b/src/components/settings/Notifications.vue index 99a8077ff..946208a9f 100644 --- a/src/components/settings/Notifications.vue +++ b/src/components/settings/Notifications.vue @@ -60,13 +60,13 @@ {{ day }} {{ $tc("day", day) }} - - + + - + diff --git a/src/lang/en.json b/src/lang/en.json index 806d6fbd6..a25d9196d 100644 --- a/src/lang/en.json +++ b/src/lang/en.json @@ -348,6 +348,8 @@ "Fingerprint:": "Fingerprint:", "No status pages": "No status pages", "Domain Name Expiry Notification": "Domain Name Expiry Notification", + "Add a new expiry notification day": "Add a new expiry notification day", + "Remove the expiry notification": "Remove the expiry notification day", "Proxy": "Proxy", "Date Created": "Date Created", "Footer Text": "Footer Text", @@ -683,6 +685,10 @@ "Notify Channel": "Notify Channel", "aboutNotifyChannel": "Notify channel will trigger a desktop or mobile notification for all members of the channel, whether their availability is set to active or away.", "Uptime Kuma URL": "Uptime Kuma URL", + "setup a new monitor group": "setup a new monitor group", + "openModalTo": "open modal to {0}", + "Add a domain": "Add a domain", + "Remove domain": "Remove domain '{0}'", "Icon Emoji": "Icon Emoji", "signalImportant": "IMPORTANT: You cannot mix groups and numbers in recipients!", "aboutWebhooks": "More info about Webhooks on: {0}", diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue index 4b82bdf67..415d43f01 100644 --- a/src/pages/EditMonitor.vue +++ b/src/pages/EditMonitor.vue @@ -291,7 +291,9 @@ {{ $t("Docker Host") }} - {{ $t("Monitor Group") }} + {{ $t("Monitor Group") }} {{ $t("Domain Names") }} - + + + - + + +