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