From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by lists.proxmox.com (Postfix) with ESMTPS id F0C5760B91 for ; Fri, 25 Sep 2020 10:44:10 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 3F9F1193C9 for ; Fri, 25 Sep 2020 10:43:45 +0200 (CEST) Received: from proxmox-new.maurer-it.com (proxmox-new.maurer-it.com [212.186.127.180]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by firstgate.proxmox.com (Proxmox) with ESMTPS id 12E8319373 for ; Fri, 25 Sep 2020 10:43:41 +0200 (CEST) Received: from proxmox-new.maurer-it.com (localhost.localdomain [127.0.0.1]) by proxmox-new.maurer-it.com (Proxmox) with ESMTP id CF177456E2 for ; Fri, 25 Sep 2020 10:43:40 +0200 (CEST) From: Hannes Laimer To: pbs-devel@lists.proxmox.com Date: Fri, 25 Sep 2020 10:43:21 +0200 Message-Id: <20200925084330.75484-6-h.laimer@proxmox.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200925084330.75484-1-h.laimer@proxmox.com> References: <20200925084330.75484-1-h.laimer@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment RCVD_IN_DNSWL_MED -2.3 Sender listed at https://www.dnswl.org/, medium trust SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record URIBL_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to URIBL was blocked. See http://wiki.apache.org/spamassassin/DnsBlocklists#dnsbl-block for more information. [verify.rs, admin.rs] Subject: [pbs-devel] [PATCH v1 proxmox-backup 05/14] api2: add verify job admin endpoint X-BeenThere: pbs-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox Backup Server development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 25 Sep 2020 08:44:11 -0000 Signed-off-by: Hannes Laimer --- src/api2/admin.rs | 4 +- src/api2/admin/verify.rs | 107 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 110 insertions(+), 1 deletion(-) create mode 100644 src/api2/admin/verify.rs diff --git a/src/api2/admin.rs b/src/api2/admin.rs index b927ce1e..79ce29f3 100644 --- a/src/api2/admin.rs +++ b/src/api2/admin.rs @@ -3,10 +3,12 @@ use proxmox::list_subdirs_api_method; pub mod datastore; pub mod sync; +pub mod verify; const SUBDIRS: SubdirMap = &[ ("datastore", &datastore::ROUTER), - ("sync", &sync::ROUTER) + ("sync", &sync::ROUTER), + ("verify", &verify::ROUTER) ]; pub const ROUTER: Router = Router::new() diff --git a/src/api2/admin/verify.rs b/src/api2/admin/verify.rs new file mode 100644 index 00000000..06262efb --- /dev/null +++ b/src/api2/admin/verify.rs @@ -0,0 +1,107 @@ +use anyhow::{format_err, Error}; + +use proxmox::api::router::SubdirMap; +use proxmox::{list_subdirs_api_method, sortable}; +use proxmox::api::{api, ApiMethod, Router, RpcEnvironment}; + +use crate::api2::types::*; +use crate::backup::do_verification_job; +use crate::config::jobstate::{Job, JobState}; +use crate::config::verify; +use crate::config::verify::{VerifyJobConfig, VerifyJobStatus}; +use serde_json::Value; +use crate::tools::systemd::time::{parse_calendar_event, compute_next_event}; +use crate::server::UPID; + +#[api( + input: { + properties: {}, + }, + returns: { + description: "List configured jobs and their status.", + type: Array, + items: { type: verify::VerifyJobStatus }, + }, +)] +/// List all verify jobs +pub fn list_verify_jobs( + _param: Value, + mut rpcenv: &mut dyn RpcEnvironment, +) -> Result, Error> { + + let (config, digest) = verify::config()?; + + let mut list: Vec = config.convert_to_typed_array("verify")?; + + for job in &mut list { + let last_state = JobState::load("verifyjob", &job.id) + .map_err(|err| format_err!("could not open statefile for {}: {}", &job.id, err))?; + + let (upid, endtime, state, starttime) = match last_state { + JobState::Created { time } => (None, None, None, time), + JobState::Started { upid } => { + let parsed_upid: UPID = upid.parse()?; + (Some(upid), None, None, parsed_upid.starttime) + }, + JobState::Finished { upid, state } => { + let parsed_upid: UPID = upid.parse()?; + (Some(upid), Some(state.endtime()), Some(state.to_string()), parsed_upid.starttime) + }, + }; + + job.last_run_upid = upid; + job.last_run_state = state; + job.last_run_endtime = endtime; + + let last = job.last_run_endtime.unwrap_or_else(|| starttime); + + job.next_run = (|| -> Option { + let schedule = job.schedule.as_ref()?; + let event = parse_calendar_event(&schedule).ok()?; + // ignore errors + compute_next_event(&event, last, false).unwrap_or_else(|_| None) + })(); + } + + rpcenv["digest"] = proxmox::tools::digest_to_hex(&digest).into(); + + Ok(list) +} + +#[api( + input: { + properties: { + id: { + schema: JOB_ID_SCHEMA, + } + } + } +)] +/// Runs a verify job manually. +fn run_verify_job( + id: String, + _info: &ApiMethod, + rpcenv: &mut dyn RpcEnvironment, +) -> Result { + let (config, _digest) = verify::config()?; + let verify_job: VerifyJobConfig = config.lookup("verify", &id)?; + + let userid: Userid = rpcenv.get_user().unwrap().parse()?; + + let job = Job::new("verifyjob", &id)?; + + let upid_str = do_verification_job(job, verify_job, &userid, None)?; + + Ok(upid_str) +} + +#[sortable] +const VERIFY_INFO_SUBDIRS: SubdirMap = &[("run", &Router::new().post(&API_METHOD_RUN_VERIFY_JOB))]; + +const VERIFY_INFO_ROUTER: Router = Router::new() + .get(&list_subdirs_api_method!(VERIFY_INFO_SUBDIRS)) + .subdirs(VERIFY_INFO_SUBDIRS); + +pub const ROUTER: Router = Router::new() + .get(&API_METHOD_LIST_VERIFY_JOBS) + .match_all("id", &VERIFY_INFO_ROUTER); -- 2.20.1