From: Filip Schauer <f.schauer@proxmox.com>
To: pbs-devel@lists.proxmox.com
Subject: [pbs-devel] [PATCH vma-to-pbs 2/2] add support for notes and logs
Date: Mon, 27 May 2024 15:07:15 +0200 [thread overview]
Message-ID: <20240527130715.189131-3-f.schauer@proxmox.com> (raw)
In-Reply-To: <20240527130715.189131-1-f.schauer@proxmox.com>
Allow the user to specify a notes file and a log file to associate with
the backup.
Signed-off-by: Filip Schauer <f.schauer@proxmox.com>
---
src/main.rs | 16 +++++++++++++
src/vma2pbs.rs | 64 ++++++++++++++++++++++++++++++++++++++++++--------
2 files changed, 70 insertions(+), 10 deletions(-)
diff --git a/src/main.rs b/src/main.rs
index 2653d3e..de789c1 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -37,6 +37,10 @@ Options:
Password file
--key-password-file <KEY_PASSWORD_FILE>
Key password file
+ [--notes-file <NOTES_FILE>]
+ File containing a comment/notes
+ [--log-file <LOG_FILE>]
+ Log file
-h, --help
Print help
-V, --version
@@ -93,6 +97,8 @@ fn parse_args() -> Result<BackupVmaToPbsArgs, Error> {
let encrypt = args.contains(["-e", "--encrypt"]);
let password_file: Option<OsString> = args.opt_value_from_str("--password-file")?;
let key_password_file: Option<OsString> = args.opt_value_from_str("--key-password-file")?;
+ let notes_file: Option<OsString> = args.opt_value_from_str("--notes-file")?;
+ let log_file_path: Option<OsString> = args.opt_value_from_str("--log-file")?;
match (encrypt, keyfile.is_some()) {
(true, false) => bail!("--encrypt requires a --keyfile!"),
@@ -170,6 +176,14 @@ fn parse_args() -> Result<BackupVmaToPbsArgs, Error> {
None
};
+ let notes = if let Some(notes_file) = notes_file {
+ let notes = std::fs::read_to_string(notes_file).context("Could not read notes file")?;
+
+ Some(notes)
+ } else {
+ None
+ };
+
let options = BackupVmaToPbsArgs {
vma_file_path: vma_file_path.cloned(),
pbs_repository,
@@ -183,6 +197,8 @@ fn parse_args() -> Result<BackupVmaToPbsArgs, Error> {
fingerprint,
compress,
encrypt,
+ notes,
+ log_file_path,
};
Ok(options)
diff --git a/src/vma2pbs.rs b/src/vma2pbs.rs
index 199cf50..5c357ef 100644
--- a/src/vma2pbs.rs
+++ b/src/vma2pbs.rs
@@ -34,6 +34,8 @@ pub struct BackupVmaToPbsArgs {
pub fingerprint: String,
pub compress: bool,
pub encrypt: bool,
+ pub notes: Option<String>,
+ pub log_file_path: Option<OsString>,
}
#[derive(Copy, Clone)]
@@ -52,7 +54,7 @@ fn handle_pbs_error(pbs_err: *mut c_char, function_name: &str) -> Result<(), Err
bail!("{function_name} failed: {pbs_err_str}");
}
-fn create_pbs_backup_task(args: BackupVmaToPbsArgs) -> Result<*mut ProxmoxBackupHandle, Error> {
+fn create_pbs_backup_task(args: &BackupVmaToPbsArgs) -> Result<*mut ProxmoxBackupHandle, Error> {
println!("PBS repository: {}", args.pbs_repository);
if let Some(ns) = &args.namespace {
println!("PBS namespace: {}", ns);
@@ -65,26 +67,43 @@ fn create_pbs_backup_task(args: BackupVmaToPbsArgs) -> Result<*mut ProxmoxBackup
let mut pbs_err: *mut c_char = ptr::null_mut();
- let pbs_repository_cstr = CString::new(args.pbs_repository)?;
- let ns_cstr = CString::new(args.namespace.unwrap_or("".to_string()))?;
- let backup_id_cstr = CString::new(args.backup_id)?;
- let pbs_password_cstr = CString::new(args.pbs_password)?;
- let fingerprint_cstr = CString::new(args.fingerprint)?;
- let keyfile_cstr = args.keyfile.map(|v| CString::new(v).unwrap());
+ let pbs_repository_cstr = CString::new(args.pbs_repository.as_str())?;
+ let ns_cstr = CString::new(args.namespace.as_deref().unwrap_or(""))?;
+ let backup_id_cstr = CString::new(args.backup_id.as_str())?;
+ let pbs_password_cstr = CString::new(args.pbs_password.as_str())?;
+ let fingerprint_cstr = CString::new(args.fingerprint.as_str())?;
+ let keyfile_cstr = args
+ .keyfile
+ .as_ref()
+ .map(|v| CString::new(v.as_str()).unwrap());
let keyfile_ptr = keyfile_cstr
.as_ref()
.map(|v| v.as_ptr())
.unwrap_or(ptr::null());
- let key_password_cstr = args.key_password.map(|v| CString::new(v).unwrap());
+ let key_password_cstr = args
+ .key_password
+ .as_ref()
+ .map(|v| CString::new(v.as_str()).unwrap());
let key_password_ptr = key_password_cstr
.as_ref()
.map(|v| v.as_ptr())
.unwrap_or(ptr::null());
- let master_keyfile_cstr = args.master_keyfile.map(|v| CString::new(v).unwrap());
+ let master_keyfile_cstr = args
+ .master_keyfile
+ .as_ref()
+ .map(|v| CString::new(v.as_str()).unwrap());
let master_keyfile_ptr = master_keyfile_cstr
.as_ref()
.map(|v| v.as_ptr())
.unwrap_or(ptr::null());
+ let notes_cstr = args
+ .notes
+ .as_ref()
+ .map(|v| CString::new(v.as_str()).unwrap());
+ let notes_ptr = notes_cstr
+ .as_ref()
+ .map(|v| v.as_ptr())
+ .unwrap_or(ptr::null());
let pbs = proxmox_backup_new_ns(
pbs_repository_cstr.as_ptr(),
@@ -99,6 +118,7 @@ fn create_pbs_backup_task(args: BackupVmaToPbsArgs) -> Result<*mut ProxmoxBackup
args.compress,
args.encrypt,
fingerprint_cstr.as_ptr(),
+ notes_ptr,
&mut pbs_err,
);
@@ -343,6 +363,26 @@ where
Ok(())
}
+fn upload_log(pbs: *mut ProxmoxBackupHandle, log_file_path: OsString) -> Result<(), Error> {
+ let name_cstr = CString::new("client.log")?;
+ let data = std::fs::read(log_file_path)?;
+ let size = data.len();
+ let mut pbs_err: *mut c_char = ptr::null_mut();
+
+ if proxmox_backup_add_config(
+ pbs,
+ name_cstr.as_ptr(),
+ data.as_ptr(),
+ size as u64,
+ &mut pbs_err,
+ ) < 0
+ {
+ handle_pbs_error(pbs_err, "proxmox_backup_add_config")?;
+ }
+
+ Ok(())
+}
+
pub fn backup_vma_to_pbs(args: BackupVmaToPbsArgs) -> Result<(), Error> {
let vma_file: Box<dyn BufRead> = match &args.vma_file_path {
Some(vma_file_path) => match File::open(vma_file_path) {
@@ -353,7 +393,7 @@ pub fn backup_vma_to_pbs(args: BackupVmaToPbsArgs) -> Result<(), Error> {
};
let vma_reader = VmaReader::new(vma_file)?;
- let pbs = create_pbs_backup_task(args)?;
+ let pbs = create_pbs_backup_task(&args)?;
defer! {
proxmox_backup_disconnect(pbs);
@@ -373,6 +413,10 @@ pub fn backup_vma_to_pbs(args: BackupVmaToPbsArgs) -> Result<(), Error> {
upload_configs(&vma_reader, pbs)?;
upload_block_devices(vma_reader, pbs)?;
+ if let Some(log_file_path) = args.log_file_path {
+ upload_log(pbs, log_file_path)?;
+ }
+
if proxmox_backup_finish(pbs, &mut pbs_err) < 0 {
handle_pbs_error(pbs_err, "proxmox_backup_finish")?;
}
--
2.39.2
_______________________________________________
pbs-devel mailing list
pbs-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel
next prev parent reply other threads:[~2024-05-27 13:07 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-05-27 13:07 [pbs-devel] [PATCH backup-qemu/vma-to-pbs 0/2] " Filip Schauer
2024-05-27 13:07 ` [pbs-devel] [PATCH backup-qemu 1/2] add support for notes Filip Schauer
2024-05-27 13:07 ` Filip Schauer [this message]
2024-07-03 13:06 ` [pbs-devel] [PATCH backup-qemu/vma-to-pbs 0/2] add support for notes and logs Fabian Grünbichler
2024-07-03 13:28 ` Filip Schauer
2024-07-03 14:24 ` Fabian Grünbichler
2024-07-10 9:20 ` Filip Schauer
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240527130715.189131-3-f.schauer@proxmox.com \
--to=f.schauer@proxmox.com \
--cc=pbs-devel@lists.proxmox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.