Skip to main content

smart_log/
smart_log.rs

1//! Fetch and print the SMART / Health log page for each NVMe controller.
2
3use libnvme::Root;
4
5fn main() -> Result<(), Box<dyn std::error::Error>> {
6    let root = Root::scan()?;
7    let mut any = false;
8    for host in root.hosts() {
9        for subsys in host.subsystems() {
10            for ctrl in subsys.controllers() {
11                any = true;
12                print_smart(&ctrl)?;
13            }
14        }
15    }
16    if !any {
17        println!("(no NVMe controllers found)");
18    }
19    Ok(())
20}
21
22fn print_smart(ctrl: &libnvme::Controller<'_>) -> Result<(), Box<dyn std::error::Error>> {
23    println!("=== {} ===", ctrl.name()?);
24    let log = ctrl.smart_log()?;
25    println!(
26        "  temperature        : {} K ({} C)",
27        log.temperature_kelvin(),
28        log.temperature_celsius()
29    );
30    println!(
31        "  available spare    : {}% (threshold {}%)",
32        log.available_spare(),
33        log.available_spare_threshold()
34    );
35    println!("  percentage used    : {}%", log.percentage_used());
36    println!("  data units read    : {}", log.data_units_read());
37    println!("  data units written : {}", log.data_units_written());
38    println!("  host read cmds     : {}", log.host_read_commands());
39    println!("  host write cmds    : {}", log.host_write_commands());
40    println!("  power cycles       : {}", log.power_cycles());
41    println!("  power on hours     : {}", log.power_on_hours());
42    println!("  unsafe shutdowns   : {}", log.unsafe_shutdowns());
43    println!("  media errors       : {}", log.media_errors());
44    println!("  critical warning   : 0x{:02x}", log.critical_warning());
45    println!();
46    Ok(())
47}