67 lines
2.0 KiB
Rust
67 lines
2.0 KiB
Rust
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?)");
|
|
}
|
|
} |