use std::{ collections::HashMap, fmt }; use serde::{ Deserialize, Serialize }; use uuid::Uuid; use crate::{contracts::*, UID, exec_job}; pub struct UClient { pub client_info: ClientInfo, pub jobs: Vec, // TODO: to futures } impl UClient { pub fn new(client_info: ClientInfo) -> Self { Self { client_info, jobs: Vec::new() } } } #[derive(Serialize, Deserialize, Debug, Clone)] pub struct ClientInfo { pub info: HashMap, pub id: Uuid, } impl ClientInfo { pub fn gather() -> Self { let mut info: HashMap = HashMap::new(); for job in DEFAULT_JOBS { let mut job_meta = JobMeta::from_shell(job.1.into()); let job_result = exec_job(&mut job_meta); let job_data = match job_result.data { Ok(output) => output.multiline(), Err(e) => e.description() }; info.insert(job.0.into(), job_data); } ClientInfo { info, id: *UID } } pub fn get_field(&self, field: &str) -> Option<&String> { self.info.get(field) } } impl ToMsg for ClientInfo {} const DEFAULT_JOBS: &[(&str, &str)] = &[ //("local ip", "ip a"), ("hostname", "hostname"), ("username", "whoami"), ("platform", "uname -a"), ]; #[cfg(test)] mod tests { use super::*; #[test] fn test_gather() { let cli_info = ClientInfo::gather(); let field = cli_info.get_field("username").unwrap(); assert_eq!( JobOutput::from_multiline(field).unwrap().stdout, b"plazmoid".to_vec() ) } }