summaryrefslogtreecommitdiffstats
path: root/crates/core/tedge/src/system_services/managers/openrc.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/core/tedge/src/system_services/managers/openrc.rs')
-rw-r--r--crates/core/tedge/src/system_services/managers/openrc.rs199
1 files changed, 0 insertions, 199 deletions
diff --git a/crates/core/tedge/src/system_services/managers/openrc.rs b/crates/core/tedge/src/system_services/managers/openrc.rs
deleted file mode 100644
index 4a24da01..00000000
--- a/crates/core/tedge/src/system_services/managers/openrc.rs
+++ /dev/null
@@ -1,199 +0,0 @@
-use crate::system_services::{
- CommandBuilder, OpenRcServiceError, SystemService, SystemServiceError, SystemServiceManager,
-};
-use std::process::ExitStatus;
-use tedge_users::{UserManager, ROOT_USER};
-
-/// Service manager that uses [OpenRC][1] to control system services.
-///
-/// [1]: https://github.com/OpenRc/openrc
-///
-#[derive(Debug)]
-pub struct OpenRcServiceManager {
- user_manager: UserManager,
-}
-
-impl OpenRcServiceManager {
- pub fn new(user_manager: UserManager) -> Self {
- Self { user_manager }
- }
-}
-
-impl SystemServiceManager for OpenRcServiceManager {
- fn name(&self) -> &str {
- "OpenRC"
- }
-
- fn check_operational(&self) -> Result<(), SystemServiceError> {
- let mut command = ServiceCommand::CheckManager.into_command();
-
- match command.status() {
- Ok(status) if status.success() => Ok(()),
- _ => Err(SystemServiceError::ServiceManagerUnavailable(
- self.name().to_string(),
- )),
- }
- }
-
- fn stop_service(&self, service: SystemService) -> Result<(), SystemServiceError> {
- let service_command = ServiceCommand::Stop(service);
-
- self.run_service_command_as_root(service_command)?
- .must_succeed()
- }
-
- fn restart_service(&self, service: SystemService) -> Result<(), SystemServiceError> {
- let service_command = ServiceCommand::Restart(service);
-
- self.run_service_command_as_root(service_command)?
- .must_succeed()
- }
-
- fn enable_service(&self, service: SystemService) -> Result<(), SystemServiceError> {
- let service_command = ServiceCommand::Enable(service);
-
- self.run_service_command_as_root(service_command)?
- .must_succeed()
- }
-
- fn disable_service(&self, service: SystemService) -> Result<(), SystemServiceError> {
- let service_command = ServiceCommand::Disable(service);
-
- self.run_service_command_as_root(service_command)?
- .must_succeed()
- }
-
- fn is_service_running(&self, service: SystemService) -> Result<bool, SystemServiceError> {
- let service_command = ServiceCommand::IsActive(service);
-
- self.run_service_command_as_root(service_command)
- .map(|status| status.success())
- }
-}
-
-impl OpenRcServiceManager {
- fn run_service_command_as_root(
- &self,
- service_command: ServiceCommand,
- ) -> Result<ServiceCommandExitStatus, SystemServiceError> {
- let _root_guard = self.user_manager.become_user(ROOT_USER);
-
- service_command
- .into_command()
- .status()
- .map_err(Into::into)
- .map(|status| ServiceCommandExitStatus {
- status,
- service_command,
- })
- }
-}
-
-struct ServiceCommandExitStatus {
- status: ExitStatus,
- service_command: ServiceCommand,
-}
-
-impl ServiceCommandExitStatus {
- fn must_succeed(self) -> Result<(), SystemServiceError> {
- if self.status.success() {
- Ok(())
- } else {
- Err(OpenRcServiceError::ServiceCommandFailed {
- service_command: self.service_command.to_string(),
- code: self.status.code(),
- }
- .into())
- }
- }
-
- fn success(self) -> bool {
- self.status.success()
- }
-}
-
-const RC_SERVICE_BIN: &str = "/sbin/rc-service";
-const RC_UPDATE_BIN: &str = "/sbin/rc-update";
-
-#[derive(Debug, Copy, Clone)]
-enum ServiceCommand {
- CheckManager,
- Stop(SystemService),
- Restart(SystemService),
- Enable(SystemService),
- Disable(SystemService),
- IsActive(SystemService),
-}
-
-impl ServiceCommand {
- fn to_string(self) -> String {
- match self {
- Self::CheckManager => format!("{} -l", RC_SERVICE_BIN),
- Self::Stop(service) => format!(
- "{} {} stop",
- RC_SERVICE_BIN,
- SystemService::as_service_name(service)
- ),
- Self::Restart(service) => {
- format!(
- "{} {} restart",
- RC_SERVICE_BIN,
- SystemService::as_service_name(service)
- )
- }
- Self::Enable(service) => format!(
- "{} add {}",
- RC_UPDATE_BIN,
- SystemService::as_service_name(service)
- ),
- Self::Disable(service) => {
- format!(
- "{} delete {}",
- RC_UPDATE_BIN,
- SystemService::as_service_name(service)
- )
- }
- Self::IsActive(service) => {
- format!(
- "{} {} status",
- RC_SERVICE_BIN,
- SystemService::as_service_name(service)
- )
- }
- }
- }
-
- fn into_command(self) -> std::process::Command {
- match self {
- Self::CheckManager => CommandBuilder::new(RC_SERVICE_BIN)
- .arg("-l")
- .silent()
- .build(),
- Self::Stop(service) => CommandBuilder::new(RC_SERVICE_BIN)
- .arg(SystemService::as_service_name(service))
- .arg("stop")
- .silent()
- .build(),
- Self::Restart(service) => CommandBuilder::new(RC_SERVICE_BIN)
- .arg(SystemService::as_service_name(service))
- .arg("restart")
- .silent()
- .build(),
- Self::Enable(service) => CommandBuilder::new(RC_UPDATE_BIN)
- .arg("add")
- .arg(SystemService::as_service_name(service))
- .silent()
- .build(),
- Self::Disable(service) => CommandBuilder::new(RC_SERVICE_BIN)
- .arg("delete")
- .arg(SystemService::as_service_name(service))
- .silent()
- .build(),
- Self::IsActive(service) => CommandBuilder::new(RC_SERVICE_BIN)
- .arg(SystemService::as_service_name(service))
- .arg("status")
- .silent()
- .build(),
- }
- }
-}