Updated _check_drives_health
This commit is contained in:
@ -300,7 +300,36 @@ class SystemHealthMonitor:
|
||||
logger.debug("=== Issue Detection Completed ===\n")
|
||||
|
||||
return issues
|
||||
|
||||
def _get_all_disks(self) -> List[str]:
|
||||
"""
|
||||
Get all physical disks using multiple detection methods.
|
||||
"""
|
||||
disks = set()
|
||||
|
||||
# Method 1: Use lsblk to get physical disks
|
||||
try:
|
||||
result = subprocess.run(
|
||||
['lsblk', '-d', '-n', '-o', 'NAME'],
|
||||
stdout=subprocess.PIPE,
|
||||
text=True
|
||||
)
|
||||
disks.update(f"/dev/{disk}" for disk in result.stdout.strip().split('\n'))
|
||||
logger.debug(f"Disks found via lsblk: {disks}")
|
||||
except Exception as e:
|
||||
logger.debug(f"lsblk detection failed: {e}")
|
||||
|
||||
# Method 2: Direct device scanning
|
||||
for pattern in ['/dev/sd*', '/dev/nvme*n*']:
|
||||
try:
|
||||
matches = glob.glob(pattern)
|
||||
disks.update(d for d in matches if not d[-1].isdigit())
|
||||
logger.debug(f"Disks found via glob {pattern}: {matches}")
|
||||
except Exception as e:
|
||||
logger.debug(f"Glob detection failed for {pattern}: {e}")
|
||||
|
||||
return list(disks)
|
||||
|
||||
def _is_physical_disk(self, device_path):
|
||||
"""
|
||||
Check if the device is a physical disk, excluding logical volumes and special devices.
|
||||
@ -552,6 +581,10 @@ class SystemHealthMonitor:
|
||||
:return: Combined health report of all drives and their status.
|
||||
"""
|
||||
drives_health = {'overall_status': 'NORMAL', 'drives': []}
|
||||
|
||||
physical_disks = self._get_all_disks()
|
||||
logger.debug(f"Found physical disks: {physical_disks}")
|
||||
|
||||
try:
|
||||
all_partitions = psutil.disk_partitions()
|
||||
logger.debug(f"All disk partitions found: {[p.device for p in all_partitions]}")
|
||||
@ -610,6 +643,29 @@ class SystemHealthMonitor:
|
||||
|
||||
drives_health['drives'].append(drive_report)
|
||||
|
||||
# Add non-mounted physical disks
|
||||
for disk in physical_disks:
|
||||
if not any(d['device'] == disk for d in drives_health['drives']):
|
||||
drive_report = {
|
||||
'device': disk,
|
||||
'mountpoint': None,
|
||||
'usage_status': 'UNMOUNTED'
|
||||
}
|
||||
|
||||
# Check SMART health for unmounted disks
|
||||
smart_health = self._check_smart_health(disk)
|
||||
drive_report.update({
|
||||
'smart_status': smart_health['status'],
|
||||
'smart_issues': smart_health['issues'],
|
||||
'temperature': smart_health['temp'],
|
||||
'smart_attributes': smart_health['attributes']
|
||||
})
|
||||
|
||||
if smart_health['status'] == 'UNHEALTHY':
|
||||
overall_status = 'CRITICAL'
|
||||
|
||||
drives_health['drives'].append(drive_report)
|
||||
|
||||
drives_health['overall_status'] = overall_status
|
||||
|
||||
except Exception as e:
|
||||
|
||||
Reference in New Issue
Block a user