diff --git a/harmony/src/domain/topology/ha_cluster.rs b/harmony/src/domain/topology/ha_cluster.rs index 5ceaa8a..d7fc461 100644 --- a/harmony/src/domain/topology/ha_cluster.rs +++ b/harmony/src/domain/topology/ha_cluster.rs @@ -124,6 +124,9 @@ impl DhcpServer for DummyInfra { async fn set_filename(&self, _filename: &str) -> Result<(), ExecutorError> { unimplemented!("{}", UNIMPLEMENTED_DUMMY_INFRA) } + async fn set_filename64(&self, _filename: &str) -> Result<(), ExecutorError> { + unimplemented!("{}", UNIMPLEMENTED_DUMMY_INFRA) + } fn get_ip(&self) -> IpAddress { unimplemented!("{}", UNIMPLEMENTED_DUMMY_INFRA) } diff --git a/harmony/src/domain/topology/network.rs b/harmony/src/domain/topology/network.rs index cd013be..d875b08 100644 --- a/harmony/src/domain/topology/network.rs +++ b/harmony/src/domain/topology/network.rs @@ -49,6 +49,7 @@ pub trait DhcpServer: Send + Sync { async fn set_next_server(&self, ip: IpAddress) -> Result<(), ExecutorError>; async fn set_boot_filename(&self, boot_filename: &str) -> Result<(), ExecutorError>; async fn set_filename(&self, filename: &str) -> Result<(), ExecutorError>; + async fn set_filename64(&self, filename64: &str) -> Result<(), ExecutorError>; fn get_ip(&self) -> IpAddress; fn get_host(&self) -> LogicalHost; async fn commit_config(&self) -> Result<(), ExecutorError>; diff --git a/harmony/src/infra/opnsense/dhcp.rs b/harmony/src/infra/opnsense/dhcp.rs index 6fd0be4..d9a887e 100644 --- a/harmony/src/infra/opnsense/dhcp.rs +++ b/harmony/src/infra/opnsense/dhcp.rs @@ -79,4 +79,14 @@ impl DhcpServer for OPNSenseFirewall { Ok(()) } + + async fn set_filename64(&self, filename: &str) -> Result<(), ExecutorError> { + { + let mut writable_opnsense = self.opnsense_config.write().await; + writable_opnsense.dhcp().set_filename64(filename); + debug!("OPNsense dhcp server set filename {filename}"); + } + + Ok(()) + } } diff --git a/harmony/src/modules/dhcp.rs b/harmony/src/modules/dhcp.rs index f4b5472..db87c81 100644 --- a/harmony/src/modules/dhcp.rs +++ b/harmony/src/modules/dhcp.rs @@ -19,6 +19,7 @@ pub struct DhcpScore { pub next_server: Option, pub boot_filename: Option, pub filename: Option, + pub filename64: Option, pub filename_ipxe: Option, } @@ -139,9 +140,22 @@ impl DhcpInterpret { None => Outcome::noop(), }; + let filename64_outcome = match &self.score.filename64 { + Some(filename64) => { + let dhcp_server = Arc::new(topology.dhcp_server.clone()); + dhcp_server.set_filename64(&filename64).await?; + Outcome::new( + InterpretStatus::SUCCESS, + format!("Dhcp Interpret Set filename64 to {filename64}"), + ) + } + None => Outcome::noop(), + }; + if next_server_outcome.status == InterpretStatus::NOOP && boot_filename_outcome.status == InterpretStatus::NOOP && filename_outcome.status == InterpretStatus::NOOP + && filename64_outcome.status == InterpretStatus::NOOP { return Ok(Outcome::noop()); } @@ -149,8 +163,8 @@ impl DhcpInterpret { Ok(Outcome::new( InterpretStatus::SUCCESS, format!( - "Dhcp Interpret Set next boot to [{:?}], boot_filename to [{:?}], filename to [{:?}]", - self.score.boot_filename, self.score.boot_filename, self.score.filename + "Dhcp Interpret Set next boot to [{:?}], boot_filename to [{:?}], filename to [{:?}], filename64 to [{:?}]", + self.score.boot_filename, self.score.boot_filename, self.score.filename, self.score.filename64 ), )) } diff --git a/harmony/src/modules/okd/bootstrap_dhcp.rs b/harmony/src/modules/okd/bootstrap_dhcp.rs index e9e74c8..0439f41 100644 --- a/harmony/src/modules/okd/bootstrap_dhcp.rs +++ b/harmony/src/modules/okd/bootstrap_dhcp.rs @@ -41,8 +41,9 @@ impl OKDBootstrapDhcpScore { // router address, this is leaking implementation details Some(topology.router.get_gateway()), Some("bootx64.efi".to_string()), - Some(format!("{}:8080/boot.ipxe", topology.router.get_gateway())), Some("undionly.kpxe".to_string()), + Some("ipxe.efi".to_string()), + Some(format!("{}:8080/boot.ipxe", topology.router.get_gateway())), ), } } diff --git a/harmony/src/modules/okd/dhcp.rs b/harmony/src/modules/okd/dhcp.rs index e5cd346..627cf67 100644 --- a/harmony/src/modules/okd/dhcp.rs +++ b/harmony/src/modules/okd/dhcp.rs @@ -35,6 +35,7 @@ impl OKDDhcpScore { boot_filename: None, filename_ipxe: Some(format!("{}:8080/boot.ipxe", topology.router.get_gateway())), filename: Some("undionly.kpxe".to_string()), + filename64: Some("ipxe.efi".to_string()), }, } }