all lists on lists.proxmox.com
 help / color / mirror / Atom feed
* [pdm-devel] [PATCH datacenter-manager v2 0/4] system report via admin cli or API
@ 2025-12-01 15:32 Lukas Wagner
  2025-12-01 15:32 ` [pdm-devel] [PATCH datacenter-manager v2 1/4] server: add system report implementation Lukas Wagner
                   ` (5 more replies)
  0 siblings, 6 replies; 7+ messages in thread
From: Lukas Wagner @ 2025-12-01 15:32 UTC (permalink / raw)
  To: pdm-devel

Still missing the UI integration.

Changes since v1:
  - see patch notes in 1/4

Lukas Wagner (4):
  server: add system report implementation
  api: add system report API
  cli: admin: add 'report' command to generate a system report
  pdm-client: add bindings for system report generation

 cli/admin/src/main.rs          |  13 +++
 lib/pdm-client/src/lib.rs      |  10 ++
 server/src/api/nodes/mod.rs    |   2 +
 server/src/api/nodes/report.rs |  32 ++++++
 server/src/lib.rs              |   1 +
 server/src/report.rs           | 198 +++++++++++++++++++++++++++++++++
 6 files changed, 256 insertions(+)
 create mode 100644 server/src/api/nodes/report.rs
 create mode 100644 server/src/report.rs

-- 
2.47.3



_______________________________________________
pdm-devel mailing list
pdm-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pdm-devel


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [pdm-devel] [PATCH datacenter-manager v2 1/4] server: add system report implementation
  2025-12-01 15:32 [pdm-devel] [PATCH datacenter-manager v2 0/4] system report via admin cli or API Lukas Wagner
@ 2025-12-01 15:32 ` Lukas Wagner
  2025-12-01 15:32 ` [pdm-devel] [PATCH datacenter-manager v2 2/4] api: add system report API Lukas Wagner
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: Lukas Wagner @ 2025-12-01 15:32 UTC (permalink / raw)
  To: pdm-devel

This code was taken from PBS and then adapted for PDM. While it could
make sense to refactor and then share some of the helper functions with
PBS, the benefit is rather small (the helpers are relatively trivial)
and now is not the best time for it. The risk and potential consequences
of diverging implementations is small.

Signed-off-by: Lukas Wagner <l.wagner@proxmox.com>
Tested-by: Stefan Hanreich <s.hanreich@proxmox.com>
Reviewed-by: Shannon Sterz  <s.sterz@proxmox.com>
Tested-by: Shannon Sterz  <s.sterz@proxmox.com>
---

Changes since v1:
  - Include some commands for network status
  - Add -T flag to df
  - Change order: Commands -> Functions -> Files

 server/src/lib.rs    |   1 +
 server/src/report.rs | 198 +++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 199 insertions(+)
 create mode 100644 server/src/report.rs

diff --git a/server/src/lib.rs b/server/src/lib.rs
index bd8660a7..5ed10d69 100644
--- a/server/src/lib.rs
+++ b/server/src/lib.rs
@@ -11,6 +11,7 @@ pub mod parallel_fetcher;
 pub mod remote_cache;
 pub mod remote_tasks;
 pub mod remote_updates;
+pub mod report;
 pub mod resource_cache;
 pub mod task_utils;
 pub mod views;
diff --git a/server/src/report.rs b/server/src/report.rs
new file mode 100644
index 00000000..16d562cd
--- /dev/null
+++ b/server/src/report.rs
@@ -0,0 +1,198 @@
+use std::fmt::Write;
+use std::path::Path;
+use std::process::Command;
+
+// TODO: This was copied from PBS. Might make sense to refactor these a little
+// bit and move them a `proxmox-system-report` crate or something.
+
+fn get_top_processes() -> String {
+    let (exe, args) = ("top", vec!["-b", "-c", "-w512", "-n", "1", "-o", "TIME"]);
+    let output = Command::new(exe).args(&args).output();
+    let output = match output {
+        Ok(output) => String::from_utf8_lossy(&output.stdout).to_string(),
+        Err(err) => err.to_string(),
+    };
+    let output = output.lines().take(30).collect::<Vec<&str>>().join("\n");
+    format!("$ `{exe} {}`\n```\n{output}\n```", args.join(" "))
+}
+
+fn files() -> Vec<(&'static str, Vec<&'static str>)> {
+    vec![
+        (
+            "General System Info",
+            vec![
+                "/etc/hostname",
+                "/etc/hosts",
+                "/etc/network/interfaces",
+                "/etc/apt/sources.list",
+                "/etc/apt/sources.list.d/",
+                "/proc/pressure/",
+            ],
+        ),
+        (
+            "User & Access",
+            vec![
+                "/etc/proxmox-datacenter-manager/access/user.cfg",
+                "/etc/proxmox-datacenter-manager/access/acl.cfg",
+            ],
+        ),
+        (
+            "Others",
+            vec![
+                "/etc/proxmox-datacenter-manager/node.cfg",
+                "/etc/proxmox-datacenter-manager/views.cfg",
+            ],
+        ),
+    ]
+}
+
+fn commands() -> Vec<(&'static str, Vec<&'static str>)> {
+    vec![
+        //  ("<command>", vec![<arg [, arg]>])
+        ("date", vec!["-R"]),
+        (
+            "proxmox-datacenter-manager-admin",
+            vec!["versions", "--verbose"],
+        ),
+        ("proxmox-datacenter-manager-admin", vec!["remote", "list"]),
+        // FIXME: Does not exist yet.
+        // ("proxmox-datacenter-manager-admin", vec!["subscription", "get"]),
+        ("proxmox-boot-tool", vec!["status"]),
+        ("df", vec!["-h", "-T"]),
+        (
+            "lsblk",
+            vec![
+                "--ascii",
+                "-M",
+                "-o",
+                "+HOTPLUG,ROTA,PHY-SEC,FSTYPE,MODEL,TRAN",
+            ],
+        ),
+        ("ls", vec!["-l", "/dev/disk/by-id", "/dev/disk/by-path"]),
+        ("zpool", vec!["status"]),
+        ("zfs", vec!["list"]),
+        ("arcstat", vec![]),
+        ("ip", vec!["-details", "-statistics", "address"]),
+        ("ip", vec!["-4", "route", "show"]),
+        ("ip", vec!["-6", "route", "show"]),
+    ]
+}
+
+// (description, function())
+type FunctionMapping = (&'static str, fn() -> String);
+
+fn function_calls() -> Vec<FunctionMapping> {
+    vec![("System Load & Uptime", get_top_processes)]
+}
+
+fn get_file_content(file: impl AsRef<Path>) -> String {
+    use proxmox_sys::fs::file_read_optional_string;
+    let content = match file_read_optional_string(&file) {
+        Ok(Some(content)) => content,
+        Ok(None) => String::from("# file does not exist"),
+        Err(err) => err.to_string(),
+    };
+    let file_name = file.as_ref().display();
+    format!("`$ cat '{file_name}'`\n```\n{}\n```", content.trim_end())
+}
+
+fn get_directory_content(path: impl AsRef<Path>) -> String {
+    let read_dir_iter = match std::fs::read_dir(&path) {
+        Ok(iter) => iter,
+        Err(err) => {
+            return format!(
+                "`$ cat '{}*'`\n```\n# read dir failed - {err}\n```",
+                path.as_ref().display(),
+            );
+        }
+    };
+    let mut out = String::new();
+    let mut first = true;
+    for entry in read_dir_iter {
+        let entry = match entry {
+            Ok(entry) => entry,
+            Err(err) => {
+                let _ = writeln!(out, "error during read-dir - {err}");
+                continue;
+            }
+        };
+        let path = entry.path();
+        if path.is_file() {
+            if first {
+                let _ = writeln!(out, "{}", get_file_content(path));
+                first = false;
+            } else {
+                let _ = writeln!(out, "\n{}", get_file_content(path));
+            }
+        } else {
+            let _ = writeln!(out, "skipping sub-directory `{}`", path.display());
+        }
+    }
+    out
+}
+
+fn get_command_output(exe: &str, args: &Vec<&str>) -> String {
+    let output = Command::new(exe)
+        .env("PROXMOX_OUTPUT_NO_BORDER", "1")
+        .args(args)
+        .output();
+    let output = match output {
+        Ok(output) => {
+            let mut out = String::from_utf8_lossy(&output.stdout)
+                .trim_end()
+                .to_string();
+            let stderr = String::from_utf8_lossy(&output.stderr)
+                .trim_end()
+                .to_string();
+            if !stderr.is_empty() {
+                let _ = writeln!(out, "\n```\nSTDERR:\n```\n{stderr}");
+            }
+            out
+        }
+        Err(err) => err.to_string(),
+    };
+    format!("$ `{exe} {}`\n```\n{output}\n```", args.join(" "))
+}
+
+pub fn generate_report() -> String {
+    let file_contents = files()
+        .iter()
+        .map(|group| {
+            let (group, files) = group;
+            let group_content = files
+                .iter()
+                .map(|file_name| {
+                    let path = Path::new(file_name);
+                    if path.is_dir() {
+                        get_directory_content(path)
+                    } else {
+                        get_file_content(file_name)
+                    }
+                })
+                .collect::<Vec<String>>()
+                .join("\n\n");
+
+            format!("### {group}\n\n{group_content}")
+        })
+        .collect::<Vec<String>>()
+        .join("\n\n");
+
+    let command_outputs = commands()
+        .iter()
+        .map(|(command, args)| get_command_output(command, args))
+        .collect::<Vec<String>>()
+        .join("\n\n");
+
+    let function_outputs = function_calls()
+        .iter()
+        .map(|(desc, function)| {
+            let output = function();
+            format!("#### {desc}\n{}\n", output.trim_end())
+        })
+        .collect::<Vec<String>>()
+        .join("\n\n");
+
+    format!(
+        "## COMMANDS \n\n {command_outputs}\n\n## FUNCTIONS\n\n{function_outputs}\n## FILES\n\n{file_contents}\n"
+    )
+}
-- 
2.47.3



_______________________________________________
pdm-devel mailing list
pdm-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pdm-devel


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [pdm-devel] [PATCH datacenter-manager v2 2/4] api: add system report API
  2025-12-01 15:32 [pdm-devel] [PATCH datacenter-manager v2 0/4] system report via admin cli or API Lukas Wagner
  2025-12-01 15:32 ` [pdm-devel] [PATCH datacenter-manager v2 1/4] server: add system report implementation Lukas Wagner
@ 2025-12-01 15:32 ` Lukas Wagner
  2025-12-01 15:32 ` [pdm-devel] [PATCH datacenter-manager v2 3/4] cli: admin: add 'report' command to generate a system report Lukas Wagner
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: Lukas Wagner @ 2025-12-01 15:32 UTC (permalink / raw)
  To: pdm-devel

Adds a new API endpoint under /nodes/localhost/report which returns the
system report. To access it, the user/token needs Sys.Audit on
/system/status, same as in PBS.

Signed-off-by: Lukas Wagner <l.wagner@proxmox.com>
Tested-by: Stefan Hanreich <s.hanreich@proxmox.com>
Reviewed-by: Shannon Sterz  <s.sterz@proxmox.com>
Tested-by: Shannon Sterz  <s.sterz@proxmox.com>
---
 server/src/api/nodes/mod.rs    |  2 ++
 server/src/api/nodes/report.rs | 32 ++++++++++++++++++++++++++++++++
 2 files changed, 34 insertions(+)
 create mode 100644 server/src/api/nodes/report.rs

diff --git a/server/src/api/nodes/mod.rs b/server/src/api/nodes/mod.rs
index a0fe14ab..d6dadb80 100644
--- a/server/src/api/nodes/mod.rs
+++ b/server/src/api/nodes/mod.rs
@@ -9,6 +9,7 @@ pub mod config;
 pub mod dns;
 pub mod journal;
 pub mod network;
+pub mod report;
 pub mod rrddata;
 pub mod status;
 pub mod syslog;
@@ -44,6 +45,7 @@ pub const SUBDIRS: SubdirMap = &sorted!([
     ("dns", &dns::ROUTER),
     ("journal", &journal::ROUTER),
     ("network", &network::ROUTER),
+    ("report", &report::ROUTER),
     ("rrdata", &rrddata::ROUTER),
     ("status", &status::ROUTER),
     ("syslog", &syslog::ROUTER),
diff --git a/server/src/api/nodes/report.rs b/server/src/api/nodes/report.rs
new file mode 100644
index 00000000..f8c41000
--- /dev/null
+++ b/server/src/api/nodes/report.rs
@@ -0,0 +1,32 @@
+use anyhow::Error;
+
+use proxmox_router::{Permission, Router};
+use proxmox_schema::api;
+
+use pdm_api_types::{NODE_SCHEMA, PRIV_SYS_AUDIT};
+
+use crate::report;
+
+#[api(
+    protected: true,
+    input: {
+        properties: {
+            node: {
+                schema: NODE_SCHEMA,
+            },
+        },
+    },
+    returns: {
+        type: String,
+        description: "The system report for this PDM node.",
+    },
+    access: {
+        permission: &Permission::Privilege(&["system", "status"], PRIV_SYS_AUDIT, false),
+    }
+)]
+/// Get the system report for this node.
+pub fn generate_system_report() -> Result<String, Error> {
+    Ok(report::generate_report())
+}
+
+pub const ROUTER: Router = Router::new().get(&API_METHOD_GENERATE_SYSTEM_REPORT);
-- 
2.47.3



_______________________________________________
pdm-devel mailing list
pdm-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pdm-devel


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [pdm-devel] [PATCH datacenter-manager v2 3/4] cli: admin: add 'report' command to generate a system report
  2025-12-01 15:32 [pdm-devel] [PATCH datacenter-manager v2 0/4] system report via admin cli or API Lukas Wagner
  2025-12-01 15:32 ` [pdm-devel] [PATCH datacenter-manager v2 1/4] server: add system report implementation Lukas Wagner
  2025-12-01 15:32 ` [pdm-devel] [PATCH datacenter-manager v2 2/4] api: add system report API Lukas Wagner
@ 2025-12-01 15:32 ` Lukas Wagner
  2025-12-01 15:32 ` [pdm-devel] [PATCH datacenter-manager v2 4/4] pdm-client: add bindings for system report generation Lukas Wagner
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: Lukas Wagner @ 2025-12-01 15:32 UTC (permalink / raw)
  To: pdm-devel

This adds the 'proxmox-datacenter-manager-admin report' command, which
prints the system report to the console.

Signed-off-by: Lukas Wagner <l.wagner@proxmox.com>
Tested-by: Stefan Hanreich <s.hanreich@proxmox.com>
Reviewed-by: Shannon Sterz  <s.sterz@proxmox.com>
Tested-by: Shannon Sterz  <s.sterz@proxmox.com>
---
 cli/admin/src/main.rs | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/cli/admin/src/main.rs b/cli/admin/src/main.rs
index 19d387f8..e6a74df2 100644
--- a/cli/admin/src/main.rs
+++ b/cli/admin/src/main.rs
@@ -32,6 +32,10 @@ fn main() {
 
     let cmd_def = CliCommandMap::new()
         .insert("remote", remotes::cli())
+        .insert(
+            "report",
+            CliCommand::new(&API_METHOD_GENERATE_SYSTEM_REPORT),
+        )
         .insert("versions", CliCommand::new(&API_METHOD_GET_VERSIONS));
 
     let mut rpcenv = CliEnvironment::new();
@@ -83,3 +87,12 @@ async fn get_versions(verbose: bool, param: Value) -> Result<Value, anyhow::Erro
 
     Ok(Value::Null)
 }
+
+#[api]
+/// Generate the system report.
+async fn generate_system_report() -> Result<(), anyhow::Error> {
+    let report = server::api::nodes::report::generate_system_report()?;
+    print!("{report}");
+
+    Ok(())
+}
-- 
2.47.3



_______________________________________________
pdm-devel mailing list
pdm-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pdm-devel


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [pdm-devel] [PATCH datacenter-manager v2 4/4] pdm-client: add bindings for system report generation
  2025-12-01 15:32 [pdm-devel] [PATCH datacenter-manager v2 0/4] system report via admin cli or API Lukas Wagner
                   ` (2 preceding siblings ...)
  2025-12-01 15:32 ` [pdm-devel] [PATCH datacenter-manager v2 3/4] cli: admin: add 'report' command to generate a system report Lukas Wagner
@ 2025-12-01 15:32 ` Lukas Wagner
  2025-12-01 15:42 ` [pdm-devel] [PATCH datacenter-manager v2 0/4] system report via admin cli or API Shannon Sterz
  2025-12-01 18:26 ` [pdm-devel] applied: " Thomas Lamprecht
  5 siblings, 0 replies; 7+ messages in thread
From: Lukas Wagner @ 2025-12-01 15:32 UTC (permalink / raw)
  To: pdm-devel

This adds bindings for the `/nodes/localhost/report` endpoint which
returns a system report.

Signed-off-by: Lukas Wagner <l.wagner@proxmox.com>
Tested-by: Stefan Hanreich <s.hanreich@proxmox.com>
Reviewed-by: Shannon Sterz  <s.sterz@proxmox.com>
Tested-by: Shannon Sterz  <s.sterz@proxmox.com>
---
 lib/pdm-client/src/lib.rs | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/lib/pdm-client/src/lib.rs b/lib/pdm-client/src/lib.rs
index ddca3958..db92c1ef 100644
--- a/lib/pdm-client/src/lib.rs
+++ b/lib/pdm-client/src/lib.rs
@@ -1313,6 +1313,16 @@ impl<T: HttpApiClient> PdmClient<T> {
             .expect_json()?
             .data)
     }
+
+    /// Get remote update summary.
+    pub async fn generate_system_report(&self) -> Result<String, Error> {
+        Ok(self
+            .0
+            .get("/api2/extjs/nodes/localhost/report")
+            .await?
+            .expect_json()?
+            .data)
+    }
 }
 
 /// Builder for migration parameters.
-- 
2.47.3



_______________________________________________
pdm-devel mailing list
pdm-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pdm-devel


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [pdm-devel] [PATCH datacenter-manager v2 0/4] system report via admin cli or API
  2025-12-01 15:32 [pdm-devel] [PATCH datacenter-manager v2 0/4] system report via admin cli or API Lukas Wagner
                   ` (3 preceding siblings ...)
  2025-12-01 15:32 ` [pdm-devel] [PATCH datacenter-manager v2 4/4] pdm-client: add bindings for system report generation Lukas Wagner
@ 2025-12-01 15:42 ` Shannon Sterz
  2025-12-01 18:26 ` [pdm-devel] applied: " Thomas Lamprecht
  5 siblings, 0 replies; 7+ messages in thread
From: Shannon Sterz @ 2025-12-01 15:42 UTC (permalink / raw)
  To: Lukas Wagner; +Cc: Proxmox Datacenter Manager development discussion

On Mon Dec 1, 2025 at 4:32 PM CET, Lukas Wagner wrote:
> Still missing the UI integration.
>
> Changes since v1:
>   - see patch notes in 1/4
>
> Lukas Wagner (4):
>   server: add system report implementation
>   api: add system report API
>   cli: admin: add 'report' command to generate a system report
>   pdm-client: add bindings for system report generation
>
>  cli/admin/src/main.rs          |  13 +++
>  lib/pdm-client/src/lib.rs      |  10 ++
>  server/src/api/nodes/mod.rs    |   2 +
>  server/src/api/nodes/report.rs |  32 ++++++
>  server/src/lib.rs              |   1 +
>  server/src/report.rs           | 198 +++++++++++++++++++++++++++++++++
>  6 files changed, 256 insertions(+)
>  create mode 100644 server/src/api/nodes/report.rs
>  create mode 100644 server/src/report.rs

did another smoke test of this, the new commands are included, df and
the order is adapted. lgtm


_______________________________________________
pdm-devel mailing list
pdm-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pdm-devel


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [pdm-devel] applied: [PATCH datacenter-manager v2 0/4] system report via admin cli or API
  2025-12-01 15:32 [pdm-devel] [PATCH datacenter-manager v2 0/4] system report via admin cli or API Lukas Wagner
                   ` (4 preceding siblings ...)
  2025-12-01 15:42 ` [pdm-devel] [PATCH datacenter-manager v2 0/4] system report via admin cli or API Shannon Sterz
@ 2025-12-01 18:26 ` Thomas Lamprecht
  5 siblings, 0 replies; 7+ messages in thread
From: Thomas Lamprecht @ 2025-12-01 18:26 UTC (permalink / raw)
  To: pdm-devel, Lukas Wagner

On Mon, 01 Dec 2025 16:32:25 +0100, Lukas Wagner wrote:
> Still missing the UI integration.
> 
> Changes since v1:
>   - see patch notes in 1/4
> 
> Lukas Wagner (4):
>   server: add system report implementation
>   api: add system report API
>   cli: admin: add 'report' command to generate a system report
>   pdm-client: add bindings for system report generation
> 
> [...]

Applied, thanks!

[1/4] server: add system report implementation
      commit: 4a9abc993f0739a5779f5ca4da010eb791dd224c
[2/4] api: add system report API
      commit: f326682b7dfcb8834b21456ff34fcf0f02a257df
[3/4] cli: admin: add 'report' command to generate a system report
      commit: 32aa62299ec249e14d46e9219882e7193621d919
[4/4] pdm-client: add bindings for system report generation
      commit: cb8c55517b7431ba1181f829fd07edeb9b3c1bca


_______________________________________________
pdm-devel mailing list
pdm-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pdm-devel


^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2025-12-01 18:27 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-12-01 15:32 [pdm-devel] [PATCH datacenter-manager v2 0/4] system report via admin cli or API Lukas Wagner
2025-12-01 15:32 ` [pdm-devel] [PATCH datacenter-manager v2 1/4] server: add system report implementation Lukas Wagner
2025-12-01 15:32 ` [pdm-devel] [PATCH datacenter-manager v2 2/4] api: add system report API Lukas Wagner
2025-12-01 15:32 ` [pdm-devel] [PATCH datacenter-manager v2 3/4] cli: admin: add 'report' command to generate a system report Lukas Wagner
2025-12-01 15:32 ` [pdm-devel] [PATCH datacenter-manager v2 4/4] pdm-client: add bindings for system report generation Lukas Wagner
2025-12-01 15:42 ` [pdm-devel] [PATCH datacenter-manager v2 0/4] system report via admin cli or API Shannon Sterz
2025-12-01 18:26 ` [pdm-devel] applied: " Thomas Lamprecht

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal