From 95e47c708c6a297391d4c74188217e468d652c44 Mon Sep 17 00:00:00 2001 From: Dreaded_X Date: Fri, 18 Apr 2025 14:57:31 +0200 Subject: [PATCH] Highlight port in red if tunnel failed to open --- src/io/stats.rs | 11 ++++++++++- src/tunnel/mod.rs | 7 ++++++- src/tunnel/tui.rs | 8 +++++++- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/io/stats.rs b/src/io/stats.rs index 8f465a5..f64a597 100644 --- a/src/io/stats.rs +++ b/src/io/stats.rs @@ -1,6 +1,6 @@ use std::pin::Pin; use std::sync::Arc; -use std::sync::atomic::{AtomicUsize, Ordering}; +use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering}; use std::task::{Context, Poll}; use pin_project_lite::pin_project; @@ -14,6 +14,7 @@ pub struct Stats { connections: AtomicUsize, rx: AtomicUsize, tx: AtomicUsize, + failed: AtomicBool, } impl Stats { @@ -33,6 +34,14 @@ impl Stats { self.connections.load(Ordering::Relaxed) } + pub fn failed(&self) -> bool { + self.failed.load(Ordering::Relaxed) + } + + pub fn set_failed(&self, failed: bool) { + self.failed.store(failed, Ordering::Relaxed); + } + pub fn rx(&self) -> Unit { Unit::new(self.rx.load(Ordering::Relaxed), "B") } diff --git a/src/tunnel/mod.rs b/src/tunnel/mod.rs index bc9a73a..5f7fbcb 100644 --- a/src/tunnel/mod.rs +++ b/src/tunnel/mod.rs @@ -40,7 +40,12 @@ impl TunnelInner { &self.internal_address, self.port, ) - .await?; + .await + .inspect_err(|_| { + self.stats.set_failed(true); + })?; + + self.stats.set_failed(false); Ok(TrackStats::new(channel.into_stream(), self.stats.clone())) } diff --git a/src/tunnel/tui.rs b/src/tunnel/tui.rs index 793da01..d69570a 100644 --- a/src/tunnel/tui.rs +++ b/src/tunnel/tui.rs @@ -17,9 +17,15 @@ pub struct TunnelRow { impl From<&TunnelRow> for Vec> { fn from(row: &TunnelRow) -> Self { + let port = if row.stats.failed() { + row.port.clone().red() + } else { + row.port.clone() + }; + vec![ row.name.clone(), - row.port.clone(), + port, row.access.clone(), row.address.clone(), row.stats.connections().to_string().into(),