src/tools/disks.rs - get_disks: query smart status
This commit is contained in:
		| @ -580,6 +580,8 @@ pub struct DiskUsageInfo { | ||||
|     pub name: String, | ||||
|     pub used: DiskUsageType, | ||||
|     pub disk_type: DiskType, | ||||
|     pub status: SmartStatus, | ||||
|     pub wearout: Option<f64>, | ||||
|     pub vendor: Option<String>, | ||||
|     pub model: Option<String>, | ||||
|     pub wwn: Option<String>, | ||||
| @ -698,14 +700,14 @@ pub fn get_disks( | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         let data = disk_manager.clone().disk_by_sys_path(&sys_path)?; | ||||
|         let disk = disk_manager.clone().disk_by_sys_path(&sys_path)?; | ||||
|  | ||||
|         let size = match data.size() { | ||||
|         let size = match disk.size() { | ||||
|             Ok(size) => size, | ||||
|             Err(_) => continue, // skip devices with unreadable size | ||||
|         }; | ||||
|  | ||||
|         let disk_type = match data.guess_disk_type() { | ||||
|         let disk_type = match disk.guess_disk_type() { | ||||
|             Ok(disk_type) => disk_type, | ||||
|             Err(_) => continue, // skip devices with undetectable type | ||||
|         }; | ||||
| @ -716,7 +718,7 @@ pub fn get_disks( | ||||
|             usage = DiskUsageType::LVM; | ||||
|         } | ||||
|  | ||||
|         match data.is_mounted() { | ||||
|         match disk.is_mounted() { | ||||
|             Ok(true) => usage = DiskUsageType::Mounted, | ||||
|             Ok(false) => {}, | ||||
|             Err(_) => continue, // skip devices with undetectable mount status | ||||
| @ -726,16 +728,16 @@ pub fn get_disks( | ||||
|             usage = DiskUsageType::ZFS; | ||||
|         } | ||||
|  | ||||
|         let vendor = data.vendor().unwrap_or(None). | ||||
|         let vendor = disk.vendor().unwrap_or(None). | ||||
|             map(|s| s.to_string_lossy().trim().to_string()); | ||||
|  | ||||
|         let model = data.model().map(|s| s.to_string_lossy().into_owned()); | ||||
|         let model = disk.model().map(|s| s.to_string_lossy().into_owned()); | ||||
|  | ||||
|         let serial = data.serial().map(|s| s.to_string_lossy().into_owned()); | ||||
|         let serial = disk.serial().map(|s| s.to_string_lossy().into_owned()); | ||||
|  | ||||
|         let devpath =  data.device_path().map(|p| p.to_owned()); | ||||
|         let devpath =  disk.device_path().map(|p| p.to_owned()); | ||||
|  | ||||
|         let wwn = data.wwn().map(|s| s.to_string_lossy().into_owned()); | ||||
|         let wwn = disk.wwn().map(|s| s.to_string_lossy().into_owned()); | ||||
|  | ||||
|         if usage != DiskUsageType::Mounted { | ||||
|             match scan_partitions(disk_manager.clone(), &lvm_devices, &zfs_devices, &name) { | ||||
| @ -748,16 +750,25 @@ pub fn get_disks( | ||||
|             }; | ||||
|         } | ||||
|  | ||||
|         let mut  status = SmartStatus::Unknown; | ||||
|         let mut wearout = None; | ||||
|  | ||||
|         if !no_smart { | ||||
|             if let Ok(smart) = get_smart_data(&disk, false) { | ||||
|                 status = smart.status; | ||||
|                 wearout = smart.wearout; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         let info = DiskUsageInfo { | ||||
|             name: name.clone(), | ||||
|             vendor, model, serial, devpath, size, wwn, disk_type, | ||||
|             status, wearout, | ||||
|             used: usage, | ||||
|             gpt: data.has_gpt(), | ||||
|             rpm: data.ata_rotation_rate_rpm(), | ||||
|             gpt: disk.has_gpt(), | ||||
|             rpm: disk.ata_rotation_rate_rpm(), | ||||
|         }; | ||||
|  | ||||
|         println!("GOT {:?}", info); | ||||
|  | ||||
|         result.insert(name, info); | ||||
|     } | ||||
|  | ||||
|  | ||||
| @ -65,9 +65,9 @@ pub struct SmartAttribute { | ||||
| #[derive(Debug, Serialize, Deserialize)] | ||||
| /// Data from smartctl | ||||
| pub struct SmartData { | ||||
|     status: SmartStatus, | ||||
|     wearout: Option<f64>, | ||||
|     attributes: Vec<SmartAttribute>, | ||||
|     pub status: SmartStatus, | ||||
|     pub wearout: Option<f64>, | ||||
|     pub attributes: Vec<SmartAttribute>, | ||||
| } | ||||
|  | ||||
| /// Read smartctl data for a disk (/dev/XXX). | ||||
|  | ||||
		Reference in New Issue
	
	Block a user