1 use anyhow
::{format_err, Error}
;
4 use proxmox
::api
::{api, ApiMethod, Router, RpcEnvironment}
;
5 use proxmox
::api
::router
::SubdirMap
;
6 use proxmox
::{list_subdirs_api_method, sortable}
;
8 use crate::api2
::types
::*;
9 use crate::api2
::pull
::do_sync_job
;
10 use crate::config
::sync
::{self, SyncJobStatus, SyncJobConfig}
;
11 use crate::server
::UPID
;
12 use crate::config
::jobstate
::{Job, JobState}
;
13 use crate::tools
::systemd
::time
::{
14 parse_calendar_event
, compute_next_event
};
21 description
: "List configured jobs and their status.",
23 items
: { type: sync::SyncJobStatus }
,
26 /// List all sync jobs
27 pub fn list_sync_jobs(
29 mut rpcenv
: &mut dyn RpcEnvironment
,
30 ) -> Result
<Vec
<SyncJobStatus
>, Error
> {
32 let (config
, digest
) = sync
::config()?
;
34 let mut list
: Vec
<SyncJobStatus
> = config
.convert_to_typed_array("sync")?
;
36 for job
in &mut list
{
37 let last_state
= JobState
::load("syncjob", &job
.id
)
38 .map_err(|err
| format_err
!("could not open statefile for {}: {}", &job
.id
, err
))?
;
39 let (upid
, endtime
, state
, starttime
) = match last_state
{
40 JobState
::Created { time }
=> (None
, None
, None
, time
),
41 JobState
::Started { upid }
=> {
42 let parsed_upid
: UPID
= upid
.parse()?
;
43 (Some(upid
), None
, None
, parsed_upid
.starttime
)
45 JobState
::Finished { upid, endtime, state }
=> {
46 let parsed_upid
: UPID
= upid
.parse()?
;
47 (Some(upid
), Some(endtime
), Some(state
.to_string()), parsed_upid
.starttime
)
51 job
.last_run_upid
= upid
;
52 job
.last_run_state
= state
;
53 job
.last_run_endtime
= endtime
;
55 let last
= job
.last_run_endtime
.unwrap_or_else(|| starttime
);
57 job
.next_run
= (|| -> Option
<i64> {
58 let schedule
= job
.schedule
.as_ref()?
;
59 let event
= parse_calendar_event(&schedule
).ok()?
;
60 compute_next_event(&event
, last
, false).ok()
64 rpcenv
["digest"] = proxmox
::tools
::digest_to_hex(&digest
).into();
73 schema
: JOB_ID_SCHEMA
,
78 /// Runs the sync jobs manually.
82 rpcenv
: &mut dyn RpcEnvironment
,
83 ) -> Result
<String
, Error
> {
85 let (config
, _digest
) = sync
::config()?
;
86 let sync_job
: SyncJobConfig
= config
.lookup("sync", &id
)?
;
88 let userid
: Userid
= rpcenv
.get_user().unwrap().parse()?
;
90 let mut job
= Job
::new("syncjob", &id
)?
;
93 let upid_str
= do_sync_job(&id
, sync_job
, &userid
, None
, job
)?
;
99 const SYNC_INFO_SUBDIRS
: SubdirMap
= &[
103 .post(&API_METHOD_RUN_SYNC_JOB
)
107 const SYNC_INFO_ROUTER
: Router
= Router
::new()
108 .get(&list_subdirs_api_method
!(SYNC_INFO_SUBDIRS
))
109 .subdirs(SYNC_INFO_SUBDIRS
);
112 pub const ROUTER
: Router
= Router
::new()
113 .get(&API_METHOD_LIST_SYNC_JOBS
)
114 .match_all("id", &SYNC_INFO_ROUTER
);