diff --git a/Cargo.toml b/Cargo.toml index 76fb4d41..f6e8b26c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -37,7 +37,7 @@ pam = "0.7" pam-sys = "0.5" percent-encoding = "2.1" pin-utils = "0.1.0" -proxmox = { version = "0.1.30", features = [ "sortable-macro", "api-macro" ] } +proxmox = { version = "0.1.31", features = [ "sortable-macro", "api-macro" ] } #proxmox = { git = "ssh://gitolite3@proxdev.maurer-it.com/rust/proxmox", version = "0.1.2", features = [ "sortable-macro", "api-macro" ] } #proxmox = { path = "../proxmox/proxmox", features = [ "sortable-macro", "api-macro" ] } regex = "1.2" diff --git a/src/api2/backup/environment.rs b/src/api2/backup/environment.rs index 863ad764..08c2cdc9 100644 --- a/src/api2/backup/environment.rs +++ b/src/api2/backup/environment.rs @@ -2,7 +2,7 @@ use anyhow::{bail, Error}; use std::sync::{Arc, Mutex}; use std::collections::HashMap; -use serde_json::Value; +use serde_json::{json, Value}; use proxmox::tools::digest_to_hex; use proxmox::tools::fs::{replace_file, CreateOptions}; @@ -80,7 +80,7 @@ impl SharedBackupState { #[derive(Clone)] pub struct BackupEnvironment { env_type: RpcEnvironmentType, - result_attributes: HashMap, + result_attributes: Value, user: String, pub debug: bool, pub formatter: &'static OutputFormatter, @@ -110,7 +110,7 @@ impl BackupEnvironment { }; Self { - result_attributes: HashMap::new(), + result_attributes: json!({}), env_type, user, worker, @@ -480,12 +480,12 @@ impl BackupEnvironment { impl RpcEnvironment for BackupEnvironment { - fn set_result_attrib(&mut self, name: &str, value: Value) { - self.result_attributes.insert(name.into(), value); + fn result_attrib_mut(&mut self) -> &mut Value { + &mut self.result_attributes } - fn get_result_attrib(&self, name: &str) -> Option<&Value> { - self.result_attributes.get(name) + fn result_attrib(&self) -> &Value { + &self.result_attributes } fn env_type(&self) -> RpcEnvironmentType { diff --git a/src/api2/node/network.rs b/src/api2/node/network.rs index 56b6ff1d..352be401 100644 --- a/src/api2/node/network.rs +++ b/src/api2/node/network.rs @@ -66,7 +66,7 @@ fn check_duplicate_gateway_v6(config: &NetworkConfig, iface: &str) -> Result<(), pub fn list_network_devices( _param: Value, _info: &ApiMethod, - rpcenv: &mut dyn RpcEnvironment, + mut rpcenv: &mut dyn RpcEnvironment, ) -> Result { let (config, digest) = network::config()?; @@ -84,7 +84,7 @@ pub fn list_network_devices( let diff = network::changes()?; if !diff.is_empty() { - rpcenv.set_result_attrib("changes", diff.into()); + rpcenv["changes"] = diff.into(); } Ok(list.into()) diff --git a/src/api2/node/syslog.rs b/src/api2/node/syslog.rs index 555d0d46..8bd7b4c4 100644 --- a/src/api2/node/syslog.rs +++ b/src/api2/node/syslog.rs @@ -131,7 +131,7 @@ fn dump_journal( fn get_syslog( param: Value, _info: &ApiMethod, - rpcenv: &mut dyn RpcEnvironment, + mut rpcenv: &mut dyn RpcEnvironment, ) -> Result { let (count, lines) = dump_journal( @@ -141,7 +141,7 @@ fn get_syslog( param["until"].as_str(), param["service"].as_str())?; - rpcenv.set_result_attrib("total", Value::from(count)); + rpcenv["total"] = Value::from(count); Ok(json!(lines)) } diff --git a/src/api2/node/tasks.rs b/src/api2/node/tasks.rs index 30d91313..77472a0b 100644 --- a/src/api2/node/tasks.rs +++ b/src/api2/node/tasks.rs @@ -156,7 +156,7 @@ fn extract_upid(param: &Value) -> Result { /// Read task log. async fn read_task_log( param: Value, - rpcenv: &mut dyn RpcEnvironment, + mut rpcenv: &mut dyn RpcEnvironment, ) -> Result { let upid = extract_upid(¶m)?; @@ -199,11 +199,11 @@ async fn read_task_log( } } - rpcenv.set_result_attrib("total", Value::from(count)); + rpcenv["total"] = Value::from(count); if test_status { let active = crate::server::worker_is_active(&upid).await?; - rpcenv.set_result_attrib("active", Value::from(active)); + rpcenv["active"] = Value::from(active); } Ok(json!(lines)) @@ -304,7 +304,7 @@ pub fn list_tasks( errors: bool, running: bool, param: Value, - rpcenv: &mut dyn RpcEnvironment, + mut rpcenv: &mut dyn RpcEnvironment, ) -> Result, Error> { let username = rpcenv.get_user().unwrap(); @@ -382,7 +382,7 @@ pub fn list_tasks( if (result.len() as u64) < limit { result.push(entry); }; } - rpcenv.set_result_attrib("total", Value::from(count)); + rpcenv["total"] = Value::from(count); Ok(result) } diff --git a/src/api2/reader/environment.rs b/src/api2/reader/environment.rs index a5a5fe23..623be36a 100644 --- a/src/api2/reader/environment.rs +++ b/src/api2/reader/environment.rs @@ -1,8 +1,7 @@ //use anyhow::{bail, format_err, Error}; use std::sync::Arc; -use std::collections::HashMap; -use serde_json::Value; +use serde_json::{json, Value}; use proxmox::api::{RpcEnvironment, RpcEnvironmentType}; @@ -16,7 +15,7 @@ use crate::server::formatter::*; #[derive(Clone)] pub struct ReaderEnvironment { env_type: RpcEnvironmentType, - result_attributes: HashMap, + result_attributes: Value, user: String, pub debug: bool, pub formatter: &'static OutputFormatter, @@ -37,7 +36,7 @@ impl ReaderEnvironment { Self { - result_attributes: HashMap::new(), + result_attributes: json!({}), env_type, user, worker, @@ -61,12 +60,12 @@ impl ReaderEnvironment { impl RpcEnvironment for ReaderEnvironment { - fn set_result_attrib(&mut self, name: &str, value: Value) { - self.result_attributes.insert(name.into(), value); + fn result_attrib_mut(&mut self) -> &mut Value { + &mut self.result_attributes } - fn get_result_attrib(&self, name: &str) -> Option<&Value> { - self.result_attributes.get(name) + fn result_attrib(&self) -> &Value { + &self.result_attributes } fn env_type(&self) -> RpcEnvironmentType { diff --git a/src/bin/proxmox-backup-manager.rs b/src/bin/proxmox-backup-manager.rs index 756d3763..6369eb6a 100644 --- a/src/bin/proxmox-backup-manager.rs +++ b/src/bin/proxmox-backup-manager.rs @@ -262,11 +262,9 @@ fn list_network_devices(mut param: Value, rpcenv: &mut dyn RpcEnvironment) -> Re _ => unreachable!(), }; - if let Some(changes) = rpcenv.get_result_attrib("changes") { - if let Some(diff) = changes.as_str() { - if output_format == "text" { - eprintln!("pending changes:\n{}\n", diff); - } + if let Value::String(ref diff) = rpcenv["changes"] { + if output_format == "text" { + eprintln!("pending changes:\n{}\n", diff); } } @@ -339,10 +337,8 @@ fn pending_network_changes(mut param: Value, rpcenv: &mut dyn RpcEnvironment) -> _ => unreachable!(), }; - if let Some(changes) = rpcenv.get_result_attrib("changes") { - if let Some(diff) = changes.as_str() { - println!("{}", diff); - } + if let Value::String(ref diff) = rpcenv["changes"] { + println!("{}", diff); } Ok(Value::Null) diff --git a/src/server/environment.rs b/src/server/environment.rs index 9e026997..10ff958c 100644 --- a/src/server/environment.rs +++ b/src/server/environment.rs @@ -1,19 +1,18 @@ -use std::collections::HashMap; -use serde_json::Value; +use serde_json::{json, Value}; use proxmox::api::{RpcEnvironment, RpcEnvironmentType}; /// Encapsulates information about the runtime environment pub struct RestEnvironment { env_type: RpcEnvironmentType, - result_attributes: HashMap, + result_attributes: Value, user: Option, } impl RestEnvironment { pub fn new(env_type: RpcEnvironmentType) -> Self { Self { - result_attributes: HashMap::new(), + result_attributes: json!({}), user: None, env_type, } @@ -22,12 +21,12 @@ impl RestEnvironment { impl RpcEnvironment for RestEnvironment { - fn set_result_attrib(&mut self, name: &str, value: Value) { - self.result_attributes.insert(name.into(), value); + fn result_attrib_mut (&mut self) -> &mut Value { + &mut self.result_attributes } - fn get_result_attrib(&self, name: &str) -> Option<&Value> { - self.result_attributes.get(name) + fn result_attrib(&self) -> &Value { + &self.result_attributes } fn env_type(&self) -> RpcEnvironmentType { diff --git a/src/server/formatter.rs b/src/server/formatter.rs index 47b9b998..8818e671 100644 --- a/src/server/formatter.rs +++ b/src/server/formatter.rs @@ -41,16 +41,13 @@ pub fn json_data_response(data: Value) -> Response { fn add_result_attributes(result: &mut Value, rpcenv: &dyn RpcEnvironment) { - if let Some(total) = rpcenv.get_result_attrib("total").and_then(|v| v.as_u64()) { - result["total"] = Value::from(total); - } + let attributes = match rpcenv.result_attrib().as_object() { + Some(attr) => attr, + None => return, + }; - if let Some(active) = rpcenv.get_result_attrib("active").and_then(|v| v.as_bool()) { - result["active"] = Value::from(active); - } - - if let Some(changes) = rpcenv.get_result_attrib("changes") { - result["changes"] = changes.clone(); + for (key, value) in attributes { + result[key] = value.clone(); } }