Add regular (non TCP) ping
This commit is contained in:
parent
590f2ed67b
commit
168b07b4ff
|
@ -11,10 +11,12 @@
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@network-utils/tcp-ping": "^1.2.3",
|
"@network-utils/tcp-ping": "^1.2.3",
|
||||||
"discord-webhook-node": "^1.1.8",
|
"discord-webhook-node": "^1.1.8",
|
||||||
"dotenv": "^16.3.1"
|
"dotenv": "^16.3.1",
|
||||||
|
"ping": "^0.4.4"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/node": "^20.10.5",
|
"@types/node": "^20.10.5",
|
||||||
|
"@types/ping": "^0.4.4",
|
||||||
"typescript": "^5.3.3"
|
"typescript": "^5.3.3"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -35,6 +37,12 @@
|
||||||
"undici-types": "~5.26.4"
|
"undici-types": "~5.26.4"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@types/ping": {
|
||||||
|
"version": "0.4.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/ping/-/ping-0.4.4.tgz",
|
||||||
|
"integrity": "sha512-ifvo6w2f5eJYlXm+HiVx67iJe8WZp87sfa683nlqED5Vnt9Z93onkokNoWqOG21EaE8fMxyKPobE+mkPEyxsdw==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"node_modules/asynckit": {
|
"node_modules/asynckit": {
|
||||||
"version": "0.4.0",
|
"version": "0.4.0",
|
||||||
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
|
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
|
||||||
|
@ -130,6 +138,14 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/ping": {
|
||||||
|
"version": "0.4.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/ping/-/ping-0.4.4.tgz",
|
||||||
|
"integrity": "sha512-56ZMC0j7SCsMMLdOoUg12VZCfj/+ZO+yfOSjaNCRrmZZr6GLbN2X/Ui56T15dI8NhiHckaw5X2pvyfAomanwqQ==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=4.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/tr46": {
|
"node_modules/tr46": {
|
||||||
"version": "0.0.3",
|
"version": "0.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
|
"resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
|
||||||
|
|
|
@ -12,11 +12,13 @@
|
||||||
"license": "LGPL-3.0-only",
|
"license": "LGPL-3.0-only",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/node": "^20.10.5",
|
"@types/node": "^20.10.5",
|
||||||
|
"@types/ping": "^0.4.4",
|
||||||
"typescript": "^5.3.3"
|
"typescript": "^5.3.3"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@network-utils/tcp-ping": "^1.2.3",
|
"@network-utils/tcp-ping": "^1.2.3",
|
||||||
"discord-webhook-node": "^1.1.8",
|
"discord-webhook-node": "^1.1.8",
|
||||||
"dotenv": "^16.3.1"
|
"dotenv": "^16.3.1",
|
||||||
|
"ping": "^0.4.4"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,14 +19,22 @@ export type Config = {
|
||||||
token: string
|
token: string
|
||||||
destinationIds: string[]
|
destinationIds: string[]
|
||||||
}))[],
|
}))[],
|
||||||
pollEndpoints: {
|
pollEndpoints: ({
|
||||||
name: string
|
name: string
|
||||||
endpoint: string
|
|
||||||
interval?: number
|
interval?: number
|
||||||
notifyInterval?: number
|
notifyInterval?: number
|
||||||
type: "fetch" | "ping"
|
|
||||||
alertEndpoints: string[]
|
alertEndpoints: string[]
|
||||||
}[]
|
} & ({
|
||||||
|
type: "fetch"
|
||||||
|
url: string
|
||||||
|
} | {
|
||||||
|
type: "ping"
|
||||||
|
address: string
|
||||||
|
} | {
|
||||||
|
type: "tcp-ping"
|
||||||
|
address: string
|
||||||
|
port?: number
|
||||||
|
}))[]
|
||||||
}
|
}
|
||||||
|
|
||||||
export const config = JSON.parse(readFileSync("./config.json").toString()) as Config
|
export const config = JSON.parse(readFileSync("./config.json").toString()) as Config
|
29
src/index.ts
29
src/index.ts
|
@ -2,6 +2,8 @@ import { ping } from "@network-utils/tcp-ping"
|
||||||
import { defaultInterval, config } from "./config"
|
import { defaultInterval, config } from "./config"
|
||||||
import { sleep } from "./utils"
|
import { sleep } from "./utils"
|
||||||
import { handleDown, handleUp } from "./handler"
|
import { handleDown, handleUp } from "./handler"
|
||||||
|
import { Config } from "./config"
|
||||||
|
import { promise as pingPromise } from "ping"
|
||||||
|
|
||||||
let state = new Map(config.pollEndpoints.map(x => [x.name, {
|
let state = new Map(config.pollEndpoints.map(x => [x.name, {
|
||||||
lastExec: 0,
|
lastExec: 0,
|
||||||
|
@ -11,6 +13,22 @@ let state = new Map(config.pollEndpoints.map(x => [x.name, {
|
||||||
}]))
|
}]))
|
||||||
export type State = typeof state
|
export type State = typeof state
|
||||||
|
|
||||||
|
const isEndpointUp = async (endpoint: Config["pollEndpoints"][number]) => {
|
||||||
|
if (endpoint.type === "fetch" ) {
|
||||||
|
const r = await fetch(endpoint.url, {method: "GET"})
|
||||||
|
return r.ok
|
||||||
|
}
|
||||||
|
else if (endpoint.type === "tcp-ping" ) {
|
||||||
|
const r = await ping({address: endpoint.address, port:endpoint.port ?? 80})
|
||||||
|
return r.errors.length === 0
|
||||||
|
}
|
||||||
|
else if (endpoint.type === "ping") {
|
||||||
|
const r = await pingPromise.probe(endpoint.address)
|
||||||
|
return r.alive
|
||||||
|
}
|
||||||
|
else return true
|
||||||
|
}
|
||||||
|
|
||||||
const executor = async () => {
|
const executor = async () => {
|
||||||
const curTime = Date.now()
|
const curTime = Date.now()
|
||||||
config.pollEndpoints.map(async endpoint => {
|
config.pollEndpoints.map(async endpoint => {
|
||||||
|
@ -19,18 +37,9 @@ const executor = async () => {
|
||||||
else if (curTime - endpointState.lastExec > ((endpoint.interval ?? defaultInterval) * 1000)) {
|
else if (curTime - endpointState.lastExec > ((endpoint.interval ?? defaultInterval) * 1000)) {
|
||||||
console.log(`Time to poll ${endpoint.name}`)
|
console.log(`Time to poll ${endpoint.name}`)
|
||||||
endpointState.lastExec = curTime
|
endpointState.lastExec = curTime
|
||||||
if (endpoint.type === "fetch" ) {
|
if (await isEndpointUp(endpoint)) handleUp(endpointState, curTime, endpoint)
|
||||||
const r = await fetch(endpoint.endpoint, {method: "GET"})
|
|
||||||
if (r.ok) handleUp(endpointState, curTime, endpoint)
|
|
||||||
else handleDown(endpointState, curTime, endpoint)
|
else handleDown(endpointState, curTime, endpoint)
|
||||||
}
|
}
|
||||||
else if (endpoint.type === "ping" ) {
|
|
||||||
const r = await ping({address: endpoint.endpoint})
|
|
||||||
console.log(r.errors)
|
|
||||||
if (r.errors.length === 0) handleUp(endpointState, curTime, endpoint)
|
|
||||||
else handleDown(endpointState, curTime, endpoint)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue