diff --git a/src/api2/types/tape/drive.rs b/src/api2/types/tape/drive.rs index d1d09ed1..6e5e3b15 100644 --- a/src/api2/types/tape/drive.rs +++ b/src/api2/types/tape/drive.rs @@ -204,4 +204,7 @@ pub struct LinuxDriveAndMediaStatus { /// the head. #[serde(skip_serializing_if="Option::is_none")] pub medium_passes: Option, + /// Estimated tape wearout factor (assuming max. 16000 end-to-end passes) + #[serde(skip_serializing_if="Option::is_none")] + pub medium_wearout: Option, } diff --git a/src/bin/proxmox-tape.rs b/src/bin/proxmox-tape.rs index ae76fd7c..c86b93d3 100644 --- a/src/bin/proxmox-tape.rs +++ b/src/bin/proxmox-tape.rs @@ -696,6 +696,13 @@ fn status( _ => unreachable!(), }; + let render_percentage = |value: &Value, _record: &Value| { + match value.as_f64() { + Some(wearout) => Ok(format!("{:.2}%", wearout*100.0)), + None => Ok(String::from("ERROR")), // should never happen + } + }; + let options = default_table_format_options() .column(ColumnConfig::new("blocksize")) .column(ColumnConfig::new("density")) @@ -707,6 +714,7 @@ fn status( .column(ColumnConfig::new("bytes-written").renderer(render_bytes_human_readable)) .column(ColumnConfig::new("bytes-read").renderer(render_bytes_human_readable)) .column(ColumnConfig::new("medium-passes")) + .column(ColumnConfig::new("medium-wearout").renderer(render_percentage)) .column(ColumnConfig::new("volume-mounts")) ; diff --git a/src/tape/drive/linux_tape.rs b/src/tape/drive/linux_tape.rs index 84f1d05a..a41b3183 100644 --- a/src/tape/drive/linux_tape.rs +++ b/src/tape/drive/linux_tape.rs @@ -261,6 +261,7 @@ impl LinuxTapeHandle { bytes_read: None, bytes_written: None, medium_passes: None, + medium_wearout: None, volume_mounts: None, }; @@ -276,10 +277,17 @@ impl LinuxTapeHandle { if let Ok(volume_stats) = self.volume_statistics() { - status.medium_passes = Some(std::cmp::max( + let passes = std::cmp::max( volume_stats.beginning_of_medium_passes, volume_stats.middle_of_tape_passes, - )); + ); + + // assume max. 16000 medium passes + // see: https://en.wikipedia.org/wiki/Linear_Tape-Open + let wearout: f64 = (passes as f64)/(16000.0 as f64); + + status.medium_passes = Some(passes); + status.medium_wearout = Some(wearout); status.volume_mounts = Some(volume_stats.volume_mounts); }