From 8d5a6638170f9eb8c7f5003df8d05b026a1b577a Mon Sep 17 00:00:00 2001 From: "Jokob @NetAlertX" <96159884+jokob-sk@users.noreply.github.com> Date: Mon, 1 Dec 2025 08:27:14 +0000 Subject: [PATCH] DevInstance and PluginObjectInstance expansion --- server/models/device_instance.py | 38 +++++++++++++++++++++++++ server/models/plugin_object_instance.py | 9 ++++++ 2 files changed, 47 insertions(+) diff --git a/server/models/device_instance.py b/server/models/device_instance.py index 795950bf..5400e1c0 100755 --- a/server/models/device_instance.py +++ b/server/models/device_instance.py @@ -57,6 +57,44 @@ class DeviceInstance: result = self.db.sql.fetchone() return result["count"] > 0 + # Get a device by its last IP address + def getByIP(self, ip): + self.db.sql.execute("SELECT * FROM Devices WHERE devLastIP = ?", (ip,)) + row = self.db.sql.fetchone() + return dict(row) if row else None + + # Search devices by partial mac, name or IP + def search(self, query): + like = f"%{query}%" + self.db.sql.execute( + "SELECT * FROM Devices WHERE devMac LIKE ? OR devName LIKE ? OR devLastIP LIKE ?", + (like, like, like), + ) + rows = self.db.sql.fetchall() + return [dict(r) for r in rows] + + # Get the most recently discovered device + def getLatest(self): + self.db.sql.execute("SELECT * FROM Devices ORDER BY devFirstConnection DESC LIMIT 1") + row = self.db.sql.fetchone() + return dict(row) if row else None + + def getNetworkTopology(self): + """Returns nodes and links for the current Devices table. + + Nodes: {id, name, vendor} + Links: {source, target, port} + """ + self.db.sql.execute("SELECT devName, devMac, devParentMAC, devParentPort, devVendor FROM Devices") + rows = self.db.sql.fetchall() + nodes = [] + links = [] + for row in rows: + nodes.append({"id": row['devMac'], "name": row['devName'], "vendor": row['devVendor']}) + if row['devParentMAC']: + links.append({"source": row['devParentMAC'], "target": row['devMac'], "port": row['devParentPort']}) + return {"nodes": nodes, "links": links} + # Update a specific field for a device def updateField(self, devGUID, field, value): if not self.exists(devGUID): diff --git a/server/models/plugin_object_instance.py b/server/models/plugin_object_instance.py index 2adaaa6f..95e392c5 100755 --- a/server/models/plugin_object_instance.py +++ b/server/models/plugin_object_instance.py @@ -37,6 +37,15 @@ class PluginObjectInstance: self.db.sql.execute("SELECT * FROM Plugins_Objects WHERE Plugin = ?", (plugin,)) return self.db.sql.fetchall() + # Get plugin objects by primary ID and plugin name + def getByPrimary(self, plugin, primary_id): + self.db.sql.execute( + "SELECT * FROM Plugins_Objects WHERE Plugin = ? AND Object_PrimaryID = ?", + (plugin, primary_id), + ) + rows = self.db.sql.fetchall() + return [dict(r) for r in rows] + # Get objects by status def getByStatus(self, status): self.db.sql.execute("SELECT * FROM Plugins_Objects WHERE Status = ?", (status,))