},
};
+use pbs_client::view_task_result;
+use pbs_tools::format::{
+ HumanByte,
+ render_epoch,
+ render_bytes_human_readable,
+};
+
+use pbs_config::drive::complete_drive_name;
+use pbs_config::media_pool::complete_pool_name;
+use pbs_config::datastore::complete_datastore_name;
+
+use pbs_api_types::{
+ Userid, Authid, DATASTORE_SCHEMA, DATASTORE_MAP_LIST_SCHEMA,
+ DRIVE_NAME_SCHEMA, MEDIA_LABEL_SCHEMA, MEDIA_POOL_NAME_SCHEMA,
+ TAPE_RESTORE_SNAPSHOT_SCHEMA,
+};
+use pbs_tape::{
+ PROXMOX_BACKUP_CONTENT_HEADER_MAGIC_1_0, BlockReadError, MediaContentHeader,
+};
+
use proxmox_backup::{
- tools::format::{
- HumanByte,
- render_epoch,
- render_bytes_human_readable,
- },
- client::{
- connect_to_localhost,
- view_task_result,
- },
- api2::{
- self,
- types::{
- Authid,
- DATASTORE_SCHEMA,
- DATASTORE_MAP_LIST_SCHEMA,
- DRIVE_NAME_SCHEMA,
- MEDIA_LABEL_SCHEMA,
- MEDIA_POOL_NAME_SCHEMA,
- Userid,
- },
- },
- config::{
- self,
- datastore::complete_datastore_name,
- drive::complete_drive_name,
- media_pool::complete_pool_name,
- },
+ api2,
tape::{
- BlockReadError,
drive::{
open_drive,
lock_tape_device,
},
complete_media_label_text,
complete_media_set_uuid,
+ complete_media_set_snapshots,
file_formats::{
- PROXMOX_BACKUP_CONTENT_HEADER_MAGIC_1_0,
- MediaContentHeader,
proxmox_tape_magic_to_text,
},
},
+ client_helpers::connect_to_localhost,
};
mod proxmox_tape;
/// Format media
async fn format_media(mut param: Value) -> Result<(), Error> {
- let output_format = get_output_format(¶m);
+ let output_format = extract_output_format(&mut param);
- let (config, _digest) = config::drive::config()?;
+ let (config, _digest) = pbs_config::drive::config()?;
let drive = extract_drive_name(&mut param, &config)?;
/// Rewind tape
async fn rewind(mut param: Value) -> Result<(), Error> {
- let output_format = get_output_format(¶m);
+ let output_format = extract_output_format(&mut param);
- let (config, _digest) = config::drive::config()?;
+ let (config, _digest) = pbs_config::drive::config()?;
let drive = extract_drive_name(&mut param, &config)?;
/// Eject/Unload drive media
async fn eject_media(mut param: Value) -> Result<(), Error> {
- let output_format = get_output_format(¶m);
+ let output_format = extract_output_format(&mut param);
- let (config, _digest) = config::drive::config()?;
+ let (config, _digest) = pbs_config::drive::config()?;
let drive = extract_drive_name(&mut param, &config)?;
/// Load media with specified label
async fn load_media(mut param: Value) -> Result<(), Error> {
- let output_format = get_output_format(¶m);
+ let output_format = extract_output_format(&mut param);
- let (config, _digest) = config::drive::config()?;
+ let (config, _digest) = pbs_config::drive::config()?;
let drive = extract_drive_name(&mut param, &config)?;
/// Export media with specified label
async fn export_media(mut param: Value) -> Result<(), Error> {
- let (config, _digest) = config::drive::config()?;
+ let (config, _digest) = pbs_config::drive::config()?;
let drive = extract_drive_name(&mut param, &config)?;
/// Load media from the specified slot
async fn load_media_from_slot(mut param: Value) -> Result<(), Error> {
- let (config, _digest) = config::drive::config()?;
+ let (config, _digest) = pbs_config::drive::config()?;
let drive = extract_drive_name(&mut param, &config)?;
/// Unload media via changer
async fn unload_media(mut param: Value) -> Result<(), Error> {
- let output_format = get_output_format(¶m);
+ let output_format = extract_output_format(&mut param);
- let (config, _digest) = config::drive::config()?;
+ let (config, _digest) = pbs_config::drive::config()?;
let drive = extract_drive_name(&mut param, &config)?;
/// Label media
async fn label_media(mut param: Value) -> Result<(), Error> {
- let output_format = get_output_format(¶m);
+ let output_format = extract_output_format(&mut param);
- let (config, _digest) = config::drive::config()?;
+ let (config, _digest) = pbs_config::drive::config()?;
let drive = extract_drive_name(&mut param, &config)?;
/// Read media label
async fn read_label(mut param: Value) -> Result<(), Error> {
- let output_format = get_output_format(¶m);
+ let output_format = extract_output_format(&mut param);
- let (config, _digest) = config::drive::config()?;
+ let (config, _digest) = pbs_config::drive::config()?;
let drive = extract_drive_name(&mut param, &config)?;
mut param: Value,
) -> Result<(), Error> {
- let output_format = get_output_format(¶m);
+ let output_format = extract_output_format(&mut param);
- let (config, _digest) = config::drive::config()?;
+ let (config, _digest) = pbs_config::drive::config()?;
let drive = extract_drive_name(&mut param, &config)?;
let do_read = read_labels.unwrap_or(false) || read_all_labels.unwrap_or(false);
/// Label media with barcodes from changer device
async fn barcode_label_media(mut param: Value) -> Result<(), Error> {
- let output_format = get_output_format(¶m);
+ let output_format = extract_output_format(&mut param);
- let (config, _digest) = config::drive::config()?;
+ let (config, _digest) = pbs_config::drive::config()?;
let drive = extract_drive_name(&mut param, &config)?;
/// Move to end of media (MTEOM, used to debug)
fn move_to_eom(mut param: Value) -> Result<(), Error> {
- let (config, _digest) = config::drive::config()?;
+ let (config, _digest) = pbs_config::drive::config()?;
let drive = extract_drive_name(&mut param, &config)?;
/// method is expected to fails when we reach EOT.
fn debug_scan(mut param: Value) -> Result<(), Error> {
- let (config, _digest) = config::drive::config()?;
+ let (config, _digest) = pbs_config::drive::config()?;
let drive = extract_drive_name(&mut param, &config)?;
/// Read Cartridge Memory (Medium auxiliary memory attributes)
async fn cartridge_memory(mut param: Value) -> Result<(), Error> {
- let output_format = get_output_format(¶m);
+ let output_format = extract_output_format(&mut param);
- let (config, _digest) = config::drive::config()?;
+ let (config, _digest) = pbs_config::drive::config()?;
let drive = extract_drive_name(&mut param, &config)?;
/// Read Volume Statistics (SCSI log page 17h)
async fn volume_statistics(mut param: Value) -> Result<(), Error> {
- let output_format = get_output_format(¶m);
+ let output_format = extract_output_format(&mut param);
- let (config, _digest) = config::drive::config()?;
+ let (config, _digest) = pbs_config::drive::config()?;
let drive = extract_drive_name(&mut param, &config)?;
/// Get drive/media status
async fn status(mut param: Value) -> Result<(), Error> {
- let output_format = get_output_format(¶m);
+ let output_format = extract_output_format(&mut param);
- let (config, _digest) = config::drive::config()?;
+ let (config, _digest) = pbs_config::drive::config()?;
let drive = extract_drive_name(&mut param, &config)?;
/// Clean drive
async fn clean_drive(mut param: Value) -> Result<(), Error> {
- let output_format = get_output_format(¶m);
+ let output_format = extract_output_format(&mut param);
- let (config, _digest) = config::drive::config()?;
+ let (config, _digest) = pbs_config::drive::config()?;
let drive = extract_drive_name(&mut param, &config)?;
type: bool,
optional: true,
},
+ "force-media-set": {
+ description: "Ignore the allocation policy and start a new media-set.",
+ optional: true,
+ type: bool,
+ default: false,
+ },
"output-format": {
schema: OUTPUT_FORMAT,
optional: true,
/// Backup datastore to tape media pool
async fn backup(mut param: Value) -> Result<(), Error> {
- let output_format = get_output_format(¶m);
+ let output_format = extract_output_format(&mut param);
- let (config, _digest) = config::drive::config()?;
+ let (config, _digest) = pbs_config::drive::config()?;
param["drive"] = extract_drive_name(&mut param, &config)?.into();
type: Userid,
optional: true,
},
+ "snapshots": {
+ description: "List of snapshots.",
+ type: Array,
+ optional: true,
+ items: {
+ schema: TAPE_RESTORE_SNAPSHOT_SCHEMA,
+ },
+ },
owner: {
type: Authid,
optional: true,
/// Restore data from media-set
async fn restore(mut param: Value) -> Result<(), Error> {
- let output_format = get_output_format(¶m);
+ let output_format = extract_output_format(&mut param);
- let (config, _digest) = config::drive::config()?;
+ let (config, _digest) = pbs_config::drive::config()?;
param["drive"] = extract_drive_name(&mut param, &config)?.into();
/// Scan media and record content
async fn catalog_media(mut param: Value) -> Result<(), Error> {
- let output_format = get_output_format(¶m);
+ let output_format = extract_output_format(&mut param);
- let (config, _digest) = config::drive::config()?;
+ let (config, _digest) = pbs_config::drive::config()?;
let drive = extract_drive_name(&mut param, &config)?;
.insert(
"restore",
CliCommand::new(&API_METHOD_RESTORE)
- .arg_param(&["media-set", "store"])
+ .arg_param(&["media-set", "store", "snapshots"])
.completion_cb("store", complete_datastore_name)
.completion_cb("media-set", complete_media_set_uuid)
+ .completion_cb("snapshots", complete_media_set_snapshots)
)
.insert(
"barcode-label",
let mut rpcenv = CliEnvironment::new();
rpcenv.set_auth_id(Some(String::from("root@pam")));
- proxmox_backup::tools::runtime::main(run_async_cli_command(cmd_def, rpcenv));
+ pbs_runtime::main(run_async_cli_command(cmd_def, rpcenv));
}