diff --git a/01_phase_rust_src/sv-rustit/src/executor/sent_signal.rs b/01_phase_rust_src/sv-rustit/src/executor/sent_signal.rs index f3e4316..07e90a8 100644 --- a/01_phase_rust_src/sv-rustit/src/executor/sent_signal.rs +++ b/01_phase_rust_src/sv-rustit/src/executor/sent_signal.rs @@ -1,41 +1,86 @@ +mod misc; use crate::status_obj; +use std::thread::sleep; +use std::time::Duration; + pub fn sent_signal( svwait_var: i32, verbose: i8, command: &str, mut sv: status_obj::StatusObj) -> i32 { // Return 0 in case everything worked fine, return 1 if timeout or error. dbg!(svwait_var); dbg!(verbose); + + let mut time_wait = 0; // execute command. if command == "s" { // case command is status - let mut status_sv = sv.get_status_string(); - let is_log = sv.get_log(); - if is_log { - let log_option = sv.get_obj_log(); - match log_option { - Some(mut log) => { - status_sv = status_sv + "; " + &log.get_status_string(); - }, - None => {// TODO: Do nothing for now, eventually, increase by one exit code. - }, - }; - } - println!("{}", status_sv); - return 0; + return misc::print_status(sv); } if command == "u" { // case where command is up if sv.sent_signal(b"u") { - return 0; + if verbose == 1 { + loop { + // TODO, Make a method update_sv + let sv_option = status_obj::StatusObj::new(sv.get_path(), sv.get_name()); + let mut sv_new = match sv_option { + Some(service) => service, + None => return 1, + }; + if sv_new.is_up() == true { + misc::print_status(sv_new); + return 0 + } + if time_wait >= svwait_var { + println!("fail: {}: timeout", sv_new.get_name()); + return 1 + } + + time_wait += 1; + sleep(Duration::from_secs(1)); + } + } else { + return 0; + } } else { return 1; } } + if command == "d" { + // case where command is up + if sv.sent_signal(b"d") { + if verbose == 1 { + loop { + // TODO: Use the update_service method instead of creating another sv. + let sv_option = status_obj::StatusObj::new(sv.get_path(), sv.get_name()); + let mut sv_new = match sv_option { + Some(service) => service, + None => return 1, + }; + if sv_new.is_up() == false { + misc::print_status(sv_new); + return 0 + } + if time_wait >= svwait_var { + println!("fail: {}: timeout", sv_new.get_name()); + return 1 + } + + time_wait += 1; + sleep(Duration::from_secs(1)); + } + } else { + return 0; + } + } else { + return 1; + } + } // TODO diff --git a/01_phase_rust_src/sv-rustit/src/executor/sent_signal/misc.rs b/01_phase_rust_src/sv-rustit/src/executor/sent_signal/misc.rs new file mode 100644 index 0000000..7a8e2a5 --- /dev/null +++ b/01_phase_rust_src/sv-rustit/src/executor/sent_signal/misc.rs @@ -0,0 +1,21 @@ + +use crate::status_obj; + +pub fn print_status(mut sv: status_obj::StatusObj) -> i32 { + // The status code is the one who will be + let mut status_sv = sv.get_status_string(); + let is_log = sv.get_log(); + if is_log { + let log_option = sv.get_obj_log(); + match log_option { + Some(mut log) => { + status_sv = status_sv + "; " + &log.get_status_string(); + }, + None => { + return 1 + }, + }; + } + println!("{}", status_sv); + return 0; +} diff --git a/01_phase_rust_src/sv-rustit/src/status_obj.rs b/01_phase_rust_src/sv-rustit/src/status_obj.rs index 225319f..fb7b0f8 100644 --- a/01_phase_rust_src/sv-rustit/src/status_obj.rs +++ b/01_phase_rust_src/sv-rustit/src/status_obj.rs @@ -8,6 +8,7 @@ use std::io::prelude::*; use std::time::SystemTime; +#[derive(Debug)] pub struct StatusObj { svname: String, // Service name svpath: String, // Service path @@ -177,6 +178,18 @@ impl StatusObj { return misc::sent_signal(signal); } + pub fn is_up(&mut self) -> bool { + return self.run_finish; + } + + pub fn get_name(&mut self) -> String { + return self.svname.clone(); + } + + pub fn get_path(&mut self) -> String { + return self.svpath.clone(); + } + pub fn get_log(&mut self) -> bool { return self.log; }