@ -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 exe c = 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 } ` ;
let timeout = interval * 1000 * 0.8 ;
let res = childProcess . spawnSync ( "tailscale" , [ "ping" , hostname ] , {
log . debug ( "Tailscale" , cmd ) ;
timeout : timeout
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 ) ;
} ) ;
} ) ;
} ) ;
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 } " ` ) ;