feature/agent #11
@@ -11,5 +11,5 @@ tracing-subscriber = { version = "0.3.20", features = ["smallvec", "fmt", "ansi"
|
|||||||
serde_json = { version = "1.0.145", features = ["std"] }
|
serde_json = { version = "1.0.145", features = ["std"] }
|
||||||
serde = { version = "1.0.228", features = ["std", "derive"] }
|
serde = { version = "1.0.228", features = ["std", "derive"] }
|
||||||
tokio-cron-scheduler = { version = "0.15.1", features = ["signal"] }
|
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"] }
|
nix = { version = "0.30.1", features = ["user", "fs"] }
|
||||||
|
|||||||
@@ -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 crate::commands::{run::run_cmd, write_config::INTERNAL_CONFIG_FOLDER_NAME};
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ mod routes;
|
|||||||
|
|
||||||
use axum::routing::get;
|
use axum::routing::get;
|
||||||
use axum::{Router, routing::post};
|
use axum::{Router, routing::post};
|
||||||
use clap::{Arg, Command};
|
use clap::{Parser, command};
|
||||||
use std::os::unix::fs::PermissionsExt;
|
use std::os::unix::fs::PermissionsExt;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
@@ -15,10 +15,6 @@ use tracing::{error, info, warn};
|
|||||||
use crate::commands::NginxService;
|
use crate::commands::NginxService;
|
||||||
use crate::routes::{status, validate, validate_and_reload, write_config};
|
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_ENV: &str = "YANPM_AGENT_SOCK";
|
||||||
const SOCK_PERM_ENV: &str = "YANPM_AGENT_SOCK_PERM";
|
const SOCK_PERM_ENV: &str = "YANPM_AGENT_SOCK_PERM";
|
||||||
const NGINX_CONFIG_DIR_ENV: &str = "YANPM_NGINX_CONFIG_DIR";
|
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_PERM_DEFAULT: &str = "660";
|
||||||
const SOCK_GID_DEFAULT: &str = "";
|
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]
|
#[tokio::main]
|
||||||
async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
|
async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
|
||||||
let subscriber = tracing_subscriber::fmt()
|
let subscriber = tracing_subscriber::fmt()
|
||||||
@@ -40,39 +57,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
|
|||||||
tracing::subscriber::set_global_default(subscriber)
|
tracing::subscriber::set_global_default(subscriber)
|
||||||
.expect("Failed to set global default subscriber");
|
.expect("Failed to set global default subscriber");
|
||||||
|
|
||||||
let args = Command::new("yanpm-agent")
|
let args = Args::parse();
|
||||||
.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 (sock, nginx_config_dir, sock_perm, sock_gid) = get_args(&args).await?;
|
let (sock, nginx_config_dir, sock_perm, sock_gid) = get_args(&args).await?;
|
||||||
|
|
||||||
@@ -175,32 +160,12 @@ async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async fn get_args(
|
async fn get_args(
|
||||||
args: &clap::ArgMatches,
|
args: &Args,
|
||||||
) -> Result<(String, String, u32, String), Box<dyn std::error::Error + Send + Sync>> {
|
) -> Result<(String, String, u32, String), Box<dyn std::error::Error + Send + Sync>> {
|
||||||
let sock = args
|
let sock = args.sock.clone();
|
||||||
.get_one::<String>(SOCK_ARG)
|
let nginx_config_dir = args.nginx_config_dir.clone();
|
||||||
.cloned()
|
let sock_perm = args.sock_perm.clone();
|
||||||
.unwrap_or_else(|| std::env::var(SOCK_ENV).unwrap_or_else(|_| SOCK_DEFAULT.to_string()));
|
let sock_gid = args.sock_gid.clone();
|
||||||
let nginx_config_dir = args
|
|
||||||
.get_one::<String>(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::<String>(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::<String>(SOCK_GID_ARG)
|
|
||||||
.cloned()
|
|
||||||
.unwrap_or_else(|| {
|
|
||||||
std::env::var(SOCK_GID_ENV).unwrap_or_else(|_| SOCK_GID_DEFAULT.to_string())
|
|
||||||
});
|
|
||||||
|
|
||||||
if sock_perm.len() != 3 || !sock_perm.chars().all(|c| ('0'..='7').contains(&c)) {
|
if sock_perm.len() != 3 || !sock_perm.chars().all(|c| ('0'..='7').contains(&c)) {
|
||||||
return Err(std::io::Error::new(
|
return Err(std::io::Error::new(
|
||||||
|
|||||||
8
justfile
8
justfile
@@ -50,10 +50,6 @@ generate-openapi:
|
|||||||
# Generate API client for frontend
|
# Generate API client for frontend
|
||||||
cd apps/frontend && \
|
cd apps/frontend && \
|
||||||
pnpm generate:openapi
|
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
|
generate-all: generate-entity generate-openapi
|
||||||
@@ -68,6 +64,10 @@ build-backend:
|
|||||||
cd apps/api && \
|
cd apps/api && \
|
||||||
cargo build --release
|
cargo build --release
|
||||||
|
|
||||||
|
build-docker:
|
||||||
|
cd apps/agent && \
|
||||||
|
docker build -t yanpm/agent:latest .
|
||||||
|
|
||||||
build-apps: build-frontend build-backend
|
build-apps: build-frontend build-backend
|
||||||
|
|
||||||
act *args:
|
act *args:
|
||||||
|
|||||||
Reference in New Issue
Block a user