From 0c055d8608c791f12cebc25a23728565c382e961 Mon Sep 17 00:00:00 2001 From: Nicole Rappe Date: Wed, 13 Aug 2025 01:15:14 -0600 Subject: [PATCH] feat: show device status and dedupe agents --- Data/Server/WebUI/src/Device_Details.jsx | 24 +++++++++++++++++++++++- Data/Server/server.py | 11 +++++++++-- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/Data/Server/WebUI/src/Device_Details.jsx b/Data/Server/WebUI/src/Device_Details.jsx index 816e792..5309b8a 100644 --- a/Data/Server/WebUI/src/Device_Details.jsx +++ b/Data/Server/WebUI/src/Device_Details.jsx @@ -27,6 +27,14 @@ export default function DeviceDetails({ device, onBack }) { const [softwareSearch, setSoftwareSearch] = useState(""); const [description, setDescription] = useState(""); + const statusFromHeartbeat = (tsSec, offlineAfter = 15) => { + if (!tsSec) return "Offline"; + const now = Date.now() / 1000; + return now - tsSec <= offlineAfter ? "Online" : "Offline"; + }; + + const statusColor = (s) => (s === "Online" ? "#00d18c" : "#ff4f4f"); + useEffect(() => { if (!device || !device.hostname) return; const load = async () => { @@ -373,6 +381,7 @@ export default function DeviceDetails({ device, onBack }) { { label: "Storage", content: renderStorage() }, { label: "Network", content: renderNetwork() } ]; + const status = statusFromHeartbeat(agent.last_seen || device?.lastSeen); return ( @@ -382,7 +391,20 @@ export default function DeviceDetails({ device, onBack }) { Back )} - + + {agent.hostname || "Device Details"} diff --git a/Data/Server/server.py b/Data/Server/server.py index 8e0474e..9738f97 100644 --- a/Data/Server/server.py +++ b/Data/Server/server.py @@ -640,11 +640,18 @@ def on_agent_heartbeat(data): agent_id = data.get("agent_id") if not agent_id: return + hostname = data.get("hostname") + + if hostname: + for aid, info in list(registered_agents.items()): + if aid != agent_id and info.get("hostname") == hostname: + registered_agents.pop(aid, None) + agent_configurations.pop(aid, None) rec = registered_agents.setdefault(agent_id, {}) rec["agent_id"] = agent_id - if data.get("hostname"): - rec["hostname"] = data.get("hostname") + if hostname: + rec["hostname"] = hostname if data.get("agent_operating_system"): rec["agent_operating_system"] = data.get("agent_operating_system") rec["last_seen"] = int(data.get("last_seen") or time.time())