diff --git a/common/src/lib.rs b/common/src/lib.rs index 97a1dc4..d148b76 100644 --- a/common/src/lib.rs +++ b/common/src/lib.rs @@ -8,7 +8,7 @@ pub mod metrics; pub const MQTT_TOPIC: &str = "system/metrics"; pub const MQTT_SEND_INTERVAL: u64 = 5; -#[derive(Debug, Serialize, Deserialize)] +#[derive(Debug, Clone, Serialize, Deserialize)] pub struct StatusMessage { pub agent: String, pub metrics: Metrics, @@ -36,3 +36,9 @@ impl<'a> TryFrom<&'a [u8]> for StatusMessage { serde_json::from_slice(value) } } + +impl From for String { + fn from(msg: StatusMessage) -> String { + serde_json::to_string(&msg).unwrap_or_else(|_| String::new()) + } +} diff --git a/common/src/metrics.rs b/common/src/metrics.rs index 5081b7b..4ff4c00 100644 --- a/common/src/metrics.rs +++ b/common/src/metrics.rs @@ -1,6 +1,6 @@ use serde::{Deserialize, Serialize}; -#[derive(Debug, Serialize, Deserialize)] +#[derive(Debug, Clone, Serialize, Deserialize)] pub struct Metrics { pub system_info: SystemInfo, pub cpu: CPU, @@ -9,7 +9,7 @@ pub struct Metrics { pub network: Network, } -#[derive(Debug, Serialize, Deserialize)] +#[derive(Debug, Clone, Serialize, Deserialize)] pub struct SystemInfo { pub uptime: u64, pub host: Option, @@ -18,14 +18,14 @@ pub struct SystemInfo { pub os_version: Option, } -#[derive(Debug, Serialize, Deserialize)] +#[derive(Debug, Clone, Serialize, Deserialize)] pub struct CPU { pub usage: f32, pub threads: usize, pub breakdown: CPUBreakdown, } -#[derive(Debug, Serialize, Deserialize, Default)] +#[derive(Debug, Clone, Serialize, Deserialize, Default)] pub struct CPUBreakdown { pub system: f32, pub user: f32, @@ -34,13 +34,13 @@ pub struct CPUBreakdown { pub iowait: f32, } -#[derive(Debug, Serialize, Deserialize)] +#[derive(Debug, Clone, Serialize, Deserialize)] pub struct Disk { pub free: u64, pub total: u64, } -#[derive(Debug, Serialize, Deserialize)] +#[derive(Debug, Clone, Serialize, Deserialize)] pub struct Memory { pub used: u64, pub total: u64, @@ -48,7 +48,7 @@ pub struct Memory { pub swap_total: u64, } -#[derive(Debug, Serialize, Deserialize)] +#[derive(Debug, Clone, Serialize, Deserialize)] pub struct Network { pub down: u64, pub up: u64, diff --git a/server/src/bridge.rs b/server/src/bridge.rs index 32955c5..de41c61 100644 --- a/server/src/bridge.rs +++ b/server/src/bridge.rs @@ -1,7 +1,8 @@ +use common::StatusMessage; use tokio::sync::{mpsc::Sender, Mutex}; pub struct ClientManager { - clients: Mutex>>, + clients: Mutex>>, } impl ClientManager { @@ -11,12 +12,12 @@ impl ClientManager { } } - pub async fn add_client(&self, client: Sender) { + pub async fn add_client(&self, client: Sender) { let mut clients = self.clients.lock().await; clients.push(client); } - pub async fn broadcast(&self, message: String) { + pub async fn broadcast(&self, message: &StatusMessage) { let mut clients = self.clients.lock().await; clients.retain(|client| { diff --git a/server/src/broker/subscriber.rs b/server/src/broker/subscriber.rs index 8b1d48f..e99b244 100644 --- a/server/src/broker/subscriber.rs +++ b/server/src/broker/subscriber.rs @@ -27,8 +27,7 @@ impl MqttSubscriber { if let Notification::Forward(forward) = notification.unwrap() { let payload = StatusMessage::try_from(&forward.publish.payload[..])?; - if let Ok(payload_str) = payload.to_string() { - self.clients.broadcast(payload_str).await; + self.clients.broadcast(&payload).await; if let Err(e) = self.storage.record_message(&payload.agent).await { eprintln!("failed to record message for {}: {}", &payload.agent, e); diff --git a/server/src/server/websocket.rs b/server/src/server/websocket.rs index c6e329d..cbc4bfe 100644 --- a/server/src/server/websocket.rs +++ b/server/src/server/websocket.rs @@ -26,7 +26,7 @@ impl WebsocketRoutes { async fn handle_ws_connection(websocket: WebSocket, clients: Arc) { let (mut ws_tx, _) = websocket.split(); - let (tx, mut rx) = channel::(100); + let (tx, mut rx) = channel::(100); clients.add_client(tx).await;