feat(services): add service activation module
Implement runit service activation for essential services: - dhcpcd enabled by default for network connectivity - Helper function enable_service() for extensibility - Service validation before symlink creation Decision: Enable only dhcpcd by default. Minimal service activation reduces attack surface and resource usage. Additional services (sshd, chronyd) can be added via future config file support. Alternative considered: NetworkManager rejected as default. dhcpcd is lighter and sufficient for server/minimal systems. Desktop users can switch to NetworkManager post-install. Trade-off: Automatic dhcpcd activation means network works immediately after boot but may conflict with users who prefer NetworkManager. Future config will allow service selection. Service definition validation: Check if /etc/sv/<service> exists before creating symlink. Prevents broken links if package not installed. Returns error code but continues installation to avoid cascading failures from optional services.
This commit is contained in:
parent
4ac64e6659
commit
dcd22b04c0
95
src/services.sh
Normal file
95
src/services.sh
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# === Motivation ===
|
||||||
|
# Enable essential system services for network connectivity and basic functionality.
|
||||||
|
|
||||||
|
# === Problem Statement ===
|
||||||
|
# A freshly installed system needs service activation to function properly at boot.
|
||||||
|
|
||||||
|
# === Scope ===
|
||||||
|
# In scope: network service activation, optional services (SSH, NTP).
|
||||||
|
# Out of scope: service configuration, firewall rules, custom service creation.
|
||||||
|
|
||||||
|
# === Concepts ===
|
||||||
|
# runit: Void's init system and service supervisor.
|
||||||
|
# Service directory: /etc/sv/<service> contains service definition.
|
||||||
|
# Service activation: Symlink from /etc/runit/runsvdir/default/<service> to /etc/sv/<service>.
|
||||||
|
# dhcpcd: DHCP client for automatic network configuration.
|
||||||
|
# sshd: OpenSSH server for remote access.
|
||||||
|
# chronyd: NTP client for time synchronization.
|
||||||
|
|
||||||
|
# === Decisions ===
|
||||||
|
# Enable dhcpcd by default for network connectivity (required for most systems).
|
||||||
|
# Disable sshd by default for security (can be enabled via config).
|
||||||
|
# Disable chronyd by default (optional service, can be enabled via config).
|
||||||
|
# Use absolute symlinks for service activation (Void standard).
|
||||||
|
# Validate service directory exists before creating symlink.
|
||||||
|
|
||||||
|
# === Alternatives Considered ===
|
||||||
|
# NetworkManager rejected as default (dhcpcd is lighter and sufficient for server/minimal systems).
|
||||||
|
# systemd-networkd rejected (Void uses runit).
|
||||||
|
# Enabling all services rejected (security and resource waste).
|
||||||
|
# Auto-detection of network interface rejected (dhcpcd handles this).
|
||||||
|
|
||||||
|
# === Constraints ===
|
||||||
|
# Target system must be mounted at $MOUNT_ROOT.
|
||||||
|
# Service packages must be installed before activation.
|
||||||
|
# Service definitions must exist in /etc/sv/.
|
||||||
|
|
||||||
|
# === Open Questions ===
|
||||||
|
# Should we detect network interface type and choose NetworkManager vs dhcpcd?
|
||||||
|
# Should we prompt for optional services interactively or only via config?
|
||||||
|
# Should we enable dbus by default for desktop environments?
|
||||||
|
|
||||||
|
# === Success Criteria ===
|
||||||
|
# dhcpcd is enabled and system has network connectivity after reboot.
|
||||||
|
# Optional services are enabled if requested via configuration.
|
||||||
|
# Services start successfully on boot.
|
||||||
|
|
||||||
|
services_configure() {
|
||||||
|
: "${MOUNT_ROOT:?Mount root is required}"
|
||||||
|
local runsvdir="$MOUNT_ROOT/etc/runit/runsvdir/default"
|
||||||
|
|
||||||
|
log_info "Service configuration: enabling system services"
|
||||||
|
|
||||||
|
# Ensure runsvdir exists
|
||||||
|
mkdir -p "$runsvdir"
|
||||||
|
|
||||||
|
# Enable dhcpcd for network connectivity
|
||||||
|
log_info "Enabling dhcpcd service"
|
||||||
|
enable_service "dhcpcd"
|
||||||
|
|
||||||
|
# Optional services (can be extended with config file support)
|
||||||
|
# For now, we only enable essential services
|
||||||
|
# Future: Add support for ENABLE_SSHD, ENABLE_CHRONYD via config
|
||||||
|
|
||||||
|
log_info "Service configuration complete."
|
||||||
|
}
|
||||||
|
|
||||||
|
enable_service() {
|
||||||
|
local service="$1"
|
||||||
|
local service_dir="/etc/sv/$service"
|
||||||
|
local runsvdir="$MOUNT_ROOT/etc/runit/runsvdir/default"
|
||||||
|
local service_link="$runsvdir/$service"
|
||||||
|
|
||||||
|
# Check if service definition exists
|
||||||
|
if [[ ! -d "$MOUNT_ROOT$service_dir" ]]; then
|
||||||
|
log_warn "Service definition not found: $service_dir (service may not be installed)"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check if service is already enabled
|
||||||
|
if [[ -L "$service_link" ]]; then
|
||||||
|
log_info "Service $service already enabled"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Create symlink to enable service
|
||||||
|
if ! ln -sf "$service_dir" "$service_link"; then
|
||||||
|
log_warn "Failed to enable service: $service"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
log_info "Service $service enabled"
|
||||||
|
return 0
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user