From 6d43cbc725b4c4f071905ab09842d58680e5c656 Mon Sep 17 00:00:00 2001 From: cgeek Date: Fri, 24 Apr 2020 18:32:20 +0200 Subject: [PATCH 1/5] WIP --- app.yml | 79 +++++++++++++++++++----------------------- src/lib/dwatch.ts | 4 ++- src/lib/types/state.ts | 3 ++ src/lib/watcherLoop.ts | 7 ++-- 4 files changed, 47 insertions(+), 46 deletions(-) create mode 100644 src/lib/types/state.ts diff --git a/app.yml b/app.yml index 6453fe9..ca7c321 100644 --- a/app.yml +++ b/app.yml @@ -1,4 +1,39 @@ connectionTimeout: 10000 +ws2pServers: + - address: ws://g1-test.cgeek.fr:22001 + expectedPubkey: 3dnbnYY9i2bHMQUGyFp5GVvJ2wBkVpus31cDJA5cfRpj + salt: test + passwd: test + currency: g1-test # Ensure we connect to the correct currency + +bmaServers: + - address: https://g1-test.cgeek.fr + frequency: 60000 # 1' +# - address: http://remuniter.cgeek.fr:16120 +# frequency: 60000 # 1' +# maxLate: 14400000 # 4h' + +dprobeHeartbeats: +# - address: https://wotwizard.cgeek.fr/dprobe.heartbeat.txt +# frequency: 60000 # 1' +# lastBeat: 300000 # 5' + +webDiffServers: +# - file1: https://wotwizard.cgeek.fr/WWMeta.json +# file2: https://wotwizard2.cgeek.fr/WWMeta.json +# frequency: 60000 + +mail: + enabled: false + host: smtp.sparkpostmail.com + port: 587 + auth: LOGIN + encryption: STARTTLS + username: SMTP_Injection + apikey: 6976eb51635b680b832dbe4914524d2c038a13b6 + from: '"DWatcher" ' + to: cem.moreau@gmail.com + reconnectionDelays: - 5000 - 10000 @@ -26,46 +61,4 @@ reconnectionDelays: - 14400000 # 4h - 21600000 # 6h - 21600000 # 6h - - 43200000 # 12h - - 43200000 # 12h - - 43200000 # 12h - - 43200000 # 12h - - 43200000 # 12h - - 43200000 # 12h - - 43200000 # 12h - - 43200000 # 12h - - 43200000 # 12h -ws2pServers: - - address: ws://g1-test.cgeek.fr:22001 - expectedPubkey: 3dnbnYY9i2bHMQUGyFp5GVvJ2wBkVpus31cDJA5cfRpj - salt: test - passwd: test - currency: g1-test # Ensure we connect to the correct currency - -bmaServers: - - address: https://g1-test.cgeek.fr - frequency: 60000 # 1' - - address: http://remuniter.cgeek.fr:16120 - frequency: 60000 # 1' - maxLate: 14400000 # 4h' - -dprobeHeartbeats: - - address: https://wotwizard.cgeek.fr/dprobe.heartbeat.txt - frequency: 60000 # 1' - lastBeat: 300000 # 5' - -webDiffServers: - - file1: https://wotwizard.cgeek.fr/WWMeta.json - file2: https://wotwizard2.cgeek.fr/WWMeta.json - frequency: 60000 - -mail: - enabled: false - host: smtp.sparkpostmail.com - port: 587 - auth: LOGIN - encryption: STARTTLS - username: SMTP_Injection - apikey: 6976eb51635b680b832dbe4914524d2c038a13b6 - from: '"DWatcher" ' - to: cem.moreau@gmail.com + - 43200000 # 12h \ No newline at end of file diff --git a/src/lib/dwatch.ts b/src/lib/dwatch.ts index ad1705a..6da0e56 100644 --- a/src/lib/dwatch.ts +++ b/src/lib/dwatch.ts @@ -5,12 +5,14 @@ import {ws2pWatcher} from "./watchers/ws2p/ws2p-watcher"; import {bmaWatcher} from "./watchers/bma/bma-watcher"; import {dprobeHeartbeat} from './watchers/dprobe/dprobe-heartbeat-watcher' import {webDiffWatcher} from "./watchers/webdiff/webdiff-watcher"; +import {ServiceState} from "./types/state"; export async function dwatch(confFile: string) { const yml = fs.readFileSync(confFile, 'utf8') const conf = yaml.load(yml) as Conf - + const states: ServiceState[] = [] + const watchers: () => Promise<> await Promise.all((conf.ws2pServers || []).map(ws2pWatcher(conf))) await Promise.all((conf.bmaServers || []).map(bmaWatcher(conf))) await Promise.all((conf.dprobeHeartbeats || []).map(dprobeHeartbeat(conf))) diff --git a/src/lib/types/state.ts b/src/lib/types/state.ts new file mode 100644 index 0000000..34b30cb --- /dev/null +++ b/src/lib/types/state.ts @@ -0,0 +1,3 @@ +export interface ServiceState { + state: 'INIT'|'OK'|'FAILURE' +} \ No newline at end of file diff --git a/src/lib/watcherLoop.ts b/src/lib/watcherLoop.ts index 82c1c26..53c89f1 100644 --- a/src/lib/watcherLoop.ts +++ b/src/lib/watcherLoop.ts @@ -1,4 +1,6 @@ -export async function watcherLoop( +import {ServiceState} from "./types/state"; + +export function watcherLoop( connect: () => Promise, onConnectionClosed: () => Promise, reconnectionDelays: number[], @@ -7,8 +9,9 @@ export async function watcherLoop( onRestart: () => Promise, onRestartSuccess: () => Promise, onError: (e: Error) => Promise, -) { +): ServiceState { + let state: ServiceState = { state: 'INIT' } let hasStarted = false ;(async () => { From f0a98ba6850f30bd27409abf69c75b51a8b28e50 Mon Sep 17 00:00:00 2001 From: cgeek Date: Thu, 30 Apr 2020 15:19:58 +0200 Subject: [PATCH 2/5] [state]: watchers return a state --- src/dwatcher.ts | 5 ++-- src/lib/dwatch.ts | 17 +++++++------ src/lib/types/conf.ts | 1 + src/lib/types/state.ts | 24 ++++++++++++++++--- src/lib/watcherLoop.ts | 12 +++++++--- src/lib/watchers/abstract/url-watcher.ts | 6 +++-- src/lib/watchers/bma/bma-watcher.ts | 3 ++- .../dprobe/dprobe-heartbeat-watcher.ts | 2 +- src/lib/watchers/webdiff/webdiff-watcher.ts | 3 ++- src/lib/watchers/ws2p/ws2p-watcher.ts | 3 ++- tsconfig.json | 3 ++- 11 files changed, 57 insertions(+), 22 deletions(-) diff --git a/src/dwatcher.ts b/src/dwatcher.ts index a2171d1..732cf5c 100644 --- a/src/dwatcher.ts +++ b/src/dwatcher.ts @@ -1,6 +1,7 @@ import * as minimist from 'minimist' import * as path from 'path' import {dwatch} from './lib/dwatch' +import {Watcher} from "./lib/types/state"; process.on('uncaughtException', (err) => { // Dunno why this specific exception is not caught @@ -20,9 +21,9 @@ process.on('unhandledRejection', (err) => { console.log('Starting...') try { - await dwatch(argv.conf || path.join(__dirname, '../app.yml')) + const watchers: Watcher[] = await dwatch(argv.conf || path.join(__dirname, '../app.yml')) } catch (e) { + // webappServe(watchers) console.error(e) } })() - diff --git a/src/lib/dwatch.ts b/src/lib/dwatch.ts index 6da0e56..8a15d0f 100644 --- a/src/lib/dwatch.ts +++ b/src/lib/dwatch.ts @@ -5,16 +5,19 @@ import {ws2pWatcher} from "./watchers/ws2p/ws2p-watcher"; import {bmaWatcher} from "./watchers/bma/bma-watcher"; import {dprobeHeartbeat} from './watchers/dprobe/dprobe-heartbeat-watcher' import {webDiffWatcher} from "./watchers/webdiff/webdiff-watcher"; -import {ServiceState} from "./types/state"; +import {Watcher} from "./types/state"; export async function dwatch(confFile: string) { const yml = fs.readFileSync(confFile, 'utf8') const conf = yaml.load(yml) as Conf - const states: ServiceState[] = [] - const watchers: () => Promise<> - await Promise.all((conf.ws2pServers || []).map(ws2pWatcher(conf))) - await Promise.all((conf.bmaServers || []).map(bmaWatcher(conf))) - await Promise.all((conf.dprobeHeartbeats || []).map(dprobeHeartbeat(conf))) - await Promise.all((conf.webDiffServers || []).map(webDiffWatcher(conf))) + const watchers: Watcher[] = []; + (await Promise.all((conf.ws2pServers || []).map(ws2pWatcher(conf)))).forEach(w => watchers.push(w)); + (await Promise.all((conf.bmaServers || []).map(bmaWatcher(conf)))).forEach(w => watchers.push(w)); + (await Promise.all((conf.dprobeHeartbeats || []).map(dprobeHeartbeat(conf)))).forEach(w => watchers.push(w)); + (await Promise.all((conf.webDiffServers || []).map(webDiffWatcher(conf)))).forEach(w => watchers.push(w)); + return watchers } + +// (await Promise.all((conf.headServers || []).map(headWatcher(conf)))).forEach(w => watchers.push(w)); +// (await Promise.all((conf.wwMeta || []).map(jsonWatcher(conf)))).forEach(w => watchers.push(w)); \ No newline at end of file diff --git a/src/lib/types/conf.ts b/src/lib/types/conf.ts index c5ca0e4..7af98b5 100644 --- a/src/lib/types/conf.ts +++ b/src/lib/types/conf.ts @@ -17,6 +17,7 @@ export interface ConfWS2P { } export interface ConfURL { + name: string address: string frequency: number } diff --git a/src/lib/types/state.ts b/src/lib/types/state.ts index 34b30cb..98b7762 100644 --- a/src/lib/types/state.ts +++ b/src/lib/types/state.ts @@ -1,3 +1,21 @@ -export interface ServiceState { - state: 'INIT'|'OK'|'FAILURE' -} \ No newline at end of file +export class Watcher { + private state: 'INIT'|'OK'|'FAILURE'|'RECOVERED' + private failureMessage?: string + + constructor(public readonly name: string) { + this.state = "INIT" + } + + public stateOK() { + this.state = "OK" + } + + public stateRecovered() { + this.state = "RECOVERED" + } + + public stateFailure(error: string) { + this.state = "FAILURE" + this.failureMessage = error + } +} diff --git a/src/lib/watcherLoop.ts b/src/lib/watcherLoop.ts index 53c89f1..a2858aa 100644 --- a/src/lib/watcherLoop.ts +++ b/src/lib/watcherLoop.ts @@ -1,6 +1,7 @@ -import {ServiceState} from "./types/state"; +import {Watcher} from "./types/state"; export function watcherLoop( + name: string, connect: () => Promise, onConnectionClosed: () => Promise, reconnectionDelays: number[], @@ -9,9 +10,9 @@ export function watcherLoop( onRestart: () => Promise, onRestartSuccess: () => Promise, onError: (e: Error) => Promise, -): ServiceState { +): Watcher { - let state: ServiceState = { state: 'INIT' } + let watcher: Watcher = new Watcher(name) let hasStarted = false ;(async () => { @@ -31,8 +32,10 @@ export function watcherLoop( if (!hasStarted) { hasStarted = true await onStart() + watcher.stateOK() } else { await onRestartSuccess() + watcher.stateRecovered() } // We reset the delay of reconnection @@ -42,6 +45,7 @@ export function watcherLoop( } catch (e) { await onError(e) + watcher.stateFailure(e && e.message || e) } // Wait before reconnecting const waitingDelay = reconnectionDelays[Math.min(reconnectionDelays.length - 1, i)] @@ -50,4 +54,6 @@ export function watcherLoop( i++ } })() + + return watcher } diff --git a/src/lib/watchers/abstract/url-watcher.ts b/src/lib/watchers/abstract/url-watcher.ts index 9df5c34..c55cb70 100644 --- a/src/lib/watchers/abstract/url-watcher.ts +++ b/src/lib/watchers/abstract/url-watcher.ts @@ -2,15 +2,17 @@ import {watcherLoop} from "../../watcherLoop"; import {Conf, ConfURL} from "../../types/conf"; import Axios from "axios"; import {mail} from "../../mail"; +import {Watcher} from "../../types/state"; export function urlWatcher(conf: Conf, checkValidity: (data: any) => Promise) { - return async (urlConf: ConfURL) => { + return async (urlConf: ConfURL): Promise => { let nodeDownRes: () => void let nodeDownPromise: Promise = new Promise(res => nodeDownRes = res) - await watcherLoop( + return watcherLoop( + urlConf.name, async () => { let interval: NodeJS.Timer; const res = await Axios.get(urlConf.address) diff --git a/src/lib/watchers/bma/bma-watcher.ts b/src/lib/watchers/bma/bma-watcher.ts index 66e0b4d..3bbf9af 100644 --- a/src/lib/watchers/bma/bma-watcher.ts +++ b/src/lib/watchers/bma/bma-watcher.ts @@ -8,12 +8,13 @@ export function bmaWatcher(conf: Conf) { return async (bmaServer: ConfBMA) => { - await urlWatcher(conf, async (data) => { + return urlWatcher(conf, async (data) => { const block = data as { medianTime: number } if (bmaServer.maxLate && moment().unix() - block.medianTime > bmaServer.maxLate) { throw 'Server is late' } })({ + name: `BMA ${bmaServer.address}`, address: bmaServer.address + URL_PATH, frequency: bmaServer.frequency }) diff --git a/src/lib/watchers/dprobe/dprobe-heartbeat-watcher.ts b/src/lib/watchers/dprobe/dprobe-heartbeat-watcher.ts index c85b578..77f48a1 100644 --- a/src/lib/watchers/dprobe/dprobe-heartbeat-watcher.ts +++ b/src/lib/watchers/dprobe/dprobe-heartbeat-watcher.ts @@ -6,7 +6,7 @@ export function dprobeHeartbeat(conf: Conf) { return async (dconf: ConfDprobeHeartbeat) => { - await urlWatcher(conf, async (data) => { + return urlWatcher(conf, async (data) => { const last = moment(data, 'YYYY-MM-DD HH:mm:ss\n') const past = moment().diff(last) if (past > dconf.lastBeat) { diff --git a/src/lib/watchers/webdiff/webdiff-watcher.ts b/src/lib/watchers/webdiff/webdiff-watcher.ts index ad5d77c..1c14bce 100644 --- a/src/lib/watchers/webdiff/webdiff-watcher.ts +++ b/src/lib/watchers/webdiff/webdiff-watcher.ts @@ -39,7 +39,8 @@ export function webDiffWatcher(conf: Conf) { } } - await watcherLoop( + return watcherLoop( + `webdiff ${target}`, async () => { const data1 = await Axios.get(webDiffConf.file1) const data2 = await Axios.get(webDiffConf.file2) diff --git a/src/lib/watchers/ws2p/ws2p-watcher.ts b/src/lib/watchers/ws2p/ws2p-watcher.ts index 4ac53f3..a73e9dc 100644 --- a/src/lib/watchers/ws2p/ws2p-watcher.ts +++ b/src/lib/watchers/ws2p/ws2p-watcher.ts @@ -16,7 +16,8 @@ export function ws2pWatcher(conf: Conf) { const keypair = new Key(keys.pub, keys.sec) const target = `${wserver.address} (${wserver.expectedPubkey.substr(0, 8)})` - await watcherLoop( + return watcherLoop( + `WS2P ${wserver.address}`, async () => { const localAuth = new WS2PPubkeyLocalAuth(wserver.currency, keypair, "", async () => true) diff --git a/tsconfig.json b/tsconfig.json index e66cf50..5927488 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -9,7 +9,8 @@ "noImplicitThis": true, "noImplicitAny": true, "noImplicitReturns": true, - "experimentalDecorators": true + "experimentalDecorators": true, + "skipLibCheck": true }, "include": [ "src/*", From 175a1e552ae2eb82ecfbb21948643b498e3e8c21 Mon Sep 17 00:00:00 2001 From: cgeek Date: Thu, 30 Apr 2020 15:26:39 +0200 Subject: [PATCH 3/5] [add] head-watcher --- app.yml | 6 ++ src/lib/types/conf.ts | 6 ++ src/lib/watchers/bma/head-watcher.ts | 104 +++++++++++++++++++++++++++ 3 files changed, 116 insertions(+) create mode 100644 src/lib/watchers/bma/head-watcher.ts diff --git a/app.yml b/app.yml index ca7c321..f82747f 100644 --- a/app.yml +++ b/app.yml @@ -23,6 +23,12 @@ webDiffServers: # file2: https://wotwizard2.cgeek.fr/WWMeta.json # frequency: 60000 +headServers: + - address: https://g1.cgeek.fr + frequency: 60000 # 1' + maxLateBlocks: 3 + observedPubkey: A5LQXCkx8b6rzppfqdqeHbKPDGmKZtRcqwxP4BSeag5r + mail: enabled: false host: smtp.sparkpostmail.com diff --git a/src/lib/types/conf.ts b/src/lib/types/conf.ts index 7af98b5..db460e4 100644 --- a/src/lib/types/conf.ts +++ b/src/lib/types/conf.ts @@ -5,6 +5,7 @@ export interface Conf { bmaServers: ConfBMA[] dprobeHeartbeats: ConfDprobeHeartbeat[] webDiffServers: ConfWebDiff[] + headServers: ConfHead[] mail: ConfMail } @@ -33,6 +34,11 @@ export interface ConfBMA extends ConfURL { maxLate?: number } +export interface ConfHead extends ConfURL { + observedPubkey: string + maxLateBlocks: number +} + export interface ConfDprobeHeartbeat extends ConfURL{ lastBeat: number } diff --git a/src/lib/watchers/bma/head-watcher.ts b/src/lib/watchers/bma/head-watcher.ts new file mode 100644 index 0000000..47c1787 --- /dev/null +++ b/src/lib/watchers/bma/head-watcher.ts @@ -0,0 +1,104 @@ +import {Conf, ConfHead} from "../../types/conf"; +import {urlWatcher} from '../abstract/url-watcher' +import {WS2PHead} from "duniter/app/modules/ws2p/lib/WS2PCluster"; + +function handleLateness(confHead: ConfHead, mainHeads: HeadMetric[], observedHead?: TrameWS2P) { + if (!mainHeads.length) { + throw 'No consensus found' + } + if (!observedHead) { + throw `Observed pubkey ${confHead.observedPubkey} not found in heads` + } + const matchingHeads = mainHeads.filter(h => h.blockstamp === observedHead.blockstamp) + if (!matchingHeads.length) { + // Check how much late is the node + const farAwayHeads = mainHeads.filter(h => h.blockNumber - observedHead.blockNumber >= confHead.maxLateBlocks) + if (farAwayHeads.length) { + throw `Observed pubkey is too late for ${farAwayHeads.length} consensus by at least ${confHead.maxLateBlocks}` + } + } +} + +export function headWatcher(conf: Conf) { + + const URL_PATH = '/network/ws2p/heads' + + return async (confHead: ConfHead) => { + + return urlWatcher(conf, async (data) => { + const heads = data as { heads: WS2PHead[] } + const mainHeads = getMain(heads) + const observedHead = getObserved(heads, confHead.observedPubkey) + handleLateness(confHead, mainHeads, observedHead) + })({ + name: `head watcher ${confHead.address}`, + address: confHead.address + URL_PATH, + frequency: confHead.frequency + }) + } +} + +function getMain(heads: { heads: WS2PHead[] }): HeadMetric[] { + const mapByHash: { [k: string]: HeadMetric } = {} + for (const head of heads.heads) { + const trame = getTrame(head) + if (trame) { + mapByHash[trame.blockstamp] = mapByHash[trame.blockstamp] || { pubkeys: [], blockNumber: trame.blockNumber, blockstamp: trame.blockstamp } + mapByHash[trame.blockstamp].pubkeys.push(trame.pubkey) + } + else { + console.warn('Pas de trame pour %s', head) + } + } + return Object.keys(mapByHash).reduce((main, blockstamp) => { + const newMetric = mapByHash[blockstamp] + if (!main.length) { + return [newMetric] + } + const newMain: HeadMetric[] = main.filter(m => m.pubkeys.length >= newMetric.pubkeys.length) + let maxLen = main.length ? main[0].pubkeys.length : newMetric.pubkeys.length + if (newMetric.pubkeys.length >= maxLen) { + newMain.push(newMetric) + } + return newMain + }, [] as HeadMetric[]) +} + +function getObserved(heads: { heads: WS2PHead[] }, observedPubkey: string): TrameWS2P|undefined { + const trame = heads.heads + .map(getTrame) + .filter(trame => trame && trame.pubkey === observedPubkey)[0] + if (!trame) { + return undefined + } + return trame +} + +function getTrame(head: WS2PHead): TrameWS2P|undefined { + if (head.messageV2) { + const [ protocol, type, trameVersion, pubkey, blockstamp, peerUuid, software, softVersion, n1, n2, n3 ] = head.messageV2.split(':') + const [ blockNumber, blockHash ] = blockstamp.split('-') + return { pubkey, blockstamp, blockNumber: parseInt(blockNumber), blockHash } + } + else if (head.message) { + const [ protocol, type, trameVersion, pubkey, blockstamp, peerUuid, software, softVersion, n1 ] = head.message.split(':') + const [ blockNumber, blockHash ] = blockstamp.split('-') + return { pubkey, blockstamp, blockNumber: parseInt(blockNumber), blockHash } + } + else { + return undefined + } +} + +interface HeadMetric { + pubkeys: string[] + blockstamp: string + blockNumber: number +} + +interface TrameWS2P { + pubkey: string + blockstamp: string + blockNumber: number + blockHash: string +} \ No newline at end of file From 3519106bbf526b44fe821ec13bd7bc4ba1c68c60 Mon Sep 17 00:00:00 2001 From: cgeek Date: Thu, 30 Apr 2020 15:28:06 +0200 Subject: [PATCH 4/5] [add] json-watcher --- app.yml | 5 ++++ src/lib/types/conf.ts | 5 ++++ src/lib/watchers/wotwizard/json-watcher.ts | 32 ++++++++++++++++++++++ 3 files changed, 42 insertions(+) create mode 100644 src/lib/watchers/wotwizard/json-watcher.ts diff --git a/app.yml b/app.yml index f82747f..c325c66 100644 --- a/app.yml +++ b/app.yml @@ -29,6 +29,11 @@ headServers: maxLateBlocks: 3 observedPubkey: A5LQXCkx8b6rzppfqdqeHbKPDGmKZtRcqwxP4BSeag5r +wwMeta: + - address: https://wot-wizard.duniter.org + frequency: 60000 # 1' + maxLate: 14400 # 4h + mail: enabled: false host: smtp.sparkpostmail.com diff --git a/src/lib/types/conf.ts b/src/lib/types/conf.ts index db460e4..cedcb4e 100644 --- a/src/lib/types/conf.ts +++ b/src/lib/types/conf.ts @@ -6,6 +6,7 @@ export interface Conf { dprobeHeartbeats: ConfDprobeHeartbeat[] webDiffServers: ConfWebDiff[] headServers: ConfHead[] + wwMeta: ConfWWMeta[] mail: ConfMail } @@ -39,6 +40,10 @@ export interface ConfHead extends ConfURL { maxLateBlocks: number } +export interface ConfWWMeta extends ConfURL { + maxLate: number +} + export interface ConfDprobeHeartbeat extends ConfURL{ lastBeat: number } diff --git a/src/lib/watchers/wotwizard/json-watcher.ts b/src/lib/watchers/wotwizard/json-watcher.ts new file mode 100644 index 0000000..83c6d63 --- /dev/null +++ b/src/lib/watchers/wotwizard/json-watcher.ts @@ -0,0 +1,32 @@ +import {Conf, ConfWWMeta} from "../../types/conf"; +import {urlWatcher} from '../abstract/url-watcher' + +function handleLateness(confHead: ConfWWMeta, data: WWMetaJson) { + const diff = Math.round(Date.now()/1000 - data.now) + if (diff >= confHead.maxLate) { + throw `WWMeta.json is late by ${diff}s (>= ${confHead.maxLate})` + } +} + +export function jsonWatcher(conf: Conf) { + + const URL_PATH = '/WWMeta.json' + + return async (confWWMeta: ConfWWMeta) => { + + return urlWatcher(conf, async (data) => { + handleLateness(confWWMeta, data) + })({ + name: `WWMeta.json watcher ${confWWMeta.address}`, + address: confWWMeta.address + URL_PATH, + frequency: confWWMeta.frequency + }) + } +} + +interface WWMetaJson { + dossNb: number + block: number + now: number + computation_duration: number +} \ No newline at end of file From 09487232bebc229e2cef8e37e363b7ea45650007 Mon Sep 17 00:00:00 2001 From: cgeek Date: Thu, 30 Apr 2020 15:30:20 +0200 Subject: [PATCH 5/5] [mod] enable head/ww watchers --- src/lib/dwatch.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/lib/dwatch.ts b/src/lib/dwatch.ts index 8a15d0f..7d971f6 100644 --- a/src/lib/dwatch.ts +++ b/src/lib/dwatch.ts @@ -6,6 +6,8 @@ import {bmaWatcher} from "./watchers/bma/bma-watcher"; import {dprobeHeartbeat} from './watchers/dprobe/dprobe-heartbeat-watcher' import {webDiffWatcher} from "./watchers/webdiff/webdiff-watcher"; import {Watcher} from "./types/state"; +import {headWatcher} from "./watchers/bma/head-watcher"; +import {jsonWatcher} from "./watchers/wotwizard/json-watcher"; export async function dwatch(confFile: string) { @@ -16,8 +18,7 @@ export async function dwatch(confFile: string) { (await Promise.all((conf.bmaServers || []).map(bmaWatcher(conf)))).forEach(w => watchers.push(w)); (await Promise.all((conf.dprobeHeartbeats || []).map(dprobeHeartbeat(conf)))).forEach(w => watchers.push(w)); (await Promise.all((conf.webDiffServers || []).map(webDiffWatcher(conf)))).forEach(w => watchers.push(w)); + (await Promise.all((conf.headServers || []).map(headWatcher(conf)))).forEach(w => watchers.push(w)); + (await Promise.all((conf.wwMeta || []).map(jsonWatcher(conf)))).forEach(w => watchers.push(w)); return watchers } - -// (await Promise.all((conf.headServers || []).map(headWatcher(conf)))).forEach(w => watchers.push(w)); -// (await Promise.all((conf.wwMeta || []).map(jsonWatcher(conf)))).forEach(w => watchers.push(w)); \ No newline at end of file