src/tools/disks.rs - get_disks: query smart status

This commit is contained in:
Dietmar Maurer 2020-06-06 09:18:20 +02:00
parent 4c24a48eb3
commit 91960d6162
2 changed files with 27 additions and 16 deletions

View File

@ -580,6 +580,8 @@ pub struct DiskUsageInfo {
pub name: String, pub name: String,
pub used: DiskUsageType, pub used: DiskUsageType,
pub disk_type: DiskType, pub disk_type: DiskType,
pub status: SmartStatus,
pub wearout: Option<f64>,
pub vendor: Option<String>, pub vendor: Option<String>,
pub model: Option<String>, pub model: Option<String>,
pub wwn: 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, Ok(size) => size,
Err(_) => continue, // skip devices with unreadable 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, Ok(disk_type) => disk_type,
Err(_) => continue, // skip devices with undetectable type Err(_) => continue, // skip devices with undetectable type
}; };
@ -716,7 +718,7 @@ pub fn get_disks(
usage = DiskUsageType::LVM; usage = DiskUsageType::LVM;
} }
match data.is_mounted() { match disk.is_mounted() {
Ok(true) => usage = DiskUsageType::Mounted, Ok(true) => usage = DiskUsageType::Mounted,
Ok(false) => {}, Ok(false) => {},
Err(_) => continue, // skip devices with undetectable mount status Err(_) => continue, // skip devices with undetectable mount status
@ -726,16 +728,16 @@ pub fn get_disks(
usage = DiskUsageType::ZFS; 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()); 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 { if usage != DiskUsageType::Mounted {
match scan_partitions(disk_manager.clone(), &lvm_devices, &zfs_devices, &name) { 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 { let info = DiskUsageInfo {
name: name.clone(), name: name.clone(),
vendor, model, serial, devpath, size, wwn, disk_type, vendor, model, serial, devpath, size, wwn, disk_type,
status, wearout,
used: usage, used: usage,
gpt: data.has_gpt(), gpt: disk.has_gpt(),
rpm: data.ata_rotation_rate_rpm(), rpm: disk.ata_rotation_rate_rpm(),
}; };
println!("GOT {:?}", info);
result.insert(name, info); result.insert(name, info);
} }

View File

@ -65,9 +65,9 @@ pub struct SmartAttribute {
#[derive(Debug, Serialize, Deserialize)] #[derive(Debug, Serialize, Deserialize)]
/// Data from smartctl /// Data from smartctl
pub struct SmartData { pub struct SmartData {
status: SmartStatus, pub status: SmartStatus,
wearout: Option<f64>, pub wearout: Option<f64>,
attributes: Vec<SmartAttribute>, pub attributes: Vec<SmartAttribute>,
} }
/// Read smartctl data for a disk (/dev/XXX). /// Read smartctl data for a disk (/dev/XXX).