From: Dominik Csapak <d.csapak@proxmox.com>
To: pbs-devel@lists.proxmox.com
Subject: [pbs-devel] [PATCH proxmox-backup 3/3] api2/tape/backup: include a summary on notification e-mails
Date: Tue, 16 Mar 2021 12:56:23 +0100 [thread overview]
Message-ID: <20210316115623.9368-3-d.csapak@proxmox.com> (raw)
In-Reply-To: <20210316115623.9368-1-d.csapak@proxmox.com>
for now only contains the list of included snapshots (if any),
as well as the backup duration
Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
---
src/api2/tape/backup.rs | 32 +++++++++++++++++++++++++------
src/api2/types/tape/mod.rs | 9 +++++++++
src/server/email_notifications.rs | 13 +++++++++++++
3 files changed, 48 insertions(+), 6 deletions(-)
diff --git a/src/api2/tape/backup.rs b/src/api2/tape/backup.rs
index 9f1167fe..5f7a16b4 100644
--- a/src/api2/tape/backup.rs
+++ b/src/api2/tape/backup.rs
@@ -51,6 +51,7 @@ use crate::{
JOB_ID_SCHEMA,
MediaPoolConfig,
Userid,
+ TapeBackupJobSummary,
},
server::WorkerTask,
task::TaskState,
@@ -198,13 +199,16 @@ pub fn do_tape_backup_job(
let notify_user = setup.notify_user.as_ref().unwrap_or_else(|| &Userid::root_userid());
let email = lookup_user_email(notify_user);
- let job_result = backup_worker(
+ let (job_result, summary) = match backup_worker(
&worker,
datastore,
&pool_config,
&setup,
email.clone(),
- );
+ ) {
+ Ok(summary) => (Ok(()), summary),
+ Err(err) => (Err(err), Default::default()),
+ };
let status = worker.create_state(&job_result);
@@ -214,6 +218,7 @@ pub fn do_tape_backup_job(
Some(job.jobname()),
&setup,
&job_result,
+ summary,
) {
eprintln!("send tape backup notification failed: {}", err);
}
@@ -340,13 +345,17 @@ pub fn backup(
move |worker| {
let _drive_lock = drive_lock; // keep lock guard
set_tape_device_state(&setup.drive, &worker.upid().to_string())?;
- let job_result = backup_worker(
+
+ let (job_result, summary) = match backup_worker(
&worker,
datastore,
&pool_config,
&setup,
email.clone(),
- );
+ ) {
+ Ok(summary) => (Ok(()), summary),
+ Err(err) => (Err(err), Default::default()),
+ };
if let Some(email) = email {
if let Err(err) = crate::server::send_tape_backup_status(
@@ -354,6 +363,7 @@ pub fn backup(
None,
&setup,
&job_result,
+ summary,
) {
eprintln!("send tape backup notification failed: {}", err);
}
@@ -374,9 +384,11 @@ fn backup_worker(
pool_config: &MediaPoolConfig,
setup: &TapeBackupJobSetup,
email: Option<String>,
-) -> Result<(), Error> {
+) -> Result<TapeBackupJobSummary, Error> {
let status_path = Path::new(TAPE_STATUS_DIR);
+ let start = std::time::Instant::now();
+ let mut summary: TapeBackupJobSummary = Default::default();
let _lock = MediaPool::lock(status_path, &pool_config.name)?;
@@ -420,8 +432,11 @@ fn backup_worker(
task_log!(worker, "skip snapshot {}", info.backup_dir);
continue;
}
+ let snapshot_name = info.backup_dir.to_string();
if !backup_snapshot(worker, &mut pool_writer, datastore.clone(), info.backup_dir)? {
errors = true;
+ } else {
+ summary.snapshot_list.push(snapshot_name);
}
progress.done_snapshots = 1;
task_log!(
@@ -437,8 +452,11 @@ fn backup_worker(
task_log!(worker, "skip snapshot {}", info.backup_dir);
continue;
}
+ let snapshot_name = info.backup_dir.to_string();
if !backup_snapshot(worker, &mut pool_writer, datastore.clone(), info.backup_dir)? {
errors = true;
+ } else {
+ summary.snapshot_list.push(snapshot_name);
}
progress.done_snapshots = snapshot_number as u64 + 1;
task_log!(
@@ -462,7 +480,9 @@ fn backup_worker(
bail!("Tape backup finished with some errors. Please check the task log.");
}
- Ok(())
+ summary.duration = start.elapsed();
+
+ Ok(summary)
}
// Try to update the the media online status
diff --git a/src/api2/types/tape/mod.rs b/src/api2/types/tape/mod.rs
index 68b2cf12..44c2236b 100644
--- a/src/api2/types/tape/mod.rs
+++ b/src/api2/types/tape/mod.rs
@@ -20,3 +20,12 @@ pub use media_location::*;
mod media;
pub use media::*;
+
+/// Summary of a successful Tape Job
+#[derive(Default)]
+pub struct TapeBackupJobSummary {
+ /// The list of snaphots backed up
+ pub snapshot_list: Vec<String>,
+ /// The total time of the backup job
+ pub duration: std::time::Duration,
+}
diff --git a/src/server/email_notifications.rs b/src/server/email_notifications.rs
index 59cd016a..70e13053 100644
--- a/src/server/email_notifications.rs
+++ b/src/server/email_notifications.rs
@@ -18,6 +18,7 @@ use crate::{
Userid,
Notify,
DatastoreNotify,
+ TapeBackupJobSummary,
},
tools::format::HumanByte,
};
@@ -149,6 +150,14 @@ Datastore: {{job.store}}
Tape Pool: {{job.pool}}
Tape Drive: {{job.drive}}
+{{#if snapshot-list ~}}
+Snapshots included:
+
+{{#each snapshot-list~}}
+{{this}}
+{{/each~}}
+{{/if}}
+Duration: {{duration}}
Tape Backup successful.
@@ -411,14 +420,18 @@ pub fn send_tape_backup_status(
id: Option<&str>,
job: &TapeBackupJobSetup,
result: &Result<(), Error>,
+ summary: TapeBackupJobSummary,
) -> Result<(), Error> {
let (fqdn, port) = get_server_url();
+ let duration: crate::tools::systemd::time::TimeSpan = summary.duration.into();
let mut data = json!({
"job": job,
"fqdn": fqdn,
"port": port,
"id": id,
+ "snapshot-list": summary.snapshot_list,
+ "duration": duration.to_string(),
});
let text = match result {
--
2.20.1
next prev parent reply other threads:[~2021-03-16 11:56 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-03-16 11:56 [pbs-devel] [PATCH proxmox-backup 1/3] tools/systemd/time: implement some Traits for TimeSpan Dominik Csapak
2021-03-16 11:56 ` [pbs-devel] [PATCH proxmox-backup 2/3] server/email_notifications: do not panic on template registration Dominik Csapak
2021-03-17 19:38 ` Thomas Lamprecht
2021-03-18 9:57 ` Dominik Csapak
2021-03-18 10:21 ` Thomas Lamprecht
2021-03-18 10:31 ` Dominik Csapak
2021-03-18 11:13 ` Thomas Lamprecht
2021-03-16 11:56 ` Dominik Csapak [this message]
2021-03-17 19:35 ` [pbs-devel] [PATCH proxmox-backup 1/3] tools/systemd/time: implement some Traits for TimeSpan Thomas Lamprecht
2021-03-18 9:49 ` Dominik Csapak
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=20210316115623.9368-3-d.csapak@proxmox.com \
--to=d.csapak@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox