next_web_utils/system/
sys_info.rs1use std::collections::HashMap;
2use sysinfo::{Disks, Networks, Pid, Process, ProcessesToUpdate, System};
3
4pub struct SystemInfo(System);
6
7impl SystemInfo {
8 pub fn new() -> Self {
10 let sys = System::new_all(); Self(sys)
12 }
13
14 pub fn get_cpu_usage(&mut self) -> f32 {
16 self.0.refresh_cpu_all(); self.0.global_cpu_usage() }
19
20 pub fn get_cpu_count(&mut self) -> usize {
22 self.0.refresh_cpu_all(); self.0.cpus().len() }
25
26 pub fn get_cpus(&mut self) -> &[sysinfo::Cpu] {
28 self.0.refresh_cpu_all(); self.0.cpus() }
31
32 pub fn get_memory_usage(&mut self) -> u64 {
34 self.0.refresh_memory(); self.0.used_memory() }
37
38 pub fn get_memory_available(&mut self) -> u64 {
40 self.0.refresh_memory(); self.0.available_memory() }
43
44 pub fn get_total_memory(&mut self) -> u64 {
46 self.0.refresh_memory(); self.0.total_memory() }
49
50 pub fn get_swap_usage(&mut self) -> u64 {
52 self.0.refresh_memory(); self.0.used_swap() }
55
56 pub fn get_total_swap(&mut self) -> u64 {
58 self.0.refresh_memory(); self.0.total_swap() }
61
62 pub fn get_process(&mut self) -> &HashMap<Pid, Process> {
64 self.0.processes() }
66
67 pub fn get_physical_core_count(&mut self) -> Option<usize> {
69 self.0.physical_core_count() }
71
72 pub fn get_process_from_name<'a: 'b, 'b>(
74 &'a mut self,
75 name: &'b str,
76 ) -> impl Iterator<Item = &'a Process> + 'b {
77 self.0.refresh_processes(ProcessesToUpdate::All, true); self.0.processes_by_name(name.as_ref()) }
80
81 pub fn get_process_from_pid(&mut self, pid: u32) -> Option<&Process> {
83 self.0.refresh_processes(ProcessesToUpdate::All, true); self.0.process(Pid::from_u32(pid)) }
86
87 pub fn get_process_count(&mut self) -> usize {
89 self.0.refresh_processes(ProcessesToUpdate::All, true); self.0.processes().len() }
92}
93
94impl SystemInfo {
95 pub fn name() -> Option<String> {
97 System::name() }
99
100 pub fn os_version() -> Option<String> {
102 System::os_version() }
104
105 pub fn host_name() -> Option<String> {
107 System::host_name() }
109
110 pub fn kernel_version() -> Option<String> {
112 System::kernel_version() }
114
115 pub fn networks() -> Networks {
117 Networks::new_with_refreshed_list() }
119
120 pub fn disks() -> Disks {
122 Disks::new_with_refreshed_list() }
124}
125
126#[cfg(test)]
127mod tests {
128 use super::*;
129
130 #[test]
131 fn test_system_info_creation() {
132 let mut system_info = SystemInfo::new();
133 assert!(system_info.get_cpu_count() > 0); }
135
136 #[test]
137 fn test_cpu_usage() {
138 let mut system_info = SystemInfo::new();
139 let cpu_usage = system_info.get_cpu_usage();
140 assert!(cpu_usage >= 0.0 && cpu_usage <= 100.0); }
142
143 #[test]
144 fn test_memory_usage() {
145 let mut system_info = SystemInfo::new();
146 let used_memory = system_info.get_memory_usage();
147 let total_memory = system_info.get_total_memory();
148 assert!(used_memory <= total_memory); }
150
151 #[test]
152 fn test_swap_usage() {
153 let mut system_info = SystemInfo::new();
154 let used_swap = system_info.get_swap_usage();
155 let total_swap = system_info.get_total_swap();
156 assert!(used_swap <= total_swap); }
158
159 #[test]
160 fn test_process_count() {
161 let mut system_info = SystemInfo::new();
162 let process_count = system_info.get_process_count();
163 assert!(process_count > 0); }
165
166 #[test]
167 fn test_physical_core_count() {
168 let mut system_info = SystemInfo::new();
169 if let Some(physical_cores) = system_info.get_physical_core_count() {
170 assert!(physical_cores > 0); }
172 }
173
174 #[test]
175 fn test_system_name() {
176 let system_name = SystemInfo::name();
177 assert!(system_name.is_some()); }
179
180 #[test]
181 fn test_os_version() {
182 let os_version = SystemInfo::os_version();
183 assert!(os_version.is_some()); }
185
186 #[test]
187 fn test_host_name() {
188 let host_name = SystemInfo::host_name();
189 assert!(host_name.is_some()); }
191
192 #[test]
193 fn test_kernel_version() {
194 let kernel_version = SystemInfo::kernel_version();
195 assert!(kernel_version.is_some()); }
197}