kanade-agent 0.1.5

Windows-side resident daemon for the kanade endpoint-management system. Subscribes to commands.* over NATS, runs scripts, publishes WMI inventory + heartbeats, watches for self-updates
use std::time::Duration;

use kanade_shared::{Heartbeat, subject};
use tracing::warn;

const HEARTBEAT_INTERVAL: Duration = Duration::from_secs(30);

pub async fn heartbeat_loop(client: async_nats::Client, pc_id: String, agent_version: String) {
    let mut interval = tokio::time::interval(HEARTBEAT_INTERVAL);
    loop {
        interval.tick().await;
        let hb = Heartbeat {
            pc_id: pc_id.clone(),
            at: chrono::Utc::now(),
            agent_version: agent_version.clone(),
        };
        let payload = match serde_json::to_vec(&hb) {
            Ok(b) => b,
            Err(e) => {
                warn!(error = %e, "serialize heartbeat");
                continue;
            }
        };
        if let Err(e) = client
            .publish(subject::heartbeat(&pc_id), payload.into())
            .await
        {
            warn!(error = %e, "publish heartbeat");
        }
    }
}