aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHimbeerserverDE <himbeerserverde@gmail.com>2023-08-13 17:48:17 +0200
committerHimbeerserverDE <himbeerserverde@gmail.com>2023-08-13 17:48:17 +0200
commit87aaae40f714b9728e4c55ccf51d9bc100b79fd9 (patch)
tree1081dc05441d65bd22c84b0820398e42a2fd1056
parentcdd3791641b8fe29a06d8e4c6a9558a4180a4ac4 (diff)
write resulting lease to file
-rw-r--r--Cargo.lock9
-rw-r--r--Cargo.toml1
-rw-r--r--src/main.rs36
3 files changed, 44 insertions, 2 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 6adc295..845b91a 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -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"
diff --git a/Cargo.toml b/Cargo.toml
index 8d106ea..c3a8d7e 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -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(())
+}