pub mod docker;
pub mod process;
pub mod safety;
pub mod systemd;
pub use docker::DockerManager;
pub use process::ProcessManager;
pub use safety::{CRITICAL_SERVICES, ServiceSafety};
pub use systemd::SystemdManager;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ServiceType {
Systemd,
DockerContainer,
DockerCompose,
Process,
}
impl std::fmt::Display for ServiceType {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Systemd => write!(f, "systemd"),
Self::DockerContainer => write!(f, "docker"),
Self::DockerCompose => write!(f, "docker-compose"),
Self::Process => write!(f, "process"),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ServiceStatus {
Running,
Stopped,
Failed,
Unknown,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ServiceInfo {
pub name: String,
pub service_type: ServiceType,
pub status: ServiceStatus,
pub pid: Option<u32>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum ServiceOperation {
List,
Status(String),
Logs {
name: String,
lines: u32,
},
Start(String),
Stop(String),
Restart(String),
DockerComposeUp {
path: String,
},
DockerComposeDown {
path: String,
},
}
impl ServiceOperation {
pub fn is_read_only(&self) -> bool {
matches!(self, Self::List | Self::Status(_) | Self::Logs { .. })
}
pub fn service_name(&self) -> Option<&str> {
match self {
Self::Status(n) | Self::Start(n) | Self::Stop(n) | Self::Restart(n) => Some(n),
Self::Logs { name, .. } => Some(name),
Self::DockerComposeUp { path } | Self::DockerComposeDown { path } => Some(path),
Self::List => None,
}
}
}