forked from VinokurovVE/tests
98 lines
3.2 KiB
TypeScript
98 lines
3.2 KiB
TypeScript
import { serve } from 'bun';
|
|
import { Database } from 'bun:sqlite';
|
|
|
|
const db = new Database('./data/servers.db');
|
|
|
|
// Initialize the database table if it doesn't exist
|
|
db.run(`
|
|
CREATE TABLE IF NOT EXISTS servers (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
name TEXT NOT NULL,
|
|
ip TEXT NOT NULL,
|
|
ping_rate INTEGER NOT NULL
|
|
)
|
|
`);
|
|
|
|
// Function to check server availability
|
|
async function checkServer(server: { name: string; ip: string; ping_rate: number; }) {
|
|
try {
|
|
const response = await Bun.spawn(['ping', '-c', '1', server.ip]);
|
|
if (response.exitCode === 0) {
|
|
console.log(`[${new Date().toISOString()}] ${server.name} (${server.ip}) is up.`);
|
|
} else {
|
|
console.error(`[${new Date().toISOString()}] ${server.name} (${server.ip}) is down!`);
|
|
}
|
|
} catch (error) {
|
|
console.error(`[${new Date().toISOString()}] Error pinging ${server.name} (${server.ip}):`, error);
|
|
}
|
|
}
|
|
|
|
// Function to monitor servers based on their individual ping rates
|
|
async function monitorServer(server: any) {
|
|
while (true) {
|
|
await checkServer(server);
|
|
await new Promise(resolve => setTimeout(resolve, server.ping_rate));
|
|
}
|
|
}
|
|
|
|
// Start monitoring all servers
|
|
async function startMonitoring() {
|
|
const servers = db.query(`SELECT * FROM servers`).all();
|
|
servers.forEach(server => monitorServer(server));
|
|
}
|
|
|
|
// Start monitoring in the background
|
|
startMonitoring();
|
|
|
|
// API Server to manage servers
|
|
const server = serve({
|
|
port: process.env.MONITOR_PORT || 1234,
|
|
fetch: async (req) => {
|
|
const url = new URL(req.url);
|
|
const pathname = url.pathname;
|
|
const method = req.method;
|
|
|
|
if (pathname === '/servers' && method === 'GET') {
|
|
const servers = db.query(`SELECT * FROM servers`).all();
|
|
return new Response(JSON.stringify(servers), {
|
|
headers: { 'Content-Type': 'application/json' },
|
|
});
|
|
}
|
|
|
|
if (pathname === '/server' && method === 'POST') {
|
|
const data = await req.json();
|
|
const { name, ip, ping_rate } = data;
|
|
|
|
if (!name || !ip || !ping_rate) {
|
|
return new Response('Missing fields', { status: 400 });
|
|
}
|
|
|
|
db.run(
|
|
`INSERT INTO servers (name, ip, ping_rate) VALUES (?, ?, ?)`,
|
|
name, ip, ping_rate
|
|
);
|
|
return new Response('Server added', { status: 201 });
|
|
}
|
|
|
|
if (pathname.startsWith('/server/') && method === 'PUT') {
|
|
const id = pathname.split('/').pop();
|
|
const data = await req.json();
|
|
const { name, ip, ping_rate } = data;
|
|
|
|
if (!id || !name || !ip || !ping_rate) {
|
|
return new Response('Missing fields', { status: 400 });
|
|
}
|
|
|
|
db.run(
|
|
`UPDATE servers SET name = ?, ip = ?, ping_rate = ? WHERE id = ?`,
|
|
name, ip, ping_rate, id
|
|
);
|
|
return new Response('Server updated', { status: 200 });
|
|
}
|
|
|
|
return new Response('Not Found', { status: 404 });
|
|
},
|
|
});
|
|
|
|
console.log(`API server and monitoring running on http://localhost:${server.port}`);
|