]> git.proxmox.com Git - proxmox-backup.git/blob - src/server/verify_job.rs
clippy: remove unnecessary clones
[proxmox-backup.git] / src / server / verify_job.rs
1 use anyhow::{format_err, Error};
2
3 use crate::{
4 server::WorkerTask,
5 api2::types::*,
6 server::jobstate::Job,
7 config::verify::VerificationJobConfig,
8 backup::{
9 DataStore,
10 BackupManifest,
11 verify_all_backups,
12 },
13 task_log,
14 };
15
16 /// Runs a verification job.
17 pub fn do_verification_job(
18 mut job: Job,
19 verification_job: VerificationJobConfig,
20 auth_id: &Authid,
21 schedule: Option<String>,
22 ) -> Result<String, Error> {
23
24 let datastore = DataStore::lookup_datastore(&verification_job.store)?;
25
26 let outdated_after = verification_job.outdated_after;
27 let ignore_verified_snapshots = verification_job.ignore_verified.unwrap_or(true);
28
29 let filter = move |manifest: &BackupManifest| {
30 if !ignore_verified_snapshots {
31 return true;
32 }
33
34 let raw_verify_state = manifest.unprotected["verify_state"].clone();
35 match serde_json::from_value::<SnapshotVerifyState>(raw_verify_state) {
36 Err(_) => return true, // no last verification, always include
37 Ok(last_verify) => {
38 match outdated_after {
39 None => false, // never re-verify if ignored and no max age
40 Some(max_age) => {
41 let now = proxmox::tools::time::epoch_i64();
42 let days_since_last_verify = (now - last_verify.upid.starttime) / 86400;
43
44 days_since_last_verify > max_age
45 }
46 }
47 }
48 }
49 };
50
51 let (email, notify) = crate::server::lookup_datastore_notify_settings(&verification_job.store);
52
53 let job_id = format!("{}:{}",
54 &verification_job.store,
55 job.jobname());
56 let worker_type = job.jobtype().to_string();
57 let upid_str = WorkerTask::new_thread(
58 &worker_type,
59 Some(job_id.clone()),
60 auth_id.clone(),
61 false,
62 move |worker| {
63 job.start(&worker.upid().to_string())?;
64
65 task_log!(worker,"Starting datastore verify job '{}'", job_id);
66 if let Some(event_str) = schedule {
67 task_log!(worker,"task triggered by schedule '{}'", event_str);
68 }
69
70 let result = verify_all_backups(datastore, worker.clone(), worker.upid(), None, Some(&filter));
71 let job_result = match result {
72 Ok(ref failed_dirs) if failed_dirs.is_empty() => Ok(()),
73 Ok(ref failed_dirs) => {
74 worker.log("Failed to verify the following snapshots/groups:");
75 for dir in failed_dirs {
76 worker.log(format!("\t{}", dir));
77 }
78
79 Err(format_err!("verification failed - please check the log for details"))
80 },
81 Err(_) => Err(format_err!("verification failed - job aborted")),
82 };
83
84 let status = worker.create_state(&job_result);
85
86 match job.finish(status) {
87 Err(err) => eprintln!(
88 "could not finish job state for {}: {}",
89 job.jobtype().to_string(),
90 err
91 ),
92 Ok(_) => (),
93 }
94
95 if let Some(email) = email {
96 if let Err(err) = crate::server::send_verify_status(&email, notify, verification_job, &result) {
97 eprintln!("send verify notification failed: {}", err);
98 }
99 }
100
101 job_result
102 },
103 )?;
104 Ok(upid_str)
105 }