You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

83 lines
1.8 KiB

use std::{
collections::HashMap
};
4 years ago
use serde::{
Deserialize,
Serialize
};
use uuid::Uuid;
use crate::{contracts::*, UID, exec_job};
4 years ago
4 years ago
pub struct UClient {
pub client_info: ClientInfo,
4 years ago
pub jobs: JobMetaStorage,
4 years ago
}
impl UClient {
pub fn new(client_info: ClientInfo) -> Self {
Self {
client_info,
jobs: HashMap::new()
4 years ago
}
}
}
4 years ago
4 years ago
#[derive(Serialize, Deserialize, Debug, Clone)]
4 years ago
pub struct ClientInfo {
pub info: HashMap<String, String>,
4 years ago
pub id: Uuid,
}
impl ClientInfo {
4 years ago
pub async fn gather() -> Self {
let mut info: HashMap<String, String> = HashMap::new();
for job in DEFAULT_JOBS {
4 years ago
let job_meta = JobMeta::from_shell(job.1.into()).into_arc();
let job_result = exec_job(job_meta.clone()).await;
let job_data = match job_result.unwrap().data.unwrap() {
Ok(output) => output.multiline(),
Err(e) => e.to_string()
};
info.insert(job.0.into(), job_data);
}
4 years ago
ClientInfo {
info,
4 years ago
id: *UID
4 years ago
}
}
pub fn get_field(&self, field: &str) -> Option<&String> {
self.info.get(field)
}
4 years ago
}
const DEFAULT_JOBS: &[(&str, &str)] = &[
//("local ip", "ip a"),
("hostname", "hostname"),
("username", "whoami"),
("platform", "uname -a"),
];
#[cfg(test)]
mod tests {
use super::*;
4 years ago
use crate::{
utils::vec_to_string
};
use std::time::SystemTime;
4 years ago
#[tokio::test]
async fn test_gather() {
let cli_info = ClientInfo::gather().await;
let field = cli_info.get_field("username").unwrap();
let stdout = JobOutput::from_multiline(field).unwrap().stdout;
assert_eq!(
&vec_to_string(&stdout),
4 years ago
"root"
)
}
}