@@ -13,14 +13,15 @@ use defguard_gateway::{
1313 execute_command,
1414 gateway:: { Gateway , GatewayServer , TlsConfig , run_stats} ,
1515 init_syslog,
16+ logging:: init_tracing,
1617 server:: run_server,
1718 setup:: GatewaySetupServer ,
1819} ;
1920use defguard_version:: Version ;
2021#[ cfg( not( any( target_os = "macos" , target_os = "netbsd" ) ) ) ]
2122use defguard_wireguard_rs:: Kernel ;
2223use defguard_wireguard_rs:: { Userspace , WGApi } ;
23- use tokio:: task:: JoinSet ;
24+ use tokio:: { sync :: mpsc , task:: JoinSet } ;
2425
2526#[ tokio:: main]
2627async fn main ( ) -> Result < ( ) , GatewayError > {
@@ -35,15 +36,35 @@ async fn main() -> Result<(), GatewayError> {
3536 file. write_all ( pid. to_string ( ) . as_bytes ( ) ) ?;
3637 }
3738
39+ let cert_dir = & config. cert_dir ;
40+ if !cert_dir. exists ( ) {
41+ tokio:: fs:: create_dir_all ( cert_dir) . await ?;
42+ }
43+
44+ let ( grpc_cert, grpc_key) = (
45+ read_to_string ( cert_dir. join ( GRPC_CERT_NAME ) ) . ok ( ) ,
46+ read_to_string ( cert_dir. join ( GRPC_KEY_NAME ) ) . ok ( ) ,
47+ ) ;
48+
49+ let needs_setup = grpc_cert. is_none ( ) || grpc_key. is_none ( ) ;
50+
51+ // TODO: The channel size may need to be adjusted or some other approach should be used
52+ // to avoid dropping log messages.
53+ let ( logs_tx, logs_rx) = if needs_setup {
54+ let ( logs_tx, logs_rx) = mpsc:: channel ( 200 ) ;
55+ ( Some ( logs_tx) , Some ( logs_rx) )
56+ } else {
57+ ( None , None )
58+ } ;
59+
3860 // setup logging
3961 if config. use_syslog {
4062 if let Err ( error) = init_syslog ( & config, pid) {
4163 log:: error!( "Unable to initialize syslog. Is the syslog daemon running?" ) ;
4264 return Err ( error) ;
4365 }
4466 } else {
45- let version = Version :: parse ( VERSION ) ?;
46- defguard_version:: tracing:: init ( version, & config. log_level ) ?;
67+ init_tracing ( & Version :: parse ( VERSION ) ?, & config. log_level , logs_tx) ;
4768 }
4869
4970 if let Some ( pre_up) = & config. pre_up {
@@ -86,28 +107,19 @@ async fn main() -> Result<(), GatewayError> {
86107 let gateway = Arc :: new ( Mutex :: new ( gateway) ) ;
87108 tasks. spawn ( run_stats ( Arc :: clone ( & gateway) , config. stats_period ( ) ) ) ;
88109
89- let cert_dir = & config. cert_dir ;
90- if !cert_dir. exists ( ) {
91- tokio:: fs:: create_dir_all ( cert_dir) . await ?;
92- }
93- let tls_config = if let ( Some ( cert) , Some ( key) ) = (
94- read_to_string ( cert_dir. join ( GRPC_CERT_NAME ) ) . ok ( ) ,
95- read_to_string ( cert_dir. join ( GRPC_KEY_NAME ) ) . ok ( ) ,
96- ) {
97- log:: info!(
98- "Using existing gRPC TLS certificates from {}" ,
99- cert_dir. display( )
100- ) ;
101- TlsConfig {
102- grpc_cert_pem : cert,
103- grpc_key_pem : key,
104- }
105- } else {
110+ let tls_config = if needs_setup {
106111 log:: info!(
107112 "gRPC TLS certificates not found in {}. They will be generated during setup." ,
108113 cert_dir. display( )
109114 ) ;
110- let setup_server = GatewaySetupServer :: default ( ) ;
115+
116+ let Some ( logs_rx) = logs_rx else {
117+ return Err ( GatewayError :: SetupError (
118+ "Logs receiver channel is missing during gateway setup" . to_string ( ) ,
119+ ) ) ;
120+ } ;
121+
122+ let setup_server = GatewaySetupServer :: new ( Arc :: new ( tokio:: sync:: Mutex :: new ( logs_rx) ) ) ;
111123 let tls_config = setup_server. await_setup ( config. clone ( ) ) . await ?;
112124
113125 let cert_path = cert_dir. join ( GRPC_CERT_NAME ) ;
@@ -120,6 +132,19 @@ async fn main() -> Result<(), GatewayError> {
120132 ) ;
121133
122134 tls_config
135+ } else if let ( Some ( cert) , Some ( key) ) = ( grpc_cert, grpc_key) {
136+ log:: info!(
137+ "Using existing gRPC TLS certificates from {}" ,
138+ cert_dir. display( )
139+ ) ;
140+ TlsConfig {
141+ grpc_cert_pem : cert,
142+ grpc_key_pem : key,
143+ }
144+ } else {
145+ return Err ( GatewayError :: SetupError (
146+ "gRPC TLS certificates are missing after setup" . to_string ( ) ,
147+ ) ) ;
123148 } ;
124149
125150 // Launch gRPC server.
0 commit comments