pub mod alerts;
pub mod cache;
pub mod enrich;
pub mod manifest;
pub mod monitor;
pub mod watcher;
use std::sync::Arc;
use tokio::sync::mpsc;
pub use alerts::{run_long_poll, PendingAlert, PendingAlerts};
pub use cache::{CacheEntry, ContentHashCache};
pub use enrich::{
enrich_session_start, try_register_project_from_cwd, DeclaredSource, EnrichError,
};
pub use manifest::{
AgentManifest, AgentPath, ConfigScope, JsonSlicePath, Manifest, ManifestError, WatchStrategy,
};
pub use monitor::{ChangeKind, ConfigChangeRequest, EventSource, Severity};
use crate::cloud::CloudEvent;
use crate::config::Config;
use crate::core::logging::EventLogger;
use crate::privacy::PrivacyFilter;
pub struct ConfigMonitor {
manifest: Arc<Manifest>,
cache: Arc<ContentHashCache>,
privacy_filter: PrivacyFilter,
cloud_tx: Option<mpsc::Sender<CloudEvent>>,
event_logger: EventLogger,
config: Arc<Config>,
}
impl ConfigMonitor {
pub fn new(
manifest: Arc<Manifest>,
cache: Arc<ContentHashCache>,
privacy_filter: PrivacyFilter,
cloud_tx: Option<mpsc::Sender<CloudEvent>>,
event_logger: EventLogger,
config: Arc<Config>,
) -> Self {
Self {
manifest,
cache,
privacy_filter,
cloud_tx,
event_logger,
config,
}
}
pub async fn spawn(self) -> anyhow::Result<ConfigMonitorHandle> {
let (request_tx, request_rx) = mpsc::channel::<ConfigChangeRequest>(256);
let watchers = watcher::spawn_watchers(
&self.manifest,
request_tx.clone(),
self.config.inventory_monitor.watcher_debounce_ms,
)?;
let join = tokio::spawn(monitor::run(
self.manifest,
self.cache,
self.privacy_filter,
self.cloud_tx,
self.event_logger,
self.config,
request_rx,
request_tx.clone(),
));
Ok(ConfigMonitorHandle {
join,
request_tx,
_watchers: watchers,
})
}
}
pub struct ConfigMonitorHandle {
#[allow(dead_code)]
join: tokio::task::JoinHandle<()>,
pub request_tx: mpsc::Sender<ConfigChangeRequest>,
_watchers: Vec<watcher::WatcherGuard>,
}