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