cli: rename command "upload-log" to "snapshot upload-log"
This commit is contained in:
		| @ -53,7 +53,6 @@ use proxmox_backup::backup::{ | |||||||
|     ChunkStream, |     ChunkStream, | ||||||
|     CryptConfig, |     CryptConfig, | ||||||
|     CryptMode, |     CryptMode, | ||||||
|     DataBlob, |  | ||||||
|     DynamicIndexReader, |     DynamicIndexReader, | ||||||
|     FixedChunkStream, |     FixedChunkStream, | ||||||
|     FixedIndexReader, |     FixedIndexReader, | ||||||
| @ -1371,81 +1370,6 @@ async fn restore(param: Value) -> Result<Value, Error> { | |||||||
|     Ok(Value::Null) |     Ok(Value::Null) | ||||||
| } | } | ||||||
|  |  | ||||||
| #[api( |  | ||||||
|    input: { |  | ||||||
|        properties: { |  | ||||||
|            repository: { |  | ||||||
|                schema: REPO_URL_SCHEMA, |  | ||||||
|                optional: true, |  | ||||||
|            }, |  | ||||||
|            snapshot: { |  | ||||||
|                type: String, |  | ||||||
|                description: "Group/Snapshot path.", |  | ||||||
|            }, |  | ||||||
|            logfile: { |  | ||||||
|                type: String, |  | ||||||
|                description: "The path to the log file you want to upload.", |  | ||||||
|            }, |  | ||||||
|            keyfile: { |  | ||||||
|                schema: KEYFILE_SCHEMA, |  | ||||||
|                optional: true, |  | ||||||
|            }, |  | ||||||
|            "keyfd": { |  | ||||||
|                schema: KEYFD_SCHEMA, |  | ||||||
|                optional: true, |  | ||||||
|            }, |  | ||||||
|            "crypt-mode": { |  | ||||||
|                type: CryptMode, |  | ||||||
|                optional: true, |  | ||||||
|            }, |  | ||||||
|        } |  | ||||||
|    } |  | ||||||
| )] |  | ||||||
| /// Upload backup log file. |  | ||||||
| async fn upload_log(param: Value) -> Result<Value, Error> { |  | ||||||
|  |  | ||||||
|     let logfile = tools::required_string_param(¶m, "logfile")?; |  | ||||||
|     let repo = extract_repository_from_value(¶m)?; |  | ||||||
|  |  | ||||||
|     let snapshot = tools::required_string_param(¶m, "snapshot")?; |  | ||||||
|     let snapshot: BackupDir = snapshot.parse()?; |  | ||||||
|  |  | ||||||
|     let mut client = connect(&repo)?; |  | ||||||
|  |  | ||||||
|     let (keydata, crypt_mode) = keyfile_parameters(¶m)?; |  | ||||||
|  |  | ||||||
|     let crypt_config = match keydata { |  | ||||||
|         None => None, |  | ||||||
|         Some(key) => { |  | ||||||
|             let (key, _created, _) = decrypt_key(&key, &key::get_encryption_key_password)?; |  | ||||||
|             let crypt_config = CryptConfig::new(key)?; |  | ||||||
|             Some(Arc::new(crypt_config)) |  | ||||||
|         } |  | ||||||
|     }; |  | ||||||
|  |  | ||||||
|     let data = file_get_contents(logfile)?; |  | ||||||
|  |  | ||||||
|     // fixme: howto sign log? |  | ||||||
|     let blob = match crypt_mode { |  | ||||||
|         CryptMode::None | CryptMode::SignOnly => DataBlob::encode(&data, None, true)?, |  | ||||||
|         CryptMode::Encrypt => DataBlob::encode(&data, crypt_config.as_ref().map(Arc::as_ref), true)?, |  | ||||||
|     }; |  | ||||||
|  |  | ||||||
|     let raw_data = blob.into_inner(); |  | ||||||
|  |  | ||||||
|     let path = format!("api2/json/admin/datastore/{}/upload-backup-log", repo.store()); |  | ||||||
|  |  | ||||||
|     let args = json!({ |  | ||||||
|         "backup-type": snapshot.group().backup_type(), |  | ||||||
|         "backup-id":  snapshot.group().backup_id(), |  | ||||||
|         "backup-time": snapshot.backup_time(), |  | ||||||
|     }); |  | ||||||
|  |  | ||||||
|     let body = hyper::Body::from(raw_data); |  | ||||||
|  |  | ||||||
|     client.upload("application/octet-stream", body, &path, Some(args)).await |  | ||||||
| } |  | ||||||
|  |  | ||||||
| const API_METHOD_PRUNE: ApiMethod = ApiMethod::new( | const API_METHOD_PRUNE: ApiMethod = ApiMethod::new( | ||||||
|     &ApiHandler::Async(&prune), |     &ApiHandler::Async(&prune), | ||||||
|     &ObjectSchema::new( |     &ObjectSchema::new( | ||||||
| @ -1883,13 +1807,6 @@ fn main() { | |||||||
|         .completion_cb("repository", complete_repository) |         .completion_cb("repository", complete_repository) | ||||||
|         .completion_cb("keyfile", tools::complete_file_name); |         .completion_cb("keyfile", tools::complete_file_name); | ||||||
|  |  | ||||||
|     let upload_log_cmd_def = CliCommand::new(&API_METHOD_UPLOAD_LOG) |  | ||||||
|         .arg_param(&["snapshot", "logfile"]) |  | ||||||
|         .completion_cb("snapshot", complete_backup_snapshot) |  | ||||||
|         .completion_cb("logfile", tools::complete_file_name) |  | ||||||
|         .completion_cb("keyfile", tools::complete_file_name) |  | ||||||
|         .completion_cb("repository", complete_repository); |  | ||||||
|  |  | ||||||
|     let list_cmd_def = CliCommand::new(&API_METHOD_LIST_BACKUP_GROUPS) |     let list_cmd_def = CliCommand::new(&API_METHOD_LIST_BACKUP_GROUPS) | ||||||
|         .completion_cb("repository", complete_repository); |         .completion_cb("repository", complete_repository); | ||||||
|  |  | ||||||
| @ -1928,7 +1845,6 @@ fn main() { | |||||||
|  |  | ||||||
|     let cmd_def = CliCommandMap::new() |     let cmd_def = CliCommandMap::new() | ||||||
|         .insert("backup", backup_cmd_def) |         .insert("backup", backup_cmd_def) | ||||||
|         .insert("upload-log", upload_log_cmd_def) |  | ||||||
|         .insert("garbage-collect", garbage_collect_cmd_def) |         .insert("garbage-collect", garbage_collect_cmd_def) | ||||||
|         .insert("list", list_cmd_def) |         .insert("list", list_cmd_def) | ||||||
|         .insert("login", login_cmd_def) |         .insert("login", login_cmd_def) | ||||||
| @ -1949,6 +1865,7 @@ fn main() { | |||||||
|  |  | ||||||
|         .alias(&["files"], &["snapshot", "files"]) |         .alias(&["files"], &["snapshot", "files"]) | ||||||
|         .alias(&["forget"], &["snapshot", "forget"]) |         .alias(&["forget"], &["snapshot", "forget"]) | ||||||
|  |         .alias(&["upload-log"], &["snapshot", "upload-log"]) | ||||||
|         .alias(&["snapshots"], &["snapshot", "list"]) |         .alias(&["snapshots"], &["snapshot", "list"]) | ||||||
|         ; |         ; | ||||||
|  |  | ||||||
|  | |||||||
| @ -1,17 +1,29 @@ | |||||||
|  | use std::sync::Arc; | ||||||
|  |  | ||||||
| use anyhow::Error; | use anyhow::Error; | ||||||
| use serde_json::{json, Value}; | use serde_json::{json, Value}; | ||||||
|  |  | ||||||
| use proxmox::api::{api, cli::*}; | use proxmox::{ | ||||||
|  |     api::{api, cli::*}, | ||||||
|  |     tools::fs::file_get_contents, | ||||||
|  | }; | ||||||
|  |  | ||||||
| use proxmox_backup::{ | use proxmox_backup::{ | ||||||
|     tools, |     tools, | ||||||
|     api2::types::*, |     api2::types::*, | ||||||
|     backup::{ |     backup::{ | ||||||
|  |         CryptMode, | ||||||
|  |         CryptConfig, | ||||||
|  |         DataBlob, | ||||||
|         BackupGroup, |         BackupGroup, | ||||||
|  |         decrypt_key, | ||||||
|     } |     } | ||||||
| }; | }; | ||||||
|  |  | ||||||
| use crate::{ | use crate::{ | ||||||
|     REPO_URL_SCHEMA, |     REPO_URL_SCHEMA, | ||||||
|  |     KEYFILE_SCHEMA, | ||||||
|  |     KEYFD_SCHEMA, | ||||||
|     BackupDir, |     BackupDir, | ||||||
|     api_datastore_list_snapshots, |     api_datastore_list_snapshots, | ||||||
|     complete_backup_snapshot, |     complete_backup_snapshot, | ||||||
| @ -20,6 +32,7 @@ use crate::{ | |||||||
|     connect, |     connect, | ||||||
|     extract_repository_from_value, |     extract_repository_from_value, | ||||||
|     record_repository, |     record_repository, | ||||||
|  |     keyfile_parameters, | ||||||
| }; | }; | ||||||
|  |  | ||||||
| #[api( | #[api( | ||||||
| @ -179,6 +192,81 @@ async fn forget_snapshots(param: Value) -> Result<Value, Error> { | |||||||
|     Ok(result) |     Ok(result) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | #[api( | ||||||
|  |    input: { | ||||||
|  |        properties: { | ||||||
|  |            repository: { | ||||||
|  |                schema: REPO_URL_SCHEMA, | ||||||
|  |                optional: true, | ||||||
|  |            }, | ||||||
|  |            snapshot: { | ||||||
|  |                type: String, | ||||||
|  |                description: "Group/Snapshot path.", | ||||||
|  |            }, | ||||||
|  |            logfile: { | ||||||
|  |                type: String, | ||||||
|  |                description: "The path to the log file you want to upload.", | ||||||
|  |            }, | ||||||
|  |            keyfile: { | ||||||
|  |                schema: KEYFILE_SCHEMA, | ||||||
|  |                optional: true, | ||||||
|  |            }, | ||||||
|  |            "keyfd": { | ||||||
|  |                schema: KEYFD_SCHEMA, | ||||||
|  |                optional: true, | ||||||
|  |            }, | ||||||
|  |            "crypt-mode": { | ||||||
|  |                type: CryptMode, | ||||||
|  |                optional: true, | ||||||
|  |            }, | ||||||
|  |        } | ||||||
|  |    } | ||||||
|  | )] | ||||||
|  | /// Upload backup log file. | ||||||
|  | async fn upload_log(param: Value) -> Result<Value, Error> { | ||||||
|  |  | ||||||
|  |     let logfile = tools::required_string_param(¶m, "logfile")?; | ||||||
|  |     let repo = extract_repository_from_value(¶m)?; | ||||||
|  |  | ||||||
|  |     let snapshot = tools::required_string_param(¶m, "snapshot")?; | ||||||
|  |     let snapshot: BackupDir = snapshot.parse()?; | ||||||
|  |  | ||||||
|  |     let mut client = connect(&repo)?; | ||||||
|  |  | ||||||
|  |     let (keydata, crypt_mode) = keyfile_parameters(¶m)?; | ||||||
|  |  | ||||||
|  |     let crypt_config = match keydata { | ||||||
|  |         None => None, | ||||||
|  |         Some(key) => { | ||||||
|  |             let (key, _created, _) = decrypt_key(&key, &crate::key::get_encryption_key_password)?; | ||||||
|  |             let crypt_config = CryptConfig::new(key)?; | ||||||
|  |             Some(Arc::new(crypt_config)) | ||||||
|  |         } | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     let data = file_get_contents(logfile)?; | ||||||
|  |  | ||||||
|  |     // fixme: howto sign log? | ||||||
|  |     let blob = match crypt_mode { | ||||||
|  |         CryptMode::None | CryptMode::SignOnly => DataBlob::encode(&data, None, true)?, | ||||||
|  |         CryptMode::Encrypt => DataBlob::encode(&data, crypt_config.as_ref().map(Arc::as_ref), true)?, | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     let raw_data = blob.into_inner(); | ||||||
|  |  | ||||||
|  |     let path = format!("api2/json/admin/datastore/{}/upload-backup-log", repo.store()); | ||||||
|  |  | ||||||
|  |     let args = json!({ | ||||||
|  |         "backup-type": snapshot.group().backup_type(), | ||||||
|  |         "backup-id":  snapshot.group().backup_id(), | ||||||
|  |         "backup-time": snapshot.backup_time(), | ||||||
|  |     }); | ||||||
|  |  | ||||||
|  |     let body = hyper::Body::from(raw_data); | ||||||
|  |  | ||||||
|  |     client.upload("application/octet-stream", body, &path, Some(args)).await | ||||||
|  | } | ||||||
|  |  | ||||||
| #[api( | #[api( | ||||||
|     input: { |     input: { | ||||||
|         properties: { |         properties: { | ||||||
| @ -316,4 +404,13 @@ pub fn snapshot_mgtm_cli() -> CliCommandMap { | |||||||
|                 .completion_cb("repository", complete_repository) |                 .completion_cb("repository", complete_repository) | ||||||
|                 .completion_cb("snapshot", complete_backup_snapshot) |                 .completion_cb("snapshot", complete_backup_snapshot) | ||||||
|         ) |         ) | ||||||
|  |         .insert( | ||||||
|  |             "upload-log", | ||||||
|  |             CliCommand::new(&API_METHOD_UPLOAD_LOG) | ||||||
|  |                 .arg_param(&["snapshot", "logfile"]) | ||||||
|  |                 .completion_cb("snapshot", complete_backup_snapshot) | ||||||
|  |                 .completion_cb("logfile", tools::complete_file_name) | ||||||
|  |                 .completion_cb("keyfile", tools::complete_file_name) | ||||||
|  |                 .completion_cb("repository", complete_repository) | ||||||
|  |         ) | ||||||
| } | } | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user