use crate::models::ServerMessage; use bollard::Docker; use bollard::query_parameters::CreateImageOptions; use bollard::query_parameters::RestartContainerOptions; use futures_util::StreamExt; pub fn parse_message(raw: &str) -> ServerMessage { match raw { "restart" => ServerMessage::Restart, msg if msg.starts_with("update:") => ServerMessage::Update(msg[7..].to_string()), _ => ServerMessage::Unknown, } } pub async fn handle_server_message(docker: &Docker, msg: ServerMessage) { match msg { ServerMessage::Update(version) => update_docker_image(docker, &version).await, ServerMessage::Restart => restart_container(docker).await, ServerMessage::Unknown => eprintln!("Unknown message"), } } pub async fn update_docker_image(docker: &Docker, image: &str) { println!("Updating to {}", image); // 1. Pull new image let mut stream = docker.create_image( Some(CreateImageOptions { from_image: Some(image.to_string()), ..Default::default() }), None, None, ); // Use the stream with proper trait bounds while let Some(result) = StreamExt::next(&mut stream).await { match result { Ok(progress) => { if let Some(status) = progress.status { println!("Pull status: {}", status); } } Err(e) => { eprintln!("Error pulling image: {}", e); break; } } } // 2. Restart the current container restart_container(docker).await; } pub async fn restart_container(docker: &Docker) { if let Ok(container_id) = std::env::var("HOSTNAME") { println!("Restarting container {}", container_id); if let Err(e) = docker.restart_container(&container_id, Some(RestartContainerOptions { signal: None, t: Some(0) })) .await { eprintln!("Failed to restart container: {}", e); } } else { eprintln!("No container ID found (HOSTNAME not set?)"); } }