mirror of
https://github.com/jokob-sk/NetAlertX.git
synced 2025-12-07 09:36:05 -08:00
@@ -47,7 +47,7 @@ sql_devices_all = """
|
||||
IFNULL(devAlertDown, '') AS devAlertDown,
|
||||
IFNULL(devSkipRepeated, '') AS devSkipRepeated,
|
||||
IFNULL(devLastNotification, '') AS devLastNotification,
|
||||
IFNULL(devPresentLastScan, '') AS devPresentLastScan,
|
||||
IFNULL(devPresentLastScan, 0) AS devPresentLastScan,
|
||||
IFNULL(devIsNew, '') AS devIsNew,
|
||||
IFNULL(devLocation, '') AS devLocation,
|
||||
IFNULL(devIsArchived, '') AS devIsArchived,
|
||||
@@ -61,6 +61,8 @@ sql_devices_all = """
|
||||
IFNULL(devSourcePlugin, '') AS devSourcePlugin,
|
||||
IFNULL(devCustomProps, '') AS devCustomProps,
|
||||
IFNULL(devFQDN, '') AS devFQDN,
|
||||
IFNULL(devParentRelType, '') AS devParentRelType,
|
||||
IFNULL(devReqNicsOnline, '') AS devReqNicsOnline,
|
||||
CASE
|
||||
WHEN devIsNew = 1 THEN 'New'
|
||||
WHEN devPresentLastScan = 1 THEN 'On-line'
|
||||
|
||||
@@ -87,6 +87,14 @@ class DB():
|
||||
# devFQDN
|
||||
if ensure_column(self.sql, "Devices", "devFQDN", "TEXT") is False:
|
||||
return # addition failed
|
||||
|
||||
# devParentRelType
|
||||
if ensure_column(self.sql, "Devices", "devParentRelType", "TEXT") is False:
|
||||
return # addition failed
|
||||
|
||||
# devRequireNicsOnline
|
||||
if ensure_column(self.sql, "Devices", "devReqNicsOnline", "INTEGER") is False:
|
||||
return # addition failed
|
||||
|
||||
# Settings table setup
|
||||
ensure_Settings(self.sql)
|
||||
|
||||
@@ -74,6 +74,8 @@ class Device(ObjectType):
|
||||
devIpLong = Int()
|
||||
devFilterStatus = String()
|
||||
devFQDN = String()
|
||||
devParentRelType = String()
|
||||
devReqNicsOnline = Int()
|
||||
|
||||
|
||||
class DeviceResult(ObjectType):
|
||||
@@ -133,12 +135,19 @@ class Query(ObjectType):
|
||||
status = options.status
|
||||
mylog('verbose', f'[graphql_schema] Applying status filter: {status}')
|
||||
|
||||
# Example filtering based on the "status"
|
||||
# Filtering based on the "status"
|
||||
if status == "my_devices":
|
||||
# Include devices matching criteria in UI_MY_DEVICES
|
||||
allowed_statuses = get_setting_value("UI_MY_DEVICES")
|
||||
hidden_relationships = get_setting_value("UI_hide_rel_types") # 🆕
|
||||
|
||||
mylog('verbose', f'[graphql_schema] allowed_statuses: {allowed_statuses}')
|
||||
mylog('verbose', f'[graphql_schema] hidden_relationships: {hidden_relationships}')
|
||||
|
||||
devices_data = [
|
||||
device for device in devices_data
|
||||
if ( device.get("devParentRelType") not in hidden_relationships)
|
||||
]
|
||||
|
||||
devices_data = [
|
||||
device for device in devices_data
|
||||
@@ -165,6 +174,8 @@ class Query(ObjectType):
|
||||
devices_data = [device for device in devices_data if device["devIsArchived"] == 1]
|
||||
elif status == "offline":
|
||||
devices_data = [device for device in devices_data if device["devPresentLastScan"] == 0]
|
||||
elif status == "all_nodes":
|
||||
devices_data = devices_data # keep all
|
||||
|
||||
# additional filters
|
||||
if options.filters:
|
||||
@@ -175,13 +186,13 @@ class Query(ObjectType):
|
||||
if str(device.get(filter.filterColumn, "")).lower() == str(filter.filterValue).lower()
|
||||
]
|
||||
|
||||
# Filter data if a search term is provided
|
||||
# Search data if a search term is provided
|
||||
if options.search:
|
||||
# Define static list of searchable fields
|
||||
searchable_fields = [
|
||||
"devName", "devMac", "devOwner", "devType", "devVendor", "devLastIP",
|
||||
"devGroup", "devComments", "devLocation", "devStatus",
|
||||
"devSSID", "devSite", "devSourcePlugin", "devSyncHubNode", "devFQDN"
|
||||
"devGroup", "devComments", "devLocation", "devStatus", "devSSID",
|
||||
"devSite", "devSourcePlugin", "devSyncHubNode", "devFQDN", "devParentRelType"
|
||||
]
|
||||
|
||||
search_term = options.search.lower()
|
||||
|
||||
@@ -214,6 +214,9 @@ def update_devices_data_from_scan (db):
|
||||
|
||||
if len(recordsToUpdate) > 0:
|
||||
sql.executemany ("UPDATE Devices SET devVendor = ? WHERE devMac = ? ", recordsToUpdate )
|
||||
|
||||
# Update devPresentLastScan based on NICs presence
|
||||
update_devPresentLastScan_based_on_nics(db)
|
||||
|
||||
# Guess ICONS
|
||||
recordsToUpdate = []
|
||||
@@ -396,7 +399,10 @@ def create_new_devices (db):
|
||||
devComments,
|
||||
devLogEvents,
|
||||
devLocation,
|
||||
devCustomProps"""
|
||||
devCustomProps,
|
||||
devParentRelType,
|
||||
devReqNicsOnline
|
||||
"""
|
||||
|
||||
newDevDefaults = f"""{get_setting_value('NEWDEV_devAlertEvents')},
|
||||
{get_setting_value('NEWDEV_devAlertDown')},
|
||||
@@ -411,7 +417,9 @@ def create_new_devices (db):
|
||||
'{sanitize_SQL_input(get_setting_value('NEWDEV_devComments'))}',
|
||||
{get_setting_value('NEWDEV_devLogEvents')},
|
||||
'{sanitize_SQL_input(get_setting_value('NEWDEV_devLocation'))}',
|
||||
'{sanitize_SQL_input(get_setting_value('NEWDEV_devCustomProps'))}'
|
||||
'{sanitize_SQL_input(get_setting_value('NEWDEV_devCustomProps'))}',
|
||||
'{sanitize_SQL_input(get_setting_value('NEWDEV_devParentRelType'))}',
|
||||
{sanitize_SQL_input(get_setting_value('NEWDEV_devReqNicsOnline'))}
|
||||
"""
|
||||
|
||||
# Fetch data from CurrentScan skipping ignored devices by IP and MAC
|
||||
@@ -581,8 +589,69 @@ def update_devices_names(db):
|
||||
# Commit all database changes
|
||||
db.commitDB()
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# Updates devPresentLastScan for parent devices based on the presence of their NICs
|
||||
def update_devPresentLastScan_based_on_nics(db):
|
||||
"""
|
||||
Updates devPresentLastScan in the Devices table for parent devices
|
||||
based on the presence of their NICs and the devReqNicsOnline setting.
|
||||
|
||||
Args:
|
||||
db: A database object with `.execute()` and `.fetchall()` methods.
|
||||
"""
|
||||
|
||||
sql = db.sql
|
||||
|
||||
# Step 1: Load all devices from the DB
|
||||
devices = sql.execute("SELECT * FROM Devices").fetchall()
|
||||
|
||||
# Convert rows to dicts (assumes sql.row_factory = sqlite3.Row or similar)
|
||||
devices = [dict(row) for row in devices]
|
||||
|
||||
# Build MAC -> NICs map
|
||||
mac_to_nics = {}
|
||||
for device in devices:
|
||||
if device.get("devParentRelType") == "nic":
|
||||
parent_mac = device.get("devParentMAC")
|
||||
if parent_mac:
|
||||
mac_to_nics.setdefault(parent_mac, []).append(device)
|
||||
|
||||
# Step 2: For each non-NIC device, determine new devPresentLastScan
|
||||
updates = []
|
||||
for device in devices:
|
||||
if device.get("devParentRelType") == "nic":
|
||||
continue # skip NICs
|
||||
|
||||
mac = device.get("devMac")
|
||||
if not mac:
|
||||
continue
|
||||
|
||||
req_all = str(device.get("devReqNicsOnline")) == "1"
|
||||
nics = mac_to_nics.get(mac, [])
|
||||
|
||||
original = device.get("devPresentLastScan", 0)
|
||||
new_present = original
|
||||
|
||||
if nics:
|
||||
nic_statuses = [nic.get("devPresentLastScan") == 1 for nic in nics]
|
||||
if req_all:
|
||||
new_present = int(all(nic_statuses))
|
||||
else:
|
||||
new_present = int(any(nic_statuses))
|
||||
|
||||
# Only add update if changed
|
||||
if original != new_present:
|
||||
updates.append((new_present, mac))
|
||||
|
||||
# Step 3: Execute batch update
|
||||
for present, mac in updates:
|
||||
sql.execute(
|
||||
"UPDATE Devices SET devPresentLastScan = ? WHERE devMac = ?",
|
||||
(present, mac)
|
||||
)
|
||||
|
||||
db.commitDB()
|
||||
return len(updates)
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# Check if the variable contains a valid MAC address or "Internet"
|
||||
|
||||
Reference in New Issue
Block a user