#![allow(clippy::module_inception)]
pub mod audit_sink;
pub mod client;
pub mod enroll;
pub mod heartbeat;
pub mod policy_pull;
pub mod smartflow_provider;
pub mod state;
pub use audit_sink::{AuditEvent, AuditSink};
pub use client::{OrgApi, OrgApiError};
pub use enroll::{run_disenroll, run_enroll, run_status};
pub use heartbeat::start_heartbeat;
pub use policy_pull::{start_policy_pull, PolicyPullHandle};
pub use smartflow_provider::SmartflowProvider;
pub use state::{OrgState, ORG_STATE_FILE};
use std::sync::Arc;
use crate::Engine;
pub enum OrgBootstrap {
Standalone,
Enrolled(EnrolledHandles),
}
pub struct EnrolledHandles {
pub state: OrgState,
pub api: Arc<OrgApi>,
pub policy: PolicyPullHandle,
pub audit: Arc<AuditSink>,
pub _heartbeat_task: tokio::task::JoinHandle<()>,
}
pub async fn load_initial_engine(
state: &OrgState,
api: &OrgApi,
fallback: Engine,
) -> Engine {
match api.get_shieldset(&state.policy_group).await {
Ok((yaml, version)) => {
log::warn!(
"[shield] org-mode policy pulled from {} group={} version={}",
state.smartflow_url,
state.policy_group,
version
);
match crate::Engine::from_yaml(&yaml) {
Ok(eng) => eng,
Err(e) => {
log::error!(
"[shield] failed to compile pulled shieldset (group={}): {}. \
Falling back to local rules.",
state.policy_group,
e
);
fallback
}
}
}
Err(e) => {
log::warn!(
"[shield] could not pull policy from Smartflow ({}); using local rules: {}",
state.smartflow_url,
e
);
fallback
}
}
}