diff options
author | yuzu <yuzu@b9215c17-b818-4693-b096-d1e41a411fef> | 2025-07-12 06:17:38 +0000 |
---|---|---|
committer | yuzu <yuzu@b9215c17-b818-4693-b096-d1e41a411fef> | 2025-07-12 06:17:38 +0000 |
commit | 78608add1c69a877b76a05147f6c26b7abe66669 (patch) | |
tree | b2930fbf3c8e5f6bf2f5eb00f260b5b5092e09bb /src/smd/main.rs | |
parent | bc0fac1bf2a02c9a76c8c4b9eccc9235de4e86b2 (diff) | |
download | salaryman-78608add1c69a877b76a05147f6c26b7abe66669.tar.gz salaryman-78608add1c69a877b76a05147f6c26b7abe66669.tar.bz2 salaryman-78608add1c69a877b76a05147f6c26b7abe66669.zip |
add start, stop, restart endpoints
git-svn-id: svn+ssh://diminuette.aengel.lesbianunix.dev/salaryman/trunk@14 b9215c17-b818-4693-b096-d1e41a411fef
Diffstat (limited to 'src/smd/main.rs')
-rw-r--r-- | src/smd/main.rs | 60 |
1 files changed, 47 insertions, 13 deletions
diff --git a/src/smd/main.rs b/src/smd/main.rs index 628785a..b81df2f 100644 --- a/src/smd/main.rs +++ b/src/smd/main.rs @@ -2,16 +2,23 @@ mod context; mod endpoints; use clap::Parser; -use dropshot::{ApiDescription, ConfigLogging, ConfigLoggingLevel, ServerBuilder}; +use dropshot::{ApiDescription, ConfigDropshot, ConfigLogging, ConfigLoggingLevel, ServerBuilder}; use salaryman::service::{Service, ServiceConf}; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use tokio::{fs::read_to_string, sync::Mutex}; -use std::{net::IpAddr, path::PathBuf, sync::Arc}; +use std::{ + net::{IpAddr, SocketAddr}, + path::PathBuf, + sync::Arc, +}; -use crate::context::SalarymanDContext; -use crate::endpoints::{endpoint_get_config, endpoint_post_stdin}; +use crate::context::{SalarymanDContext, SalarymanService}; +use crate::endpoints::{ + endpoint_get_service, endpoint_get_services, endpoint_post_stdin, endpoint_restart_service, + endpoint_start_service, endpoint_stop_service, +}; #[derive(Parser, Debug)] #[command(version, about, long_about = None)] @@ -89,26 +96,53 @@ async fn load_config(file: &PathBuf) -> Result<Config, Box<dyn std::error::Error async fn main() -> Result<(), Box<dyn std::error::Error>> { let args = Args::parse(); let conf: Config = load_config(&args.config).await?; - let mut services: Vec<Arc<Mutex<Service>>> = Vec::new(); + let addr = if let Some(addr) = conf.address { + addr + } else { + args.address + }; + let port = if let Some(port) = conf.port { + port + } else { + args.port + }; + let bind = SocketAddr::new(addr, port); + let mut services: Vec<Arc<SalarymanService>> = Vec::new(); for i in 0..conf.service.len() { - services.push(Arc::new(Mutex::new(Service::from_conf(&conf.service[i])))); - if conf.service[i].autostart { - let mut lock = services[i].lock().await; + services.push(Arc::new(SalarymanService::from_parts( + conf.service[i].clone(), + Arc::new(Mutex::new(Service::from_conf(&conf.service[i]))), + ))); + } + for i in 0..services.len() { + if services[i].config.autostart { + let mut lock = services[i].service.lock().await; lock.start().await?; lock.scan_stdout().await?; lock.scan_stderr().await?; - drop(lock); } } let log_conf = ConfigLogging::StderrTerminal { level: ConfigLoggingLevel::Info, }; let log = log_conf.to_logger("smd")?; - let ctx = Arc::new(SalarymanDContext::from_parts(conf, services)); + let ctx = Arc::new(SalarymanDContext::from_vec(services)); + let config = ConfigDropshot { + bind_address: bind, + ..Default::default() + }; let mut api = ApiDescription::new(); - api.register(endpoint_get_config).unwrap(); - api.register(endpoint_post_stdin).unwrap(); - let server = ServerBuilder::new(api, ctx.clone(), log).start()?; + api.register(endpoint_get_services)?; + api.register(endpoint_get_service)?; + api.register(endpoint_start_service)?; + api.register(endpoint_stop_service)?; + api.register(endpoint_restart_service)?; + api.register(endpoint_post_stdin)?; + api.openapi("Salaryman", semver::Version::new(1, 0, 0)) + .write(&mut std::io::stdout())?; + let server = ServerBuilder::new(api, ctx.clone(), log) + .config(config) + .start()?; server.await?; Ok(()) } |