From ba247655bd36a3fd4eede89c880cc238067d1112 Mon Sep 17 00:00:00 2001 From: shimunn <> Date: Wed, 3 Apr 2019 17:54:53 +0200 Subject: [PATCH 1/4] new event system [CI SKIP] --- wg-event-gen/src/gen.rs | 23 +++++-- wg-event-gen/src/listener.rs | 122 ++++++++++++----------------------- 2 files changed, 58 insertions(+), 87 deletions(-) diff --git a/wg-event-gen/src/gen.rs b/wg-event-gen/src/gen.rs index 5a8988a..8f567c2 100644 --- a/wg-event-gen/src/gen.rs +++ b/wg-event-gen/src/gen.rs @@ -26,7 +26,7 @@ pub(crate) fn gen_events( (Some(prev), Some(cur)) => { if let (Some(prev_addr), Some(cur_addr)) = (prev.endpoint, cur.endpoint) { if prev_addr != cur_addr { - listeners.roaming(&cur, prev_addr); + listeners.fire(Event::Roamed(&cur, prev_addr)); } } @@ -48,14 +48,23 @@ pub(crate) fn gen_events( true }; - match (timedout_prev(), timedout_now()) { - (false, true) => listeners.disconnected(&cur), - (true, false) => listeners.connected(&cur), - other => (), + match ( + timedout_prev(), + timedout_now(), + prev.last_handshake.and_then(|p_shake| { + cur.last_handshake + .and_then(|c_shake| c_shake.duration_since(p_shake).ok()) + }), + ) { + (false, true, _) => listeners.fire(Event::Disconnected(&cur)), + (true, false, _) => listeners.fire(Event::Connected(&cur)), + other => { + //dbg!(other); + } } } - (None, Some(cur)) => listeners.added(&cur), - (Some(prev), None) => listeners.removed(&prev), + (None, Some(cur)) => listeners.fire(Event::Added(&cur)), + (Some(prev), None) => listeners.fire(Event::Removed(&prev)), fail => { println!("{:?}", fail); unreachable!() diff --git a/wg-event-gen/src/listener.rs b/wg-event-gen/src/listener.rs index 7b0f994..0d6e0bc 100644 --- a/wg-event-gen/src/listener.rs +++ b/wg-event-gen/src/listener.rs @@ -5,74 +5,43 @@ use std::process::Command; use std::thread; use std::time::SystemTime; +//#[non_exhaustive] +#[derive(Debug, Clone)] +pub enum Event<'a> { + Added(&'a Peer), + Removed(&'a Peer), + Connected(&'a Peer), + Disconnected(&'a Peer), + Roamed(&'a Peer, SocketAddr), +} + pub trait EventListener { - fn added<'a>(&self, peer: &'a Peer) { - self.connected(peer); - } - - fn connected<'a>(&self, peer: &'a Peer); - - fn disconnected<'a>(&self, peer: &'a Peer); - - fn removed<'a>(&self, peer: &'a Peer) { - self.disconnected(peer) - } - - fn roaming<'a>(&self, peer: &'a Peer, previous_addr: SocketAddr); + fn fire<'a>(&self, event: Event<'a>); } impl EventListener for Vec> { - fn added<'a>(&self, peer: &'a Peer) { - if cfg!(feature = "addrem") || cfg!(test) { - self.iter().for_each(|l| l.added(&peer)); - } - } - - fn connected<'a>(&self, peer: &'a Peer) { - self.iter().for_each(|l| l.connected(&peer)); - } - - fn disconnected<'a>(&self, peer: &'a Peer) { - self.iter().for_each(|l| l.disconnected(&peer)); - } - - fn removed<'a>(&self, peer: &'a Peer) { - if cfg!(feature = "addrem") || cfg!(test) { - self.iter().for_each(|l| l.removed(&peer)); - } - } - - fn roaming<'a>(&self, peer: &'a Peer, previous_addr: SocketAddr) { - self.iter().for_each(|l| l.roaming(&peer, previous_addr)); + fn fire<'a>(&self, event: Event<'a>) { + self.iter().for_each(|l| l.fire(event.clone())); } } pub struct LogListener; impl EventListener for LogListener { - fn connected<'a>(&self, peer: &'a Peer) { - println!("{} connected!", peer.key); - } - - fn disconnected<'a>(&self, peer: &'a Peer) { - println!("{} disconnected!", peer.key); - } - - fn added<'a>(&self, peer: &'a Peer) { - println!("{} added!", peer.key); - } - - fn removed<'a>(&self, peer: &'a Peer) { - println!("{} removed!", peer.key); - } - - fn roaming<'a>(&self, peer: &'a Peer, previous_addr: SocketAddr) { - println!( - "{} roamed {} -> {}!", - peer.key, - previous_addr, - peer.endpoint.unwrap() - ); + fn fire<'a>(&self, event: Event<'a>) { + match event { + Event::Connected(peer) => println!("{} connected!", peer.key), + Event::Disconnected(peer) => println!("{} disconnected!", peer.key), + Event::Added(peer) => println!("{} added!", peer.key), + Event::Removed(peer) => println!("{} removed!", peer.key), + Event::Roamed(peer, previous_addr) => println!( + "{} roamed {} -> {}!", + peer.key, + previous_addr, + peer.endpoint.unwrap() + ), + _ => unimplemented!(), + } } } @@ -134,27 +103,20 @@ impl ScriptListener { } impl EventListener for ScriptListener { - fn connected<'a>(&self, peer: &'a Peer) { - self.call_sub(vec!["connected", &self.peer_props(peer)]); - } - - fn disconnected<'a>(&self, peer: &'a Peer) { - self.call_sub(vec!["disconnected", &self.peer_props(peer)]); - } - - fn added<'a>(&self, peer: &'a Peer) { - self.call_sub(vec!["added", &self.peer_props(peer)]); - } - - fn removed<'a>(&self, peer: &'a Peer) { - self.call_sub(vec!["removed", &self.peer_props(peer)]); - } - - fn roaming<'a>(&self, peer: &'a Peer, previous_addr: SocketAddr) { - self.call_sub(vec![ - "roaming", - &self.peer_props(peer), - &previous_addr.to_string(), - ]); + fn fire<'a>(&self, event: Event<'a>) { + match event { + Event::Connected(peer) => self.call_sub(vec!["connected", &self.peer_props(peer)]), + Event::Disconnected(peer) => { + self.call_sub(vec!["disconnected", &self.peer_props(peer)]) + } + Event::Added(peer) => self.call_sub(vec!["added", &self.peer_props(peer)]), + Event::Removed(peer) => self.call_sub(vec!["removed", &self.peer_props(peer)]), + Event::Roamed(peer, previous_addr) => self.call_sub(vec![ + "roaming", + &self.peer_props(peer), + &previous_addr.to_string(), + ]), + _ => unimplemented!(), + } } } From a2cda16977b0ce4bfb5aefef1e248da47a1247db Mon Sep 17 00:00:00 2001 From: shimunn <> Date: Thu, 4 Apr 2019 18:59:17 +0200 Subject: [PATCH 2/4] handle timeouts based on the existence of last_handshake --- wg-event-gen/src/gen.rs | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/wg-event-gen/src/gen.rs b/wg-event-gen/src/gen.rs index 5a8988a..731db5d 100644 --- a/wg-event-gen/src/gen.rs +++ b/wg-event-gen/src/gen.rs @@ -30,23 +30,9 @@ pub(crate) fn gen_events( } } - let timedout_now = || { - if let Some(shake) = cur.last_handshake { - if let Ok(el) = shake.elapsed() { - return el > timeout && el + poll_interval < timeout; - } - } - true - }; + let timedout_now = || !cur.last_handshake.is_some(); - let timedout_prev = || { - if let Some(shake) = prev.last_handshake { - if let Ok(el) = shake.elapsed().map(|el| el - poll_interval) { - return el > timeout && el < timeout + poll_interval; - } - } - true - }; + let timedout_prev = || !prev.last_handshake.is_some(); match (timedout_prev(), timedout_now()) { (false, true) => listeners.disconnected(&cur), From f3eeac404cb08a459f6a6780f46739a2aa46c71b Mon Sep 17 00:00:00 2001 From: shimunn <> Date: Thu, 4 Apr 2019 20:34:39 +0200 Subject: [PATCH 3/4] added transfered event [CI SKIP] --- wg-event-gen/src/gen.rs | 9 +++++++++ wg-event-gen/src/listener.rs | 4 ++++ 2 files changed, 13 insertions(+) diff --git a/wg-event-gen/src/gen.rs b/wg-event-gen/src/gen.rs index 8f567c2..8091896 100644 --- a/wg-event-gen/src/gen.rs +++ b/wg-event-gen/src/gen.rs @@ -62,6 +62,15 @@ pub(crate) fn gen_events( //dbg!(other); } } + if prev.traffic != cur.traffic { + if let ((p_tx, p_rx), (c_tx, c_rx)) = (prev.traffic, cur.traffic) { + listeners.fire(Event::Tranfered { + peer: &cur, + tx: c_tx - p_tx, + rx: c_rx - p_rx, + }); + } + } } (None, Some(cur)) => listeners.fire(Event::Added(&cur)), (Some(prev), None) => listeners.fire(Event::Removed(&prev)), diff --git a/wg-event-gen/src/listener.rs b/wg-event-gen/src/listener.rs index 0d6e0bc..8b8562f 100644 --- a/wg-event-gen/src/listener.rs +++ b/wg-event-gen/src/listener.rs @@ -13,6 +13,7 @@ pub enum Event<'a> { Connected(&'a Peer), Disconnected(&'a Peer), Roamed(&'a Peer, SocketAddr), + Tranfered { peer: &'a Peer, tx: u64, rx: u64 }, } pub trait EventListener { @@ -40,6 +41,9 @@ impl EventListener for LogListener { previous_addr, peer.endpoint.unwrap() ), + Event::Tranfered { peer, tx, rx } => { + println!("{} transfered {} up, {} down", peer.key, tx, rx) + } _ => unimplemented!(), } } From 0301a53ac966d39eb4e25ad02229fcd3ec5f5666 Mon Sep 17 00:00:00 2001 From: shimunn <> Date: Thu, 4 Apr 2019 21:16:49 +0200 Subject: [PATCH 4/4] implemented listeners for transfered event [CI SKIP] --- handler.sh | 3 +++ wg-event-gen/Cargo.lock | 7 +++++++ wg-event-gen/Cargo.toml | 1 + wg-event-gen/src/gen.rs | 2 +- wg-event-gen/src/listener.rs | 35 ++++++++++++++++++++++++++++++++--- 5 files changed, 44 insertions(+), 4 deletions(-) diff --git a/handler.sh b/handler.sh index 82ab0ed..47663aa 100644 --- a/handler.sh +++ b/handler.sh @@ -24,10 +24,13 @@ case "$EVENT" in PREV_ENDPOINT=$8 ;; "added") + ;; "removed") ;; +"transfered") + *) exit 1 ;; diff --git a/wg-event-gen/Cargo.lock b/wg-event-gen/Cargo.lock index 05274a0..30314c1 100644 --- a/wg-event-gen/Cargo.lock +++ b/wg-event-gen/Cargo.lock @@ -132,6 +132,11 @@ name = "libc" version = "0.2.47" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "number_prefix" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "proc-macro2" version = "0.4.27" @@ -251,6 +256,7 @@ dependencies = [ "base64 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "derive_builder 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "number_prefix 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "structopt 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", "structopt-derive 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", @@ -292,6 +298,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "805026a5d0141ffc30abb3be3173848ad46a1b1664fe632428479619a3644d77" "checksum ident_case 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" "checksum libc 0.2.47 (registry+https://github.com/rust-lang/crates.io-index)" = "48450664a984b25d5b479554c29cc04e3150c97aa4c01da5604a2d4ed9151476" +"checksum number_prefix 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "17b02fc0ff9a9e4b35b3342880f48e896ebf69f2967921fe8646bf5b7125956a" "checksum proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)" = "4d317f9caece796be1980837fd5cb3dfec5613ebdb04ad0956deea83ce168915" "checksum quote 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)" = "53fa22a1994bd0f9372d7a816207d8a2677ad0325b073f5c5332760f0fb62b5c" "checksum redox_syscall 0.1.50 (registry+https://github.com/rust-lang/crates.io-index)" = "52ee9a534dc1301776eff45b4fa92d2c39b1d8c3d3357e6eb593e0d795506fc2" diff --git a/wg-event-gen/Cargo.toml b/wg-event-gen/Cargo.toml index b7f2272..ca9ad05 100644 --- a/wg-event-gen/Cargo.toml +++ b/wg-event-gen/Cargo.toml @@ -11,6 +11,7 @@ time = "0.1.42" structopt = "0.2.14" structopt-derive = "0.2.14" derive_builder = "0.7.1" +number_prefix = "0.3.0" [profile.release] lto = true diff --git a/wg-event-gen/src/gen.rs b/wg-event-gen/src/gen.rs index be7643b..3b3f5f2 100644 --- a/wg-event-gen/src/gen.rs +++ b/wg-event-gen/src/gen.rs @@ -50,7 +50,7 @@ pub(crate) fn gen_events( } if prev.traffic != cur.traffic { if let ((p_tx, p_rx), (c_tx, c_rx)) = (prev.traffic, cur.traffic) { - listeners.fire(Event::Tranfered { + listeners.fire(Event::Transfered { peer: &cur, tx: c_tx - p_tx, rx: c_rx - p_rx, diff --git a/wg-event-gen/src/listener.rs b/wg-event-gen/src/listener.rs index 8b8562f..38c54c6 100644 --- a/wg-event-gen/src/listener.rs +++ b/wg-event-gen/src/listener.rs @@ -1,4 +1,5 @@ use crate::Peer; +use number_prefix::{NumberPrefix, Prefixed, Standalone}; use std::net::SocketAddr; use std::path::PathBuf; use std::process::Command; @@ -13,14 +14,19 @@ pub enum Event<'a> { Connected(&'a Peer), Disconnected(&'a Peer), Roamed(&'a Peer, SocketAddr), - Tranfered { peer: &'a Peer, tx: u64, rx: u64 }, + Transfered { peer: &'a Peer, tx: u64, rx: u64 }, } pub trait EventListener { + fn name(&self) -> &'static str; + fn fire<'a>(&self, event: Event<'a>); } impl EventListener for Vec> { + fn name(&self) -> &'static str { + "List of Listeners" + } fn fire<'a>(&self, event: Event<'a>) { self.iter().for_each(|l| l.fire(event.clone())); } @@ -29,6 +35,10 @@ impl EventListener for Vec> { pub struct LogListener; impl EventListener for LogListener { + fn name(&self) -> &'static str { + "Log" + } + fn fire<'a>(&self, event: Event<'a>) { match event { Event::Connected(peer) => println!("{} connected!", peer.key), @@ -41,9 +51,19 @@ impl EventListener for LogListener { previous_addr, peer.endpoint.unwrap() ), - Event::Tranfered { peer, tx, rx } => { - println!("{} transfered {} up, {} down", peer.key, tx, rx) + Event::Transfered { peer, tx, rx } => { + let prefix = |cnt: u64| match NumberPrefix::binary(cnt as f64) { + Standalone(bytes) => format!("{}B", bytes), + Prefixed(prefix, n) => format!("{:.0} {}B", n, prefix), + }; + println!( + "{} transfered {} up, {} down", + peer.key, + prefix(tx), + prefix(rx) + ); } + _ => unimplemented!(), } } @@ -107,6 +127,9 @@ impl ScriptListener { } impl EventListener for ScriptListener { + fn name(&self) -> &'static str { + "Script" + } fn fire<'a>(&self, event: Event<'a>) { match event { Event::Connected(peer) => self.call_sub(vec!["connected", &self.peer_props(peer)]), @@ -120,6 +143,12 @@ impl EventListener for ScriptListener { &self.peer_props(peer), &previous_addr.to_string(), ]), + Event::Transfered { peer, tx, rx } => self.call_sub(vec![ + "transfered", + &self.peer_props(peer), + &tx.to_string(), + &rx.to_string(), + ]), _ => unimplemented!(), } }