use crate::core::shell_escape::sh_squote;
use crate::core::types::Resource;
use crate::resources::verdict;
const SYSTEMD_CHECK_GUARD: &str = "\
if ! command -v systemctl >/dev/null 2>&1; then\n \
echo 'FORJAR_SKIP: systemctl not found - service state is not observable here'\n \
exit 2\n\
fi";
const SYSTEMD_GUARD: &str = "\
if ! command -v systemctl >/dev/null 2>&1; then\n \
echo 'FORJAR_WARN: systemctl not found - skipping service resource (no systemd)'\n \
exit 0\n\
fi";
pub fn check_script(resource: &Resource) -> String {
let name = resource.name.as_deref().unwrap_or("unknown");
let n = sh_squote(name);
let state = resource.state.as_deref().unwrap_or("running");
let enabled = resource.enabled.unwrap_or(true);
let active = if state == "stopped" {
verdict::assert_that(
&format!("! systemctl is-active --quiet {n} 2>/dev/null"),
&format!("inactive:{name}"),
&format!("active:{name}"),
)
} else {
verdict::assert_that(
&format!("systemctl is-active --quiet {n} 2>/dev/null"),
&format!("active:{name}"),
&format!("inactive:{name}"),
)
};
let enablement = if enabled {
verdict::assert_that(
&format!("systemctl is-enabled --quiet {n} 2>/dev/null"),
&format!("enabled:{name}"),
&format!("disabled:{name}"),
)
} else {
verdict::assert_that(
&format!("! systemctl is-enabled --quiet {n} 2>/dev/null"),
&format!("disabled:{name}"),
&format!("enabled:{name}"),
)
};
format!(
"{SYSTEMD_CHECK_GUARD}\n{}",
verdict::check_script_from(&[active, enablement])
)
}
pub fn apply_script(resource: &Resource) -> String {
let name = resource.name.as_deref().unwrap_or("unknown");
let state = resource.state.as_deref().unwrap_or("running");
let enabled = resource.enabled.unwrap_or(true);
let mut lines = vec!["set -euo pipefail".to_string(), SYSTEMD_GUARD.to_string()];
match state {
"running" => {
lines.push(format!(
"if ! systemctl is-active --quiet '{name}'; then\n systemctl start '{name}'\nfi"
));
}
"stopped" => {
lines.push(format!(
"if systemctl is-active --quiet '{name}'; then\n systemctl stop '{name}'\nfi"
));
}
_ => {}
}
if enabled {
lines.push(format!(
"if ! systemctl is-enabled --quiet '{name}'; then\n systemctl enable '{name}'\nfi"
));
} else {
lines.push(format!(
"if systemctl is-enabled --quiet '{name}'; then\n systemctl disable '{name}'\nfi"
));
}
if !resource.restart_on.is_empty() {
lines.push(format!("systemctl reload-or-restart '{name}'"));
}
lines.join("\n")
}
pub fn state_query_script(resource: &Resource) -> String {
let name = resource.name.as_deref().unwrap_or("unknown");
format!(
"{SYSTEMD_GUARD}\n\
echo \"active=$(systemctl is-active '{name}' 2>/dev/null || echo 'unknown')\"\n\
echo \"enabled=$(systemctl is-enabled '{name}' 2>/dev/null || echo 'unknown')\""
)
}