]> git.proxmox.com Git - proxmox-backup.git/blob - src/server/verify_job.rs
878fade540c2a4df3481e12146bf82e696f9c40a
[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 verify_filter,
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 (email, notify) = crate::server::lookup_datastore_notify_settings(&verification_job.store);
30
31 let job_id = format!("{}:{}",
32 &verification_job.store,
33 job.jobname());
34 let worker_type = job.jobtype().to_string();
35 let upid_str = WorkerTask::new_thread(
36 &worker_type,
37 Some(job_id.clone()),
38 auth_id.clone(),
39 false,
40 move |worker| {
41 job.start(&worker.upid().to_string())?;
42
43 task_log!(worker,"Starting datastore verify job '{}'", job_id);
44 if let Some(event_str) = schedule {
45 task_log!(worker,"task triggered by schedule '{}'", event_str);
46 }
47
48 let verify_worker = crate::backup::VerifyWorker::new(worker.clone(), datastore);
49 let result = verify_all_backups(
50 &verify_worker,
51 worker.upid(),
52 None,
53 Some(&move |manifest| {
54 verify_filter(ignore_verified_snapshots, outdated_after, manifest)
55 }),
56 );
57 let job_result = match result {
58 Ok(ref failed_dirs) if failed_dirs.is_empty() => Ok(()),
59 Ok(ref failed_dirs) => {
60 worker.log("Failed to verify the following snapshots/groups:");
61 for dir in failed_dirs {
62 worker.log(format!("\t{}", dir));
63 }
64
65 Err(format_err!("verification failed - please check the log for details"))
66 },
67 Err(_) => Err(format_err!("verification failed - job aborted")),
68 };
69
70 let status = worker.create_state(&job_result);
71
72 if let Err(err) = job.finish(status) {
73 eprintln!(
74 "could not finish job state for {}: {}",
75 job.jobtype().to_string(),
76 err
77 );
78 }
79
80 if let Some(email) = email {
81 if let Err(err) = crate::server::send_verify_status(&email, notify, verification_job, &result) {
82 eprintln!("send verify notification failed: {}", err);
83 }
84 }
85
86 job_result
87 },
88 )?;
89 Ok(upid_str)
90 }