1use 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}