From: Stephen Seo Date: Sat, 9 Jul 2022 08:33:19 +0000 (+0900) Subject: Impl get info from /proc/net/dev X-Git-Tag: 0.1.0~34 X-Git-Url: https://git.seodisparate.com/stephenseo/static/git-favicon.png?a=commitdiff_plain;h=ff181c27ed5a633d7cf3129d06be398eb8b42a07;p=swaybar_info Impl get info from /proc/net/dev --- diff --git a/src/args.rs b/src/args.rs new file mode 100644 index 0000000..0d839c6 --- /dev/null +++ b/src/args.rs @@ -0,0 +1,14 @@ +use std::collections::HashMap; + +pub fn get_args() -> HashMap { + let mut map = HashMap::new(); + + for arg in std::env::args() { + if arg.starts_with("--netdev=") { + let (_, back) = arg.split_at(9); + map.insert("netdev".into(), back.into()); + } + } + + map +} diff --git a/src/main.rs b/src/main.rs index 3122c31..28c6cf4 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,7 +1,17 @@ +mod args; mod proc; mod swaybar_object; fn main() { + let args_map = args::get_args(); + + let mut net_obj = None; + if args_map.contains_key("netdev") { + net_obj = Some(proc::NetInfo::new( + args_map.get("netdev").unwrap().to_owned(), + )); + } + println!( "{}", serde_json::to_string(&swaybar_object::SwaybarHeader::new()) @@ -20,5 +30,15 @@ fn main() { let loadavg_object = swaybar_object::SwaybarObject::from_string(loadavg_string); array.push_object(loadavg_object); } + + if let Some(mut netinfo) = net_obj { + for _i in 0..10 { + netinfo.update().expect("netinfo.update() shouldn't fail"); + let netinfo_string = netinfo.get_netstring(); + array.push_object(swaybar_object::SwaybarObject::from_string(netinfo_string)); + std::thread::sleep(std::time::Duration::from_secs(1)); + } + } + println!("{}", array); } diff --git a/src/proc.rs b/src/proc.rs index 07ca3bc..90fc666 100644 --- a/src/proc.rs +++ b/src/proc.rs @@ -2,6 +2,88 @@ use std::fs::File; use std::io; use std::io::prelude::*; +pub struct NetInfo { + dev_name: String, + down: u64, + prev_down: u64, + up: u64, + prev_up: u64, +} + +impl NetInfo { + pub fn new(dev_name: String) -> Self { + Self { + dev_name, + down: 0, + prev_down: 0, + up: 0, + prev_up: 0, + } + } + + pub fn update(&mut self) -> io::Result<()> { + let mut netdev_string = String::new(); + { + let mut netdev_file: File = File::open("/proc/net/dev")?; + netdev_file.read_to_string(&mut netdev_string)?; + } + + let mut dev_line: Option = None; + for line in netdev_string.lines() { + if line.starts_with(&self.dev_name) { + dev_line = Some(line.to_owned()); + break; + } + } + + if let Some(line) = dev_line { + let entries: Vec<&str> = line.split_whitespace().collect(); + if entries.len() < 10 { + return Err(io::Error::new(io::ErrorKind::Other, format!("NetInfo::update: Failed to parse /proc/net/dev, \"{}\" device line is too short", self.dev_name))); + } + + self.down = entries[1].parse().map_err(|_| io::Error::new(io::ErrorKind::Other, format!("NetInfo::update: Failed to parse recv bytes in /proc/net/dev for device \"{}\"", self.dev_name)))?; + self.up = entries[9].parse().map_err(|_| io::Error::new(io::ErrorKind::Other, format!("NetInfo::update: Failed to parse recv bytes in /proc/net/dev for device \"{}\"", self.dev_name)))?; + } else { + return Err(io::Error::new( + io::ErrorKind::Other, + format!( + "NetInfo::update: Failed to parse /proc/net/dev, can't find net device \"{}\"", + self.dev_name + ), + )); + } + + Ok(()) + } + + pub fn get_netstring(&mut self) -> String { + let down_diff = self.down - self.prev_down; + self.prev_down = self.down; + let up_diff = self.up - self.prev_up; + self.prev_up = self.up; + + let mut output = String::new(); + if down_diff > 1024 * 1024 { + output.push_str(&format!("{} MiB ", down_diff / 1024 / 1024)); + } else if down_diff > 1024 { + output.push_str(&format!("{} KiB ", down_diff / 1024)); + } else { + output.push_str(&format!("{} B ", down_diff)); + } + + if up_diff > 1024 * 1024 { + output.push_str(&format!("{} MiB", up_diff / 1024 / 1024)); + } else if up_diff > 1024 { + output.push_str(&format!("{} KiB", up_diff / 1024)); + } else { + output.push_str(&format!("{} B", up_diff)); + } + + output + } +} + pub fn get_meminfo() -> io::Result { let mut meminfo_string = String::new(); {