From 9f122566d0d051a6ca287e60e14102964bc909ff Mon Sep 17 00:00:00 2001 From: GW_MC <72297530+GWMCwing@users.noreply.github.com> Date: Sun, 28 Dec 2025 18:08:55 +0800 Subject: [PATCH] feat: add agent settings configuration and update agent client service --- apps/api/src/configs.rs | 4 ++ apps/api/src/configs/agent.rs | 58 +++++++++++++++++++++++++++ apps/api/src/configs/key.rs | 2 + apps/api/src/services/agent_client.rs | 1 + 4 files changed, 65 insertions(+) create mode 100644 apps/api/src/configs/agent.rs diff --git a/apps/api/src/configs.rs b/apps/api/src/configs.rs index 68b46d0..9385fc4 100644 --- a/apps/api/src/configs.rs +++ b/apps/api/src/configs.rs @@ -1,3 +1,4 @@ +pub mod agent; pub mod auth; pub mod database; pub mod logging; @@ -21,6 +22,7 @@ pub struct ProgramSettings { pub database: database::DatabaseSettings, pub server: server::ServerSettings, pub auth: auth::AuthSettings, + pub agent: agent::AgentSettings, } impl FromConfig for ProgramSettings { @@ -30,6 +32,7 @@ impl FromConfig for ProgramSettings { database: database::DatabaseSettings::from_config(_config)?, server: server::ServerSettings::from_config(_config)?, auth: auth::AuthSettings::from_config(_config)?, + agent: agent::AgentSettings::from_config(_config)?, }; config.validate()?; Ok(config) @@ -50,6 +53,7 @@ impl FromConfig for ProgramSettings { database: database::DatabaseSettings::mock(), server: server::ServerSettings::mock(), auth: auth::AuthSettings::mock(), + agent: agent::AgentSettings::mock(), } } } diff --git a/apps/api/src/configs/agent.rs b/apps/api/src/configs/agent.rs new file mode 100644 index 0000000..088cf82 --- /dev/null +++ b/apps/api/src/configs/agent.rs @@ -0,0 +1,58 @@ +use config::Config; +use tracing::error; + +use crate::configs::key::AGENT_SOCK_PATH_KEY; + +use super::FromConfig; + +#[derive(Debug, Clone)] +pub struct AgentSettings { + pub socket_path: String, +} + +impl FromConfig for AgentSettings { + fn from_config(_config: &Config) -> Result { + Ok(AgentSettings { + socket_path: _config.get_string(AGENT_SOCK_PATH_KEY).map_err(|err| { + format!( + "Failed to get {} from configuration. Err: {}", + AGENT_SOCK_PATH_KEY, err + ) + })?, + }) + } + + fn validate(&self) -> Result<(), String> { + // ensure socket_path exists and is readable and writable + if !std::path::Path::new(&self.socket_path).exists() { + let msg = format!("Agent socket path '{}' does not exist", self.socket_path); + error!("{}", msg); + return Err(msg); + } + if std::path::Path::new(&self.socket_path) + .metadata() + .map(|meta| { + let permissions = meta.permissions(); + // Check read and write permissions for the owner + !permissions.readonly() + }) + .unwrap_or(false) + { + Ok(()) + } else { + let msg = format!( + "Agent socket path '{}' is not readable/writable", + self.socket_path + ); + error!("{}", msg); + Err(msg) + } + } + + #[cfg(test)] + fn mock() -> Self { + AgentSettings { + socket_path: "/tmp/agent.sock".to_string(), + } + } +} diff --git a/apps/api/src/configs/key.rs b/apps/api/src/configs/key.rs index dae73a4..c7090b2 100644 --- a/apps/api/src/configs/key.rs +++ b/apps/api/src/configs/key.rs @@ -14,3 +14,5 @@ pub(crate) const DATABASE_MIGRATE_ON_STARTUP_KEY: &str = "DATABASE.MIGRATION.MIG pub(crate) const AUTH_JWT_SECRET_KEY: &str = "AUTH.JWT_SECRET"; pub(crate) const AUTH_DEFAULT_ADMIN_USERNAME_KEY: &str = "AUTH.DEFAULT_ADMIN_USERNAME"; pub(crate) const AUTH_DEFAULT_ADMIN_PASSWORD_KEY: &str = "AUTH.DEFAULT_ADMIN_PASSWORD"; +// +pub(crate) const AGENT_SOCK_PATH_KEY: &str = "AGENT.SOCK.PATH"; diff --git a/apps/api/src/services/agent_client.rs b/apps/api/src/services/agent_client.rs index 0dc7449..74c3d1c 100644 --- a/apps/api/src/services/agent_client.rs +++ b/apps/api/src/services/agent_client.rs @@ -14,6 +14,7 @@ impl AgentService { } } + #[allow(dead_code)] pub fn get_client(&self) -> Arc { Arc::clone(&self.client) }