cli: rename command "upload-log" to "snapshot upload-log"
This commit is contained in:
		@ -53,7 +53,6 @@ use proxmox_backup::backup::{
 | 
			
		||||
    ChunkStream,
 | 
			
		||||
    CryptConfig,
 | 
			
		||||
    CryptMode,
 | 
			
		||||
    DataBlob,
 | 
			
		||||
    DynamicIndexReader,
 | 
			
		||||
    FixedChunkStream,
 | 
			
		||||
    FixedIndexReader,
 | 
			
		||||
@ -1371,81 +1370,6 @@ async fn restore(param: Value) -> Result<Value, Error> {
 | 
			
		||||
    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(
 | 
			
		||||
    &ApiHandler::Async(&prune),
 | 
			
		||||
    &ObjectSchema::new(
 | 
			
		||||
@ -1883,13 +1807,6 @@ fn main() {
 | 
			
		||||
        .completion_cb("repository", complete_repository)
 | 
			
		||||
        .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)
 | 
			
		||||
        .completion_cb("repository", complete_repository);
 | 
			
		||||
 | 
			
		||||
@ -1928,7 +1845,6 @@ fn main() {
 | 
			
		||||
 | 
			
		||||
    let cmd_def = CliCommandMap::new()
 | 
			
		||||
        .insert("backup", backup_cmd_def)
 | 
			
		||||
        .insert("upload-log", upload_log_cmd_def)
 | 
			
		||||
        .insert("garbage-collect", garbage_collect_cmd_def)
 | 
			
		||||
        .insert("list", list_cmd_def)
 | 
			
		||||
        .insert("login", login_cmd_def)
 | 
			
		||||
@ -1949,6 +1865,7 @@ fn main() {
 | 
			
		||||
 | 
			
		||||
        .alias(&["files"], &["snapshot", "files"])
 | 
			
		||||
        .alias(&["forget"], &["snapshot", "forget"])
 | 
			
		||||
        .alias(&["upload-log"], &["snapshot", "upload-log"])
 | 
			
		||||
        .alias(&["snapshots"], &["snapshot", "list"])
 | 
			
		||||
        ;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,17 +1,29 @@
 | 
			
		||||
use std::sync::Arc;
 | 
			
		||||
 | 
			
		||||
use anyhow::Error;
 | 
			
		||||
use serde_json::{json, Value};
 | 
			
		||||
 | 
			
		||||
use proxmox::api::{api, cli::*};
 | 
			
		||||
use proxmox::{
 | 
			
		||||
    api::{api, cli::*},
 | 
			
		||||
    tools::fs::file_get_contents,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
use proxmox_backup::{
 | 
			
		||||
    tools,
 | 
			
		||||
    api2::types::*,
 | 
			
		||||
    backup::{
 | 
			
		||||
        CryptMode,
 | 
			
		||||
        CryptConfig,
 | 
			
		||||
        DataBlob,
 | 
			
		||||
        BackupGroup,
 | 
			
		||||
        decrypt_key,
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
use crate::{
 | 
			
		||||
    REPO_URL_SCHEMA,
 | 
			
		||||
    KEYFILE_SCHEMA,
 | 
			
		||||
    KEYFD_SCHEMA,
 | 
			
		||||
    BackupDir,
 | 
			
		||||
    api_datastore_list_snapshots,
 | 
			
		||||
    complete_backup_snapshot,
 | 
			
		||||
@ -20,6 +32,7 @@ use crate::{
 | 
			
		||||
    connect,
 | 
			
		||||
    extract_repository_from_value,
 | 
			
		||||
    record_repository,
 | 
			
		||||
    keyfile_parameters,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#[api(
 | 
			
		||||
@ -179,6 +192,81 @@ async fn forget_snapshots(param: Value) -> Result<Value, Error> {
 | 
			
		||||
    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(
 | 
			
		||||
    input: {
 | 
			
		||||
        properties: {
 | 
			
		||||
@ -316,4 +404,13 @@ pub fn snapshot_mgtm_cli() -> CliCommandMap {
 | 
			
		||||
                .completion_cb("repository", complete_repository)
 | 
			
		||||
                .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