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:
@@ -776,7 +776,7 @@ def get_smart_data(disk_name):
|
|||||||
'ssd_life_left': None, # SSD: SSD Life Left percentage
|
'ssd_life_left': None, # SSD: SSD Life Left percentage
|
||||||
}
|
}
|
||||||
|
|
||||||
print(f"[v0] ===== Starting SMART data collection for /dev/{disk_name} =====")
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
commands_to_try = [
|
commands_to_try = [
|
||||||
@@ -814,70 +814,70 @@ def get_smart_data(disk_name):
|
|||||||
has_output = stdout and len(stdout.strip()) > 50
|
has_output = stdout and len(stdout.strip()) > 50
|
||||||
|
|
||||||
if has_output:
|
if has_output:
|
||||||
print(f"[v0] Got output ({len(stdout)} bytes), attempting to parse...")
|
|
||||||
|
|
||||||
# Try JSON parsing first (if -j flag was used)
|
# Try JSON parsing first (if -j flag was used)
|
||||||
if '-j' in cmd:
|
if '-j' in cmd:
|
||||||
try:
|
try:
|
||||||
print(f"[v0] Attempting JSON parse...")
|
|
||||||
data = json.loads(stdout)
|
data = json.loads(stdout)
|
||||||
print(f"[v0] JSON parse successful!")
|
|
||||||
|
|
||||||
# Extract model
|
# Extract model
|
||||||
if 'model_name' in data:
|
if 'model_name' in data:
|
||||||
smart_data['model'] = data['model_name']
|
smart_data['model'] = data['model_name']
|
||||||
print(f"[v0] Model: {smart_data['model']}")
|
|
||||||
elif 'model_family' in data:
|
elif 'model_family' in data:
|
||||||
smart_data['model'] = data['model_family']
|
smart_data['model'] = data['model_family']
|
||||||
print(f"[v0] Model family: {smart_data['model']}")
|
|
||||||
|
|
||||||
# Extract serial
|
# Extract serial
|
||||||
if 'serial_number' in data:
|
if 'serial_number' in data:
|
||||||
smart_data['serial'] = data['serial_number']
|
smart_data['serial'] = data['serial_number']
|
||||||
print(f"[v0] Serial: {smart_data['serial']}")
|
|
||||||
|
|
||||||
if 'rotation_rate' in data:
|
if 'rotation_rate' in data:
|
||||||
smart_data['rotation_rate'] = data['rotation_rate']
|
smart_data['rotation_rate'] = data['rotation_rate']
|
||||||
print(f"[v0] Rotation Rate: {smart_data['rotation_rate']} RPM")
|
|
||||||
|
|
||||||
# Extract SMART status
|
# Extract SMART status
|
||||||
if 'smart_status' in data and 'passed' in data['smart_status']:
|
if 'smart_status' in data and 'passed' in data['smart_status']:
|
||||||
smart_data['smart_status'] = 'passed' if data['smart_status']['passed'] else 'failed'
|
smart_data['smart_status'] = 'passed' if data['smart_status']['passed'] else 'failed'
|
||||||
smart_data['health'] = 'healthy' if data['smart_status']['passed'] else 'critical'
|
smart_data['health'] = 'healthy' if data['smart_status']['passed'] else 'critical'
|
||||||
print(f"[v0] SMART status: {smart_data['smart_status']}, health: {smart_data['health']}")
|
|
||||||
|
|
||||||
# Extract temperature
|
# Extract temperature
|
||||||
if 'temperature' in data and 'current' in data['temperature']:
|
if 'temperature' in data and 'current' in data['temperature']:
|
||||||
smart_data['temperature'] = data['temperature']['current']
|
smart_data['temperature'] = data['temperature']['current']
|
||||||
print(f"[v0] Temperature: {smart_data['temperature']}°C")
|
|
||||||
|
|
||||||
# Parse NVMe SMART data
|
# Parse NVMe SMART data
|
||||||
if 'nvme_smart_health_information_log' in data:
|
if 'nvme_smart_health_information_log' in data:
|
||||||
print(f"[v0] Parsing NVMe SMART data...")
|
|
||||||
nvme_data = data['nvme_smart_health_information_log']
|
nvme_data = data['nvme_smart_health_information_log']
|
||||||
if 'temperature' in nvme_data:
|
if 'temperature' in nvme_data:
|
||||||
smart_data['temperature'] = nvme_data['temperature']
|
smart_data['temperature'] = nvme_data['temperature']
|
||||||
print(f"[v0] NVMe Temperature: {smart_data['temperature']}°C")
|
|
||||||
if 'power_on_hours' in nvme_data:
|
if 'power_on_hours' in nvme_data:
|
||||||
smart_data['power_on_hours'] = nvme_data['power_on_hours']
|
smart_data['power_on_hours'] = nvme_data['power_on_hours']
|
||||||
print(f"[v0] NVMe Power On Hours: {smart_data['power_on_hours']}")
|
|
||||||
if 'power_cycles' in nvme_data:
|
if 'power_cycles' in nvme_data:
|
||||||
smart_data['power_cycles'] = nvme_data['power_cycles']
|
smart_data['power_cycles'] = nvme_data['power_cycles']
|
||||||
print(f"[v0] NVMe Power Cycles: {smart_data['power_cycles']}")
|
|
||||||
if 'percentage_used' in nvme_data:
|
if 'percentage_used' in nvme_data:
|
||||||
smart_data['percentage_used'] = nvme_data['percentage_used']
|
smart_data['percentage_used'] = nvme_data['percentage_used']
|
||||||
print(f"[v0] NVMe Percentage Used: {smart_data['percentage_used']}%")
|
|
||||||
if 'data_units_written' in nvme_data:
|
if 'data_units_written' in nvme_data:
|
||||||
# data_units_written está en unidades de 512KB
|
# data_units_written está en unidades de 512KB
|
||||||
data_units = nvme_data['data_units_written']
|
data_units = nvme_data['data_units_written']
|
||||||
# Convertir a GB (data_units * 512KB / 1024 / 1024)
|
# Convertir a GB (data_units * 512KB / 1024 / 1024)
|
||||||
total_gb = (data_units * 512) / (1024 * 1024)
|
total_gb = (data_units * 512) / (1024 * 1024)
|
||||||
smart_data['total_lbas_written'] = round(total_gb, 2)
|
smart_data['total_lbas_written'] = round(total_gb, 2)
|
||||||
print(f"[v0] NVMe Total Data Written: {smart_data['total_lbas_written']} GB")
|
|
||||||
|
|
||||||
# Parse ATA SMART attributes
|
# Parse ATA SMART attributes
|
||||||
if 'ata_smart_attributes' in data and 'table' in data['ata_smart_attributes']:
|
if 'ata_smart_attributes' in data and 'table' in data['ata_smart_attributes']:
|
||||||
print(f"[v0] Parsing ATA SMART attributes...")
|
|
||||||
for attr in data['ata_smart_attributes']['table']:
|
for attr in data['ata_smart_attributes']['table']:
|
||||||
attr_id = attr.get('id')
|
attr_id = attr.get('id')
|
||||||
raw_value = attr.get('raw', {}).get('value', 0)
|
raw_value = attr.get('raw', {}).get('value', 0)
|
||||||
@@ -885,27 +885,27 @@ def get_smart_data(disk_name):
|
|||||||
|
|
||||||
if attr_id == 9: # Power_On_Hours
|
if attr_id == 9: # Power_On_Hours
|
||||||
smart_data['power_on_hours'] = raw_value
|
smart_data['power_on_hours'] = raw_value
|
||||||
print(f"[v0] Power On Hours (ID 9): {raw_value}")
|
|
||||||
elif attr_id == 12: # Power_Cycle_Count
|
elif attr_id == 12: # Power_Cycle_Count
|
||||||
smart_data['power_cycles'] = raw_value
|
smart_data['power_cycles'] = raw_value
|
||||||
print(f"[v0] Power Cycles (ID 12): {raw_value}")
|
|
||||||
elif attr_id == 194: # Temperature_Celsius
|
elif attr_id == 194: # Temperature_Celsius
|
||||||
if smart_data['temperature'] == 0:
|
if smart_data['temperature'] == 0:
|
||||||
smart_data['temperature'] = raw_value
|
smart_data['temperature'] = raw_value
|
||||||
print(f"[v0] Temperature (ID 194): {smart_data['temperature']}°C")
|
|
||||||
elif attr_id == 190: # Airflow_Temperature_Cel
|
elif attr_id == 190: # Airflow_Temperature_Cel
|
||||||
if smart_data['temperature'] == 0:
|
if smart_data['temperature'] == 0:
|
||||||
smart_data['temperature'] = raw_value
|
smart_data['temperature'] = raw_value
|
||||||
print(f"[v0] Airflow Temperature (ID 190): {smart_data['temperature']}°C")
|
|
||||||
elif attr_id == 5: # Reallocated_Sector_Ct
|
elif attr_id == 5: # Reallocated_Sector_Ct
|
||||||
smart_data['reallocated_sectors'] = raw_value
|
smart_data['reallocated_sectors'] = raw_value
|
||||||
print(f"[v0] Reallocated Sectors (ID 5): {smart_data['reallocated_sectors']}")
|
|
||||||
elif attr_id == 197: # Current_Pending_Sector
|
elif attr_id == 197: # Current_Pending_Sector
|
||||||
smart_data['pending_sectors'] = raw_value
|
smart_data['pending_sectors'] = raw_value
|
||||||
print(f"[v0] Pending Sectors (ID 197): {smart_data['pending_sectors']}")
|
|
||||||
elif attr_id == 199: # UDMA_CRC_Error_Count
|
elif attr_id == 199: # UDMA_CRC_Error_Count
|
||||||
smart_data['crc_errors'] = raw_value
|
smart_data['crc_errors'] = raw_value
|
||||||
print(f"[v0] CRC Errors (ID 199): {smart_data['crc_errors']}")
|
|
||||||
elif attr_id == '230':
|
elif attr_id == '230':
|
||||||
try:
|
try:
|
||||||
wear_used = None
|
wear_used = None
|
||||||
@@ -923,7 +923,7 @@ def get_smart_data(disk_name):
|
|||||||
|
|
||||||
smart_data['media_wearout_indicator'] = wear_used
|
smart_data['media_wearout_indicator'] = wear_used
|
||||||
smart_data['ssd_life_left'] = max(0, 100 - wear_used)
|
smart_data['ssd_life_left'] = max(0, 100 - wear_used)
|
||||||
print(f"[v0] Media Wearout Indicator (ID 230): {wear_used}% used, {smart_data['ssd_life_left']}% life left")
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"[v0] Error parsing Media_Wearout_Indicator (ID 230): {e}")
|
print(f"[v0] Error parsing Media_Wearout_Indicator (ID 230): {e}")
|
||||||
elif attr_id == '233': # Media_Wearout_Indicator (Intel/Samsung SSD)
|
elif attr_id == '233': # Media_Wearout_Indicator (Intel/Samsung SSD)
|
||||||
@@ -1180,7 +1180,7 @@ def get_smart_data(disk_name):
|
|||||||
import traceback
|
import traceback
|
||||||
traceback.print_exc()
|
traceback.print_exc()
|
||||||
|
|
||||||
print(f"[v0] ===== Final SMART data for /dev/{disk_name}: {smart_data} =====")
|
|
||||||
return smart_data
|
return smart_data
|
||||||
|
|
||||||
# START OF CHANGES FOR get_proxmox_storage
|
# START OF CHANGES FOR get_proxmox_storage
|
||||||
@@ -1188,7 +1188,6 @@ def get_proxmox_storage():
|
|||||||
"""Get Proxmox storage information using pvesh (filtered by local node)"""
|
"""Get Proxmox storage information using pvesh (filtered by local node)"""
|
||||||
try:
|
try:
|
||||||
local_node = socket.gethostname()
|
local_node = socket.gethostname()
|
||||||
print(f"[v0] Getting Proxmox storage for local node: {local_node}")
|
|
||||||
|
|
||||||
result = subprocess.run(['pvesh', 'get', '/cluster/resources', '--type', 'storage', '--output-format', 'json'],
|
result = subprocess.run(['pvesh', 'get', '/cluster/resources', '--type', 'storage', '--output-format', 'json'],
|
||||||
capture_output=True, text=True, timeout=10)
|
capture_output=True, text=True, timeout=10)
|
||||||
@@ -1253,10 +1252,10 @@ def get_proxmox_storage():
|
|||||||
'node': node # Incluir información del nodo
|
'node': node # Incluir información del nodo
|
||||||
}
|
}
|
||||||
|
|
||||||
print(f"[v0] Found storage on {node}: {name} ({storage_type}) - {used_gb}/{total_gb} GB ({percent:.2f}%)")
|
|
||||||
storage_list.append(storage_info)
|
storage_list.append(storage_info)
|
||||||
|
|
||||||
print(f"[v0] Total storage entries on local node {local_node}: {len(storage_list)}")
|
|
||||||
return {'storage': storage_list}
|
return {'storage': storage_list}
|
||||||
|
|
||||||
except FileNotFoundError:
|
except FileNotFoundError:
|
||||||
|
|||||||
Reference in New Issue
Block a user