Rewrite Tailscale ping using spawnSync
This commit is contained in:
		
							parent
							
								
									b689733d59
								
							
						
					
					
						commit
						4255496b11
					
				
					 1 changed files with 18 additions and 23 deletions
				
			
		|  | @ -1,6 +1,6 @@ | ||||||
| const { MonitorType } = require("./monitor-type"); | const { MonitorType } = require("./monitor-type"); | ||||||
| const { UP, log } = require("../../src/util"); | const { UP } = require("../../src/util"); | ||||||
| const exec = require("child_process").exec; | const childProcess = require("child_process"); | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * A TailscalePing class extends the MonitorType. |  * A TailscalePing class extends the MonitorType. | ||||||
|  | @ -23,7 +23,6 @@ class TailscalePing extends MonitorType { | ||||||
|             let tailscaleOutput = await this.runTailscalePing(monitor.hostname, monitor.interval); |             let tailscaleOutput = await this.runTailscalePing(monitor.hostname, monitor.interval); | ||||||
|             this.parseTailscaleOutput(tailscaleOutput, heartbeat); |             this.parseTailscaleOutput(tailscaleOutput, heartbeat); | ||||||
|         } catch (err) { |         } catch (err) { | ||||||
|             log.debug("Tailscale", err); |  | ||||||
|             // trigger log function somewhere to display a notification or alert to the user (but how?)
 |             // trigger log function somewhere to display a notification or alert to the user (but how?)
 | ||||||
|             throw new Error(`Error checking Tailscale ping: ${err}`); |             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. |      * Runs the Tailscale ping command to the given URL. | ||||||
|      * |      * | ||||||
|      * @param {string} hostname - The hostname to ping. |      * @param {string} hostname - The hostname to ping. | ||||||
|  |      * @param {number} interval | ||||||
|      * @returns {Promise<string>} - A Promise that resolves to the output of the Tailscale ping command |      * @returns {Promise<string>} - A Promise that resolves to the output of the Tailscale ping command | ||||||
|      * @throws Will throw an error if the command execution encounters any error. |      * @throws Will throw an error if the command execution encounters any error. | ||||||
|      */ |      */ | ||||||
|     async runTailscalePing(hostname, interval) { |     async runTailscalePing(hostname, interval) { | ||||||
|         let cmd = `tailscale ping ${hostname}`; |  | ||||||
| 
 |  | ||||||
|         log.debug("Tailscale", cmd); |  | ||||||
| 
 |  | ||||||
|         return new Promise((resolve, reject) => { |  | ||||||
|         let timeout = interval * 1000 * 0.8; |         let timeout = interval * 1000 * 0.8; | ||||||
|             exec(cmd, { timeout: timeout }, (error, stdout, stderr) => { |         let res = childProcess.spawnSync("tailscale", [ "ping", hostname ], { | ||||||
|                 // 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)
 |             timeout: timeout | ||||||
|                 if (error) { |  | ||||||
|                     reject(`Execution error: ${error.message}`); |  | ||||||
|                     return; |  | ||||||
|                 } |  | ||||||
|                 if (stderr) { |  | ||||||
|                     reject(`Error in output: ${stderr}`); |  | ||||||
|                     return; |  | ||||||
|                 } |  | ||||||
| 
 |  | ||||||
|                 resolve(stdout); |  | ||||||
|             }); |  | ||||||
|         }); |         }); | ||||||
|  |         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; |                 heartbeat.status = UP; | ||||||
|                 let time = line.split(" in ")[1].split(" ")[0]; |                 let time = line.split(" in ")[1].split(" ")[0]; | ||||||
|                 heartbeat.ping = parseInt(time); |                 heartbeat.ping = parseInt(time); | ||||||
|                 heartbeat.msg = line; |                 heartbeat.msg = "OK"; | ||||||
|                 break; |                 break; | ||||||
|             } else if (line.includes("timed out")) { |             } else if (line.includes("timed out")) { | ||||||
|                 throw new Error(`Ping timed out: "${line}"`); |                 throw new Error(`Ping timed out: "${line}"`); | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue