api2/node/syslog.rs: implement dump journal
This commit is contained in:
		| @ -8,12 +8,71 @@ use serde_json::{json, Value}; | ||||
| use std::sync::Arc; | ||||
| use lazy_static::lazy_static; | ||||
| use crate::tools::common_regex; | ||||
| use std::process::{Command, Stdio}; | ||||
|  | ||||
| fn dump_journal( | ||||
|     start: Option<u64>, | ||||
|     limit: Option<u64>, | ||||
|     since: Option<&str>, | ||||
|     until: Option<&str>, | ||||
|     service: Option<&str>, | ||||
| ) -> Result<(u64, Vec<Value>), Error> { | ||||
|  | ||||
|     let mut args = vec!["-o", "short", "--no-pager"]; | ||||
|  | ||||
|     if let Some(service) = service { args.push("--unit"); args.push(service); } | ||||
|     if let Some(since) = since { args.push("--since"); args.push(since); } | ||||
|     if let Some(until) = until { args.push("--until"); args.push(until); } | ||||
|  | ||||
|     let mut lines: Vec<Value> = vec![]; | ||||
|     let mut limit = limit.unwrap_or(50); | ||||
|     let start = start.unwrap_or(0); | ||||
|     let mut count: u64 = 0; | ||||
|  | ||||
|     let mut child = Command::new("/bin/journalctl") | ||||
|         .args(&args) | ||||
|         .stdout(Stdio::piped()) | ||||
|         .spawn()?; | ||||
|  | ||||
|     use std::io::{BufRead,BufReader}; | ||||
|  | ||||
|     if let Some(ref mut stdout) = child.stdout { | ||||
|         for line in BufReader::new(stdout).lines() { | ||||
|             count += 1; | ||||
|             if count < start { continue }; | ||||
| 	    if limit <= 0 { continue }; | ||||
|  | ||||
|             let line = line?; // fixme: nom utf8?? | ||||
|             lines.push(json!({ "n": count, "t": line })); | ||||
|  | ||||
|             limit -= 1; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     let status = child.wait()?; // fixme: check status | ||||
|  | ||||
|     // HACK: ExtJS store.guaranteeRange() does not like empty array | ||||
|     // so we add a line | ||||
|     if count == 0 { | ||||
|         count += 1; | ||||
| 	lines.push(json!({ "n": count, "t": "no content"})); | ||||
|     } | ||||
|  | ||||
|     Ok((count, lines)) | ||||
| } | ||||
|  | ||||
| fn get_syslog(param: Value, _info: &ApiMethod) -> Result<Value, Error> { | ||||
|  | ||||
|     let result = json!({}); | ||||
|     let (count, lines) = dump_journal( | ||||
|         param["start"].as_u64(), | ||||
|         param["limit"].as_u64(), | ||||
|         param["since"].as_str(), | ||||
|         param["until"].as_str(), | ||||
|         param["service"].as_str()); | ||||
|  | ||||
|     Ok(result) | ||||
|     //fixme: $restenv->set_result_attrib('total', $count); | ||||
|  | ||||
|     Ok(json!(lines)) | ||||
| } | ||||
|  | ||||
| lazy_static! { | ||||
|  | ||||
		Reference in New Issue
	
	Block a user