//! Server-client communication utilities for WatcherAgent //! //! Handles server commands, Docker image updates, and container management using the Bollard library. //! use crate::models::ServerMessage; use super::container::{restart_container, update_docker_image}; use bollard::query_parameters::{CreateImageOptions, RestartContainerOptions}; use bollard::Docker; use std::error::Error; /// Handles a message from the backend server and dispatches the appropriate action. /// /// # Arguments /// * `docker` - Reference to a Bollard Docker client. /// * `msg` - The server message to handle. /// /// # Returns /// * `Result<(), Box>` - Ok if handled successfully, error otherwise. pub async fn handle_server_message( docker: &Docker, msg: ServerMessage, ) -> Result<(), Box> { let msg = msg.clone(); println!("Handling server message: {:?}", msg); // Handle different message types match msg.message_type.as_str() { "update_image" => { if let Some(image_name) = msg.data.get("image").and_then(|v| v.as_str()) { println!("Received update command for image: {}", image_name); // Call your update_docker_image function here update_docker_image(docker, image_name).await?; Ok(()) } else { Err("Missing image name in update message".into()) } } "restart_container" => { if let Some(image_name) = msg.data.get("image").and_then(|v| v.as_str()) { println!("Received restart command for image: {}", image_name); // Call your update_docker_image function here update_docker_image(docker, image_name).await?; Ok(()) } else { Err("Missing image name in update message".into()) } } "stop_agent" => { println!("Received stop agent command"); // Implement graceful shutdown std::process::exit(0); } _ => { eprintln!("Unknown message type: {}", msg.message_type); Err(format!("Unknown message type: {}", msg.message_type).into()) } } }