feat: support new configurable field in dhcp config: filenameipxe

This commit is contained in:
Sylvain Tremblay 2025-03-01 10:51:01 -05:00
parent 8118df85ee
commit 51aeea1ec9
5 changed files with 31 additions and 4 deletions

View File

@ -127,6 +127,9 @@ impl DhcpServer for DummyInfra {
async fn set_filename64(&self, _filename: &str) -> Result<(), ExecutorError> {
unimplemented!("{}", UNIMPLEMENTED_DUMMY_INFRA)
}
async fn set_filenameipxe(&self, _filenameipxe: &str) -> Result<(), ExecutorError> {
unimplemented!("{}", UNIMPLEMENTED_DUMMY_INFRA)
}
fn get_ip(&self) -> IpAddress {
unimplemented!("{}", UNIMPLEMENTED_DUMMY_INFRA)
}

View File

@ -50,6 +50,7 @@ pub trait DhcpServer: Send + Sync {
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>;
async fn set_filenameipxe(&self, filenameipxe: &str) -> Result<(), ExecutorError>;
fn get_ip(&self) -> IpAddress;
fn get_host(&self) -> LogicalHost;
async fn commit_config(&self) -> Result<(), ExecutorError>;

View File

@ -89,4 +89,14 @@ impl DhcpServer for OPNSenseFirewall {
Ok(())
}
async fn set_filenameipxe(&self, filenameipxe: &str) -> Result<(), ExecutorError> {
{
let mut writable_opnsense = self.opnsense_config.write().await;
writable_opnsense.dhcp().set_filenameipxe(filenameipxe);
debug!("OPNsense dhcp server set filenameipxe {filenameipxe}");
}
Ok(())
}
}

View File

@ -20,7 +20,7 @@ pub struct DhcpScore {
pub boot_filename: Option<String>,
pub filename: Option<String>,
pub filename64: Option<String>,
pub filename_ipxe: Option<String>,
pub filenameipxe: Option<String>,
}
impl Score for DhcpScore {
@ -152,10 +152,23 @@ impl DhcpInterpret {
None => Outcome::noop(),
};
let filenameipxe_outcome = match &self.score.filenameipxe {
Some(filenameipxe) => {
let dhcp_server = Arc::new(topology.dhcp_server.clone());
dhcp_server.set_filenameipxe(&filenameipxe).await?;
Outcome::new(
InterpretStatus::SUCCESS,
format!("Dhcp Interpret Set filenameipxe to {filenameipxe}"),
)
}
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
&& filenameipxe_outcome.status == InterpretStatus::NOOP
{
return Ok(Outcome::noop());
}
@ -163,8 +176,8 @@ impl DhcpInterpret {
Ok(Outcome::new(
InterpretStatus::SUCCESS,
format!(
"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
"Dhcp Interpret Set next boot to [{:?}], boot_filename to [{:?}], filename to [{:?}], filename64 to [{:?}], filenameipxe to [:{:?}]",
self.score.boot_filename, self.score.boot_filename, self.score.filename, self.score.filename64, self.score.filenameipxe
),
))
}

View File

@ -33,7 +33,7 @@ impl OKDDhcpScore {
host_binding,
next_server: Some(topology.router.get_gateway()),
boot_filename: None,
filename_ipxe: Some(format!("{}:8080/boot.ipxe", topology.router.get_gateway())),
filenameipxe: Some(format!("{}:8080/boot.ipxe", topology.router.get_gateway())),
filename: Some("undionly.kpxe".to_string()),
filename64: Some("ipxe.efi".to_string()),
},