use std::{collections::HashMap, process::Command};
use crate::{network::message::Signal as InternalSignal, settings::Settings};
#[cfg(unix)]
mod unix;
#[cfg(unix)]
pub use self::unix::*;
#[cfg(unix)]
use command_group::Signal;
#[cfg_attr(target_os = "linux", path = "linux.rs")]
#[cfg_attr(target_vendor = "apple", path = "apple.rs")]
#[cfg_attr(target_os = "windows", path = "windows.rs")]
#[cfg_attr(target_os = "freebsd", path = "freebsd.rs")]
mod platform;
pub use self::platform::*;
#[derive(Debug)]
pub enum ProcessAction {
Pause,
Resume,
}
impl From<&ProcessAction> for Signal {
fn from(action: &ProcessAction) -> Self {
match action {
ProcessAction::Pause => Signal::SIGSTOP,
ProcessAction::Resume => Signal::SIGCONT,
}
}
}
impl From<InternalSignal> for Signal {
fn from(signal: InternalSignal) -> Self {
match signal {
InternalSignal::SigKill => Signal::SIGKILL,
InternalSignal::SigInt => Signal::SIGINT,
InternalSignal::SigTerm => Signal::SIGTERM,
InternalSignal::SigCont => Signal::SIGCONT,
InternalSignal::SigStop => Signal::SIGSTOP,
}
}
}
pub fn compile_shell_command(settings: &Settings, command: &str) -> Command {
let shell_command = get_shell_command(settings);
let mut handlebars = handlebars::Handlebars::new();
handlebars.set_strict_mode(true);
handlebars.register_escape_fn(handlebars::no_escape);
let mut parameters = HashMap::new();
parameters.insert("pueue_command_string", command);
let mut compiled_command = Vec::new();
for part in shell_command {
let compiled_part = handlebars
.render_template(&part, ¶meters)
.unwrap_or_else(|_| {
panic!("Failed to render shell command for template: {part} and parameters: {parameters:?}")
});
compiled_command.push(compiled_part);
}
let executable = compiled_command.remove(0);
let mut command = Command::new(executable);
for arg in compiled_command {
command.arg(&arg);
}
if !settings.daemon.env_vars.is_empty() {
log::info!(
"Inject environment variables: {:?}",
&settings.daemon.env_vars
);
command.envs(&settings.daemon.env_vars);
}
command
}