216{
218 if (!target)
219 return {false, "The path is not a recognized system service definition."};
220 if (target->name == "bastionguard-rootguard.service" ||
221 target->name == "bastionguard-rootguard")
222 return {false, "RootGuard refuses to block its own service."};
223
224 std::vector<CommandResult> results;
225 switch (target->init) {
227 const auto systemctl = firstExecutable({"/usr/bin/systemctl", "/bin/systemctl"});
228 if (systemctl.empty())
229 return {false, "systemctl is unavailable."};
230 results.push_back(
runCommand({systemctl,
"stop", target->name}));
231 results.push_back(
runCommand({systemctl,
"mask",
"--runtime", target->name}));
232 break;
233 }
235 const auto rcService =
firstExecutable({
"/sbin/rc-service",
"/usr/bin/rc-service"});
236 if (rcService.empty())
237 return {false, "rc-service is unavailable."};
238 results.push_back(
runCommand({rcService, target->name,
"stop"}));
239 break;
240 }
242 const auto dinitctl =
firstExecutable({
"/usr/bin/dinitctl",
"/bin/dinitctl"});
243 if (dinitctl.empty())
244 return {false, "dinitctl is unavailable."};
245 results.push_back(
runCommand({dinitctl,
"stop", target->name}));
246 break;
247 }
249 results.push_back(
runCommand({target->definition.string(),
"stop"}));
250 break;
252 return {false, "No supported init system was detected."};
253 }
254 return resultFrom(
"Blocked", *target, results);
255}
CommandResult runCommand(const std::vector< std::string > &arguments) noexcept
std::string firstExecutable(std::initializer_list< const char * > candidates)
ServiceActionResult resultFrom(const std::string &operation, const ServiceTarget &target, const std::vector< CommandResult > &results)
std::optional< ServiceTarget > identifySystemService(const std::filesystem::path &path) noexcept