Files
universal_is/monitor/index.ts
2024-08-26 16:11:37 +09:00

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}`);