Initial commit
This commit is contained in:
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
/target
|
||||
.env
|
||||
1765
Cargo.lock
generated
Normal file
1765
Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
11
Cargo.toml
Normal file
11
Cargo.toml
Normal file
@@ -0,0 +1,11 @@
|
||||
[package]
|
||||
name = "node-notifier"
|
||||
version = "0.1.0"
|
||||
edition = "2024"
|
||||
|
||||
[dependencies]
|
||||
dotenvy = "0.15.7"
|
||||
reqwest = { version = "0.12.22", features = ["blocking", "json"] }
|
||||
serde = "1.0.219"
|
||||
serde_json = "1.0.140"
|
||||
sysinfo = "0.35.2"
|
||||
115
src/main.rs
Normal file
115
src/main.rs
Normal file
@@ -0,0 +1,115 @@
|
||||
use dotenvy::dotenv;
|
||||
use sysinfo::{Disks, System};
|
||||
|
||||
fn get_cpu_usage(sys: &System) -> f32 {
|
||||
sys.global_cpu_usage()
|
||||
}
|
||||
|
||||
fn get_memory_usage(sys: &System) -> f32 {
|
||||
let total_memory = sys.total_memory() as f32;
|
||||
let used_memory = sys.used_memory() as f32;
|
||||
|
||||
used_memory / total_memory * 100.0
|
||||
}
|
||||
|
||||
fn get_swap_usage(sys: &System) -> f32 {
|
||||
let total_swap = sys.total_swap() as f32;
|
||||
let used_swap = sys.used_swap() as f32;
|
||||
|
||||
used_swap / total_swap * 100.0
|
||||
}
|
||||
|
||||
fn get_disk_usage(disks : &Disks) -> f32 {
|
||||
let mut total_used_space = 0.0;
|
||||
let mut total_space = 0.0;
|
||||
|
||||
for disk in disks {
|
||||
if let Some(mount_point) = disk.mount_point().to_str() {
|
||||
if mount_point == "/" || mount_point == "/home" {
|
||||
total_used_space += disk.total_space() as f32 - disk.available_space() as f32;
|
||||
total_space += disk.total_space() as f32;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if total_space == 0.0 {
|
||||
return 0.0; // Avoid division by zero
|
||||
}
|
||||
|
||||
(total_used_space / total_space) * 100.0
|
||||
}
|
||||
|
||||
fn send_notification(webhook_url: &str, message: &str) {
|
||||
let client = reqwest::blocking::Client::new();
|
||||
let payload = serde_json::json!({
|
||||
"content": message,
|
||||
"username": "System Monitor",
|
||||
"avatar_url": "https://cdn.shopify.com/s/files/1/0262/1423/6212/files/Lord_of_the_Rings_eye_of_Sauron_-_Ghtic.com_-_Blog.png?v=1579680018"
|
||||
});
|
||||
|
||||
match client.post(webhook_url).json(&payload).send() {
|
||||
Ok(response) => {
|
||||
if response.status().is_success() {
|
||||
println!("Notification sent successfully.");
|
||||
} else {
|
||||
eprintln!("Failed to send notification: {}", response.status());
|
||||
}
|
||||
}
|
||||
Err(e) => eprintln!("Error sending notification: {}", e),
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
dotenv().ok();
|
||||
|
||||
let discord_webhook =
|
||||
std::env::var("DISCORD_WEBHOOK").expect("DISCORD_WEBHOOK environment variable not set");
|
||||
|
||||
let mut sys = System::new_all();
|
||||
let mut disks: Disks = Disks::new_with_refreshed_list();
|
||||
sys.refresh_all();
|
||||
disks.refresh(true);
|
||||
|
||||
let cpu_usage = get_cpu_usage(&sys);
|
||||
if cpu_usage > 80.0 {
|
||||
let message = format!("High CPU usage detected: {:.2}%", cpu_usage);
|
||||
send_notification(&discord_webhook, &message);
|
||||
}
|
||||
|
||||
let memory_usage = get_memory_usage(&sys);
|
||||
if memory_usage > 80.0 {
|
||||
let message = format!("High memory usage detected: {:.2}%", memory_usage);
|
||||
send_notification(&discord_webhook, &message);
|
||||
}
|
||||
|
||||
let swap_usage = get_swap_usage(&sys);
|
||||
if swap_usage > 80.0 {
|
||||
let message = format!("High swap usage detected: {:.2}%", swap_usage);
|
||||
send_notification(&discord_webhook, &message);
|
||||
}
|
||||
|
||||
let disk_usage = get_disk_usage(&disks);
|
||||
if disk_usage > 80.0 {
|
||||
let message = format!("High disk usage detected: {:.2}%", disk_usage);
|
||||
send_notification(&discord_webhook, &message);
|
||||
}
|
||||
|
||||
println!("System Information:");
|
||||
println!("CPU usage: {:.2}%", cpu_usage);
|
||||
println!("Memory usage: {:.2}%", memory_usage);
|
||||
println!("Swap usage: {:.2}%", swap_usage);
|
||||
println!("Disk usage: {:.2}%", disk_usage);
|
||||
|
||||
// Send a final notification with all system information
|
||||
let final_message = format!(
|
||||
concat!(
|
||||
"System Information:\n",
|
||||
"CPU usage: {:.2}%\n",
|
||||
"Memory usage: {:.2}%\n",
|
||||
"Swap usage: {:.2}%\n",
|
||||
"Disk usage: {:.2}%"
|
||||
),
|
||||
cpu_usage, memory_usage, swap_usage, disk_usage
|
||||
);
|
||||
send_notification(&discord_webhook, &final_message);
|
||||
}
|
||||
Reference in New Issue
Block a user