@@ -17,13 +17,18 @@ use tokio::signal::unix::SignalKind;
1717use hyper:: server:: conn:: http1;
1818use hyper_util:: rt:: TokioIo ;
1919
20- use api:: auth:: { Authorizer , NoopAuthorizer } ;
20+ use log:: { error, info, warn} ;
21+
22+ use api:: auth:: Authorizer ;
23+ #[ cfg( noop_authorizer) ]
24+ use api:: auth:: NoopAuthorizer ;
2125use api:: kv_store:: KvStore ;
2226#[ cfg( feature = "jwt" ) ]
2327use auth_impls:: jwt:: JWTAuthorizer ;
2428#[ cfg( feature = "sigs" ) ]
2529use auth_impls:: signature:: SignatureValidatingAuthorizer ;
2630use impls:: postgres_store:: { PostgresPlaintextBackend , PostgresTlsBackend } ;
31+ use util:: logger:: ServerLogger ;
2732use vss_service:: VssService ;
2833
2934mod util;
@@ -38,19 +43,36 @@ fn main() {
3843 std:: process:: exit ( -1 ) ;
3944 } ) ;
4045
46+ let logger = match ServerLogger :: init ( config. log_level , & config. log_file ) {
47+ Ok ( logger) => logger,
48+ Err ( e) => {
49+ eprintln ! ( "Failed to initialize logger: {e}" ) ;
50+ std:: process:: exit ( -1 ) ;
51+ } ,
52+ } ;
53+
4154 let runtime = match tokio:: runtime:: Builder :: new_multi_thread ( ) . enable_all ( ) . build ( ) {
4255 Ok ( runtime) => Arc :: new ( runtime) ,
4356 Err ( e) => {
44- eprintln ! ( "Failed to setup tokio runtime: {}" , e) ;
57+ error ! ( "Failed to setup tokio runtime: {}" , e) ;
4558 std:: process:: exit ( -1 ) ;
4659 } ,
4760 } ;
4861
4962 runtime. block_on ( async {
63+ // Register SIGHUP handler for log rotation
64+ let mut sighup_stream = match tokio:: signal:: unix:: signal ( SignalKind :: hangup ( ) ) {
65+ Ok ( stream) => stream,
66+ Err ( e) => {
67+ error ! ( "Failed to register SIGHUP handler: {e}" ) ;
68+ std:: process:: exit ( -1 ) ;
69+ }
70+ } ;
71+
5072 let mut sigterm_stream = match tokio:: signal:: unix:: signal ( SignalKind :: terminate ( ) ) {
5173 Ok ( stream) => stream,
5274 Err ( e) => {
53- println ! ( "Failed to register for SIGTERM stream: {}" , e) ;
75+ error ! ( "Failed to register for SIGTERM stream: {}" , e) ;
5476 std:: process:: exit ( -1 ) ;
5577 } ,
5678 } ;
@@ -61,11 +83,11 @@ fn main() {
6183 if let Some ( rsa_pem) = config. rsa_pem {
6284 authorizer = match JWTAuthorizer :: new ( & rsa_pem) . await {
6385 Ok ( auth) => {
64- println ! ( "Configured JWT authorizer with RSA public key" ) ;
86+ info ! ( "Configured JWT authorizer with RSA public key" ) ;
6587 Some ( Arc :: new ( auth) )
6688 } ,
6789 Err ( e) => {
68- println ! ( "Failed to configure JWT authorizer: {}" , e) ;
90+ error ! ( "Failed to configure JWT authorizer: {}" , e) ;
6991 std:: process:: exit ( -1 ) ;
7092 } ,
7193 } ;
@@ -74,17 +96,25 @@ fn main() {
7496 #[ cfg( feature = "sigs" ) ]
7597 {
7698 if authorizer. is_none ( ) {
77- println ! ( "Configured signature-validating authorizer" ) ;
99+ info ! ( "Configured signature-validating authorizer" ) ;
78100 authorizer = Some ( Arc :: new ( SignatureValidatingAuthorizer ) ) ;
79101 }
80102 }
103+
104+ #[ cfg( noop_authorizer) ]
81105 let authorizer = if let Some ( auth) = authorizer {
82106 auth
83107 } else {
84- println ! ( "No authentication method configured, all storage with the same store id will be commingled." ) ;
108+ warn ! ( "No authentication method configured, all storage with the same store id will be commingled." ) ;
85109 Arc :: new ( NoopAuthorizer { } )
86110 } ;
87111
112+ #[ cfg( not( noop_authorizer) ) ]
113+ let authorizer = authorizer. unwrap_or_else ( || {
114+ error ! ( "No authentication method configured, please configure either `JWTAuthorizer` or `SignatureValidatingAuthorizer`" ) ;
115+ std:: process:: exit ( -1 ) ;
116+ } ) ;
117+
88118 let store: Arc < dyn KvStore > = if let Some ( crt_pem) = config. tls_config {
89119 let postgres_tls_backend = PostgresTlsBackend :: new (
90120 & config. postgresql_prefix ,
@@ -94,10 +124,10 @@ fn main() {
94124 )
95125 . await
96126 . unwrap_or_else ( |e| {
97- println ! ( "Failed to start postgres TLS backend: {}" , e) ;
127+ error ! ( "Failed to start postgres TLS backend: {}" , e) ;
98128 std:: process:: exit ( -1 ) ;
99129 } ) ;
100- println ! (
130+ info ! (
101131 "Connected to PostgreSQL TLS backend with DSN: {}/{}" ,
102132 config. postgresql_prefix, config. vss_db
103133 ) ;
@@ -110,21 +140,21 @@ fn main() {
110140 )
111141 . await
112142 . unwrap_or_else ( |e| {
113- println ! ( "Failed to start postgres plaintext backend: {}" , e) ;
143+ error ! ( "Failed to start postgres plaintext backend: {}" , e) ;
114144 std:: process:: exit ( -1 ) ;
115145 } ) ;
116- println ! (
146+ info ! (
117147 "Connected to PostgreSQL plaintext backend with DSN: {}/{}" ,
118148 config. postgresql_prefix, config. vss_db
119149 ) ;
120150 Arc :: new ( postgres_plaintext_backend)
121151 } ;
122152
123153 let rest_svc_listener = TcpListener :: bind ( & config. bind_address ) . await . unwrap_or_else ( |e| {
124- println ! ( "Failed to bind listening port: {}" , e) ;
154+ error ! ( "Failed to bind listening port: {}" , e) ;
125155 std:: process:: exit ( -1 ) ;
126156 } ) ;
127- println ! ( "Listening for incoming connections on {}{}" , config. bind_address, crate :: vss_service:: BASE_PATH_PREFIX ) ;
157+ info ! ( "Listening for incoming connections on {}{}" , config. bind_address, crate :: vss_service:: BASE_PATH_PREFIX ) ;
128158
129159 loop {
130160 tokio:: select! {
@@ -135,19 +165,24 @@ fn main() {
135165 let vss_service = VssService :: new( Arc :: clone( & store) , Arc :: clone( & authorizer) ) ;
136166 runtime. spawn( async move {
137167 if let Err ( err) = http1:: Builder :: new( ) . serve_connection( io_stream, vss_service) . await {
138- eprintln !( "Failed to serve connection: {}" , err) ;
168+ warn !( "Failed to serve connection: {}" , err) ;
139169 }
140170 } ) ;
141171 } ,
142- Err ( e) => eprintln !( "Failed to accept connection: {}" , e) ,
172+ Err ( e) => warn !( "Failed to accept connection: {}" , e) ,
143173 }
144174 }
145175 _ = tokio:: signal:: ctrl_c( ) => {
146- println !( "Received CTRL-C, shutting down.." ) ;
176+ info !( "Received CTRL-C, shutting down.." ) ;
147177 break ;
148178 }
179+ _ = sighup_stream. recv( ) => {
180+ if let Err ( e) = logger. reopen( ) {
181+ error!( "Failed to reopen log file on SIGHUP: {e}" ) ;
182+ }
183+ }
149184 _ = sigterm_stream. recv( ) => {
150- println !( "Received SIGTERM, shutting down.." ) ;
185+ info !( "Received SIGTERM, shutting down.." ) ;
151186 break ;
152187 }
153188 }
0 commit comments