forked from NationTech/harmony
		
	Introduce a new module and interface for serving files via TFTP in the HAClusterTopology structure. This includes adding the necessary dependencies, creating the `TftpServer` trait, implementing it where appropriate, and integrating its usage within the topology struct. Reviewed-on: https://git.nationtech.io/NationTech/harmony/pulls/10 Co-authored-by: Jean-Gabriel Gill-Couture <jg@nationtech.io> Co-committed-by: Jean-Gabriel Gill-Couture <jg@nationtech.io>
		
			
				
	
	
		
			72 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			72 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| use async_trait::async_trait;
 | |
| use log::debug;
 | |
| 
 | |
| use crate::{executors::ExecutorError, topology::{DHCPStaticEntry, DhcpServer, IpAddress, LogicalHost}};
 | |
| 
 | |
| use super::OPNSenseFirewall;
 | |
| 
 | |
| #[async_trait]
 | |
| impl DhcpServer for OPNSenseFirewall {
 | |
|     async fn commit_config(&self) -> Result<(), ExecutorError> {
 | |
|         OPNSenseFirewall::commit_config(self).await
 | |
|     }
 | |
| 
 | |
|     async fn add_static_mapping(&self, entry: &DHCPStaticEntry) -> Result<(), ExecutorError> {
 | |
|         let mac: String = String::from(&entry.mac);
 | |
| 
 | |
|         {
 | |
|             let mut writable_opnsense = self.opnsense_config.write().await;
 | |
|             writable_opnsense
 | |
|                 .dhcp()
 | |
|                 .add_static_mapping(&mac, entry.ip, &entry.name)
 | |
|                 .unwrap();
 | |
|         }
 | |
| 
 | |
|         debug!("Registered {:?}", entry);
 | |
|         Ok(())
 | |
|     }
 | |
| 
 | |
|     async fn remove_static_mapping(
 | |
|         &self,
 | |
|         _mac: &crate::topology::MacAddress,
 | |
|     ) -> Result<(), ExecutorError> {
 | |
|         todo!()
 | |
|     }
 | |
| 
 | |
|     async fn list_static_mappings(&self) -> Vec<(crate::topology::MacAddress, IpAddress)> {
 | |
|         todo!()
 | |
|     }
 | |
| 
 | |
|     fn get_ip(&self) -> IpAddress {
 | |
|         OPNSenseFirewall::get_ip(self)
 | |
|     }
 | |
| 
 | |
|     fn get_host(&self) -> LogicalHost {
 | |
|         self.host.clone()
 | |
|     }
 | |
| 
 | |
|     async fn set_next_server(&self, ip: IpAddress) -> Result<(), ExecutorError> {
 | |
|         let ipv4 = match ip {
 | |
|             std::net::IpAddr::V4(ipv4_addr) => ipv4_addr,
 | |
|             std::net::IpAddr::V6(_) => todo!("ipv6 not supported yet"),
 | |
|         };
 | |
|         {
 | |
|             let mut writable_opnsense = self.opnsense_config.write().await;
 | |
|             writable_opnsense.dhcp().set_next_server(ipv4);
 | |
|             debug!("OPNsense dhcp server set next server {ipv4}");
 | |
|         }
 | |
| 
 | |
|         Ok(())
 | |
|     }
 | |
| 
 | |
|     async fn set_boot_filename(&self, boot_filename: &str) -> Result<(), ExecutorError> {
 | |
|         {
 | |
|             let mut writable_opnsense = self.opnsense_config.write().await;
 | |
|             writable_opnsense.dhcp().set_boot_filename(boot_filename);
 | |
|             debug!("OPNsense dhcp server set boot filename {boot_filename}");
 | |
|         }
 | |
| 
 | |
|         Ok(())
 | |
|     }
 | |
| }
 |