summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRupert Rutledge <eosis2 [at] gmail.com>2020-05-20 20:00:03 +0100
committerRupert Rutledge <eosis2 [at] gmail.com>2020-05-20 20:00:03 +0100
commit49aef183de8025665a699e087b80de993be85121 (patch)
tree9643288b744442215feb43b27194f8b9a98417d2
parentd897e14eae9c39c0bd64a775acbc6c5dedfbdbdc (diff)
parent55e8885302172ccf0a79bc9829d339acfdc3564d (diff)
Merge remote-tracking branch 'origin/master' into issue-163-elapsed-time
Conflicts: src/display/components/layout.rs src/display/ui.rs src/main.rs
-rw-r--r--.gitignore2
-rw-r--r--CHANGELOG.md3
-rw-r--r--src/display/components/help_text.rs20
-rw-r--r--src/display/components/layout.rs4
-rw-r--r--src/display/ui.rs12
-rw-r--r--src/main.rs27
-rw-r--r--src/tests/cases/snapshots/ui__basic_only_addresses.snap2
-rw-r--r--src/tests/cases/snapshots/ui__basic_only_connections.snap2
-rw-r--r--src/tests/cases/snapshots/ui__basic_only_processes.snap2
-rw-r--r--src/tests/cases/snapshots/ui__basic_processes_with_dns_queries.snap2
-rw-r--r--src/tests/cases/snapshots/ui__basic_startup.snap2
-rw-r--r--src/tests/cases/snapshots/ui__bi_directional_traffic.snap2
-rw-r--r--src/tests/cases/snapshots/ui__layout_full_width_under_30_height.snap2
-rw-r--r--src/tests/cases/snapshots/ui__layout_under_120_width_full_height.snap2
-rw-r--r--src/tests/cases/snapshots/ui__layout_under_120_width_under_30_height.snap2
-rw-r--r--src/tests/cases/snapshots/ui__layout_under_50_width_under_50_height-2.snap54
-rw-r--r--src/tests/cases/snapshots/ui__layout_under_50_width_under_50_height.snap54
-rw-r--r--src/tests/cases/snapshots/ui__layout_under_70_width_under_30_height-2.snap34
-rw-r--r--src/tests/cases/snapshots/ui__layout_under_70_width_under_30_height.snap34
-rw-r--r--src/tests/cases/snapshots/ui__multiple_connections_from_remote_address.snap2
-rw-r--r--src/tests/cases/snapshots/ui__multiple_packets_of_traffic_from_different_connections.snap2
-rw-r--r--src/tests/cases/snapshots/ui__multiple_packets_of_traffic_from_single_connection.snap2
-rw-r--r--src/tests/cases/snapshots/ui__multiple_processes_with_multiple_connections.snap2
-rw-r--r--src/tests/cases/snapshots/ui__one_packet_of_traffic.snap2
-rw-r--r--src/tests/cases/snapshots/ui__one_process_with_multiple_connections.snap2
-rw-r--r--src/tests/cases/snapshots/ui__pause_by_space-2.snap2
-rw-r--r--src/tests/cases/snapshots/ui__pause_by_space.snap2
-rw-r--r--src/tests/cases/snapshots/ui__rearranged_by_tab-2.snap55
-rw-r--r--src/tests/cases/snapshots/ui__rearranged_by_tab-3.snap55
-rw-r--r--src/tests/cases/snapshots/ui__rearranged_by_tab-4.snap55
-rw-r--r--src/tests/cases/snapshots/ui__rearranged_by_tab-5.snap55
-rw-r--r--src/tests/cases/snapshots/ui__rearranged_by_tab.snap55
-rw-r--r--src/tests/cases/snapshots/ui__traffic_with_winch_event.snap2
-rw-r--r--src/tests/cases/snapshots/ui__two_packets_only_addresses.snap2
-rw-r--r--src/tests/cases/snapshots/ui__two_packets_only_connections.snap2
-rw-r--r--src/tests/cases/snapshots/ui__two_packets_only_processes.snap2
-rw-r--r--src/tests/cases/snapshots/ui__two_windows_split_horizontally.snap2
-rw-r--r--src/tests/cases/snapshots/ui__two_windows_split_vertically.snap2
-rw-r--r--src/tests/cases/ui.rs154
39 files changed, 684 insertions, 35 deletions
diff --git a/.gitignore b/.gitignore
index 28fb351..d81dc02 100644
--- a/.gitignore
+++ b/.gitignore
@@ -11,4 +11,4 @@ debian/*
!debian/control
!debian/copyright
!debian/rules
-!debian/source
+!debian/source \ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
index f749900..fe0469a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
## [Unreleased]
+### Added
+* Ability to change the window layout with <TAB> (https://github.com/imsnif/bandwhich/pull/118) - [@Louis-Lesage](https://github.com/Louis-Lesage)
+
### Fixed
* Add terabytes as a display unit (for cumulative mode) (https://github.com/imsnif/bandwhich/pull/168) - [@TheLostLambda](https://github.com/TheLostLambda)
diff --git a/src/display/components/help_text.rs b/src/display/components/help_text.rs
index 2b49551..7d66ad8 100644
--- a/src/display/components/help_text.rs
+++ b/src/display/components/help_text.rs
@@ -9,10 +9,14 @@ pub struct HelpText {
pub show_dns: bool,
}
-const TEXT_WHEN_PAUSED: &str = " Press <SPACE> to resume";
-const TEXT_WHEN_NOT_PAUSED: &str = " Press <SPACE> to pause";
+const FIRST_WIDTH_BREAKPOINT: u16 = 76;
+const SECOND_WIDTH_BREAKPOINT: u16 = 54;
+
+const TEXT_WHEN_PAUSED: &str = " Press <SPACE> to resume.";
+const TEXT_WHEN_NOT_PAUSED: &str = " Press <SPACE> to pause.";
const TEXT_WHEN_DNS_NOT_SHOWN: &str = " (DNS queries hidden).";
const TEXT_WHEN_DNS_SHOWN: &str = " (DNS queries shown).";
+const TEXT_TAB_TIP: &str = " Use <TAB> to rearrange tables.";
impl HelpText {
pub fn render(&self, frame: &mut Frame<impl Backend>, rect: Rect) {
@@ -23,14 +27,22 @@ impl HelpText {
TEXT_WHEN_NOT_PAUSED
};
- let dns_content = if self.show_dns {
+ let dns_content = if rect.width <= FIRST_WIDTH_BREAKPOINT {
+ ""
+ } else if self.show_dns {
TEXT_WHEN_DNS_SHOWN
} else {
TEXT_WHEN_DNS_NOT_SHOWN
};
+ let tab_text = if rect.width <= SECOND_WIDTH_BREAKPOINT {
+ ""
+ } else {
+ TEXT_TAB_TIP
+ };
+
[Text::styled(
- format!("{}{}", pause_content, dns_content),
+ format!("{}{}{}", pause_content, tab_text, dns_content),
Style::default().modifier(Modifier::BOLD),
)]
};
diff --git a/src/display/components/layout.rs b/src/display/components/layout.rs
index d3edb81..51c0175 100644
--- a/src/display/components/layout.rs
+++ b/src/display/components/layout.rs
@@ -100,12 +100,12 @@ impl<'a> Layout<'a> {
}
}
- pub fn render(&self, frame: &mut Frame<impl Backend>, rect: Rect) {
+ pub fn render(&self, frame: &mut Frame<impl Backend>, rect: Rect, ui_offset: usize) {
let (top, app, bottom) = top_app_and_bottom_split(rect);
let layout_slots = self.build_layout(app);
for i in 0..layout_slots.len() {
if let Some(rect) = layout_slots.get(i) {
- if let Some(child) = self.children.get(i) {
+ if let Some(child) = self.children.get((i + ui_offset) % self.children.len()) {
child.render(frame, *rect);
}
}
diff --git a/src/display/ui.rs b/src/display/ui.rs
index 54db7fb..6361a7f 100644
--- a/src/display/ui.rs
+++ b/src/display/ui.rs
@@ -11,6 +11,7 @@ use ::std::net::IpAddr;
use crate::RenderOpts;
use chrono::prelude::*;
+use std::time::Duration;
pub struct Ui<B>
where
@@ -61,7 +62,7 @@ where
display_connection_string(
connection,
ip_to_host,
- &connection_network_data.interface_name
+ &connection_network_data.interface_name,
),
connection_network_data.total_bytes_uploaded,
connection_network_data.total_bytes_downloaded,
@@ -80,7 +81,7 @@ where
}
}
- pub fn draw(&mut self, paused: bool, show_dns: bool, elapsed_time: std::time::Duration) {
+ pub fn draw(&mut self, paused: bool, show_dns: bool, elapsed_time: Duration, ui_offset: usize) {
let state = &self.state;
let children = self.get_tables_to_display();
self.terminal
@@ -97,7 +98,7 @@ where
children,
footer: help_text,
};
- layout.render(&mut frame, size);
+ layout.render(&mut frame, size, ui_offset);
})
.unwrap();
}
@@ -129,6 +130,11 @@ where
}
children
}
+
+ pub fn get_table_count(&self) -> usize {
+ self.get_tables_to_display().len()
+ }
+
pub fn update_state(
&mut self,
connections_to_procs: HashMap<LocalSocket, String>,
diff --git a/src/main.rs b/src/main.rs
index a52642c..0b0ea6d 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -15,7 +15,7 @@ use os::OnSigWinch;
use ::pnet::datalink::{DataLinkReceiver, NetworkInterface};
use ::std::collections::HashMap;
-use ::std::sync::atomic::{AtomicBool, Ordering};
+use ::std::sync::atomic::{AtomicBool, AtomicUsize, Ordering};
use ::std::sync::{Arc, Mutex};
use ::std::thread::park_timeout;
use ::std::{thread, time};
@@ -124,6 +124,7 @@ where
let paused = Arc::new(AtomicBool::new(false));
let last_start_time = Arc::new(RwLock::new(Instant::now()));
let cumulative_time = Arc::new(RwLock::new(std::time::Duration::new(0, 0)));
+ let ui_offset = Arc::new(AtomicUsize::new(0));
let dns_shown = opts.show_dns;
let mut active_threads = vec![];
@@ -149,6 +150,8 @@ where
let paused = paused.clone();
let cumulative_time = cumulative_time.clone();
let last_start_time = last_start_time.clone();
+ let ui_offset = ui_offset.clone();
+
move || {
on_winch({
Box::new(move || {
@@ -162,6 +165,7 @@ where
*cumulative_time.read().unwrap(),
paused,
),
+ ui_offset.load(Ordering::SeqCst),
);
})
});
@@ -176,9 +180,12 @@ where
.spawn({
let running = running.clone();
let paused = paused.clone();
+ let ui_offset = ui_offset.clone();
+
let network_utilization = network_utilization.clone();
let last_start_time = last_start_time.clone();
let cumulative_time = cumulative_time.clone();
+ let ui = ui.clone();
move || {
while running.load(Ordering::Acquire) {
@@ -202,6 +209,7 @@ where
{
let mut ui = ui.lock().unwrap();
let paused = paused.load(Ordering::SeqCst);
+ let ui_offset = ui_offset.load(Ordering::SeqCst);
if !paused {
ui.update_state(sockets_to_procs, utilization, ip_to_host);
}
@@ -214,7 +222,7 @@ where
if raw_mode {
ui.output_text(&mut write_to_stdout);
} else {
- ui.draw(paused, dns_shown, elapsed_time);
+ ui.draw(paused, dns_shown, elapsed_time, ui_offset);
}
}
let render_duration = render_start_time.elapsed();
@@ -236,8 +244,11 @@ where
.spawn({
let running = running.clone();
let display_handler = display_handler.thread().clone();
+
move || {
for evt in keyboard_events {
+ let mut ui = ui.lock().unwrap();
+
match evt {
Event::Key(Key::Ctrl('c')) | Event::Key(Key::Char('q')) => {
running.store(false, Ordering::Release);
@@ -260,6 +271,18 @@ where
display_handler.unpark();
}
+ Event::Key(Key::Char('\t')) => {
+ let paused = paused.load(Ordering::SeqCst);
+ let elapsed_time = elapsed_time(
+ *last_start_time.read().unwrap(),
+ *cumulative_time.read().unwrap(),
+ paused,
+ );
+ let table_count = ui.get_table_count();
+ let new = ui_offset.load(Ordering::SeqCst) + 1 % table_count;
+ ui_offset.store(new, Ordering::SeqCst);
+ ui.draw(paused, dns_shown, elapsed_time, new);
+ }
_ => (),
};
}
diff --git a/src/tests/cases/snapshots/ui__basic_only_addresses.snap b/src/tests/cases/snapshots/ui__basic_only_addresses.snap
index 98e855e..b6057c3 100644
--- a/src/tests/cases/snapshots/ui__basic_only_addresses.snap
+++ b/src/tests/cases/snapshots/ui__basic_only_addresses.snap
@@ -51,5 +51,5 @@ expression: "&terminal_draw_events_mirror[0]"
│ │
│ │
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
- Press <SPACE> to pause (DNS queries hidden).
+ Press <SPACE> to pause. Use <TAB> to rearrange tables. (DNS queries hidden).
diff --git a/src/tests/cases/snapshots/ui__basic_only_connections.snap b/src/tests/cases/snapshots/ui__basic_only_connections.snap
index fa318b0..d580041 100644
--- a/src/tests/cases/snapshots/ui__basic_only_connections.snap
+++ b/src/tests/cases/snapshots/ui__basic_only_connections.snap
@@ -51,5 +51,5 @@ expression: "&terminal_draw_events_mirror[0]"
│ │
│ │
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
- Press <SPACE> to pause (DNS queries hidden).
+ Press <SPACE> to pause. Use <TAB> to rearrange tables. (DNS queries hidden).
diff --git a/src/tests/cases/snapshots/ui__basic_only_processes.snap b/src/tests/cases/snapshots/ui__basic_only_processes.snap
index d72fe63..60bee0f 100644
--- a/src/tests/cases/snapshots/ui__basic_only_processes.snap
+++ b/src/tests/cases/snapshots/ui__basic_only_processes.snap
@@ -51,5 +51,5 @@ expression: "&terminal_draw_events_mirror[0]"
│ │
│ │
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
- Press <SPACE> to pause (DNS queries hidden).
+ Press <SPACE> to pause. Use <TAB> to rearrange tables. (DNS queries hidden).
diff --git a/src/tests/cases/snapshots/ui__basic_processes_with_dns_queries.snap b/src/tests/cases/snapshots/ui__basic_processes_with_dns_queries.snap
index 5f5fc06..bc15814 100644
--- a/src/tests/cases/snapshots/ui__basic_processes_with_dns_queries.snap
+++ b/src/tests/cases/snapshots/ui__basic_processes_with_dns_queries.snap
@@ -51,5 +51,5 @@ expression: "&terminal_draw_events_mirror[0]"
│ │
│ │
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
- Press <SPACE> to pause (DNS queries shown).
+ Press <SPACE> to pause. Use <TAB> to rearrange tables. (DNS queries shown).
diff --git a/src/tests/cases/snapshots/ui__basic_startup.snap b/src/tests/cases/snapshots/ui__basic_startup.snap
index 7f3863a..d60e597 100644
--- a/src/tests/cases/snapshots/ui__basic_startup.snap
+++ b/src/tests/cases/snapshots/ui__basic_startup.snap
@@ -51,5 +51,5 @@ expression: "&terminal_draw_events_mirror[0]"
│ │
│ │
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
- Press <SPACE> to pause (DNS queries hidden).
+ Press <SPACE> to pause. Use <TAB> to rearrange tables. (DNS queries hidden).
diff --git a/src/tests/cases/snapshots/ui__bi_directional_traffic.snap b/src/tests/cases/snapshots/ui__bi_directional_traffic.snap
index 7f3863a..d60e597 100644
--- a/src/tests/cases/snapshots/ui__bi_directional_traffic.snap
+++ b/src/tests/cases/snapshots/ui__bi_directional_traffic.snap
@@ -51,5 +51,5 @@ expression: "&terminal_draw_events_mirror[0]"
│ │
│ │
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
- Press <SPACE> to pause (DNS queries hidden).
+ Press <SPACE> to pause. Use <TAB> to rearrange tables. (DNS queries hidden).
diff --git a/src/tests/cases/snapshots/ui__layout_full_width_under_30_height.snap b/src/tests/cases/snapshots/ui__layout_full_width_under_30_height.snap
index b2ef419..1e26e22 100644
--- a/src/tests/cases/snapshots/ui__layout_full_width_under_30_height.snap
+++ b/src/tests/cases/snapshots/ui__layout_full_width_under_30_height.snap
@@ -30,5 +30,5 @@ expression: "&terminal_draw_events_mirror[0]"
│ ││ │
│ ││ │
└─────────────────────────────────────────────────────────────────────────────────────────────┘└─────────────────────────────────────────────────────────────────────────────────────────────┘
- Press <SPACE> to pause (DNS queries hidden).
+ Press <SPACE> to pause. Use <TAB> to rearrange tables. (DNS queries hidden).
diff --git a/src/tests/cases/snapshots/ui__layout_under_120_width_full_height.snap b/src/tests/cases/snapshots/ui__layout_under_120_width_full_height.snap
index 39be4ff..53043a7 100644
--- a/src/tests/cases/snapshots/ui__layout_under_120_width_full_height.snap
+++ b/src/tests/cases/snapshots/ui__layout_under_120_width_full_height.snap
@@ -51,5 +51,5 @@ expression: "&terminal_draw_events_mirror[0]"
│ │
│ │
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
- Press <SPACE> to pause (DNS queries hidden).
+ Press <SPACE> to pause. Use <TAB> to rearrange tables. (DNS queries hidden).
diff --git a/src/tests/cases/snapshots/ui__layout_under_120_width_under_30_height.snap b/src/tests/cases/snapshots/ui__layout_under_120_width_under_30_height.snap
index bf7caa7..0bbc796 100644
--- a/src/tests/cases/snapshots/ui__layout_under_120_width_under_30_height.snap
+++ b/src/tests/cases/snapshots/ui__layout_under_120_width_under_30_height.snap
@@ -30,5 +30,5 @@ expression: "&terminal_draw_events_mirror[0]"
│ │
│ │
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
- Press <SPACE> to pause (DNS queries hidden).
+ Press <SPACE> to pause. Use <TAB> to rearrange tables. (DNS queries hidden).
diff --git a/src/tests/cases/snapshots/ui__layout_under_50_width_under_50_height-2.snap b/src/tests/cases/snapshots/ui__layout_under_50_width_under_50_height-2.snap
new file mode 100644
index 0000000..d614423
--- /dev/null
+++ b/src/tests/cases/snapshots/ui__layout_under_50_width_under_50_height-2.snap
@@ -0,0 +1,54 @@
+---
+source: src/tests/cases/ui.rs
+expression: "&terminal_draw_events_mirror[1]"
+---
+ 98Bps
+
+
+
+ 5 0Bps / 28Bps
+ 4 0Bps / 26Bps
+ 1 0Bps / 22Bps
+ 2 0Bps / 21Bps
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.3.3.3 0Bps / 28Bps
+ 2.2.2.2 0Bps / 26Bps
+ 1.1.1.1 0Bps / 22Bps
+ 4.4.4.4 0Bps / 21Bps
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/tests/cases/snapshots/ui__layout_under_50_width_under_50_height.snap b/src/tests/cases/snapshots/ui__layout_under_50_width_under_50_height.snap
new file mode 100644
index 0000000..a3b00e3
--- /dev/null
+++ b/src/tests/cases/snapshots/ui__layout_under_50_width_under_50_height.snap
@@ -0,0 +1,54 @@
+---
+source: src/tests/cases/ui.rs
+expression: "&terminal_draw_events_mirror[0]"
+---
+ Total Up / Down: 0Bps / 0Bps
+┌Utilization by process name────────────────────┐
+│Process Up / Down │
+│