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::server
::jobstate
::{Job, JobState}
;
13 use crate::tools
::systemd
::time
::{
14 parse_calendar_event
, compute_next_event
};
20 schema
: DATASTORE_SCHEMA
,
26 description
: "List configured jobs and their status.",
28 items
: { type: sync::SyncJobStatus }
,
31 /// List all sync jobs
32 pub fn list_sync_jobs(
33 store
: Option
<String
>,
35 mut rpcenv
: &mut dyn RpcEnvironment
,
36 ) -> Result
<Vec
<SyncJobStatus
>, Error
> {
38 let (config
, digest
) = sync
::config()?
;
40 let mut list
: Vec
<SyncJobStatus
> = config
41 .convert_to_typed_array("sync")?
43 .filter(|job
: &SyncJobStatus
| {
44 if let Some(store
) = &store
{
51 for job
in &mut list
{
52 let last_state
= JobState
::load("syncjob", &job
.id
)
53 .map_err(|err
| format_err
!("could not open statefile for {}: {}", &job
.id
, err
))?
;
54 let (upid
, endtime
, state
, starttime
) = match last_state
{
55 JobState
::Created { time }
=> (None
, None
, None
, time
),
56 JobState
::Started { upid }
=> {
57 let parsed_upid
: UPID
= upid
.parse()?
;
58 (Some(upid
), None
, None
, parsed_upid
.starttime
)
60 JobState
::Finished { upid, state }
=> {
61 let parsed_upid
: UPID
= upid
.parse()?
;
62 (Some(upid
), Some(state
.endtime()), Some(state
.to_string()), parsed_upid
.starttime
)
66 job
.last_run_upid
= upid
;
67 job
.last_run_state
= state
;
68 job
.last_run_endtime
= endtime
;
70 let last
= job
.last_run_endtime
.unwrap_or_else(|| starttime
);
72 job
.next_run
= (|| -> Option
<i64> {
73 let schedule
= job
.schedule
.as_ref()?
;
74 let event
= parse_calendar_event(&schedule
).ok()?
;
76 compute_next_event(&event
, last
, false).unwrap_or_else(|_
| None
)
80 rpcenv
["digest"] = proxmox
::tools
::digest_to_hex(&digest
).into();
89 schema
: JOB_ID_SCHEMA
,
94 /// Runs the sync jobs manually.
98 rpcenv
: &mut dyn RpcEnvironment
,
99 ) -> Result
<String
, Error
> {
101 let (config
, _digest
) = sync
::config()?
;
102 let sync_job
: SyncJobConfig
= config
.lookup("sync", &id
)?
;
104 let userid
: Userid
= rpcenv
.get_user().unwrap().parse()?
;
106 let job
= Job
::new("syncjob", &id
)?
;
108 let upid_str
= do_sync_job(job
, sync_job
, &userid
, None
)?
;
114 const SYNC_INFO_SUBDIRS
: SubdirMap
= &[
118 .post(&API_METHOD_RUN_SYNC_JOB
)
122 const SYNC_INFO_ROUTER
: Router
= Router
::new()
123 .get(&list_subdirs_api_method
!(SYNC_INFO_SUBDIRS
))
124 .subdirs(SYNC_INFO_SUBDIRS
);
127 pub const ROUTER
: Router
= Router
::new()
128 .get(&API_METHOD_LIST_SYNC_JOBS
)
129 .match_all("id", &SYNC_INFO_ROUTER
);