depend on proxmox 0.1.31 - use Value to store result metadata
This commit is contained in:
		@ -37,7 +37,7 @@ pam = "0.7"
 | 
				
			|||||||
pam-sys = "0.5"
 | 
					pam-sys = "0.5"
 | 
				
			||||||
percent-encoding = "2.1"
 | 
					percent-encoding = "2.1"
 | 
				
			||||||
pin-utils = "0.1.0"
 | 
					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 = { 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" ] }
 | 
					#proxmox = { path = "../proxmox/proxmox", features = [ "sortable-macro", "api-macro" ] }
 | 
				
			||||||
regex = "1.2"
 | 
					regex = "1.2"
 | 
				
			||||||
 | 
				
			|||||||
@ -2,7 +2,7 @@ use anyhow::{bail, Error};
 | 
				
			|||||||
use std::sync::{Arc, Mutex};
 | 
					use std::sync::{Arc, Mutex};
 | 
				
			||||||
use std::collections::HashMap;
 | 
					use std::collections::HashMap;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use serde_json::Value;
 | 
					use serde_json::{json, Value};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use proxmox::tools::digest_to_hex;
 | 
					use proxmox::tools::digest_to_hex;
 | 
				
			||||||
use proxmox::tools::fs::{replace_file, CreateOptions};
 | 
					use proxmox::tools::fs::{replace_file, CreateOptions};
 | 
				
			||||||
@ -80,7 +80,7 @@ impl SharedBackupState {
 | 
				
			|||||||
#[derive(Clone)]
 | 
					#[derive(Clone)]
 | 
				
			||||||
pub struct BackupEnvironment {
 | 
					pub struct BackupEnvironment {
 | 
				
			||||||
    env_type: RpcEnvironmentType,
 | 
					    env_type: RpcEnvironmentType,
 | 
				
			||||||
    result_attributes: HashMap<String, Value>,
 | 
					    result_attributes: Value,
 | 
				
			||||||
    user: String,
 | 
					    user: String,
 | 
				
			||||||
    pub debug: bool,
 | 
					    pub debug: bool,
 | 
				
			||||||
    pub formatter: &'static OutputFormatter,
 | 
					    pub formatter: &'static OutputFormatter,
 | 
				
			||||||
@ -110,7 +110,7 @@ impl BackupEnvironment {
 | 
				
			|||||||
        };
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        Self {
 | 
					        Self {
 | 
				
			||||||
            result_attributes: HashMap::new(),
 | 
					            result_attributes: json!({}),
 | 
				
			||||||
            env_type,
 | 
					            env_type,
 | 
				
			||||||
            user,
 | 
					            user,
 | 
				
			||||||
            worker,
 | 
					            worker,
 | 
				
			||||||
@ -480,12 +480,12 @@ impl BackupEnvironment {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
impl RpcEnvironment for BackupEnvironment {
 | 
					impl RpcEnvironment for BackupEnvironment {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    fn set_result_attrib(&mut self, name: &str, value: Value) {
 | 
					    fn result_attrib_mut(&mut self) -> &mut Value {
 | 
				
			||||||
        self.result_attributes.insert(name.into(), value);
 | 
					        &mut self.result_attributes
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    fn get_result_attrib(&self, name: &str) -> Option<&Value> {
 | 
					    fn result_attrib(&self) -> &Value {
 | 
				
			||||||
        self.result_attributes.get(name)
 | 
					        &self.result_attributes
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    fn env_type(&self) -> RpcEnvironmentType {
 | 
					    fn env_type(&self) -> RpcEnvironmentType {
 | 
				
			||||||
 | 
				
			|||||||
@ -66,7 +66,7 @@ fn check_duplicate_gateway_v6(config: &NetworkConfig, iface: &str) -> Result<(),
 | 
				
			|||||||
pub fn list_network_devices(
 | 
					pub fn list_network_devices(
 | 
				
			||||||
    _param: Value,
 | 
					    _param: Value,
 | 
				
			||||||
    _info: &ApiMethod,
 | 
					    _info: &ApiMethod,
 | 
				
			||||||
    rpcenv: &mut dyn RpcEnvironment,
 | 
					    mut rpcenv: &mut dyn RpcEnvironment,
 | 
				
			||||||
) -> Result<Value, Error> {
 | 
					) -> Result<Value, Error> {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let (config, digest) = network::config()?;
 | 
					    let (config, digest) = network::config()?;
 | 
				
			||||||
@ -84,7 +84,7 @@ pub fn list_network_devices(
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    let diff = network::changes()?;
 | 
					    let diff = network::changes()?;
 | 
				
			||||||
    if !diff.is_empty() {
 | 
					    if !diff.is_empty() {
 | 
				
			||||||
        rpcenv.set_result_attrib("changes",  diff.into());
 | 
					        rpcenv["changes"] = diff.into();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Ok(list.into())
 | 
					    Ok(list.into())
 | 
				
			||||||
 | 
				
			|||||||
@ -131,7 +131,7 @@ fn dump_journal(
 | 
				
			|||||||
fn get_syslog(
 | 
					fn get_syslog(
 | 
				
			||||||
    param: Value,
 | 
					    param: Value,
 | 
				
			||||||
    _info: &ApiMethod,
 | 
					    _info: &ApiMethod,
 | 
				
			||||||
    rpcenv: &mut dyn RpcEnvironment,
 | 
					    mut rpcenv: &mut dyn RpcEnvironment,
 | 
				
			||||||
) -> Result<Value, Error> {
 | 
					) -> Result<Value, Error> {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let (count, lines) = dump_journal(
 | 
					    let (count, lines) = dump_journal(
 | 
				
			||||||
@ -141,7 +141,7 @@ fn get_syslog(
 | 
				
			|||||||
        param["until"].as_str(),
 | 
					        param["until"].as_str(),
 | 
				
			||||||
        param["service"].as_str())?;
 | 
					        param["service"].as_str())?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    rpcenv.set_result_attrib("total", Value::from(count));
 | 
					    rpcenv["total"] = Value::from(count);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Ok(json!(lines))
 | 
					    Ok(json!(lines))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -156,7 +156,7 @@ fn extract_upid(param: &Value) -> Result<UPID, Error> {
 | 
				
			|||||||
/// Read task log.
 | 
					/// Read task log.
 | 
				
			||||||
async fn read_task_log(
 | 
					async fn read_task_log(
 | 
				
			||||||
    param: Value,
 | 
					    param: Value,
 | 
				
			||||||
    rpcenv: &mut dyn RpcEnvironment,
 | 
					    mut rpcenv: &mut dyn RpcEnvironment,
 | 
				
			||||||
) -> Result<Value, Error> {
 | 
					) -> Result<Value, Error> {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let upid = extract_upid(¶m)?;
 | 
					    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 {
 | 
					    if test_status {
 | 
				
			||||||
        let active = crate::server::worker_is_active(&upid).await?;
 | 
					        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))
 | 
					    Ok(json!(lines))
 | 
				
			||||||
@ -304,7 +304,7 @@ pub fn list_tasks(
 | 
				
			|||||||
    errors: bool,
 | 
					    errors: bool,
 | 
				
			||||||
    running: bool,
 | 
					    running: bool,
 | 
				
			||||||
    param: Value,
 | 
					    param: Value,
 | 
				
			||||||
    rpcenv: &mut dyn RpcEnvironment,
 | 
					    mut rpcenv: &mut dyn RpcEnvironment,
 | 
				
			||||||
) -> Result<Vec<TaskListItem>, Error> {
 | 
					) -> Result<Vec<TaskListItem>, Error> {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let username = rpcenv.get_user().unwrap();
 | 
					    let username = rpcenv.get_user().unwrap();
 | 
				
			||||||
@ -382,7 +382,7 @@ pub fn list_tasks(
 | 
				
			|||||||
        if (result.len() as u64) < limit { result.push(entry); };
 | 
					        if (result.len() as u64) < limit { result.push(entry); };
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    rpcenv.set_result_attrib("total", Value::from(count));
 | 
					    rpcenv["total"] = Value::from(count);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Ok(result)
 | 
					    Ok(result)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -1,8 +1,7 @@
 | 
				
			|||||||
//use anyhow::{bail, format_err, Error};
 | 
					//use anyhow::{bail, format_err, Error};
 | 
				
			||||||
use std::sync::Arc;
 | 
					use std::sync::Arc;
 | 
				
			||||||
use std::collections::HashMap;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
use serde_json::Value;
 | 
					use serde_json::{json, Value};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use proxmox::api::{RpcEnvironment, RpcEnvironmentType};
 | 
					use proxmox::api::{RpcEnvironment, RpcEnvironmentType};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -16,7 +15,7 @@ use crate::server::formatter::*;
 | 
				
			|||||||
#[derive(Clone)]
 | 
					#[derive(Clone)]
 | 
				
			||||||
pub struct ReaderEnvironment {
 | 
					pub struct ReaderEnvironment {
 | 
				
			||||||
    env_type: RpcEnvironmentType,
 | 
					    env_type: RpcEnvironmentType,
 | 
				
			||||||
    result_attributes: HashMap<String, Value>,
 | 
					    result_attributes: Value,
 | 
				
			||||||
    user: String,
 | 
					    user: String,
 | 
				
			||||||
    pub debug: bool,
 | 
					    pub debug: bool,
 | 
				
			||||||
    pub formatter: &'static OutputFormatter,
 | 
					    pub formatter: &'static OutputFormatter,
 | 
				
			||||||
@ -37,7 +36,7 @@ impl ReaderEnvironment {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        Self {
 | 
					        Self {
 | 
				
			||||||
            result_attributes: HashMap::new(),
 | 
					            result_attributes: json!({}),
 | 
				
			||||||
            env_type,
 | 
					            env_type,
 | 
				
			||||||
            user,
 | 
					            user,
 | 
				
			||||||
            worker,
 | 
					            worker,
 | 
				
			||||||
@ -61,12 +60,12 @@ impl ReaderEnvironment {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
impl RpcEnvironment for ReaderEnvironment {
 | 
					impl RpcEnvironment for ReaderEnvironment {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    fn set_result_attrib(&mut self, name: &str, value: Value) {
 | 
					    fn result_attrib_mut(&mut self) -> &mut Value {
 | 
				
			||||||
        self.result_attributes.insert(name.into(), value);
 | 
					        &mut self.result_attributes
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    fn get_result_attrib(&self, name: &str) -> Option<&Value> {
 | 
					    fn result_attrib(&self) -> &Value {
 | 
				
			||||||
        self.result_attributes.get(name)
 | 
					        &self.result_attributes
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    fn env_type(&self) -> RpcEnvironmentType {
 | 
					    fn env_type(&self) -> RpcEnvironmentType {
 | 
				
			||||||
 | 
				
			|||||||
@ -262,11 +262,9 @@ fn list_network_devices(mut param: Value, rpcenv: &mut dyn RpcEnvironment) -> Re
 | 
				
			|||||||
        _ => unreachable!(),
 | 
					        _ => unreachable!(),
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if let Some(changes) = rpcenv.get_result_attrib("changes") {
 | 
					    if let Value::String(ref diff) = rpcenv["changes"] {
 | 
				
			||||||
        if let Some(diff) = changes.as_str() {
 | 
					        if output_format == "text" {
 | 
				
			||||||
            if output_format == "text" {
 | 
					            eprintln!("pending changes:\n{}\n", diff);
 | 
				
			||||||
                eprintln!("pending changes:\n{}\n", diff);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -339,10 +337,8 @@ fn pending_network_changes(mut param: Value, rpcenv: &mut dyn RpcEnvironment) ->
 | 
				
			|||||||
        _ => unreachable!(),
 | 
					        _ => unreachable!(),
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if let Some(changes) = rpcenv.get_result_attrib("changes") {
 | 
					    if let Value::String(ref diff) = rpcenv["changes"] {
 | 
				
			||||||
        if let Some(diff) = changes.as_str() {
 | 
					        println!("{}", diff);
 | 
				
			||||||
            println!("{}", diff);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Ok(Value::Null)
 | 
					    Ok(Value::Null)
 | 
				
			||||||
 | 
				
			|||||||
@ -1,19 +1,18 @@
 | 
				
			|||||||
use std::collections::HashMap;
 | 
					use serde_json::{json, Value};
 | 
				
			||||||
use serde_json::Value;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
use proxmox::api::{RpcEnvironment, RpcEnvironmentType};
 | 
					use proxmox::api::{RpcEnvironment, RpcEnvironmentType};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// Encapsulates information about the runtime environment
 | 
					/// Encapsulates information about the runtime environment
 | 
				
			||||||
pub struct RestEnvironment {
 | 
					pub struct RestEnvironment {
 | 
				
			||||||
    env_type: RpcEnvironmentType,
 | 
					    env_type: RpcEnvironmentType,
 | 
				
			||||||
    result_attributes: HashMap<String, Value>,
 | 
					    result_attributes: Value,
 | 
				
			||||||
    user: Option<String>,
 | 
					    user: Option<String>,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
impl RestEnvironment {
 | 
					impl RestEnvironment {
 | 
				
			||||||
    pub fn new(env_type: RpcEnvironmentType) -> Self {
 | 
					    pub fn new(env_type: RpcEnvironmentType) -> Self {
 | 
				
			||||||
        Self {
 | 
					        Self {
 | 
				
			||||||
            result_attributes: HashMap::new(),
 | 
					            result_attributes: json!({}),
 | 
				
			||||||
            user: None,
 | 
					            user: None,
 | 
				
			||||||
            env_type,
 | 
					            env_type,
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@ -22,12 +21,12 @@ impl RestEnvironment {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
impl RpcEnvironment for RestEnvironment {
 | 
					impl RpcEnvironment for RestEnvironment {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    fn set_result_attrib(&mut self, name: &str, value: Value) {
 | 
					    fn result_attrib_mut (&mut self) -> &mut Value {
 | 
				
			||||||
        self.result_attributes.insert(name.into(), value);
 | 
					        &mut self.result_attributes
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    fn get_result_attrib(&self, name: &str) -> Option<&Value> {
 | 
					    fn result_attrib(&self) -> &Value {
 | 
				
			||||||
        self.result_attributes.get(name)
 | 
					        &self.result_attributes
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    fn env_type(&self) -> RpcEnvironmentType {
 | 
					    fn env_type(&self) -> RpcEnvironmentType {
 | 
				
			||||||
 | 
				
			|||||||
@ -41,16 +41,13 @@ pub fn json_data_response(data: Value) -> Response<Body> {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
fn add_result_attributes(result: &mut Value, rpcenv: &dyn RpcEnvironment)
 | 
					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()) {
 | 
					    let attributes = match rpcenv.result_attrib().as_object() {
 | 
				
			||||||
        result["total"] = Value::from(total);
 | 
					        Some(attr) => attr,
 | 
				
			||||||
    }
 | 
					        None => return,
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if let Some(active) = rpcenv.get_result_attrib("active").and_then(|v| v.as_bool()) {
 | 
					    for (key, value) in attributes {
 | 
				
			||||||
        result["active"] = Value::from(active);
 | 
					        result[key] = value.clone();
 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if let Some(changes) = rpcenv.get_result_attrib("changes") {
 | 
					 | 
				
			||||||
        result["changes"] = changes.clone();
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user