fixed delay (almost) + repeating output

pull/9/head
prplV 2024-07-08 06:17:48 -04:00
parent 73daa8320b
commit f9cb2c7cf8
2 changed files with 33 additions and 29 deletions

View File

@ -41,7 +41,7 @@
"filename" : "control-file", "filename" : "control-file",
"src" : "/home/vladislav/web/", "src" : "/home/vladislav/web/",
"triggers" : { "triggers" : {
"onDelete" : "stop", "onDelete" : "hold",
"onChange" : "hold" "onChange" : "hold"
} }
}], }],

View File

@ -79,7 +79,7 @@ async fn main() {
let mut handler: Vec<tokio::task::JoinHandle<()>> = vec![]; let mut handler: Vec<tokio::task::JoinHandle<()>> = vec![];
for proc in processes.processes.iter() { for proc in processes.processes.iter() {
println!("\nProcess '{}' on stage:\n{}\nDepends on {} file(s), {} service(s)\n", println!("Process '{}' on stage:\n{}\nDepends on {} file(s), {} service(s)\n",
proc.name, proc.name,
proc.path, proc.path,
proc.dependencies.files.len(), proc.dependencies.files.len(),
@ -263,10 +263,10 @@ async fn start_process(name: &str, path: &str) -> Result<(), CustomError> {
async fn running_handler(prc: &TrackingProcess, tx: mpsc::Sender<u8>){ async fn running_handler(prc: &TrackingProcess, tx: mpsc::Sender<u8>){
// println!("running daemon on {}", prc.name); // println!("running daemon on {}", prc.name);
// loop { // loop {
let _ = Command::new("pidof") // let _ = Command::new("pidof")
.arg(&prc.name) // .arg(&prc.name)
.output() // .output()
.expect("Failed to execute command 'pidof'"); // .expect("Failed to execute command 'pidof'");
// services and files check (once) // services and files check (once)
let files_check = file_handler(&prc.name, &prc.dependencies.files, tx.clone()); let files_check = file_handler(&prc.name, &prc.dependencies.files, tx.clone());
let services_check = service_handler(&prc.name, &prc.dependencies.services, tx.clone()); let services_check = service_handler(&prc.name, &prc.dependencies.services, tx.clone());
@ -293,6 +293,9 @@ async fn file_handler(name: &str, files: &Vec<Files>, tx: mpsc::Sender<u8>) -> R
// println!("file daemon on {}", name); // println!("file daemon on {}", name);
for file in files { for file in files {
if check_file(&file.filename, &file.src).is_err() { if check_file(&file.filename, &file.src).is_err() {
if !is_active(name) || is_frozen(name) {
return Err(CustomError::Fatal);
}
match file.triggers.on_delete.as_str() { match file.triggers.on_delete.as_str() {
"stay" => { "stay" => {
continue; continue;
@ -301,12 +304,10 @@ async fn file_handler(name: &str, files: &Vec<Files>, tx: mpsc::Sender<u8>) -> R
if is_active(name) { if is_active(name) {
tx.send(1).await.unwrap(); tx.send(1).await.unwrap();
} }
tokio::time::sleep(Duration::from_millis(50)).await;
return Err(CustomError::Fatal); return Err(CustomError::Fatal);
}, },
"hold" => { "hold" => {
if is_active(name) { if is_active(name) {
tokio::time::sleep(Duration::from_millis(50)).await;
tx.send(2).await.unwrap(); tx.send(2).await.unwrap();
return Err(CustomError::Fatal); return Err(CustomError::Fatal);
} }
@ -336,15 +337,21 @@ fn check_file(filename: &str, path: &str) -> Result<(), CustomError> {
// ?? // ??
async fn service_handler(name: &str, services: &Vec<Services>, tx: mpsc::Sender<u8>) -> Result<(), CustomError> { async fn service_handler(name: &str, services: &Vec<Services>, tx: mpsc::Sender<u8>) -> Result<(), CustomError> {
// println!("service daemon on {}", name); // println!("service daemon on {}", name);
// let state = is_active(name);
// let condition = is_frozen(name);
for serv in services { for serv in services {
if check_service(&serv.hostname, &serv.port).await.is_err() { if check_service(&serv.hostname, &serv.port).await.is_err() {
// println!("Service {}:{} is unreachable for process {}", &serv.hostname, &serv.port, &name); if !is_active(name) || is_frozen(name) {
return Err(CustomError::Fatal);
}
println!("Service {}:{} is unreachable for process {}", &serv.hostname, &serv.port, &name);
match serv.triggers.on_lost.as_str() { match serv.triggers.on_lost.as_str() {
"stay" => { "stay" => {
}, },
"stop" => { "stop" => {
if looped_service_connecting(name, serv).await.is_err() { if looped_service_connecting(name, serv).await.is_err() {
tx.send(5).await.unwrap(); tx.send(5).await.unwrap();
tokio::time::sleep(Duration::from_millis(100)).await;
return Err(CustomError::Fatal); return Err(CustomError::Fatal);
} }
}, },
@ -354,6 +361,7 @@ async fn service_handler(name: &str, services: &Vec<Services>, tx: mpsc::Sender<
} }
if looped_service_connecting(name, serv).await.is_err() { if looped_service_connecting(name, serv).await.is_err() {
tx.send(6).await.unwrap(); tx.send(6).await.unwrap();
tokio::time::sleep(Duration::from_millis(100)).await;
return Err(CustomError::Fatal); return Err(CustomError::Fatal);
} }
}, },
@ -383,6 +391,7 @@ async fn looped_service_connecting(
println!("Attempting to connect from {} process to {}:{}",&name, &serv.hostname, &serv.port ); println!("Attempting to connect from {} process to {}:{}",&name, &serv.hostname, &serv.port );
match check_service(&serv.hostname, &serv.port).await { match check_service(&serv.hostname, &serv.port).await {
Ok(_) => { Ok(_) => {
println!("SUCCESS!");
break; break;
}, },
Err(_) => { Err(_) => {
@ -398,6 +407,7 @@ async fn looped_service_connecting(
println!("Attempting to connect from {} process to {}:{}",&name, &serv.hostname, &serv.port ); println!("Attempting to connect from {} process to {}:{}",&name, &serv.hostname, &serv.port );
match check_service(&serv.hostname, &serv.port).await { match check_service(&serv.hostname, &serv.port).await {
Ok(_) => { Ok(_) => {
println!("SUCCESS!");
return Ok(()); return Ok(());
}, },
Err(_) => { Err(_) => {
@ -409,25 +419,19 @@ async fn looped_service_connecting(
} }
} }
async fn check_service(host: &str, port: &u32) -> Result<(), CustomError> { async fn check_service(host: &str, port: &u32) -> Result<(), CustomError> {
let host = host.to_string(); let mut command = Command::new("bash");
let port = *port; command.args(["service-checker.sh", host, &port.to_string()]);
let result = tokio::task::spawn_blocking(move || { match command.output() {
let mut command = Command::new("bash"); Ok(output) => {
command.args(["service-checker.sh", &host, &port.to_string()]); if output.status.success() {
return Ok(());
match command.output() { } else {
Ok(output) => { return Err(CustomError::Fatal);
if output.status.success() { }
Ok(()) },
} else { Err(_) => {
Err(CustomError::Fatal) return Err(CustomError::Fatal);
} },
}, };
Err(_) => {
Err(CustomError::Fatal)
},
}
}).await;
result.unwrap_or(Err(CustomError::Fatal))
} }