From c14af00c08646b8262c834720a3c436bfb65a981 Mon Sep 17 00:00:00 2001 From: GW_MC <72297530+GWMCwing@users.noreply.github.com> Date: Mon, 22 Dec 2025 18:16:26 +0800 Subject: [PATCH] feat: update dependencies and refactor command line argument handling for yanpm-agent --- apps/agent/Cargo.toml | 2 +- apps/agent/src/commands/validate.rs | 2 +- apps/agent/src/main.rs | 91 +++++++++-------------------- justfile | 8 +-- 4 files changed, 34 insertions(+), 69 deletions(-) diff --git a/apps/agent/Cargo.toml b/apps/agent/Cargo.toml index 7e254c6..698c357 100644 --- a/apps/agent/Cargo.toml +++ b/apps/agent/Cargo.toml @@ -11,5 +11,5 @@ tracing-subscriber = { version = "0.3.20", features = ["smallvec", "fmt", "ansi" serde_json = { version = "1.0.145", features = ["std"] } serde = { version = "1.0.228", features = ["std", "derive"] } tokio-cron-scheduler = { version = "0.15.1", features = ["signal"] } -clap = { version = "4", features = ["derive"] } +clap = { version = "4", features = ["derive", "env"] } nix = { version = "0.30.1", features = ["user", "fs"] } diff --git a/apps/agent/src/commands/validate.rs b/apps/agent/src/commands/validate.rs index eac8f46..6ce53cf 100644 --- a/apps/agent/src/commands/validate.rs +++ b/apps/agent/src/commands/validate.rs @@ -1,4 +1,4 @@ -use tracing::{error, info, warn}; +use tracing::{info, warn}; use crate::commands::{run::run_cmd, write_config::INTERNAL_CONFIG_FOLDER_NAME}; use std::path::PathBuf; diff --git a/apps/agent/src/main.rs b/apps/agent/src/main.rs index b626fb4..72fdaff 100644 --- a/apps/agent/src/main.rs +++ b/apps/agent/src/main.rs @@ -5,7 +5,7 @@ mod routes; use axum::routing::get; use axum::{Router, routing::post}; -use clap::{Arg, Command}; +use clap::{Parser, command}; use std::os::unix::fs::PermissionsExt; use std::path::PathBuf; use std::sync::Arc; @@ -15,10 +15,6 @@ use tracing::{error, info, warn}; use crate::commands::NginxService; use crate::routes::{status, validate, validate_and_reload, write_config}; -const SOCK_ARG: &str = "sock"; -const NGINX_CONFIG_DIR_ARG: &str = "nginx_config_dir"; -const SOCK_PERM_ARG: &str = "sock_perm"; -const SOCK_GID_ARG: &str = "sock_gid"; const SOCK_ENV: &str = "YANPM_AGENT_SOCK"; const SOCK_PERM_ENV: &str = "YANPM_AGENT_SOCK_PERM"; const NGINX_CONFIG_DIR_ENV: &str = "YANPM_NGINX_CONFIG_DIR"; @@ -28,6 +24,27 @@ const NGINX_CONFIG_DIR_DEFAULT: &str = "/etc/nginx/conf.d"; const SOCK_PERM_DEFAULT: &str = "660"; const SOCK_GID_DEFAULT: &str = ""; +/// Command line arguments +#[derive(Parser, Debug)] +#[command(author, version, about, long_about = None)] +struct Args { + /// Unix socket path to bind the agent daemon to + #[arg(short = 's', long, default_value_t = String::from(SOCK_DEFAULT), env = SOCK_ENV)] + sock: String, + + /// Directory where generated nginx config files will be written + #[arg(short = 'd', long, default_value_t = String::from(NGINX_CONFIG_DIR_DEFAULT), env = NGINX_CONFIG_DIR_ENV)] + nginx_config_dir: String, + + /// Permissions to set on the unix socket (in octal), e.g. 660 + #[arg(long, default_value_t = String::from(SOCK_PERM_DEFAULT), env = SOCK_PERM_ENV)] + sock_perm: String, + + /// GID to set on the unix socket, default: current user's primary group + #[arg(long, default_value_t = String::from(SOCK_GID_DEFAULT), env = SOCK_GID_ENV)] + sock_gid: String, +} + #[tokio::main] async fn main() -> Result<(), Box> { let subscriber = tracing_subscriber::fmt() @@ -40,39 +57,7 @@ async fn main() -> Result<(), Box> { tracing::subscriber::set_global_default(subscriber) .expect("Failed to set global default subscriber"); - let args = Command::new("yanpm-agent") - .arg( - Arg::new(SOCK_ARG) - .short('s') - .long("sock") - .value_name("SOCK_PATH") - .help("Unix socket path to bind the agent daemon to") - .required(false), - ) - .arg( - Arg::new(NGINX_CONFIG_DIR_ARG) - .short('d') - .long("nginx-config-dir") - .value_name("NGINX_CONFIG_DIR") - .help("Directory where generated nginx config files will be written") - .required(false), - ) - .arg( - Arg::new(SOCK_PERM_ARG) - .long("sock-perm") - .value_name("SOCK_PERM") - .help("Permissions to set on the unix socket (in octal), e.g. 660") - .required(false), - ) - .arg( - Arg::new(SOCK_GID_ARG) - .long("sock-gid") - .value_name("SOCK_GID") - .help("GID to set on the unix socket, default: current user's primary group") - .required(false), - ) - .about("YANPM Agent Daemon") - .get_matches(); + let args = Args::parse(); let (sock, nginx_config_dir, sock_perm, sock_gid) = get_args(&args).await?; @@ -175,32 +160,12 @@ async fn main() -> Result<(), Box> { } async fn get_args( - args: &clap::ArgMatches, + args: &Args, ) -> Result<(String, String, u32, String), Box> { - let sock = args - .get_one::(SOCK_ARG) - .cloned() - .unwrap_or_else(|| std::env::var(SOCK_ENV).unwrap_or_else(|_| SOCK_DEFAULT.to_string())); - let nginx_config_dir = args - .get_one::(NGINX_CONFIG_DIR_ARG) - .cloned() - .unwrap_or_else(|| { - std::env::var(NGINX_CONFIG_DIR_ENV) - .unwrap_or_else(|_| NGINX_CONFIG_DIR_DEFAULT.to_string()) - }); - let sock_perm = args - .get_one::(SOCK_PERM_ARG) - .cloned() - .unwrap_or_else(|| { - std::env::var(SOCK_PERM_ENV).unwrap_or_else(|_| SOCK_PERM_DEFAULT.to_string()) - }); - - let sock_gid = args - .get_one::(SOCK_GID_ARG) - .cloned() - .unwrap_or_else(|| { - std::env::var(SOCK_GID_ENV).unwrap_or_else(|_| SOCK_GID_DEFAULT.to_string()) - }); + let sock = args.sock.clone(); + let nginx_config_dir = args.nginx_config_dir.clone(); + let sock_perm = args.sock_perm.clone(); + let sock_gid = args.sock_gid.clone(); if sock_perm.len() != 3 || !sock_perm.chars().all(|c| ('0'..='7').contains(&c)) { return Err(std::io::Error::new( diff --git a/justfile b/justfile index fede830..a27a0e4 100644 --- a/justfile +++ b/justfile @@ -50,10 +50,6 @@ generate-openapi: # Generate API client for frontend cd apps/frontend && \ pnpm generate:openapi - # Generate OpenAPI spec for agent - cd apps/agent && \ - cargo run -- --generate-openapi --openapi-output ./openapi.yaml - # TODO: Generate API client for agent in api generate-all: generate-entity generate-openapi @@ -68,6 +64,10 @@ build-backend: cd apps/api && \ cargo build --release +build-docker: + cd apps/agent && \ + docker build -t yanpm/agent:latest . + build-apps: build-frontend build-backend act *args: