feat: Add service manager support

- Add a new service manager crate for dynamic service management
- Integrate service manager with Rhai for scripting
- Provide examples for circle worker management and basic usage
- Add comprehensive tests for service lifecycle and error handling
- Implement cross-platform support for macOS and Linux (zinit/systemd)
This commit is contained in:
Mahmoud-Emad
2025-07-01 18:00:21 +03:00
parent 46ad848e7e
commit 131d978450
28 changed files with 3562 additions and 192 deletions

View File

@@ -1,16 +1,20 @@
# Service Manager
# SAL Service Manager
This crate provides a unified interface for managing system services across different platforms.
It abstracts the underlying service management system (like `launchctl` on macOS or `systemd` on Linux),
allowing you to start, stop, and monitor services with a consistent API.
[![Crates.io](https://img.shields.io/crates/v/sal-service-manager.svg)](https://crates.io/crates/sal-service-manager)
[![Documentation](https://docs.rs/sal-service-manager/badge.svg)](https://docs.rs/sal-service-manager)
A cross-platform service management library for the System Abstraction Layer (SAL). This crate provides a unified interface for managing system services across different platforms, enabling dynamic deployment of workers and services.
## Features
- A `ServiceManager` trait defining a common interface for service operations.
- Platform-specific implementations for:
- macOS (`launchctl`)
- Linux (`systemd`)
- A factory function `create_service_manager` that returns the appropriate manager for the current platform.
- **Cross-platform service management** - Unified API across macOS and Linux
- **Dynamic worker deployment** - Perfect for circle workers and on-demand services
- **Platform-specific implementations**:
- **macOS**: Uses `launchctl` with plist management
- **Linux**: Uses `zinit` for lightweight service management (systemd also available)
- **Complete lifecycle management** - Start, stop, restart, status monitoring, and log retrieval
- **Service configuration** - Environment variables, working directories, auto-restart
- **Production-ready** - Comprehensive error handling and resource management
## Usage
@@ -18,13 +22,55 @@ Add this to your `Cargo.toml`:
```toml
[dependencies]
service_manager = { path = "../service_manager" }
sal-service-manager = "0.1.0"
```
Here is an example of how to use the `ServiceManager`:
Or use it as part of the SAL ecosystem:
```toml
[dependencies]
sal = { version = "0.1.0", features = ["service_manager"] }
```
## Primary Use Case: Dynamic Circle Worker Management
This service manager was designed specifically for dynamic deployment of circle workers in freezone environments. When a new resident registers, you can instantly launch a dedicated circle worker:
```rust,no_run
use service_manager::{create_service_manager, ServiceConfig};
use sal_service_manager::{create_service_manager, ServiceConfig};
use std::collections::HashMap;
// New resident registration triggers worker creation
fn deploy_circle_worker(resident_id: &str) -> Result<(), Box<dyn std::error::Error>> {
let manager = create_service_manager();
let mut env = HashMap::new();
env.insert("RESIDENT_ID".to_string(), resident_id.to_string());
env.insert("WORKER_TYPE".to_string(), "circle".to_string());
let config = ServiceConfig {
name: format!("circle-worker-{}", resident_id),
binary_path: "/usr/bin/circle-worker".to_string(),
args: vec!["--resident".to_string(), resident_id.to_string()],
working_directory: Some("/var/lib/circle-workers".to_string()),
environment: env,
auto_restart: true,
};
// Deploy the worker
manager.start(&config)?;
println!("✅ Circle worker deployed for resident: {}", resident_id);
Ok(())
}
```
## Basic Usage Example
Here is an example of the core service management API:
```rust,no_run
use sal_service_manager::{create_service_manager, ServiceConfig};
use std::collections::HashMap;
fn main() -> Result<(), Box<dyn std::error::Error>> {
@@ -52,3 +98,54 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
Ok(())
}
```
## Examples
Comprehensive examples are available in the SAL examples directory:
### Circle Worker Manager Example
The primary use case - dynamically launching circle workers for new freezone residents:
```bash
# Run the circle worker management example
herodo examples/service_manager/circle_worker_manager.rhai
```
This example demonstrates:
- Creating service configurations for circle workers
- Complete service lifecycle management
- Error handling and status monitoring
- Service cleanup and removal
### Basic Usage Example
A simpler example showing the core API:
```bash
# Run the basic usage example
herodo examples/service_manager/basic_usage.rhai
```
See `examples/service_manager/README.md` for detailed documentation.
## Prerequisites
### Linux (zinit)
Make sure zinit is installed and running:
```bash
# Start zinit with default socket
zinit -s /tmp/zinit.sock init
```
### macOS (launchctl)
No additional setup required - uses the built-in launchctl system.
## Platform Support
- **macOS**: Full support using `launchctl` for service management
- **Linux**: Full support using `zinit` for service management (systemd also available as alternative)
- **Windows**: Not currently supported