serverman/src/node/system.rs

87 lines
2.6 KiB
Rust

use serde::{Deserialize, Serialize};
use sysinfo::{CpuRefreshKind, Disks, MemoryRefreshKind, Networks, RefreshKind, System};
#[derive(Serialize, Deserialize, Clone)]
pub struct NetworkInterface {
pub name: String,
pub received: u64,
pub transmitted: u64,
}
#[derive(Serialize, Deserialize, Clone)]
pub struct DiskInfo {
pub device_name: String,
pub mount_point: String,
pub total_space: u64,
pub available_space: u64,
}
#[derive(Serialize, Deserialize, Clone)]
pub struct SystemInfo {
// Node info
pub name: String,
pub host_name: String,
pub os_version: String,
pub kernel_version: String,
// RAM usage
pub total_memory: u64,
pub used_memory: u64,
pub total_swap: u64,
pub used_swap: u64,
// Multi-elem resources
pub networks: Vec<NetworkInterface>,
pub disks: Vec<DiskInfo>,
// CPU
pub cpu_count: usize,
pub load_average: (f64, f64, f64),
}
pub fn system_info() -> SystemInfo {
let refresh_kind: RefreshKind = RefreshKind::new()
.with_cpu(CpuRefreshKind::everything())
.with_memory(MemoryRefreshKind::everything());
let mut sys = System::new_with_specifics(refresh_kind);
sys.refresh_specifics(refresh_kind);
let networks = Networks::new_with_refreshed_list()
.iter()
.map(|(name, data)| NetworkInterface {
name: name.clone(),
received: data.received(),
transmitted: data.transmitted(),
})
.collect();
let cpus = sys.cpus();
let avg = sysinfo::System::load_average();
let disks = Disks::new_with_refreshed_list()
.iter()
.filter(|disk| !disk.is_removable() && !disk.name().eq_ignore_ascii_case("overlay"))
.map(|disk| DiskInfo {
device_name: disk.name().to_str().unwrap_or_default().to_string(),
mount_point: disk.mount_point().to_str().unwrap_or_default().to_string(),
total_space: disk.total_space(),
available_space: disk.available_space(),
})
.collect();
SystemInfo {
name: sysinfo::System::name().unwrap_or_default(),
host_name: sysinfo::System::host_name().unwrap_or_default(),
os_version: sysinfo::System::os_version().unwrap_or_default(),
kernel_version: sysinfo::System::kernel_version().unwrap_or_default(),
cpu_count: cpus.len(),
total_memory: sys.total_memory(),
used_memory: sys.used_memory(),
total_swap: sys.total_swap(),
used_swap: sys.used_swap(),
networks,
disks,
load_average: (avg.one, avg.five, avg.fifteen),
}
}