api2/node/syslog.rs: implement dump journal
This commit is contained in:
parent
4f9a726833
commit
0441886842
|
@ -8,12 +8,71 @@ use serde_json::{json, Value};
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use lazy_static::lazy_static;
|
use lazy_static::lazy_static;
|
||||||
use crate::tools::common_regex;
|
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> {
|
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! {
|
lazy_static! {
|
||||||
|
|
Loading…
Reference in New Issue