diff options
author | HimbeerserverDE <himbeerserverde@gmail.com> | 2023-03-04 17:56:09 +0100 |
---|---|---|
committer | HimbeerserverDE <himbeerserverde@gmail.com> | 2023-03-04 17:56:09 +0100 |
commit | 0949b26177418518aaa61ea488cae7c2e6183cc8 (patch) | |
tree | f69fb54f1eca7b9ac4e3d79577e216518a0978f5 /src/main.rs | |
parent | ea80252f062eb0d825f4ad49fb80e16578391420 (diff) |
add LeaseFileManager
leases can now be saved on persistent storage and are preserved across restarts
Diffstat (limited to 'src/main.rs')
-rw-r--r-- | src/main.rs | 32 |
1 files changed, 25 insertions, 7 deletions
diff --git a/src/main.rs b/src/main.rs index 99d467a..694a4f7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,18 +1,36 @@ use dhcp4d::error::{Error, Result}; -use dhcp4d::lease::{LeaseDummyManager, LeaseManager}; +use dhcp4d::lease::{LeaseFileManager, LeaseFileManagerConfig, LeaseManager}; use dhcp4d::util::{format_client_id, local_ip}; +use std::fs::OpenOptions; use std::mem::MaybeUninit; use std::net::{IpAddr, SocketAddr, SocketAddrV4}; use std::sync::{Arc, Mutex}; use std::thread; +use std::time::Duration; use dhcproto::v4::{DhcpOption, Flags, Message, MessageType, Opcode, OptionCode}; use dhcproto::{Decodable, Decoder, Encodable, Encoder}; use socket2::{Domain, Socket, Type}; fn main() -> Result<()> { - let lease_mgr = Arc::new(Mutex::new(LeaseDummyManager::new(None))); + let config = LeaseFileManagerConfig { + range: ( + "198.51.100.100".parse().unwrap(), + "198.51.100.249".parse().unwrap(), + ), + netmask: "255.255.255.0".parse().unwrap(), + lease_time: Duration::from_secs(300), + }; + + let file = OpenOptions::new() + .create(true) + .read(true) + .write(true) + .truncate(false) + .open("leases.json")?; + + let lease_mgr = Arc::new(Mutex::new(LeaseFileManager::new(config, file)?)); let mut threads = Vec::new(); for arg in std::env::args().skip(1) { @@ -27,7 +45,7 @@ fn main() -> Result<()> { Ok(()) } -fn run(link: String, lease_mgr: Arc<Mutex<LeaseDummyManager>>) -> Result<()> { +fn run<T: LeaseManager>(link: String, lease_mgr: Arc<Mutex<T>>) -> Result<()> { let sock = Socket::new(Domain::IPV4, Type::DGRAM, None)?; let addresses = linkaddrs::ipv4_addresses(link)?; @@ -56,9 +74,9 @@ fn run(link: String, lease_mgr: Arc<Mutex<LeaseDummyManager>>) -> Result<()> { } } -fn handle_request( +fn handle_request<T: LeaseManager>( sock: &Socket, - lease_mgr: Arc<Mutex<LeaseDummyManager>>, + lease_mgr: Arc<Mutex<T>>, buf: &[u8], remote: SocketAddrV4, ) -> Result<()> { @@ -144,7 +162,7 @@ fn handle_request( _ => unreachable!(), }; - if !lease_mgr.request(*requested_addr, client_id) { + if !lease_mgr.request(*requested_addr, client_id)? { let own_addr = local_ip(sock); let mut resp = Message::default(); @@ -225,7 +243,7 @@ fn handle_request( let mut lease_mgr = lease_mgr.lock().unwrap(); let released: Vec<String> = lease_mgr - .release(client_id) + .release(client_id)? .map(|addr| addr.to_string()) .collect(); |