@@ -31,6 +31,7 @@ use nix::unistd::getpid;
3131
3232use librain:: { server, worker, VERSION } ;
3333use librain:: errors:: Result ;
34+ use librain:: client:: client:: Client ;
3435
3536const DEFAULT_SERVER_PORT : u16 = 7210 ;
3637const DEFAULT_WORKER_PORT : u16 = 0 ;
@@ -162,6 +163,22 @@ impl WorkerConfig {
162163 }
163164}
164165
166+ fn resolve_server_address ( address : & str ) -> SocketAddr {
167+ match address. to_socket_addrs ( ) {
168+ Err ( _) => {
169+ error ! ( "Cannot resolve server address" ) ;
170+ exit ( 1 ) ;
171+ }
172+ Ok ( mut addrs) => match addrs. next ( ) {
173+ None => {
174+ error ! ( "Cannot resolve server address" ) ;
175+ exit ( 1 ) ;
176+ }
177+ Some ( ref addr) => * addr,
178+ } ,
179+ }
180+ }
181+
165182fn run_worker ( _global_args : & ArgMatches , cmd_args : & ArgMatches ) {
166183 info ! ( "Starting Rain {} worker" , VERSION ) ;
167184 let ready_file = cmd_args. value_of ( "READY_FILE" ) ;
@@ -173,19 +190,7 @@ fn run_worker(_global_args: &ArgMatches, cmd_args: &ArgMatches) {
173190 server_address = format ! ( "{}:{}" , server_address, DEFAULT_SERVER_PORT ) ;
174191 }
175192
176- let server_addr = match server_address. to_socket_addrs ( ) {
177- Err ( _) => {
178- error ! ( "Cannot resolve server address: " ) ;
179- exit ( 1 ) ;
180- }
181- Ok ( mut addrs) => match addrs. next ( ) {
182- None => {
183- error ! ( "Cannot resolve server address" ) ;
184- exit ( 1 ) ;
185- }
186- Some ( ref addr) => * addr,
187- } ,
188- } ;
193+ let server_addr = resolve_server_address ( & server_address) ;
189194
190195 let state = {
191196 let config = cmd_args. value_of ( "WORKER_CONFIG" ) . map ( |path| {
@@ -385,6 +390,30 @@ fn run_starter(_global_args: &ArgMatches, cmd_args: &ArgMatches) {
385390 }
386391}
387392
393+ fn stop_server ( _global_args : & ArgMatches , cmd_args : & ArgMatches ) {
394+ let default_address = format ! ( "localhost:{}" , DEFAULT_SERVER_PORT ) ;
395+ let mut address = cmd_args
396+ . value_of ( "SERVER_ADDRESS" )
397+ . unwrap_or ( & default_address)
398+ . to_string ( ) ;
399+
400+ if !address. contains ( ':' ) {
401+ address = format ! ( "{}:{}" , address, DEFAULT_SERVER_PORT ) ;
402+ }
403+
404+ let scheduler: SocketAddr = resolve_server_address ( & address) ;
405+ let mut client = Client :: new ( & scheduler) . unwrap_or_else ( |err| {
406+ error ! ( "Couldn't connect to server at {}: {}" , address, err) ;
407+ exit ( 1 ) ;
408+ } ) ;
409+ client. terminate_server ( ) . unwrap_or_else ( |err| {
410+ error ! ( "Couldn't stop server: {}" , err) ;
411+ exit ( 1 ) ;
412+ } ) ;
413+
414+ println ! ( "Server at {} was successfully stopped" , address) ;
415+ }
416+
388417fn init_log ( ) {
389418 // T emporary simple logger for better module log control, default level is INFO
390419 // TODO: replace with Fern or log4rs later
@@ -543,15 +572,22 @@ fn main() {
543572 . long ( "--logdir" )
544573 . help ( "Logging directory for workers & server (default /tmp/rain-logs/run-$HOSTANE-$PID)" )
545574 . takes_value ( true ) ) )
575+ . subcommand ( // ---- STOP ----
576+ SubCommand :: with_name ( "stop" )
577+ . about ( "Stop server and all workers connected to it" )
578+ . arg ( Arg :: with_name ( "SERVER_ADDRESS" )
579+ . help ( "Address of the server (default = localhost:7210)" )
580+ . takes_value ( true ) ) )
546581 . get_matches ( ) ;
547582
548583 match args. subcommand ( ) {
549584 ( "server" , Some ( cmd_args) ) => run_server ( & args, cmd_args) ,
550585 ( "worker" , Some ( cmd_args) ) => run_worker ( & args, cmd_args) ,
551586 ( "start" , Some ( cmd_args) ) => run_starter ( & args, cmd_args) ,
587+ ( "stop" , Some ( cmd_args) ) => stop_server ( & args, cmd_args) ,
552588 _ => {
553589 error ! ( "No subcommand provided." ) ;
554- :: std :: process :: exit ( 1 ) ;
590+ exit ( 1 ) ;
555591 }
556592 }
557593}
0 commit comments