Files
php-dashboards/dashboard-a.php
2025-09-03 19:28:38 +00:00

163 lines
5.0 KiB
PHP

<?php
/*
Baldnerd's PHP Dashboard [A]
Version 1.0 - By Robbie Ferguson, 2025-09-03
A landing page which reveals only basic server state info,
but not overly confidential data.
*/
if (isset($_GET['status'])) {
header('Content-Type: application/json');
// --- Memory ---
$memUsagePercent = "N/A";
$memInfo = @file("/proc/meminfo");
if ($memInfo !== false) {
$memTotal = 0;
$memAvailable = 0;
foreach ($memInfo as $line) {
if (strpos($line, "MemTotal:") === 0) {
$memTotal = (int) filter_var($line, FILTER_SANITIZE_NUMBER_INT);
}
if (strpos($line, "MemAvailable:") === 0) {
$memAvailable = (int) filter_var($line, FILTER_SANITIZE_NUMBER_INT);
}
}
if ($memTotal > 0) {
$used = $memTotal - $memAvailable;
$memUsagePercent = round(($used / $memTotal) * 100, 1);
}
}
// --- Disk ---
$diskTotal = @disk_total_space("/");
$diskFree = @disk_free_space("/");
$diskUsedPercent = $diskTotal > 0 ? round((($diskTotal - $diskFree) / $diskTotal) * 100, 1) : "N/A";
$diskFreePercent = $diskTotal > 0 ? 100 - $diskUsedPercent : "N/A";
// --- Uptime ---
$uptimeDisplay = "N/A";
$uptime = @file_get_contents("/proc/uptime");
if ($uptime !== false) {
$uptimeSeconds = explode(" ", $uptime)[0];
$days = floor($uptimeSeconds / 86400);
$hours = floor(($uptimeSeconds % 86400) / 3600);
$mins = floor(($uptimeSeconds % 3600) / 60);
$uptimeDisplay = "{$days}d {$hours}h {$mins}m";
}
// --- Load Average ---
$loadAvg = @sys_getloadavg();
$load1 = $load5 = $load15 = "N/A";
if ($loadAvg !== false) {
$load1 = $loadAvg[0];
$load5 = $loadAvg[1];
$load15 = $loadAvg[2];
}
echo json_encode([
"memory" => $memUsagePercent,
"diskUsed" => $diskUsedPercent,
"diskFree" => $diskFreePercent,
"uptime" => $uptimeDisplay,
"load1" => $load1,
"load5" => $load5,
"load15" => $load15,
"timestamp" => date("Y-m-d H:i:s")
]);
exit();
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Status</title>
<style>
body {
font-family: Arial, sans-serif;
background: #1e1e2e;
color: #e0e0e0;
text-align: center;
padding: 40px;
}
.status {
background: #2e2e3e;
padding: 20px 30px;
border-radius: 12px;
display: inline-block;
box-shadow: 0 0 15px rgba(0,0,0,0.4);
}
h1 {
color: #4ade80;
margin-bottom: 20px;
}
table {
margin: 0 auto;
border-collapse: collapse;
width: 360px;
}
td {
padding: 10px;
border-bottom: 1px solid #444;
}
td:first-child {
text-align: left;
font-weight: bold;
color: #9ca3af;
}
td:last-child {
text-align: right;
}
.last-updated {
margin-top: 15px;
font-size: 0.9em;
color: #9ca3af;
}
</style>
</head>
<body>
<div class="status">
<h1>&#9989; System Online</h1>
<table>
<tr><td>Memory Usage:</td><td id="mem">--</td></tr>
<tr><td>Disk Used:</td><td id="diskUsed">--</td></tr>
<tr><td>Disk Free:</td><td id="diskFree">--</td></tr>
<tr><td>Uptime:</td><td id="uptime">--</td></tr>
<tr><td>Load Average (1m):</td><td id="load1">--</td></tr>
<tr><td>Load Average (5m):</td><td id="load5">--</td></tr>
<tr><td>Load Average (15m):</td><td id="load15">--</td></tr>
</table>
<div class="last-updated">
Updated: <span id="lastUpdated">--</span>
</div>
</div>
<script>
async function updateStatus() {
try {
const res = await fetch("?status=1");
const data = await res.json();
document.getElementById("mem").textContent = data.memory + "%";
document.getElementById("diskUsed").textContent = data.diskUsed + "%";
document.getElementById("diskFree").textContent = data.diskFree + "%";
document.getElementById("uptime").textContent = data.uptime;
document.getElementById("load1").textContent = data.load1;
document.getElementById("load5").textContent = data.load5;
document.getElementById("load15").textContent = data.load15;
// Convert server timestamp to local timezone
const localTime = new Date(data.timestamp + " UTC");
document.getElementById("lastUpdated").textContent = localTime.toLocaleString();
} catch (e) {
console.error("Failed to fetch status:", e);
}
}
// Update immediately, then every 5s
updateStatus();
setInterval(updateStatus, 5000);
</script>
</body>
</html>