src/api2/config/network.rs: start network configuration api
This commit is contained in:
		@ -3,9 +3,11 @@ use proxmox::list_subdirs_api_method;
 | 
			
		||||
 | 
			
		||||
pub mod datastore;
 | 
			
		||||
pub mod remote;
 | 
			
		||||
pub mod network;
 | 
			
		||||
 | 
			
		||||
const SUBDIRS: SubdirMap = &[
 | 
			
		||||
    ("datastore", &datastore::ROUTER),
 | 
			
		||||
    ("network", &network::ROUTER),
 | 
			
		||||
    ("remote", &remote::ROUTER),
 | 
			
		||||
];
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										47
									
								
								src/api2/config/network.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								src/api2/config/network.rs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,47 @@
 | 
			
		||||
use anyhow::{Error};
 | 
			
		||||
use serde_json::{Value, to_value};
 | 
			
		||||
 | 
			
		||||
use proxmox::api::{api, ApiMethod, Router, RpcEnvironment, Permission};
 | 
			
		||||
 | 
			
		||||
//use crate::api2::types::*;
 | 
			
		||||
use crate::config::network;
 | 
			
		||||
use crate::config::acl::{PRIV_SYS_AUDIT};
 | 
			
		||||
 | 
			
		||||
#[api(
 | 
			
		||||
    input: {
 | 
			
		||||
        properties: {},
 | 
			
		||||
    },
 | 
			
		||||
    returns: {
 | 
			
		||||
        description: "List network devices (with config digest).",
 | 
			
		||||
        type: Array,
 | 
			
		||||
        items: {
 | 
			
		||||
            type: network::Interface,
 | 
			
		||||
        },
 | 
			
		||||
    },
 | 
			
		||||
    access: {
 | 
			
		||||
        permission: &Permission::Privilege(&[], PRIV_SYS_AUDIT, false),
 | 
			
		||||
    },
 | 
			
		||||
)]
 | 
			
		||||
/// List all datastores
 | 
			
		||||
pub fn list_network_devices(
 | 
			
		||||
    _param: Value,
 | 
			
		||||
    _info: &ApiMethod,
 | 
			
		||||
    _rpcenv: &mut dyn RpcEnvironment,
 | 
			
		||||
) -> Result<Value, Error> {
 | 
			
		||||
 | 
			
		||||
    let (config, digest) = network::config()?;
 | 
			
		||||
    let digest = proxmox::tools::digest_to_hex(&digest);
 | 
			
		||||
 | 
			
		||||
    let mut list = Vec::new();
 | 
			
		||||
 | 
			
		||||
    for interface in config.interfaces.values() {
 | 
			
		||||
        let mut item: Value = to_value(interface)?;
 | 
			
		||||
        item["digest"] = digest.clone().into();
 | 
			
		||||
        list.push(item);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    Ok(list.into())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub const ROUTER: Router = Router::new()
 | 
			
		||||
    .get(&API_METHOD_LIST_NETWORK_DEVICES);
 | 
			
		||||
@ -233,6 +233,14 @@ fn acl_commands() -> CommandLineInterface {
 | 
			
		||||
    cmd_def.into()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn network_commands() -> CommandLineInterface {
 | 
			
		||||
 | 
			
		||||
    let cmd_def = CliCommandMap::new()
 | 
			
		||||
        .insert("list", CliCommand::new(&api2::config::network::API_METHOD_LIST_NETWORK_DEVICES));
 | 
			
		||||
 | 
			
		||||
    cmd_def.into()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn datastore_commands() -> CommandLineInterface {
 | 
			
		||||
 | 
			
		||||
    let cmd_def = CliCommandMap::new()
 | 
			
		||||
@ -603,6 +611,7 @@ fn main() {
 | 
			
		||||
    let cmd_def = CliCommandMap::new()
 | 
			
		||||
        .insert("acl", acl_commands())
 | 
			
		||||
        .insert("datastore", datastore_commands())
 | 
			
		||||
        .insert("network", network_commands())
 | 
			
		||||
        .insert("user", user_commands())
 | 
			
		||||
        .insert("remote", remote_commands())
 | 
			
		||||
        .insert("garbage-collection", garbage_collection_commands())
 | 
			
		||||
 | 
			
		||||
@ -2,8 +2,10 @@ use std::io::{Write};
 | 
			
		||||
use std::collections::{HashSet, HashMap};
 | 
			
		||||
 | 
			
		||||
use anyhow::{Error, bail};
 | 
			
		||||
use serde::{Serialize, Deserialize};
 | 
			
		||||
 | 
			
		||||
use proxmox::tools::{fs::replace_file, fs::CreateOptions};
 | 
			
		||||
use proxmox::api::api;
 | 
			
		||||
 | 
			
		||||
mod helper;
 | 
			
		||||
pub use helper::*;
 | 
			
		||||
@ -14,29 +16,90 @@ pub use lexer::*;
 | 
			
		||||
mod parser;
 | 
			
		||||
pub use parser::*;
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, Copy, Clone, PartialEq)]
 | 
			
		||||
#[api()]
 | 
			
		||||
#[derive(Debug, Copy, Clone, PartialEq, Serialize, Deserialize)]
 | 
			
		||||
#[serde(rename_all = "lowercase")]
 | 
			
		||||
/// Interface configuration method
 | 
			
		||||
pub enum ConfigMethod {
 | 
			
		||||
    /// Configuration is done manually using other tools
 | 
			
		||||
    Manual,
 | 
			
		||||
    /// Define interfaces with statically allocated addresses.
 | 
			
		||||
    Static,
 | 
			
		||||
    /// Obtain an address via DHCP
 | 
			
		||||
    DHCP,
 | 
			
		||||
    /// Define the loopback interface.
 | 
			
		||||
    Loopback,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Debug)]
 | 
			
		||||
#[api(
 | 
			
		||||
    properties: {
 | 
			
		||||
        name: {
 | 
			
		||||
            type: String,
 | 
			
		||||
            min_length: 1,
 | 
			
		||||
            max_length: libc::IFNAMSIZ-1,
 | 
			
		||||
        },
 | 
			
		||||
        method_v4: {
 | 
			
		||||
            type: ConfigMethod,
 | 
			
		||||
            optional: true,
 | 
			
		||||
        },
 | 
			
		||||
        method_v6: {
 | 
			
		||||
            type: ConfigMethod,
 | 
			
		||||
            optional: true,
 | 
			
		||||
        },
 | 
			
		||||
        options_v4: {
 | 
			
		||||
            description: "Option list (inet)",
 | 
			
		||||
            type: Array,
 | 
			
		||||
            items: {
 | 
			
		||||
                description: "Optional attribute.",
 | 
			
		||||
                type: String,
 | 
			
		||||
            },
 | 
			
		||||
        },
 | 
			
		||||
        options_v6: {
 | 
			
		||||
            description: "Option list (inet6)",
 | 
			
		||||
            type: Array,
 | 
			
		||||
            items: {
 | 
			
		||||
                description: "Optional attribute.",
 | 
			
		||||
                type: String,
 | 
			
		||||
            },
 | 
			
		||||
        },
 | 
			
		||||
    }
 | 
			
		||||
)]
 | 
			
		||||
#[derive(Debug, Serialize, Deserialize)]
 | 
			
		||||
/// Network Interface configuration
 | 
			
		||||
pub struct Interface {
 | 
			
		||||
    /// Autostart interface
 | 
			
		||||
    pub autostart: bool,
 | 
			
		||||
    /// Interface is a physical network device
 | 
			
		||||
    pub exists: bool,
 | 
			
		||||
    /// Interface is active (UP)
 | 
			
		||||
    pub active: bool,
 | 
			
		||||
    /// Interface name
 | 
			
		||||
    pub name: String,
 | 
			
		||||
    pub method_v4: Option<ConfigMethod>,
 | 
			
		||||
    #[serde(skip_serializing_if="Option::is_none")]
 | 
			
		||||
     pub method_v4: Option<ConfigMethod>,
 | 
			
		||||
    #[serde(skip_serializing_if="Option::is_none")]
 | 
			
		||||
    pub method_v6: Option<ConfigMethod>,
 | 
			
		||||
    #[serde(skip_serializing_if="Option::is_none")]
 | 
			
		||||
    /// IPv4 address
 | 
			
		||||
    pub address_v4: Option<String>,
 | 
			
		||||
    #[serde(skip_serializing_if="Option::is_none")]
 | 
			
		||||
    /// IPv4 gateway
 | 
			
		||||
    pub gateway_v4: Option<String>,
 | 
			
		||||
    #[serde(skip_serializing_if="Option::is_none")]
 | 
			
		||||
    /// IPv4 netmask
 | 
			
		||||
    pub netmask_v4: Option<u8>,
 | 
			
		||||
    #[serde(skip_serializing_if="Option::is_none")]
 | 
			
		||||
    /// IPv6 address
 | 
			
		||||
    pub address_v6: Option<String>,
 | 
			
		||||
    #[serde(skip_serializing_if="Option::is_none")]
 | 
			
		||||
    /// IPv6 gateway
 | 
			
		||||
    pub gateway_v6: Option<String>,
 | 
			
		||||
    #[serde(skip_serializing_if="Option::is_none")]
 | 
			
		||||
    /// IPv6 netmask
 | 
			
		||||
    pub netmask_v6: Option<u8>,
 | 
			
		||||
    #[serde(skip_serializing_if="Vec::is_empty")]
 | 
			
		||||
    pub options_v4: Vec<String>,
 | 
			
		||||
    #[serde(skip_serializing_if="Vec::is_empty")]
 | 
			
		||||
    pub options_v6: Vec<String>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -231,7 +294,7 @@ enum NetworkOrderEntry {
 | 
			
		||||
 | 
			
		||||
#[derive(Debug)]
 | 
			
		||||
pub struct NetworkConfig {
 | 
			
		||||
    interfaces: HashMap<String, Interface>,
 | 
			
		||||
    pub interfaces: HashMap<String, Interface>,
 | 
			
		||||
    order: Vec<NetworkOrderEntry>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user