From e56376778d7fa3a482593281dd296d96d22a0a88 Mon Sep 17 00:00:00 2001 From: shimunn <> Date: Wed, 3 Apr 2019 20:07:23 +0200 Subject: [PATCH 1/4] reimplemented -I option [CI SKIP] --- wg-event-gen/src/main.rs | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/wg-event-gen/src/main.rs b/wg-event-gen/src/main.rs index 8a96683..609a9ee 100644 --- a/wg-event-gen/src/main.rs +++ b/wg-event-gen/src/main.rs @@ -17,9 +17,10 @@ use controller::Userspace; use model::WireguardController; use opts::Opts; use std::collections::HashMap; +use std::error::Error; use std::io; use std::thread::sleep; -use std::time::{Duration, SystemTime,Instant, UNIX_EPOCH}; +use std::time::{Duration, Instant, SystemTime, UNIX_EPOCH}; use structopt::StructOpt; fn listeners(opts: &Opts) -> Vec> { @@ -49,7 +50,17 @@ fn main() -> io::Result<()> { let start = SystemTime::now(); loop { let now = Instant::now(); - let peers = controller.peers()?; + let peers = match controller.peers() { + Err(ref err) if opts.ignore_socket_errors => { + eprintln!( + "Encountered error while querying Wireguard: {}", + err.description() + ); + sleep(interval); + continue; + } + res => res?, + }; /*println!("Connected peers:"); for peer in peers { let peer = peer?; From 8e68c5c90cf303c82f9a74c4b0547c544d37e136 Mon Sep 17 00:00:00 2001 From: shimunn <> Date: Wed, 3 Apr 2019 20:20:08 +0200 Subject: [PATCH 2/4] more logging output [CI SKIP] --- wg-event-gen/src/listener.rs | 12 ++++++++++++ wg-event-gen/src/main.rs | 25 +++---------------------- 2 files changed, 15 insertions(+), 22 deletions(-) diff --git a/wg-event-gen/src/listener.rs b/wg-event-gen/src/listener.rs index 7b0f994..d9d6e10 100644 --- a/wg-event-gen/src/listener.rs +++ b/wg-event-gen/src/listener.rs @@ -6,6 +6,8 @@ use std::thread; use std::time::SystemTime; pub trait EventListener { + fn name(&self) -> &'static str; + fn added<'a>(&self, peer: &'a Peer) { self.connected(peer); } @@ -22,6 +24,10 @@ pub trait EventListener { } impl EventListener for Vec> { + fn name(&self) -> &'static str { + "List of Listeners" + } + fn added<'a>(&self, peer: &'a Peer) { if cfg!(feature = "addrem") || cfg!(test) { self.iter().for_each(|l| l.added(&peer)); @@ -50,6 +56,9 @@ impl EventListener for Vec> { pub struct LogListener; impl EventListener for LogListener { + fn name(&self) -> &'static str { + "Log" + } fn connected<'a>(&self, peer: &'a Peer) { println!("{} connected!", peer.key); } @@ -134,6 +143,9 @@ impl ScriptListener { } impl EventListener for ScriptListener { + fn name(&self) -> &'static str { + "Script" + } fn connected<'a>(&self, peer: &'a Peer) { self.call_sub(vec!["connected", &self.peer_props(peer)]); } diff --git a/wg-event-gen/src/main.rs b/wg-event-gen/src/main.rs index 609a9ee..b4cb42c 100644 --- a/wg-event-gen/src/main.rs +++ b/wg-event-gen/src/main.rs @@ -31,6 +31,7 @@ fn listeners(opts: &Opts) -> Vec> { if opts.log { listeners.push(Box::new(LogListener)); } + println!("Enabled handlers: {}", (&listeners.iter().map(|l| l.name()).collect::>()).join(", ")); listeners } @@ -47,7 +48,6 @@ fn main() -> io::Result<()> { interval ); let mut peers_last: Option> = None; - let start = SystemTime::now(); loop { let now = Instant::now(); let peers = match controller.peers() { @@ -61,29 +61,10 @@ fn main() -> io::Result<()> { } res => res?, }; - /*println!("Connected peers:"); - for peer in peers { - let peer = peer?; - if peer - .last_handshake - .map(|h| h.elapsed().unwrap() < timeout) - .unwrap_or(false) - { - println!("/\\{:?} {}",(timeout - peer.last_handshake.unwrap().elapsed().unwrap()), peer); - } - }*/ let peers = peers .map(|peer| peer.map(|peer_ok| (peer_ok.key.clone(), peer_ok))) .collect::>>()?; - for (k, p) in peers.iter() { - if let Some(shake) = p.last_handshake { - println!( - "{} {:?}", - k.to_string()[0..5].to_string(), - shake.duration_since(start).unwrap() - ); - } - } + if let Some(ref mut peers_last) = peers_last { gen_events(&peers, &peers_last, &listeners, timeout, interval); @@ -92,7 +73,7 @@ fn main() -> io::Result<()> { peers_last = Some(peers); } let pause = interval - now.elapsed(); - dbg!(interval - pause); + sleep(if pause > interval / 2 { pause } else { From 2acbb6d57496f9af10ae4c15b33c3b1195dc0afa Mon Sep 17 00:00:00 2001 From: shimunn <> Date: Wed, 3 Apr 2019 21:29:00 +0200 Subject: [PATCH 3/4] updated boring tun --- boringtun | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/boringtun b/boringtun index cabd969..1f842a6 160000 --- a/boringtun +++ b/boringtun @@ -1 +1 @@ -Subproject commit cabd96987454add6785c6363e4846ef1ff09101e +Subproject commit 1f842a618a4efb460841a3e0104f4979b21a2485 From a2cda16977b0ce4bfb5aefef1e248da47a1247db Mon Sep 17 00:00:00 2001 From: shimunn <> Date: Thu, 4 Apr 2019 18:59:17 +0200 Subject: [PATCH 4/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),