diff --git a/src/api2/node/status.rs b/src/api2/node/status.rs index d5df05ff..a82c0c8a 100644 --- a/src/api2/node/status.rs +++ b/src/api2/node/status.rs @@ -12,6 +12,16 @@ use crate::api2::types::*; use crate::config::acl::{PRIV_SYS_AUDIT, PRIV_SYS_POWER_MANAGEMENT}; use crate::tools::cert::CertInfo; +impl std::convert::From for NodeCpuInformation { + fn from(info: procfs::ProcFsCPUInfo) -> Self { + Self { + model: info.model, + sockets: info.sockets, + cpus: info.cpus, + } + } +} + #[api( input: { properties: { @@ -40,13 +50,40 @@ fn get_status( free: meminfo.memfree, }; + let swap = NodeSwapCounters { + total: meminfo.swaptotal, + used: meminfo.swapused, + free: meminfo.swapfree, + }; + let kstat: procfs::ProcFsStat = procfs::read_proc_stat()?; let cpu = kstat.cpu; + let wait = kstat.iowait_percent; + + let loadavg = procfs::Loadavg::read()?; + let loadavg = [loadavg.one(), loadavg.five(), loadavg.fifteen()]; + + let cpuinfo = procfs::read_cpuinfo()?; + let cpuinfo = cpuinfo.into(); + + let uname = nix::sys::utsname::uname(); + let kversion = format!( + "{} {} {}", + uname.sysname(), + uname.release(), + uname.version() + ); Ok(NodeStatus { memory, + swap, root: crate::tools::disks::disk_usage(Path::new("/"))?, + uptime: procfs::read_proc_uptime()?.0 as u64, + loadavg, + kversion, + cpuinfo, cpu, + wait, info: NodeInformation { fingerprint: CertInfo::new()?.fingerprint()?, }, diff --git a/src/api2/types/mod.rs b/src/api2/types/mod.rs index 6868b131..cfb4ec74 100644 --- a/src/api2/types/mod.rs +++ b/src/api2/types/mod.rs @@ -1520,6 +1520,19 @@ pub struct NodeMemoryCounters { pub free: u64, } +#[api] +#[derive(Serialize, Deserialize, Default)] +#[serde(rename_all = "kebab-case")] +/// Node swap usage counters +pub struct NodeSwapCounters { + /// Total swap + pub total: u64, + /// Used swap + pub used: u64, + /// Free swap + pub free: u64, +} + #[api] #[derive(Serialize,Deserialize,Default)] #[serde(rename_all = "kebab-case")] @@ -1529,6 +1542,19 @@ pub struct NodeInformation { pub fingerprint: String, } +#[api] +#[derive(Serialize, Deserialize, Default)] +#[serde(rename_all = "kebab-case")] +/// Information about the CPU +pub struct NodeCpuInformation { + /// The CPU model + pub model: String, + /// The number of CPU sockets + pub sockets: usize, + /// The number of CPU cores (incl. threads) + pub cpus: usize, +} + #[api( properties: { memory: { @@ -1537,6 +1563,19 @@ pub struct NodeInformation { root: { type: StorageStatus, }, + swap: { + type: NodeSwapCounters, + }, + loadavg: { + type: Array, + items: { + type: Number, + description: "the load", + } + }, + cpuinfo: { + type: NodeCpuInformation, + }, info: { type: NodeInformation, } @@ -1548,7 +1587,17 @@ pub struct NodeInformation { pub struct NodeStatus { pub memory: NodeMemoryCounters, pub root: StorageStatus, + pub swap: NodeSwapCounters, + /// The current uptime of the server. + pub uptime: u64, + /// Load for 1, 5 and 15 minutes. + pub loadavg: [f64; 3], + /// The current kernel version. + pub kversion: String, /// Total CPU usage since last query. pub cpu: f64, + /// Total IO wait since last query. + pub wait: f64, + pub cpuinfo: NodeCpuInformation, pub info: NodeInformation, }