in rd-agent/src/main.rs [564:618]
fn check_one_hostcritical_service(
svc_name: &str,
may_restart: bool,
enforce: bool,
) -> Result<()> {
let mut svc;
match systemd::Unit::new_sys(svc_name.to_string()) {
Ok(v) => svc = v,
Err(_) => return Ok(()),
}
if svc.state != systemd::UnitState::Running {
return Ok(());
}
if let Some(cgrp) = svc.props.string("ControlGroup") {
if cgrp.starts_with("/hostcritical.slice/") {
return Ok(());
}
}
if !enforce {
bail!("{} is not in hostcritical.slice", svc_name);
}
// enforcing, try relocating
let slice_cfg = "# Generated by rd-agent.\n\
[Service]\n\
Slice=hostcritical.slice\n";
if let Err(e) = write_unit_configlet(svc_name, "slice", slice_cfg) {
bail!(
"{} is not in hostcritical.slice, failed to override ({:#})",
svc_name,
&e
);
}
if may_restart {
if let Ok(()) = systemd::daemon_reload().and(svc.restart()) {
sleep(Duration::from_secs(1));
let _ = svc.refresh();
if let Some(cgrp) = svc.props.string("ControlGroup") {
if cgrp.starts_with("/hostcritical.slice/") {
info!("cfg: {} relocated under hostcritical.slice", svc_name);
return Ok(());
}
warn!("cfg: {} has {} as cgroup after relocation", svc_name, cgrp);
}
}
}
bail!(
"{} is not in hostcritical.slice, overridden but needs a restart",
svc_name
);
}