From 812ee08ac5902b2f2d1647f9b12de646c6f7ee92 Mon Sep 17 00:00:00 2001 From: Graham McIntire Date: Fri, 16 Jan 2026 18:02:33 -0600 Subject: [PATCH] Fix clippy warnings to pass CI build - Remove unused SnmpError import - Replace deprecated from_i32 with TryFrom - Add #[allow(dead_code)] to unused SnmpValue methods - Remove unused perform_self_update function - Remove unused token field from AgentClient - Remove unused send_error method - Add #[allow(dead_code)] to protobuf generated module --- src/proto.rs | 1 + src/snmp/mod.rs | 2 +- src/snmp/types.rs | 2 ++ src/version.rs | 62 ----------------------------------------- src/websocket_client.rs | 26 ++--------------- 5 files changed, 7 insertions(+), 86 deletions(-) diff --git a/src/proto.rs b/src/proto.rs index b4cbc09..dbbdda3 100644 --- a/src/proto.rs +++ b/src/proto.rs @@ -1,4 +1,5 @@ // Generated protobuf code +#[allow(dead_code)] pub mod agent { include!(concat!(env!("OUT_DIR"), "/towerops.agent.rs")); } diff --git a/src/snmp/mod.rs b/src/snmp/mod.rs index 5c012c9..75d9809 100644 --- a/src/snmp/mod.rs +++ b/src/snmp/mod.rs @@ -2,4 +2,4 @@ mod client; mod types; pub use client::SnmpClient; -pub use types::{SnmpError, SnmpValue}; +pub use types::SnmpValue; diff --git a/src/snmp/types.rs b/src/snmp/types.rs index 2b03f0e..c8552b6 100644 --- a/src/snmp/types.rs +++ b/src/snmp/types.rs @@ -37,6 +37,7 @@ pub enum SnmpValue { } impl SnmpValue { + #[allow(dead_code)] pub fn as_i64(&self) -> Option { match self { SnmpValue::Integer(v) => Some(*v), @@ -48,6 +49,7 @@ impl SnmpValue { } } + #[allow(dead_code)] pub fn as_f64(&self) -> Option { self.as_i64().map(|v| v as f64) } diff --git a/src/version.rs b/src/version.rs index 6ac0112..b393f2f 100644 --- a/src/version.rs +++ b/src/version.rs @@ -1,7 +1,6 @@ use log::{info, warn}; use serde::Deserialize; use std::cmp::Ordering; -use std::process::Command; const DOCKER_IMAGE: &str = "gmcintire/towerops-agent"; @@ -96,67 +95,6 @@ pub fn check_for_updates() { } } -/// Perform self-update by pulling latest image and exiting -/// Returns Ok(true) if update was initiated, Ok(false) if already up to date -pub fn perform_self_update() -> Result { - let current_ver = current_version(); - - // Check if a newer version is available - match get_latest_version() { - Ok(latest) => { - let current = Version::parse(current_ver); - let latest_version = Version::parse(&latest); - - match (current, latest_version) { - (Some(curr), Some(lat)) => { - if lat <= curr { - info!( - "Already running latest version ({} <= {})", - latest, current_ver - ); - return Ok(false); - } - - info!("Update available: {} -> {}", current_ver, latest); - } - _ => { - warn!("Could not parse versions, proceeding with update check"); - } - } - } - Err(e) => { - warn!("Could not check Docker Hub for versions: {}", e); - // Continue anyway - try to pull and see if anything changed - } - } - - // Pull the latest image - info!("Pulling latest Docker image: {}:latest", DOCKER_IMAGE); - let output = Command::new("docker") - .args(["pull", &format!("{}:latest", DOCKER_IMAGE)]) - .output() - .map_err(|e| format!("Failed to execute docker command: {}", e))?; - - if !output.status.success() { - let stderr = String::from_utf8_lossy(&output.stderr); - return Err(format!("Failed to pull image: {}", stderr)); - } - - let stdout = String::from_utf8_lossy(&output.stdout); - - // Check if the image was actually updated - if stdout.contains("Image is up to date") || stdout.contains("Already exists") { - info!("Image is already up to date, no restart needed"); - return Ok(false); - } - - info!("Successfully pulled new image"); - info!("Exiting to allow restart with new version..."); - - // Exit with success code - orchestrator (docker-compose/k8s) will restart with new image - std::process::exit(0); -} - /// Get the latest version from Docker Hub fn get_latest_version() -> Result> { let url = format!( diff --git a/src/websocket_client.rs b/src/websocket_client.rs index b655555..6add849 100644 --- a/src/websocket_client.rs +++ b/src/websocket_client.rs @@ -17,7 +17,7 @@ use tokio_tungstenite::{ }; use crate::proto::agent::{ - AgentError, AgentHeartbeat, AgentJob, AgentJobList, JobType, QueryType, SnmpResult, + AgentHeartbeat, AgentJob, AgentJobList, JobType, QueryType, SnmpResult, }; use crate::snmp::{SnmpClient, SnmpValue}; @@ -34,7 +34,6 @@ struct PhoenixMessage { /// WebSocket client for agent communication. pub struct AgentClient { ws_stream: WebSocketStream>, - token: String, agent_id: String, result_tx: mpsc::UnboundedSender, result_rx: mpsc::UnboundedReceiver, @@ -63,7 +62,6 @@ impl AgentClient { Ok(Self { ws_stream, - token: token.to_string(), agent_id: generate_agent_id(), result_tx, result_rx, @@ -160,7 +158,7 @@ impl AgentClient { log::info!("Received {} jobs from server", job_list.jobs.len()); for job in job_list.jobs { - let job_type = JobType::from_i32(job.job_type).unwrap_or(JobType::Poll); + let job_type = JobType::try_from(job.job_type).unwrap_or(JobType::Poll); log::info!("Executing job: {} (type: {:?})", job.job_id, job_type); // Spawn task to execute job @@ -218,24 +216,6 @@ impl AgentClient { log::debug!("Sent SNMP result for equipment {}", result.equipment_id); Ok(()) } - - /// Send error to server. - async fn send_error(&mut self, error: AgentError) -> Result<()> { - let binary = error.encode_to_vec(); - - let msg = PhoenixMessage { - topic: format!("agent:{}", self.agent_id), - event: "error".to_string(), - payload: serde_json::json!({"binary": BASE64.encode(&binary)}), - reference: None, - }; - - let text = serde_json::to_string(&msg)?; - self.ws_stream.send(WsMessage::Text(text)).await?; - - log::warn!("Sent error for equipment {}", error.equipment_id); - Ok(()) - } } /// Execute an SNMP job and collect results. @@ -245,7 +225,7 @@ async fn execute_job(job: AgentJob, result_tx: mpsc::UnboundedSender let snmp_client = SnmpClient::new(); for query in job.queries { - let query_type = QueryType::from_i32(query.query_type).unwrap_or(QueryType::Get); + let query_type = QueryType::try_from(query.query_type).unwrap_or(QueryType::Get); match query_type { QueryType::Get => {