Add dashboard-a.php
This commit is contained in:
163
dashboard-a.php
Normal file
163
dashboard-a.php
Normal file
@ -0,0 +1,163 @@
|
|||||||
|
<?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>✅ 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>
|
Reference in New Issue
Block a user