Add deauth detection, Alerts tab, Search tab, node detail cards, UI improvements

This commit is contained in:
bot
2026-04-04 12:47:43 +03:00
parent fbf5b5c738
commit 5c0ec8cc5a
7 changed files with 668 additions and 43 deletions
+63 -11
View File
@@ -6,7 +6,7 @@
<title>ESP32 Recon</title>
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@300;400;500&display=swap" rel="stylesheet" />
<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700&display=swap" rel="stylesheet" />
<link rel="stylesheet" href="/static/dashboard.css" />
</head>
<body>
@@ -29,6 +29,7 @@
<button class="tab-btn" id="tab-clients" onclick="showClients()">Clients</button>
<button class="tab-btn" id="tab-presence" onclick="showPresence()">Presence</button>
<button class="tab-btn" id="tab-alerts" onclick="showAlerts()">Alerts</button>
<button class="tab-btn" id="tab-search" onclick="showSearch()">Search</button>
</div>
<!-- Sidebar -->
@@ -84,16 +85,16 @@
</div>
<div id="detail-stats-grid">
<div class="stat-card"><div class="label">Status</div><div class="value" id="ds-status"></div></div>
<div class="stat-card"><div class="label">Total Events</div><div class="value" id="ds-total"></div></div>
<div class="stat-card"><div class="label">Unique SSIDs</div><div class="value" id="ds-ssids"></div></div>
<div class="stat-card"><div class="label">Unique BSSIDs</div><div class="value" id="ds-bssids"></div></div>
<div class="stat-card"><div class="label">Avg RSSI</div><div class="value" id="ds-rssi-avg"></div><div class="sub" id="ds-rssi-range"></div></div>
<div class="stat-card"><div class="label">First Seen</div><div class="value" style="font-size:12px" id="ds-first"></div></div>
<div class="stat-card"><div class="label">Last Seen</div><div class="value" style="font-size:12px" id="ds-last"></div></div>
<div class="stat-card"><div class="label">Uptime</div><div class="value" id="ds-uptime"></div></div>
<div class="stat-card"><div class="label">Free Heap</div><div class="value" id="ds-heap"></div></div>
<div class="stat-card"><div class="label">AP Signal</div><div class="value" id="ds-ap-rssi"></div><div class="sub">node → router</div></div>
<div class="stat-outer"><div class="stat-dot"></div><div class="stat-card"><div class="stat-ray"></div><div class="label">Status</div><div class="value" id="ds-status"></div><div class="line topl"></div><div class="line leftl"></div><div class="line bottoml"></div><div class="line rightl"></div></div></div>
<div class="stat-outer"><div class="stat-dot"></div><div class="stat-card"><div class="stat-ray"></div><div class="label">Total Events</div><div class="value" id="ds-total"></div><div class="line topl"></div><div class="line leftl"></div><div class="line bottoml"></div><div class="line rightl"></div></div></div>
<div class="stat-outer"><div class="stat-dot"></div><div class="stat-card"><div class="stat-ray"></div><div class="label">Unique SSIDs</div><div class="value" id="ds-ssids"></div><div class="line topl"></div><div class="line leftl"></div><div class="line bottoml"></div><div class="line rightl"></div></div></div>
<div class="stat-outer"><div class="stat-dot"></div><div class="stat-card"><div class="stat-ray"></div><div class="label">Unique BSSIDs</div><div class="value" id="ds-bssids"></div><div class="line topl"></div><div class="line leftl"></div><div class="line bottoml"></div><div class="line rightl"></div></div></div>
<div class="stat-outer"><div class="stat-dot"></div><div class="stat-card"><div class="stat-ray"></div><div class="label">Avg RSSI</div><div class="value" id="ds-rssi-avg"></div><div class="sub" id="ds-rssi-range"></div><div class="line topl"></div><div class="line leftl"></div><div class="line bottoml"></div><div class="line rightl"></div></div></div>
<div class="stat-outer"><div class="stat-dot"></div><div class="stat-card"><div class="stat-ray"></div><div class="label">First Seen</div><div class="value value-sm" id="ds-first"></div><div class="line topl"></div><div class="line leftl"></div><div class="line bottoml"></div><div class="line rightl"></div></div></div>
<div class="stat-outer"><div class="stat-dot"></div><div class="stat-card"><div class="stat-ray"></div><div class="label">Last Seen</div><div class="value value-sm" id="ds-last"></div><div class="line topl"></div><div class="line leftl"></div><div class="line bottoml"></div><div class="line rightl"></div></div></div>
<div class="stat-outer"><div class="stat-dot"></div><div class="stat-card"><div class="stat-ray"></div><div class="label">Uptime</div><div class="value" id="ds-uptime"></div><div class="line topl"></div><div class="line leftl"></div><div class="line bottoml"></div><div class="line rightl"></div></div></div>
<div class="stat-outer"><div class="stat-dot"></div><div class="stat-card"><div class="stat-ray"></div><div class="label">Free Heap</div><div class="value" id="ds-heap"></div><div class="line topl"></div><div class="line leftl"></div><div class="line bottoml"></div><div class="line rightl"></div></div></div>
<div class="stat-outer"><div class="stat-dot"></div><div class="stat-card"><div class="stat-ray"></div><div class="label">AP Signal</div><div class="value" id="ds-ap-rssi"></div><div class="sub">node → router</div><div class="line topl"></div><div class="line leftl"></div><div class="line bottoml"></div><div class="line rightl"></div></div></div>
</div>
<div class="section-header" style="margin-top:4px">
@@ -311,6 +312,44 @@
<!-- Summary strip -->
<div id="alerts-summary" class="alerts-summary"></div>
<!-- Top targets / attackers -->
<div class="presence-split" style="margin-top:8px">
<div>
<div class="section-header">
<span class="section-title">Most Impersonated Networks</span>
<span class="section-count" id="targets-count"></span>
<span class="presence-sub">all time · APs spoofed as deauth source</span>
</div>
<div class="tbl-wrap">
<table>
<thead><tr>
<th>BSSID</th><th>SSID</th><th>Frames</th>
<th>Unique Srcs</th><th>Nodes</th><th>Last Seen</th>
</tr></thead>
<tbody id="targets-tbody"></tbody>
</table>
<div class="empty" id="targets-empty" style="display:none">No data yet.</div>
</div>
</div>
<div>
<div class="section-header">
<span class="section-title">Most Targeted Devices</span>
<span class="section-count" id="attackers-count"></span>
<span class="presence-sub">all time · actual victim devices by dst MAC</span>
</div>
<div class="tbl-wrap">
<table>
<thead><tr>
<th>Dst MAC</th><th>Vendor</th><th>Frames</th>
<th>Networks Used</th><th>Nodes</th><th>Last Seen</th>
</tr></thead>
<tbody id="attackers-tbody"></tbody>
</table>
<div class="empty" id="attackers-empty" style="display:none">No data yet.</div>
</div>
</div>
</div>
<!-- Detected bursts -->
<div class="section-header">
<span class="section-title">Detected Bursts</span>
@@ -346,6 +385,19 @@
</div><!-- /#view-alerts -->
<!-- Search view -->
<div id="view-search" class="view">
<div class="search-bar">
<input type="text" id="search-input" class="search-input"
placeholder="MAC address, SSID, BSSID — full or partial..."
onkeydown="if(event.key==='Enter') doSearch()" />
<button class="search-btn" onclick="doSearch()">Search</button>
</div>
<div id="search-results">
<div class="empty" id="search-empty">Enter a value above to search across all collected data.</div>
</div>
</div>
</div><!-- /#main -->
</div><!-- /#app -->