use crate::secrets::SecretProvider;
use crate::state::ExpectedState;
use crate::state::compliance::ManagedHostStatus;
use crate::{error::RegentError, hosts::managed_host::ManagedHostBuilder};
use nanoid::nanoid;
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize)]
pub struct RegentTask {
managed_host_builder: ManagedHostBuilder,
expected_state: ExpectedState,
job: Job,
correlation_id: String,
}
impl RegentTask {
pub fn from(
managed_host_builder: ManagedHostBuilder,
expected_state: ExpectedState,
job: Job,
) -> Self {
Self {
managed_host_builder,
expected_state,
job,
correlation_id: nanoid!(
16,
&[
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
]
),
}
}
pub fn correlation_id(&self) -> &str {
&self.correlation_id
}
pub async fn run(
&mut self,
optional_secret_provider: Option<SecretProvider>,
) -> Result<RegentTaskResult, RegentError> {
let mut managed_host = self
.managed_host_builder
.clone()
.build(optional_secret_provider)
.await?;
managed_host.connect()?;
let host_status = match self.job {
Job::Assess => managed_host.assess_compliance(&self.expected_state).await?,
Job::Reach => managed_host.reach_compliance(&self.expected_state).await?,
};
Ok(RegentTaskResult::from(
self.correlation_id.clone(),
host_status,
))
}
}
#[derive(Serialize, Deserialize)]
pub enum Job {
Assess,
Reach,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct RegentTaskResult {
correlation_id: String,
host_status: ManagedHostStatus,
}
impl RegentTaskResult {
pub fn from(correlation_id: String, host_status: ManagedHostStatus) -> Self {
Self {
correlation_id,
host_status,
}
}
}