diff options
author | HimbeerserverDE <himbeerserverde@gmail.com> | 2023-08-13 17:48:17 +0200 |
---|---|---|
committer | HimbeerserverDE <himbeerserverde@gmail.com> | 2023-08-13 17:48:17 +0200 |
commit | 87aaae40f714b9728e4c55ccf51d9bc100b79fd9 (patch) | |
tree | 1081dc05441d65bd22c84b0820398e42a2fd1056 | |
parent | cdd3791641b8fe29a06d8e4c6a9558a4180a4ac4 (diff) |
write resulting lease to file
-rw-r--r-- | Cargo.lock | 9 | ||||
-rw-r--r-- | Cargo.toml | 1 | ||||
-rw-r--r-- | src/main.rs | 36 |
3 files changed, 44 insertions, 2 deletions
@@ -640,6 +640,7 @@ dependencies = [ "rand", "rsdsl_ip_config", "rsdsl_netlinkd", + "rsdsl_pd_config", "serde_json", "socket2", "thiserror", @@ -670,6 +671,14 @@ dependencies = [ ] [[package]] +name = "rsdsl_pd_config" +version = "0.1.0" +source = "git+https://github.com/rsdsl/pd_config.git#98ee1876a08a1c3844d0b439a8ba52e5b3423810" +dependencies = [ + "serde", +] + +[[package]] name = "rtnetlink" version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -11,6 +11,7 @@ libc = "0.2.147" rand = "0.8.5" rsdsl_ip_config = { git = "https://github.com/rsdsl/ip_config.git", version = "0.2.1" } rsdsl_netlinkd = { git = "https://github.com/rsdsl/netlinkd.git", version = "0.5.0" } +rsdsl_pd_config = { git = "https://github.com/rsdsl/pd_config.git", version = "0.1.0" } serde_json = "1.0" socket2 = "0.5.3" thiserror = "1.0" diff --git a/src/main.rs b/src/main.rs index c397bb8..4eb599b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -8,12 +8,13 @@ use std::sync::{Arc, Mutex}; use std::thread; use std::time::Duration; -use dhcproto::v6::{duid::Duid, DhcpOption, Message, MessageType, OptionCode, IAPD, ORO}; +use dhcproto::v6::{duid::Duid, DhcpOption, IAPrefix, Message, MessageType, OptionCode, IAPD, ORO}; use dhcproto::{Decodable, Decoder, Encodable, Encoder, Name}; use rsdsl_dhcp6::util::setsockopt; use rsdsl_dhcp6::{Error, Result}; use rsdsl_ip_config::DsConfig; use rsdsl_netlinkd::link; +use rsdsl_pd_config::PdConfig; use socket2::{Domain, SockAddr, Socket, Type}; use trust_dns_proto::serialize::binary::BinDecodable; @@ -215,6 +216,11 @@ fn handle_response( match *state { State::Request(ref client_id, ..) => { + // TODO: launch renewer + let aftr = aftr.map(|v| v.to_utf8()); + + update_pdconfig(ia_prefix, &aftr); + println!( " <- [{}] confirm pd {}/{} valid {} pref {}, aftr {}", remote, @@ -222,7 +228,7 @@ fn handle_response( ia_prefix.prefix_len, ia_prefix.valid_lifetime, ia_prefix.preferred_lifetime, - aftr.map(|v| v.to_utf8()).unwrap_or("unset".into()) + aftr.unwrap_or("unset".into()) ); *state = State::Active(client_id.clone(), remote); } @@ -324,3 +330,29 @@ fn send_to_exact(sock: &Socket, buf: &[u8], dst: &SockAddr) -> Result<()> { Ok(()) } } + +fn update_pdconfig(ia_prefix: &IAPrefix, aftr: &Option<String>) { + match write_pdconfig(ia_prefix, aftr) { + Ok(_) => println!("<-> write pd config to {}", rsdsl_pd_config::LOCATION), + Err(e) => println!( + "<-> can't write pd config to {}: {}", + rsdsl_pd_config::LOCATION, + e + ), + } +} + +fn write_pdconfig(ia_prefix: &IAPrefix, aftr: &Option<String>) -> Result<()> { + let pdconfig = PdConfig { + prefix: ia_prefix.prefix_ip, + len: ia_prefix.prefix_len, + validlft: ia_prefix.valid_lifetime, + preflft: ia_prefix.preferred_lifetime, + aftr: aftr.clone(), + }; + + let mut file = File::create(rsdsl_pd_config::LOCATION)?; + serde_json::to_writer_pretty(&mut file, &pdconfig)?; + + Ok(()) +} |