diff --git a/src/api2/config/network.rs b/src/api2/config/network.rs index 8b06007a..6f6de282 100644 --- a/src/api2/config/network.rs +++ b/src/api2/config/network.rs @@ -6,6 +6,7 @@ use proxmox::api::{api, ApiMethod, Router, RpcEnvironment, Permission}; //use crate::api2::types::*; use crate::config::network; use crate::config::acl::{PRIV_SYS_AUDIT}; +use crate::api2::types::Interface; #[api( input: { @@ -15,7 +16,7 @@ use crate::config::acl::{PRIV_SYS_AUDIT}; description: "List network devices (with config digest).", type: Array, items: { - type: network::Interface, + type: Interface, }, }, access: { diff --git a/src/api2/types.rs b/src/api2/types.rs index a224243d..050bfe68 100644 --- a/src/api2/types.rs +++ b/src/api2/types.rs @@ -443,6 +443,93 @@ pub struct TaskListItem { pub status: Option, } +#[api()] +#[derive(Debug, Copy, Clone, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "lowercase")] +/// Interface configuration method +pub enum NetworkConfigMethod { + /// 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, +} + +#[api( + properties: { + name: { + type: String, + min_length: 1, + max_length: libc::IFNAMSIZ-1, + }, + method_v4: { + type: NetworkConfigMethod, + optional: true, + }, + method_v6: { + type: NetworkConfigMethod, + 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, + #[serde(skip_serializing_if="Option::is_none")] + pub method_v4: Option, + #[serde(skip_serializing_if="Option::is_none")] + pub method_v6: Option, + #[serde(skip_serializing_if="Option::is_none")] + /// IPv4 address + pub address_v4: Option, + #[serde(skip_serializing_if="Option::is_none")] + /// IPv4 gateway + pub gateway_v4: Option, + #[serde(skip_serializing_if="Option::is_none")] + /// IPv4 netmask + pub netmask_v4: Option, + #[serde(skip_serializing_if="Option::is_none")] + /// IPv6 address + pub address_v6: Option, + #[serde(skip_serializing_if="Option::is_none")] + /// IPv6 gateway + pub gateway_v6: Option, + #[serde(skip_serializing_if="Option::is_none")] + /// IPv6 netmask + pub netmask_v6: Option, + #[serde(skip_serializing_if="Vec::is_empty")] + pub options_v4: Vec, + #[serde(skip_serializing_if="Vec::is_empty")] + pub options_v6: Vec, +} + // Regression tests #[test] diff --git a/src/config/network.rs b/src/config/network.rs index 380e5201..70e027e0 100644 --- a/src/config/network.rs +++ b/src/config/network.rs @@ -2,10 +2,8 @@ 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::*; @@ -16,92 +14,7 @@ pub use lexer::*; mod parser; pub use parser::*; -#[api()] -#[derive(Debug, Copy, Clone, PartialEq, Serialize, Deserialize)] -#[serde(rename_all = "lowercase")] -/// Interface configuration method -pub enum NetworkConfigMethod { - /// 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, -} - -#[api( - properties: { - name: { - type: String, - min_length: 1, - max_length: libc::IFNAMSIZ-1, - }, - method_v4: { - type: NetworkConfigMethod, - optional: true, - }, - method_v6: { - type: NetworkConfigMethod, - 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, - #[serde(skip_serializing_if="Option::is_none")] - pub method_v4: Option, - #[serde(skip_serializing_if="Option::is_none")] - pub method_v6: Option, - #[serde(skip_serializing_if="Option::is_none")] - /// IPv4 address - pub address_v4: Option, - #[serde(skip_serializing_if="Option::is_none")] - /// IPv4 gateway - pub gateway_v4: Option, - #[serde(skip_serializing_if="Option::is_none")] - /// IPv4 netmask - pub netmask_v4: Option, - #[serde(skip_serializing_if="Option::is_none")] - /// IPv6 address - pub address_v6: Option, - #[serde(skip_serializing_if="Option::is_none")] - /// IPv6 gateway - pub gateway_v6: Option, - #[serde(skip_serializing_if="Option::is_none")] - /// IPv6 netmask - pub netmask_v6: Option, - #[serde(skip_serializing_if="Vec::is_empty")] - pub options_v4: Vec, - #[serde(skip_serializing_if="Vec::is_empty")] - pub options_v6: Vec, -} +use crate::api2::types::{Interface, NetworkConfigMethod}; impl Interface {