about summary refs log tree commit diff stats
path: root/src/smd/main.rs
diff options
context:
space:
mode:
authoryuzu <yuzu@b9215c17-b818-4693-b096-d1e41a411fef>2025-07-12 06:17:38 +0000
committeryuzu <yuzu@b9215c17-b818-4693-b096-d1e41a411fef>2025-07-12 06:17:38 +0000
commit78608add1c69a877b76a05147f6c26b7abe66669 (patch)
treeb2930fbf3c8e5f6bf2f5eb00f260b5b5092e09bb /src/smd/main.rs
parentbc0fac1bf2a02c9a76c8c4b9eccc9235de4e86b2 (diff)
downloadsalaryman-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.rs60
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(())
 }