next_web_utils/system/
sys_info.rs

1use std::collections::HashMap;
2use sysinfo::{Disks, Networks, Pid, Process, ProcessesToUpdate, System};
3
4/// `SystemInfo` 是一个封装了 `sysinfo::System` 的结构体,用于获取系统信息。
5pub struct SystemInfo(System);
6
7impl SystemInfo {
8    /// 创建一个新的 `SystemInfo` 实例,并初始化所有系统信息。
9    pub fn new() -> Self {
10        let sys = System::new_all(); // 初始化所有系统信息(CPU、内存、进程等)
11        Self(sys)
12    }
13
14    /// 获取全局 CPU 使用率(百分比)。
15    pub fn get_cpu_usage(&mut self) -> f32 {
16        self.0.refresh_cpu_all(); // 刷新所有 CPU 信息
17        self.0.global_cpu_usage() // 返回全局 CPU 使用率
18    }
19
20    /// 获取逻辑 CPU 核心数量。
21    pub fn get_cpu_count(&mut self) -> usize {
22        self.0.refresh_cpu_all(); // 刷新所有 CPU 信息
23        self.0.cpus().len() // 返回逻辑 CPU 核心数量
24    }
25
26    /// 获取所有 CPU 核心的信息。
27    pub fn get_cpus(&mut self) -> &[sysinfo::Cpu] {
28        self.0.refresh_cpu_all(); // 刷新所有 CPU 信息
29        self.0.cpus() // 返回所有 CPU 核心的信息
30    }
31
32    /// 获取已使用的内存大小(单位:字节)。
33    pub fn get_memory_usage(&mut self) -> u64 {
34        self.0.refresh_memory(); // 刷新内存信息
35        self.0.used_memory() // 返回已使用的内存大小
36    }
37
38    /// 获取可用内存大小(单位:字节)。
39    pub fn get_memory_available(&mut self) -> u64 {
40        self.0.refresh_memory(); // 刷新内存信息
41        self.0.available_memory() // 返回可用内存大小
42    }
43
44    /// 获取总内存大小(单位:字节)。
45    pub fn get_total_memory(&mut self) -> u64 {
46        self.0.refresh_memory(); // 刷新内存信息
47        self.0.total_memory() // 返回总内存大小
48    }
49
50    /// 获取已使用的交换空间大小(单位:字节)。
51    pub fn get_swap_usage(&mut self) -> u64 {
52        self.0.refresh_memory(); // 刷新内存信息
53        self.0.used_swap() // 返回已使用的交换空间大小
54    }
55
56    /// 获取总交换空间大小(单位:字节)。
57    pub fn get_total_swap(&mut self) -> u64 {
58        self.0.refresh_memory(); // 刷新内存信息
59        self.0.total_swap() // 返回总交换空间大小
60    }
61
62    /// 获取当前所有进程的哈希表(PID -> 进程信息)。
63    pub fn get_process(&mut self) -> &HashMap<Pid, Process> {
64        self.0.processes() // 返回所有进程的哈希表
65    }
66
67    /// 获取物理核心数量(如果支持)。
68    pub fn get_physical_core_count(&mut self) -> Option<usize> {
69        self.0.physical_core_count() // 返回物理核心数量
70    }
71
72    /// 根据进程名称获取匹配的进程列表。
73    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); // 刷新所有进程信息
78        self.0.processes_by_name(name.as_ref()) // 返回匹配的进程迭代器
79    }
80
81    /// 根据 PID 获取指定的进程信息。
82    pub fn get_process_from_pid(&mut self, pid: u32) -> Option<&Process> {
83        self.0.refresh_processes(ProcessesToUpdate::All, true); // 刷新所有进程信息
84        self.0.process(Pid::from_u32(pid)) // 返回指定 PID 的进程信息
85    }
86
87    /// 获取当前运行的进程数量。
88    pub fn get_process_count(&mut self) -> usize {
89        self.0.refresh_processes(ProcessesToUpdate::All, true); // 刷新所有进程信息
90        self.0.processes().len() // 返回进程数量
91    }
92}
93
94impl SystemInfo {
95    /// 获取系统的名称(如操作系统名称)。
96    pub fn name() -> Option<String> {
97        System::name() // 返回系统名称
98    }
99
100    /// 获取操作系统的版本号。
101    pub fn os_version() -> Option<String> {
102        System::os_version() // 返回操作系统版本号
103    }
104
105    /// 获取主机名。
106    pub fn host_name() -> Option<String> {
107        System::host_name() // 返回主机名
108    }
109
110    /// 获取内核版本号。
111    pub fn kernel_version() -> Option<String> {
112        System::kernel_version() // 返回内核版本号
113    }
114
115    /// 获取网络接口信息。
116    pub fn networks() -> Networks {
117        Networks::new_with_refreshed_list() // 返回刷新后的网络接口信息
118    }
119
120    /// 获取磁盘信息。
121    pub fn disks() -> Disks {
122        Disks::new_with_refreshed_list() // 返回刷新后的磁盘信息
123    }
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); // 确保至少有一个逻辑 CPU 核心
134    }
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); // CPU 使用率应在 0% 到 100% 之间
141    }
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); // 已使用内存不应超过总内存
149    }
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); // 已使用交换空间不应超过总交换空间
157    }
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); // 确保至少有一个进程在运行
164    }
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); // 确保物理核心数量大于 0
171        }
172    }
173
174    #[test]
175    fn test_system_name() {
176        let system_name = SystemInfo::name();
177        assert!(system_name.is_some()); // 确保系统名称存在
178    }
179
180    #[test]
181    fn test_os_version() {
182        let os_version = SystemInfo::os_version();
183        assert!(os_version.is_some()); // 确保操作系统版本号存在
184    }
185
186    #[test]
187    fn test_host_name() {
188        let host_name = SystemInfo::host_name();
189        assert!(host_name.is_some()); // 确保主机名存在
190    }
191
192    #[test]
193    fn test_kernel_version() {
194        let kernel_version = SystemInfo::kernel_version();
195        assert!(kernel_version.is_some()); // 确保内核版本号存在
196    }
197}