33
44//! Supervisor host shared by the sandboxes of one gateway.
55
6- use clap:: Parser ;
76use miette:: Result ;
8- use std:: net:: SocketAddr ;
9- use std:: path:: PathBuf ;
107
11- #[ derive( Debug , Parser ) ]
12- #[ command( name = "openshell-supervisor experimental-host" ) ]
13- #[ command( about = "Supervise the sandboxes a gateway registers with this process" ) ]
14- struct Args {
15- /// Gateway gRPC endpoint; each session authenticates with its own credentials.
16- #[ arg( long, env = openshell_core:: sandbox_env:: ENDPOINT ) ]
17- openshell_endpoint : String ,
18-
19- /// Mutually authenticated session-control listener used by the gateway.
20- /// Kubernetes TCP probes connect to it without completing TLS.
21- #[ arg( long) ]
22- session_control_listen : SocketAddr ,
23-
24- /// Directory with the session-control `tls.crt`, `tls.key`, and client `ca.crt`.
25- #[ arg( long) ]
26- session_control_tls_dir : PathBuf ,
27-
28- /// Listener for routed runtime-initiated Sandbox Protocol connections.
29- #[ arg( long) ]
30- runtime_listen : SocketAddr ,
31-
32- /// Private directory for per-session files.
33- #[ arg( long) ]
34- session_root : PathBuf ,
35-
36- #[ arg( long, default_value = "warn" , env = openshell_core:: sandbox_env:: LOG_LEVEL ) ]
37- log_level : String ,
38- }
39-
40- pub fn run ( raw_args : & [ String ] ) -> Result < ( ) > {
41- let args = Args :: parse_from ( raw_args) ;
8+ pub fn run ( args : crate :: Args ) -> Result < ( ) > {
429 run_platform ( args)
4310}
4411
4512#[ cfg( unix) ]
46- fn run_platform ( args : Args ) -> Result < ( ) > {
13+ fn run_platform ( args : crate :: Args ) -> Result < ( ) > {
4714 use miette:: { IntoDiagnostic as _, WrapErr as _} ;
4815 use std:: sync:: Arc ;
4916 use std:: sync:: atomic:: AtomicBool ;
5017 use tracing_subscriber:: { Layer as _, layer:: SubscriberExt as _, util:: SubscriberInitExt as _} ;
5118
19+ let address = args
20+ . address
21+ . ok_or_else ( || miette:: miette!( "--address is required for --mode=shared" ) ) ?;
22+ let gateway_endpoint = args
23+ . gateway_endpoint
24+ . ok_or_else ( || miette:: miette!( "--gateway-endpoint is required for --mode=shared" ) ) ?;
25+ let session_control_tls_dir = args. session_control_tls_dir . ok_or_else ( || {
26+ miette:: miette!( "--session-control-tls-dir is required for --mode=shared" )
27+ } ) ?;
28+ let runtime_listen = args
29+ . runtime_listen
30+ . ok_or_else ( || miette:: miette!( "--runtime-listen is required for --mode=shared" ) ) ?;
31+ let session_root = args
32+ . session_root
33+ . ok_or_else ( || miette:: miette!( "--session-root is required for --mode=shared" ) ) ?;
5234 let runtime = tokio:: runtime:: Builder :: new_multi_thread ( )
5335 . enable_all ( )
5436 . build ( )
@@ -87,7 +69,7 @@ fn run_platform(args: Args) -> Result<()> {
8769 tokio:: signal:: unix:: signal ( tokio:: signal:: unix:: SignalKind :: interrupt ( ) )
8870 . into_diagnostic ( ) ?;
8971 let tls_file = |name : & str | {
90- let path = args . session_control_tls_dir . join ( name) ;
72+ let path = session_control_tls_dir. join ( name) ;
9173 std:: fs:: read ( & path)
9274 . into_diagnostic ( )
9375 . wrap_err_with ( || format ! ( "read session-control TLS file {}" , path. display( ) ) )
@@ -100,19 +82,19 @@ fn run_platform(args: Args) -> Result<()> {
10082 . map_err ( |error| miette:: miette!( "{error}" ) ) ?;
10183 let host = openshell_supervisor:: shared_host:: SharedHost :: start (
10284 openshell_supervisor:: shared_host:: SharedHostConfig {
103- gateway_endpoint : args . openshell_endpoint . clone ( ) ,
104- session_root : args . session_root . clone ( ) ,
105- runtime_listen : args . runtime_listen ,
85+ gateway_endpoint,
86+ session_root,
87+ runtime_listen,
10688 removal_grace : openshell_sandbox_backend:: session_control:: SESSION_REMOVAL_GRACE ,
10789 } ,
10890 ) ?;
109- let control = tokio:: net:: TcpListener :: bind ( args . session_control_listen )
91+ let control = tokio:: net:: TcpListener :: bind ( address )
11092 . await
11193 . into_diagnostic ( )
11294 . wrap_err ( "bind session-control listener" ) ?;
11395 tracing:: info!(
11496 runtime = %host. runtime_addr( ) ,
115- control = %args . session_control_listen ,
97+ control = %address ,
11698 "Shared supervisor ready for sessions"
11799 ) ;
118100 let ( stop, stopped) = tokio:: sync:: watch:: channel ( false ) ;
@@ -138,6 +120,6 @@ fn run_platform(args: Args) -> Result<()> {
138120}
139121
140122#[ cfg( not( unix) ) ]
141- fn run_platform ( _args : Args ) -> Result < ( ) > {
142- Err ( miette:: miette!( "experimental-host requires Unix" ) )
123+ fn run_platform ( _args : crate :: Args ) -> Result < ( ) > {
124+ Err ( miette:: miette!( "--mode=shared requires Unix" ) )
143125}
0 commit comments