4 use crate::api_schema
::*;
5 use crate::api_schema
::router
::*;
6 use serde_json
::{json, Value}
;
9 use std
::io
::{BufRead,BufReader}
;
11 use crate::server
::{self, UPID}
;
16 _rpcenv
: &mut RpcEnvironment
,
17 ) -> Result
<Value
, Error
> {
19 let upid
= extract_upid(¶m
)?
;
21 let mut result
= json
!({
22 "upid": param
["upid"],
25 "pstart": upid
.pstart
,
26 "starttime": upid
.starttime
,
27 "type": upid
.worker_type
,
29 "user": upid
.username
,
32 if crate::server
::worker_is_active(&upid
) {
33 result
["status"] = Value
::from("running");
35 let exitstatus
= crate::server
::upid_read_status(&upid
).unwrap_or(String
::from("unknown"));
36 result
["status"] = Value
::from("stopped");
37 result
["exitstatus"] = Value
::from(exitstatus
);
43 fn extract_upid(param
: &Value
) -> Result
<UPID
, Error
> {
45 let upid_str
= tools
::required_string_param(¶m
, "upid")?
;
47 let upid
= match upid_str
.parse
::<UPID
>() {
49 Err(err
) => bail
!("unable to parse UPID '{}' - {}", upid_str
, err
),
58 rpcenv
: &mut RpcEnvironment
,
59 ) -> Result
<Value
, Error
> {
61 let upid
= extract_upid(¶m
)?
;
62 let start
= param
["start"].as_u64().unwrap_or(0);
63 let mut limit
= param
["limit"].as_u64().unwrap_or(50);
64 let mut count
: u64 = 0;
66 let path
= upid
.log_path();
68 let file
= File
::open(path
)?
;
70 let mut lines
: Vec
<Value
> = vec
![];
72 for line
in BufReader
::new(file
).lines() {
76 if count
< start { continue }
;
77 if limit
<= 0 { continue }
;
79 lines
.push(json
!({ "n": count, "t": line }
));
84 log
::error
!("reading task log failed: {}", err
);
90 rpcenv
.set_result_attrib("total", Value
::from(count
));
98 _rpcenv
: &mut RpcEnvironment
,
99 ) -> Result
<Value
, Error
> {
101 let upid
= extract_upid(¶m
)?
;
103 if crate::server
::worker_is_active(&upid
) {
104 server
::abort_worker_async(upid
);
113 rpcenv
: &mut RpcEnvironment
,
114 ) -> Result
<Value
, Error
> {
116 let start
= param
["start"].as_u64().unwrap_or(0);
117 let limit
= param
["limit"].as_u64().unwrap_or(50);
118 let errors
= param
["errors"].as_bool().unwrap_or(false);
120 let userfilter
= param
["userfilter"].as_str();
122 let list
= server
::read_task_list()?
;
124 let mut result
= vec
![];
128 for info
in list
.iter() {
129 let mut entry
= json
!({
130 "upid": info
.upid_str
,
132 "pid": info
.upid
.pid
,
133 "pstart": info
.upid
.pstart
,
134 "starttime": info
.upid
.starttime
,
135 "type": info
.upid
.worker_type
,
136 "id": info
.upid
.worker_id
,
137 "user": info
.upid
.username
,
140 if let Some(username
) = userfilter
{
141 if !info
.upid
.username
.contains(username
) { continue; }
144 if let Some(ref state
) = info
.state
{
145 if errors
&& state
.1 == "OK" {
149 entry
["endtime"] = Value
::from(state
.0);
150 entry
["status"] = Value
::from(state
.1.clone());
153 if (count
as u64) < start
{
160 if (result
.len() as u64) < limit { result.push(entry); }
;
163 rpcenv
.set_result_attrib("total", Value
::from(count
));
168 pub fn router() -> Router
{
170 let upid_schema
: Arc
<Schema
> = Arc
::new(
171 StringSchema
::new("Unique Process/Task ID.")
176 let upid_api
= Router
::new()
179 let mut result
= vec
![];
180 for cmd
in &["log", "status"] {
181 result
.push(json
!({"subdir": cmd }
));
183 Ok(Value
::from(result
))
185 ObjectSchema
::new("Directory index.")
186 .required("node", crate::api2
::node
::NODE_SCHEMA
.clone())
187 .required("upid", upid_schema
.clone()))
189 .delete(ApiMethod
::new(
191 ObjectSchema
::new("Try to stop a task.")
192 .required("node", crate::api2
::node
::NODE_SCHEMA
.clone())
193 .required("upid", upid_schema
.clone())).protected(true)
201 ObjectSchema
::new("Read task log.")
202 .required("node", crate::api2
::node
::NODE_SCHEMA
.clone())
203 .required("upid", upid_schema
.clone())
206 IntegerSchema
::new("Start at this line.")
212 IntegerSchema
::new("Only list this amount of lines.")
220 "status", Router
::new()
224 ObjectSchema
::new("Get task status.")
225 .required("node", crate::api2
::node
::NODE_SCHEMA
.clone())
226 .required("upid", upid_schema
.clone()))
231 let route
= Router
::new()
234 ObjectSchema
::new("List tasks.")
235 .required("node", crate::api2
::node
::NODE_SCHEMA
.clone())
238 IntegerSchema
::new("List tasks beginning from this offset.")
244 IntegerSchema
::new("Only list this amount of tasks.")
250 BooleanSchema
::new("Only list erroneous tasks.")
254 StringSchema
::new("Only list tasks from this user.")
258 .match_all("upid", upid_api
);