From 14c01eb796aeda5b5a493c61ab2bc37cf82a8090 Mon Sep 17 00:00:00 2001 From: primardj Date: Sat, 6 Apr 2024 11:48:48 +0100 Subject: [PATCH 01/14] =?UTF-8?q?solve=20panicking=20with=20flag=20=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 01_phase_rust_src/sv/src/main.rs | 11 ++++++++--- 01_phase_rust_src/sv/src/parser.rs | 6 ++++-- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/01_phase_rust_src/sv/src/main.rs b/01_phase_rust_src/sv/src/main.rs index 8f722c3..3861aff 100644 --- a/01_phase_rust_src/sv/src/main.rs +++ b/01_phase_rust_src/sv/src/main.rs @@ -55,9 +55,14 @@ fn main() { i += 1; } else { - if val.len() == 2 { - println!("sv: illegal option -- {}", val.chars().nth(1).unwrap() ); - // TODO: thread NOT pannic if it is not an ASCII character. + if val.len() >= 2 { + let mut j = 0; + for ch in val.chars() { + if j == 1 { + println!("sv: illegal option -- {}", ch ); + } + j += 1; + } } parser::misc::usage(); exit(100); diff --git a/01_phase_rust_src/sv/src/parser.rs b/01_phase_rust_src/sv/src/parser.rs index 5c9c18e..b7d62bc 100644 --- a/01_phase_rust_src/sv/src/parser.rs +++ b/01_phase_rust_src/sv/src/parser.rs @@ -52,6 +52,7 @@ pub fn parse_args(args: Vec) -> Vec{ } } + return parser; } @@ -79,12 +80,13 @@ pub fn parse_args_1(arg: &String) -> String{ //println!("{}", ch1); if ch1 == '-' && arg.len() >= 2{ - return (&arg[..2]).to_string() + let retour = &arg.chars().collect::>()[..2]; + return retour.into_iter().collect(); } else if ch1 == '-' { return ch1.to_string() } - println!("{}",arg); + //println!("{}",arg); return "".to_string() From 7674e823b96c0fa6e4813171cdbe53953ea41927 Mon Sep 17 00:00:00 2001 From: primardj Date: Sun, 7 Apr 2024 19:27:08 +0100 Subject: [PATCH 02/14] create module executor and pass to it all it's parametters. --- 01_phase_rust_src/sv/src/executor.rs | 11 ++++++++++ 01_phase_rust_src/sv/src/main.rs | 31 +++++++++++++++------------- 2 files changed, 28 insertions(+), 14 deletions(-) create mode 100644 01_phase_rust_src/sv/src/executor.rs diff --git a/01_phase_rust_src/sv/src/executor.rs b/01_phase_rust_src/sv/src/executor.rs new file mode 100644 index 0000000..6641cc9 --- /dev/null +++ b/01_phase_rust_src/sv/src/executor.rs @@ -0,0 +1,11 @@ + + +pub fn execute(svdir_var: String, svwait_var: i32, verbose: i8, command: &str, services: Vec){ + println!("execute in exec"); + dbg!(svdir_var); + dbg!(svwait_var); + dbg!(verbose); + dbg!(command); + dbg!(services); + +} diff --git a/01_phase_rust_src/sv/src/main.rs b/01_phase_rust_src/sv/src/main.rs index 3861aff..b1498d0 100644 --- a/01_phase_rust_src/sv/src/main.rs +++ b/01_phase_rust_src/sv/src/main.rs @@ -1,5 +1,6 @@ mod parser; +mod executor; use std::env; use std::process::exit; @@ -23,10 +24,10 @@ fn main() { Err(..) => 7, }; - let mut verbose = 0; + let mut verbose: i8 = 0; - dbg!(svdir_var); - dbg!(svwait_var); + //dbg!(svdir_var); + //dbg!(svwait_var); // run the parser @@ -34,18 +35,18 @@ fn main() { let arg_parser: Vec = parser::parse_args(args); - //dbg!(arg_parser); - - let mut i = 0; - let mut command; + let mut command = "INVALID"; + let mut services: Vec = Vec::new(); + + // make data from parser. for val in arg_parser.iter() { if i == 0 { if val == "-v" { verbose = 1; - dbg!(verbose); + //dbg!(verbose); } else if val == "-w" { i = 3; @@ -70,22 +71,24 @@ fn main() { } else if i == 1 { command = val; - dbg!(command); + //dbg!(command); i += 1; } - // TODO: Exec the command on all given services. + else if i == 2 { + // case services to control. + //dbg!(val); + services.push(val.to_string()); + } else if i == 3 { svwait_var = match val.parse::() { Ok(val) => val, Err(..) => svwait_var, }; - dbg!(svwait_var); + //dbg!(svwait_var); i = 0; } } + executor::execute(svdir_var, svwait_var, verbose, command, services); - - - } From 36f77b3edb00d74317efc39b2eeaf2551cc0cc83 Mon Sep 17 00:00:00 2001 From: primardj Date: Sun, 7 Apr 2024 22:01:39 +0100 Subject: [PATCH 03/14] make a good path for a service --- 01_phase_rust_src/sv/src/executor.rs | 33 ++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/01_phase_rust_src/sv/src/executor.rs b/01_phase_rust_src/sv/src/executor.rs index 6641cc9..8fc94ad 100644 --- a/01_phase_rust_src/sv/src/executor.rs +++ b/01_phase_rust_src/sv/src/executor.rs @@ -1,11 +1,40 @@ +use std::fs; + pub fn execute(svdir_var: String, svwait_var: i32, verbose: i8, command: &str, services: Vec){ println!("execute in exec"); - dbg!(svdir_var); + dbg!(svdir_var.clone()); dbg!(svwait_var); dbg!(verbose); dbg!(command); - dbg!(services); + + 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; + } else { + // case relative path for the service. + // + path = svdir_var.clone() + "/" + &sv; + } + dbg!(path); + // 1. Check if path exists. + // + // 2. Check if supervise/ok exist + // + // if not, error => increase by one the exit code and print a beatifull message in Err + // standard. + // + // if yes, sent the proper signal to supervise/control + // + // if verbose = 1, wait for the service to reach the proper state or timeout. + } } From 61ccac3415342a970068823ba93c29187c8d42b5 Mon Sep 17 00:00:00 2001 From: primardj Date: Sun, 7 Apr 2024 22:40:26 +0100 Subject: [PATCH 04/14] try change to service directory --- 01_phase_rust_src/sv/src/executor.rs | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/01_phase_rust_src/sv/src/executor.rs b/01_phase_rust_src/sv/src/executor.rs index 8fc94ad..7c738f8 100644 --- a/01_phase_rust_src/sv/src/executor.rs +++ b/01_phase_rust_src/sv/src/executor.rs @@ -1,14 +1,19 @@ use std::fs; +use std::path::Path; +use std::env::set_current_dir; pub fn execute(svdir_var: String, svwait_var: i32, verbose: i8, command: &str, services: Vec){ + // TODO: Return the exec code. println!("execute in exec"); dbg!(svdir_var.clone()); dbg!(svwait_var); dbg!(verbose); dbg!(command); + let mut exit_code: i32 = 0; + for sv in services { let ch1 = sv.chars().next().unwrap(); let ch2_row = &sv.chars().collect::>()[..2]; @@ -18,15 +23,29 @@ pub fn execute(svdir_var: String, svwait_var: i32, verbose: i8, command: &str, s if ch1 == '/' || ch2 == "~/"{ // case absolute path for the service // - path = sv; + path = sv.clone(); } else { // case relative path for the service. // path = svdir_var.clone() + "/" + &sv; } - dbg!(path); - // 1. Check if path exists. - // + + // 1. Check if path exists. + // + let path_to_sv = Path::new(&path); + + if set_current_dir(path_to_sv).is_ok() { + println!("Set path okay."); + // TODO: make a function which do what's next. + // It will be called, sent_signal, will return 0 if no error, and 1 if an error. + } else { + println!("fail: {}: unable to change to service directory: file does not exist", sv); + if exit_code < 99 { + exit_code += 1; + } + } + + // TODO // 2. Check if supervise/ok exist // // if not, error => increase by one the exit code and print a beatifull message in Err From 591afb7f7bc990cf4c7f293d16145b3a6bb28c99 Mon Sep 17 00:00:00 2001 From: primardj Date: Mon, 8 Apr 2024 12:42:06 +0100 Subject: [PATCH 05/14] add supervise/ok check, and correct return exit_code. --- 01_phase_rust_src/sv/src/executor.rs | 38 ++++++++++++++++++---------- 01_phase_rust_src/sv/src/main.rs | 17 +++++-------- 2 files changed, 30 insertions(+), 25 deletions(-) diff --git a/01_phase_rust_src/sv/src/executor.rs b/01_phase_rust_src/sv/src/executor.rs index 7c738f8..91ad357 100644 --- a/01_phase_rust_src/sv/src/executor.rs +++ b/01_phase_rust_src/sv/src/executor.rs @@ -4,8 +4,26 @@ use std::fs; use std::path::Path; use std::env::set_current_dir; -pub fn execute(svdir_var: String, svwait_var: i32, verbose: i8, command: &str, services: Vec){ - // TODO: Return the exec code. +fn sent_signal(exit_code: i32, svwait_var: i32, verbose: i8, command: &str, sv: String) -> i32 { + + // Check if supervise/ok exist. + let supervise_ok = Path::new("supervise/ok"); + if ! supervise_ok.exists() { + println!("warning: {}: unable to open supervise/ok: file does not exist", sv.clone()); + if exit_code < 99 { + return exit_code + 1; + } else { + return exit_code; + } + } + // TODO + // sent the proper signal to supervise/control + // + // if verbose = 1, wait for the service to reach the proper state or timeout. + return exit_code; +} + +pub fn execute(svdir_var: String, svwait_var: i32, verbose: i8, command: &str, services: Vec) -> i32{ println!("execute in exec"); dbg!(svdir_var.clone()); dbg!(svwait_var); @@ -35,9 +53,8 @@ pub fn execute(svdir_var: String, svwait_var: i32, verbose: i8, command: &str, s let path_to_sv = Path::new(&path); if set_current_dir(path_to_sv).is_ok() { - println!("Set path okay."); - // TODO: make a function which do what's next. - // It will be called, sent_signal, will return 0 if no error, and 1 if an error. + // Call the change in the service. + exit_code = sent_signal(exit_code, svwait_var, verbose, command, sv); } else { println!("fail: {}: unable to change to service directory: file does not exist", sv); if exit_code < 99 { @@ -45,15 +62,8 @@ pub fn execute(svdir_var: String, svwait_var: i32, verbose: i8, command: &str, s } } - // TODO - // 2. Check if supervise/ok exist - // - // if not, error => increase by one the exit code and print a beatifull message in Err - // standard. - // - // if yes, sent the proper signal to supervise/control - // - // if verbose = 1, wait for the service to reach the proper state or timeout. } + return exit_code + } diff --git a/01_phase_rust_src/sv/src/main.rs b/01_phase_rust_src/sv/src/main.rs index b1498d0..1cad543 100644 --- a/01_phase_rust_src/sv/src/main.rs +++ b/01_phase_rust_src/sv/src/main.rs @@ -26,10 +26,6 @@ fn main() { let mut verbose: i8 = 0; - //dbg!(svdir_var); - //dbg!(svwait_var); - - // run the parser let args: Vec = env::args().collect(); @@ -46,7 +42,6 @@ fn main() { if i == 0 { if val == "-v" { verbose = 1; - //dbg!(verbose); } else if val == "-w" { i = 3; @@ -70,25 +65,25 @@ fn main() { } } else if i == 1 { + // Set the command as first arguments. command = val; - //dbg!(command); i += 1; } else if i == 2 { - // case services to control. - //dbg!(val); + // add services to control. services.push(val.to_string()); } else if i == 3 { + // change svwait after flag -w svwait_var = match val.parse::() { Ok(val) => val, Err(..) => svwait_var, }; - //dbg!(svwait_var); i = 0; } } - - executor::execute(svdir_var, svwait_var, verbose, command, services); + + // Exit after all services are correctly executed. + exit(executor::execute(svdir_var, svwait_var, verbose, command, services)); } From 6e497b31641ed2686e5a0b4a72f9be2e64a84b3e Mon Sep 17 00:00:00 2001 From: primardj Date: Mon, 8 Apr 2024 21:33:17 +0100 Subject: [PATCH 06/14] add the ability to read pid in supervise/status --- 01_phase_rust_src/sv/src/executor.rs | 105 +++++++++++++++++++++++++-- 1 file changed, 100 insertions(+), 5 deletions(-) diff --git a/01_phase_rust_src/sv/src/executor.rs b/01_phase_rust_src/sv/src/executor.rs index 91ad357..ae04033 100644 --- a/01_phase_rust_src/sv/src/executor.rs +++ b/01_phase_rust_src/sv/src/executor.rs @@ -3,6 +3,86 @@ use std::fs; use std::path::Path; use std::env::set_current_dir; +use std::io::prelude::*; + +fn make_exit_code(exit_code: i32) -> i32 { + if exit_code < 99 { + return exit_code + 1; + } else { + return exit_code; + } +} + +fn return_u8_in_u32(mut table: Vec) -> u32 { + // Table make 4 vector u8 in one u32 + if table.len() != 4 { + return 0 + } + let mut r: u32 = 0; + table.reverse(); + for i in table.iter() { + println!("{}",i); + r = r * 256; + r += >::into(*i); + } + return r +} + +fn exec_status(exit_code: i32, sv: String) -> i32 { + let status_option = fs::OpenOptions::new().read(true).open("supervise/status"); + + // works this way : + // 20 chars, + // TODO 0 -> 11; time since I don't know when. It is time_sv = 4611686018427387914 + time_unix + // 12 -> 15; PID + // 16; PAUSE/RUN + // 17; UP/DOWN + // 18; TERM SIG + // 19; RUN/FINISH + // + // In this version, don't take in account the time. (char 0 -> 11) + + if ! status_option.is_ok() { + println!("ERROR, Unable to get supervise/status"); + return make_exit_code(exit_code); + } + + let mut status = match status_option { + Ok(file) => file, + Err(..) => { + println!("warning: {}: unable to open supervise/status: file does not exist", sv.clone()); + return make_exit_code(exit_code); + }, + }; + + let mut contents: Vec = Vec::new(); + let option_size = status.read_to_end(&mut contents); + + let size = match option_size { + Ok(size) => size, + Err(..) => { + println!("warning: {}: couldn't read supervise/status", sv.clone()); + return make_exit_code(exit_code); + }, + }; + + let time_buf: Vec = contents[0..12].to_vec(); + let pid_buf: Vec = contents[12..16].to_vec(); + + let pid: u32 = return_u8_in_u32(pid_buf.clone()); // PID OK + + let pause_run: u8 = contents[16]; // TODO function truc(contents) -> String + let up_down: u8 = contents[17]; // TODO function truc(contents) -> String + let term_sig: u8 = contents[18]; // TODO function truc(contents) -> String + let run_finish: u8 = contents[19]; // TODO function truc(contents) -> String + dbg!(contents); + dbg!(time_buf); + dbg!(pid_buf); + dbg!(pid); + + return exit_code; + +} fn sent_signal(exit_code: i32, svwait_var: i32, verbose: i8, command: &str, sv: String) -> i32 { @@ -10,12 +90,27 @@ fn sent_signal(exit_code: i32, svwait_var: i32, verbose: i8, command: &str, sv: let supervise_ok = Path::new("supervise/ok"); if ! supervise_ok.exists() { println!("warning: {}: unable to open supervise/ok: file does not exist", sv.clone()); - if exit_code < 99 { - return exit_code + 1; - } else { - return exit_code; - } + return make_exit_code(exit_code); } + + // execute command. + if command == "s" { + // case command is status + return exec_status(exit_code, sv); + } + + //let service = fs::OpenOptions::new().append(true).open("supervise/control"); + + //if ! service.is_ok() { + // println!("warning: {}: unable to append to supervise/control: file does not exist", sv.clone()); + // return make_exit_code(exit_code); + //} + //let mut control = match service { + // Ok(file) => file, + // Err(..) => panic!("Shouln't goes there, the programmer is trash."), + //}; + + // TODO // sent the proper signal to supervise/control // From 84622ce986afb57b3145e09c66fd1fd6449d6b41 Mon Sep 17 00:00:00 2001 From: primardj Date: Tue, 9 Apr 2024 00:40:01 +0100 Subject: [PATCH 07/14] split executor file in a lot of smaller files, make basic status function. --- 01_phase_rust_src/sv/src/executor.rs | 118 +----------------- .../sv/src/executor/sent_signal.rs | 42 +++++++ .../src/executor/sent_signal/exec_status.rs | 84 +++++++++++++ .../exec_status/make_normal_state.rs | 20 +++ .../sent_signal/exec_status/make_pause_run.rs | 9 ++ .../exec_status/make_run_finish.rs | 10 ++ .../sent_signal/exec_status/make_term_sig.rs | 10 ++ .../sent_signal/exec_status/make_up_down.rs | 11 ++ .../executor/sent_signal/make_exit_code.rs | 9 ++ .../executor/sent_signal/return_u8_in_u32.rs | 18 +++ .../executor/sent_signal/return_u8_in_u64.rs | 17 +++ 11 files changed, 233 insertions(+), 115 deletions(-) create mode 100644 01_phase_rust_src/sv/src/executor/sent_signal.rs create mode 100644 01_phase_rust_src/sv/src/executor/sent_signal/exec_status.rs create mode 100644 01_phase_rust_src/sv/src/executor/sent_signal/exec_status/make_normal_state.rs create mode 100644 01_phase_rust_src/sv/src/executor/sent_signal/exec_status/make_pause_run.rs create mode 100644 01_phase_rust_src/sv/src/executor/sent_signal/exec_status/make_run_finish.rs create mode 100644 01_phase_rust_src/sv/src/executor/sent_signal/exec_status/make_term_sig.rs create mode 100644 01_phase_rust_src/sv/src/executor/sent_signal/exec_status/make_up_down.rs create mode 100644 01_phase_rust_src/sv/src/executor/sent_signal/make_exit_code.rs create mode 100644 01_phase_rust_src/sv/src/executor/sent_signal/return_u8_in_u32.rs create mode 100644 01_phase_rust_src/sv/src/executor/sent_signal/return_u8_in_u64.rs diff --git a/01_phase_rust_src/sv/src/executor.rs b/01_phase_rust_src/sv/src/executor.rs index ae04033..0670440 100644 --- a/01_phase_rust_src/sv/src/executor.rs +++ b/01_phase_rust_src/sv/src/executor.rs @@ -1,122 +1,10 @@ -use std::fs; +pub mod sent_signal; + use std::path::Path; use std::env::set_current_dir; -use std::io::prelude::*; -fn make_exit_code(exit_code: i32) -> i32 { - if exit_code < 99 { - return exit_code + 1; - } else { - return exit_code; - } -} - -fn return_u8_in_u32(mut table: Vec) -> u32 { - // Table make 4 vector u8 in one u32 - if table.len() != 4 { - return 0 - } - let mut r: u32 = 0; - table.reverse(); - for i in table.iter() { - println!("{}",i); - r = r * 256; - r += >::into(*i); - } - return r -} - -fn exec_status(exit_code: i32, sv: String) -> i32 { - let status_option = fs::OpenOptions::new().read(true).open("supervise/status"); - - // works this way : - // 20 chars, - // TODO 0 -> 11; time since I don't know when. It is time_sv = 4611686018427387914 + time_unix - // 12 -> 15; PID - // 16; PAUSE/RUN - // 17; UP/DOWN - // 18; TERM SIG - // 19; RUN/FINISH - // - // In this version, don't take in account the time. (char 0 -> 11) - - if ! status_option.is_ok() { - println!("ERROR, Unable to get supervise/status"); - return make_exit_code(exit_code); - } - - let mut status = match status_option { - Ok(file) => file, - Err(..) => { - println!("warning: {}: unable to open supervise/status: file does not exist", sv.clone()); - return make_exit_code(exit_code); - }, - }; - - let mut contents: Vec = Vec::new(); - let option_size = status.read_to_end(&mut contents); - - let size = match option_size { - Ok(size) => size, - Err(..) => { - println!("warning: {}: couldn't read supervise/status", sv.clone()); - return make_exit_code(exit_code); - }, - }; - - let time_buf: Vec = contents[0..12].to_vec(); - let pid_buf: Vec = contents[12..16].to_vec(); - - let pid: u32 = return_u8_in_u32(pid_buf.clone()); // PID OK - - let pause_run: u8 = contents[16]; // TODO function truc(contents) -> String - let up_down: u8 = contents[17]; // TODO function truc(contents) -> String - let term_sig: u8 = contents[18]; // TODO function truc(contents) -> String - let run_finish: u8 = contents[19]; // TODO function truc(contents) -> String - dbg!(contents); - dbg!(time_buf); - dbg!(pid_buf); - dbg!(pid); - - return exit_code; - -} - -fn sent_signal(exit_code: i32, svwait_var: i32, verbose: i8, command: &str, sv: String) -> i32 { - - // Check if supervise/ok exist. - let supervise_ok = Path::new("supervise/ok"); - if ! supervise_ok.exists() { - println!("warning: {}: unable to open supervise/ok: file does not exist", sv.clone()); - return make_exit_code(exit_code); - } - - // execute command. - if command == "s" { - // case command is status - return exec_status(exit_code, sv); - } - - //let service = fs::OpenOptions::new().append(true).open("supervise/control"); - - //if ! service.is_ok() { - // println!("warning: {}: unable to append to supervise/control: file does not exist", sv.clone()); - // return make_exit_code(exit_code); - //} - //let mut control = match service { - // Ok(file) => file, - // Err(..) => panic!("Shouln't goes there, the programmer is trash."), - //}; - - - // TODO - // sent the proper signal to supervise/control - // - // if verbose = 1, wait for the service to reach the proper state or timeout. - return exit_code; -} pub fn execute(svdir_var: String, svwait_var: i32, verbose: i8, command: &str, services: Vec) -> i32{ println!("execute in exec"); @@ -149,7 +37,7 @@ pub fn execute(svdir_var: String, svwait_var: i32, verbose: i8, command: &str, s if set_current_dir(path_to_sv).is_ok() { // Call the change in the service. - exit_code = sent_signal(exit_code, svwait_var, verbose, command, sv); + exit_code = sent_signal::sent_signal(exit_code, svwait_var, verbose, command, sv); } else { println!("fail: {}: unable to change to service directory: file does not exist", sv); if exit_code < 99 { diff --git a/01_phase_rust_src/sv/src/executor/sent_signal.rs b/01_phase_rust_src/sv/src/executor/sent_signal.rs new file mode 100644 index 0000000..d24dc96 --- /dev/null +++ b/01_phase_rust_src/sv/src/executor/sent_signal.rs @@ -0,0 +1,42 @@ + + +pub mod exec_status; +pub mod make_exit_code; +pub mod return_u8_in_u32; +pub mod return_u8_in_u64; + +use std::path::Path; + +pub fn sent_signal(exit_code: i32, svwait_var: i32, verbose: i8, command: &str, sv: String) -> i32 { + + // Check if supervise/ok exist. + let supervise_ok = Path::new("supervise/ok"); + if ! supervise_ok.exists() { + println!("warning: {}: unable to open supervise/ok: file does not exist", sv.clone()); + return make_exit_code::make_exit_code(exit_code); + } + + // execute command. + if command == "s" { + // case command is status + return exec_status::exec_status(exit_code, sv); + } + + //let service = fs::OpenOptions::new().append(true).open("supervise/control"); + + //if ! service.is_ok() { + // println!("warning: {}: unable to append to supervise/control: file does not exist", sv.clone()); + // return make_exit_code(exit_code); + //} + //let mut control = match service { + // Ok(file) => file, + // Err(..) => panic!("Shouln't goes there, the programmer is trash."), + //}; + + + // TODO + // sent the proper signal to supervise/control + // + // if verbose = 1, wait for the service to reach the proper state or timeout. + return exit_code; +} diff --git a/01_phase_rust_src/sv/src/executor/sent_signal/exec_status.rs b/01_phase_rust_src/sv/src/executor/sent_signal/exec_status.rs new file mode 100644 index 0000000..1894cc8 --- /dev/null +++ b/01_phase_rust_src/sv/src/executor/sent_signal/exec_status.rs @@ -0,0 +1,84 @@ + +mod make_pause_run; +mod make_run_finish; +mod make_term_sig; +mod make_up_down; +mod make_normal_state; + +use crate::executor::sent_signal::make_exit_code::make_exit_code; +use crate::executor::sent_signal::return_u8_in_u32::return_u8_in_u32; +use crate::executor::sent_signal::return_u8_in_u64::return_u8_in_u64; + +use std::fs; +use std::io::prelude::*; + + +pub fn exec_status(exit_code: i32, sv: String) -> i32 { + let status_option = fs::OpenOptions::new().read(true).open("supervise/status"); + + // works this way : + // 20 chars, + // TODO 0 -> 11; time since I don't know when. It is time_sv = 4611686018427387914 + time_unix + // TODO + // TODO seams to be 0 -> 7 time, 7 -> 11 uknown. + // 12 -> 15; PID + // 16; PAUSE/RUN + // 17; UP/DOWN + // 18; TERM SIG + // 19; RUN/FINISH + // + // In this version, don't take in account the time. (char 0 -> 11) + + if ! status_option.is_ok() { + println!("ERROR, Unable to get supervise/status"); + return make_exit_code(exit_code); + } + + let mut status = match status_option { + Ok(file) => file, + Err(..) => { + println!("warning: {}: unable to open supervise/status: file does not exist", sv.clone()); + return make_exit_code(exit_code); + }, + }; + + let mut contents: Vec = Vec::new(); + let option_size = status.read_to_end(&mut contents); + + let size = match option_size { + Ok(size) => size, + Err(..) => { + println!("warning: {}: couldn't read supervise/status", sv.clone()); + return make_exit_code(exit_code); + }, + }; + + let time_buf: Vec = contents[0..8].to_vec(); + let uknown_buf: Vec = contents[8..12].to_vec(); // TODO + let pid_buf: Vec = contents[12..16].to_vec(); + let time = return_u8_in_u64(time_buf); // TODO: correct the unsigned/signed bug. + + let pid: u32 = return_u8_in_u32(pid_buf.clone()); + + let pause_run = make_pause_run::mpr(contents[16]); + let up_down = make_up_down::mud(contents[17]); + let term_sig = make_term_sig::mts(contents[18]); + let run_finish = make_run_finish::mrf(contents[19]); + + let normal_state = make_normal_state::mns(contents[19]); + dbg!(contents); + //dbg!(time_buf); + + dbg!(pause_run); + dbg!(up_down); + dbg!(term_sig); + + if pid != 0 { + println!("{run_finish}{sv}: (pid {pid}) {time}s{normal_state}"); + } else { + println!("{run_finish}{sv}: {time}s{normal_state}"); + } + + return exit_code; + +} diff --git a/01_phase_rust_src/sv/src/executor/sent_signal/exec_status/make_normal_state.rs b/01_phase_rust_src/sv/src/executor/sent_signal/exec_status/make_normal_state.rs new file mode 100644 index 0000000..0888462 --- /dev/null +++ b/01_phase_rust_src/sv/src/executor/sent_signal/exec_status/make_normal_state.rs @@ -0,0 +1,20 @@ + + +use std::path::Path; + +pub fn mns(actual_state: u8) -> &'static str { + let down_option = Path::new("down"); + if down_option.exists() { + if actual_state == 0 { + return ""; + } else { + return ", normally down"; + } + } else { + if actual_state == 0 { + return ", normally up"; + } else { + return ""; + } + } +} diff --git a/01_phase_rust_src/sv/src/executor/sent_signal/exec_status/make_pause_run.rs b/01_phase_rust_src/sv/src/executor/sent_signal/exec_status/make_pause_run.rs new file mode 100644 index 0000000..8947416 --- /dev/null +++ b/01_phase_rust_src/sv/src/executor/sent_signal/exec_status/make_pause_run.rs @@ -0,0 +1,9 @@ + + +pub fn mpr(pause_run_int: u8) -> &'static str { + if pause_run_int == 0 { + return "" + } else { + return ", paused" + } +} diff --git a/01_phase_rust_src/sv/src/executor/sent_signal/exec_status/make_run_finish.rs b/01_phase_rust_src/sv/src/executor/sent_signal/exec_status/make_run_finish.rs new file mode 100644 index 0000000..bf9bb83 --- /dev/null +++ b/01_phase_rust_src/sv/src/executor/sent_signal/exec_status/make_run_finish.rs @@ -0,0 +1,10 @@ + + + +pub fn mrf(run_finish_int: u8) -> &'static str { + if run_finish_int == 0 { + return "down: " + } else { + return "run: " + } +} diff --git a/01_phase_rust_src/sv/src/executor/sent_signal/exec_status/make_term_sig.rs b/01_phase_rust_src/sv/src/executor/sent_signal/exec_status/make_term_sig.rs new file mode 100644 index 0000000..a2ac9a1 --- /dev/null +++ b/01_phase_rust_src/sv/src/executor/sent_signal/exec_status/make_term_sig.rs @@ -0,0 +1,10 @@ + + + +pub fn mts(term_sig_int: u8) -> &'static str { + if term_sig_int == 0 { + return "" + } else { + return ", got TERM" + } +} diff --git a/01_phase_rust_src/sv/src/executor/sent_signal/exec_status/make_up_down.rs b/01_phase_rust_src/sv/src/executor/sent_signal/exec_status/make_up_down.rs new file mode 100644 index 0000000..491cc41 --- /dev/null +++ b/01_phase_rust_src/sv/src/executor/sent_signal/exec_status/make_up_down.rs @@ -0,0 +1,11 @@ + + +pub fn mud(up_down_int: u8) -> &'static str { + if up_down_int == 117 { + return ", want up" + } else { + return ", want down" + } +} + + diff --git a/01_phase_rust_src/sv/src/executor/sent_signal/make_exit_code.rs b/01_phase_rust_src/sv/src/executor/sent_signal/make_exit_code.rs new file mode 100644 index 0000000..f2d832b --- /dev/null +++ b/01_phase_rust_src/sv/src/executor/sent_signal/make_exit_code.rs @@ -0,0 +1,9 @@ + +pub fn make_exit_code(exit_code: i32) -> i32 { + if exit_code < 99 { + return exit_code + 1; + } else { + return exit_code; + } +} + diff --git a/01_phase_rust_src/sv/src/executor/sent_signal/return_u8_in_u32.rs b/01_phase_rust_src/sv/src/executor/sent_signal/return_u8_in_u32.rs new file mode 100644 index 0000000..7365603 --- /dev/null +++ b/01_phase_rust_src/sv/src/executor/sent_signal/return_u8_in_u32.rs @@ -0,0 +1,18 @@ + + + +pub fn return_u8_in_u32(mut table: Vec) -> u32 { + // Table make 4 vector u8 in one u32 + if table.len() != 4 { + return 0 + } + let mut r: u32 = 0; + table.reverse(); + for i in table.iter() { + //println!("{}",i); + r = r * 256; + r += >::into(*i); + } + return r +} + diff --git a/01_phase_rust_src/sv/src/executor/sent_signal/return_u8_in_u64.rs b/01_phase_rust_src/sv/src/executor/sent_signal/return_u8_in_u64.rs new file mode 100644 index 0000000..b6a1176 --- /dev/null +++ b/01_phase_rust_src/sv/src/executor/sent_signal/return_u8_in_u64.rs @@ -0,0 +1,17 @@ + + +pub fn return_u8_in_u64(mut table: Vec) -> u64 { + // Table make 4 vector u8 in one u32 + if table.len() != 8 { + return 0 + } + let mut r: u64 = 0; + table.reverse(); + for i in table.iter() { + //println!("{}",i); + r = r * 256; + r += >::into(*i); + } + return r +} + From 2a11b44fe122a0c6c6fb9f47180dcea03b79bc33 Mon Sep 17 00:00:00 2001 From: primardj Date: Wed, 10 Apr 2024 23:14:38 +0100 Subject: [PATCH 08/14] create struct status_obj --- .../sv/src/executor/sent_signal/exec_status.rs | 2 +- 01_phase_rust_src/sv/src/status_obj.rs | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 01_phase_rust_src/sv/src/status_obj.rs diff --git a/01_phase_rust_src/sv/src/executor/sent_signal/exec_status.rs b/01_phase_rust_src/sv/src/executor/sent_signal/exec_status.rs index 1894cc8..0992d35 100644 --- a/01_phase_rust_src/sv/src/executor/sent_signal/exec_status.rs +++ b/01_phase_rust_src/sv/src/executor/sent_signal/exec_status.rs @@ -20,7 +20,7 @@ pub fn exec_status(exit_code: i32, sv: String) -> i32 { // 20 chars, // TODO 0 -> 11; time since I don't know when. It is time_sv = 4611686018427387914 + time_unix // TODO - // TODO seams to be 0 -> 7 time, 7 -> 11 uknown. + // TODO seams to be 0 -> 7 time, 7 -> 11 nano seconds.. // 12 -> 15; PID // 16; PAUSE/RUN // 17; UP/DOWN diff --git a/01_phase_rust_src/sv/src/status_obj.rs b/01_phase_rust_src/sv/src/status_obj.rs new file mode 100644 index 0000000..990cefa --- /dev/null +++ b/01_phase_rust_src/sv/src/status_obj.rs @@ -0,0 +1,13 @@ + + +pub struct Status_obj { + time: u64, // 0 -> 7 + nano_seconds: u32, // 8 -> 11 + pid: u32, // 12 -> 15 + pause_run: bool, // 16 + up_down: bool, // 17 + term_sig: bool, // 18 + run_finish: bool, // 19 + is_down: bool, // down file + log_exists: bool, // is log folder exists ? +} From a6debb3e51fb8907ebbd0c00eefeeab3afeaa549 Mon Sep 17 00:00:00 2001 From: primardj Date: Thu, 11 Apr 2024 00:17:51 +0100 Subject: [PATCH 09/14] add new method to Status_obj --- .../executor/sent_signal/return_u8_in_u64.rs | 2 +- 01_phase_rust_src/sv/src/status_obj.rs | 150 +++++++++++++++++- 2 files changed, 148 insertions(+), 4 deletions(-) diff --git a/01_phase_rust_src/sv/src/executor/sent_signal/return_u8_in_u64.rs b/01_phase_rust_src/sv/src/executor/sent_signal/return_u8_in_u64.rs index b6a1176..5a4b666 100644 --- a/01_phase_rust_src/sv/src/executor/sent_signal/return_u8_in_u64.rs +++ b/01_phase_rust_src/sv/src/executor/sent_signal/return_u8_in_u64.rs @@ -1,7 +1,7 @@ pub fn return_u8_in_u64(mut table: Vec) -> u64 { - // Table make 4 vector u8 in one u32 + // Table make 4 vector u8 in one u64 if table.len() != 8 { return 0 } diff --git a/01_phase_rust_src/sv/src/status_obj.rs b/01_phase_rust_src/sv/src/status_obj.rs index 990cefa..0292f29 100644 --- a/01_phase_rust_src/sv/src/status_obj.rs +++ b/01_phase_rust_src/sv/src/status_obj.rs @@ -1,13 +1,157 @@ +use std::path::Path; pub struct Status_obj { + svname: String, // Service name + svpath: Path, // Service path time: u64, // 0 -> 7 nano_seconds: u32, // 8 -> 11 pid: u32, // 12 -> 15 pause_run: bool, // 16 - up_down: bool, // 17 + up_down: char, // 17 term_sig: bool, // 18 run_finish: bool, // 19 - is_down: bool, // down file - log_exists: bool, // is log folder exists ? + down: bool, // is down file ? + log: bool, // is log/supervise/ok exists ? +} + +impl Status_obj { + pub fn new(path: Path, sv: String ) -> Option { + // if error when making the status_obj, return None, + // Else, return the status_obj. + if ! set_current_dir(path).is_ok() { + println!("fail: {}: unable to change to service directory: file does not exist", sv); + return None + } + let status_option = fs::OpenOptions::new().read(true).open("supervise/status"); + let mut status match status_option { + Ok(file) => file, + Err(..) => { + println!("warning: {}: unable to open supervise/status: file does not exist", sv); + return None; + }, + }; + let mut contents: Vec = Vec::new(); + let option_size = status.read_to_end(&mut contents); + + let size = match option_size { + Ok(size) => size, + Err(..) => { + println!("warning: {}: couldn't read supervise/status", sv); + return None + }, + }; + + if size != 20 { + println!("warning: {}: bad supervise/status format", sv); + return None + } + + let is_down; + if Path::new("down").exists() { + is_down = true + } else { + is_down = false + } + + let log_exists; + if Path::new("log/supervise/ok").exists() { + log_exists = true + } else { + log_exists = false + } + + let time_buf: Vec = contents[0..8].to_vec(); + let nano_buf: Vec = contents[8..12].to_vec(); + let pid_buf: Vec = contents[12..16].to_vec(); + + let seconds = return_u8_in_u64(time_buf); + let nano = return_u8_in_u32(nano_buf); + let pid_found = return_u8_in_u32(pid_buf); + + let pause_run_raw = make_pause_run(contents[16]); // done + let up_down_raw = make_up_down(contents[17]); // done + let term_sig_raw = make_term_sig(contents[18]); // done + let run_finish_raw = make_run_finish(contents[19]); // done + + Status_obj { + svname: sv, + svpath: path, + time: seconds, + nano_seconds: nano, + pid: pid_found, + pause_run: pause_run_raw, + up_down: up_down_raw, + term_sig: term_sig_raw, + run_finish: run_finish_raw, + down: is_down, + log: log_exists, + } + } + pub fn print_status(&mut self) { + println!("Ta gueule."); + } +} + + +fn make_pause_run(pr_int: u8) -> bool { + if pr_int == 0 { + return false // run + } else { + return true // pause. + } +} + +fn make_up_down(ud_int: u8) -> char { + if ud_int == 117 { + return 'u' + } else { + return 'd' + } +} + +fn make_term_sig(ts_int: u8) -> bool{ + if ts_int == 0 { + return false // Normal + } else { + return true // Got Term + } +} + +fn make_run_finish(rf_int: u8) -> bool { + if rf_int == 0 { + return false // service finish. + } else { + return true // service run + } +} + +fn return_u8_in_u32(mut table: Vec) -> u32 { + // Table make 4 values u8 in one u32 + if table.len() != 4 { + return 0 + } + let mut r: u32 = 0; + table.reverse(); + for i in table.iter() { + //println!("{}",i); + r = r * 256; + r += >::into(*i); + } + return r +} + +fn return_u8_in_u64(mut table: Vec) -> u64 { + // Table make 8 values u8 in one u64 + if table.len() != 8 { + return 0 + } + let mut r: u64 = 0; + table.reverse(); + for i in table.iter() { + //println!("{}",i); + r = r * 256; + r += >::into(*i); + } + return r } From 940f2957e3239142ed776a6b351eb4376589d49c Mon Sep 17 00:00:00 2001 From: primardj Date: Thu, 11 Apr 2024 13:30:59 +0100 Subject: [PATCH 10/14] add log function, and join the new object to replaces all thoses stupids functions. The arn't removed yet. --- 01_phase_rust_src/sv/src/executor.rs | 37 +++-- .../sv/src/executor/sent_signal.rs | 46 ++++-- 01_phase_rust_src/sv/src/main.rs | 1 + 01_phase_rust_src/sv/src/status_obj.rs | 131 +++++++----------- 01_phase_rust_src/sv/src/status_obj/misc.rs | 62 +++++++++ 5 files changed, 173 insertions(+), 104 deletions(-) create mode 100644 01_phase_rust_src/sv/src/status_obj/misc.rs diff --git a/01_phase_rust_src/sv/src/executor.rs b/01_phase_rust_src/sv/src/executor.rs index 0670440..74a7dc1 100644 --- a/01_phase_rust_src/sv/src/executor.rs +++ b/01_phase_rust_src/sv/src/executor.rs @@ -2,8 +2,7 @@ pub mod sent_signal; -use std::path::Path; -use std::env::set_current_dir; +use crate::status_obj; pub fn execute(svdir_var: String, svwait_var: i32, verbose: i8, command: &str, services: Vec) -> i32{ @@ -31,19 +30,33 @@ pub fn execute(svdir_var: String, svwait_var: i32, verbose: i8, command: &str, s path = svdir_var.clone() + "/" + &sv; } + 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; + } + + }, + }; + + // 1. Check if path exists. // - let path_to_sv = Path::new(&path); + //let path_to_sv = Path::new(&path); - if set_current_dir(path_to_sv).is_ok() { - // Call the change in the service. - exit_code = sent_signal::sent_signal(exit_code, svwait_var, verbose, command, sv); - } else { - println!("fail: {}: unable to change to service directory: file does not exist", sv); - if exit_code < 99 { - exit_code += 1; - } - } + //if set_current_dir(path_to_sv).is_ok() { + // // Call the change in the service. + // exit_code = sent_signal::sent_signal(exit_code, svwait_var, verbose, command, sv); + //} else { + // println!("fail: {}: unable to change to service directory: file does not exist", sv); + // if exit_code < 99 { + // exit_code += 1; + // } + //} } diff --git a/01_phase_rust_src/sv/src/executor/sent_signal.rs b/01_phase_rust_src/sv/src/executor/sent_signal.rs index d24dc96..0d57a55 100644 --- a/01_phase_rust_src/sv/src/executor/sent_signal.rs +++ b/01_phase_rust_src/sv/src/executor/sent_signal.rs @@ -1,25 +1,42 @@ -pub mod exec_status; -pub mod make_exit_code; -pub mod return_u8_in_u32; -pub mod return_u8_in_u64; +//pub mod exec_status; +//pub mod make_exit_code; +//pub mod return_u8_in_u32; +//pub mod return_u8_in_u64; -use std::path::Path; +use crate::status_obj; -pub fn sent_signal(exit_code: i32, svwait_var: i32, verbose: i8, command: &str, sv: String) -> i32 { - +//use std::path::Path; + +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. // Check if supervise/ok exist. - let supervise_ok = Path::new("supervise/ok"); - if ! supervise_ok.exists() { - println!("warning: {}: unable to open supervise/ok: file does not exist", sv.clone()); - return make_exit_code::make_exit_code(exit_code); - } + + //let supervise_ok = Path::new("supervise/ok"); + //if ! supervise_ok.exists() { + // println!("warning: {}: unable to open supervise/ok: file does not exist", sv.clone()); + // return make_exit_code::make_exit_code(exit_code); + //} // execute command. if command == "s" { // case command is status - return exec_status::exec_status(exit_code, sv); + 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; + } //let service = fs::OpenOptions::new().append(true).open("supervise/control"); @@ -38,5 +55,6 @@ pub fn sent_signal(exit_code: i32, svwait_var: i32, verbose: i8, command: &str, // sent the proper signal to supervise/control // // if verbose = 1, wait for the service to reach the proper state or timeout. - return exit_code; + println!("Error, command not implemented."); + return 1; } diff --git a/01_phase_rust_src/sv/src/main.rs b/01_phase_rust_src/sv/src/main.rs index 1cad543..66f78d3 100644 --- a/01_phase_rust_src/sv/src/main.rs +++ b/01_phase_rust_src/sv/src/main.rs @@ -1,6 +1,7 @@ mod parser; mod executor; +pub mod status_obj; use std::env; use std::process::exit; diff --git a/01_phase_rust_src/sv/src/status_obj.rs b/01_phase_rust_src/sv/src/status_obj.rs index 0292f29..3b808a2 100644 --- a/01_phase_rust_src/sv/src/status_obj.rs +++ b/01_phase_rust_src/sv/src/status_obj.rs @@ -1,9 +1,14 @@ +mod misc; + use std::path::Path; +use std::env::set_current_dir; +use std::fs; +use std::io::prelude::*; -pub struct Status_obj { +pub struct StatusObj { svname: String, // Service name - svpath: Path, // Service path + svpath: String, // Service path time: u64, // 0 -> 7 nano_seconds: u32, // 8 -> 11 pid: u32, // 12 -> 15 @@ -15,16 +20,25 @@ pub struct Status_obj { log: bool, // is log/supervise/ok exists ? } -impl Status_obj { - pub fn new(path: Path, sv: String ) -> Option { +impl StatusObj { + pub fn new(path_string: String, sv: String ) -> Option { // if error when making the status_obj, return None, // Else, return the status_obj. + // + + let path = Path::new(&path_string); + if ! set_current_dir(path).is_ok() { println!("fail: {}: unable to change to service directory: file does not exist", sv); return None } + let ok_option = Path::new("supervise/ok"); + if ! ok_option.exists() { + println!("warning: {}: unable to open supervise/ok: file does not exist", sv); + return None; + } let status_option = fs::OpenOptions::new().read(true).open("supervise/status"); - let mut status match status_option { + let mut status = match status_option { Ok(file) => file, Err(..) => { println!("warning: {}: unable to open supervise/status: file does not exist", sv); @@ -65,18 +79,18 @@ impl Status_obj { let nano_buf: Vec = contents[8..12].to_vec(); let pid_buf: Vec = contents[12..16].to_vec(); - let seconds = return_u8_in_u64(time_buf); - let nano = return_u8_in_u32(nano_buf); - let pid_found = return_u8_in_u32(pid_buf); + let seconds = misc::return_u8_in_u64(time_buf); + let nano = misc::return_u8_in_u32(nano_buf); + let pid_found = misc::return_u8_in_u32(pid_buf); - let pause_run_raw = make_pause_run(contents[16]); // done - let up_down_raw = make_up_down(contents[17]); // done - let term_sig_raw = make_term_sig(contents[18]); // done - let run_finish_raw = make_run_finish(contents[19]); // done + let pause_run_raw = misc::make_pause_run(contents[16]); // done + let up_down_raw = misc::make_up_down(contents[17]); // done + let term_sig_raw = misc::make_term_sig(contents[18]); // done + let run_finish_raw = misc::make_run_finish(contents[19]); // done - Status_obj { + Some(StatusObj { svname: sv, - svpath: path, + svpath: path_string, time: seconds, nano_seconds: nano, pid: pid_found, @@ -86,72 +100,33 @@ impl Status_obj { run_finish: run_finish_raw, down: is_down, log: log_exists, - } + }) } - pub fn print_status(&mut self) { - println!("Ta gueule."); + pub fn get_status_string(&mut self) -> String { + dbg!(&self.svname); + dbg!(&self.svpath); + dbg!(self.time); + dbg!(self.nano_seconds); + dbg!(self.pid); + dbg!(self.pause_run); + dbg!(self.up_down); + dbg!(self.term_sig); + dbg!(self.run_finish); + dbg!(self.down); + dbg!(self.log); + + // TODO + + return "Ta gueule".to_string(); + } + + pub fn get_log(&mut self) -> bool { + return self.log; + } + + pub fn get_obj_log(&mut self) -> Option { + return StatusObj::new(self.svpath.clone() + "/log", "log".to_string()); } } -fn make_pause_run(pr_int: u8) -> bool { - if pr_int == 0 { - return false // run - } else { - return true // pause. - } -} - -fn make_up_down(ud_int: u8) -> char { - if ud_int == 117 { - return 'u' - } else { - return 'd' - } -} - -fn make_term_sig(ts_int: u8) -> bool{ - if ts_int == 0 { - return false // Normal - } else { - return true // Got Term - } -} - -fn make_run_finish(rf_int: u8) -> bool { - if rf_int == 0 { - return false // service finish. - } else { - return true // service run - } -} - -fn return_u8_in_u32(mut table: Vec) -> u32 { - // Table make 4 values u8 in one u32 - if table.len() != 4 { - return 0 - } - let mut r: u32 = 0; - table.reverse(); - for i in table.iter() { - //println!("{}",i); - r = r * 256; - r += >::into(*i); - } - return r -} - -fn return_u8_in_u64(mut table: Vec) -> u64 { - // Table make 8 values u8 in one u64 - if table.len() != 8 { - return 0 - } - let mut r: u64 = 0; - table.reverse(); - for i in table.iter() { - //println!("{}",i); - r = r * 256; - r += >::into(*i); - } - return r -} diff --git a/01_phase_rust_src/sv/src/status_obj/misc.rs b/01_phase_rust_src/sv/src/status_obj/misc.rs new file mode 100644 index 0000000..815793a --- /dev/null +++ b/01_phase_rust_src/sv/src/status_obj/misc.rs @@ -0,0 +1,62 @@ + +pub fn make_pause_run(pr_int: u8) -> bool { + if pr_int == 0 { + return false // run + } else { + return true // pause. + } +} + +pub fn make_up_down(ud_int: u8) -> char { + if ud_int == 117 { + return 'u' + } else { + return 'd' + } +} + +pub fn make_term_sig(ts_int: u8) -> bool{ + if ts_int == 0 { + return false // Normal + } else { + return true // Got Term + } +} + +pub fn make_run_finish(rf_int: u8) -> bool { + if rf_int == 0 { + return false // service finish. + } else { + return true // service run + } +} + +pub fn return_u8_in_u32(mut table: Vec) -> u32 { + // Table make 4 values u8 in one u32 + if table.len() != 4 { + return 0 + } + let mut r: u32 = 0; + table.reverse(); + for i in table.iter() { + //println!("{}",i); + r = r * 256; + r += >::into(*i); + } + return r +} + +pub fn return_u8_in_u64(mut table: Vec) -> u64 { + // Table make 8 values u8 in one u64 + if table.len() != 8 { + return 0 + } + let mut r: u64 = 0; + table.reverse(); + for i in table.iter() { + //println!("{}",i); + r = r * 256; + r += >::into(*i); + } + return r +} From 28fb89caee5046c2d3ccc66c69f98d7c7d33c9d3 Mon Sep 17 00:00:00 2001 From: primardj Date: Thu, 11 Apr 2024 17:08:36 +0100 Subject: [PATCH 11/14] add print for each services asked. --- 01_phase_rust_src/sv/src/status_obj.rs | 35 +++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/01_phase_rust_src/sv/src/status_obj.rs b/01_phase_rust_src/sv/src/status_obj.rs index 3b808a2..c8825d9 100644 --- a/01_phase_rust_src/sv/src/status_obj.rs +++ b/01_phase_rust_src/sv/src/status_obj.rs @@ -103,21 +103,48 @@ impl StatusObj { }) } pub fn get_status_string(&mut self) -> String { - dbg!(&self.svname); + //dbg!(&self.svname); dbg!(&self.svpath); dbg!(self.time); dbg!(self.nano_seconds); - dbg!(self.pid); + //dbg!(self.pid); dbg!(self.pause_run); dbg!(self.up_down); dbg!(self.term_sig); - dbg!(self.run_finish); + //dbg!(self.run_finish); dbg!(self.down); dbg!(self.log); // TODO + let status_sv; + let pid_string: String; + let down_string; + if self.run_finish == false { + status_sv = "down:"; + pid_string = "".to_owned(); + if self.down == false { + down_string = ", normally up"; + } else { + down_string = ""; + } + } else { + status_sv = "run:"; + pid_string = "(pid ".to_owned() + &self.pid.to_string() + ") "; + if self.down == true { + down_string = ", normally down"; + } else { + down_string = ""; + } + } - return "Ta gueule".to_string(); + let time_repaired: u64 = self.time; // TODO, change it to make the real tim eappear, of + // change misc::return_u8_in_u64 + + + // Make return string with what made upper there. + let return_string: String = status_sv.to_owned() + " " + &self.svname + ": " + &pid_string + &time_repaired.to_string() + "s" + down_string; + + return return_string; } pub fn get_log(&mut self) -> bool { From a4ee3033b0490b556b2d75562944d1f76b2622a9 Mon Sep 17 00:00:00 2001 From: primardj Date: Thu, 11 Apr 2024 17:45:35 +0100 Subject: [PATCH 12/14] add status_time --- 01_phase_rust_src/sv/src/status_obj.rs | 14 ++++++++++---- 01_phase_rust_src/sv/src/status_obj/misc.rs | 18 ++++++++++++++++-- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/01_phase_rust_src/sv/src/status_obj.rs b/01_phase_rust_src/sv/src/status_obj.rs index c8825d9..d25d712 100644 --- a/01_phase_rust_src/sv/src/status_obj.rs +++ b/01_phase_rust_src/sv/src/status_obj.rs @@ -5,6 +5,7 @@ use std::path::Path; use std::env::set_current_dir; use std::fs; use std::io::prelude::*; +use std::time::SystemTime; pub struct StatusObj { svname: String, // Service name @@ -81,7 +82,7 @@ impl StatusObj { let seconds = misc::return_u8_in_u64(time_buf); let nano = misc::return_u8_in_u32(nano_buf); - let pid_found = misc::return_u8_in_u32(pid_buf); + let pid_found = misc::return_reverse_u8_in_u32(pid_buf); let pause_run_raw = misc::make_pause_run(contents[16]); // done let up_down_raw = misc::make_up_down(contents[17]); // done @@ -137,12 +138,17 @@ impl StatusObj { } } - let time_repaired: u64 = self.time; // TODO, change it to make the real tim eappear, of - // change misc::return_u8_in_u64 + 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 { + Ok(x) => x.as_secs(), + Err(..) => time_repaired, + }; + let dif_time = sys_time - time_repaired; // Make return string with what made upper there. - let return_string: String = status_sv.to_owned() + " " + &self.svname + ": " + &pid_string + &time_repaired.to_string() + "s" + down_string; + let return_string: String = status_sv.to_owned() + " " + &self.svname + ": " + &pid_string + &dif_time.to_string() + "s" + down_string; return return_string; } diff --git a/01_phase_rust_src/sv/src/status_obj/misc.rs b/01_phase_rust_src/sv/src/status_obj/misc.rs index 815793a..c8dc602 100644 --- a/01_phase_rust_src/sv/src/status_obj/misc.rs +++ b/01_phase_rust_src/sv/src/status_obj/misc.rs @@ -31,7 +31,7 @@ pub fn make_run_finish(rf_int: u8) -> bool { } } -pub fn return_u8_in_u32(mut table: Vec) -> u32 { +pub fn return_reverse_u8_in_u32(mut table: Vec) -> u32 { // Table make 4 values u8 in one u32 if table.len() != 4 { return 0 @@ -46,13 +46,26 @@ pub fn return_u8_in_u32(mut table: Vec) -> u32 { return r } +pub fn return_u8_in_u32(mut table: Vec) -> u32 { + // Table make 4 values u8 in one u32 + if table.len() != 4 { + return 0 + } + let mut r: u32 = 0; + for i in table.iter() { + //println!("{}",i); + r = r * 256; + r += >::into(*i); + } + return r +} + pub fn return_u8_in_u64(mut table: Vec) -> u64 { // Table make 8 values u8 in one u64 if table.len() != 8 { return 0 } let mut r: u64 = 0; - table.reverse(); for i in table.iter() { //println!("{}",i); r = r * 256; @@ -60,3 +73,4 @@ pub fn return_u8_in_u64(mut table: Vec) -> u64 { } return r } + From 37783dffe725c47d8fbf123dc31bdb5b236a5bbb Mon Sep 17 00:00:00 2001 From: primardj Date: Thu, 11 Apr 2024 20:28:58 +0100 Subject: [PATCH 13/14] suppress alot of useless files. --- 01_phase_rust_src/sv/src/executor.rs | 24 ------ .../sv/src/executor/sent_signal.rs | 16 +--- .../src/executor/sent_signal/exec_status.rs | 84 ------------------- .../exec_status/make_normal_state.rs | 20 ----- .../sent_signal/exec_status/make_pause_run.rs | 9 -- .../exec_status/make_run_finish.rs | 10 --- .../sent_signal/exec_status/make_term_sig.rs | 10 --- .../sent_signal/exec_status/make_up_down.rs | 11 --- .../executor/sent_signal/make_exit_code.rs | 9 -- .../executor/sent_signal/return_u8_in_u32.rs | 18 ---- .../executor/sent_signal/return_u8_in_u64.rs | 17 ---- 01_phase_rust_src/sv/src/parser.rs | 6 +- 01_phase_rust_src/sv/src/status_obj.rs | 4 +- 01_phase_rust_src/sv/src/status_obj/misc.rs | 7 +- 14 files changed, 7 insertions(+), 238 deletions(-) delete mode 100644 01_phase_rust_src/sv/src/executor/sent_signal/exec_status.rs delete mode 100644 01_phase_rust_src/sv/src/executor/sent_signal/exec_status/make_normal_state.rs delete mode 100644 01_phase_rust_src/sv/src/executor/sent_signal/exec_status/make_pause_run.rs delete mode 100644 01_phase_rust_src/sv/src/executor/sent_signal/exec_status/make_run_finish.rs delete mode 100644 01_phase_rust_src/sv/src/executor/sent_signal/exec_status/make_term_sig.rs delete mode 100644 01_phase_rust_src/sv/src/executor/sent_signal/exec_status/make_up_down.rs delete mode 100644 01_phase_rust_src/sv/src/executor/sent_signal/make_exit_code.rs delete mode 100644 01_phase_rust_src/sv/src/executor/sent_signal/return_u8_in_u32.rs delete mode 100644 01_phase_rust_src/sv/src/executor/sent_signal/return_u8_in_u64.rs diff --git a/01_phase_rust_src/sv/src/executor.rs b/01_phase_rust_src/sv/src/executor.rs index 74a7dc1..eae1327 100644 --- a/01_phase_rust_src/sv/src/executor.rs +++ b/01_phase_rust_src/sv/src/executor.rs @@ -4,13 +4,7 @@ pub mod sent_signal; use crate::status_obj; - pub fn execute(svdir_var: String, svwait_var: i32, verbose: i8, command: &str, services: Vec) -> i32{ - println!("execute in exec"); - dbg!(svdir_var.clone()); - dbg!(svwait_var); - dbg!(verbose); - dbg!(command); let mut exit_code: i32 = 0; @@ -39,27 +33,9 @@ pub fn execute(svdir_var: String, svwait_var: i32, verbose: i8, command: &str, s if exit_code < 99 { exit_code += 1; } - }, }; - - - // 1. Check if path exists. - // - //let path_to_sv = Path::new(&path); - - //if set_current_dir(path_to_sv).is_ok() { - // // Call the change in the service. - // exit_code = sent_signal::sent_signal(exit_code, svwait_var, verbose, command, sv); - //} else { - // println!("fail: {}: unable to change to service directory: file does not exist", sv); - // if exit_code < 99 { - // exit_code += 1; - // } - //} - } - return exit_code } diff --git a/01_phase_rust_src/sv/src/executor/sent_signal.rs b/01_phase_rust_src/sv/src/executor/sent_signal.rs index 0d57a55..bee4cb3 100644 --- a/01_phase_rust_src/sv/src/executor/sent_signal.rs +++ b/01_phase_rust_src/sv/src/executor/sent_signal.rs @@ -1,23 +1,12 @@ -//pub mod exec_status; -//pub mod make_exit_code; -//pub mod return_u8_in_u32; -//pub mod return_u8_in_u64; - use crate::status_obj; -//use std::path::Path; - 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. - // Check if supervise/ok exist. - //let supervise_ok = Path::new("supervise/ok"); - //if ! supervise_ok.exists() { - // println!("warning: {}: unable to open supervise/ok: file does not exist", sv.clone()); - // return make_exit_code::make_exit_code(exit_code); - //} + dbg!(svwait_var); + dbg!(verbose); // execute command. if command == "s" { @@ -36,7 +25,6 @@ pub fn sent_signal( svwait_var: i32, verbose: i8, command: &str, mut sv: status_ } println!("{}", status_sv); return 0; - } //let service = fs::OpenOptions::new().append(true).open("supervise/control"); diff --git a/01_phase_rust_src/sv/src/executor/sent_signal/exec_status.rs b/01_phase_rust_src/sv/src/executor/sent_signal/exec_status.rs deleted file mode 100644 index 0992d35..0000000 --- a/01_phase_rust_src/sv/src/executor/sent_signal/exec_status.rs +++ /dev/null @@ -1,84 +0,0 @@ - -mod make_pause_run; -mod make_run_finish; -mod make_term_sig; -mod make_up_down; -mod make_normal_state; - -use crate::executor::sent_signal::make_exit_code::make_exit_code; -use crate::executor::sent_signal::return_u8_in_u32::return_u8_in_u32; -use crate::executor::sent_signal::return_u8_in_u64::return_u8_in_u64; - -use std::fs; -use std::io::prelude::*; - - -pub fn exec_status(exit_code: i32, sv: String) -> i32 { - let status_option = fs::OpenOptions::new().read(true).open("supervise/status"); - - // works this way : - // 20 chars, - // TODO 0 -> 11; time since I don't know when. It is time_sv = 4611686018427387914 + time_unix - // TODO - // TODO seams to be 0 -> 7 time, 7 -> 11 nano seconds.. - // 12 -> 15; PID - // 16; PAUSE/RUN - // 17; UP/DOWN - // 18; TERM SIG - // 19; RUN/FINISH - // - // In this version, don't take in account the time. (char 0 -> 11) - - if ! status_option.is_ok() { - println!("ERROR, Unable to get supervise/status"); - return make_exit_code(exit_code); - } - - let mut status = match status_option { - Ok(file) => file, - Err(..) => { - println!("warning: {}: unable to open supervise/status: file does not exist", sv.clone()); - return make_exit_code(exit_code); - }, - }; - - let mut contents: Vec = Vec::new(); - let option_size = status.read_to_end(&mut contents); - - let size = match option_size { - Ok(size) => size, - Err(..) => { - println!("warning: {}: couldn't read supervise/status", sv.clone()); - return make_exit_code(exit_code); - }, - }; - - let time_buf: Vec = contents[0..8].to_vec(); - let uknown_buf: Vec = contents[8..12].to_vec(); // TODO - let pid_buf: Vec = contents[12..16].to_vec(); - let time = return_u8_in_u64(time_buf); // TODO: correct the unsigned/signed bug. - - let pid: u32 = return_u8_in_u32(pid_buf.clone()); - - let pause_run = make_pause_run::mpr(contents[16]); - let up_down = make_up_down::mud(contents[17]); - let term_sig = make_term_sig::mts(contents[18]); - let run_finish = make_run_finish::mrf(contents[19]); - - let normal_state = make_normal_state::mns(contents[19]); - dbg!(contents); - //dbg!(time_buf); - - dbg!(pause_run); - dbg!(up_down); - dbg!(term_sig); - - if pid != 0 { - println!("{run_finish}{sv}: (pid {pid}) {time}s{normal_state}"); - } else { - println!("{run_finish}{sv}: {time}s{normal_state}"); - } - - return exit_code; - -} diff --git a/01_phase_rust_src/sv/src/executor/sent_signal/exec_status/make_normal_state.rs b/01_phase_rust_src/sv/src/executor/sent_signal/exec_status/make_normal_state.rs deleted file mode 100644 index 0888462..0000000 --- a/01_phase_rust_src/sv/src/executor/sent_signal/exec_status/make_normal_state.rs +++ /dev/null @@ -1,20 +0,0 @@ - - -use std::path::Path; - -pub fn mns(actual_state: u8) -> &'static str { - let down_option = Path::new("down"); - if down_option.exists() { - if actual_state == 0 { - return ""; - } else { - return ", normally down"; - } - } else { - if actual_state == 0 { - return ", normally up"; - } else { - return ""; - } - } -} diff --git a/01_phase_rust_src/sv/src/executor/sent_signal/exec_status/make_pause_run.rs b/01_phase_rust_src/sv/src/executor/sent_signal/exec_status/make_pause_run.rs deleted file mode 100644 index 8947416..0000000 --- a/01_phase_rust_src/sv/src/executor/sent_signal/exec_status/make_pause_run.rs +++ /dev/null @@ -1,9 +0,0 @@ - - -pub fn mpr(pause_run_int: u8) -> &'static str { - if pause_run_int == 0 { - return "" - } else { - return ", paused" - } -} diff --git a/01_phase_rust_src/sv/src/executor/sent_signal/exec_status/make_run_finish.rs b/01_phase_rust_src/sv/src/executor/sent_signal/exec_status/make_run_finish.rs deleted file mode 100644 index bf9bb83..0000000 --- a/01_phase_rust_src/sv/src/executor/sent_signal/exec_status/make_run_finish.rs +++ /dev/null @@ -1,10 +0,0 @@ - - - -pub fn mrf(run_finish_int: u8) -> &'static str { - if run_finish_int == 0 { - return "down: " - } else { - return "run: " - } -} diff --git a/01_phase_rust_src/sv/src/executor/sent_signal/exec_status/make_term_sig.rs b/01_phase_rust_src/sv/src/executor/sent_signal/exec_status/make_term_sig.rs deleted file mode 100644 index a2ac9a1..0000000 --- a/01_phase_rust_src/sv/src/executor/sent_signal/exec_status/make_term_sig.rs +++ /dev/null @@ -1,10 +0,0 @@ - - - -pub fn mts(term_sig_int: u8) -> &'static str { - if term_sig_int == 0 { - return "" - } else { - return ", got TERM" - } -} diff --git a/01_phase_rust_src/sv/src/executor/sent_signal/exec_status/make_up_down.rs b/01_phase_rust_src/sv/src/executor/sent_signal/exec_status/make_up_down.rs deleted file mode 100644 index 491cc41..0000000 --- a/01_phase_rust_src/sv/src/executor/sent_signal/exec_status/make_up_down.rs +++ /dev/null @@ -1,11 +0,0 @@ - - -pub fn mud(up_down_int: u8) -> &'static str { - if up_down_int == 117 { - return ", want up" - } else { - return ", want down" - } -} - - diff --git a/01_phase_rust_src/sv/src/executor/sent_signal/make_exit_code.rs b/01_phase_rust_src/sv/src/executor/sent_signal/make_exit_code.rs deleted file mode 100644 index f2d832b..0000000 --- a/01_phase_rust_src/sv/src/executor/sent_signal/make_exit_code.rs +++ /dev/null @@ -1,9 +0,0 @@ - -pub fn make_exit_code(exit_code: i32) -> i32 { - if exit_code < 99 { - return exit_code + 1; - } else { - return exit_code; - } -} - diff --git a/01_phase_rust_src/sv/src/executor/sent_signal/return_u8_in_u32.rs b/01_phase_rust_src/sv/src/executor/sent_signal/return_u8_in_u32.rs deleted file mode 100644 index 7365603..0000000 --- a/01_phase_rust_src/sv/src/executor/sent_signal/return_u8_in_u32.rs +++ /dev/null @@ -1,18 +0,0 @@ - - - -pub fn return_u8_in_u32(mut table: Vec) -> u32 { - // Table make 4 vector u8 in one u32 - if table.len() != 4 { - return 0 - } - let mut r: u32 = 0; - table.reverse(); - for i in table.iter() { - //println!("{}",i); - r = r * 256; - r += >::into(*i); - } - return r -} - diff --git a/01_phase_rust_src/sv/src/executor/sent_signal/return_u8_in_u64.rs b/01_phase_rust_src/sv/src/executor/sent_signal/return_u8_in_u64.rs deleted file mode 100644 index 5a4b666..0000000 --- a/01_phase_rust_src/sv/src/executor/sent_signal/return_u8_in_u64.rs +++ /dev/null @@ -1,17 +0,0 @@ - - -pub fn return_u8_in_u64(mut table: Vec) -> u64 { - // Table make 4 vector u8 in one u64 - if table.len() != 8 { - return 0 - } - let mut r: u64 = 0; - table.reverse(); - for i in table.iter() { - //println!("{}",i); - r = r * 256; - r += >::into(*i); - } - return r -} - diff --git a/01_phase_rust_src/sv/src/parser.rs b/01_phase_rust_src/sv/src/parser.rs index b7d62bc..cb09545 100644 --- a/01_phase_rust_src/sv/src/parser.rs +++ b/01_phase_rust_src/sv/src/parser.rs @@ -72,7 +72,7 @@ fn phase2(arg: &String) -> String { pub fn parse_args_1(arg: &String) -> String{ // Get a string - // Return a vect ('first_char', 'length', 'entry_necessary') + // Return the flag. let ch1 = arg.chars().next().unwrap(); @@ -97,15 +97,12 @@ 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']; - - for var in POSSIBLE.iter() { if arg == var { return var.to_string() } } - let ch1 = arg.chars().next().unwrap(); @@ -115,7 +112,6 @@ pub fn parse_args_2(arg: &String) -> String{ } } - return "INVALID".to_string() diff --git a/01_phase_rust_src/sv/src/status_obj.rs b/01_phase_rust_src/sv/src/status_obj.rs index d25d712..46eb58b 100644 --- a/01_phase_rust_src/sv/src/status_obj.rs +++ b/01_phase_rust_src/sv/src/status_obj.rs @@ -106,14 +106,14 @@ impl StatusObj { pub fn get_status_string(&mut self) -> String { //dbg!(&self.svname); dbg!(&self.svpath); - dbg!(self.time); + //dbg!(self.time); dbg!(self.nano_seconds); //dbg!(self.pid); dbg!(self.pause_run); dbg!(self.up_down); dbg!(self.term_sig); //dbg!(self.run_finish); - dbg!(self.down); + //dbg!(self.down); dbg!(self.log); // TODO diff --git a/01_phase_rust_src/sv/src/status_obj/misc.rs b/01_phase_rust_src/sv/src/status_obj/misc.rs index c8dc602..edcb0e1 100644 --- a/01_phase_rust_src/sv/src/status_obj/misc.rs +++ b/01_phase_rust_src/sv/src/status_obj/misc.rs @@ -39,35 +39,32 @@ pub fn return_reverse_u8_in_u32(mut table: Vec) -> u32 { let mut r: u32 = 0; table.reverse(); for i in table.iter() { - //println!("{}",i); r = r * 256; r += >::into(*i); } return r } -pub fn return_u8_in_u32(mut table: Vec) -> u32 { +pub fn return_u8_in_u32(table: Vec) -> u32 { // Table make 4 values u8 in one u32 if table.len() != 4 { return 0 } let mut r: u32 = 0; for i in table.iter() { - //println!("{}",i); r = r * 256; r += >::into(*i); } return r } -pub fn return_u8_in_u64(mut table: Vec) -> u64 { +pub fn return_u8_in_u64(table: Vec) -> u64 { // Table make 8 values u8 in one u64 if table.len() != 8 { return 0 } let mut r: u64 = 0; for i in table.iter() { - //println!("{}",i); r = r * 256; r += >::into(*i); } From 968b9e7e879dff2bb763fcf1f6bf8f80144db37b Mon Sep 17 00:00:00 2001 From: primardj Date: Fri, 12 Apr 2024 00:17:31 +0100 Subject: [PATCH 14/14] finish basic status command --- 01_phase_rust_src/sv/src/status_obj.rs | 65 +++++++++++++++------ 01_phase_rust_src/sv/src/status_obj/misc.rs | 1 + 2 files changed, 47 insertions(+), 19 deletions(-) diff --git a/01_phase_rust_src/sv/src/status_obj.rs b/01_phase_rust_src/sv/src/status_obj.rs index 46eb58b..a87ff49 100644 --- a/01_phase_rust_src/sv/src/status_obj.rs +++ b/01_phase_rust_src/sv/src/status_obj.rs @@ -7,11 +7,13 @@ use std::fs; use std::io::prelude::*; use std::time::SystemTime; + + pub struct StatusObj { svname: String, // Service name svpath: String, // Service path time: u64, // 0 -> 7 - nano_seconds: u32, // 8 -> 11 + //nano_seconds: u32, // 8 -> 11 pid: u32, // 12 -> 15 pause_run: bool, // 16 up_down: char, // 17 @@ -38,6 +40,19 @@ impl StatusObj { println!("warning: {}: unable to open supervise/ok: file does not exist", sv); return None; } + + + // TODO: check if there is a process reading the pipe. + // piste : https://docs.rs/tokio/latest/tokio/net/unix/pipe/struct.OpenOptions.html + //let mut control_option = fs::File::open("supervise/control"); + //let status_option = fs::OpenOptions::new().read(true).open("supervise/control"); + //match control_option { + // Ok(_file) => {}, + // Err(ee) => { + // println!("fail: {}: runsv not running {}", sv, ee); + // return None; + // }, + //}; let status_option = fs::OpenOptions::new().read(true).open("supervise/status"); let mut status = match status_option { Ok(file) => file, @@ -58,6 +73,8 @@ impl StatusObj { }; if size != 20 { + dbg!(size); + dbg!(contents); println!("warning: {}: bad supervise/status format", sv); return None } @@ -77,11 +94,11 @@ impl StatusObj { } let time_buf: Vec = contents[0..8].to_vec(); - let nano_buf: Vec = contents[8..12].to_vec(); + //let nano_buf: Vec = contents[8..12].to_vec(); let pid_buf: Vec = contents[12..16].to_vec(); let seconds = misc::return_u8_in_u64(time_buf); - let nano = misc::return_u8_in_u32(nano_buf); + //let nano = misc::return_u8_in_u32(nano_buf); let pid_found = misc::return_reverse_u8_in_u32(pid_buf); let pause_run_raw = misc::make_pause_run(contents[16]); // done @@ -93,7 +110,7 @@ impl StatusObj { svname: sv, svpath: path_string, time: seconds, - nano_seconds: nano, + //nano_seconds: nano, pid: pid_found, pause_run: pause_run_raw, up_down: up_down_raw, @@ -104,22 +121,13 @@ impl StatusObj { }) } pub fn get_status_string(&mut self) -> String { - //dbg!(&self.svname); - dbg!(&self.svpath); - //dbg!(self.time); - dbg!(self.nano_seconds); - //dbg!(self.pid); - dbg!(self.pause_run); - dbg!(self.up_down); - dbg!(self.term_sig); - //dbg!(self.run_finish); - //dbg!(self.down); - dbg!(self.log); - // TODO let status_sv; let pid_string: String; let down_string; + let pause_string; + let ud_string; + let term_string; if self.run_finish == false { status_sv = "down:"; pid_string = "".to_owned(); @@ -128,6 +136,11 @@ impl StatusObj { } else { down_string = ""; } + if self.up_down == 'u' { + ud_string = ", want up"; + } else { + ud_string = ""; + } } else { status_sv = "run:"; pid_string = "(pid ".to_owned() + &self.pid.to_string() + ") "; @@ -136,6 +149,21 @@ impl StatusObj { } else { down_string = ""; } + if self.up_down == 'd' { + ud_string = ", want down"; + } else { + ud_string = ""; + } + } + if self.pause_run == true { + pause_string = ", paused"; + } else { + pause_string = ""; + } + if self.term_sig == true { + term_string = ", got TERM"; + } else { + term_string = ""; } let time_repaired: u64 = self.time - 4611686018427387914; @@ -146,9 +174,8 @@ impl StatusObj { }; let dif_time = sys_time - time_repaired; - - // Make return string with what made upper there. - let return_string: String = status_sv.to_owned() + " " + &self.svname + ": " + &pid_string + &dif_time.to_string() + "s" + down_string; + // Make the string to return + let return_string: String = status_sv.to_owned() + " " + &self.svname + ": " + &pid_string + &dif_time.to_string() + "s" + down_string + pause_string + ud_string + term_string; return return_string; } diff --git a/01_phase_rust_src/sv/src/status_obj/misc.rs b/01_phase_rust_src/sv/src/status_obj/misc.rs index edcb0e1..896e2d5 100644 --- a/01_phase_rust_src/sv/src/status_obj/misc.rs +++ b/01_phase_rust_src/sv/src/status_obj/misc.rs @@ -45,6 +45,7 @@ pub fn return_reverse_u8_in_u32(mut table: Vec) -> u32 { return r } +#[allow(dead_code)] pub fn return_u8_in_u32(table: Vec) -> u32 { // Table make 4 values u8 in one u32 if table.len() != 4 {