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