efad791d19252f6b4e1ff3be59a4e4f4133d7eac
[valheim_web.git] / backend / src / valheim_controller.rs
1 use sysinfo::{ComponentExt, ProcessExt, SystemExt};
2
3 #[derive(Debug)]
4 pub struct ValheimExe {
5 memory: u64, // [kB].
6 load_average_5min: f64, // [%].
7 uptime: u64, // [s].
8 world_size: u64, // [B].
9 }
10
11 impl ValheimExe {
12 pub fn format_memory(&self) -> String {
13 format_byte_size(self.memory * 1024, 2)
14 }
15 pub fn format_load_average(&self) -> String {
16 format!("{:.2} %", self.load_average_5min)
17 }
18 pub fn format_uptime(&self) -> String {
19 let mins = self.uptime / 60;
20 let hours = mins / 60;
21 let days = hours / 24;
22 format!("{}d{}h{}min", days, hours - 24 * days, mins - 60 * hours)
23 }
24 pub fn format_world_size(&self) -> String {
25 format_byte_size(self.world_size, 2)
26 }
27 }
28
29 const BINARY_PREFIXES: [&str; 8] = ["B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB"];
30
31 fn format_byte_size(bytes: u64, precision: usize) -> String {
32 for i in 0 .. 8 {
33 let mut size: u64 = 1;
34 for j in 0 .. i {
35 size *= 1024;
36 }
37
38 if bytes < 1024 {
39 return format!("{} {}", std::cmp::max(0u64, bytes), BINARY_PREFIXES[i]);
40 }
41 else if bytes < 1024 * size {
42 return format!("{:.prec$} {}", bytes as f64 / size as f64, BINARY_PREFIXES[i], prec = precision);
43 }
44 }
45
46 String::from("")
47 }
48
49 const VALHEIM_PROCESS_NAME: &str = "valheim_server";
50 const VALHEIM_WORLD_PATH: &str = "/home/greg/ValheimWorld/pouet.db"; // TODO: Put in conf.
51
52 pub fn get_valheim_executable_information() -> Option<ValheimExe> {
53 let mut system = sysinfo::System::new_all();
54 system.refresh_system();
55 let processes = system.get_process_by_name(VALHEIM_PROCESS_NAME);
56
57 if processes.len() >= 1 {
58 let process = processes.first().unwrap();
59
60 let world_size = match std::fs::metadata(VALHEIM_WORLD_PATH) { Ok(f) => f.len(), Err(_) => 0u64 };
61
62 Some(
63 ValheimExe {
64 memory: process.memory(),
65 load_average_5min: system.get_load_average().five / system.get_processors().len() as f64 * 100.,
66 uptime: std::time::SystemTime::now().duration_since(std::time::UNIX_EPOCH).unwrap().as_secs() - process.start_time(),
67 world_size
68 }
69 )
70 } else {
71 None
72 }
73 }