- Reorganized examples into osiris/, sal/, and utils/ folders - Moved hardcoded scripts to separate .rhai files - Added signature() method to JobBuilder for job signing - Updated OSIRIS context to use block_in_place instead of runtime - Removed runtime field from OsirisContext - Added typed save() methods for Note and Event objects - Updated all examples to use new structure and APIs
		
			
				
	
	
		
			117 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			117 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
# Service Manager Examples
 | 
						|
 | 
						|
This directory contains examples demonstrating the SAL service manager functionality for dynamically launching and managing services across platforms.
 | 
						|
 | 
						|
## Overview
 | 
						|
 | 
						|
The service manager provides a unified interface for managing system services:
 | 
						|
- **macOS**: Uses `launchctl` for service management
 | 
						|
- **Linux**: Uses `zinit` for service management (systemd also available as alternative)
 | 
						|
 | 
						|
## Examples
 | 
						|
 | 
						|
### 1. Circle Worker Manager (`circle_worker_manager.rhai`)
 | 
						|
 | 
						|
**Primary Use Case**: Demonstrates dynamic circle worker management for freezone residents.
 | 
						|
 | 
						|
This example shows:
 | 
						|
- Creating service configurations for circle workers
 | 
						|
- Complete service lifecycle management (start, stop, restart, remove)
 | 
						|
- Status monitoring and log retrieval
 | 
						|
- Error handling and cleanup
 | 
						|
 | 
						|
```bash
 | 
						|
# Run the circle worker management example
 | 
						|
herodo examples/service_manager/circle_worker_manager.rhai
 | 
						|
```
 | 
						|
 | 
						|
### 2. Basic Usage (`basic_usage.rhai`)
 | 
						|
 | 
						|
**Learning Example**: Simple demonstration of the core service manager API.
 | 
						|
 | 
						|
This example covers:
 | 
						|
- Creating and configuring services
 | 
						|
- Starting and stopping services
 | 
						|
- Checking service status
 | 
						|
- Listing managed services
 | 
						|
- Retrieving service logs
 | 
						|
 | 
						|
```bash
 | 
						|
# Run the basic usage example
 | 
						|
herodo examples/service_manager/basic_usage.rhai
 | 
						|
```
 | 
						|
 | 
						|
## 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.
 | 
						|
 | 
						|
## Service Manager API
 | 
						|
 | 
						|
The service manager provides these key functions:
 | 
						|
 | 
						|
- `create_service_manager()` - Create platform-appropriate service manager
 | 
						|
- `start(manager, config)` - Start a new service
 | 
						|
- `stop(manager, service_name)` - Stop a running service
 | 
						|
- `restart(manager, service_name)` - Restart a service
 | 
						|
- `status(manager, service_name)` - Get service status
 | 
						|
- `logs(manager, service_name, lines)` - Retrieve service logs
 | 
						|
- `list(manager)` - List all managed services
 | 
						|
- `remove(manager, service_name)` - Remove a service
 | 
						|
- `exists(manager, service_name)` - Check if service exists
 | 
						|
- `start_and_confirm(manager, config, timeout)` - Start with confirmation
 | 
						|
 | 
						|
## Service Configuration
 | 
						|
 | 
						|
Services are configured using a map with these fields:
 | 
						|
 | 
						|
```rhai
 | 
						|
let config = #{
 | 
						|
    name: "my-service",                    // Service name
 | 
						|
    binary_path: "/usr/bin/my-app",        // Executable path
 | 
						|
    args: ["--config", "/etc/my-app.conf"], // Command arguments
 | 
						|
    working_directory: "/var/lib/my-app",   // Working directory (optional)
 | 
						|
    environment: #{                         // Environment variables
 | 
						|
        "VAR1": "value1",
 | 
						|
        "VAR2": "value2"
 | 
						|
    },
 | 
						|
    auto_restart: true                      // Auto-restart on failure
 | 
						|
};
 | 
						|
```
 | 
						|
 | 
						|
## Real-World Usage
 | 
						|
 | 
						|
The circle worker example demonstrates the exact use case requested by the team:
 | 
						|
 | 
						|
> "We want to be able to launch circle workers dynamically. For instance when someone registers to the freezone, we need to be able to launch a circle worker for the new resident."
 | 
						|
 | 
						|
The service manager enables:
 | 
						|
1. **Dynamic service creation** - Create services on-demand for new residents
 | 
						|
2. **Cross-platform support** - Works on both macOS and Linux
 | 
						|
3. **Lifecycle management** - Full control over service lifecycle
 | 
						|
4. **Monitoring and logging** - Track service status and retrieve logs
 | 
						|
5. **Cleanup** - Proper service removal when no longer needed
 | 
						|
 | 
						|
## Error Handling
 | 
						|
 | 
						|
All service manager functions can throw errors. Use try-catch blocks for robust error handling:
 | 
						|
 | 
						|
```rhai
 | 
						|
try {
 | 
						|
    sm::start(manager, config);
 | 
						|
    print("✅ Service started successfully");
 | 
						|
} catch (error) {
 | 
						|
    print(`❌ Failed to start service: ${error}`);
 | 
						|
}
 | 
						|
```
 |