setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // --- Manuelle Bereinigung per Frontend --- if (isset($_GET['action']) && $_GET['action'] === 'cleanup') { // FEHLER BEHOBEN: Es muss $pdo heißen, nicht $db! // Zeitabgleich gefixt: Wir nutzen datetime('now', '-2 minutes'), da der INSERT auch in UTC erfolgt. $pdo->exec("DELETE FROM nodes WHERE last_seen < datetime('now', '-1 days')"); header('Content-Type: application/json'); echo json_encode(["status" => "success"]); exit; } // Tabelle erstellen, falls nicht existent $pdo->exec("CREATE TABLE IF NOT EXISTS nodes ( id INTEGER PRIMARY KEY AUTOINCREMENT, server TEXT, client TEXT, status TEXT, handshake TEXT, last_seen DATETIME DEFAULT CURRENT_TIMESTAMP, UNIQUE(server, client) )"); // POST: Daten vom Gateway empfangen if ($_SERVER['REQUEST_METHOD'] === 'POST') { $data = json_decode(file_get_contents('php://input'), true); if ($data && isset($data['server']) && isset($data['client'])) { $stmt = $pdo->prepare(" INSERT INTO nodes (server, client, status, handshake, last_seen) VALUES (:server, :client, :status, :handshake, datetime('now')) ON CONFLICT(server, client) DO UPDATE SET status=:status, handshake=:handshake, last_seen=datetime('now') "); $stmt->execute([ ':server' => $data['server'], ':client' => $data['client'], ':status' => $data['status'], ':handshake' => $data['handshake'] ]); echo json_encode(["success" => true]); } else { http_response_code(400); echo json_encode(["error" => "Invalid payload"]); } exit; } // GET: Daten an das Frontend (HTML/JS) ausliefern if ($_SERVER['REQUEST_METHOD'] === 'GET') { header('Content-Type: application/json'); $stmt = $pdo->query("SELECT * FROM nodes ORDER BY server, client"); echo json_encode($stmt->fetchAll(PDO::FETCH_ASSOC)); exit; }