feat: OKD Dhcp config works and is actually savec on opnsense firewall, its alive!! First real run on wk cluster
This commit is contained in:
parent
d0d81af796
commit
b15df3c93f
@ -96,10 +96,10 @@ pub enum StorageKind {
|
|||||||
}
|
}
|
||||||
#[derive(Debug, new, Clone)]
|
#[derive(Debug, new, Clone)]
|
||||||
pub struct Storage {
|
pub struct Storage {
|
||||||
connection: StorageConnectionType,
|
pub connection: StorageConnectionType,
|
||||||
kind: StorageKind,
|
pub kind: StorageKind,
|
||||||
size: u64,
|
pub size: u64,
|
||||||
serial: String,
|
pub serial: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
|
|||||||
@ -47,6 +47,7 @@ pub trait DhcpServer: Send + Sync {
|
|||||||
async fn list_static_mappings(&self) -> Vec<(MacAddress, IpAddress)>;
|
async fn list_static_mappings(&self) -> Vec<(MacAddress, IpAddress)>;
|
||||||
fn get_ip(&self) -> IpAddress;
|
fn get_ip(&self) -> IpAddress;
|
||||||
fn get_host(&self) -> LogicalHost;
|
fn get_host(&self) -> LogicalHost;
|
||||||
|
async fn commit_config(&self) -> Result<(), ExecutorError>;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl std::fmt::Debug for dyn DhcpServer {
|
impl std::fmt::Debug for dyn DhcpServer {
|
||||||
|
|||||||
@ -1,9 +1,10 @@
|
|||||||
mod management;
|
mod management;
|
||||||
use std::sync::{Arc, RwLock };
|
use std::sync::Arc;
|
||||||
|
|
||||||
use async_trait::async_trait;
|
use async_trait::async_trait;
|
||||||
use log::debug;
|
use log::debug;
|
||||||
pub use management::*;
|
pub use management::*;
|
||||||
|
use tokio::sync::RwLock;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
executors::ExecutorError,
|
executors::ExecutorError,
|
||||||
@ -97,14 +98,24 @@ impl LoadBalancer for OPNSenseFirewall {
|
|||||||
|
|
||||||
#[async_trait]
|
#[async_trait]
|
||||||
impl DhcpServer for OPNSenseFirewall {
|
impl DhcpServer for OPNSenseFirewall {
|
||||||
|
async fn commit_config(&self) -> Result<(), ExecutorError> {
|
||||||
|
self.opnsense_config
|
||||||
|
.read()
|
||||||
|
.await
|
||||||
|
.apply()
|
||||||
|
.await
|
||||||
|
.map_err(|e| ExecutorError::UnexpectedError(e.to_string()))
|
||||||
|
}
|
||||||
|
|
||||||
async fn add_static_mapping(&self, entry: &DHCPStaticEntry) -> Result<(), ExecutorError> {
|
async fn add_static_mapping(&self, entry: &DHCPStaticEntry) -> Result<(), ExecutorError> {
|
||||||
let mac: String = String::from(&entry.mac);
|
let mac: String = String::from(&entry.mac);
|
||||||
|
|
||||||
{
|
{
|
||||||
let mut writable_opnsense = self.opnsense_config.write().unwrap();
|
let mut writable_opnsense = self.opnsense_config.write().await;
|
||||||
writable_opnsense
|
writable_opnsense
|
||||||
.dhcp()
|
.dhcp()
|
||||||
.add_static_mapping(&mac, entry.ip, &entry.name).unwrap();
|
.add_static_mapping(&mac, entry.ip, &entry.name)
|
||||||
|
.unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
debug!("Registered {:?}", entry);
|
debug!("Registered {:?}", entry);
|
||||||
|
|||||||
@ -87,7 +87,9 @@ impl Interpret for DhcpInterpret {
|
|||||||
.map(|binding| {
|
.map(|binding| {
|
||||||
let ip = match binding.logical_host.ip {
|
let ip = match binding.logical_host.ip {
|
||||||
std::net::IpAddr::V4(ipv4) => ipv4,
|
std::net::IpAddr::V4(ipv4) => ipv4,
|
||||||
std::net::IpAddr::V6(_) => unimplemented!("DHCPStaticEntry only supports ipv4 at the moment"),
|
std::net::IpAddr::V6(_) => {
|
||||||
|
unimplemented!("DHCPStaticEntry only supports ipv4 at the moment")
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
DHCPStaticEntry {
|
DHCPStaticEntry {
|
||||||
@ -99,20 +101,23 @@ impl Interpret for DhcpInterpret {
|
|||||||
.collect();
|
.collect();
|
||||||
info!("DHCPStaticEntry : {:?}", dhcp_entries);
|
info!("DHCPStaticEntry : {:?}", dhcp_entries);
|
||||||
|
|
||||||
let dhcp = Arc::new(Box::new(topology.dhcp_server.clone()));
|
let dhcp_server = Arc::new(Box::new(topology.dhcp_server.clone()));
|
||||||
info!("DHCP server : {:?}", dhcp);
|
info!("DHCP server : {:?}", dhcp_server);
|
||||||
|
|
||||||
|
let number_new_entries = dhcp_entries.len();
|
||||||
|
|
||||||
for entry in dhcp_entries.into_iter() {
|
for entry in dhcp_entries.into_iter() {
|
||||||
match dhcp.add_static_mapping(&entry).await {
|
match dhcp_server.add_static_mapping(&entry).await {
|
||||||
Ok(_) => info!("Successfully registered DHCPStaticEntry {}", entry),
|
Ok(_) => info!("Successfully registered DHCPStaticEntry {}", entry),
|
||||||
Err(_) => todo!(),
|
Err(_) => todo!(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
todo!("Configure DHCPServer");
|
dhcp_server.commit_config().await;
|
||||||
|
|
||||||
Ok(Outcome::new(
|
Ok(Outcome::new(
|
||||||
InterpretStatus::SUCCESS,
|
InterpretStatus::SUCCESS,
|
||||||
"Connection test successful".to_string(),
|
format!("Dhcp Interpret registered {} entries", number_new_entries),
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1 +1,2 @@
|
|||||||
pub mod dhcp;
|
pub mod dhcp;
|
||||||
|
pub mod okd;
|
||||||
|
|||||||
45
harmony-rs/harmony/src/modules/okd/dhcp.rs
Normal file
45
harmony-rs/harmony/src/modules/okd/dhcp.rs
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
use crate::{
|
||||||
|
inventory::Inventory,
|
||||||
|
modules::dhcp::DhcpScore,
|
||||||
|
score::Score,
|
||||||
|
topology::{HAClusterTopology, HostBinding},
|
||||||
|
};
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct OKDBootstrapDhcpScore {
|
||||||
|
dhcp_score: DhcpScore,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl OKDBootstrapDhcpScore {
|
||||||
|
pub fn new(topology: &HAClusterTopology, inventory: &Inventory) -> Self {
|
||||||
|
Self {
|
||||||
|
dhcp_score: DhcpScore::new(
|
||||||
|
topology
|
||||||
|
.control_plane
|
||||||
|
.iter()
|
||||||
|
.enumerate()
|
||||||
|
.map(|(index, topology_entry)| {
|
||||||
|
HostBinding {
|
||||||
|
logical_host: topology_entry.clone(),
|
||||||
|
physical_host: inventory
|
||||||
|
.control_plane_host
|
||||||
|
.get(index)
|
||||||
|
.expect(
|
||||||
|
"Iventory should contain at least as many physical hosts as topology",
|
||||||
|
)
|
||||||
|
.clone(),
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.collect(),
|
||||||
|
),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Score for OKDBootstrapDhcpScore {
|
||||||
|
type InterpretType = <DhcpScore as Score>::InterpretType;
|
||||||
|
|
||||||
|
fn create_interpret(self) -> Self::InterpretType {
|
||||||
|
self.dhcp_score.create_interpret()
|
||||||
|
}
|
||||||
|
}
|
||||||
2
harmony-rs/harmony/src/modules/okd/mod.rs
Normal file
2
harmony-rs/harmony/src/modules/okd/mod.rs
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
pub mod dhcp;
|
||||||
|
|
||||||
@ -27,7 +27,7 @@ pub struct OPNsense {
|
|||||||
pub opnsense: OPNsenseXmlSection,
|
pub opnsense: OPNsenseXmlSection,
|
||||||
pub staticroutes: StaticRoutes,
|
pub staticroutes: StaticRoutes,
|
||||||
pub ca: MaybeString,
|
pub ca: MaybeString,
|
||||||
pub gateways: Option<Gateways>,
|
pub gateways: Option<RawXml>,
|
||||||
pub cert: Vec<Cert>,
|
pub cert: Vec<Cert>,
|
||||||
pub dhcpdv6: DhcpDv6,
|
pub dhcpdv6: DhcpDv6,
|
||||||
pub virtualip: VirtualIp,
|
pub virtualip: VirtualIp,
|
||||||
@ -60,7 +60,6 @@ impl OPNsense {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)]
|
#[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)]
|
||||||
pub struct LoadBalancer {
|
pub struct LoadBalancer {
|
||||||
pub monitor_type: Vec<MonitorType>,
|
pub monitor_type: Vec<MonitorType>,
|
||||||
@ -415,6 +414,8 @@ pub struct OPNsenseXmlSection {
|
|||||||
pub ipsec: Option<IPsec>,
|
pub ipsec: Option<IPsec>,
|
||||||
#[yaserde(rename = "Interfaces")]
|
#[yaserde(rename = "Interfaces")]
|
||||||
pub interfaces: Option<ConfigInterfaces>,
|
pub interfaces: Option<ConfigInterfaces>,
|
||||||
|
#[yaserde(rename = "NodeExporter")]
|
||||||
|
pub node_exporter: Option<RawXml>,
|
||||||
#[yaserde(rename = "Kea")]
|
#[yaserde(rename = "Kea")]
|
||||||
pub kea: Option<RawXml>,
|
pub kea: Option<RawXml>,
|
||||||
pub monit: Option<Monit>,
|
pub monit: Option<Monit>,
|
||||||
@ -428,6 +429,7 @@ pub struct OPNsenseXmlSection {
|
|||||||
pub unboundplus: Option<RawXml>,
|
pub unboundplus: Option<RawXml>,
|
||||||
#[yaserde(rename = "DHCRelay")]
|
#[yaserde(rename = "DHCRelay")]
|
||||||
pub dhcrelay: Option<RawXml>,
|
pub dhcrelay: Option<RawXml>,
|
||||||
|
pub trust: Option<RawXml>,
|
||||||
pub wireguard: Option<Wireguard>,
|
pub wireguard: Option<Wireguard>,
|
||||||
#[yaserde(rename = "Swanctl")]
|
#[yaserde(rename = "Swanctl")]
|
||||||
pub swanctl: Swanctl,
|
pub swanctl: Swanctl,
|
||||||
@ -479,6 +481,8 @@ pub struct IDSGeneral {
|
|||||||
#[yaserde(rename = "LogPayload")]
|
#[yaserde(rename = "LogPayload")]
|
||||||
log_payload: Option<u8>,
|
log_payload: Option<u8>,
|
||||||
verbosity: MaybeString,
|
verbosity: MaybeString,
|
||||||
|
#[yaserde(rename = "eveLog")]
|
||||||
|
eve_log: Option<RawXml>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, YaSerialize, YaDeserialize, PartialEq)]
|
#[derive(Debug, YaSerialize, YaDeserialize, PartialEq)]
|
||||||
@ -498,11 +502,15 @@ pub struct IPsec {
|
|||||||
key_pairs: MaybeString,
|
key_pairs: MaybeString,
|
||||||
#[yaserde(rename = "preSharedKeys")]
|
#[yaserde(rename = "preSharedKeys")]
|
||||||
pre_shared_keys: MaybeString,
|
pre_shared_keys: MaybeString,
|
||||||
|
charon: Option<RawXml>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, YaSerialize, YaDeserialize, PartialEq)]
|
#[derive(Debug, YaSerialize, YaDeserialize, PartialEq)]
|
||||||
pub struct GeneralIpsec {
|
pub struct GeneralIpsec {
|
||||||
enabled: MaybeString,
|
enabled: MaybeString,
|
||||||
|
preferred_oldsa: MaybeString,
|
||||||
|
disablevpnrules: MaybeString,
|
||||||
|
passthrough_networks: MaybeString,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, YaSerialize, YaDeserialize, PartialEq)]
|
#[derive(Debug, YaSerialize, YaDeserialize, PartialEq)]
|
||||||
@ -1214,6 +1222,8 @@ pub struct WireguardServerItem {
|
|||||||
pub gateway: MaybeString,
|
pub gateway: MaybeString,
|
||||||
pub carp_depend_on: MaybeString,
|
pub carp_depend_on: MaybeString,
|
||||||
pub peers: String,
|
pub peers: String,
|
||||||
|
pub endpoint: MaybeString,
|
||||||
|
pub peer_dns: MaybeString,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)]
|
#[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)]
|
||||||
@ -1320,7 +1330,6 @@ pub struct ConfigOpenVPN {
|
|||||||
pub StaticKeys: MaybeString,
|
pub StaticKeys: MaybeString,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)]
|
#[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)]
|
||||||
#[yaserde(rename = "HAProxy")]
|
#[yaserde(rename = "HAProxy")]
|
||||||
pub struct HAProxy {
|
pub struct HAProxy {
|
||||||
@ -1411,6 +1420,8 @@ pub struct Tuning {
|
|||||||
#[yaserde(rename = "maxConnections")]
|
#[yaserde(rename = "maxConnections")]
|
||||||
pub max_connections: MaybeString,
|
pub max_connections: MaybeString,
|
||||||
pub nbthread: i32,
|
pub nbthread: i32,
|
||||||
|
#[yaserde(rename = "resolversPrefer")]
|
||||||
|
pub resolvers_prefer: String,
|
||||||
#[yaserde(rename = "sslServerVerify")]
|
#[yaserde(rename = "sslServerVerify")]
|
||||||
pub ssl_server_verify: String,
|
pub ssl_server_verify: String,
|
||||||
#[yaserde(rename = "maxDHSize")]
|
#[yaserde(rename = "maxDHSize")]
|
||||||
@ -1425,6 +1436,12 @@ pub struct Tuning {
|
|||||||
pub lua_max_mem: i32,
|
pub lua_max_mem: i32,
|
||||||
#[yaserde(rename = "customOptions")]
|
#[yaserde(rename = "customOptions")]
|
||||||
pub custom_options: MaybeString,
|
pub custom_options: MaybeString,
|
||||||
|
#[yaserde(rename = "ocspUpdateEnabled")]
|
||||||
|
pub ocs_update_enabled: MaybeString,
|
||||||
|
#[yaserde(rename = "ocspUpdateMinDelay")]
|
||||||
|
pub ocs_update_min_delay: MaybeString,
|
||||||
|
#[yaserde(rename = "ocspUpdateMaxDelay")]
|
||||||
|
pub ocs_update_max_delay: MaybeString,
|
||||||
#[yaserde(rename = "ssl_defaultsEnabled")]
|
#[yaserde(rename = "ssl_defaultsEnabled")]
|
||||||
pub ssl_defaults_enabled: i32,
|
pub ssl_defaults_enabled: i32,
|
||||||
#[yaserde(rename = "ssl_bindOptions")]
|
#[yaserde(rename = "ssl_bindOptions")]
|
||||||
@ -1437,6 +1454,19 @@ pub struct Tuning {
|
|||||||
pub ssl_cipher_list: String,
|
pub ssl_cipher_list: String,
|
||||||
#[yaserde(rename = "ssl_cipherSuites")]
|
#[yaserde(rename = "ssl_cipherSuites")]
|
||||||
pub ssl_cipher_suites: String,
|
pub ssl_cipher_suites: String,
|
||||||
|
#[yaserde(rename = "h2_initialWindowSize")]
|
||||||
|
pub h2_initial_window_size: Option<MaybeString>,
|
||||||
|
#[yaserde(rename = "h2_initialWindowSizeOutgoing")]
|
||||||
|
pub h2_initial_window_size_outgoing: Option<MaybeString>,
|
||||||
|
#[yaserde(rename = "h2_initialWindowSizeIncoming")]
|
||||||
|
pub h2_initial_window_size_incoming: Option<MaybeString>,
|
||||||
|
#[yaserde(rename = "h2_maxConcurrentStreams")]
|
||||||
|
pub h2_max_concurrent_streams: Option<MaybeString>,
|
||||||
|
#[yaserde(rename = "h2_maxConcurrentStreamsOutgoing")]
|
||||||
|
pub h2_max_concurrent_streams_outgoing: Option<MaybeString>,
|
||||||
|
#[yaserde(rename = "h2_maxConcurrentStreamsIncoming")]
|
||||||
|
pub h2_max_concurrent_streams_incoming: Option<MaybeString>,
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)]
|
#[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)]
|
||||||
@ -1684,25 +1714,22 @@ pub struct Backend {
|
|||||||
pub http2_enabled_nontls: u8,
|
pub http2_enabled_nontls: u8,
|
||||||
#[yaserde(rename = "ba_advertised_protocols")]
|
#[yaserde(rename = "ba_advertised_protocols")]
|
||||||
pub ba_advertised_protocols: String,
|
pub ba_advertised_protocols: String,
|
||||||
#[yaserde(rename = "persistence")]
|
#[yaserde(rename = "forwardFor")]
|
||||||
pub persistence: String,
|
pub forward_for: Option<i32>,
|
||||||
#[yaserde(rename = "persistence_cookiemode")]
|
#[yaserde(rename = "forwardedHeader")]
|
||||||
|
pub forwarded_header: Option<MaybeString>,
|
||||||
|
#[yaserde(rename = "forwardedHeaderParameters")]
|
||||||
|
pub forwarded_header_parameters: Option<MaybeString>,
|
||||||
|
pub persistence: MaybeString,
|
||||||
pub persistence_cookiemode: String,
|
pub persistence_cookiemode: String,
|
||||||
#[yaserde(rename = "persistence_cookiename")]
|
|
||||||
pub persistence_cookiename: MaybeString,
|
pub persistence_cookiename: MaybeString,
|
||||||
#[yaserde(rename = "persistence_stripquotes")]
|
|
||||||
pub persistence_stripquotes: u8,
|
pub persistence_stripquotes: u8,
|
||||||
#[yaserde(rename = "stickiness_pattern")]
|
pub stickiness_pattern: MaybeString,
|
||||||
pub stickiness_pattern: String,
|
|
||||||
#[yaserde(rename = "stickiness_dataTypes")]
|
#[yaserde(rename = "stickiness_dataTypes")]
|
||||||
pub stickiness_data_types: MaybeString,
|
pub stickiness_data_types: MaybeString,
|
||||||
#[yaserde(rename = "stickiness_expire")]
|
|
||||||
pub stickiness_expire: String,
|
pub stickiness_expire: String,
|
||||||
#[yaserde(rename = "stickiness_size")]
|
|
||||||
pub stickiness_size: String,
|
pub stickiness_size: String,
|
||||||
#[yaserde(rename = "stickiness_cookiename")]
|
|
||||||
pub stickiness_cookiename: MaybeString,
|
pub stickiness_cookiename: MaybeString,
|
||||||
#[yaserde(rename = "stickiness_cookielength")]
|
|
||||||
pub stickiness_cookielength: MaybeString,
|
pub stickiness_cookielength: MaybeString,
|
||||||
#[yaserde(rename = "stickiness_connRatePeriod")]
|
#[yaserde(rename = "stickiness_connRatePeriod")]
|
||||||
pub stickiness_conn_rate_period: String,
|
pub stickiness_conn_rate_period: String,
|
||||||
@ -1863,12 +1890,6 @@ pub struct StaticRoutes {
|
|||||||
#[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)]
|
#[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)]
|
||||||
pub struct Ca {}
|
pub struct Ca {}
|
||||||
|
|
||||||
#[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)]
|
|
||||||
pub struct Gateways {
|
|
||||||
#[yaserde(rename = "gateway_item")]
|
|
||||||
pub gateway_item: RawXml
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)]
|
#[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)]
|
||||||
pub struct Cert {
|
pub struct Cert {
|
||||||
#[yaserde(attribute)]
|
#[yaserde(attribute)]
|
||||||
@ -1975,14 +1996,14 @@ pub struct Bridges {
|
|||||||
pub struct Gifs {
|
pub struct Gifs {
|
||||||
#[yaserde(attribute)]
|
#[yaserde(attribute)]
|
||||||
pub version: Option<String>,
|
pub version: Option<String>,
|
||||||
pub gif: MaybeString,
|
pub gif: Option<MaybeString>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)]
|
#[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)]
|
||||||
pub struct Gres {
|
pub struct Gres {
|
||||||
#[yaserde(attribute)]
|
#[yaserde(attribute)]
|
||||||
pub version: Option<String>,
|
pub version: Option<String>,
|
||||||
pub gre: MaybeString,
|
pub gre: Option<MaybeString>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)]
|
#[derive(Default, PartialEq, Debug, YaSerialize, YaDeserialize)]
|
||||||
|
|||||||
@ -24,9 +24,10 @@ impl SshConfigManager {
|
|||||||
|
|
||||||
impl SshConfigManager {
|
impl SshConfigManager {
|
||||||
async fn backup_config_remote(&self) -> Result<String, Error> {
|
async fn backup_config_remote(&self) -> Result<String, Error> {
|
||||||
let backup_filename = format!("config_{}.xml", chrono::Local::now().format("%Y%m%d%H%M%S"));
|
let ts = chrono::Utc::now();
|
||||||
|
let backup_filename = format!("config-{}-harmony.xml", ts.format("%s%.3f"));
|
||||||
|
|
||||||
self.opnsense_shell.exec(&format!("cp /conf/config.xml /tmp/{}", backup_filename))
|
self.opnsense_shell.exec(&format!("cp /conf/config.xml /conf/backup/{}", backup_filename))
|
||||||
.await
|
.await
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -84,9 +84,13 @@ impl<'a> DhcpConfig<'a> {
|
|||||||
return Err(DhcpError::InvalidMacAddress(mac));
|
return Err(DhcpError::InvalidMacAddress(mac));
|
||||||
}
|
}
|
||||||
|
|
||||||
if !Self::is_ip_in_range(&ipaddr, range) {
|
// TODO verify if address is in subnet range
|
||||||
return Err(DhcpError::IpAddressOutOfRange(ipaddr.to_string()));
|
// This check here does not do what we want to do, as we want to assign static leases
|
||||||
}
|
// outside of the dynamic DHCP pool
|
||||||
|
//
|
||||||
|
// if !Self::is_ip_in_range(&ipaddr, range) {
|
||||||
|
// return Err(DhcpError::IpAddressOutOfRange(ipaddr.to_string()));
|
||||||
|
// }
|
||||||
|
|
||||||
if existing_mappings.iter().any(|m| {
|
if existing_mappings.iter().any(|m| {
|
||||||
m.ipaddr
|
m.ipaddr
|
||||||
@ -123,7 +127,7 @@ impl<'a> DhcpConfig<'a> {
|
|||||||
|
|
||||||
parts
|
parts
|
||||||
.iter()
|
.iter()
|
||||||
.all(|part| part.len() == 2 && part.chars().all(|c| c.is_ascii_hexdigit()))
|
.all(|part| part.len() <= 2 && part.chars().all(|c| c.is_ascii_hexdigit()))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_ip_in_range(ip: &Ipv4Addr, range: &Range) -> bool {
|
fn is_ip_in_range(ip: &Ipv4Addr, range: &Range) -> bool {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user