Add regular (non TCP) ping
This commit is contained in:
parent
590f2ed67b
commit
168b07b4ff
|
@ -11,10 +11,12 @@
|
|||
"dependencies": {
|
||||
"@network-utils/tcp-ping": "^1.2.3",
|
||||
"discord-webhook-node": "^1.1.8",
|
||||
"dotenv": "^16.3.1"
|
||||
"dotenv": "^16.3.1",
|
||||
"ping": "^0.4.4"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "^20.10.5",
|
||||
"@types/ping": "^0.4.4",
|
||||
"typescript": "^5.3.3"
|
||||
}
|
||||
},
|
||||
|
@ -35,6 +37,12 @@
|
|||
"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": {
|
||||
"version": "0.4.0",
|
||||
"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": {
|
||||
"version": "0.0.3",
|
||||
"resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
|
||||
|
|
|
@ -12,11 +12,13 @@
|
|||
"license": "LGPL-3.0-only",
|
||||
"devDependencies": {
|
||||
"@types/node": "^20.10.5",
|
||||
"@types/ping": "^0.4.4",
|
||||
"typescript": "^5.3.3"
|
||||
},
|
||||
"dependencies": {
|
||||
"@network-utils/tcp-ping": "^1.2.3",
|
||||
"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
|
||||
destinationIds: string[]
|
||||
}))[],
|
||||
pollEndpoints: {
|
||||
pollEndpoints: ({
|
||||
name: string
|
||||
endpoint: string
|
||||
interval?: number
|
||||
notifyInterval?: number
|
||||
type: "fetch" | "ping"
|
||||
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
|
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 { sleep } from "./utils"
|
||||
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, {
|
||||
lastExec: 0,
|
||||
|
@ -11,6 +13,22 @@ let state = new Map(config.pollEndpoints.map(x => [x.name, {
|
|||
}]))
|
||||
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 curTime = Date.now()
|
||||
config.pollEndpoints.map(async endpoint => {
|
||||
|
@ -19,18 +37,9 @@ const executor = async () => {
|
|||
else if (curTime - endpointState.lastExec > ((endpoint.interval ?? defaultInterval) * 1000)) {
|
||||
console.log(`Time to poll ${endpoint.name}`)
|
||||
endpointState.lastExec = curTime
|
||||
if (endpoint.type === "fetch" ) {
|
||||
const r = await fetch(endpoint.endpoint, {method: "GET"})
|
||||
if (r.ok) handleUp(endpointState, curTime, endpoint)
|
||||
if (await isEndpointUp(endpoint)) handleUp(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