src/tools/disks/smart.rs: try to get correct wearout for ATA devices

This commit is contained in:
Dietmar Maurer 2020-06-06 09:01:15 +02:00
parent 059b7a252e
commit 484e761dab
1 changed files with 36 additions and 0 deletions

View File

@ -102,6 +102,7 @@ pub fn get_smart_data(
// ATA devices
if let Some(list) = output["ata_smart_attributes"]["table"].as_array() {
let wearout_id = lookup_vendor_wearout_id(disk);
for item in list {
let id = match item["id"].as_u64() {
Some(id) => id,
@ -138,6 +139,10 @@ pub fn get_smart_data(
None => continue, // skip attributes without threshold entry
};
if id == wearout_id {
wearout = Some(normalized);
}
attributes.push(SmartAttribute {
name,
value: raw_value,
@ -184,3 +189,34 @@ pub fn get_smart_data(
Ok(SmartData { status, wearout, attributes })
}
fn lookup_vendor_wearout_id(disk: &super::Disk) -> u64 {
static VENDOR_MAP: &[(&str, u64)] = &[
("kingston", 231),
("samsung", 177),
("intel", 233),
("sandisk", 233),
("crucial", 202),
];
let result = 233; // default
let model = match disk.model() {
Some(model) => {
if let Some(model) = model.to_str() {
model.to_lowercase()
} else {
return result;
}
}
None => return result,
};
for (vendor, attr_id) in VENDOR_MAP {
if model.contains(vendor) {
return *attr_id;
}
}
result
}