From 4255496b113abf4ee989333510c62f5e3f2ddc37 Mon Sep 17 00:00:00 2001 From: Louis Lam Date: Fri, 24 Nov 2023 17:29:42 +0800 Subject: [PATCH] Rewrite Tailscale ping using spawnSync --- server/monitor-types/tailscale-ping.js | 41 +++++++++++--------------- 1 file changed, 18 insertions(+), 23 deletions(-) diff --git a/server/monitor-types/tailscale-ping.js b/server/monitor-types/tailscale-ping.js index eeec9e3f3..3b2ac487f 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, log } = require("../../src/util"); -const exec = require("child_process").exec; +const { UP } = require("../../src/util"); +const childProcess = require("child_process"); /** * A TailscalePing class extends the MonitorType. @@ -23,7 +23,6 @@ class TailscalePing extends MonitorType { let tailscaleOutput = await this.runTailscalePing(monitor.hostname, monitor.interval); this.parseTailscaleOutput(tailscaleOutput, heartbeat); } catch (err) { - log.debug("Tailscale", err); // trigger log function somewhere to display a notification or alert to the user (but how?) throw new Error(`Error checking Tailscale ping: ${err}`); } @@ -33,30 +32,26 @@ class TailscalePing extends MonitorType { * Runs the Tailscale ping command to the given URL. * * @param {string} hostname - The hostname to ping. + * @param {number} interval * @returns {Promise} - A Promise that resolves to the output of the Tailscale ping command * @throws Will throw an error if the command execution encounters any error. */ async runTailscalePing(hostname, interval) { - let cmd = `tailscale ping ${hostname}`; - - log.debug("Tailscale", cmd); - - return new Promise((resolve, reject) => { - let timeout = interval * 1000 * 0.8; - exec(cmd, { timeout: timeout }, (error, stdout, stderr) => { - // we may need to handle more cases if tailscale reports an error that isn't necessarily an error (such as not-logged in or DERP health-related issues) - if (error) { - reject(`Execution error: ${error.message}`); - return; - } - if (stderr) { - reject(`Error in output: ${stderr}`); - return; - } - - resolve(stdout); - }); + let timeout = interval * 1000 * 0.8; + let res = childProcess.spawnSync("tailscale", [ "ping", 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()}`); + } + if (res.stdout && res.stdout.toString()) { + return res.stdout.toString(); + } else { + throw new Error("No output from Tailscale ping"); + } } /** @@ -74,7 +69,7 @@ class TailscalePing extends MonitorType { heartbeat.status = UP; let time = line.split(" in ")[1].split(" ")[0]; heartbeat.ping = parseInt(time); - heartbeat.msg = line; + heartbeat.msg = "OK"; break; } else if (line.includes("timed out")) { throw new Error(`Ping timed out: "${line}"`);