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