From 428be53fff4638c7bd6eaeb26a9643e611be2b82 Mon Sep 17 00:00:00 2001 From: donpat1to Date: Thu, 25 Sep 2025 22:02:00 +0200 Subject: [PATCH] added docker api for restart and client updat --- WatcherAgent/Cargo.toml | 3 +- WatcherAgent/src/api.rs | 8 ++--- WatcherAgent/src/models.rs | 6 ++-- WatcherAgent/src/serverclientcomm.rs | 45 ++++++++++++++++------------ 4 files changed, 36 insertions(+), 26 deletions(-) diff --git a/WatcherAgent/Cargo.toml b/WatcherAgent/Cargo.toml index e241063..917b1b0 100644 --- a/WatcherAgent/Cargo.toml +++ b/WatcherAgent/Cargo.toml @@ -23,7 +23,8 @@ anyhow = "1.0.98" # config = "0.13" # Docker API access -bollard = "0.16" +bollard = "0.19" +futures-util = "0.3" [target.'cfg(windows)'.dependencies] winapi = { version = "0.3", features = ["winuser", "pdh", "ifmib", "iphlpapi", "winerror" ,"wbemcli", "combaseapi"] } diff --git a/WatcherAgent/src/api.rs b/WatcherAgent/src/api.rs index 4d5d0f4..f8a54be 100644 --- a/WatcherAgent/src/api.rs +++ b/WatcherAgent/src/api.rs @@ -1,5 +1,4 @@ -use crate::serverclientmessage::handle_server_message; - +use crate::serverclientcomm::handle_server_message; use std::time::Duration; @@ -10,7 +9,8 @@ use reqwest::{Client, StatusCode}; use std::error::Error; use tokio::time::sleep; - +use bollard::Docker; +use crate::models::ServerMessage; pub async fn register_with_server( base_url: &str, @@ -163,7 +163,7 @@ pub async fn listening_to_server(docker: &Docker, base_url: &str) -> Result<(), let url = format!("{}/api/message", base_url); loop { // Replace with your server endpoint - let resp = reqwest::get(url) + let resp = reqwest::get(&url) .await; if let Ok(resp) = resp { diff --git a/WatcherAgent/src/models.rs b/WatcherAgent/src/models.rs index 4425a67..1433fdd 100644 --- a/WatcherAgent/src/models.rs +++ b/WatcherAgent/src/models.rs @@ -73,9 +73,11 @@ pub struct HardwareDto { pub ip_address: String, } +#[derive(Debug, Deserialize)] +#[serde(tag = "command", content = "data")] pub enum ServerMessage { - Restart, - Log(String), Update(String), + Restart, + #[serde(other)] Unknown, } \ No newline at end of file diff --git a/WatcherAgent/src/serverclientcomm.rs b/WatcherAgent/src/serverclientcomm.rs index 3cb49b1..e65469e 100644 --- a/WatcherAgent/src/serverclientcomm.rs +++ b/WatcherAgent/src/serverclientcomm.rs @@ -1,12 +1,13 @@ +use crate::models::ServerMessage; + use bollard::Docker; -use bollard::image::CreateImageOptions; -use bollard::container::{RestartContainerOptions}; +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, - "update" => ServerMessage::Update, - msg if msg.starts_with("log:") => ServerMessage::Log(msg[4..].to_string()), msg if msg.starts_with("update:") => ServerMessage::Update(msg[7..].to_string()), _ => ServerMessage::Unknown, } @@ -26,35 +27,41 @@ pub async fn update_docker_image(docker: &Docker, image: &str) { // 1. Pull new image let mut stream = docker.create_image( Some(CreateImageOptions { - from_image: image, + from_image: Some(image.to_string()), ..Default::default() }), None, None, ); - while let Some(progress) = stream.try_next().await.unwrap_or(None) { - if let Some(status) = progress.status { - println!("Pull status: {}", status); + // 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 - if let Ok(container_id) = std::env::var("HOSTNAME") { - println!("Restarting container: {}", container_id); - docker.restart_container(&container_id, Some(RestartContainerOptions { t: 0 })) - .await - .unwrap(); - } else { - eprintln!("No container ID found (HOSTNAME not set?)"); - } + 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); - docker.restart_container(&container_id, Some(RestartContainerOptions { t: 0 })) + if let Err(e) = docker.restart_container(&container_id, Some(RestartContainerOptions { signal: None, t: Some(0) })) .await - .unwrap(); + { + eprintln!("Failed to restart container: {}", e); + } + } else { + eprintln!("No container ID found (HOSTNAME not set?)"); } -} +} \ No newline at end of file