Add a convenience script to install and enable a systemd user service script.
This commit is contained in:
@@ -0,0 +1,174 @@
|
||||
#!/bin/sh
|
||||
|
||||
# user-service-installer.sh - Installs a user-level systemd service for shairport-sync
|
||||
|
||||
SERVICE_NAME="shairport-sync.service"
|
||||
SERVICE_SOURCE="./scripts/shairport-sync.user.service"
|
||||
USER_SYSTEMD_DIR="$HOME/.config/systemd/user"
|
||||
SERVICE_DEST="$USER_SYSTEMD_DIR/$SERVICE_NAME"
|
||||
APP_NAME="shairport-sync"
|
||||
|
||||
DRY_RUN=0
|
||||
|
||||
show_help() {
|
||||
echo "Usage: $0 [OPTION]"
|
||||
echo ""
|
||||
echo "Installs a user-level systemd service to:"
|
||||
echo " $USER_SYSTEMD_DIR"
|
||||
echo ""
|
||||
echo "Options:"
|
||||
echo " -h, --help Show this help message and exit"
|
||||
echo " --dry-run Show what the script would do without making changes"
|
||||
}
|
||||
|
||||
# Parse arguments
|
||||
while [ $# -gt 0 ]; do
|
||||
case "$1" in
|
||||
-h|--help)
|
||||
show_help
|
||||
exit 0
|
||||
;;
|
||||
--dry-run)
|
||||
DRY_RUN=1
|
||||
;;
|
||||
*)
|
||||
echo "Unknown option: $1" >&2
|
||||
show_help
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
echo "--------------------------------------------------"
|
||||
echo "Systemd User Service Installer for $APP_NAME"
|
||||
echo "This script will:"
|
||||
echo " - Check for system/initd conflicts"
|
||||
echo " - Verify the app is not already running"
|
||||
echo " - Install the user service"
|
||||
echo " - Enable it to run at login"
|
||||
if [ "$DRY_RUN" -eq 1 ]; then
|
||||
echo ""
|
||||
echo "Dry-run mode: no changes will be made."
|
||||
fi
|
||||
echo "--------------------------------------------------"
|
||||
echo ""
|
||||
|
||||
# Check for systemd
|
||||
if command -v systemctl >/dev/null 2>&1; then
|
||||
echo "[OK] systemd is available."
|
||||
else
|
||||
echo "[FAIL] systemd is not available on this system." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check for system-level service
|
||||
if systemctl is-enabled "$APP_NAME" >/dev/null 2>&1; then
|
||||
echo "[FAIL] A system-level systemd service for '$APP_NAME' is currently enabled." >&2
|
||||
echo " [ADVICE] Please disable it before installing a user-level service." >&2
|
||||
exit 1
|
||||
else
|
||||
echo "[OK] No conflicting system-level systemd service enabled."
|
||||
fi
|
||||
|
||||
# Check for init.d service
|
||||
if [ -x "/etc/init.d/$APP_NAME" ]; then
|
||||
echo "[FAIL] An init.d script for '$APP_NAME' exists at /etc/init.d/$APP_NAME." >&2
|
||||
echo " [ADVICE] Please remove or disable the init.d version before proceeding." >&2
|
||||
exit 1
|
||||
else
|
||||
echo "[OK] No conflicting init.d service found."
|
||||
fi
|
||||
|
||||
# Note if the user-level service is already running
|
||||
if systemctl --user is-enabled "$APP_NAME" >/dev/null 2>&1; then
|
||||
echo "[NOTE] A user-level systemd service for '$APP_NAME' is currently enabled."
|
||||
fi
|
||||
|
||||
# Check if the application is already running
|
||||
if pgrep -x "$APP_NAME" >/dev/null 2>&1; then
|
||||
echo "[FAIL] $APP_NAME is already running." >&2
|
||||
echo " [ADVICE] Please stop $APP_NAME before proceeding." >&2
|
||||
exit 1
|
||||
else
|
||||
echo "[OK] $APP_NAME is not currently running."
|
||||
fi
|
||||
|
||||
# Create directory
|
||||
if [ ! -d "$USER_SYSTEMD_DIR" ]; then
|
||||
if [ "$DRY_RUN" -eq 0 ]; then
|
||||
echo "Creating directory $USER_SYSTEMD_DIR..."
|
||||
mkdir -p "$USER_SYSTEMD_DIR"
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "[OK] Directory $USER_SYSTEMD_DIR created."
|
||||
else
|
||||
echo "[FAIL] Failed to create directory $USER_SYSTEMD_DIR" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
fi
|
||||
else
|
||||
echo "[OK] User systemd directory already exists."
|
||||
fi
|
||||
|
||||
if [ -d "$USER_SYSTEMD_DIR" ] && [ ! -w "$USER_SYSTEMD_DIR" ]; then
|
||||
echo "[FAIL] $USER_SYSTEMD_DIR is not writable." >&2
|
||||
echo " [ADVICE] Please ensure $USER_SYSTEMD_DIR is owned and writable by user \"$(whoami)\" before proceeding." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Create the service file
|
||||
|
||||
if [ "$DRY_RUN" -eq 0 ]; then
|
||||
echo "Creating service file at $SERVICE_DEST..."
|
||||
cat > "$SERVICE_DEST" <<EOF
|
||||
[Unit]
|
||||
Description=Shairport Sync - AirPlay Audio Receiver
|
||||
After=sound.target
|
||||
|
||||
[Service]
|
||||
ExecStart=/usr/local/bin/shairport-sync --log-to-syslog
|
||||
|
||||
[Install]
|
||||
WantedBy=default.target
|
||||
EOF
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "[OK] Service file created."
|
||||
else
|
||||
echo "[FAIL] Failed to create service file." >&2
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# Reload systemd
|
||||
if [ "$DRY_RUN" -eq 0 ]; then
|
||||
echo "Reloading systemd user daemon..."
|
||||
systemctl --user daemon-reexec
|
||||
systemctl --user daemon-reload
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "[OK] The systemd user daemon was reloaded."
|
||||
else
|
||||
echo "[FAIL] Failed to reload systemd user daemon." >&2
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# Enable service
|
||||
if [ "$DRY_RUN" -eq 0 ]; then
|
||||
echo "Enabling service $SERVICE_NAME..."
|
||||
systemctl --user enable --now "$SERVICE_NAME"
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "[OK] Service enabled and started."
|
||||
else
|
||||
echo "[FAIL] Failed to enable the user service." >&2
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
echo ""
|
||||
if [ "$DRY_RUN" -eq 1 ]; then
|
||||
echo "Dry run completed successfully."
|
||||
else
|
||||
echo "Installation complete."
|
||||
echo "The user-level systemd service for $APP_NAME is now installed and enabled."
|
||||
fi
|
||||
Reference in New Issue
Block a user