feat: timeout if the execution takes too long

This commit is contained in:
iff 2023-08-06 12:03:27 +02:00
parent 18f5627587
commit 985963c230

View file

@ -1,22 +1,44 @@
use std::io::prelude::*; use std::io::prelude::*;
use std::process::exit; use std::process::exit;
use std::sync::mpsc::channel;
use std::thread;
use std::time::Duration;
pub const PRIVILEGE_LIST: [&str; 2] = ["sudo", "doas"]; pub const PRIVILEGE_LIST: [&str; 2] = ["sudo", "doas"];
pub fn command_output(shell: &str, command: &str) -> String { pub fn command_output(shell: &str, command: &str) -> String {
let output = std::process::Command::new(shell)
let (sender, receiver) = channel();
let _shell = shell.to_owned();
let _command = command.to_owned();
thread::spawn(move || {
sender.send(std::process::Command::new(_shell)
.arg("-c") .arg("-c")
.arg(command) .arg(_command)
.env("LC_ALL", "C") .env("LC_ALL", "C")
.output() .output()
.expect("failed to execute process"); .expect("failed to execute process"))
.expect("failed to send output");
});
match receiver.recv_timeout(Duration::from_secs(3)) {
Ok(output) => {
String::from_utf8_lossy(&output.stderr) String::from_utf8_lossy(&output.stderr)
.to_string() .to_string()
.split_whitespace() .split_whitespace()
.collect::<Vec<&str>>() .collect::<Vec<&str>>()
.join(" ") .join(" ")
.to_lowercase() .to_lowercase()
}
Err(_) => {
use colored::*;
eprintln!("Timeout while executing command: {}", command.red());
exit(1);
}
}
} }
fn last_command(shell: &str) -> String { fn last_command(shell: &str) -> String {