Init, monitor for waybar module
This commit is contained in:
+144
@@ -0,0 +1,144 @@
|
||||
use std::process::Command;
|
||||
|
||||
use byte_unit::Byte;
|
||||
use serde::Serialize;
|
||||
use sysinfo::{DiskExt, NetworkExt, System, SystemExt};
|
||||
|
||||
#[derive(Serialize)]
|
||||
struct WaybarModule {
|
||||
tooltip: String,
|
||||
text: String,
|
||||
alt: String,
|
||||
}
|
||||
fn main() {
|
||||
// Please note that we use "new_all" to ensure that all list of
|
||||
// components, network interfaces, disks and users are already
|
||||
// filled!
|
||||
let mut sys = System::new_all();
|
||||
let mut tooltip = String::new();
|
||||
|
||||
// First we update all information of our `System` struct.
|
||||
sys.refresh_all();
|
||||
|
||||
// We display all disks' information:
|
||||
let mut disks_string = String::try_from("\n=> disks ").unwrap();
|
||||
disks_string += &("-".repeat(120 - disks_string.len()) + "\n");
|
||||
|
||||
for disk in sys.disks() {
|
||||
if !disk.mount_point().to_str().unwrap().contains("/efi") {
|
||||
let used = disk.total_space() - disk.available_space();
|
||||
disks_string += disk.name().to_str().unwrap();
|
||||
disks_string += &format!(
|
||||
"\nDisk Space: Used: {} Available: {} Total:{}\n",
|
||||
Byte::from(used).get_appropriate_unit(false).format(1),
|
||||
Byte::from(disk.available_space())
|
||||
.get_appropriate_unit(false)
|
||||
.format(1),
|
||||
Byte::from(disk.total_space())
|
||||
.get_appropriate_unit(false)
|
||||
.format(1)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// Network interfaces name, data received and data transmitted:
|
||||
let mut networks = String::try_from("\n=> networks ").unwrap();
|
||||
networks += &("-".repeat(120 - networks.len()) + "\n");
|
||||
for (interface_name, data) in sys.networks() {
|
||||
if interface_name.contains("wlan") {
|
||||
let inter = format!(
|
||||
"{}: Received/Sent {}/{}\n",
|
||||
interface_name,
|
||||
Byte::from(data.received())
|
||||
.get_appropriate_unit(false)
|
||||
.format(1),
|
||||
Byte::from(data.transmitted())
|
||||
.get_appropriate_unit(false)
|
||||
.format(1)
|
||||
);
|
||||
networks += &inter;
|
||||
}
|
||||
}
|
||||
|
||||
// Components temperature:
|
||||
let mut comp = String::try_from("\n=> components ").unwrap();
|
||||
comp += &("-".repeat(120 - comp.len()) + "\n");
|
||||
for component in sys.components() {
|
||||
comp += &format!("{:?}\n", component);
|
||||
}
|
||||
|
||||
let mut system = String::try_from("\n=> system ").unwrap();
|
||||
system += &("-".repeat(120 - system.len()) + "\n");
|
||||
// RAM information:
|
||||
system += &format!(
|
||||
"total memory: {}\n",
|
||||
Byte::from(sys.total_memory())
|
||||
.get_appropriate_unit(false)
|
||||
.format(1)
|
||||
);
|
||||
system += &format!(
|
||||
"used memory: {}\n",
|
||||
Byte::from(sys.used_memory())
|
||||
.get_appropriate_unit(false)
|
||||
.format(1)
|
||||
);
|
||||
|
||||
// Display system information:
|
||||
system += &format!("System name: {:?}\n", sys.name().unwrap());
|
||||
system += &format!(
|
||||
"System kernel version: {:?}\n",
|
||||
sys.kernel_version().unwrap()
|
||||
);
|
||||
system += &format!("System OS version: {:?}\n", sys.os_version().unwrap());
|
||||
system += &format!("System host name: {:?}\n", sys.host_name().unwrap());
|
||||
system += &format!(
|
||||
"Load Average: 1min {} 5min {} 15min {}\n",
|
||||
sys.load_average().one,
|
||||
sys.load_average().five,
|
||||
sys.load_average().fifteen
|
||||
);
|
||||
let output = Command::new("iw")
|
||||
.arg("dev")
|
||||
.arg("wlan0") // Replace with your WLAN interface name
|
||||
.arg("link")
|
||||
.output()
|
||||
.expect("Failed to run iw command");
|
||||
|
||||
// Convert the command output to a string
|
||||
let output_str = String::from_utf8_lossy(&output.stdout);
|
||||
|
||||
// Search for the SSID in the command output
|
||||
let ssid = output_str
|
||||
.lines()
|
||||
.find(|line| line.contains("SSID"))
|
||||
.map(|line| line.trim_start_matches("SSID: ").to_string())
|
||||
.unwrap_or_else(|| String::from("Not found"));
|
||||
|
||||
let ip = Command::new("curl")
|
||||
.arg("icanhazip.com")
|
||||
.output()
|
||||
.expect("Failed to run curl command");
|
||||
|
||||
let ip_str = String::from_utf8_lossy(&ip.stdout).to_string();
|
||||
system += &format!("{} IP: {}\n", ssid.trim(), ip_str);
|
||||
|
||||
tooltip.push_str(&system);
|
||||
tooltip.push_str(&disks_string);
|
||||
tooltip.push_str(&networks);
|
||||
tooltip.push_str(&comp);
|
||||
|
||||
// Number of CPUs:
|
||||
// println!("NB CPUs: {}", sys.cpus().len());
|
||||
|
||||
// Display processes ID, name na disk usage:
|
||||
// for (pid, process) in sys.processes() {
|
||||
// println!("[{}] {} {:?}", pid, process.name(), process.disk_usage());
|
||||
// }
|
||||
//
|
||||
let data = WaybarModule {
|
||||
tooltip,
|
||||
alt: "System Monitor".to_string(),
|
||||
text: "System Monitor".to_string(),
|
||||
};
|
||||
println!("{}", serde_json::to_string(&data).unwrap());
|
||||
}
|
||||
Reference in New Issue
Block a user