cli: rename command "upload-log" to "snapshot upload-log"
This commit is contained in:
parent
edebd52374
commit
0c9209b04c
|
@ -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)
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue