Update flask_server.py

This commit is contained in:
MacRimi
2025-10-10 12:40:58 +02:00
parent b249d37bab
commit 7b980ae4d4

View File

@@ -2490,60 +2490,37 @@ def get_hardware_info():
if not line: if not line:
# Empty line = end of device # Empty line = end of device
if current_device and 'Class' in current_device: if current_device and current_device.get('Class') in ['VGA compatible controller', '3D controller', 'Display controller']:
device_class = current_device.get('Class', '') # This is a GPU
device_name = current_device.get('Device', '') device_type = 'Integrated' if 'Integrated' in current_device.get('Device', '') else 'Discrete'
vendor = current_device.get('Vendor', '') gpu_slot = current_device.get('Slot', 'Unknown')
slot = current_device.get('Slot', 'Unknown') gpu_name = current_device.get('Device', 'Unknown GPU')
gpu_vendor = current_device.get('Vendor', 'Unknown')
# Categorize and add important devices # Add to graphics_cards if not already present (e.g., from nvidia-smi)
device_type = 'Other' found = False
include_device = False for existing_gpu in hardware_data['graphics_cards']:
if gpu_slot == existing_gpu.get('slot'): # Match by slot
# Graphics/Display devices found = True
if any(keyword in device_class for keyword in ['VGA', 'Display', '3D']): # Ensure vendor is set if it was unknown
device_type = 'Graphics Card' if existing_gpu.get('vendor') == 'Unknown':
include_device = True existing_gpu['vendor'] = gpu_vendor
# Storage controllers break
elif any(keyword in device_class for keyword in ['SATA', 'RAID', 'Mass storage', 'Non-Volatile memory']): if not found:
device_type = 'Storage Controller' hardware_data['graphics_cards'].append({
include_device = True 'slot': gpu_slot,
# Network controllers 'name': gpu_name,
elif 'Ethernet' in device_class or 'Network' in device_class: 'vendor': gpu_vendor,
device_type = 'Network Controller' 'type': device_type
include_device = True })
# USB controllers print(f"[v0] Found GPU (lspci -vmm): {gpu_name} ({gpu_vendor}, Type: {device_type})")
elif 'USB' in device_class:
device_type = 'USB Controller'
include_device = True
# Audio devices
elif 'Audio' in device_class or 'Multimedia' in device_class:
device_type = 'Audio Controller'
include_device = True
# Special devices (Coral TPU, etc.)
elif any(keyword in device_name.lower() for keyword in ['coral', 'tpu', 'edge']):
device_type = 'AI Accelerator'
include_device = True
# PCI bridges (usually not interesting for users)
elif 'Bridge' in device_class:
include_device = False
if include_device:
pci_device = {
'slot': slot,
'type': device_type,
'vendor': vendor,
'device': device_name,
'class': device_class
}
hardware_data['pci_devices'].append(pci_device)
current_device = {} current_device = {}
elif ':' in line: elif ':' in line:
key, value = line.split(':', 1) key, value = line.split(':', 1)
current_device[key.strip()] = value.strip() current_device[key.strip()] = value.strip()
# Now get driver information with lspci -k # Now get driver information with lspci -k and populate pci_devices
result_k = subprocess.run(['lspci', '-k'], capture_output=True, text=True, timeout=10) result_k = subprocess.run(['lspci', '-k'], capture_output=True, text=True, timeout=10)
if result_k.returncode == 0: if result_k.returncode == 0:
current_slot = None current_slot = None
@@ -2568,14 +2545,76 @@ def get_hardware_info():
# Update the corresponding PCI device # Update the corresponding PCI device
if current_slot and (current_driver or current_module): if current_slot and (current_driver or current_module):
for device in hardware_data['pci_devices']: # Find if this slot corresponds to a GPU
if device['slot'] == current_slot: is_gpu = False
if current_driver: for gpu in hardware_data['graphics_cards']:
device['driver'] = current_driver if gpu.get('slot') == current_slot:
if current_module: is_gpu = True
device['kernel_module'] = current_module
break break
# Categorize and add important devices, including GPUs
device_class_str = ""
for d_line in result_k.stdout.split('\n'): # Re-scan for class info
if d_line.startswith(current_slot + ' ') and not d_line.startswith('\t'):
device_class_str = d_line.split(':', 1)[1].strip()
break
device_type = 'Other'
include_device = False
if is_gpu:
device_type = 'Graphics Card'
include_device = True
elif 'VGA' in device_class_str or '3D' in device_class_str or 'Display' in device_class_str:
device_type = 'Graphics Card'
include_device = True
elif 'SATA' in device_class_str or 'RAID' in device_class_str or 'Mass storage' in device_class_str or 'Non-Volatile memory' in device_class_str:
device_type = 'Storage Controller'
include_device = True
elif 'Ethernet' in device_class_str or 'Network' in device_class_str:
device_type = 'Network Controller'
include_device = True
elif 'USB' in device_class_str:
device_type = 'USB Controller'
include_device = True
elif 'Audio' in device_class_str or 'Multimedia' in device_class_str:
device_type = 'Audio Controller'
include_device = True
elif any(keyword in device_class_str.lower() for keyword in ['coral', 'tpu', 'edge']):
device_type = 'AI Accelerator'
include_device = True
if include_device:
pci_device = {
'slot': current_slot,
'type': device_type,
'driver': current_driver,
'kernel_module': current_module
}
# Avoid adding duplicates if already processed by lspci -vmm
already_added = False
for existing_device in hardware_data['pci_devices']:
if existing_device.get('slot') == current_slot:
existing_device['driver'] = current_driver
existing_device['kernel_module'] = current_module
already_added = True
break
if not already_added:
hardware_data['pci_devices'].append(pci_device)
# Ensure all graphics cards have driver/module info if available
for gpu in hardware_data['graphics_cards']:
gpu_slot = gpu.get('slot')
if gpu_slot:
for pci_device in hardware_data['pci_devices']:
if pci_device.get('slot') == gpu_slot:
if 'driver' in pci_device:
gpu['driver'] = pci_device['driver']
if 'kernel_module' in pci_device:
gpu['kernel_module'] = pci_device['kernel_module']
break
print(f"[v0] Total PCI devices found: {len(hardware_data['pci_devices'])}") print(f"[v0] Total PCI devices found: {len(hardware_data['pci_devices'])}")
except Exception as e: except Exception as e:
print(f"[v0] Error getting PCI devices: {e}") print(f"[v0] Error getting PCI devices: {e}")
@@ -2973,6 +3012,81 @@ def get_amd_gpu_realtime_data(slot):
traceback.print_exc() traceback.print_exc()
return None return None
def get_gpu_info():
"""Get detailed GPU information from lspci"""
gpus = []
try:
# Get GPU info from lspci with verbose output
result = subprocess.run(['lspci', '-vmm'], capture_output=True, text=True, timeout=10)
if result.returncode == 0:
current_device = {}
for line in result.stdout.split('\n'):
line = line.strip()
if not line:
# Empty line indicates end of device block
if current_device and current_device.get('Class') in ['VGA compatible controller', '3D controller', 'Display controller']:
# This is a GPU
gpu = {
'slot': current_device.get('Slot', 'Unknown'),
'name': current_device.get('Device', 'Unknown GPU'),
'vendor': current_device.get('Vendor', 'Unknown'),
'driver': current_device.get('Driver', 'Unknown'), # May be empty from -vmm
'kernel_module': current_device.get('Module', 'Unknown'), # May be empty from -vmm
'type': 'Integrated' if 'Integrated' in current_device.get('Device', '') else 'Discrete'
}
gpus.append(gpu)
print(f"[v0] Found GPU (lspci -vmm): {gpu['name']} ({gpu['vendor']})")
current_device = {}
elif ':' in line:
key, value = line.split(':', 1)
current_device[key.strip()] = value.strip()
# Handle last device if file doesn't end with empty line
if current_device and current_device.get('Class') in ['VGA compatible controller', '3D controller', 'Display controller']:
gpu = {
'slot': current_device.get('Slot', 'Unknown'),
'name': current_device.get('Device', 'Unknown GPU'),
'vendor': current_device.get('Vendor', 'Unknown'),
'driver': current_device.get('Driver', 'Unknown'),
'kernel_module': current_device.get('Module', 'Unknown'),
'type': 'Integrated' if 'Integrated' in current_device.get('Device', '') else 'Discrete'
}
gpus.append(gpu)
print(f"[v0] Found GPU (lspci -vmm): {gpu['name']} ({gpu['vendor']})")
# Get driver information from lspci -k
result_k = subprocess.run(['lspci', '-k'], capture_output=True, text=True, timeout=10)
if result_k.returncode == 0:
current_slot = None
for line in result_k.stdout.split('\n'):
# Check if this is a device line (starts with slot number)
if line and not line.startswith('\t'):
parts = line.split(' ', 1)
if len(parts) >= 1:
current_slot = parts[0]
# Check for driver information
elif line.startswith('\t'):
line = line.strip()
if line.startswith('Kernel driver in use:'):
driver = line.split(':', 1)[1].strip()
# Update GPU with driver info
for gpu in gpus:
if gpu['slot'] == current_slot:
gpu['driver'] = driver
elif line.startswith('Kernel modules:'):
modules = line.split(':', 1)[1].strip()
# Update GPU with kernel module info
for gpu in gpus:
if gpu['slot'] == current_slot:
gpu['kernel_module'] = modules
print(f"[v0] Total GPUs found: {len(gpus)}")
except Exception as e:
print(f"[v0] Error getting GPU info: {e}")
import traceback
traceback.print_exc()
return gpus
@app.route('/api/system', methods=['GET']) @app.route('/api/system', methods=['GET'])
def api_system(): def api_system():