mouse/src/gatherers/system.rs
Jochen Maes eeab38558a
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
Adds dmi info + mouse matrix room
2023-11-03 17:13:11 +01:00

135 lines
4.5 KiB
Rust

// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
use std::{fs, io::ErrorKind, str, usize};
use sysinfo::{System, SystemExt};
use crate::types::fact::Fact;
pub struct SystemData {}
impl SystemData {}
impl Fact for SystemData {
fn gather(&self) -> String {
if System::IS_SUPPORTED {
let mut sys = System::new();
// we only need certain values.
sys.refresh_cpu();
sys.refresh_disks();
sys.refresh_disks_list();
sys.refresh_memory();
sys.refresh_system();
sys.refresh_components();
sys.refresh_components_list();
sys.refresh_users_list();
serde_json::to_string(&sys).unwrap()
} else {
"{\"error\": \"Not Supported\"}".to_string()
}
}
}
pub struct DMIData {}
impl DMIData {}
impl Fact for DMIData {
fn gather(&self) -> String {
json!({
"form_factor": get_form_factor("/sys/devices/virtual/dmi/id/chassis_type"),
"bios_date": get_string("/sys/devices/virtual/dmi/id/bios_date"),
"bios_vendor": get_string("/sys/devices/virtual/dmi/id/bios_vendor"),
"bios_version": get_string("/sys/devices/virtual/dmi/id/bios_version"),
"board_asset_tag": get_string("/sys/devices/virtual/dmi/id/board_asset_tag"),
"board_name": get_string("/sys/devices/virtual/dmi/id/board_name"),
"board_serial": get_string("/sys/devices/virtual/dmi/id/board_serial"),
"board_vendor": get_string("/sys/devices/virtual/dmi/id/board_vendor"),
"board_version": get_string("/sys/devices/virtual/dmi/id/board_version"),
"chassis_asset_tag": get_string("/sys/devices/virtual/dmi/id/chassis_asset_tag"),
"chassis_serial": get_string("/sys/devices/virtual/dmi/id/chassis_vendor"),
"chassis_vendor": get_string("/sys/devices/virtual/dmi/id/chassis_vendor"),
"chassis_version": get_string("/sys/devices/virtual/dmi/id/chassis_version"),
"product_name": get_string("/sys/devices/virtual/dmi/id/product_name"),
"product_serial": get_string("/sys/devices/virtual/dmi/id/product_serial"),
"product_uuid": get_string("/sys/devices/virtual/dmi/id/product_uuid"),
"product_version": get_string("/sys/devices/virtual/dmi/id/product_version"),
"system_vendor": get_string("/sys/devices/virtual/dmi/id/sys_vendor"),
})
.to_string()
}
}
fn get_string(path: &str) -> String {
match fs::read(path) {
Ok(x) => String::from_utf8(x).unwrap().trim().to_string(),
Err(y) => match y.kind() {
ErrorKind::PermissionDenied => "This data needs sudo or root permissions".to_string(),
other_error => format!("Could not retrieve {other_error}"),
},
}
}
fn get_form_factor(path: &str) -> &str {
// Get form factor info
// as learned from Ansible, we need to have the list in a specific order,
// see https://www.dmtf.org/sites/default/files/standards/documents/DSP0134_3.2.0.pdf
let ff: Vec<&str> = vec![
"Unknown",
"Other",
"Unknown",
"Desktop",
"Low Profile Desktop",
"Pizza Box",
"Mini Tower",
"Tower",
"Portable",
"Laptop",
"Notebook",
"Hand Held",
"Docking Station",
"All In One",
"Sub Notebook",
"Space-saving",
"Lunch Box",
"Main Server Chassis",
"Expansion Chassis",
"Sub Chassis",
"Bus Expansion Chassis",
"Peripheral Chassis",
"RAID Chassis",
"Rack Mount Chassis",
"Sealed-case PC",
"Multi-system",
"CompactPCI",
"AdvancedTCA",
"Blade",
"Blade Enclosure",
"Tablet",
"Convertible",
"Detachable",
"IoT Gateway",
"Embedded PC",
"Mini PC",
"Stick PC",
];
let filecontent: &str = match fs::read(path) {
Err(_) => ff[0],
Ok(x) => {
let ind: i32 = match str::from_utf8(&x) {
Ok(x) => x.trim().parse::<i32>().unwrap(),
Err(_) => 0,
};
let out: &str = if ff.len() <= ind as usize {
ff[0]
} else {
ff[ind as usize]
};
out
}
};
filecontent
}