0 ? round((1 - ($idle2 - $idle1) / $dt) * 100, 1) : 0; } $memLines = []; foreach (file("/proc/meminfo") as $l) { [$k, $v] = explode(":", $l, 2) + [null, null]; if ($k) $memLines[trim($k)] = (int)trim($v); } $memTotal = $memLines["MemTotal"] ?? 0; $memFree = $memLines["MemAvailable"] ?? 0; $memUsed = $memTotal - $memFree; $uptime = (int)explode(" ", file_get_contents("/proc/uptime"))[0]; $load = (float)explode(" ", file_get_contents("/proc/loadavg"))[0]; $dfOut = shell_exec("df / | tail -1 | awk {print }") ?? ""; $diskPct = trim($dfOut); // Services $svcNames = ["lshttpd", "mysql", "redis"]; $svcMap = []; foreach ($svcNames as $s) { $status = trim(shell_exec("systemctl is-active " . escapeshellarg($s) . " 2>/dev/null") ?? ""); if ($status === "active") $svcMap[$s] = true; } // Site health from kb_facts $siteLabels = [ "jarvis" => "jarvis.orbishosting.com", "tomsjavajive" => "tomsjavajive.com", "epictravelexp"=> "epictravelexpeditions.com", "parkersling" => "parkerslingshot", "orbishosting" => "orbishosting.com", "orbisportal" => "orbis.orbishosting.com", "tomtomgames" => "tomtomgames.com", ]; $sites = []; $rows = JarvisDB::query( "SELECT fact_key, fact_value FROM kb_facts WHERE category=sites AND updated_at > DATE_SUB(NOW(), INTERVAL 15 MINUTE) ORDER BY fact_key" ); foreach ($rows as $r) { $label = $siteLabels[$r["fact_key"]] ?? $r["fact_key"]; $sites[$label] = $r["fact_value"]; } $uptimeDays = intdiv($uptime, 86400); $uptimeHrs = intdiv($uptime % 86400, 3600); echo json_encode([ "ip" => DO_SERVER_IP, "reachable" => true, "cpu_pct" => getCpuPct(), "memory" => [ "total_mb" => round($memTotal / 1024), "used_mb" => round($memUsed / 1024), "percent" => $memTotal > 0 ? round(($memUsed / $memTotal) * 100, 1) : 0, ], "disk_used_pct" => $diskPct, "load_1m" => $load, "uptime" => "{$uptimeDays}d {$uptimeHrs}h", "services" => $svcMap, "sites" => $sites, "timestamp" => date("c"), ]);