diff options
author | HimbeerserverDE <himbeerserverde@gmail.com> | 2023-03-17 15:36:06 +0100 |
---|---|---|
committer | HimbeerserverDE <himbeerserverde@gmail.com> | 2023-03-17 15:36:06 +0100 |
commit | 0653235b277c8b9b0a6f54db52490bcbad7ea8d1 (patch) | |
tree | 902b35fbfbaa0be26a09fdf6c350270d8de77417 | |
parent | f8338ce8049441908f9cdc646332dbee49a95176 (diff) |
write a 'lease' file
-rw-r--r-- | Cargo.lock | 45 | ||||
-rw-r--r-- | Cargo.toml | 2 | ||||
-rw-r--r-- | src/client.rs | 32 | ||||
-rw-r--r-- | src/error.rs | 8 | ||||
-rw-r--r-- | src/main.rs | 21 |
5 files changed, 97 insertions, 11 deletions
@@ -288,6 +288,12 @@ dependencies = [ ] [[package]] +name = "itoa" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" + +[[package]] name = "kernel32-sys" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -586,6 +592,8 @@ dependencies = [ "md5", "pppoe", "rand", + "serde", + "serde_json", "thiserror", "tun-tap", ] @@ -606,6 +614,12 @@ dependencies = [ ] [[package]] +name = "ryu" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" + +[[package]] name = "scoped-tls" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -633,6 +647,37 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] +name = "serde" +version = "1.0.156" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "314b5b092c0ade17c00142951e50ced110ec27cea304b1037c6969246c2469a4" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.156" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7e29c4601e36bcec74a223228dce795f4cd3616341a4af93520ca1a837c087d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.94" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c533a59c9d8a93a09c6ab31f0fd5e5f4dd1b8fc9434804029839884765d04ea" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] name = "shlex" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -12,5 +12,7 @@ byteorder = "1.4.3" md5 = "0.7.0" pppoe = { git = "https://github.com/rsdsl/pppoe-rs", version = "0.1.0", features = ["socket"] } rand = "0.8.5" +serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" thiserror = "1.0" tun-tap = "0.1.3" diff --git a/src/client.rs b/src/client.rs index 84baf10..a31d0fc 100644 --- a/src/client.rs +++ b/src/client.rs @@ -21,10 +21,11 @@ use pppoe::HeaderBuilder; use pppoe::Packet; use pppoe::Socket; use pppoe::Tag; +use serde::{Deserialize, Serialize}; const BROADCAST: [u8; 6] = [0xff, 0xff, 0xff, 0xff, 0xff, 0xff]; -#[derive(Clone, Copy, Debug, PartialEq)] +#[derive(Clone, Copy, Debug, PartialEq, Serialize, Deserialize)] pub struct IpConfig { pub addr: Ipv4Addr, pub dns1: Ipv4Addr, @@ -81,10 +82,14 @@ impl Client { }) } - pub fn run(self, ip_tx: mpsc::Sender<Vec<u8>>) -> Result<()> { + pub fn run( + self, + ip_tx: mpsc::Sender<Vec<u8>>, + ipchange_tx: mpsc::Sender<IpConfig>, + ) -> Result<()> { if !self.inner.read().unwrap().started { let clt = self.clone(); - let handle = thread::spawn(move || clt.recv_loop(ip_tx)); + let handle = thread::spawn(move || clt.recv_loop(ip_tx, ipchange_tx)); self.discover()?; @@ -369,14 +374,19 @@ impl Client { Ok(()) } - fn handle_ppp(&self, header: &Header, ip_tx: &mpsc::Sender<Vec<u8>>) -> Result<()> { + fn handle_ppp( + &self, + header: &Header, + ip_tx: &mpsc::Sender<Vec<u8>>, + ipchange_tx: &mpsc::Sender<IpConfig>, + ) -> Result<()> { let ppp = ppp::Header::with_buffer(header.payload())?; let protocol = ppp.protocol(); match protocol { LCP => self.handle_lcp(ppp), CHAP => self.handle_chap(ppp), - IPCP => self.handle_ipcp(ppp), + IPCP => self.handle_ipcp(ppp, ipchange_tx), IPV4 => self.handle_ipv4(ppp, ip_tx), _ => Err(Error::InvalidProtocol(protocol)), } @@ -553,7 +563,7 @@ impl Client { } } - fn handle_ipcp(&self, header: ppp::Header) -> Result<()> { + fn handle_ipcp(&self, header: ppp::Header, tx: &mpsc::Sender<IpConfig>) -> Result<()> { let ipcp = ipcp::Header::with_buffer(header.payload())?; let ipcp_code = ipcp.code(); @@ -578,6 +588,7 @@ impl Client { .ok_or(Error::MissingIpAddr)?; self.set_ip_config(ip_config); + tx.send(ip_config)?; let limit = ipcp.payload().len(); @@ -642,6 +653,7 @@ impl Client { .ok_or(Error::MissingSecondaryDns)?; self.set_ip_config(ip_config); + tx.send(ip_config)?; println!("ip configuration acknowledged by peer, options: {:?}", opts); println!( @@ -695,7 +707,11 @@ impl Client { Ok(()) } - fn recv_loop(&self, ip_tx: mpsc::Sender<Vec<u8>>) -> Result<()> { + fn recv_loop( + &self, + ip_tx: mpsc::Sender<Vec<u8>>, + ipchange_tx: mpsc::Sender<IpConfig>, + ) -> Result<()> { loop { let mut buf = [0; 1024]; @@ -713,7 +729,7 @@ impl Client { match match code { PPP => { if let State::Session(_) = self.state() { - self.handle_ppp(header, &ip_tx) + self.handle_ppp(header, &ip_tx, &ipchange_tx) } else { Err(Error::UnexpectedPpp) } diff --git a/src/error.rs b/src/error.rs index f6c4104..72c38d2 100644 --- a/src/error.rs +++ b/src/error.rs @@ -1,3 +1,5 @@ +use crate::client::IpConfig; + use std::io; use std::string; use std::sync::mpsc; @@ -49,13 +51,17 @@ pub enum Error { #[error("failed to convert string from UTF-8")] Utf8(#[from] string::FromUtf8Error), #[error("mpsc send error")] - MpscSend(#[from] mpsc::SendError<Vec<u8>>), + MpscSendBytes(#[from] mpsc::SendError<Vec<u8>>), + #[error("mpsc send error")] + MpscSendIpConfig(#[from] mpsc::SendError<IpConfig>), #[error("mpsc receive error")] MpscRecv(#[from] mpsc::RecvError), #[error("pppoe error: {0:?}")] Pppoe(pppoe::error::Error), #[error("pppoe parse error: {0:?}")] PppoeParse(pppoe::error::ParseError), + #[error("serde json error")] + SerdeJson(#[from] serde_json::Error), } impl From<pppoe::error::Error> for Error { diff --git a/src/main.rs b/src/main.rs index 8194b0f..ae127bc 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,7 +1,8 @@ -use rsdsl_pppoe::client::Client; +use rsdsl_pppoe::client::{Client, IpConfig}; use rsdsl_pppoe::error::{Error, Result}; use std::env; +use std::fs::File; use std::sync::mpsc; use std::sync::Arc; use std::thread; @@ -53,6 +54,15 @@ fn ppp2tun(rx: mpsc::Receiver<Vec<u8>>, tun: Arc<Iface>) -> Result<()> { } } +fn write_config(rx: mpsc::Receiver<IpConfig>) -> Result<()> { + loop { + let ip_config = rx.recv()?; + + let mut file = File::create("/data/pppoe.ip_config")?; + serde_json::to_writer_pretty(&mut file, &ip_config)?; + } +} + fn main() -> Result<()> { let link = env::args().nth(1).ok_or(Error::MissingInterface)?; @@ -72,7 +82,14 @@ fn main() -> Result<()> { Err(e) => panic!("ppp2tun error: {}", e), }); + let (ipchange_tx, ipchange_rx) = mpsc::channel(); + thread::spawn(move || match write_config(ipchange_rx) { + Ok(_) => unreachable!(), + Err(e) => panic!("write_config error: {}", e), + }); + + // clone tx so that ppp2tun doesn't panic when ppp link closes #[allow(clippy::redundant_clone)] - clt.run(tx.clone())?; // clone so that ppp2tun doesn't panic when ppp link closes + clt.run(tx.clone(), ipchange_tx)?; Ok(()) } |