sysinfo_web/
sysinfo_ext.rs

1
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
9/// `sysinfo` with extended features
10pub 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                // filter unnamed kernel threads
28                .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
81/// Gets uptime from /proc/uptime and converts it to human readable String
82fn 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}