From 486820f0961ccc8498f49d164349fab4c8e57216 Mon Sep 17 00:00:00 2001 From: primardj Date: Sun, 14 Apr 2024 20:41:30 +0100 Subject: [PATCH 01/13] add execution of the check script when it is, and some code optimisations. --- .../sv-rustit/src/executor/sent_signal.rs | 11 +++---- 01_phase_rust_src/sv-rustit/src/status_obj.rs | 8 +++++ .../sv-rustit/src/status_obj/misc.rs | 32 +++++++++++++++++++ 3 files changed, 44 insertions(+), 7 deletions(-) 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 9955f42..761ae3d 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 @@ -31,7 +31,7 @@ pub fn sent_signal( svwait_var: i32, verbose: i8, command: &str, mut sv: status_ return 0 } if time_wait >= svwait_var { - println!("fail: {}: timeout", sv.get_name()); + println!("timeout: {}", sv.get_status_string()); return 1 } @@ -60,7 +60,7 @@ pub fn sent_signal( svwait_var: i32, verbose: i8, command: &str, mut sv: status_ return 0 } if time_wait >= svwait_var { - println!("fail: {}: timeout", sv.get_name()); + println!("timeout: {}", sv.get_status_string()); return 1 } @@ -75,11 +75,8 @@ pub fn sent_signal( svwait_var: i32, verbose: i8, command: &str, mut sv: status_ } } - - // TODO - // sent the proper signal to supervise/control - // - // if verbose = 1, wait for the service to reach the proper state or timeout. println!("Error, command not implemented."); return 1; } + + 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 10a26b3..777d261 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 @@ -230,6 +231,13 @@ impl StatusObj { } pub fn is_up(&mut self) -> bool { + let check = fs::File::open("check"); + match check { + Ok(file) => { + return misc::test_check(file, self.run_finish) + }, + Err(..) => {}, + }; return self.run_finish; } diff --git a/01_phase_rust_src/sv-rustit/src/status_obj/misc.rs b/01_phase_rust_src/sv-rustit/src/status_obj/misc.rs index 731d92f..b53feb2 100644 --- a/01_phase_rust_src/sv-rustit/src/status_obj/misc.rs +++ b/01_phase_rust_src/sv-rustit/src/status_obj/misc.rs @@ -3,6 +3,10 @@ use tokio::net::unix::pipe; use tokio::runtime::Runtime; use std::io::ErrorKind; +use std::fs::File; +use std::process::Command; +use std::os::unix::fs::PermissionsExt; + pub fn make_pause_run(pr_int: u8) -> bool { if pr_int == 0 { return false // run @@ -131,3 +135,31 @@ pub fn sent_signal(signal: &[u8]) -> bool { }, }; } + +pub fn test_check(file: File, run_finish: bool) -> bool { + // Check the permission, and return the result of check + let meta = file.metadata(); + match meta { + Ok(m) => { + let permissions = m.permissions(); + //println!("permissions: {:o}", permissions.mode() & 0o100700); + if permissions.mode() & 0o100700 == 0o100700 { + // Execute script + let mut command = Command::new("sh"); + let status = command.arg("check").status(); + match status { + Ok(s) => { + if s.success() { + return true + } else { + return false + } + }, + Err(..) => {} + }; + } + }, + Err(..) => {}, + }; + return run_finish; +} -- 2.45.2 From cb96b16438264ca860df0d64f6a2593d322483ad Mon Sep 17 00:00:00 2001 From: primardj Date: Sun, 14 Apr 2024 21:20:47 +0100 Subject: [PATCH 02/13] split status_obj/misc.rs into three files. --- 01_phase_rust_src/sv-rustit/src/status_obj.rs | 14 +-- .../sv-rustit/src/status_obj/check_test.rs | 33 +++++++ .../sv-rustit/src/status_obj/misc.rs | 90 ------------------- .../sv-rustit/src/status_obj/sent_signal.rs | 62 +++++++++++++ 4 files changed, 102 insertions(+), 97 deletions(-) create mode 100644 01_phase_rust_src/sv-rustit/src/status_obj/check_test.rs create mode 100644 01_phase_rust_src/sv-rustit/src/status_obj/sent_signal.rs 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 777d261..e34b7f5 100644 --- a/01_phase_rust_src/sv-rustit/src/status_obj.rs +++ b/01_phase_rust_src/sv-rustit/src/status_obj.rs @@ -1,5 +1,7 @@ mod misc; +mod sent_signal; +mod check_test; use std::path::Path; use std::env::set_current_dir; @@ -8,7 +10,6 @@ use std::io::prelude::*; use std::time::SystemTime; - #[derive(Debug)] pub struct StatusObj { svname: String, // Service name @@ -38,11 +39,11 @@ impl StatusObj { } // Check if supervise/control and supervise/ok exists, and if runsv running. - let control_exists = misc::check_fifo(sv.clone(), "supervise/ok"); + let control_exists = sent_signal::check_fifo(sv.clone(), "supervise/ok"); if control_exists == false { return None; } - let control_exists = misc::check_fifo(sv.clone(), "supervise/control"); + let control_exists = sent_signal::check_fifo(sv.clone(), "supervise/control"); if control_exists == false { return None; } @@ -227,18 +228,17 @@ impl StatusObj { } pub fn sent_signal(&mut self, signal: &[u8]) -> bool { - return misc::sent_signal(signal); + return sent_signal::sent_signal(signal); } pub fn is_up(&mut self) -> bool { let check = fs::File::open("check"); match check { Ok(file) => { - return misc::test_check(file, self.run_finish) + return check_test::check_test(file, self.run_finish) }, - Err(..) => {}, + Err(..) => return self.run_finish, }; - return self.run_finish; } pub fn get_name(&mut self) -> String { diff --git a/01_phase_rust_src/sv-rustit/src/status_obj/check_test.rs b/01_phase_rust_src/sv-rustit/src/status_obj/check_test.rs new file mode 100644 index 0000000..1bddbd6 --- /dev/null +++ b/01_phase_rust_src/sv-rustit/src/status_obj/check_test.rs @@ -0,0 +1,33 @@ + +use std::fs::File; +use std::process::Command; +use std::os::unix::fs::PermissionsExt; + + +pub fn check_test(file: File, run_finish: bool) -> bool { + // Check the permission, and return the result of check + let meta = file.metadata(); + match meta { + Ok(m) => { + let permissions = m.permissions(); + //println!("permissions: {:o}", permissions.mode() & 0o100700); + if permissions.mode() & 0o100700 == 0o100700 { + // Execute script + let mut command = Command::new("sh"); + let status = command.arg("check").status(); + match status { + Ok(s) => { + if s.success() { + return true + } else { + return false + } + }, + Err(..) => {} + }; + } + }, + Err(..) => {}, + }; + return run_finish; +} diff --git a/01_phase_rust_src/sv-rustit/src/status_obj/misc.rs b/01_phase_rust_src/sv-rustit/src/status_obj/misc.rs index b53feb2..45a20ba 100644 --- a/01_phase_rust_src/sv-rustit/src/status_obj/misc.rs +++ b/01_phase_rust_src/sv-rustit/src/status_obj/misc.rs @@ -1,11 +1,4 @@ -use tokio::net::unix::pipe; -use tokio::runtime::Runtime; -use std::io::ErrorKind; - -use std::fs::File; -use std::process::Command; -use std::os::unix::fs::PermissionsExt; pub fn make_pause_run(pr_int: u8) -> bool { if pr_int == 0 { @@ -80,86 +73,3 @@ pub fn return_u8_in_u64(table: Vec) -> u64 { return r } -pub fn check_fifo(sv: String, path: &str) -> bool { - // Check if fifo is available. If yes, return true. - // If no, return false. - let rt = Runtime::new().unwrap(); - let _guard = rt.enter(); - - let sender = pipe::OpenOptions::new().open_sender(path); - match sender { - Ok(..) => return true, - Err(e) if e.raw_os_error() == Some(libc::ENXIO) => { - println!("fail: {sv}: runsv not running"); - return false; - }, - Err(..) => { - println!("warning: {sv}: unable to open {path}: file does not exist"); - return false; - }, - }; -} - -pub fn sent_signal(signal: &[u8]) -> bool { - // sent the char to supervise/control. - // return true in case everything worked fine, false if there was any errors. - let rt = Runtime::new().unwrap(); - let _guard = rt.enter(); - - let sender = pipe::OpenOptions::new().open_sender("supervise/control"); - match sender { - Ok(tx) => { - loop { - match tx.try_write(signal) { - Ok(..) => { - return true; - }, - Err(e) if e.kind() == ErrorKind::WouldBlock => { - continue; - }, - Err(e) => { - dbg!(e); - println!("Impossible Error while writing on pipe."); - return false; - }, - }; - }; - }, - Err(e) if e.raw_os_error() == Some(libc::ENXIO) => { - println!("fail: sv: runsv not running"); - return false; - }, - Err(..) => { - println!("warning: sv: unable to open path: file does not exist"); - return false; - }, - }; -} - -pub fn test_check(file: File, run_finish: bool) -> bool { - // Check the permission, and return the result of check - let meta = file.metadata(); - match meta { - Ok(m) => { - let permissions = m.permissions(); - //println!("permissions: {:o}", permissions.mode() & 0o100700); - if permissions.mode() & 0o100700 == 0o100700 { - // Execute script - let mut command = Command::new("sh"); - let status = command.arg("check").status(); - match status { - Ok(s) => { - if s.success() { - return true - } else { - return false - } - }, - Err(..) => {} - }; - } - }, - Err(..) => {}, - }; - return run_finish; -} diff --git a/01_phase_rust_src/sv-rustit/src/status_obj/sent_signal.rs b/01_phase_rust_src/sv-rustit/src/status_obj/sent_signal.rs new file mode 100644 index 0000000..9e75d80 --- /dev/null +++ b/01_phase_rust_src/sv-rustit/src/status_obj/sent_signal.rs @@ -0,0 +1,62 @@ + +use tokio::net::unix::pipe; +use tokio::runtime::Runtime; +use std::io::ErrorKind; + + +pub fn check_fifo(sv: String, path: &str) -> bool { + // Check if fifo is available. If yes, return true. + // If no, return false. + let rt = Runtime::new().unwrap(); + let _guard = rt.enter(); + + let sender = pipe::OpenOptions::new().open_sender(path); + match sender { + Ok(..) => return true, + Err(e) if e.raw_os_error() == Some(libc::ENXIO) => { + println!("fail: {sv}: runsv not running"); + return false; + }, + Err(..) => { + println!("warning: {sv}: unable to open {path}: file does not exist"); + return false; + }, + }; +} + +pub fn sent_signal(signal: &[u8]) -> bool { + // sent the char to supervise/control. + // return true in case everything worked fine, false if there was any errors. + let rt = Runtime::new().unwrap(); + let _guard = rt.enter(); + + let sender = pipe::OpenOptions::new().open_sender("supervise/control"); + match sender { + Ok(tx) => { + loop { + match tx.try_write(signal) { + Ok(..) => { + return true; + }, + Err(e) if e.kind() == ErrorKind::WouldBlock => { + continue; + }, + Err(e) => { + dbg!(e); + println!("Unable to write to supervise/control"); + return false; + }, + }; + }; + }, + Err(e) if e.raw_os_error() == Some(libc::ENXIO) => { + println!("fail: sv: runsv not running"); + return false; + }, + Err(..) => { + println!("warning: sv: unable to open path: file does not exist"); + return false; + }, + }; +} + -- 2.45.2 From d5064ae281b186247da1d48a54740c13515cf964 Mon Sep 17 00:00:00 2001 From: primardj Date: Mon, 15 Apr 2024 23:09:15 +0100 Subject: [PATCH 03/13] add o command and solve some littles problems with prints. --- .../sv-rustit/src/executor/sent_signal.rs | 34 +++++++++---------- .../src/executor/sent_signal/misc.rs | 26 ++++++++++++++ 2 files changed, 42 insertions(+), 18 deletions(-) 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 761ae3d..0c6b121 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 @@ -21,23 +21,7 @@ pub fn sent_signal( svwait_var: i32, verbose: i8, command: &str, mut sv: status_ // case where command is up if sv.sent_signal(b"u") { if verbose == 1 { - loop { - let status = sv.update_status(); - if status == 1 { - return 1; - } - if sv.is_up() == true { - misc::print_status(sv); - return 0 - } - if time_wait >= svwait_var { - println!("timeout: {}", sv.get_status_string()); - return 1 - } - - time_wait += 1; - sleep(Duration::from_secs(1)); - } + return misc::run_verbose(svwait_var, sv); } else { return 0; } @@ -56,7 +40,7 @@ pub fn sent_signal( svwait_var: i32, verbose: i8, command: &str, mut sv: status_ return 1; } if sv.is_up() == false { - misc::print_status(sv); + println!("{}", sv.get_status_string()); return 0 } if time_wait >= svwait_var { @@ -75,8 +59,22 @@ pub fn sent_signal( svwait_var: i32, verbose: i8, command: &str, mut sv: status_ } } + if command == "o" { + // case where command is run once. + if sv.sent_signal(b"o") { + if verbose == 1 { + return misc::run_verbose(svwait_var, sv); + } else { + return 0; + } + } else { + return 1; + } + } + println!("Error, command not implemented."); return 1; } + 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 index 7a8e2a5..2addb04 100644 --- 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 @@ -1,6 +1,9 @@ use crate::status_obj; +use std::thread::sleep; +use std::time::Duration; + 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(); @@ -19,3 +22,26 @@ pub fn print_status(mut sv: status_obj::StatusObj) -> i32 { println!("{}", status_sv); return 0; } + + +pub fn run_verbose(svwait_var: i32, mut sv: status_obj::StatusObj) -> i32 { + let mut time_wait = 0; + loop { + let status = sv.update_status(); + if status == 1 { + return 1; + } + if sv.is_up() == true { + println!("ok: {}", sv.get_status_string()); + return 0 + } + if time_wait >= svwait_var { + println!("timeout: {}", sv.get_status_string()); + return 1 + } + + time_wait += 1; + sleep(Duration::from_secs(1)); + } + +} -- 2.45.2 From b7ad89359bd17395cbccd1025d97a8b42c92836b Mon Sep 17 00:00:00 2001 From: primardj Date: Mon, 15 Apr 2024 23:19:02 +0100 Subject: [PATCH 04/13] small optimisation --- .../sv-rustit/src/executor/sent_signal.rs | 29 +++---------------- .../src/executor/sent_signal/misc.rs | 6 ++-- 2 files changed, 8 insertions(+), 27 deletions(-) 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 0c6b121..5f721b5 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 @@ -3,15 +3,9 @@ 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. - - let mut time_wait = 0; - // execute command. if command == "s" { // case command is status return misc::print_status(sv); @@ -21,7 +15,7 @@ pub fn sent_signal( svwait_var: i32, verbose: i8, command: &str, mut sv: status_ // case where command is up if sv.sent_signal(b"u") { if verbose == 1 { - return misc::run_verbose(svwait_var, sv); + return misc::run_verbose(true, svwait_var, sv); } else { return 0; } @@ -34,23 +28,7 @@ pub fn sent_signal( svwait_var: i32, verbose: i8, command: &str, mut sv: status_ // case where command is up if sv.sent_signal(b"d") { if verbose == 1 { - loop { - let status = sv.update_status(); - if status == 1 { - return 1; - } - if sv.is_up() == false { - println!("{}", sv.get_status_string()); - return 0 - } - if time_wait >= svwait_var { - println!("timeout: {}", sv.get_status_string()); - return 1 - } - - time_wait += 1; - sleep(Duration::from_secs(1)); - } + return misc::run_verbose(false, svwait_var, sv); } else { return 0; } @@ -63,7 +41,7 @@ pub fn sent_signal( svwait_var: i32, verbose: i8, command: &str, mut sv: status_ // case where command is run once. if sv.sent_signal(b"o") { if verbose == 1 { - return misc::run_verbose(svwait_var, sv); + return misc::run_verbose(true, svwait_var, sv); } else { return 0; } @@ -72,6 +50,7 @@ pub fn sent_signal( svwait_var: i32, verbose: i8, command: &str, mut sv: status_ } } + println!("Error, command not implemented."); return 1; } 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 index 2addb04..98c80ef 100644 --- 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 @@ -24,14 +24,16 @@ pub fn print_status(mut sv: status_obj::StatusObj) -> i32 { } -pub fn run_verbose(svwait_var: i32, mut sv: status_obj::StatusObj) -> i32 { +pub fn run_verbose(state: bool, svwait_var: i32, mut sv: status_obj::StatusObj) -> i32 { + // if the state is true, wait for the service to run. + // If the state is false, wait for the service to down. let mut time_wait = 0; loop { let status = sv.update_status(); if status == 1 { return 1; } - if sv.is_up() == true { + if sv.is_up() == state { println!("ok: {}", sv.get_status_string()); return 0 } -- 2.45.2 From 3f57120e539c14a04fa7158999fdc60db7ad46e7 Mon Sep 17 00:00:00 2001 From: primardj Date: Mon, 15 Apr 2024 23:24:24 +0100 Subject: [PATCH 05/13] change a big if chain by a match. --- .../sv-rustit/src/executor/sent_signal.rs | 88 +++++++++---------- 1 file changed, 44 insertions(+), 44 deletions(-) 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 5f721b5..1e1e1f6 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 @@ -6,53 +6,53 @@ use crate::status_obj; 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. - if command == "s" { - // case command is status - return misc::print_status(sv); - } - - if command == "u" { - // case where command is up - if sv.sent_signal(b"u") { - if verbose == 1 { - return misc::run_verbose(true, svwait_var, sv); - } else { - return 0; + match command { + "s" => { + // case command is status + return misc::print_status(sv); + }, + "u" => { + // case where command is up + if sv.sent_signal(b"u") { + if verbose == 1 { + return misc::run_verbose(true, svwait_var, sv); + } else { + return 0; + } + } else { + return 1; } - } else { + }, + "d" => { + // case where command is up + if sv.sent_signal(b"d") { + if verbose == 1 { + return misc::run_verbose(false, svwait_var, sv); + } else { + return 0; + } + } else { + return 1; + } + }, + "o" => { + // case where command is run once. + if sv.sent_signal(b"o") { + if verbose == 1 { + return misc::run_verbose(true, svwait_var, sv); + } else { + return 0; + } + } else { + return 1; + } + }, + other => { + println!("Error, command {} not implemented.", other); // TODO : Put the real error + // message. return 1; } - } - - if command == "d" { - // case where command is up - if sv.sent_signal(b"d") { - if verbose == 1 { - return misc::run_verbose(false, svwait_var, sv); - } else { - return 0; - } - } else { - return 1; - } - } - - if command == "o" { - // case where command is run once. - if sv.sent_signal(b"o") { - if verbose == 1 { - return misc::run_verbose(true, svwait_var, sv); - } else { - return 0; - } - } else { - return 1; - } - } - - - println!("Error, command not implemented."); - return 1; + }; } -- 2.45.2 From 14b762520fe92e3fcb4ab51722727edf17005f9e Mon Sep 17 00:00:00 2001 From: primardj Date: Mon, 15 Apr 2024 23:38:24 +0100 Subject: [PATCH 06/13] other smalls optimisations. --- .../sv-rustit/src/executor/sent_signal.rs | 30 ++------------ .../src/executor/sent_signal/misc.rs | 41 +++++++++++-------- 2 files changed, 26 insertions(+), 45 deletions(-) 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 1e1e1f6..9f8e344 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 @@ -13,39 +13,15 @@ pub fn sent_signal( svwait_var: i32, verbose: i8, command: &str, mut sv: status_ }, "u" => { // case where command is up - if sv.sent_signal(b"u") { - if verbose == 1 { - return misc::run_verbose(true, svwait_var, sv); - } else { - return 0; - } - } else { - return 1; - } + return misc::run_verbose(sv.sent_signal(b"u"), true, verbose, svwait_var, sv); }, "d" => { // case where command is up - if sv.sent_signal(b"d") { - if verbose == 1 { - return misc::run_verbose(false, svwait_var, sv); - } else { - return 0; - } - } else { - return 1; - } + return misc::run_verbose(sv.sent_signal(b"d"), false, verbose, svwait_var, sv); }, "o" => { // case where command is run once. - if sv.sent_signal(b"o") { - if verbose == 1 { - return misc::run_verbose(true, svwait_var, sv); - } else { - return 0; - } - } else { - return 1; - } + return misc::run_verbose(sv.sent_signal(b"o"), true, verbose, svwait_var, sv); }, other => { println!("Error, command {} not implemented.", other); // TODO : Put the real error 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 index 98c80ef..b3883b0 100644 --- 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 @@ -24,26 +24,31 @@ pub fn print_status(mut sv: status_obj::StatusObj) -> i32 { } -pub fn run_verbose(state: bool, svwait_var: i32, mut sv: status_obj::StatusObj) -> i32 { +pub fn run_verbose(sent_signal: bool, state: bool, verbose: i8, svwait_var: i32, mut sv: status_obj::StatusObj) -> i32 { // if the state is true, wait for the service to run. // If the state is false, wait for the service to down. - let mut time_wait = 0; - loop { - let status = sv.update_status(); - if status == 1 { - return 1; + if sent_signal && verbose == 1 { + let mut time_wait = 0; + loop { + let status = sv.update_status(); + if status == 1 { + return 1; + } + if sv.is_up() == state { + println!("ok: {}", sv.get_status_string()); + return 0 + } + if time_wait >= svwait_var { + println!("timeout: {}", sv.get_status_string()); + return 1 + } + time_wait += 1; + sleep(Duration::from_secs(1)); } - if sv.is_up() == state { - println!("ok: {}", sv.get_status_string()); - return 0 - } - if time_wait >= svwait_var { - println!("timeout: {}", sv.get_status_string()); - return 1 - } - - time_wait += 1; - sleep(Duration::from_secs(1)); + } else if sent_signal && verbose == 0 { + return 0 + } else { + // Case sent_signal != true. + return 1 } - } -- 2.45.2 From 92e01299bcf7c4bb5efddf7494b16cd41955038d Mon Sep 17 00:00:00 2001 From: primardj Date: Tue, 16 Apr 2024 00:04:29 +0100 Subject: [PATCH 07/13] make a few optimisations in executor --- 01_phase_rust_src/sv-rustit/src/executor.rs | 36 ++++--------------- .../sv-rustit/src/executor/execute_service.rs | 22 ++++++++++++ .../src/executor/execute_service/make_path.rs | 17 +++++++++ .../{ => execute_service}/sent_signal.rs | 2 -- .../{ => execute_service}/sent_signal/misc.rs | 0 5 files changed, 45 insertions(+), 32 deletions(-) create mode 100644 01_phase_rust_src/sv-rustit/src/executor/execute_service.rs create mode 100644 01_phase_rust_src/sv-rustit/src/executor/execute_service/make_path.rs rename 01_phase_rust_src/sv-rustit/src/executor/{ => execute_service}/sent_signal.rs (99%) rename 01_phase_rust_src/sv-rustit/src/executor/{ => execute_service}/sent_signal/misc.rs (100%) diff --git a/01_phase_rust_src/sv-rustit/src/executor.rs b/01_phase_rust_src/sv-rustit/src/executor.rs index eae1327..bcd588e 100644 --- a/01_phase_rust_src/sv-rustit/src/executor.rs +++ b/01_phase_rust_src/sv-rustit/src/executor.rs @@ -1,41 +1,17 @@ -pub mod sent_signal; - -use crate::status_obj; +pub mod execute_service; pub fn execute(svdir_var: String, svwait_var: i32, verbose: i8, command: &str, services: Vec) -> i32{ + // split a service vector into different sv. let mut exit_code: i32 = 0; - for sv in services { - let ch1 = sv.chars().next().unwrap(); - let ch2_row = &sv.chars().collect::>()[..2]; - let ch2: String = ch2_row.into_iter().collect(); - let path; - - if ch1 == '/' || ch2 == "~/"{ - // case absolute path for the service - // - path = sv.clone(); - } else { - // case relative path for the service. - // - path = svdir_var.clone() + "/" + &sv; + exit_code += execute_service::execute_service(svdir_var.clone(), svwait_var, verbose, command, sv); + if exit_code > 99 { + exit_code = 99; } - - let status_option = status_obj::StatusObj::new(path, sv); - match status_option { - Some(status) => { - exit_code += sent_signal::sent_signal(svwait_var, verbose, command, status); - }, - None => { - if exit_code < 99 { - exit_code += 1; - } - }, - }; } return exit_code - } + diff --git a/01_phase_rust_src/sv-rustit/src/executor/execute_service.rs b/01_phase_rust_src/sv-rustit/src/executor/execute_service.rs new file mode 100644 index 0000000..db675ac --- /dev/null +++ b/01_phase_rust_src/sv-rustit/src/executor/execute_service.rs @@ -0,0 +1,22 @@ + +mod sent_signal; +mod make_path; + +use crate::status_obj; + +pub fn execute_service(svdir_var: String, svwait_var: i32, verbose: i8, command: &str, sv: String) -> i32 { + // make a sv object from a string, svdir_var, and sent it the command signal. + + let path = make_path::make_path(svdir_var, sv.clone()); + + let status_option = status_obj::StatusObj::new(path, sv); + match status_option { + Some(status) => { + return sent_signal::sent_signal(svwait_var, verbose, command, status); + }, + None => { + return 1; + }, + }; +} + diff --git a/01_phase_rust_src/sv-rustit/src/executor/execute_service/make_path.rs b/01_phase_rust_src/sv-rustit/src/executor/execute_service/make_path.rs new file mode 100644 index 0000000..2e807c1 --- /dev/null +++ b/01_phase_rust_src/sv-rustit/src/executor/execute_service/make_path.rs @@ -0,0 +1,17 @@ + +pub fn make_path(svdir_var: String, sv: String) -> String { + let ch1 = sv.chars().next().unwrap(); + let ch2_row = &sv.chars().collect::>()[..2]; + let ch2: String = ch2_row.into_iter().collect(); + let path; + + if ch1 == '/' || ch2 == "~/"{ + // case absolute path for the service + path = sv; + } else { + // case relative path for the service. + path = svdir_var + "/" + &sv; + } + + return path +} diff --git a/01_phase_rust_src/sv-rustit/src/executor/sent_signal.rs b/01_phase_rust_src/sv-rustit/src/executor/execute_service/sent_signal.rs similarity index 99% rename from 01_phase_rust_src/sv-rustit/src/executor/sent_signal.rs rename to 01_phase_rust_src/sv-rustit/src/executor/execute_service/sent_signal.rs index 9f8e344..5479880 100644 --- a/01_phase_rust_src/sv-rustit/src/executor/sent_signal.rs +++ b/01_phase_rust_src/sv-rustit/src/executor/execute_service/sent_signal.rs @@ -31,5 +31,3 @@ pub fn sent_signal( svwait_var: i32, verbose: i8, command: &str, mut sv: status_ }; } - - diff --git a/01_phase_rust_src/sv-rustit/src/executor/sent_signal/misc.rs b/01_phase_rust_src/sv-rustit/src/executor/execute_service/sent_signal/misc.rs similarity index 100% rename from 01_phase_rust_src/sv-rustit/src/executor/sent_signal/misc.rs rename to 01_phase_rust_src/sv-rustit/src/executor/execute_service/sent_signal/misc.rs -- 2.45.2 From a5ceacde6e97b503fc4696eb7c64901afa740fdd Mon Sep 17 00:00:00 2001 From: primardj Date: Tue, 16 Apr 2024 20:00:26 +0100 Subject: [PATCH 08/13] improve the printing of the result to corespond more to the original. --- 01_phase_rust_src/sv-rustit/src/status_obj.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 e34b7f5..f512b31 100644 --- a/01_phase_rust_src/sv-rustit/src/status_obj.rs +++ b/01_phase_rust_src/sv-rustit/src/status_obj.rs @@ -202,7 +202,7 @@ impl StatusObj { ud_string = ""; } } - if self.pause_run == true { + if self.pause_run == true && self.run_finish { pause_string = ", paused"; } else { pause_string = ""; -- 2.45.2 From e24e2dcbc9e558d704446f45d3d9cf0a5cb9906c Mon Sep 17 00:00:00 2001 From: primardj Date: Tue, 16 Apr 2024 20:16:48 +0100 Subject: [PATCH 09/13] add the p command --- .../executor/execute_service/sent_signal.rs | 4 +++ .../execute_service/sent_signal/misc.rs | 33 +++++++++++++++++-- 01_phase_rust_src/sv-rustit/src/status_obj.rs | 8 +++++ 3 files changed, 43 insertions(+), 2 deletions(-) diff --git a/01_phase_rust_src/sv-rustit/src/executor/execute_service/sent_signal.rs b/01_phase_rust_src/sv-rustit/src/executor/execute_service/sent_signal.rs index 5479880..dcec44d 100644 --- a/01_phase_rust_src/sv-rustit/src/executor/execute_service/sent_signal.rs +++ b/01_phase_rust_src/sv-rustit/src/executor/execute_service/sent_signal.rs @@ -23,6 +23,10 @@ pub fn sent_signal( svwait_var: i32, verbose: i8, command: &str, mut sv: status_ // case where command is run once. return misc::run_verbose(sv.sent_signal(b"o"), true, verbose, svwait_var, sv); }, + "p" => { + // case where it's the pause command which is entered. + return misc::pause_verbose(sv.sent_signal(b"p"), true, verbose, svwait_var, sv); + } other => { println!("Error, command {} not implemented.", other); // TODO : Put the real error // message. diff --git a/01_phase_rust_src/sv-rustit/src/executor/execute_service/sent_signal/misc.rs b/01_phase_rust_src/sv-rustit/src/executor/execute_service/sent_signal/misc.rs index b3883b0..917e9d3 100644 --- a/01_phase_rust_src/sv-rustit/src/executor/execute_service/sent_signal/misc.rs +++ b/01_phase_rust_src/sv-rustit/src/executor/execute_service/sent_signal/misc.rs @@ -24,7 +24,7 @@ pub fn print_status(mut sv: status_obj::StatusObj) -> i32 { } -pub fn run_verbose(sent_signal: bool, state: bool, verbose: i8, svwait_var: i32, mut sv: status_obj::StatusObj) -> i32 { +pub fn run_verbose(sent_signal: bool, expected: bool, verbose: i8, svwait_var: i32, mut sv: status_obj::StatusObj) -> i32 { // if the state is true, wait for the service to run. // If the state is false, wait for the service to down. if sent_signal && verbose == 1 { @@ -34,7 +34,36 @@ pub fn run_verbose(sent_signal: bool, state: bool, verbose: i8, svwait_var: i32, if status == 1 { return 1; } - if sv.is_up() == state { + if sv.is_up() == expected { + println!("ok: {}", sv.get_status_string()); + return 0 + } + if time_wait >= svwait_var { + println!("timeout: {}", sv.get_status_string()); + return 1 + } + time_wait += 1; + sleep(Duration::from_secs(1)); + } + } else if sent_signal && verbose == 0 { + return 0 + } else { + // Case sent_signal != true. + return 1 + } +} + +pub fn pause_verbose(sent_signal: bool, expected: bool, verbose: i8, svwait_var: i32, mut sv: status_obj::StatusObj) -> i32 { + // if the state is true, wait for the service to pause. + // if the state is false, wait for the service to continue. + if sent_signal && verbose == 1 { + let mut time_wait = 0; + loop { + let status = sv.update_status(); + if status == 1 { + return 1; + } + if sv.is_paused() == expected { println!("ok: {}", sv.get_status_string()); 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 f512b31..fff197b 100644 --- a/01_phase_rust_src/sv-rustit/src/status_obj.rs +++ b/01_phase_rust_src/sv-rustit/src/status_obj.rs @@ -241,6 +241,14 @@ impl StatusObj { }; } + pub fn is_paused(&mut self) -> bool { + if self.pause_run == true { + return true + } else { + return false + } + } + pub fn get_name(&mut self) -> String { return self.svname.clone(); } -- 2.45.2 From aa0634c2e729acbabc133805680241fbbcaa85b8 Mon Sep 17 00:00:00 2001 From: primardj Date: Tue, 16 Apr 2024 20:20:48 +0100 Subject: [PATCH 10/13] add command c --- .../sv-rustit/src/executor/execute_service/sent_signal.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/01_phase_rust_src/sv-rustit/src/executor/execute_service/sent_signal.rs b/01_phase_rust_src/sv-rustit/src/executor/execute_service/sent_signal.rs index dcec44d..3448f3a 100644 --- a/01_phase_rust_src/sv-rustit/src/executor/execute_service/sent_signal.rs +++ b/01_phase_rust_src/sv-rustit/src/executor/execute_service/sent_signal.rs @@ -27,6 +27,10 @@ pub fn sent_signal( svwait_var: i32, verbose: i8, command: &str, mut sv: status_ // case where it's the pause command which is entered. return misc::pause_verbose(sv.sent_signal(b"p"), true, verbose, svwait_var, sv); } + "c" => { + // case where it's the continue command which is entered. + return misc::pause_verbose(sv.sent_signal(b"c"), false, verbose, svwait_var, sv); + } other => { println!("Error, command {} not implemented.", other); // TODO : Put the real error // message. -- 2.45.2 From 7fe2443144f242e7faa496e35d19d543743859d4 Mon Sep 17 00:00:00 2001 From: primardj Date: Tue, 16 Apr 2024 21:16:34 +0100 Subject: [PATCH 11/13] add commands h, a, i, q, 1, 2 --- .../executor/execute_service/sent_signal.rs | 22 ++++++++++++++-- .../execute_service/sent_signal/misc.rs | 25 ++++++++++++++++--- 2 files changed, 41 insertions(+), 6 deletions(-) diff --git a/01_phase_rust_src/sv-rustit/src/executor/execute_service/sent_signal.rs b/01_phase_rust_src/sv-rustit/src/executor/execute_service/sent_signal.rs index 3448f3a..e70899e 100644 --- a/01_phase_rust_src/sv-rustit/src/executor/execute_service/sent_signal.rs +++ b/01_phase_rust_src/sv-rustit/src/executor/execute_service/sent_signal.rs @@ -26,11 +26,29 @@ pub fn sent_signal( svwait_var: i32, verbose: i8, command: &str, mut sv: status_ "p" => { // case where it's the pause command which is entered. return misc::pause_verbose(sv.sent_signal(b"p"), true, verbose, svwait_var, sv); - } + }, "c" => { // case where it's the continue command which is entered. return misc::pause_verbose(sv.sent_signal(b"c"), false, verbose, svwait_var, sv); - } + }, + "h" => { + return misc::noexcept_verbose(sv.sent_signal(b"h"), verbose, sv); + }, + "a" => { + return misc::noexcept_verbose(sv.sent_signal(b"a"), verbose, sv); + }, + "i" => { + return misc::noexcept_verbose(sv.sent_signal(b"i"), verbose, sv); + }, + "q" => { + return misc::noexcept_verbose(sv.sent_signal(b"q"), verbose, sv); + }, + "1" => { + return misc::noexcept_verbose(sv.sent_signal(b"1"), verbose, sv); + }, + "2" => { + return misc::noexcept_verbose(sv.sent_signal(b"1"), verbose, sv); + }, other => { println!("Error, command {} not implemented.", other); // TODO : Put the real error // message. diff --git a/01_phase_rust_src/sv-rustit/src/executor/execute_service/sent_signal/misc.rs b/01_phase_rust_src/sv-rustit/src/executor/execute_service/sent_signal/misc.rs index 917e9d3..f389bc6 100644 --- a/01_phase_rust_src/sv-rustit/src/executor/execute_service/sent_signal/misc.rs +++ b/01_phase_rust_src/sv-rustit/src/executor/execute_service/sent_signal/misc.rs @@ -25,8 +25,8 @@ pub fn print_status(mut sv: status_obj::StatusObj) -> i32 { pub fn run_verbose(sent_signal: bool, expected: bool, verbose: i8, svwait_var: i32, mut sv: status_obj::StatusObj) -> i32 { - // if the state is true, wait for the service to run. - // If the state is false, wait for the service to down. + // if the excepted is true, wait for the service to run. + // If the excepted is false, wait for the service to down. if sent_signal && verbose == 1 { let mut time_wait = 0; loop { @@ -54,8 +54,8 @@ pub fn run_verbose(sent_signal: bool, expected: bool, verbose: i8, svwait_var: i } pub fn pause_verbose(sent_signal: bool, expected: bool, verbose: i8, svwait_var: i32, mut sv: status_obj::StatusObj) -> i32 { - // if the state is true, wait for the service to pause. - // if the state is false, wait for the service to continue. + // if the excepted is true, wait for the service to pause. + // if the excepted is false, wait for the service to continue. if sent_signal && verbose == 1 { let mut time_wait = 0; loop { @@ -81,3 +81,20 @@ pub fn pause_verbose(sent_signal: bool, expected: bool, verbose: i8, svwait_var: return 1 } } + + +pub fn noexcept_verbose(sent_signal: bool, verbose: i8, mut sv: status_obj::StatusObj) -> i32 { + if sent_signal && verbose == 1 { + let status = sv.update_status(); + if status == 1 { + return 1; + } + println!("ok: {}", sv.get_status_string()); + return 0 + } else if sent_signal && verbose == 0 { + return 0 + } else { + // Case sent_signal != true. + return 1 + } +} -- 2.45.2 From 32acba1e7a115d2729a4aedc42d9ef9376290912 Mon Sep 17 00:00:00 2001 From: primardj Date: Tue, 16 Apr 2024 23:13:47 +0100 Subject: [PATCH 12/13] add command t and k --- .../executor/execute_service/sent_signal.rs | 8 +- .../execute_service/sent_signal/misc.rs | 74 ++++++++++++++++++- 01_phase_rust_src/sv-rustit/src/status_obj.rs | 21 ++++++ 3 files changed, 98 insertions(+), 5 deletions(-) diff --git a/01_phase_rust_src/sv-rustit/src/executor/execute_service/sent_signal.rs b/01_phase_rust_src/sv-rustit/src/executor/execute_service/sent_signal.rs index e70899e..f95e9a9 100644 --- a/01_phase_rust_src/sv-rustit/src/executor/execute_service/sent_signal.rs +++ b/01_phase_rust_src/sv-rustit/src/executor/execute_service/sent_signal.rs @@ -47,7 +47,13 @@ pub fn sent_signal( svwait_var: i32, verbose: i8, command: &str, mut sv: status_ return misc::noexcept_verbose(sv.sent_signal(b"1"), verbose, sv); }, "2" => { - return misc::noexcept_verbose(sv.sent_signal(b"1"), verbose, sv); + return misc::noexcept_verbose(sv.sent_signal(b"2"), verbose, sv); + }, + "t" => { + return misc::term_verbose(sv.sent_signal(b"t"), false, verbose, svwait_var, sv); + }, + "k" => { + return misc::kill_verbose(sv.sent_signal(b"k"), verbose, svwait_var, sv); }, other => { println!("Error, command {} not implemented.", other); // TODO : Put the real error diff --git a/01_phase_rust_src/sv-rustit/src/executor/execute_service/sent_signal/misc.rs b/01_phase_rust_src/sv-rustit/src/executor/execute_service/sent_signal/misc.rs index f389bc6..98a7222 100644 --- a/01_phase_rust_src/sv-rustit/src/executor/execute_service/sent_signal/misc.rs +++ b/01_phase_rust_src/sv-rustit/src/executor/execute_service/sent_signal/misc.rs @@ -28,6 +28,7 @@ pub fn run_verbose(sent_signal: bool, expected: bool, verbose: i8, svwait_var: i // if the excepted is true, wait for the service to run. // If the excepted is false, wait for the service to down. if sent_signal && verbose == 1 { + sleep(Duration::from_secs_f32(0.0005)); let mut time_wait = 0; loop { let status = sv.update_status(); @@ -38,12 +39,12 @@ pub fn run_verbose(sent_signal: bool, expected: bool, verbose: i8, svwait_var: i println!("ok: {}", sv.get_status_string()); return 0 } - if time_wait >= svwait_var { + if time_wait >= svwait_var*2 { println!("timeout: {}", sv.get_status_string()); return 1 } time_wait += 1; - sleep(Duration::from_secs(1)); + sleep(Duration::from_secs_f32(0.5)); } } else if sent_signal && verbose == 0 { return 0 @@ -57,6 +58,7 @@ pub fn pause_verbose(sent_signal: bool, expected: bool, verbose: i8, svwait_var: // if the excepted is true, wait for the service to pause. // if the excepted is false, wait for the service to continue. if sent_signal && verbose == 1 { + sleep(Duration::from_secs_f32(0.0005)); let mut time_wait = 0; loop { let status = sv.update_status(); @@ -67,12 +69,12 @@ pub fn pause_verbose(sent_signal: bool, expected: bool, verbose: i8, svwait_var: println!("ok: {}", sv.get_status_string()); return 0 } - if time_wait >= svwait_var { + if time_wait >= svwait_var*2 { println!("timeout: {}", sv.get_status_string()); return 1 } time_wait += 1; - sleep(Duration::from_secs(1)); + sleep(Duration::from_secs_f32(0.5)); } } else if sent_signal && verbose == 0 { return 0 @@ -82,9 +84,73 @@ pub fn pause_verbose(sent_signal: bool, expected: bool, verbose: i8, svwait_var: } } +pub fn term_verbose(sent_signal: bool, expected: bool, verbose: i8, svwait_var: i32, mut sv: status_obj::StatusObj) -> i32 { + // if the excepted is true, wait for the service to get term signal. + // if the excepted is false, wait for the service to interpret the term signal. + if sent_signal && verbose == 1 { + sleep(Duration::from_secs_f32(0.0005)); + let mut time_wait = 0; + loop { + let status = sv.update_status(); + if status == 1 { + return 1; + } + if sv.is_term() == expected { + println!("ok: {}", sv.get_status_string()); + return 0 + } + if time_wait >= svwait_var*2 { + println!("timeout: {}", sv.get_status_string()); + return 1 + } + time_wait += 1; + sleep(Duration::from_secs_f32(0.5)); + } + } else if sent_signal && verbose == 0 { + return 0 + } else { + // Case sent_signal != true. + return 1 + } +} + +pub fn kill_verbose(sent_signal: bool, verbose: i8, svwait_var: i32, mut sv: status_obj::StatusObj) -> i32 { + if sent_signal && verbose == 1 { + sleep(Duration::from_secs_f32(0.0005)); + let mut time_wait = 0; + if ! sv.get_run_finish() { + println!("ok: {}", sv.get_status_string()); + return 0; + } + let pid = sv.get_pid(); + let time = sv.get_time(); + loop { + let status = sv.update_status(); + if status == 1 { + return 1; + } + if pid != sv.get_pid() || time > sv.get_time() { + println!("ok: {}", sv.get_status_string()); + return 0 + } + if time_wait >= svwait_var*2 { + println!("timeout: {}", sv.get_status_string()); + return 1 + } + time_wait += 1; + sleep(Duration::from_secs_f32(0.5)); + } + } else if sent_signal && verbose == 0 { + return 0 + } else { + // Case sent_signal != true. + return 1 + } +} pub fn noexcept_verbose(sent_signal: bool, verbose: i8, mut sv: status_obj::StatusObj) -> i32 { if sent_signal && verbose == 1 { + sleep(Duration::from_secs_f32(0.0005)); let status = sv.update_status(); if status == 1 { return 1; 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 fff197b..2d7328f 100644 --- a/01_phase_rust_src/sv-rustit/src/status_obj.rs +++ b/01_phase_rust_src/sv-rustit/src/status_obj.rs @@ -213,6 +213,7 @@ impl StatusObj { term_string = ""; } + let time_repaired: u64 = self.time - 4611686018427387914; let sys_time_result = SystemTime::now().duration_since(SystemTime::UNIX_EPOCH); let sys_time = match sys_time_result { @@ -249,6 +250,14 @@ impl StatusObj { } } + pub fn is_term(&mut self) -> bool { + if self.term_sig == true { + return true + } else { + return false + } + } + pub fn get_name(&mut self) -> String { return self.svname.clone(); } @@ -261,6 +270,18 @@ impl StatusObj { return self.log; } + pub fn get_pid(&mut self) -> u32 { + return self.pid; + } + + pub fn get_time(&mut self) -> u64 { + return self.time; + } + + pub fn get_run_finish(&mut self) -> bool { + return self.run_finish; + } + pub fn get_obj_log(&mut self) -> Option { return StatusObj::new(self.svpath.clone() + "/log", "log".to_string()); } -- 2.45.2 From b73a0abee240413fe682d5c256f2d32cf3fd6008 Mon Sep 17 00:00:00 2001 From: primardj Date: Thu, 18 Apr 2024 00:26:52 +0100 Subject: [PATCH 13/13] add command x and e --- .../executor/execute_service/sent_signal.rs | 3 ++ .../execute_service/sent_signal/misc.rs | 30 +++++++++++++ 01_phase_rust_src/sv-rustit/src/parser.rs | 2 +- 01_phase_rust_src/sv-rustit/src/status_obj.rs | 45 +++++++++++++++---- .../sv-rustit/src/status_obj/sent_signal.rs | 12 ++--- 5 files changed, 77 insertions(+), 15 deletions(-) diff --git a/01_phase_rust_src/sv-rustit/src/executor/execute_service/sent_signal.rs b/01_phase_rust_src/sv-rustit/src/executor/execute_service/sent_signal.rs index f95e9a9..4004b85 100644 --- a/01_phase_rust_src/sv-rustit/src/executor/execute_service/sent_signal.rs +++ b/01_phase_rust_src/sv-rustit/src/executor/execute_service/sent_signal.rs @@ -55,6 +55,9 @@ pub fn sent_signal( svwait_var: i32, verbose: i8, command: &str, mut sv: status_ "k" => { return misc::kill_verbose(sv.sent_signal(b"k"), verbose, svwait_var, sv); }, + "e" | "x" => { + return misc::exit_verbose(sv.sent_signal(b"x"), verbose, svwait_var, sv); + }, other => { println!("Error, command {} not implemented.", other); // TODO : Put the real error // message. diff --git a/01_phase_rust_src/sv-rustit/src/executor/execute_service/sent_signal/misc.rs b/01_phase_rust_src/sv-rustit/src/executor/execute_service/sent_signal/misc.rs index 98a7222..f93636f 100644 --- a/01_phase_rust_src/sv-rustit/src/executor/execute_service/sent_signal/misc.rs +++ b/01_phase_rust_src/sv-rustit/src/executor/execute_service/sent_signal/misc.rs @@ -148,6 +148,36 @@ pub fn kill_verbose(sent_signal: bool, verbose: i8, svwait_var: i32, mut sv: sta } } +pub fn exit_verbose(sent_signal: bool, verbose: i8, svwait_var: i32, mut sv: status_obj::StatusObj) -> i32 { + // if the excepted is true, wait for the service to get term signal. + // if the excepted is false, wait for the service to interpret the term signal. + if sent_signal && verbose == 1 { + sleep(Duration::from_secs_f32(0.0005)); + let mut time_wait = 0; + loop { + let status = sv.update_status(); + if status == 1 { + return 1; + } + if sv.is_exited() == true { + println!("ok: {}", sv.get_status_string()); + return 0 + } + if time_wait >= svwait_var*2 { + println!("timeout: {}", sv.get_status_string()); + return 1 + } + time_wait += 1; + sleep(Duration::from_secs_f32(0.5)); + } + } else if sent_signal && verbose == 0 { + return 0 + } else { + // Case sent_signal != true. + return 1 + } +} + pub fn noexcept_verbose(sent_signal: bool, verbose: i8, mut sv: status_obj::StatusObj) -> i32 { if sent_signal && verbose == 1 { sleep(Duration::from_secs_f32(0.0005)); diff --git a/01_phase_rust_src/sv-rustit/src/parser.rs b/01_phase_rust_src/sv-rustit/src/parser.rs index cb09545..b2cf51b 100644 --- a/01_phase_rust_src/sv-rustit/src/parser.rs +++ b/01_phase_rust_src/sv-rustit/src/parser.rs @@ -95,7 +95,7 @@ pub fn parse_args_1(arg: &String) -> String{ pub fn parse_args_2(arg: &String) -> String{ const POSSIBLE: &'static [&'static str] = &["start", "stop", "reload", "restart", "shutdown", "force-stop", "force-reload", "force-restart", "force-shutdown", "try-restart"]; - const CPOSSIBLE: &'static [char] = &['s', 'u', 'd', 'o', 'p', 'c', 'h', 'a', 'i', 'q', '1', '2', 't', 'k']; + const CPOSSIBLE: &'static [char] = &['s', 'u', 'd', 'o', 'p', 'c', 'h', 'a', 'i', 'q', '1', '2', 't', 'k', 'e', 'x']; for var in POSSIBLE.iter() { if arg == var { 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 2d7328f..a37fa86 100644 --- a/01_phase_rust_src/sv-rustit/src/status_obj.rs +++ b/01_phase_rust_src/sv-rustit/src/status_obj.rs @@ -39,14 +39,30 @@ impl StatusObj { } // Check if supervise/control and supervise/ok exists, and if runsv running. - let control_exists = sent_signal::check_fifo(sv.clone(), "supervise/ok"); - if control_exists == false { - return None; - } - let control_exists = sent_signal::check_fifo(sv.clone(), "supervise/control"); - if control_exists == false { - return None; - } + let control_exists = sent_signal::check_fifo("supervise/ok"); + match control_exists { + 1 => { + println!("fail: {sv}: runsv not running"); + return None; + }, + 2 => { + println!("warning: {sv}: unable to open {path_string}: file does not exist"); + return None + }, + _other => {}, + }; + let control_exists = sent_signal::check_fifo("supervise/control"); + match control_exists { + 1 => { + println!("fail: {sv}: runsv not running"); + return None; + }, + 2 => { + println!("warning: {sv}: unable to open {path_string}: file does not exist"); + return None + }, + _other => {}, + }; let status_option = fs::OpenOptions::new().read(true).open("supervise/status"); @@ -168,6 +184,10 @@ impl StatusObj { pub fn get_status_string(&mut self) -> String { // return the status for this service in particular. + + if self.is_exited() { + return self.svname.clone() + ": runsv not running"; + } let status_sv; let pid_string: String; @@ -258,6 +278,15 @@ impl StatusObj { } } + pub fn is_exited(&mut self) -> bool { + let control_exists = sent_signal::check_fifo("supervise/ok"); + if control_exists == 1 || control_exists == 2 { + return true; + } + return false; + + } + pub fn get_name(&mut self) -> String { return self.svname.clone(); } diff --git a/01_phase_rust_src/sv-rustit/src/status_obj/sent_signal.rs b/01_phase_rust_src/sv-rustit/src/status_obj/sent_signal.rs index 9e75d80..76e42fb 100644 --- a/01_phase_rust_src/sv-rustit/src/status_obj/sent_signal.rs +++ b/01_phase_rust_src/sv-rustit/src/status_obj/sent_signal.rs @@ -4,7 +4,7 @@ use tokio::runtime::Runtime; use std::io::ErrorKind; -pub fn check_fifo(sv: String, path: &str) -> bool { +pub fn check_fifo( path: &str) -> u32 { // Check if fifo is available. If yes, return true. // If no, return false. let rt = Runtime::new().unwrap(); @@ -12,14 +12,14 @@ pub fn check_fifo(sv: String, path: &str) -> bool { let sender = pipe::OpenOptions::new().open_sender(path); match sender { - Ok(..) => return true, + Ok(..) => return 0, Err(e) if e.raw_os_error() == Some(libc::ENXIO) => { - println!("fail: {sv}: runsv not running"); - return false; + //println!("fail: {sv}: runsv not running"); + return 1; }, Err(..) => { - println!("warning: {sv}: unable to open {path}: file does not exist"); - return false; + //println!("warning: {sv}: unable to open {path}: file does not exist"); + return 2; }, }; } -- 2.45.2