use std::{collections::HashMap, fmt}; use crate::util::state::NodeSpecs; use ethtool::{self, EthtoolAttr, EthtoolMessage}; pub fn collect_specs() -> NodeSpecs { let mut sys = sysinfo::System::new_all(); NodeSpecs { threads: sys.cpus().len().try_into().unwrap(), mem: sys.total_memory(), net_speed: 13.0, } } use futures::stream::TryStreamExt; use log::{debug, error, info}; pub async fn network() { let mut interfaces = vec![]; match nix::ifaddrs::getifaddrs() { Ok(ifaddrs) => { debug!("{:?}", ifaddrs); for ifaddr in ifaddrs { if let Some(interface_name) = Some(ifaddr.interface_name) { if let Some(flags) = Some(ifaddr.flags) { let is_up = flags.contains(nix::net::if_::InterfaceFlags::IFF_UP); let is_running = flags.contains(nix::net::if_::InterfaceFlags::IFF_RUNNING); if is_up && is_running { interfaces.push(interface_name); } } } } } Err(err) => { error!("Failed to get network interfaces: {}", err); } } debug!("{:?}", interfaces); let mut interface_speeds: Vec<(String, i64)> = vec![]; let mut visited_interfaces = vec![]; for interface in interfaces { let path = format!("{}{}{}", "/sys/class/net/", interface, "/speed"); debug!("{}", &path); if !path.contains("lo") { let speed = std::fs::read_to_string(path).unwrap(); debug!("SPEED: {}", &speed); interface_speeds.push((interface, speed.trim_end().parse::<i64>().unwrap())); } } // let res = get_link_mode(Some("enp42s0")).await; debug!("{:#?}", interface_speeds); } // async fn get_link_mode( // iface_name: Option<&str>, // ) -> Vec<netlink_packet_generic::message::GenlMessage<EthtoolMessage>> { // let (connection, mut handle, _) = ethtool::new_connection().unwrap(); // tokio::spawn(connection); // // let mut link_mode_handle = handle.link_mode().get(iface_name).execute().await; // // let mut msgs = Vec::new(); // while let Some(msg) = link_mode_handle.try_next().await.unwrap() { // msgs.push(msg); // } // assert!(!msgs.is_empty()); // let mut lm = None; // for msg in &msgs { // let payl = msg.payload.clone(); // for linkmode in payl.nlas { // match &linkmode { // ethtool::EthtoolAttr::LinkMode(ethtool::EthtoolLinkModeAttr::Speed(_)) => { // lm = Some(linkmode) // } // _ => continue, // }; // } // } // // if lm.is_some() { // debug!("{:#?}", lm.clone().unwrap()); // let speed = lm.unwrap(); // speed. // // } // msgs // }