|
|
|
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<JobMeta>, // 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<String, String>,
|
|
|
|
pub id: Uuid,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl ClientInfo {
|
|
|
|
pub fn gather() -> Self {
|
|
|
|
let mut info: HashMap<String, String> = 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()
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|