@@ -16,44 +16,59 @@ use clp_rust_utils::{clp_config::package, serde::yaml};
1616use futures:: { Stream , StreamExt } ;
1717use thiserror:: Error ;
1818use tracing_appender:: rolling:: { RollingFileAppender , Rotation } ;
19- use tracing_subscriber:: { self } ;
19+ use tracing_subscriber:: { self , fmt :: writer :: Tee } ;
2020
2121#[ derive( Parser ) ]
2222#[ command( version, about = "API Server for CLP." ) ]
23- struct Args { }
23+ struct Args {
24+ #[ arg( long) ]
25+ config : String ,
26+
27+ #[ arg( long) ]
28+ host : Option < String > ,
29+
30+ #[ arg( long) ]
31+ port : Option < u16 > ,
32+ }
2433
2534#[ tokio:: main]
2635async fn main ( ) -> anyhow:: Result < ( ) > {
27- let _ = Args :: parse ( ) ;
28- let home = std:: env:: var ( "CLP_HOME" ) . context ( "Expect `CLP_HOME` env variable" ) ?;
29- let home = std:: path:: Path :: new ( & home) ;
36+ let args = Args :: parse ( ) ;
3037
31- let config_path = home . join ( package :: DEFAULT_CONFIG_FILE_PATH ) ;
32- let config: package:: config:: Config = yaml:: from_path ( & config_path) . context ( format ! (
38+ let config_path = std :: path :: Path :: new ( args . config . as_str ( ) ) ;
39+ let config: package:: config:: Config = yaml:: from_path ( config_path) . context ( format ! (
3340 "Config file {} does not exist" ,
3441 config_path. display( )
3542 ) ) ?;
3643
37- let file_appender = RollingFileAppender :: new (
38- Rotation :: HOURLY ,
39- home . join ( & config . logs_directory ) . join ( "api_server" ) ,
40- "api_server.log" ,
41- ) ;
44+ let logs_directory =
45+ std :: env :: var ( "CLP_LOGS_DIR" ) . context ( "Expect `CLP_LOGS_DIR` environment variable." ) ? ;
46+ let logs_directory = std :: path :: Path :: new ( logs_directory. as_str ( ) ) ;
47+ let file_appender =
48+ RollingFileAppender :: new ( Rotation :: HOURLY , logs_directory , "api_server.log" ) ;
4249 let ( non_blocking_writer, _guard) = tracing_appender:: non_blocking ( file_appender) ;
4350 tracing_subscriber:: fmt ( )
4451 . with_env_filter ( tracing_subscriber:: EnvFilter :: from_default_env ( ) )
4552 . with_ansi ( false )
46- . with_writer ( non_blocking_writer)
53+ . with_writer ( Tee :: new ( std :: io :: stdout , non_blocking_writer) )
4754 . init ( ) ;
4855
49- let credentials_path = home. join ( package:: DEFAULT_CREDENTIALS_FILE_PATH ) ;
50- let credentials: package:: credentials:: Credentials = yaml:: from_path ( & credentials_path)
51- . context ( format ! (
52- "Credentials file {} does not exist" ,
53- credentials_path. display( )
54- ) ) ?;
55-
56- let addr = format ! ( "{}:{}" , & config. api_server. host, & config. api_server. port) ;
56+ let credentials = package:: credentials:: Credentials {
57+ database : package:: credentials:: Database {
58+ password : secrecy:: SecretString :: new (
59+ std:: env:: var ( "CLP_DB_PASS" )
60+ . context ( "Expect `CLP_DB_PASS` env variable" ) ?
61+ . into_boxed_str ( ) ,
62+ ) ,
63+ user : std:: env:: var ( "CLP_DB_USER" ) . context ( "Expect `CLP_DB_USER` env variable" ) ?,
64+ } ,
65+ } ;
66+
67+ let addr = format ! (
68+ "{}:{}" ,
69+ args. host. unwrap_or_else( || config. api_server. host. clone( ) ) ,
70+ args. port. unwrap_or( config. api_server. port)
71+ ) ;
5772 let listener = tokio:: net:: TcpListener :: bind ( & addr)
5873 . await
5974 . context ( format ! ( "Cannot listen to {addr}" ) ) ?;
@@ -72,9 +87,15 @@ async fn main() -> anyhow::Result<()> {
7287 tracing:: info!( "Server started at {addr}" ) ;
7388 axum:: serve ( listener, app)
7489 . with_graceful_shutdown ( async {
75- tokio:: signal:: ctrl_c ( )
76- . await
77- . expect ( "failed to listen for event" ) ;
90+ let mut sigterm =
91+ tokio:: signal:: unix:: signal ( tokio:: signal:: unix:: SignalKind :: terminate ( ) )
92+ . expect ( "failed to listen for SIGTERM" ) ;
93+ tokio:: select! {
94+ _ = sigterm. recv( ) => {
95+ }
96+ _ = tokio:: signal:: ctrl_c( ) => {
97+ }
98+ }
7899 } )
79100 . await ?;
80101 Ok ( ( ) )
0 commit comments