2024-01-01 03:45:00 +00:00
|
|
|
import cron from "node-cron";
|
2024-01-01 19:43:19 +00:00
|
|
|
import { database, serverManager, websocketServer } from "..";
|
|
|
|
import Server, { ServerStatus } from "../server/server";
|
2024-01-01 03:45:00 +00:00
|
|
|
|
|
|
|
import Config from "../../data/config.json";
|
2024-01-01 17:04:19 +00:00
|
|
|
import { logger } from "../utils/logger";
|
2024-01-01 03:45:00 +00:00
|
|
|
|
|
|
|
export default class Scanner {
|
|
|
|
constructor() {
|
2024-01-01 17:04:19 +00:00
|
|
|
logger.info("Loading scanner database");
|
2024-01-01 03:45:00 +00:00
|
|
|
|
|
|
|
cron.schedule(Config.scanner.updateCron, () => {
|
|
|
|
this.scanServers();
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Start a server scan to ping all servers.
|
|
|
|
*/
|
|
|
|
private async scanServers(): Promise<void> {
|
2024-01-01 17:04:19 +00:00
|
|
|
logger.info(`Scanning servers ${serverManager.getServers().length}`);
|
2024-01-01 03:45:00 +00:00
|
|
|
|
|
|
|
// ping all servers in parallel
|
|
|
|
await Promise.all(
|
|
|
|
serverManager.getServers().map((server) => this.scanServer(server))
|
|
|
|
);
|
|
|
|
|
2024-01-01 17:04:19 +00:00
|
|
|
logger.info("Finished scanning servers");
|
2024-01-01 03:45:00 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Scans a server and inserts the ping into the database.
|
|
|
|
*
|
|
|
|
* @param server the server to scan
|
|
|
|
* @returns a promise that resolves when the server has been scanned
|
|
|
|
*/
|
|
|
|
async scanServer(server: Server): Promise<void> {
|
2024-01-01 17:04:19 +00:00
|
|
|
//logger.info(`Scanning server ${server.getIP()} - ${server.getType()}`);
|
2024-01-01 03:45:00 +00:00
|
|
|
let response;
|
|
|
|
let online = false;
|
|
|
|
|
|
|
|
try {
|
2024-01-01 22:16:13 +00:00
|
|
|
response = await server.pingServer();
|
2024-01-01 03:45:00 +00:00
|
|
|
if (response == undefined) {
|
|
|
|
return; // Server is offline
|
|
|
|
}
|
|
|
|
online = true;
|
|
|
|
} catch (err) {
|
2024-01-01 17:04:19 +00:00
|
|
|
logger.info(`Failed to ping ${server.getIP()}`, err);
|
2024-01-01 19:43:19 +00:00
|
|
|
websocketServer.sendServerError(server, ServerStatus.OFFLINE);
|
2024-01-01 03:45:00 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!online || !response) {
|
|
|
|
return; // Server is offline
|
|
|
|
}
|
|
|
|
|
2024-01-01 17:04:19 +00:00
|
|
|
database.insertPing(server, response);
|
2024-01-01 19:43:19 +00:00
|
|
|
const isNewRecord = database.insertRecord(server, response);
|
|
|
|
|
|
|
|
// todo: send all server pings at once
|
|
|
|
websocketServer.sendNewPing(server, response, isNewRecord);
|
2024-01-01 03:45:00 +00:00
|
|
|
}
|
|
|
|
}
|