src/api2/node/network.rs: cleanup - factor out check_duplicate_gateway
This commit is contained in:
parent
9651833130
commit
c2ffc68554
|
@ -4,11 +4,39 @@ use ::serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
use proxmox::api::{api, ApiMethod, Router, RpcEnvironment, Permission};
|
use proxmox::api::{api, ApiMethod, Router, RpcEnvironment, Permission};
|
||||||
|
|
||||||
use crate::config::network;
|
use crate::config::network::{self, NetworkConfig};
|
||||||
use crate::config::acl::{PRIV_SYS_AUDIT, PRIV_SYS_MODIFY};
|
use crate::config::acl::{PRIV_SYS_AUDIT, PRIV_SYS_MODIFY};
|
||||||
use crate::api2::types::*;
|
use crate::api2::types::*;
|
||||||
use crate::server::{WorkerTask};
|
use crate::server::{WorkerTask};
|
||||||
|
|
||||||
|
fn check_duplicate_gateway_v4(config: &NetworkConfig, iface: &str) -> Result<(), Error> {
|
||||||
|
|
||||||
|
let current_gateway_v4 = config.interfaces.iter()
|
||||||
|
.find(|(_, interface)| interface.gateway.is_some())
|
||||||
|
.map(|(name, _)| name.to_string());
|
||||||
|
|
||||||
|
if let Some(current_gateway_v4) = current_gateway_v4 {
|
||||||
|
if current_gateway_v4 != iface {
|
||||||
|
bail!("Default IPv4 gateway already exists on interface '{}'", current_gateway_v4);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn check_duplicate_gateway_v6(config: &NetworkConfig, iface: &str) -> Result<(), Error> {
|
||||||
|
|
||||||
|
let current_gateway_v6 = config.interfaces.iter()
|
||||||
|
.find(|(_, interface)| interface.gateway6.is_some())
|
||||||
|
.map(|(name, _)| name.to_string());
|
||||||
|
|
||||||
|
if let Some(current_gateway_v6) = current_gateway_v6 {
|
||||||
|
if current_gateway_v6 != iface {
|
||||||
|
bail!("Default IPv6 gateway already exists on interface '{}'", current_gateway_v6);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
#[api(
|
#[api(
|
||||||
input: {
|
input: {
|
||||||
properties: {
|
properties: {
|
||||||
|
@ -199,15 +227,6 @@ pub fn create_interface(
|
||||||
bail!("interface '{}' already exists", iface);
|
bail!("interface '{}' already exists", iface);
|
||||||
}
|
}
|
||||||
|
|
||||||
let current_gateway_v4 = config.interfaces.iter()
|
|
||||||
.find(|(_, interface)| interface.gateway.is_some())
|
|
||||||
.map(|(name, _)| name.to_string());
|
|
||||||
|
|
||||||
let current_gateway_v6 = config.interfaces.iter()
|
|
||||||
.find(|(_, interface)| interface.gateway6.is_some())
|
|
||||||
.map(|(name, _)| name.to_string());
|
|
||||||
|
|
||||||
|
|
||||||
let mut interface = Interface::new(iface.clone());
|
let mut interface = Interface::new(iface.clone());
|
||||||
interface.interface_type = interface_type;
|
interface.interface_type = interface_type;
|
||||||
|
|
||||||
|
@ -233,22 +252,14 @@ pub fn create_interface(
|
||||||
if let Some(gateway) = gateway {
|
if let Some(gateway) = gateway {
|
||||||
let is_v6 = gateway.contains(':');
|
let is_v6 = gateway.contains(':');
|
||||||
if is_v6 { bail!("invalid address type (expected IPv4, got IPv6)"); }
|
if is_v6 { bail!("invalid address type (expected IPv4, got IPv6)"); }
|
||||||
if let Some(current_gateway_v4) = current_gateway_v4 {
|
check_duplicate_gateway_v4(&config, &iface)?;
|
||||||
if current_gateway_v4 != iface {
|
|
||||||
bail!("Default IPv4 gateway already exists on interface '{}'", current_gateway_v4);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
interface.gateway = Some(gateway);
|
interface.gateway = Some(gateway);
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(gateway6) = gateway6 {
|
if let Some(gateway6) = gateway6 {
|
||||||
let is_v6 = gateway6.contains(':');
|
let is_v6 = gateway6.contains(':');
|
||||||
if !is_v6 { bail!("invalid address type (expected IPv6, got IPv4)"); }
|
if !is_v6 { bail!("invalid address type (expected IPv6, got IPv4)"); }
|
||||||
if let Some(current_gateway_v6) = current_gateway_v6 {
|
check_duplicate_gateway_v6(&config, &iface)?;
|
||||||
if current_gateway_v6 != iface {
|
|
||||||
bail!("Default IPv6 gateway already exists on interface '{}'", current_gateway_v6);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
interface.gateway6 = Some(gateway6);
|
interface.gateway6 = Some(gateway6);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -438,13 +449,8 @@ pub fn update_interface(
|
||||||
crate::tools::detect_modified_configuration_file(&digest, &expected_digest)?;
|
crate::tools::detect_modified_configuration_file(&digest, &expected_digest)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
let current_gateway_v4 = config.interfaces.iter()
|
if gateway.is_some() { check_duplicate_gateway_v4(&config, &iface)?; }
|
||||||
.find(|(_, interface)| interface.gateway.is_some())
|
if gateway6.is_some() { check_duplicate_gateway_v6(&config, &iface)?; }
|
||||||
.map(|(name, _)| name.to_string());
|
|
||||||
|
|
||||||
let current_gateway_v6 = config.interfaces.iter()
|
|
||||||
.find(|(_, interface)| interface.gateway6.is_some())
|
|
||||||
.map(|(name, _)| name.to_string());
|
|
||||||
|
|
||||||
let interface = config.lookup_mut(&iface)?;
|
let interface = config.lookup_mut(&iface)?;
|
||||||
|
|
||||||
|
@ -498,22 +504,12 @@ pub fn update_interface(
|
||||||
if let Some(gateway) = gateway {
|
if let Some(gateway) = gateway {
|
||||||
let is_v6 = gateway.contains(':');
|
let is_v6 = gateway.contains(':');
|
||||||
if is_v6 { bail!("invalid address type (expected IPv4, got IPv6)"); }
|
if is_v6 { bail!("invalid address type (expected IPv4, got IPv6)"); }
|
||||||
if let Some(current_gateway_v4) = current_gateway_v4 {
|
|
||||||
if current_gateway_v4 != iface {
|
|
||||||
bail!("Default IPv4 gateway already exists on interface '{}'", current_gateway_v4);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
interface.gateway = Some(gateway);
|
interface.gateway = Some(gateway);
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(gateway6) = gateway6 {
|
if let Some(gateway6) = gateway6 {
|
||||||
let is_v6 = gateway6.contains(':');
|
let is_v6 = gateway6.contains(':');
|
||||||
if !is_v6 { bail!("invalid address type (expected IPv6, got IPv4)"); }
|
if !is_v6 { bail!("invalid address type (expected IPv6, got IPv4)"); }
|
||||||
if let Some(current_gateway_v6) = current_gateway_v6 {
|
|
||||||
if current_gateway_v6 != iface {
|
|
||||||
bail!("Default IPv6 gateway already exists on interface '{}'", current_gateway_v6);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
interface.gateway6 = Some(gateway6);
|
interface.gateway6 = Some(gateway6);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue