Didn't remember I made this when learning Rust.
use sysinfo::{
Components, Disks, Networks, System,
};
use serde::Serialize;
use reqwest;
#[derive(Serialize)]
struct WebhookData {
content: String,
}
#[tokio::main]
async fn main() {
let mut webhook_message: String = "".to_string();
// 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();
// First we update all information of our `System` struct.
sys.refresh_all();
webhook_message.push_str("# system:\n");
// RAM and swap information:
webhook_message.push_str(format!("total memory: {} bytes\n", sys.total_memory()).as_str());
webhook_message.push_str(format!("used memory : {} bytes\n", sys.used_memory()).as_str());
webhook_message.push_str(format!("total swap : {} bytes\n", sys.total_swap()).as_str());
webhook_message.push_str(format!("used swap : {} bytes\n", sys.used_swap()).as_str());
// Display system information:
webhook_message.push_str(format!("System name: {:?}\n", System::name()).as_str());
webhook_message.push_str(format!("System kernel version: {:?}\n", System::kernel_version()).as_str());
webhook_message.push_str(format!("System OS version: {:?}\n", System::os_version()).as_str());
webhook_message.push_str(format!("System host name: {:?}\n", System::host_name()).as_str());
// Number of CPUs:
webhook_message.push_str(format!("NB CPUs: {}\n", sys.cpus().len()).as_str());
// We display all disks' information:
webhook_message.push_str("# disks:\n");
let disks = Disks::new_with_refreshed_list();
for disk in &disks {
webhook_message.push_str(format!("{disk:?}\n").as_str());
}
// Network interfaces name, total data received and total data transmitted:
let networks = Networks::new_with_refreshed_list();
webhook_message.push_str("# networks:\n");
for (interface_name, data) in &networks {
webhook_message.push_str(format!("{interface_name}: {} B (down) / {} B (up)\n", data.total_received(), data.total_transmitted()).as_str());
// If you want the amount of data received/transmitted since last call
// to `Networks::refresh`, use `received`/`transmitted`.
}
// Components temperature:
let components = Components::new_with_refreshed_list();
webhook_message.push_str("# components:\n");
for component in &components {
webhook_message.push_str(format!("{component:?}\n").as_str());
}
println!("{webhook_message}");
let client = reqwest::Client::new();
let data = WebhookData {
content: webhook_message,
};
let json_data = serde_json::to_string(&data).unwrap();
client
.post("WEBHOOK_URL_HERE")
.header("Content-Type", "application/json")
.body(json_data)
.send()
.await;
}