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