From d994be757ef8c5bb87db234dec6ee1b1d98d8878 Mon Sep 17 00:00:00 2001 From: donpat1to Date: Wed, 1 Oct 2025 11:36:12 +0200 Subject: [PATCH] get clientcontainer; container findable with id image name ahs to be implemented --- WatcherAgent/src/docker/container.rs | 11 +-- WatcherAgent/src/docker/mod.rs | 25 +++++++ WatcherAgent/src/docker/serverclientcomm.rs | 75 ++++----------------- WatcherAgent/src/main.rs | 4 +- WatcherAgent/src/models.rs | 2 +- 5 files changed, 47 insertions(+), 70 deletions(-) diff --git a/WatcherAgent/src/docker/container.rs b/WatcherAgent/src/docker/container.rs index de66eb6..b65707d 100644 --- a/WatcherAgent/src/docker/container.rs +++ b/WatcherAgent/src/docker/container.rs @@ -22,8 +22,9 @@ pub async fn get_available_container(docker: &Docker) -> Vec { container.id.as_ref()?; // Skip if no ID let id = container.id?; - let short_id = if id.len() > 12 { &id[..12] } else { &id }; - + let short_string_id = if id.len() > 12 { &id[..12] } else { &id }; + let short_id: u32 = short_string_id.trim().parse().unwrap(); + let name = container.names .and_then(|names| names.into_iter().next()) .map(|name| name.trim_start_matches('/').to_string()) @@ -46,7 +47,7 @@ pub async fn get_available_container(docker: &Docker) -> Vec { println!(" - ID: {}, Image: {:?}, Name: {}", short_id, container.image, name); Some(DockerContainer { - ID: short_id.to_string(), + ID: short_id, image, Name: name, Status: status, @@ -66,7 +67,7 @@ pub async fn get_available_container(docker: &Docker) -> Vec { containers_list } -pub fn extract_container_id(line: &str) -> Option { +/*pub fn extract_client_container_id(line: &str) -> Option { // Split by slashes and take the last part if let Some(last_part) = line.split('/').last() { let last_part = last_part.trim(); @@ -94,4 +95,4 @@ pub fn extract_container_id(line: &str) -> Option { } None -} \ No newline at end of file +}*/ \ No newline at end of file diff --git a/WatcherAgent/src/docker/mod.rs b/WatcherAgent/src/docker/mod.rs index f91a5ff..e199708 100644 --- a/WatcherAgent/src/docker/mod.rs +++ b/WatcherAgent/src/docker/mod.rs @@ -16,4 +16,29 @@ impl DockerInfo { pub async fn collect() -> Result> { Ok(Self { number: None, net_in_total: None, net_out_total: None, dockers: None }) } +} + +impl DockerContainer { + /*pub async fn restart_container(docker: &Docker) -> Result<(), Box> { + 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?)"); + } + + Ok(()) + }*/ + + pub async fn get_docker_container_id (container: DockerContainer) -> Result> { + Ok(container.ID) + } + + pub async fn get_docker_container_image (container: DockerContainer) -> Result> { + Ok(container.image) + } } \ No newline at end of file diff --git a/WatcherAgent/src/docker/serverclientcomm.rs b/WatcherAgent/src/docker/serverclientcomm.rs index 2493c79..64ed9a0 100644 --- a/WatcherAgent/src/docker/serverclientcomm.rs +++ b/WatcherAgent/src/docker/serverclientcomm.rs @@ -1,5 +1,5 @@ -use crate::models::ServerMessage; -use crate::docker::container::{extract_container_id, get_available_container}; +use crate::models::{DockerContainer, ServerMessage}; +use crate::docker::container::{get_available_container}; use std::error::Error; use bollard::Docker; @@ -74,72 +74,23 @@ pub async fn update_docker_image(docker: &Docker, image: &str) -> Result<(), Box Ok(()) } -pub async fn get_current_image(docker: &Docker) -> Result, Box> { - // First, let's debug the environment - get_available_container(docker).await; +pub async fn get_client_container(docker: &Docker) -> Result, Box> { + let containers = get_available_container(docker).await; + let client_image = "watcher-agent"; - // Get the current container ID from /proc/self/cgroup - let container_id = match std::fs::read_to_string("/proc/self/cgroup") { - Ok(content) => { - let mut found_id = None; - println!("Searching cgroup for container ID..."); - - for line in content.lines() { - println!("Checking line: {}", line); - - // Look for container runtime indicators - if line.contains("docker") || line.contains("crio") || line.contains("containerd") { - if let Some(id) = extract_container_id(line) { - println!("Found potential container ID: {}", id); - found_id = Some(id); - break; - } - } - } - found_id - } - Err(e) => { - eprintln!("Error reading cgroup file: {}", e); - return Ok(None); - } - }; - - let container_id = match container_id { - Some(id) if !id.is_empty() => { - println!("Using container ID: '{}'", id); - id - } - _ => { - eprintln!("Could not find valid container ID in cgroup"); - return Ok(None); - } - }; - - // Try to inspect the container - println!("Attempting to inspect container with ID: '{}'", container_id); - - match docker.inspect_container(&container_id, None::).await { - Ok(container_info) => { - if let Some(config) = container_info.config { - if let Some(image) = config.image { - println!("Successfully found image: {}", image); - return Ok(Some(image)); - } - } - eprintln!("Container inspected but no image found in config"); - Ok(Some("unknown".to_string())) - } - Err(e) => { - eprintln!("Error inspecting container: {}", e); - Ok(None) - } + // Find container with the specific image + if let Some(container) = containers.iter().find(|c| c.image == client_image) { + Ok(Some(container.clone())) + } else { + Ok(None) } } pub async fn restart_container(docker: &Docker) -> Result<(), Box> { - if let Ok(container_id) = std::env::var("HOSTNAME") { + if let Ok(Some(container)) = get_client_container(docker).await { + let container_id = container.clone().ID; println!("Restarting container {}", container_id); - if let Err(e) = docker.restart_container(&container_id, Some(RestartContainerOptions { signal: None, t: Some(0) })) + if let Err(e) = docker.restart_container(&container_id.to_string(), Some(RestartContainerOptions { signal: None, t: Some(0) })) .await { eprintln!("Failed to restart container: {}", e); diff --git a/WatcherAgent/src/main.rs b/WatcherAgent/src/main.rs index 348f148..499badb 100644 --- a/WatcherAgent/src/main.rs +++ b/WatcherAgent/src/main.rs @@ -32,8 +32,8 @@ async fn main() -> Result<(), Box> { .map_err(|e| format!("Failed to connect to Docker: {}", e))?; // Get current image version - let client_version = match docker::serverclientcomm::get_current_image(&docker).await { - Ok(Some(version)) => version, + let client_version = match docker::serverclientcomm::get_client_container(&docker).await { + Ok(Some(version)) => version.image, Ok(None) => { eprintln!("Warning: No image version found"); "unknown".to_string() diff --git a/WatcherAgent/src/models.rs b/WatcherAgent/src/models.rs index 53448bc..729aaed 100644 --- a/WatcherAgent/src/models.rs +++ b/WatcherAgent/src/models.rs @@ -102,7 +102,7 @@ pub struct Acknowledgment { #[derive(Debug, Serialize, Clone)] pub struct DockerContainer { - pub ID: String, + pub ID: u32, pub image: String, pub Name: String, pub Status: String, // "running";"stopped";others