]>
Commit | Line | Data |
---|---|---|
a4915dfc | 1 | use anyhow::{format_err, Error}; |
acc3d9df | 2 | |
e9d2fc93 | 3 | use pbs_api_types::{Authid, Operation, VerificationJobConfig}; |
6d5d305d | 4 | use pbs_datastore::DataStore; |
ee0ea735 TL |
5 | use proxmox_rest_server::WorkerTask; |
6 | use proxmox_sys::task_log; | |
c23192d3 | 7 | |
acc3d9df | 8 | use crate::{ |
ee0ea735 | 9 | backup::{verify_all_backups, verify_filter}, |
acc3d9df | 10 | server::jobstate::Job, |
acc3d9df DM |
11 | }; |
12 | ||
13 | /// Runs a verification job. | |
14 | pub fn do_verification_job( | |
15 | mut job: Job, | |
16 | verification_job: VerificationJobConfig, | |
e6dc35ac | 17 | auth_id: &Authid, |
acc3d9df | 18 | schedule: Option<String>, |
bfa942c0 | 19 | to_stdout: bool, |
acc3d9df | 20 | ) -> Result<String, Error> { |
e9d2fc93 | 21 | let datastore = DataStore::lookup_datastore(&verification_job.store, Some(Operation::Read))?; |
acc3d9df | 22 | |
44288184 | 23 | let outdated_after = verification_job.outdated_after; |
b4b14dc1 | 24 | let ignore_verified_snapshots = verification_job.ignore_verified.unwrap_or(true); |
a4915dfc | 25 | |
f47c1d3a | 26 | let (email, notify) = crate::server::lookup_datastore_notify_settings(&verification_job.store); |
b9e7bcc2 | 27 | |
ee0ea735 | 28 | let job_id = format!("{}:{}", &verification_job.store, job.jobname()); |
acc3d9df DM |
29 | let worker_type = job.jobtype().to_string(); |
30 | let upid_str = WorkerTask::new_thread( | |
31 | &worker_type, | |
dbd45a72 | 32 | Some(job_id.clone()), |
049a22a3 | 33 | auth_id.to_string(), |
bfa942c0 | 34 | to_stdout, |
acc3d9df DM |
35 | move |worker| { |
36 | job.start(&worker.upid().to_string())?; | |
37 | ||
ee0ea735 | 38 | task_log!(worker, "Starting datastore verify job '{}'", job_id); |
acc3d9df | 39 | if let Some(event_str) = schedule { |
ee0ea735 | 40 | task_log!(worker, "task triggered by schedule '{}'", event_str); |
acc3d9df DM |
41 | } |
42 | ||
59229bd7 TL |
43 | let ns = match verification_job.ns { |
44 | Some(ref ns) => ns.clone(), | |
45 | None => Default::default(), | |
46 | }; | |
47 | ||
9c26a3d6 | 48 | let verify_worker = crate::backup::VerifyWorker::new(worker.clone(), datastore); |
037e6c0c HL |
49 | let result = verify_all_backups( |
50 | &verify_worker, | |
51 | worker.upid(), | |
59229bd7 | 52 | ns, |
0b1edf29 | 53 | verification_job.max_depth, |
037e6c0c HL |
54 | None, |
55 | Some(&move |manifest| { | |
56 | verify_filter(ignore_verified_snapshots, outdated_after, manifest) | |
57 | }), | |
58 | ); | |
a4915dfc | 59 | let job_result = match result { |
a4fa3fc2 FG |
60 | Ok(ref failed_dirs) if failed_dirs.is_empty() => Ok(()), |
61 | Ok(ref failed_dirs) => { | |
1ec0d70d | 62 | task_log!(worker, "Failed to verify the following snapshots/groups:"); |
a4fa3fc2 | 63 | for dir in failed_dirs { |
1ec0d70d | 64 | task_log!(worker, "\t{}", dir); |
a4fa3fc2 FG |
65 | } |
66 | ||
ee0ea735 TL |
67 | Err(format_err!( |
68 | "verification failed - please check the log for details" | |
69 | )) | |
70 | } | |
a4915dfc DM |
71 | Err(_) => Err(format_err!("verification failed - job aborted")), |
72 | }; | |
acc3d9df | 73 | |
a4915dfc | 74 | let status = worker.create_state(&job_result); |
acc3d9df | 75 | |
b92cad09 FG |
76 | if let Err(err) = job.finish(status) { |
77 | eprintln!( | |
acc3d9df DM |
78 | "could not finish job state for {}: {}", |
79 | job.jobtype().to_string(), | |
80 | err | |
b92cad09 | 81 | ); |
acc3d9df DM |
82 | } |
83 | ||
b9e7bcc2 | 84 | if let Some(email) = email { |
ee0ea735 TL |
85 | if let Err(err) = |
86 | crate::server::send_verify_status(&email, notify, verification_job, &result) | |
87 | { | |
b9e7bcc2 DM |
88 | eprintln!("send verify notification failed: {}", err); |
89 | } | |
90 | } | |
91 | ||
a4915dfc | 92 | job_result |
acc3d9df DM |
93 | }, |
94 | )?; | |
95 | Ok(upid_str) | |
96 | } |