sysinfo_web/
sysinfo_ext.rs1
2use std::collections::HashMap;
3use std::io::Error;
4use serde::{Serialize, Serializer};
5use sysinfo::{NetworkExt, System, SystemExt, Disk, Process, ProcessExt, Component, Processor};
6use hostname::get_hostname;
7
8
9pub struct SysinfoExt<'a> {
11 process_list: HashMap<i32, Process>,
12 processor_list: &'a [Processor],
13 components_list: &'a [Component],
14 disks: &'a [Disk],
15 memory: [u64; 6],
16 hostname: String,
17 uptime: String,
18 pub bandwith: (u64, u64),
19}
20
21
22impl<'a> SysinfoExt<'a> {
23 pub fn new(system: &'a System) -> Self {
24 let network = system.get_network();
25 SysinfoExt {
26 process_list: system.get_process_list()
27 .iter().filter(|p| !p.1.name().is_empty())
29 .map(|p| (*p.0, p.1.clone()))
30 .collect(),
31 processor_list: system.get_processor_list(),
32 components_list: system.get_components_list(),
33 disks: system.get_disks(),
34 memory: [system.get_total_memory(),
35 system.get_used_memory(),
36 system.get_free_memory(),
37 system.get_total_swap(),
38 system.get_used_swap(),
39 system.get_free_swap()],
40 hostname: get_hostname().unwrap_or("Unknown".to_owned()),
41 uptime: get_uptime().unwrap_or("Unknown".to_owned()),
42 bandwith: (network.get_income(), network.get_outcome()),
43 }
44 }
45}
46
47
48
49impl<'a> Serialize for SysinfoExt<'a> {
50 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
51 where S: Serializer
52 {
53 use serde::ser::SerializeMap;
54 use sysinfo_serde::Ser;
55 let mut map = serializer.serialize_map(None)?;
56 map.serialize_entry("processor_list",
57 &self.processor_list
58 .iter()
59 .map(|p| Ser::new(p))
60 .collect::<Vec<Ser<Processor>>>())?;
61 map.serialize_entry("process_list", &Ser::new(&self.process_list))?;
62 map.serialize_entry("components_list",
63 &self.components_list
64 .iter()
65 .map(|c| Ser::new(c))
66 .collect::<Vec<Ser<Component>>>())?;
67 map.serialize_entry("disks",
68 &self.disks
69 .iter()
70 .map(|d| Ser::new(d))
71 .collect::<Vec<Ser<Disk>>>())?;
72 map.serialize_entry("memory", &self.memory)?;
73 map.serialize_entry("hostname", &self.hostname)?;
74 map.serialize_entry("uptime", &self.uptime)?;
75 map.serialize_entry("bandwith", &self.bandwith)?;
76 map.end()
77 }
78}
79
80
81fn get_uptime() -> Result<String, Error> {
83 use std::process::Command;
84 let output = Command::new("uptime").output()?;
85 Ok(String::from_utf8(output.stdout).unwrap_or("Unknown".to_owned()))
86}