tauri_plugin_system_info/utils/
sysinfo.rs

1use crate::model::{Battery, Component, Cpu, Disk, Network, Process};
2use std::sync::Mutex;
3use sysinfo::{
4    Components, CpuRefreshKind, Disks, Networks, Pid, ProcessRefreshKind, RefreshKind, System,
5};
6
7pub fn get_sys() -> System {
8    System::new_all()
9}
10pub struct SysInfoState {
11    pub sysinfo: Mutex<SysInfo>,
12}
13/// A Mute Wrapper for sysinfo crate's System struct
14pub struct SysInfo {
15    pub sys: System,
16}
17
18impl Default for SysInfoState {
19    fn default() -> SysInfoState {
20        SysInfoState {
21            sysinfo: Mutex::new(SysInfo {
22                sys: System::new_all(),
23            }),
24        }
25    }
26}
27
28/// Impl methods from sysinfo's System struct for convenience
29impl SysInfo {
30    // refresh system info
31    pub fn refresh_all(&mut self) {
32        self.sys.refresh_all();
33    }
34    pub fn refresh_memory(&mut self) {
35        self.sys.refresh_memory();
36    }
37    pub fn refresh_cpu(&mut self) {
38        self.sys.refresh_cpu();
39    }
40    pub fn refresh_processes(&mut self) {
41        self.sys.refresh_processes();
42    }
43    pub fn refresh_process(&mut self, pid: Pid) {
44        self.sys.refresh_process(pid);
45    }
46    pub fn refresh_specifics(&mut self, refreshes: RefreshKind) {
47        self.sys.refresh_specifics(refreshes);
48    }
49    pub fn refresh_cpu_specifics(&mut self, refresh_kind: CpuRefreshKind) {
50        self.sys.refresh_cpu_specifics(refresh_kind);
51    }
52    pub fn refresh_processes_specifics(&mut self, refresh_kind: ProcessRefreshKind) {
53        self.sys.refresh_processes_specifics(refresh_kind);
54    }
55    pub fn refresh_process_specifics(&mut self, pid: Pid, refresh_kind: ProcessRefreshKind) {
56        self.sys.refresh_process_specifics(pid, refresh_kind);
57    }
58
59    // static info
60    pub fn hostname(&self) -> Option<String> {
61        System::host_name()
62    }
63    pub fn kernel_version(&self) -> Option<String> {
64        System::kernel_version()
65    }
66    pub fn os_version(&self) -> Option<String> {
67        System::os_version()
68    }
69    pub fn name(&self) -> Option<String> {
70        System::name()
71    }
72
73    // memory
74    pub fn total_memory(&mut self) -> u64 {
75        self.refresh_memory();
76        self.sys.total_memory()
77    }
78    pub fn used_memory(&mut self) -> u64 {
79        self.refresh_memory();
80        self.sys.used_memory()
81    }
82    pub fn total_swap(&mut self) -> u64 {
83        self.refresh_memory();
84        self.sys.total_swap()
85    }
86    pub fn used_swap(&mut self) -> u64 {
87        self.refresh_memory();
88        self.sys.used_swap()
89    }
90
91    // cpu
92    pub fn cpus(&self) -> Vec<Cpu> {
93        self.sys.cpus().iter().map(|cpu| cpu.into()).collect()
94    }
95
96    pub fn cpu_count(&self) -> usize {
97        self.sys.cpus().len()
98    }
99
100    // disks
101    pub fn disks(&mut self) -> Vec<Disk> {
102        let disks = Disks::new_with_refreshed_list();
103        disks.iter().map(|disk| disk.into()).collect()
104    }
105
106    // other
107    pub fn networks(&self) -> Vec<Network> {
108        let networks = Networks::new_with_refreshed_list();
109        networks
110            .into_iter()
111            .map(|(name, data)| Network::new(name, data))
112            .collect()
113    }
114    pub fn components(&self) -> Vec<Component> {
115        let components = Components::new_with_refreshed_list();
116        components
117            .iter()
118            .map(|component| component.into())
119            .collect()
120    }
121    pub fn processes(&self) -> Vec<Process> {
122        self.sys
123            .processes()
124            .iter()
125            .map(|(_, process)| process.into())
126            .collect()
127    }
128    pub fn batteries(&self) -> Result<Vec<Battery>, starship_battery::Error> {
129        let manager = starship_battery::Manager::new()?;
130        Ok(manager
131            .batteries()?
132            .filter_map(|maybe_battery| match maybe_battery {
133                Ok(battery) => Some(battery.into()),
134                Err(_) => None,
135            })
136            .collect())
137    }
138}