src/api2/node/network.rs: cleanup - factor out check_duplicate_gateway

This commit is contained in:
Dietmar Maurer 2020-05-07 11:26:30 +02:00
parent 9651833130
commit c2ffc68554
1 changed files with 33 additions and 37 deletions

View File

@ -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);
} }