From 8446fbca85f0ba7eb5ec34e60069674e0dac2ce3 Mon Sep 17 00:00:00 2001 From: Dietmar Maurer Date: Wed, 13 Jan 2021 13:26:59 +0100 Subject: [PATCH] tape: rename changer_id to label_text --- src/api2/tape/backup.rs | 4 +- src/api2/tape/changer.rs | 4 +- src/api2/tape/drive.rs | 100 ++++++++++++++++---------------- src/api2/tape/media.rs | 24 ++++---- src/api2/tape/restore.rs | 6 +- src/api2/types/tape/changer.rs | 4 +- src/api2/types/tape/media.rs | 16 ++--- src/bin/proxmox-tape.rs | 20 +++---- src/bin/proxmox_tape/changer.rs | 4 +- src/bin/proxmox_tape/media.rs | 14 ++--- src/tape/changer/email.rs | 6 +- src/tape/changer/mod.rs | 30 +++++----- src/tape/drive/mod.rs | 18 +++--- src/tape/drive/virtual_tape.rs | 30 +++++----- src/tape/file_formats.rs | 4 +- src/tape/inventory.rs | 22 +++---- src/tape/media_pool.rs | 8 +-- src/tape/online_status_map.rs | 20 +++---- src/tape/pool_writer.rs | 8 +-- 19 files changed, 171 insertions(+), 171 deletions(-) diff --git a/src/api2/tape/backup.rs b/src/api2/tape/backup.rs index 8d80043b..56622e64 100644 --- a/src/api2/tape/backup.rs +++ b/src/api2/tape/backup.rs @@ -170,7 +170,7 @@ fn update_media_online_status(drive: &str) -> Result { has_changer = true; - let changer_id_list = changer.online_media_changer_ids()?; + let label_text_list = changer.online_media_label_texts()?; let status_path = Path::new(TAPE_STATUS_DIR); let mut inventory = Inventory::load(status_path)?; @@ -179,7 +179,7 @@ fn update_media_online_status(drive: &str) -> Result { &config, &mut inventory, &changer_name, - &changer_id_list, + &label_text_list, )?; } diff --git a/src/api2/tape/changer.rs b/src/api2/tape/changer.rs index b01cce94..43545a66 100644 --- a/src/api2/tape/changer.rs +++ b/src/api2/tape/changer.rs @@ -70,7 +70,7 @@ pub async fn get_status(name: String) -> Result, Error> { let entry = MtxStatusEntry { entry_kind: MtxEntryKind::Drive, entry_id: id as u64, - changer_id: match &drive_status.status { + label_text: match &drive_status.status { ElementStatus::Empty => None, ElementStatus::Full => Some(String::new()), ElementStatus::VolumeTag(tag) => Some(tag.to_string()), @@ -88,7 +88,7 @@ pub async fn get_status(name: String) -> Result, Error> { MtxEntryKind::Slot }, entry_id: id as u64 + 1, - changer_id: match &slot_status { + label_text: match &slot_status { ElementStatus::Empty => None, ElementStatus::Full => Some(String::new()), ElementStatus::VolumeTag(tag) => Some(tag.to_string()), diff --git a/src/api2/tape/drive.rs b/src/api2/tape/drive.rs index 410f1607..f124b7c6 100644 --- a/src/api2/tape/drive.rs +++ b/src/api2/tape/drive.rs @@ -70,7 +70,7 @@ use crate::{ drive: { schema: DRIVE_NAME_SCHEMA, }, - "changer-id": { + "label-text": { schema: MEDIA_LABEL_SCHEMA, }, }, @@ -79,13 +79,13 @@ use crate::{ /// Load media with specified label /// /// Issue a media load request to the associated changer device. -pub async fn load_media(drive: String, changer_id: String) -> Result<(), Error> { +pub async fn load_media(drive: String, label_text: String) -> Result<(), Error> { let (config, _digest) = config::drive::config()?; tokio::task::spawn_blocking(move || { let (mut changer, _) = required_media_changer(&config, &drive)?; - changer.load_media(&changer_id) + changer.load_media(&label_text) }).await? } @@ -121,7 +121,7 @@ pub async fn load_slot(drive: String, source_slot: u64) -> Result<(), Error> { drive: { schema: DRIVE_NAME_SCHEMA, }, - "changer-id": { + "label-text": { schema: MEDIA_LABEL_SCHEMA, }, }, @@ -133,15 +133,15 @@ pub async fn load_slot(drive: String, source_slot: u64) -> Result<(), Error> { }, )] /// Export media with specified label -pub async fn export_media(drive: String, changer_id: String) -> Result { +pub async fn export_media(drive: String, label_text: String) -> Result { let (config, _digest) = config::drive::config()?; tokio::task::spawn_blocking(move || { let (mut changer, changer_name) = required_media_changer(&config, &drive)?; - match changer.export_media(&changer_id)? { + match changer.export_media(&label_text)? { Some(slot) => Ok(slot), - None => bail!("media '{}' is not online (via changer '{}')", changer_id, changer_name), + None => bail!("media '{}' is not online (via changer '{}')", label_text, changer_name), } }).await? } @@ -315,7 +315,7 @@ pub async fn eject_media(drive: String) -> Result<(), Error> { drive: { schema: DRIVE_NAME_SCHEMA, }, - "changer-id": { + "label-text": { schema: MEDIA_LABEL_SCHEMA, }, pool: { @@ -337,7 +337,7 @@ pub async fn eject_media(drive: String) -> Result<(), Error> { pub fn label_media( drive: String, pool: Option, - changer_id: String, + label_text: String, rpcenv: &mut dyn RpcEnvironment, ) -> Result { @@ -380,7 +380,7 @@ pub fn label_media( let ctime = proxmox::tools::time::epoch_i64(); let label = MediaLabel { - changer_id: changer_id.to_string(), + label_text: label_text.to_string(), uuid: Uuid::generate(), ctime, }; @@ -405,13 +405,13 @@ fn write_media_label( if let Some(ref pool) = pool { // assign media to pool by writing special media set label - worker.log(format!("Label media '{}' for pool '{}'", label.changer_id, pool)); + worker.log(format!("Label media '{}' for pool '{}'", label.label_text, pool)); let set = MediaSetLabel::with_data(&pool, [0u8; 16].into(), 0, label.ctime); drive.write_media_set_label(&set)?; media_set_label = Some(set); } else { - worker.log(format!("Label media '{}' (no pool assignment)", label.changer_id)); + worker.log(format!("Label media '{}' (no pool assignment)", label.label_text)); } let media_id = MediaId { label, media_set_label }; @@ -482,7 +482,7 @@ pub async fn read_label(drive: String) -> Result { Some(media_id) => { let mut flat = MediaIdFlat { uuid: media_id.label.uuid.to_string(), - changer_id: media_id.label.changer_id.clone(), + label_text: media_id.label.label_text.clone(), ctime: media_id.label.ctime, media_set_ctime: None, media_set_uuid: None, @@ -585,7 +585,7 @@ pub async fn inventory( tokio::task::spawn_blocking(move || { let (mut changer, changer_name) = required_media_changer(&config, &drive)?; - let changer_id_list = changer.online_media_changer_ids()?; + let label_text_list = changer.online_media_label_texts()?; let state_path = Path::new(TAPE_STATUS_DIR); @@ -595,23 +595,23 @@ pub async fn inventory( &config, &mut inventory, &changer_name, - &changer_id_list, + &label_text_list, )?; let mut list = Vec::new(); - for changer_id in changer_id_list.iter() { - if changer_id.starts_with("CLN") { + for label_text in label_text_list.iter() { + if label_text.starts_with("CLN") { // skip cleaning unit continue; } - let changer_id = changer_id.to_string(); + let label_text = label_text.to_string(); - if let Some(media_id) = inventory.find_media_by_changer_id(&changer_id) { - list.push(LabelUuidMap { changer_id, uuid: Some(media_id.label.uuid.to_string()) }); + if let Some(media_id) = inventory.find_media_by_label_text(&label_text) { + list.push(LabelUuidMap { label_text, uuid: Some(media_id.label.uuid.to_string()) }); } else { - list.push(LabelUuidMap { changer_id, uuid: None }); + list.push(LabelUuidMap { label_text, uuid: None }); } } @@ -668,8 +668,8 @@ pub fn update_inventory( let (mut changer, changer_name) = required_media_changer(&config, &drive)?; - let changer_id_list = changer.online_media_changer_ids()?; - if changer_id_list.is_empty() { + let label_text_list = changer.online_media_label_texts()?; + if label_text_list.is_empty() { worker.log(format!("changer device does not list any media labels")); } @@ -677,42 +677,42 @@ pub fn update_inventory( let mut inventory = Inventory::load(state_path)?; - update_changer_online_status(&config, &mut inventory, &changer_name, &changer_id_list)?; + update_changer_online_status(&config, &mut inventory, &changer_name, &label_text_list)?; - for changer_id in changer_id_list.iter() { - if changer_id.starts_with("CLN") { - worker.log(format!("skip cleaning unit '{}'", changer_id)); + for label_text in label_text_list.iter() { + if label_text.starts_with("CLN") { + worker.log(format!("skip cleaning unit '{}'", label_text)); continue; } - let changer_id = changer_id.to_string(); + let label_text = label_text.to_string(); if !read_all_labels.unwrap_or(false) { - if let Some(_) = inventory.find_media_by_changer_id(&changer_id) { - worker.log(format!("media '{}' already inventoried", changer_id)); + if let Some(_) = inventory.find_media_by_label_text(&label_text) { + worker.log(format!("media '{}' already inventoried", label_text)); continue; } } - if let Err(err) = changer.load_media(&changer_id) { - worker.warn(format!("unable to load media '{}' - {}", changer_id, err)); + if let Err(err) = changer.load_media(&label_text) { + worker.warn(format!("unable to load media '{}' - {}", label_text, err)); continue; } let mut drive = open_drive(&config, &drive)?; match drive.read_label() { Err(err) => { - worker.warn(format!("unable to read label form media '{}' - {}", changer_id, err)); + worker.warn(format!("unable to read label form media '{}' - {}", label_text, err)); } Ok(None) => { - worker.log(format!("media '{}' is empty", changer_id)); + worker.log(format!("media '{}' is empty", label_text)); } Ok(Some(media_id)) => { - if changer_id != media_id.label.changer_id { - worker.warn(format!("label changer ID missmatch ({} != {})", changer_id, media_id.label.changer_id)); + if label_text != media_id.label.label_text { + worker.warn(format!("label text missmatch ({} != {})", label_text, media_id.label.label_text)); continue; } - worker.log(format!("inventorize media '{}' with uuid '{}'", changer_id, media_id.label.uuid)); + worker.log(format!("inventorize media '{}' with uuid '{}'", label_text, media_id.label.uuid)); inventory.store(media_id, false)?; } } @@ -784,31 +784,31 @@ fn barcode_label_media_worker( let (mut changer, changer_name) = required_media_changer(&config, &drive)?; - let changer_id_list = changer.online_media_changer_ids()?; + let label_text_list = changer.online_media_label_texts()?; let state_path = Path::new(TAPE_STATUS_DIR); let mut inventory = Inventory::load(state_path)?; - update_changer_online_status(&config, &mut inventory, &changer_name, &changer_id_list)?; + update_changer_online_status(&config, &mut inventory, &changer_name, &label_text_list)?; - if changer_id_list.is_empty() { + if label_text_list.is_empty() { bail!("changer device does not list any media labels"); } - for changer_id in changer_id_list { - if changer_id.starts_with("CLN") { continue; } + for label_text in label_text_list { + if label_text.starts_with("CLN") { continue; } inventory.reload()?; - if inventory.find_media_by_changer_id(&changer_id).is_some() { - worker.log(format!("media '{}' already inventoried (already labeled)", changer_id)); + if inventory.find_media_by_label_text(&label_text).is_some() { + worker.log(format!("media '{}' already inventoried (already labeled)", label_text)); continue; } - worker.log(format!("checking/loading media '{}'", changer_id)); + worker.log(format!("checking/loading media '{}'", label_text)); - if let Err(err) = changer.load_media(&changer_id) { - worker.warn(format!("unable to load media '{}' - {}", changer_id, err)); + if let Err(err) = changer.load_media(&label_text) { + worker.warn(format!("unable to load media '{}' - {}", label_text, err)); continue; } @@ -817,7 +817,7 @@ fn barcode_label_media_worker( match drive.read_next_file() { Ok(Some(_file)) => { - worker.log(format!("media '{}' is not empty (erase first)", changer_id)); + worker.log(format!("media '{}' is not empty (erase first)", label_text)); continue; } Ok(None) => { /* EOF mark at BOT, assume tape is empty */ }, @@ -825,7 +825,7 @@ fn barcode_label_media_worker( if err.is_errno(nix::errno::Errno::ENOSPC) || err.is_errno(nix::errno::Errno::EIO) { /* assume tape is empty */ } else { - worker.warn(format!("media '{}' read error (maybe not empty - erase first)", changer_id)); + worker.warn(format!("media '{}' read error (maybe not empty - erase first)", label_text)); continue; } } @@ -833,7 +833,7 @@ fn barcode_label_media_worker( let ctime = proxmox::tools::time::epoch_i64(); let label = MediaLabel { - changer_id: changer_id.to_string(), + label_text: label_text.to_string(), uuid: Uuid::generate(), ctime, }; diff --git a/src/api2/tape/media.rs b/src/api2/tape/media.rs index ee5afb80..cbbe80c5 100644 --- a/src/api2/tape/media.rs +++ b/src/api2/tape/media.rs @@ -112,7 +112,7 @@ pub async fn list_media(pool: Option) -> Result, Err list.push(MediaListEntry { uuid: media.uuid().to_string(), - changer_id: media.changer_id().to_string(), + label_text: media.label_text().to_string(), ctime: media.ctime(), pool: Some(pool_name.to_string()), location: media.location().clone(), @@ -142,7 +142,7 @@ pub async fn list_media(pool: Option) -> Result, Err list.push(MediaListEntry { uuid: media_id.label.uuid.to_string(), ctime: media_id.label.ctime, - changer_id: media_id.label.changer_id.to_string(), + label_text: media_id.label.label_text.to_string(), location, status, catalog: true, // empty, so we do not need a catalog @@ -162,7 +162,7 @@ pub async fn list_media(pool: Option) -> Result, Err #[api( input: { properties: { - "changer-id": { + "label-text": { schema: MEDIA_LABEL_SCHEMA, }, force: { @@ -174,21 +174,21 @@ pub async fn list_media(pool: Option) -> Result, Err }, )] /// Destroy media (completely remove from database) -pub fn destroy_media(changer_id: String, force: Option,) -> Result<(), Error> { +pub fn destroy_media(label_text: String, force: Option,) -> Result<(), Error> { let force = force.unwrap_or(false); let status_path = Path::new(TAPE_STATUS_DIR); let mut inventory = Inventory::load(status_path)?; - let media_id = inventory.find_media_by_changer_id(&changer_id) - .ok_or_else(|| format_err!("no such media '{}'", changer_id))?; + let media_id = inventory.find_media_by_label_text(&label_text) + .ok_or_else(|| format_err!("no such media '{}'", label_text))?; if !force { if let Some(ref set) = media_id.media_set_label { let is_empty = set.uuid.as_ref() == [0u8;16]; if !is_empty { - bail!("media '{}' contains data (please use 'force' flag to remove.", changer_id); + bail!("media '{}' contains data (please use 'force' flag to remove.", label_text); } } } @@ -207,7 +207,7 @@ pub fn destroy_media(changer_id: String, force: Option,) -> Result<(), Err schema: MEDIA_POOL_NAME_SCHEMA, optional: true, }, - "changer-id": { + "label-text": { schema: MEDIA_LABEL_SCHEMA, optional: true, }, @@ -236,7 +236,7 @@ pub fn destroy_media(changer_id: String, force: Option,) -> Result<(), Err /// Content list filter parameters pub struct MediaContentListFilter { pub pool: Option, - pub changer_id: Option, + pub label_text: Option, pub media: Option, pub media_set: Option, pub backup_type: Option, @@ -278,8 +278,8 @@ pub fn list_content( for media_id in inventory.list_used_media() { let set = media_id.media_set_label.as_ref().unwrap(); - if let Some(ref changer_id) = filter.changer_id { - if &media_id.label.changer_id != changer_id { continue; } + if let Some(ref label_text) = filter.label_text { + if &media_id.label.label_text != label_text { continue; } } if let Some(ref pool) = filter.pool { @@ -314,7 +314,7 @@ pub fn list_content( list.push(MediaContentEntry { uuid: media_id.label.uuid.to_string(), - changer_id: media_id.label.changer_id.to_string(), + label_text: media_id.label.label_text.to_string(), pool: set.pool.clone(), media_set_name: media_set_name.clone(), media_set_uuid: set.uuid.to_string(), diff --git a/src/api2/tape/restore.rs b/src/api2/tape/restore.rs index 843ac243..1131f181 100644 --- a/src/api2/tape/restore.rs +++ b/src/api2/tape/restore.rs @@ -152,7 +152,7 @@ pub fn restore( worker.log(format!( "Required media list: {}", media_id_list.iter() - .map(|media_id| media_id.label.changer_id.as_str()) + .map(|media_id| media_id.label.label_text.as_str()) .collect::>() .join(";") )); @@ -196,12 +196,12 @@ pub fn request_and_restore_media( match info.media_set_label { None => { bail!("missing media set label on media {} ({})", - media_id.label.changer_id, media_id.label.uuid); + media_id.label.label_text, media_id.label.uuid); } Some(ref set) => { if &set.uuid != media_set_uuid { bail!("wrong media set label on media {} ({} != {})", - media_id.label.changer_id, media_id.label.uuid, + media_id.label.label_text, media_id.label.uuid, media_set_uuid); } } diff --git a/src/api2/types/tape/changer.rs b/src/api2/types/tape/changer.rs index c7acd381..dccaea6a 100644 --- a/src/api2/types/tape/changer.rs +++ b/src/api2/types/tape/changer.rs @@ -87,7 +87,7 @@ pub enum MtxEntryKind { "entry-kind": { type: MtxEntryKind, }, - "changer-id": { + "label-text": { schema: MEDIA_LABEL_SCHEMA, optional: true, }, @@ -102,7 +102,7 @@ pub struct MtxStatusEntry { pub entry_id: u64, /// The media label (volume tag) if the slot/drive is full #[serde(skip_serializing_if="Option::is_none")] - pub changer_id: Option, + pub label_text: Option, /// The slot the drive was loaded from #[serde(skip_serializing_if="Option::is_none")] pub loaded_slot: Option, diff --git a/src/api2/types/tape/media.rs b/src/api2/types/tape/media.rs index da030aab..3318e3a6 100644 --- a/src/api2/types/tape/media.rs +++ b/src/api2/types/tape/media.rs @@ -21,8 +21,8 @@ use super::{ #[serde(rename_all = "kebab-case")] /// Media list entry pub struct MediaListEntry { - /// Media changer ID - pub changer_id: String, + /// Media label text (or Barcode) + pub label_text: String, /// Media Uuid pub uuid: String, /// Creation time stamp @@ -57,8 +57,8 @@ pub struct MediaListEntry { pub struct MediaIdFlat { /// Unique ID pub uuid: String, - /// Media Changer ID or Barcode - pub changer_id: String, + /// Media label text (or Barcode) + pub label_text: String, /// Creation time stamp pub ctime: i64, // All MediaSet properties are optional here @@ -81,8 +81,8 @@ pub struct MediaIdFlat { #[serde(rename_all = "kebab-case")] /// Label with optional Uuid pub struct LabelUuidMap { - /// Changer ID (label) - pub changer_id: String, + /// Changer label text (or Barcode) + pub label_text: String, /// Associated Uuid (if any) pub uuid: Option, } @@ -92,8 +92,8 @@ pub struct LabelUuidMap { #[serde(rename_all = "kebab-case")] /// Media content list entry pub struct MediaContentEntry { - /// Media changer ID - pub changer_id: String, + /// Media label text (or Barcode) + pub label_text: String, /// Media Uuid pub uuid: String, /// Media set name diff --git a/src/bin/proxmox-tape.rs b/src/bin/proxmox-tape.rs index 4850008a..ee35be23 100644 --- a/src/bin/proxmox-tape.rs +++ b/src/bin/proxmox-tape.rs @@ -42,7 +42,7 @@ use proxmox_backup::{ }, tape::{ open_drive, - complete_media_changer_id, + complete_media_label_text, complete_media_set_uuid, file_formats::{ PROXMOX_BACKUP_CONTENT_HEADER_MAGIC_1_0, @@ -210,7 +210,7 @@ async fn eject_media( schema: DRIVE_NAME_SCHEMA, optional: true, }, - "changer-id": { + "label-text": { schema: MEDIA_LABEL_SCHEMA, }, }, @@ -243,7 +243,7 @@ async fn load_media( schema: DRIVE_NAME_SCHEMA, optional: true, }, - "changer-id": { + "label-text": { schema: MEDIA_LABEL_SCHEMA, }, }, @@ -351,7 +351,7 @@ async fn unload_media( schema: DRIVE_NAME_SCHEMA, optional: true, }, - "changer-id": { + "label-text": { schema: MEDIA_LABEL_SCHEMA, }, }, @@ -411,7 +411,7 @@ async fn read_label( }; let options = default_table_format_options() - .column(ColumnConfig::new("changer-id")) + .column(ColumnConfig::new("label-text")) .column(ColumnConfig::new("uuid")) .column(ColumnConfig::new("ctime").renderer(render_epoch)) .column(ColumnConfig::new("pool")) @@ -487,7 +487,7 @@ async fn inventory( }; let options = default_table_format_options() - .column(ColumnConfig::new("changer-id")) + .column(ColumnConfig::new("label-text")) .column(ColumnConfig::new("uuid")) ; @@ -950,9 +950,9 @@ fn main() { .insert( "load-media", CliCommand::new(&API_METHOD_LOAD_MEDIA) - .arg_param(&["changer-id"]) + .arg_param(&["label-text"]) .completion_cb("drive", complete_drive_name) - .completion_cb("changer-id", complete_media_changer_id) + .completion_cb("label-text", complete_media_label_text) ) .insert( "load-media-from-slot", @@ -968,9 +968,9 @@ fn main() { .insert( "export-media", CliCommand::new(&API_METHOD_EXPORT_MEDIA) - .arg_param(&["changer-id"]) + .arg_param(&["label-text"]) .completion_cb("drive", complete_drive_name) - .completion_cb("changer-id", complete_media_changer_id) + .completion_cb("label-text", complete_media_label_text) ) ; diff --git a/src/bin/proxmox_tape/changer.rs b/src/bin/proxmox_tape/changer.rs index 3a5494a5..b54616de 100644 --- a/src/bin/proxmox_tape/changer.rs +++ b/src/bin/proxmox_tape/changer.rs @@ -233,7 +233,7 @@ async fn get_status( _ => unreachable!(), }; - let render_changer_id = |value: &Value, _record: &Value| -> Result { + let render_label_text = |value: &Value, _record: &Value| -> Result { if value.is_null() { return Ok(String::new()); } @@ -250,7 +250,7 @@ async fn get_status( .sortby("entry-id", false) .column(ColumnConfig::new("entry-kind")) .column(ColumnConfig::new("entry-id")) - .column(ColumnConfig::new("changer-id").renderer(render_changer_id)) + .column(ColumnConfig::new("label-text").renderer(render_label_text)) .column(ColumnConfig::new("loaded-slot")) ; diff --git a/src/bin/proxmox_tape/media.rs b/src/bin/proxmox_tape/media.rs index dd1118c6..4bd0474b 100644 --- a/src/bin/proxmox_tape/media.rs +++ b/src/bin/proxmox_tape/media.rs @@ -21,7 +21,7 @@ use proxmox_backup::{ tape::media::MediaContentListFilter, }, tape::{ - complete_media_changer_id, + complete_media_label_text, complete_media_uuid, complete_media_set_uuid, }, @@ -41,14 +41,14 @@ pub fn media_commands() -> CommandLineInterface { .insert( "destroy", CliCommand::new(&api2::tape::media::API_METHOD_DESTROY_MEDIA) - .arg_param(&["changer-id"]) - .completion_cb("changer-id", complete_media_changer_id) + .arg_param(&["label-text"]) + .completion_cb("label-text", complete_media_label_text) ) .insert( "content", CliCommand::new(&API_METHOD_LIST_CONTENT) .completion_cb("pool", complete_pool_name) - .completion_cb("changer-id", complete_media_changer_id) + .completion_cb("label-text", complete_media_label_text) .completion_cb("media", complete_media_uuid) .completion_cb("media-set", complete_media_set_uuid) ) @@ -116,8 +116,8 @@ async fn list_media( .sortby("pool", false) .sortby("media-set-uuid", false) .sortby("seq-nr", false) - .sortby("changer-id", false) - .column(ColumnConfig::new("changer-id")) + .sortby("label-text", false) + .column(ColumnConfig::new("label-text")) .column(ColumnConfig::new("pool")) .column(ColumnConfig::new("media-set-name")) .column(ColumnConfig::new("seq-nr")) @@ -165,7 +165,7 @@ fn list_content( .sortby("seq-nr", false) .sortby("snapshot", false) .sortby("backup-time", false) - .column(ColumnConfig::new("changer-id")) + .column(ColumnConfig::new("label-text")) .column(ColumnConfig::new("pool")) .column(ColumnConfig::new("media-set-name")) .column(ColumnConfig::new("seq-nr")) diff --git a/src/tape/changer/email.rs b/src/tape/changer/email.rs index fcdb2f18..9be06196 100644 --- a/src/tape/changer/email.rs +++ b/src/tape/changer/email.rs @@ -5,18 +5,18 @@ use proxmox::tools::email::sendmail; /// Send email to a person to request a manual media change pub fn send_load_media_email( drive: &str, - changer_id: &str, + label_text: &str, to: &str, ) -> Result<(), Error> { - let subject = format!("Load Media '{}' request for drive '{}'", changer_id, drive); + let subject = format!("Load Media '{}' request for drive '{}'", label_text, drive); let mut text = String::new(); text.push_str("Please insert the requested media into the backup drive.\n\n"); text.push_str(&format!("Drive: {}\n", drive)); - text.push_str(&format!("Media: {}\n", changer_id)); + text.push_str(&format!("Media: {}\n", label_text)); sendmail( &[to], diff --git a/src/tape/changer/mod.rs b/src/tape/changer/mod.rs index 04565b18..6e2c5b5b 100644 --- a/src/tape/changer/mod.rs +++ b/src/tape/changer/mod.rs @@ -32,17 +32,17 @@ pub trait MediaChange { /// Load media from storage slot into drive fn load_media_from_slot(&mut self, slot: u64) -> Result<(), Error>; - /// Load media by changer-id into drive + /// Load media by label-text into drive /// /// This unloads first if the drive is already loaded with another media. /// /// Note: This refuses to load media inside import/export /// slots. Also, you cannot load cleaning units with this /// interface. - fn load_media(&mut self, changer_id: &str) -> Result<(), Error> { + fn load_media(&mut self, label_text: &str) -> Result<(), Error> { - if changer_id.starts_with("CLN") { - bail!("unable to load media '{}' (seems top be a a cleaning units)", changer_id); + if label_text.starts_with("CLN") { + bail!("unable to load media '{}' (seems top be a a cleaning units)", label_text); } let mut status = self.status()?; @@ -52,10 +52,10 @@ pub trait MediaChange { // already loaded? for (i, drive_status) in status.drives.iter().enumerate() { if let ElementStatus::VolumeTag(ref tag) = drive_status.status { - if *tag == changer_id { + if *tag == label_text { if i as u64 != self.drive_number() { bail!("unable to load media '{}' - media in wrong drive ({} != {})", - changer_id, i, self.drive_number()); + label_text, i, self.drive_number()); } return Ok(()) // already loaded } @@ -76,9 +76,9 @@ pub trait MediaChange { let mut slot = None; for (i, (import_export, element_status)) in status.slots.iter().enumerate() { if let ElementStatus::VolumeTag(tag) = element_status { - if *tag == changer_id { + if *tag == label_text { if *import_export { - bail!("unable to load media '{}' - inside import/export slot", changer_id); + bail!("unable to load media '{}' - inside import/export slot", label_text); } slot = Some(i+1); break; @@ -87,7 +87,7 @@ pub trait MediaChange { } let slot = match slot { - None => bail!("unable to find media '{}' (offline?)", changer_id), + None => bail!("unable to find media '{}' (offline?)", label_text), Some(slot) => slot, }; @@ -97,11 +97,11 @@ pub trait MediaChange { /// Unload media from drive (eject media if necessary) fn unload_media(&mut self, target_slot: Option) -> Result<(), Error>; - /// List online media changer IDs (barcodes) + /// List online media labels (label_text/barcodes) /// - /// List acessible (online) changer IDs. This does not include + /// List acessible (online) label texts. This does not include /// media inside import-export slots or cleaning media. - fn online_media_changer_ids(&mut self) -> Result, Error> { + fn online_media_label_texts(&mut self) -> Result, Error> { let status = self.status()?; let mut list = Vec::new(); @@ -166,13 +166,13 @@ pub trait MediaChange { /// By moving the media to an empty import-export slot. Returns /// Some(slot) if the media was exported. Returns None if the media is /// not online (already exported). - fn export_media(&mut self, changer_id: &str) -> Result, Error> { + fn export_media(&mut self, label_text: &str) -> Result, Error> { let status = self.status()?; let mut unload_from_drive = false; if let Some(drive_status) = status.drives.get(self.drive_number() as usize) { if let ElementStatus::VolumeTag(ref tag) = drive_status.status { - if tag == changer_id { + if tag == label_text { unload_from_drive = true; } } @@ -189,7 +189,7 @@ pub trait MediaChange { } } else { if let ElementStatus::VolumeTag(ref tag) = element_status { - if tag == changer_id { + if tag == label_text { from = Some(i as u64 + 1); } } diff --git a/src/tape/drive/mod.rs b/src/tape/drive/mod.rs index 566b184f..d43274b0 100644 --- a/src/tape/drive/mod.rs +++ b/src/tape/drive/mod.rs @@ -269,7 +269,7 @@ pub fn request_and_load_media( if let Ok(Some(media_id)) = handle.read_label() { worker.log(format!( "found media label {} ({})", - media_id.label.changer_id, + media_id.label.label_text, media_id.label.uuid.to_string(), )); if media_id.label.uuid == *uuid { @@ -285,9 +285,9 @@ pub fn request_and_load_media( "virtual" => { let mut tape = VirtualTapeDrive::deserialize(config)?; - let changer_id = label.changer_id.clone(); + let label_text = label.label_text.clone(); - tape.load_media(&changer_id)?; + tape.load_media(&label_text)?; let mut handle: Box = Box::new(tape.open()?); @@ -298,12 +298,12 @@ pub fn request_and_load_media( "linux" => { let drive_config = LinuxTapeDrive::deserialize(config)?; - let changer_id = label.changer_id.clone(); + let label_text = label.label_text.clone(); if drive_config.changer.is_some() { let mut changer = MtxMediaChanger::with_drive_config(&drive_config)?; - changer.load_media(&changer_id)?; + changer.load_media(&label_text)?; let mut handle: Box = Box::new(drive_config.open()?); @@ -312,11 +312,11 @@ pub fn request_and_load_media( return Ok((handle, media_id)); } - worker.log(format!("Please insert media '{}' into drive '{}'", changer_id, drive)); + worker.log(format!("Please insert media '{}' into drive '{}'", label_text, drive)); let to = "root@localhost"; // fixme - send_load_media_email(drive, &changer_id, to)?; + send_load_media_email(drive, &label_text, to)?; let mut last_media_uuid = None; let mut last_error = None; @@ -340,7 +340,7 @@ pub fn request_and_load_media( if media_id.label.uuid == label.uuid { worker.log(format!( "found media label {} ({})", - media_id.label.changer_id, + media_id.label.label_text, media_id.label.uuid.to_string(), )); return Ok((Box::new(handle), media_id)); @@ -348,7 +348,7 @@ pub fn request_and_load_media( if Some(media_id.label.uuid.clone()) != last_media_uuid { worker.log(format!( "wrong media label {} ({})", - media_id.label.changer_id, + media_id.label.label_text, media_id.label.uuid.to_string(), )); last_media_uuid = Some(media_id.label.uuid); diff --git a/src/tape/drive/virtual_tape.rs b/src/tape/drive/virtual_tape.rs index 750fcd3c..f578b298 100644 --- a/src/tape/drive/virtual_tape.rs +++ b/src/tape/drive/virtual_tape.rs @@ -157,7 +157,7 @@ impl VirtualTapeHandle { Ok(()) } - fn online_media_changer_ids(&self) -> Result, Error> { + fn online_media_label_texts(&self) -> Result, Error> { let mut list = Vec::new(); for entry in std::fs::read_dir(&self.path)? { let entry = entry?; @@ -389,12 +389,12 @@ impl MediaChange for VirtualTapeHandle { // slot-assignment here. let mut slots = Vec::new(); - let changer_ids = self.online_media_changer_ids()?; - let max_slots = ((changer_ids.len() + 7)/8) * 8; + let label_texts = self.online_media_label_texts()?; + let max_slots = ((label_texts.len() + 7)/8) * 8; for i in 0..max_slots { - if let Some(changer_id) = changer_ids.get(i) { - slots.push((false, ElementStatus::VolumeTag(changer_id.clone()))); + if let Some(label_text) = label_texts.get(i) { + slots.push((false, ElementStatus::VolumeTag(label_text.clone()))); } else { slots.push((false, ElementStatus::Empty)); } @@ -407,7 +407,7 @@ impl MediaChange for VirtualTapeHandle { bail!("media tranfer is not implemented!"); } - fn export_media(&mut self, _changer_id: &str) -> Result, Error> { + fn export_media(&mut self, _label_text: &str) -> Result, Error> { bail!("media export is not implemented!"); } @@ -416,13 +416,13 @@ impl MediaChange for VirtualTapeHandle { bail!("invalid slot ID {}", slot); } - let changer_ids = self.online_media_changer_ids()?; + let label_texts = self.online_media_label_texts()?; - if slot > changer_ids.len() as u64 { + if slot > label_texts.len() as u64 { bail!("slot {} is empty", slot); } - self.load_media(&changer_ids[slot as usize - 1]) + self.load_media(&label_texts[slot as usize - 1]) } /// Try to load media @@ -479,9 +479,9 @@ impl MediaChange for VirtualTapeDrive { handle.transfer_media(from, to) } - fn export_media(&mut self, changer_id: &str) -> Result, Error> { + fn export_media(&mut self, label_text: &str) -> Result, Error> { let mut handle = self.open()?; - handle.export_media(changer_id) + handle.export_media(label_text) } fn load_media_from_slot(&mut self, slot: u64) -> Result<(), Error> { @@ -489,9 +489,9 @@ impl MediaChange for VirtualTapeDrive { handle.load_media_from_slot(slot) } - fn load_media(&mut self, changer_id: &str) -> Result<(), Error> { + fn load_media(&mut self, label_text: &str) -> Result<(), Error> { let mut handle = self.open()?; - handle.load_media(changer_id) + handle.load_media(label_text) } fn unload_media(&mut self, target_slot: Option) -> Result<(), Error> { @@ -500,9 +500,9 @@ impl MediaChange for VirtualTapeDrive { Ok(()) } - fn online_media_changer_ids(&mut self) -> Result, Error> { + fn online_media_label_texts(&mut self) -> Result, Error> { let handle = self.open()?; - handle.online_media_changer_ids() + handle.online_media_label_texts() } fn clean_drive(&mut self) -> Result<(), Error> { diff --git a/src/tape/file_formats.rs b/src/tape/file_formats.rs index aff73e8f..38a86dab 100644 --- a/src/tape/file_formats.rs +++ b/src/tape/file_formats.rs @@ -164,8 +164,8 @@ pub struct ChunkArchiveEntryHeader { pub struct MediaLabel { /// Unique ID pub uuid: Uuid, - /// Media Changer ID or Barcode - pub changer_id: String, + /// Media label text (or Barcode) + pub label_text: String, /// Creation time stamp pub ctime: i64, } diff --git a/src/tape/inventory.rs b/src/tape/inventory.rs index e86cd66a..fce27f83 100644 --- a/src/tape/inventory.rs +++ b/src/tape/inventory.rs @@ -213,10 +213,10 @@ impl Inventory { self.map.get(uuid).map(|entry| &entry.id) } - /// find media by changer_id - pub fn find_media_by_changer_id(&self, changer_id: &str) -> Option<&MediaId> { + /// find media by label_text + pub fn find_media_by_label_text(&self, label_text: &str) -> Option<&MediaId> { for (_uuid, entry) in &self.map { - if entry.id.label.changer_id == changer_id { + if entry.id.label.label_text == label_text { return Some(&entry.id); } } @@ -534,10 +534,10 @@ impl Inventory { // Helpers to simplify testing /// Genreate and insert a new free tape (test helper) - pub fn generate_free_tape(&mut self, changer_id: &str, ctime: i64) -> Uuid { + pub fn generate_free_tape(&mut self, label_text: &str, ctime: i64) -> Uuid { let label = MediaLabel { - changer_id: changer_id.to_string(), + label_text: label_text.to_string(), uuid: Uuid::generate(), ctime, }; @@ -552,13 +552,13 @@ impl Inventory { /// (test helper) pub fn generate_assigned_tape( &mut self, - changer_id: &str, + label_text: &str, pool: &str, ctime: i64, ) -> Uuid { let label = MediaLabel { - changer_id: changer_id.to_string(), + label_text: label_text.to_string(), uuid: Uuid::generate(), ctime, }; @@ -575,12 +575,12 @@ impl Inventory { /// Genreate and insert a used tape (test helper) pub fn generate_used_tape( &mut self, - changer_id: &str, + label_text: &str, set: MediaSetLabel, ctime: i64, ) -> Uuid { let label = MediaLabel { - changer_id: changer_id.to_string(), + label_text: label_text.to_string(), uuid: Uuid::generate(), ctime, }; @@ -735,7 +735,7 @@ pub fn complete_media_set_uuid( } /// List of known media labels (barcodes) -pub fn complete_media_changer_id( +pub fn complete_media_label_text( _arg: &str, _param: &HashMap, ) -> Vec { @@ -745,5 +745,5 @@ pub fn complete_media_changer_id( Err(_) => return Vec::new(), }; - inventory.map.values().map(|entry| entry.id.label.changer_id.clone()).collect() + inventory.map.values().map(|entry| entry.id.label.label_text.clone()).collect() } diff --git a/src/tape/media_pool.rs b/src/tape/media_pool.rs index 80760edb..b44f5cab 100644 --- a/src/tape/media_pool.rs +++ b/src/tape/media_pool.rs @@ -317,7 +317,7 @@ impl MediaPool { } } if self.media_is_expired(&media, current_time) { - println!("found expired media on media '{}'", media.changer_id()); + println!("found expired media on media '{}'", media.label_text()); expired_media.push(media); } } @@ -335,7 +335,7 @@ impl MediaPool { bail!("alloc writable media in pool '{}' failed: no usable media found", self.name()); } Some(media) => { - println!("reuse expired media '{}'", media.changer_id()); + println!("reuse expired media '{}'", media.label_text()); let seq_nr = self.current_media_set.media_list().len() as u64; let set = MediaSetLabel::with_data(&pool, self.current_media_set.uuid().clone(), seq_nr, current_time); @@ -494,7 +494,7 @@ impl BackupMedia { } /// Returns the media label (Barcode) - pub fn changer_id(&self) -> &str { - &self.id.label.changer_id + pub fn label_text(&self) -> &str { + &self.id.label.label_text } } diff --git a/src/tape/online_status_map.rs b/src/tape/online_status_map.rs index 79b1d2bd..e010fbcf 100644 --- a/src/tape/online_status_map.rs +++ b/src/tape/online_status_map.rs @@ -99,8 +99,8 @@ pub fn mtx_status_to_online_set(status: &MtxStatus, inventory: &Inventory) -> Ha let mut online_set = HashSet::new(); for drive_status in status.drives.iter() { - if let ElementStatus::VolumeTag(ref changer_id) = drive_status.status { - if let Some(media_id) = inventory.find_media_by_changer_id(changer_id) { + if let ElementStatus::VolumeTag(ref label_text) = drive_status.status { + if let Some(media_id) = inventory.find_media_by_label_text(label_text) { online_set.insert(media_id.label.uuid.clone()); } } @@ -108,8 +108,8 @@ pub fn mtx_status_to_online_set(status: &MtxStatus, inventory: &Inventory) -> Ha for (import_export, slot_status) in status.slots.iter() { if *import_export { continue; } - if let ElementStatus::VolumeTag(ref changer_id) = slot_status { - if let Some(media_id) = inventory.find_media_by_changer_id(changer_id) { + if let ElementStatus::VolumeTag(ref label_text) = slot_status { + if let Some(media_id) = inventory.find_media_by_label_text(label_text) { online_set.insert(media_id.label.uuid.clone()); } } @@ -146,7 +146,7 @@ pub fn update_online_status(state_path: &Path) -> Result let vtapes: Vec = config.convert_to_typed_array("virtual")?; for mut vtape in vtapes { - let media_list = match vtape.online_media_changer_ids() { + let media_list = match vtape.online_media_label_texts() { Ok(media_list) => media_list, Err(err) => { eprintln!("unable to get changer '{}' status - {}", vtape.name, err); @@ -155,8 +155,8 @@ pub fn update_online_status(state_path: &Path) -> Result }; let mut online_set = HashSet::new(); - for changer_id in media_list { - if let Some(media_id) = inventory.find_media_by_changer_id(&changer_id) { + for label_text in media_list { + if let Some(media_id) = inventory.find_media_by_label_text(&label_text) { online_set.insert(media_id.label.uuid.clone()); } } @@ -173,13 +173,13 @@ pub fn update_changer_online_status( drive_config: &SectionConfigData, inventory: &mut Inventory, changer_name: &str, - changer_id_list: &Vec, + label_text_list: &Vec, ) -> Result<(), Error> { let mut online_map = OnlineStatusMap::new(drive_config)?; let mut online_set = HashSet::new(); - for changer_id in changer_id_list.iter() { - if let Some(media_id) = inventory.find_media_by_changer_id(&changer_id) { + for label_text in label_text_list.iter() { + if let Some(media_id) = inventory.find_media_by_label_text(&label_text) { online_set.insert(media_id.label.uuid.clone()); } } diff --git a/src/tape/pool_writer.rs b/src/tape/pool_writer.rs index e3bd4f6f..b3ee9c23 100644 --- a/src/tape/pool_writer.rs +++ b/src/tape/pool_writer.rs @@ -150,11 +150,11 @@ impl PoolWriter { for media_uuid in self.pool.current_media_list()? { let media = self.pool.lookup_media(media_uuid)?; - let changer_id = media.changer_id(); - if let Some(slot) = changer.export_media(changer_id)? { - worker.log(format!("exported media '{}' to import/export slot {}", changer_id, slot)); + let label_text = media.label_text(); + if let Some(slot) = changer.export_media(label_text)? { + worker.log(format!("exported media '{}' to import/export slot {}", label_text, slot)); } else { - worker.warn(format!("export failed - media '{}' is not online", changer_id)); + worker.warn(format!("export failed - media '{}' is not online", label_text)); } }