Improve network checks
This commit is contained in:
		@@ -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),
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user