@@ -21,7 +21,7 @@ use tokio::{
21
21
22
22
use super :: {
23
23
args:: {
24
- AuthProvider , CliCore , CommandShellArgs , ExistingTunnelArgs , TunnelForwardArgs ,
24
+ AuthProvider , CliCore , CommandShellArgs , ExistingTunnelArgs , TunnelArgs , TunnelForwardArgs ,
25
25
TunnelRenameArgs , TunnelServeArgs , TunnelServiceSubCommands , TunnelUserSubCommands ,
26
26
} ,
27
27
CommandContext ,
@@ -104,12 +104,16 @@ fn fulfill_existing_tunnel_args(
104
104
}
105
105
106
106
struct TunnelServiceContainer {
107
- args : CliCore ,
107
+ core_args : CliCore ,
108
+ tunnel_args : TunnelArgs ,
108
109
}
109
110
110
111
impl TunnelServiceContainer {
111
- fn new ( args : CliCore ) -> Self {
112
- Self { args }
112
+ fn new ( core_args : CliCore , tunnel_args : TunnelArgs ) -> Self {
113
+ Self {
114
+ core_args,
115
+ tunnel_args,
116
+ }
113
117
}
114
118
}
115
119
@@ -120,7 +124,8 @@ impl ServiceContainer for TunnelServiceContainer {
120
124
log : log:: Logger ,
121
125
launcher_paths : LauncherPaths ,
122
126
) -> Result < ( ) , AnyError > {
123
- let csa = ( & self . args ) . into ( ) ;
127
+ let mut csa = ( & self . core_args ) . into ( ) ;
128
+ self . tunnel_args . serve_args . server_args . apply_to ( & mut csa) ;
124
129
serve_with_csa (
125
130
launcher_paths,
126
131
log,
@@ -242,8 +247,27 @@ async fn is_port_available(host: IpAddr, port: u16) -> bool {
242
247
. is_ok ( )
243
248
}
244
249
250
+ fn make_service_args < ' a : ' c , ' b : ' c , ' c > (
251
+ root_path : & ' a str ,
252
+ tunnel_args : & ' b TunnelArgs ,
253
+ ) -> Vec < & ' c str > {
254
+ let mut args = [ "--verbose" , "--cli-data-dir" , root_path, "tunnel" ] . to_vec ( ) ;
255
+
256
+ if let Some ( d) = tunnel_args. serve_args . server_args . extensions_dir . as_ref ( ) {
257
+ args. extend_from_slice ( & [ "--extensions-dir" , d] ) ;
258
+ }
259
+ if let Some ( d) = tunnel_args. serve_args . server_args . server_data_dir . as_ref ( ) {
260
+ args. extend_from_slice ( & [ "--server-data-dir" , d] ) ;
261
+ }
262
+
263
+ args. extend_from_slice ( & [ "service" , "internal-run" ] ) ;
264
+
265
+ args
266
+ }
267
+
245
268
pub async fn service (
246
269
ctx : CommandContext ,
270
+ tunnel_args : TunnelArgs ,
247
271
service_args : TunnelServiceSubCommands ,
248
272
) -> Result < i32 , AnyError > {
249
273
let manager = create_service_manager ( ctx. log . clone ( ) , & ctx. paths ) ;
@@ -265,20 +289,10 @@ pub async fn service(
265
289
legal:: require_consent ( & ctx. paths , args. accept_server_license_terms ) ?;
266
290
267
291
let current_exe = canonical_exe ( ) . map_err ( |e| wrap ( e, "could not get current exe" ) ) ?;
292
+ let root_path = ctx. paths . root ( ) . as_os_str ( ) . to_string_lossy ( ) ;
293
+ let args = make_service_args ( & root_path, & tunnel_args) ;
268
294
269
- manager
270
- . register (
271
- current_exe,
272
- & [
273
- "--verbose" ,
274
- "--cli-data-dir" ,
275
- ctx. paths . root ( ) . as_os_str ( ) . to_string_lossy ( ) . as_ref ( ) ,
276
- "tunnel" ,
277
- "service" ,
278
- "internal-run" ,
279
- ] ,
280
- )
281
- . await ?;
295
+ manager. register ( current_exe, & args) . await ?;
282
296
ctx. log . result ( format ! ( "Service successfully installed! You can use `{APPLICATION_NAME} tunnel service log` to monitor it, and `{APPLICATION_NAME} tunnel service uninstall` to remove it." ) ) ;
283
297
}
284
298
TunnelServiceSubCommands :: Uninstall => {
@@ -289,7 +303,10 @@ pub async fn service(
289
303
}
290
304
TunnelServiceSubCommands :: InternalRun => {
291
305
manager
292
- . run ( ctx. paths . clone ( ) , TunnelServiceContainer :: new ( ctx. args ) )
306
+ . run (
307
+ ctx. paths . clone ( ) ,
308
+ TunnelServiceContainer :: new ( ctx. args , tunnel_args) ,
309
+ )
293
310
. await ?;
294
311
}
295
312
}
0 commit comments