]> git.proxmox.com Git - proxmox-backup.git/blame - src/server/verify_job.rs
move src/backup/datastore.rs into pbs_datastore crate
[proxmox-backup.git] / src / server / verify_job.rs
CommitLineData
a4915dfc 1use anyhow::{format_err, Error};
acc3d9df 2
b9700a9f 3use pbs_tools::task_log;
e3619d41 4use pbs_api_types::{Authid, VerificationJobConfig};
b9700a9f 5use proxmox_rest_server::WorkerTask;
6d5d305d 6use pbs_datastore::DataStore;
c23192d3 7
acc3d9df 8use 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.
17pub 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}