From: Mike Brady <4265913+mikebrady@users.noreply.github.com> Date: Mon, 14 Apr 2025 08:02:06 +0000 (+0100) Subject: Add a convenience script to install and enable a systemd user service script. X-Git-Tag: 5.0-post-dev~107 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9934b69211ca993f2e6aded4078565a0e458d6d2;p=thirdparty%2Fshairport-sync.git Add a convenience script to install and enable a systemd user service script. --- diff --git a/user-service-install.sh b/user-service-install.sh new file mode 100644 index 00000000..1d59f19e --- /dev/null +++ b/user-service-install.sh @@ -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" <&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