From d2efc644879ce027591b33af260939543f954de1 Mon Sep 17 00:00:00 2001 From: donpat1to Date: Sun, 28 Sep 2025 18:54:17 +0200 Subject: [PATCH] moved container functions into new mod --- WatcherAgent/Cargo.toml | 3 -- WatcherAgent/src/docker/container.rs | 64 ++++++++++++++++++++++ WatcherAgent/src/docker/mod.rs | 12 +++++ WatcherAgent/src/main.rs | 1 + WatcherAgent/src/models.rs | 11 ++++ WatcherAgent/src/serverclientcomm.rs | 81 ++-------------------------- 6 files changed, 92 insertions(+), 80 deletions(-) create mode 100644 WatcherAgent/src/docker/container.rs create mode 100644 WatcherAgent/src/docker/mod.rs diff --git a/WatcherAgent/Cargo.toml b/WatcherAgent/Cargo.toml index beaf41a..d195efa 100644 --- a/WatcherAgent/Cargo.toml +++ b/WatcherAgent/Cargo.toml @@ -21,9 +21,6 @@ anyhow = "1.0.98" regex = "1.11.3" -# Docker .env loading -# config = "0.13" - # Docker API access bollard = "0.19" futures-util = "0.3" diff --git a/WatcherAgent/src/docker/container.rs b/WatcherAgent/src/docker/container.rs new file mode 100644 index 0000000..83d2734 --- /dev/null +++ b/WatcherAgent/src/docker/container.rs @@ -0,0 +1,64 @@ +use bollard::query_parameters::{ListContainersOptions}; +use bollard::Docker; + + +// Add this function to debug the Docker connection and environment +pub async fn get_available_container(docker: &Docker) { + println!("=== DOCKER ENVIRONMENT DEBUG ==="); + + // List containers to see what's available - CORRECTED + let options = Some(ListContainersOptions { + all: true, // include stopped containers + ..Default::default() + }); + + match docker.list_containers(options).await { + Ok(containers) => { + println!("Available containers ({}):", containers.len()); + for container in containers { + if let Some(id) = container.id { + let short_id = if id.len() > 12 { &id[..12] } else { &id }; + println!(" - ID: {}, Image: {:?}", short_id, container.image); + + // Also print the names for easier identification + if let Some(names) = container.names { + println!(" Names: {:?}", names); + } + } + } + } + Err(e) => { + eprintln!("Failed to list containers: {}", e); + } + } +} + +pub fn extract_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(); + + // Remove common suffixes + let clean_id = last_part + .trim_end_matches(".scope") + .trim_start_matches("docker-") + .trim_start_matches("crio-") + .trim_start_matches("containerd-"); + + // Check if it looks like a container ID (hex characters) + if clean_id.chars().all(|c| c.is_ascii_hexdigit()) && clean_id.len() >= 12 { + return Some(clean_id.to_string()); + } + + // If it's not pure hex, try to extract hex sequence + let hex_part: String = clean_id.chars() + .take_while(|c| c.is_ascii_hexdigit()) + .collect(); + + if hex_part.len() >= 12 { + return Some(hex_part); + } + } + + None +} \ No newline at end of file diff --git a/WatcherAgent/src/docker/mod.rs b/WatcherAgent/src/docker/mod.rs new file mode 100644 index 0000000..f65cc97 --- /dev/null +++ b/WatcherAgent/src/docker/mod.rs @@ -0,0 +1,12 @@ +pub mod container; + +//use std::error::Error; +use crate::models::DockerContainer; + +#[derive(Debug, Clone)] +pub struct DockerInfo { + pub number: u16, + pub net_in_total: f64, + pub net_out_total: f64, + pub dockers: Vec, +} \ No newline at end of file diff --git a/WatcherAgent/src/main.rs b/WatcherAgent/src/main.rs index 523ff8c..eb74e15 100644 --- a/WatcherAgent/src/main.rs +++ b/WatcherAgent/src/main.rs @@ -6,6 +6,7 @@ pub mod hardware; pub mod metrics; pub mod models; pub mod serverclientcomm; +pub mod docker; use std::env; use std::error::Error; diff --git a/WatcherAgent/src/models.rs b/WatcherAgent/src/models.rs index 3cad177..b6549a0 100644 --- a/WatcherAgent/src/models.rs +++ b/WatcherAgent/src/models.rs @@ -98,4 +98,15 @@ pub struct Acknowledgment { pub message_id: String, pub status: String, // "success" or "error" pub details: String, +} + +#[derive(Debug, Serialize, Clone)] +pub struct DockerContainer { + pub ID: String, + pub image: String, + pub Name: String, + pub Status: String, // "running";"stopped";others + pub net_in: f64, + pub net_out: f64, + pub cpu_load: f64, } \ No newline at end of file diff --git a/WatcherAgent/src/serverclientcomm.rs b/WatcherAgent/src/serverclientcomm.rs index 186e0e7..2493c79 100644 --- a/WatcherAgent/src/serverclientcomm.rs +++ b/WatcherAgent/src/serverclientcomm.rs @@ -1,8 +1,9 @@ -use crate::models::{ServerMessage}; +use crate::models::ServerMessage; +use crate::docker::container::{extract_container_id, get_available_container}; use std::error::Error; use bollard::Docker; -use bollard::query_parameters::{CreateImageOptions, RestartContainerOptions, InspectContainerOptions, ListContainersOptions}; +use bollard::query_parameters::{CreateImageOptions, RestartContainerOptions, InspectContainerOptions}; use futures_util::StreamExt; pub async fn handle_server_message(docker: &Docker, msg: ServerMessage) -> Result<(), Box> { @@ -75,7 +76,7 @@ pub async fn update_docker_image(docker: &Docker, image: &str) -> Result<(), Box pub async fn get_current_image(docker: &Docker) -> Result, Box> { // First, let's debug the environment - debug_docker_environment(docker).await; + get_available_container(docker).await; // Get the current container ID from /proc/self/cgroup let container_id = match std::fs::read_to_string("/proc/self/cgroup") { @@ -135,80 +136,6 @@ pub async fn get_current_image(docker: &Docker) -> Result, Box Option { - // Split by slashes and take the last part - if let Some(last_part) = line.split('/').last() { - let last_part = last_part.trim(); - - // Remove common suffixes - let clean_id = last_part - .trim_end_matches(".scope") - .trim_start_matches("docker-") - .trim_start_matches("crio-") - .trim_start_matches("containerd-"); - - // Check if it looks like a container ID (hex characters) - if clean_id.chars().all(|c| c.is_ascii_hexdigit()) && clean_id.len() >= 12 { - return Some(clean_id.to_string()); - } - - // If it's not pure hex, try to extract hex sequence - let hex_part: String = clean_id.chars() - .take_while(|c| c.is_ascii_hexdigit()) - .collect(); - - if hex_part.len() >= 12 { - return Some(hex_part); - } - } - - None -} - -// Add this function to debug the Docker connection and environment -async fn debug_docker_environment(docker: &Docker) { - println!("=== DOCKER ENVIRONMENT DEBUG ==="); - - // List containers to see what's available - CORRECTED - let options = Some(ListContainersOptions { - all: true, // include stopped containers - ..Default::default() - }); - - match docker.list_containers(options).await { - Ok(containers) => { - println!("Available containers ({}):", containers.len()); - for container in containers { - if let Some(id) = container.id { - let short_id = if id.len() > 12 { &id[..12] } else { &id }; - println!(" - ID: {}, Image: {:?}", short_id, container.image); - - // Also print the names for easier identification - if let Some(names) = container.names { - println!(" Names: {:?}", names); - } - } - } - } - Err(e) => { - eprintln!("Failed to list containers: {}", e); - } - } - - // Check if we're actually running in a container - if let Ok(content) = std::fs::read_to_string("/proc/self/cgroup") { - println!("Cgroup contents:"); - println!("{}", content); - } - - // Check other container indicators - if std::path::Path::new("/.dockerenv").exists() { - println!("/.dockerenv exists - running in Docker container"); - } else { - println!("/.dockerenv does not exist"); - } -} - pub async fn restart_container(docker: &Docker) -> Result<(), Box> { if let Ok(container_id) = std::env::var("HOSTNAME") { println!("Restarting container {}", container_id);