mirror of
https://github.com/MacRimi/ProxMenux.git
synced 2025-11-18 03:26:17 +00:00
Update flask_server.py
This commit is contained in:
@@ -575,9 +575,9 @@ def get_storage_info():
|
|||||||
total_disk_size_bytes += disk_size_bytes
|
total_disk_size_bytes += disk_size_bytes
|
||||||
|
|
||||||
# Get SMART data for this disk
|
# Get SMART data for this disk
|
||||||
print(f"[v0] Getting SMART data for {disk_name}...")
|
|
||||||
smart_data = get_smart_data(disk_name)
|
smart_data = get_smart_data(disk_name)
|
||||||
print(f"[v0] SMART data for {disk_name}: {smart_data}")
|
|
||||||
|
|
||||||
disk_size_kb = disk_size_bytes / 1024
|
disk_size_kb = disk_size_bytes / 1024
|
||||||
|
|
||||||
@@ -726,7 +726,7 @@ def get_storage_info():
|
|||||||
storage_data['used'] = round(total_used / (1024**3), 1)
|
storage_data['used'] = round(total_used / (1024**3), 1)
|
||||||
storage_data['available'] = round(total_available / (1024**3), 1)
|
storage_data['available'] = round(total_available / (1024**3), 1)
|
||||||
|
|
||||||
print(f"[v0] Total storage used: {storage_data['used']}GB (including ZFS pools)")
|
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"Error getting partition info: {e}")
|
print(f"Error getting partition info: {e}")
|
||||||
@@ -798,18 +798,18 @@ def get_smart_data(disk_name):
|
|||||||
|
|
||||||
process = None # Initialize process to None
|
process = None # Initialize process to None
|
||||||
for cmd_index, cmd in enumerate(commands_to_try):
|
for cmd_index, cmd in enumerate(commands_to_try):
|
||||||
print(f"[v0] Attempt {cmd_index + 1}/{len(commands_to_try)}: Running command: {' '.join(cmd)}")
|
|
||||||
try:
|
try:
|
||||||
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
|
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
|
||||||
# Use communicate with a timeout to avoid hanging if the process doesn't exit
|
# Use communicate with a timeout to avoid hanging if the process doesn't exit
|
||||||
stdout, stderr = process.communicate(timeout=15)
|
stdout, stderr = process.communicate(timeout=15)
|
||||||
result_code = process.returncode
|
result_code = process.returncode
|
||||||
|
|
||||||
print(f"[v0] Command return code: {result_code}")
|
|
||||||
|
|
||||||
if stderr:
|
if stderr:
|
||||||
stderr_preview = stderr[:200].replace('\n', ' ')
|
stderr_preview = stderr[:200].replace('\n', ' ')
|
||||||
print(f"[v0] stderr: {stderr_preview}")
|
|
||||||
|
|
||||||
has_output = stdout and len(stdout.strip()) > 50
|
has_output = stdout and len(stdout.strip()) > 50
|
||||||
|
|
||||||
@@ -954,7 +954,7 @@ def get_smart_data(disk_name):
|
|||||||
|
|
||||||
# If we got good data, break out of the loop
|
# If we got good data, break out of the loop
|
||||||
if smart_data['model'] != 'Unknown' and smart_data['serial'] != 'Unknown':
|
if smart_data['model'] != 'Unknown' and smart_data['serial'] != 'Unknown':
|
||||||
print(f"[v0] Successfully extracted complete data from JSON (attempt {cmd_index + 1})")
|
|
||||||
break
|
break
|
||||||
|
|
||||||
except json.JSONDecodeError as e:
|
except json.JSONDecodeError as e:
|
||||||
@@ -1538,7 +1538,7 @@ def get_network_info():
|
|||||||
interface_type = get_interface_type(interface_name)
|
interface_type = get_interface_type(interface_name)
|
||||||
|
|
||||||
if interface_type == 'skip':
|
if interface_type == 'skip':
|
||||||
print(f"[v0] Skipping interface: {interface_name} (type: {interface_type})")
|
|
||||||
continue
|
continue
|
||||||
|
|
||||||
stats = net_if_stats.get(interface_name)
|
stats = net_if_stats.get(interface_name)
|
||||||
@@ -1645,9 +1645,7 @@ def get_network_info():
|
|||||||
network_data['vm_lxc_active_count'] = vm_lxc_active_count
|
network_data['vm_lxc_active_count'] = vm_lxc_active_count
|
||||||
network_data['vm_lxc_total_count'] = vm_lxc_total_count
|
network_data['vm_lxc_total_count'] = vm_lxc_total_count
|
||||||
|
|
||||||
print(f"[v0] Physical interfaces: {physical_active_count} active out of {physical_total_count} total")
|
|
||||||
print(f"[v0] Bridge interfaces: {bridge_active_count} active out of {bridge_total_count} total")
|
|
||||||
print(f"[v0] VM/LXC interfaces: {vm_lxc_active_count} active out of {vm_lxc_total_count} total")
|
|
||||||
|
|
||||||
# Get network I/O statistics (global)
|
# Get network I/O statistics (global)
|
||||||
net_io = psutil.net_io_counters()
|
net_io = psutil.net_io_counters()
|
||||||
@@ -1704,7 +1702,7 @@ def get_proxmox_vms():
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
local_node = socket.gethostname()
|
local_node = socket.gethostname()
|
||||||
print(f"[v0] Local node detected: {local_node}")
|
|
||||||
|
|
||||||
result = subprocess.run(['pvesh', 'get', '/cluster/resources', '--type', 'vm', '--output-format', 'json'],
|
result = subprocess.run(['pvesh', 'get', '/cluster/resources', '--type', 'vm', '--output-format', 'json'],
|
||||||
capture_output=True, text=True, timeout=10)
|
capture_output=True, text=True, timeout=10)
|
||||||
@@ -1782,11 +1780,11 @@ def get_ipmi_fans():
|
|||||||
'speed': value,
|
'speed': value,
|
||||||
'unit': unit
|
'unit': unit
|
||||||
})
|
})
|
||||||
print(f"[v0] IPMI Fan: {name} = {value} {unit}")
|
|
||||||
except ValueError:
|
except ValueError:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
print(f"[v0] Found {len(fans)} IPMI fans")
|
|
||||||
except FileNotFoundError:
|
except FileNotFoundError:
|
||||||
print("[v0] ipmitool not found")
|
print("[v0] ipmitool not found")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
@@ -3148,7 +3146,7 @@ def get_gpu_info():
|
|||||||
# gpu.update(detailed_info) # It will be called later in api_gpu_realtime
|
# gpu.update(detailed_info) # It will be called later in api_gpu_realtime
|
||||||
|
|
||||||
gpus.append(gpu)
|
gpus.append(gpu)
|
||||||
print(f"[v0] Found GPU: {gpu_name} ({vendor}) at slot {slot}")
|
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"[v0] Error detecting GPUs from lspci: {e}")
|
print(f"[v0] Error detecting GPUs from lspci: {e}")
|
||||||
@@ -3267,7 +3265,7 @@ def get_hardware_info():
|
|||||||
cpu_info['l3_cache'] = value
|
cpu_info['l3_cache'] = value
|
||||||
|
|
||||||
hardware_data['cpu'] = cpu_info
|
hardware_data['cpu'] = cpu_info
|
||||||
print(f"[v0] CPU: {cpu_info.get('model', 'Unknown')}")
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"[v0] Error getting CPU info: {e}")
|
print(f"[v0] Error getting CPU info: {e}")
|
||||||
|
|
||||||
@@ -3288,7 +3286,7 @@ def get_hardware_info():
|
|||||||
mb_info['serial'] = line.split(':', 1)[1].strip()
|
mb_info['serial'] = line.split(':', 1)[1].strip()
|
||||||
|
|
||||||
hardware_data['motherboard'] = mb_info
|
hardware_data['motherboard'] = mb_info
|
||||||
print(f"[v0] Motherboard: {mb_info.get('manufacturer', 'Unknown')} {mb_info.get('model', 'Unknown')}")
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"[v0] Error getting motherboard info: {e}")
|
print(f"[v0] Error getting motherboard info: {e}")
|
||||||
|
|
||||||
@@ -3307,7 +3305,7 @@ def get_hardware_info():
|
|||||||
bios_info['date'] = line.split(':', 1)[1].strip()
|
bios_info['date'] = line.split(':', 1)[1].strip()
|
||||||
|
|
||||||
hardware_data['motherboard']['bios'] = bios_info
|
hardware_data['motherboard']['bios'] = bios_info
|
||||||
print(f"[v0] BIOS: {bios_info.get('vendor', 'Unknown')} {bios_info.get('version', 'Unknown')}")
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"[v0] Error getting BIOS info: {e}")
|
print(f"[v0] Error getting BIOS info: {e}")
|
||||||
|
|
||||||
@@ -3345,11 +3343,11 @@ def get_hardware_info():
|
|||||||
size_kb = value # Assume KB if no unit
|
size_kb = value # Assume KB if no unit
|
||||||
|
|
||||||
current_module['size'] = size_kb
|
current_module['size'] = size_kb
|
||||||
print(f"[v0] Parsed memory size: {size_str} -> {size_kb} KB")
|
|
||||||
else:
|
else:
|
||||||
# Handle cases where unit might be missing but value is present
|
# Handle cases where unit might be missing but value is present
|
||||||
current_module['size'] = float(size_str) if size_str else 0
|
current_module['size'] = float(size_str) if size_str else 0
|
||||||
print(f"[v0] Parsed memory size (no unit): {size_str} -> {current_module['size']} KB")
|
|
||||||
except (ValueError, IndexError) as e:
|
except (ValueError, IndexError) as e:
|
||||||
print(f"[v0] Error parsing memory size '{size_str}': {e}")
|
print(f"[v0] Error parsing memory size '{size_str}': {e}")
|
||||||
current_module['size'] = 0 # Default to 0 if parsing fails
|
current_module['size'] = 0 # Default to 0 if parsing fails
|
||||||
@@ -3370,7 +3368,7 @@ def get_hardware_info():
|
|||||||
if current_module and current_module.get('size') and current_module.get('size') != 'No Module Installed' and current_module.get('size') != 0:
|
if current_module and current_module.get('size') and current_module.get('size') != 'No Module Installed' and current_module.get('size') != 0:
|
||||||
hardware_data['memory_modules'].append(current_module)
|
hardware_data['memory_modules'].append(current_module)
|
||||||
|
|
||||||
print(f"[v0] Memory modules: {len(hardware_data['memory_modules'])} installed")
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"[v0] Error getting memory info: {e}")
|
print(f"[v0] Error getting memory info: {e}")
|
||||||
|
|
||||||
@@ -3391,7 +3389,7 @@ def get_hardware_info():
|
|||||||
'type': device.get('type', 'disk')
|
'type': device.get('type', 'disk')
|
||||||
})
|
})
|
||||||
hardware_data['storage_devices'] = storage_devices
|
hardware_data['storage_devices'] = storage_devices
|
||||||
print(f"[v0] Storage devices: {len(storage_devices)} found")
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"[v0] Error getting storage info: {e}")
|
print(f"[v0] Error getting storage info: {e}")
|
||||||
|
|
||||||
@@ -3485,15 +3483,15 @@ def get_hardware_info():
|
|||||||
'vendor': vendor,
|
'vendor': vendor,
|
||||||
'slot': slot
|
'slot': slot
|
||||||
})
|
})
|
||||||
print(f"[v0] Found GPU: {gpu_name} ({vendor}) at slot {slot}")
|
|
||||||
|
|
||||||
print(f"[v0] Graphics cards: {len(hardware_data['graphics_cards'])} found")
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"[v0] Error getting graphics cards: {e}")
|
print(f"[v0] Error getting graphics cards: {e}")
|
||||||
|
|
||||||
# PCI Devices
|
# PCI Devices
|
||||||
try:
|
try:
|
||||||
print("[v0] Getting PCI devices with driver information...")
|
|
||||||
# First get basic device info with lspci -vmm
|
# First get basic device info with lspci -vmm
|
||||||
result = subprocess.run(['lspci', '-vmm'], capture_output=True, text=True, timeout=10)
|
result = subprocess.run(['lspci', '-vmm'], capture_output=True, text=True, timeout=10)
|
||||||
if result.returncode == 0:
|
if result.returncode == 0:
|
||||||
@@ -3597,7 +3595,7 @@ def get_hardware_info():
|
|||||||
device['kernel_module'] = current_module
|
device['kernel_module'] = current_module
|
||||||
break
|
break
|
||||||
|
|
||||||
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}")
|
||||||
|
|
||||||
@@ -3619,7 +3617,7 @@ def get_hardware_info():
|
|||||||
'critical': entry.critical if entry.critical else 0
|
'critical': entry.critical if entry.critical else 0
|
||||||
})
|
})
|
||||||
|
|
||||||
print(f"[v0] Temperature sensors: {len(hardware_data['sensors']['temperatures'])} found")
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
result = subprocess.run(['sensors'], capture_output=True, text=True, timeout=5)
|
result = subprocess.run(['sensors'], capture_output=True, text=True, timeout=5)
|
||||||
@@ -3660,10 +3658,10 @@ def get_hardware_info():
|
|||||||
'unit': 'RPM',
|
'unit': 'RPM',
|
||||||
'adapter': current_adapter
|
'adapter': current_adapter
|
||||||
})
|
})
|
||||||
print(f"[v0] Fan sensor: {identified_name} ({sensor_name}) = {fan_speed} RPM")
|
|
||||||
|
|
||||||
hardware_data['sensors']['fans'] = fans
|
hardware_data['sensors']['fans'] = fans
|
||||||
print(f"[v0] Found {len(fans)} fan sensor(s)")
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"[v0] Error getting fan info: {e}")
|
print(f"[v0] Error getting fan info: {e}")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
@@ -3695,7 +3693,7 @@ def get_hardware_info():
|
|||||||
|
|
||||||
if ups_info:
|
if ups_info:
|
||||||
hardware_data['power'] = ups_info
|
hardware_data['power'] = ups_info
|
||||||
print(f"[v0] UPS found: {ups_info.get('model', 'Unknown')}")
|
|
||||||
except FileNotFoundError:
|
except FileNotFoundError:
|
||||||
print("[v0] apcaccess not found - no UPS monitoring")
|
print("[v0] apcaccess not found - no UPS monitoring")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
@@ -4009,7 +4007,7 @@ def api_vm_metrics(vmid):
|
|||||||
print(f"[v0] Found as QEMU")
|
print(f"[v0] Found as QEMU")
|
||||||
|
|
||||||
# Get RRD data
|
# Get RRD data
|
||||||
print(f"[v0] Fetching RRD data for {vm_type} {vmid} with timeframe {timeframe}...")
|
|
||||||
rrd_result = subprocess.run(['pvesh', 'get', f'/nodes/{local_node}/{vm_type}/{vmid}/rrddata',
|
rrd_result = subprocess.run(['pvesh', 'get', f'/nodes/{local_node}/{vm_type}/{vmid}/rrddata',
|
||||||
'--timeframe', timeframe, '--output-format', 'json'],
|
'--timeframe', timeframe, '--output-format', 'json'],
|
||||||
capture_output=True, text=True, timeout=10)
|
capture_output=True, text=True, timeout=10)
|
||||||
@@ -4048,7 +4046,7 @@ def api_node_metrics():
|
|||||||
|
|
||||||
# Get local node name
|
# Get local node name
|
||||||
local_node = socket.gethostname()
|
local_node = socket.gethostname()
|
||||||
print(f"[v0] Local node: {local_node}")
|
|
||||||
|
|
||||||
# Get RRD data for the node
|
# Get RRD data for the node
|
||||||
|
|
||||||
@@ -4086,7 +4084,7 @@ def api_logs():
|
|||||||
try:
|
try:
|
||||||
days = int(since_days)
|
days = int(since_days)
|
||||||
cmd = ['journalctl', '--since', f'{days} days ago', '--output', 'json', '--no-pager']
|
cmd = ['journalctl', '--since', f'{days} days ago', '--output', 'json', '--no-pager']
|
||||||
print(f"[API] Filtering logs since {days} days ago (no limit)")
|
|
||||||
except ValueError:
|
except ValueError:
|
||||||
print(f"[API] Invalid since_days value: {since_days}")
|
print(f"[API] Invalid since_days value: {since_days}")
|
||||||
cmd = ['journalctl', '-n', limit, '--output', 'json', '--no-pager']
|
cmd = ['journalctl', '-n', limit, '--output', 'json', '--no-pager']
|
||||||
|
|||||||
Reference in New Issue
Block a user