From 44c0c210189c2f677b77d8aaf5e3c1073c8f59ea Mon Sep 17 00:00:00 2001 From: Bill Thiede Date: Sun, 30 Jul 2023 13:31:12 -0700 Subject: [PATCH] Add AllNetworkSpeedWidget to show any usage on enp devices --- src/widgets/network.rs | 94 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 81 insertions(+), 13 deletions(-) diff --git a/src/widgets/network.rs b/src/widgets/network.rs index 7f181cf..a5dd664 100644 --- a/src/widgets/network.rs +++ b/src/widgets/network.rs @@ -1,16 +1,18 @@ -use i3monkit::Block; -use i3monkit::{Widget, WidgetUpdate}; +use std::{ + collections::vec_deque::VecDeque, + fs::File, + io::{BufRead, BufReader, Error, ErrorKind, Result}, + path::PathBuf, + time::SystemTime, +}; -use std::collections::vec_deque::VecDeque; -use std::fs::File; -use std::io::{BufRead, BufReader, Error, ErrorKind, Result}; -use std::path::PathBuf; -use std::time::SystemTime; +use i3monkit::{Block, Widget, WidgetUpdate}; use crate::spark; const NETWORK_PATH_PREFIX: &str = "/sys/class/net"; const NETWORK_STAT_SUFFIX: &str = "statistics/dummy"; +const DEVICE_PREFIX: &str = "enp"; struct TransferStat { rx: u64, @@ -94,6 +96,12 @@ impl NetworkSpeedWidget { } } + fn is_active(&self) -> bool { + self.last_stat.rx > 0 + || self.last_stat.tx > 0 + || (self.rx_history.iter().sum::() + self.tx_history.iter().sum::()) > 0. + } + fn format_rate(rate: f64) -> String { if rate.is_nan() { return "N/A".to_string(); @@ -129,12 +137,9 @@ impl NetworkSpeedWidget { Ok((Self::format_rate(rx_rate), Self::format_rate(tx_rate))) } -} -impl Widget for NetworkSpeedWidget { - fn update(&mut self) -> Option { + fn render(&mut self) -> Option { if let Ok((rx, tx)) = self.get_human_readable_stat() { - let mut data = Block::new(); let (rx_history, tx_history) = if self.rx_history.len() > 1 { let g = spark::Graph { min: None, @@ -147,11 +152,21 @@ impl Widget for NetworkSpeedWidget { } else { ("".to_string(), "".to_string()) }; - data.use_pango(); - data.append_full_text(&format!( + return Some(format!( "Rx:{} {} Tx:{} {}", rx, rx_history, tx, tx_history )); + } + None + } +} + +impl Widget for NetworkSpeedWidget { + fn update(&mut self) -> Option { + if let Some(text) = self.render() { + let mut data = Block::new(); + data.use_pango(); + data.append_full_text(&text); return Some(WidgetUpdate { refresh_interval: std::time::Duration::new(1, 0), data: Some(data), @@ -160,3 +175,56 @@ impl Widget for NetworkSpeedWidget { None } } + +pub struct AllNetworkSpeedWidget { + num_samples: usize, + nics: Vec, +} +impl AllNetworkSpeedWidget { + pub fn new(num_samples: usize) -> Self { + let nics = std::fs::read_dir(NETWORK_PATH_PREFIX) + .expect(&format!("couldn't list {NETWORK_PATH_PREFIX}")) + .filter_map(|dir| { + let d = dir.unwrap(); + let p = d.file_name(); + let p = p.to_string_lossy(); + if p.starts_with(DEVICE_PREFIX) { + Some(NetworkSpeedWidget::new(&p, num_samples)) + } else { + None + } + }) + .collect(); + + AllNetworkSpeedWidget { num_samples, nics } + } +} + +impl Widget for AllNetworkSpeedWidget { + fn update(&mut self) -> Option { + let nics: Vec<_> = self + .nics + .iter_mut() + .filter_map(|nic| { + if !nic.is_active() { + return None; + } + if let Some(text) = nic.render() { + Some(format!("{}: {}", nic.interface, text)) + } else { + None + } + }) + .collect(); + + let mut data = Block::new(); + data.use_pango(); + nics.iter().for_each(|n| { + data.append_full_text(n); + }); + Some(WidgetUpdate { + refresh_interval: std::time::Duration::new(1, 0), + data: Some(data), + }) + } +}