Improve network checks

This commit is contained in:
2024-01-08 21:29:31 +01:00
parent 672e866897
commit e86b29c03a
4 changed files with 96 additions and 33 deletions

View File

@ -3,6 +3,7 @@ use crate::libvirt_lib_structures::XMLUuid;
use crate::libvirt_rest_structures::LibVirtStructError::StructureExtraction;
use crate::nat::nat_definition::Nat;
use crate::nat::nat_lib;
use crate::utils::net_utils;
use crate::utils::net_utils::{extract_ipv4, extract_ipv6};
use ipnetwork::{Ipv4Network, Ipv6Network};
use lazy_regex::regex;
@ -31,7 +32,7 @@ pub struct IPv4DHCPConfig {
#[derive(serde::Serialize, serde::Deserialize, Clone, Debug)]
pub struct IPV4Config {
pub bridge_address: Ipv4Addr,
pub prefix: u32,
pub prefix: u8,
pub dhcp: Option<IPv4DHCPConfig>,
pub nat: Option<Vec<Nat<Ipv4Addr>>>,
}
@ -52,7 +53,7 @@ pub struct IPv6DHCPConfig {
#[derive(serde::Serialize, serde::Deserialize, Clone, Debug)]
pub struct IPV6Config {
pub bridge_address: Ipv6Addr,
pub prefix: u32,
pub prefix: u8,
pub dhcp: Option<IPv6DHCPConfig>,
pub nat: Option<Vec<Nat<Ipv6Addr>>>,
}
@ -115,18 +116,26 @@ impl NetworkInfo {
let mut ips = Vec::with_capacity(2);
if let Some(ipv4) = &self.ip_v4 {
if ipv4.prefix > 32 {
if !net_utils::is_ipv4_mask_valid(ipv4.prefix) {
return Err(StructureExtraction("IPv4 prefix is invalid!").into());
}
if let Some(nat) = &ipv4.nat {
for n in nat {
n.check()?;
}
}
ips.push(NetworkIPXML {
family: "ipv4".to_string(),
address: IpAddr::V4(ipv4.bridge_address),
prefix: ipv4.prefix,
netmask: Ipv4Network::new(ipv4.bridge_address, ipv4.prefix as u8)
.unwrap()
.mask()
.into(),
prefix: Some(ipv4.prefix),
netmask: Some(
Ipv4Network::new(ipv4.bridge_address, ipv4.prefix)
.unwrap()
.mask()
.into(),
),
dhcp: ipv4.dhcp.as_ref().map(|dhcp| NetworkDHCPXML {
range: NetworkDHCPRangeXML {
start: IpAddr::V4(dhcp.start),
@ -146,14 +155,26 @@ impl NetworkInfo {
}
if let Some(ipv6) = &self.ip_v6 {
if !net_utils::is_ipv6_mask_valid(ipv6.prefix) {
return Err(StructureExtraction("IPv6 prefix is invalid!").into());
}
if let Some(nat) = &ipv6.nat {
for n in nat {
n.check()?;
}
}
ips.push(NetworkIPXML {
family: "ipv6".to_string(),
address: IpAddr::V6(ipv6.bridge_address),
prefix: ipv6.prefix,
netmask: Ipv6Network::new(ipv6.bridge_address, ipv6.prefix as u8)
.unwrap()
.mask()
.into(),
prefix: Some(ipv6.prefix),
netmask: Some(
Ipv6Network::new(ipv6.bridge_address, ipv6.prefix)
.unwrap()
.mask()
.into(),
),
dhcp: ipv6.dhcp.as_ref().map(|dhcp| NetworkDHCPXML {
range: NetworkDHCPRangeXML {
start: IpAddr::V6(dhcp.start),
@ -226,10 +247,9 @@ impl NetworkInfo {
.map(|i| IPV4Config {
bridge_address: extract_ipv4(i.address),
prefix: match i.prefix {
u32::MAX => ipnetwork::ipv4_mask_to_prefix(extract_ipv4(i.netmask))
.expect("Failed to convert IPv4 netmask to network")
as u32,
p => p,
None => ipnetwork::ipv4_mask_to_prefix(extract_ipv4(i.netmask.unwrap()))
.expect("Failed to convert IPv4 netmask to network"),
Some(p) => p,
},
dhcp: i.dhcp.as_ref().map(|d| IPv4DHCPConfig {
start: extract_ipv4(d.range.start),
@ -253,10 +273,9 @@ impl NetworkInfo {
.map(|i| IPV6Config {
bridge_address: extract_ipv6(i.address),
prefix: match i.prefix {
u32::MAX => ipnetwork::ipv6_mask_to_prefix(extract_ipv6(i.netmask))
.expect("Failed to convert IPv6 netmask to network")
as u32,
p => p,
None => ipnetwork::ipv6_mask_to_prefix(extract_ipv6(i.netmask.unwrap()))
.expect("Failed to convert IPv6 netmask to network"),
Some(p) => p,
},
dhcp: i.dhcp.as_ref().map(|d| IPv6DHCPConfig {
start: extract_ipv6(d.range.start),