use std::process::Command;
use crate::logger::Logger;
pub fn run_command(cmd: &str, log: &Logger) -> bool {
log.info(&format!("running reaction: {}", cmd));
let result = Command::new("sh")
.arg("-c")
.arg(cmd)
.output();
match result {
Ok(out) => {
let stdout = String::from_utf8_lossy(&out.stdout);
let stderr = String::from_utf8_lossy(&out.stderr);
if !stdout.trim().is_empty() {
log.debug(&format!(" stdout: {}", stdout.trim()));
}
if !stderr.trim().is_empty() {
log.warn(&format!(" stderr: {}", stderr.trim()));
}
if out.status.success() {
log.debug(&format!(" ok (exit 0): {}", cmd));
true
} else {
log.error(&format!(
"reaction command exited with {}: {}",
out.status
.code()
.map(|c| c.to_string())
.unwrap_or_else(|| "signal".to_string()),
cmd
));
false
}
}
Err(e) => {
log.error(&format!("failed to spawn '{}': {}", cmd, e));
false
}
}
}
pub fn run_commands(commands: &[String], log: &Logger) {
for cmd in commands {
run_command(cmd, log);
}
}