// Extracted from newOS4 index.html — ServerMonitorModule class ServerMonitorModule { constructor() { this.commands = {}; this.terminal = null; this.servers = this.loadServers(); this.monitorInterval = null; } getHelpInfo() { return { 'server': 'Add a server to monitor: server ', 'servers': 'List all monitored servers', 'server-check': 'Check a server status: server-check ', 'server-remove': 'Remove a server: server-remove ', 'monitor': 'Toggle auto-monitoring (checks every 60s)' }; } loadServers() { try { const saved = localStorage.getItem('webx11_servers'); return saved ? JSON.parse(saved) : []; } catch (e) { return []; } } saveServers() { localStorage.setItem('webx11_servers', JSON.stringify(this.servers)); } registerCommands() { this.commands['server'] = (args) => this.addServer(args); this.commands['servers'] = () => this.listServers(); this.commands['server-check'] = (args) => this.checkServer(args); this.commands['server-remove'] = (args) => this.removeServer(args); this.commands['monitor'] = (args) => this.toggleMonitor(args); } addServer(args) { if (args.length < 2) { this.terminal.print("Usage: server ", "warning"); return; } const name = args[0], url = args[1]; this.servers.push({ name, url, status: 'unknown', lastCheck: null }); this.saveServers(); this.terminal.print(`Server '${name}' added`, "success"); } listServers() { if (this.servers.length === 0) { this.terminal.print("No servers configured", "info"); return; } this.terminal.print("=== Monitored Servers ===", "info"); this.servers.forEach((s, i) => { const statusIcon = s.status === 'online' ? '🟢' : s.status === 'offline' ? '🔴' : '⚪'; this.terminal.print(`${i + 1}. ${statusIcon} ${s.name} - ${s.url}`); if (s.lastCheck) { this.terminal.print(` Last check: ${s.lastCheck}`, "info"); } }); } async checkServer(args) { if (!args[0]) { this.terminal.print("Usage: server-check ", "warning"); return; } const server = this.findServer(args[0]); if (!server) { this.terminal.print("Server not found", "error"); return; } this.terminal.print(`Checking ${server.name}...`, "info"); try { const start = Date.now(); const response = await fetch(server.url, { method: 'HEAD', mode: 'no-cors' }); const latency = Date.now() - start; server.status = 'online'; server.lastCheck = new Date().toLocaleString(); server.latency = latency; this.saveServers(); this.terminal.print(`✅ ${server.name} is online (${latency}ms)`, "success"); } catch (e) { server.status = 'offline'; server.lastCheck = new Date().toLocaleString(); this.saveServers(); this.terminal.print(`❌ ${server.name} is offline`, "error"); } } removeServer(args) { if (!args[0]) { this.terminal.print("Usage: server-remove ", "warning"); return; } const index = this.findServerIndex(args[0]); if (index === -1) { this.terminal.print("Server not found", "error"); return; } this.servers.splice(index, 1); this.saveServers(); this.terminal.print("Server removed", "success"); } toggleMonitor(args) { if (this.monitorInterval) { clearInterval(this.monitorInterval); this.monitorInterval = null; this.terminal.print("Auto-monitor stopped", "warning"); } else { this.terminal.print("Auto-monitor started (every 60s)", "success"); this.monitorInterval = setInterval(() => { this.servers.forEach((s, i) => { this.checkServer([String(i + 1)]); }); }, 60000); } } findServer(identifier) { const index = this.findServerIndex(identifier); return index !== -1 ? this.servers[index] : null; } findServerIndex(identifier) { const idx = parseInt(identifier) - 1; if (!isNaN(idx) && idx >= 0 && idx < this.servers.length) { return idx; } return this.servers.findIndex(s => s.name.toLowerCase() === identifier.toLowerCase()); } }