diff --git a/src/lib/mail.ts b/src/lib/mail.ts index 935febe..2755e73 100644 --- a/src/lib/mail.ts +++ b/src/lib/mail.ts @@ -119,6 +119,7 @@ export const mail = { `) => { return async (cc?: string) => { await queueEmail(`[dw] [${os.hostname}] ${message()}`, getHtml(), cc) + return undefined } }, @@ -150,6 +151,7 @@ export const mail = { return async (cc?: string) => { console.log(`${message()}`) await queueEmail(`[dw] [${os.hostname}] ${message()}`, getHtml(), cc) + return undefined } }, } diff --git a/src/lib/types/state.ts b/src/lib/types/state.ts index 49d684e..915e31a 100644 --- a/src/lib/types/state.ts +++ b/src/lib/types/state.ts @@ -11,12 +11,14 @@ export class Watcher { this.changeToState("INIT") } - public stateOK() { + public stateOK(message = '') { this.changeToState("OK") + this._error = message } - public stateRecovered() { + public stateRecovered(message = '') { this.changeToState("RECOVERED") + this._error = message } public stateFailure(error: any) { diff --git a/src/lib/watcherLoop.ts b/src/lib/watcherLoop.ts index 61ab203..fe1d249 100644 --- a/src/lib/watcherLoop.ts +++ b/src/lib/watcherLoop.ts @@ -6,10 +6,10 @@ export function watcherLoop( onConnectionClosed: () => Promise, waitingDelay: number, recallDelay: number, - onStart: () => Promise, + onStart: () => Promise, onDisconnection: (waitingDelay: number, recallDelay: number, error: any) => Promise, onRestart: () => Promise, - onRestartSuccess: () => Promise, + onRestartSuccess: () => Promise, ): Watcher { let watcher: Watcher = new Watcher(name, recallDelay) @@ -31,11 +31,11 @@ export function watcherLoop( if (!hasStarted) { hasStarted = true - await onStart() - watcher.stateOK() + const message = await onStart() + watcher.stateOK(message) } else { - await onRestartSuccess() - watcher.stateRecovered() + const message = await onRestartSuccess() + watcher.stateRecovered(message) } // We reset the delay of reconnection diff --git a/src/lib/watchers/abstract/url-watcher.ts b/src/lib/watchers/abstract/url-watcher.ts index eee7ff6..59d60a1 100644 --- a/src/lib/watchers/abstract/url-watcher.ts +++ b/src/lib/watchers/abstract/url-watcher.ts @@ -13,12 +13,14 @@ export function urlWatcher(conf: Conf, checkValidity: (data: any) => Promise void let nodeDownPromise: Promise = new Promise(res => nodeDownRes = res) + let message: string|undefined = undefined async function checkResult(data: any) { const validity = await checkValidity(data) if (validity.error) { throw new UrlWatcherError(validity.error) } + return validity.info } return watcherLoop( @@ -27,14 +29,14 @@ export function urlWatcher(conf: Conf, checkValidity: (data: any) => Promise { try { const res = await Axios.get(urlConf.address) - await checkResult(res.data) + message = await checkResult(res.data) } catch (e) { if (interval) { clearInterval(interval) @@ -51,7 +53,10 @@ export function urlWatcher(conf: Conf, checkValidity: (data: any) => Promise getOkTitle()), + async () => { + await mail.onEstablished(urlConf.address, () => getOkTitle()) + return message + }, // When a disconnection is detected (waitingDelay: number, recallDelay, error?: any) => { @@ -68,7 +73,10 @@ export function urlWatcher(conf: Conf, checkValidity: (data: any) => Promise getRecoveredTitle()), + async () => { + await mail.onRestartSuccess(urlConf.address, () => getRecoveredTitle()) + return message + }, ) } @@ -83,8 +91,12 @@ export class UrlWatcherError { export class UrlWatcherResult { error?: string + info?: string - public static ok() { + public static ok(okMessage = '') { + if (okMessage) { + return { info: okMessage } + } return {} } diff --git a/src/lib/watchers/bma/bma-watcher.ts b/src/lib/watchers/bma/bma-watcher.ts index 6c16863..b3704ce 100644 --- a/src/lib/watchers/bma/bma-watcher.ts +++ b/src/lib/watchers/bma/bma-watcher.ts @@ -10,10 +10,11 @@ export function bmaWatcher(conf: Conf) { return urlWatcher(conf, async (data) => { const block = data as { medianTime: number } - if (bmaServer.maxLate && moment().unix() - block.medianTime > bmaServer.maxLate) { - return UrlWatcherResult.ko('Server is late') + const secondsLate = moment().unix() - block.medianTime + if (bmaServer.maxLate && secondsLate > bmaServer.maxLate) { + return UrlWatcherResult.ko('Server is late by ' + (secondsLate / 3600).toFixed(2) + ' hours') } - return UrlWatcherResult.ok() + return UrlWatcherResult.ok('Server is late by ' + (secondsLate / 3600).toFixed(2) + ' hours') })({ name: `BMA ${bmaServer.address}`, address: bmaServer.address + URL_PATH, diff --git a/src/lib/webserver.ts b/src/lib/webserver.ts index ae601c3..f5feeae 100644 --- a/src/lib/webserver.ts +++ b/src/lib/webserver.ts @@ -12,7 +12,8 @@ export function webappServe(watchers: Watcher[], host = 'localhost', port = 1050 res.send(watchers.map(watcher => { return { name: watcher.name, - state: watcher.state + state: watcher.state, + message: watcher.error, } })) }) diff --git a/src/webapp/Index.vue b/src/webapp/Index.vue index 74c010f..dde142c 100644 --- a/src/webapp/Index.vue +++ b/src/webapp/Index.vue @@ -4,6 +4,7 @@
  • {{ w.name }} {{ w.state }} + ({{ displayMessage(w.message) }})
  • @@ -41,6 +42,12 @@ return ['text-danger'] } return ['text-info'] + }, + displayMessage(msg) { + if (msg.errorMessage) { + return msg.errorMessage.errorMessage || msg.errorMessage + } + return msg } } }