diff --git a/src/bin/proxmox-backup-manager.rs b/src/bin/proxmox-backup-manager.rs index e52c2f76..60af205f 100644 --- a/src/bin/proxmox-backup-manager.rs +++ b/src/bin/proxmox-backup-manager.rs @@ -363,6 +363,81 @@ async fn report() -> Result { Ok(Value::Null) } +#[api( + input: { + properties: { + verbose: { + type: Boolean, + optional: true, + default: false, + description: "Output verbose package information. It is ignored if output-format is specified.", + }, + "output-format": { + schema: OUTPUT_FORMAT, + optional: true, + } + } + } +)] +/// List package versions for important Proxmox Backup Server packages. +async fn get_versions(verbose: bool, param: Value) -> Result { + let output_format = param.get("output-format"); + + if !verbose && output_format.is_none() { + let pkg_version = format!( + "{}.{}", + crate::api2::version::PROXMOX_PKG_VERSION, + crate::api2::version::PROXMOX_PKG_RELEASE + ); + let running_kernel = nix::sys::utsname::uname().release().to_owned(); + + println!( + "proxmox-backup-server/{} (running kernel: {})", + pkg_version, running_kernel + ); + return Ok(Value::Null); + } + + let mut packages = crate::api2::node::apt::get_versions()?; + if let Some(output_format) = output_format { + if let Some(output_format) = output_format.as_str() { + let options = TableFormatOptions::default(); + format_and_print_result_full( + &mut packages, + &crate::api2::node::apt::API_RETURN_SCHEMA_GET_VERSIONS, + output_format, + &options, + ); + } + } else { + // pveversion style print + let packages: Vec = serde_json::from_value(packages)?; + for pkg in packages { + let mut version = "not correctly installed"; + if !pkg.old_version.is_empty() && &pkg.old_version != "unknown" { + version = &pkg.old_version; + } + + if let Some(extra_info) = pkg.extra_info { + println!( + "{}: {} ({})", + pkg.package, + version, + extra_info + ); + } else { + println!( + "{}: {}", + pkg.package, + version, + ); + } + } + } + + Ok(Value::Null) +} + fn main() { proxmox_backup::tools::setup_safe_path_env(); @@ -396,6 +471,9 @@ fn main() { ) .insert("report", CliCommand::new(&API_METHOD_REPORT) + ) + .insert("versions", + CliCommand::new(&API_METHOD_GET_VERSIONS) ); diff --git a/src/server/report.rs b/src/server/report.rs index bc2179b9..848aa326 100644 --- a/src/server/report.rs +++ b/src/server/report.rs @@ -20,6 +20,7 @@ fn files() -> Vec<&'static str> { fn commands() -> Vec<(&'static str, Vec<&'static str>)> { vec![ // ("", vec![]) + ("proxmox-backup-manager", vec!["versions", "--verbose"]), ("df", vec!["-h"]), ("lsblk", vec!["--ascii"]), ("zpool", vec!["status"]),