]> git.proxmox.com Git - proxmox-backup.git/commitdiff
use proxmox-mini-journalreader to display syslog
authorDietmar Maurer <dietmar@proxmox.com>
Tue, 17 Dec 2019 13:06:48 +0000 (14:06 +0100)
committerDietmar Maurer <dietmar@proxmox.com>
Tue, 17 Dec 2019 13:06:48 +0000 (14:06 +0100)
debian/control
src/api2/node.rs
src/api2/node/journal.rs [new file with mode: 0644]
www/ServerAdministration.js

index b5b382f2f78f596c0246ddd301734baa00351067..74a1316ac2d982bc8d02b015be75120ef77780c3 100644 (file)
@@ -27,6 +27,7 @@ Architecture: any
 Depends: ${shlibs:Depends}, ${misc:Depends},
         libjs-extjs (>= 6.0.1),
         fonts-font-awesome,
+         proxmox-mini-journalreader,
         proxmox-widget-toolkit,
         libzstd1 (>= 1.3.8),
 Description: Proxmox Backup Server daemon with tools and GUI
index 778deaf152df2eaf4d44b7e613b20bd9a3c2c20d..5d5a9af34c891a571f91536e5cf38d2398a203bb 100644 (file)
@@ -6,10 +6,12 @@ mod time;
 mod network;
 mod dns;
 mod syslog;
+mod journal;
 mod services;
 
 pub const SUBDIRS: SubdirMap = &[
     ("dns", &dns::ROUTER),
+    ("journal", &journal::ROUTER),
     ("network", &network::ROUTER),
     ("services", &services::ROUTER),
     ("syslog", &syslog::ROUTER),
diff --git a/src/api2/node/journal.rs b/src/api2/node/journal.rs
new file mode 100644 (file)
index 0000000..aef67f1
--- /dev/null
@@ -0,0 +1,122 @@
+use std::process::{Command, Stdio};
+
+use failure::*;
+use serde_json::{json, Value};
+use std::io::{BufRead,BufReader};
+
+use proxmox::api::{api, ApiMethod, Router, RpcEnvironment};
+
+use crate::api2::types::*;
+
+#[api(
+    protected: true,
+    input: {
+        properties: {
+            node: {
+                schema: NODE_SCHEMA,
+            },
+            since: {
+                type: Integer,
+                optional: true,
+                description: "Display all log since this UNIX epoch. Conflicts with 'startcursor'.",
+                minimum: 0,
+            },
+            until: {
+                type: Integer,
+                optional: true,
+                description: "Display all log until this UNIX epoch. Conflicts with 'endcursor'.",
+                minimum: 0,
+            },
+            lastentries: {
+                type: Integer,
+                optional: true,
+                description: "Limit to the last X lines. Conflicts with a range.",
+                minimum: 0,
+            },
+            startcursor: {
+                type: String,
+                description: "Start after the given Cursor. Conflicts with 'since'.",
+                optional: true,
+            },
+            endcursor: {
+                type: String,
+                description: "End before the given Cursor. Conflicts with 'until'",
+                optional: true,
+            },
+        },
+    },
+    returns: {
+        type: Array,
+        description: "Returns a list of journal entries.",
+        items: {
+            type: String,
+            description: "Line text.",
+        },
+    },
+)]
+/// Read syslog entries.
+fn get_journal(
+    param: Value,
+    _info: &ApiMethod,
+    _rpcenv: &mut dyn RpcEnvironment,
+) -> Result<Value, Error> {
+
+    let mut args = vec![];
+
+    if let Some(lastentries) = param["lastentries"].as_u64() {
+        args.push(String::from("-n"));
+        args.push(format!("{}", lastentries));
+    }
+
+    if let Some(since) = param["since"].as_str() {
+        args.push(String::from("-b"));
+        args.push(since.to_owned());
+    }
+
+    if let Some(until) = param["until"].as_str() {
+        args.push(String::from("-e"));
+        args.push(until.to_owned());
+    }
+
+    if let Some(startcursor) = param["startcursor"].as_str() {
+        args.push(String::from("-f"));
+        args.push(startcursor.to_owned());
+    }
+
+    if let Some(endcursor) = param["endcursor"].as_str() {
+        args.push(String::from("-t"));
+        args.push(endcursor.to_owned());
+    }
+
+    let mut lines: Vec<String> = vec![];
+
+    let mut child = Command::new("/usr/bin/mini-journalreader")
+        .args(&args)
+        .stdout(Stdio::piped())
+        .spawn()?;
+
+    if let Some(ref mut stdout) = child.stdout {
+        for line in BufReader::new(stdout).lines() {
+            match line {
+                Ok(line) => {
+                    lines.push(line);
+                }
+                Err(err) => {
+                    log::error!("reading journal failed: {}", err);
+                    let _ = child.kill();
+                    break;
+                }
+            }
+        }
+    }
+
+    let status = child.wait().unwrap();
+    if !status.success() {
+        log::error!("journalctl failed with {}", status);
+    }
+
+    Ok(json!(lines))
+}
+
+pub const ROUTER: Router = Router::new()
+    .get(&API_METHOD_GET_JOURNAL);
index 24c0acf29e743f87c25b1b6bf444c3cf345b9655..de3522d7342a1e14b52291f22eadcc80a04fcc26 100644 (file)
@@ -49,11 +49,10 @@ Ext.define('PBS.ServerAdministration', {
            nodename: 'localhost'
        },
        {
-           xtype: 'proxmoxLogView',
+           xtype: 'proxmoxJournalView',
            itemId: 'logs',
            title: gettext('Syslog'),
-           url: "/api2/extjs/nodes/localhost/syslog",
-           log_select_timespan: 1
+           url: "/api2/extjs/nodes/localhost/journal",
        },
        {
            xtype: 'proxmoxNodeTasks',