138 lines
No EOL
4.2 KiB
Bash
Executable file
138 lines
No EOL
4.2 KiB
Bash
Executable file
#!/bin/bash
|
|
|
|
# Unified service management wrapper for systemd and OpenRC
|
|
|
|
# Function to detect init system
|
|
detect_init_system() {
|
|
if command -v systemctl >/dev/null 2>&1 && pgrep systemd >/dev/null; then
|
|
echo "systemd"
|
|
elif command -v rc-service >/dev/null 2>&1; then
|
|
echo "openrc"
|
|
else
|
|
echo "unknown"
|
|
fi
|
|
}
|
|
|
|
# Function to display usage
|
|
usage() {
|
|
echo "Usage: $0 {start|stop|restart|enable|disable|status|list} [service]"
|
|
echo "Commands:"
|
|
echo " start - Start a service"
|
|
echo " stop - Stop a service"
|
|
echo " restart - Restart a service"
|
|
echo " enable - Enable a service to start at boot"
|
|
echo " disable - Disable a service from starting at boot"
|
|
echo " status - Check the status of a service"
|
|
echo " list - List all services and their status"
|
|
exit 1
|
|
}
|
|
|
|
# Check for sufficient arguments
|
|
if [ $# -lt 1 ]; then
|
|
usage
|
|
fi
|
|
|
|
COMMAND="$1"
|
|
SERVICE="$2"
|
|
INIT_SYSTEM=$(detect_init_system)
|
|
|
|
# Exit if init system is not supported
|
|
if [ "$INIT_SYSTEM" = "unknown" ]; then
|
|
echo "Error: Unsupported init system. Only systemd and OpenRC are supported."
|
|
exit 1
|
|
fi
|
|
|
|
# Map unified commands to init-specific commands
|
|
case "$INIT_SYSTEM" in
|
|
systemd)
|
|
case "$COMMAND" in
|
|
start)
|
|
[ -z "$SERVICE" ] && usage
|
|
systemctl start "$SERVICE"
|
|
;;
|
|
stop)
|
|
[ -z "$SERVICE" ] && usage
|
|
systemctl stop "$SERVICE"
|
|
;;
|
|
restart)
|
|
[ -z "$SERVICE" ] && usage
|
|
systemctl restart "$SERVICE"
|
|
;;
|
|
enable)
|
|
[ -z "$SERVICE" ] && usage
|
|
systemctl enable "$SERVICE"
|
|
;;
|
|
disable)
|
|
[ -z "$SERVICE" ] && usage
|
|
systemctl disable "$SERVICE"
|
|
;;
|
|
status)
|
|
[ -z "$SERVICE" ] && usage
|
|
systemctl status "$SERVICE"
|
|
;;
|
|
list)
|
|
if [ -n "$SERVICE" ]; then
|
|
echo "Error: 'list' command does not take a service argument."
|
|
usage
|
|
fi
|
|
systemctl list-units --type=service --all --no-pager --no-legend | \
|
|
awk '$1 !~ /^●$/ && $1 != "" {if ($2 == "not-found") print $1, "not-found"; else if ($3 == "active" && $4 == "running") print $1, "running"; else if ($3 == "active" && $4 == "exited") print $1, "exited"; else print $1, "stopped"}' | \
|
|
column -t
|
|
;;
|
|
*)
|
|
usage
|
|
;;
|
|
esac
|
|
;;
|
|
openrc)
|
|
case "$COMMAND" in
|
|
start)
|
|
[ -z "$SERVICE" ] && usage
|
|
rc-service "$SERVICE" start
|
|
;;
|
|
stop)
|
|
[ -z "$SERVICE" ] && usage
|
|
rc-service "$SERVICE" stop
|
|
;;
|
|
restart)
|
|
[ -z "$SERVICE" ] && usage
|
|
rc-service "$SERVICE" restart
|
|
;;
|
|
enable)
|
|
[ -z "$SERVICE" ] && usage
|
|
rc-update add "$SERVICE" default
|
|
;;
|
|
disable)
|
|
[ -z "$SERVICE" ] && usage
|
|
rc-update del "$SERVICE" default
|
|
;;
|
|
status)
|
|
[ -z "$SERVICE" ] && usage
|
|
rc-service "$SERVICE" status
|
|
;;
|
|
list)
|
|
if [ -n "$SERVICE" ]; then
|
|
echo "Error: 'list' command does not take a service argument."
|
|
usage
|
|
fi
|
|
for svc in $(rc-service -l); do
|
|
status=$(rc-service "$svc" status | grep -q "started" && echo "running" || echo "stopped")
|
|
echo "$svc $status"
|
|
done | column -t
|
|
;;
|
|
*)
|
|
usage
|
|
;;
|
|
esac
|
|
;;
|
|
esac
|
|
|
|
# Check command execution status
|
|
if [ $? -eq 0 ]; then
|
|
if [ "$COMMAND" != "list" ] && [ "$COMMAND" != "status" ]; then
|
|
echo "$COMMAND on $SERVICE ($INIT_SYSTEM) completed successfully."
|
|
fi
|
|
else
|
|
echo "Error: Failed to execute $COMMAND on $SERVICE ($INIT_SYSTEM)."
|
|
exit 1
|
|
fi |