3 Commit-ok 6c98b6cc1a ... 9f6ed3d512

Szerző SHA1 Üzenet Dátum
  bryan 9f6ed3d512 Refactor init and parse_input to simplify scoping 3 napja
  bryan 3b492d309b Fix self-update switch 3 napja
  bryan 6d548ac278 Simplify MC_REPO 3 napja
2 módosított fájl, 141 hozzáadás és 186 törlés
  1. 1 1
      README.md
  2. 140 185
      installJRMC

+ 1 - 1
README.md

@@ -51,7 +51,7 @@ $ installJRMC --help
       The webroot directory to install the repo (default: /var/www/jriver/)
   --createrepo-user USER
       The web server user if different from the current user
---no-self-update
+--no-update
     Disable the installJRMC update check
 --yes, -y, --auto
     Always assume yes for questions

+ 140 - 185
installJRMC

@@ -10,7 +10,6 @@
 # TODO (v2)
 #   1. Interactive mode
 #   2. Additional containerization (createrepo and rpmbuild)
-#   3. Tests
 #
 # BUGS
 #   1. No createrepo on Mint
@@ -18,10 +17,10 @@
 shopt -s extglob
 
 declare -g SCRIPT_VERSION="1.3.5-dev"
-declare -g MC_DEFAULT_REPO="bullseye" # should match the MC_VERSION
+declare -g MC_REPO="bullseye" # should match the MC_VERSION
 declare -g MC_VERSION="33.0.30" # Do find all replace
 declare -g BOARD_URL="https://yabb.jriver.com/interact/index.php/board,86.0.html" # MC33
-declare -ig SELF_UPDATE=1 # set to 0 to disable automatic self-update
+declare -ig UPDATE_SWITCH=1 # set to 0 to disable automatic self-update
 
 # @description Print help text
 print_help() {
@@ -50,7 +49,7 @@ print_help() {
 		    Specify the MC repository, ex. "bullseye", "bookworm", "noble", etc (default: latest official)
 		  --outputdir PATH
 		    Generate rpmbuild output in this directory (default: ./output)
-		  --restorefile MJR_RESTORE_FILE
+		  --restorefile MJR_FILE
 		    Restore file location for automatic license registration
 		  --betapass PASSWORD
 		    Enter beta team password for access to beta builds
@@ -68,8 +67,8 @@ print_help() {
 		      Specify the webroot directory to install the repo (default: /var/www/jriver)
 		    --createrepo-user USER
 		      Specify the web server user if it differs from \$USER
-		  --no-self-update
-		    Disable automatic self-update
+		  --no-update
+		    Disable automatic installJRMCself-update
 		  --uninstall, -u
 		    Uninstall JRiver MC, remove services, containers, and firewall rules (does not remove library files)
 		  --yes, -y, --auto
@@ -108,54 +107,20 @@ print_help() {
 }
 
 # @description Parses user input and sets sensible defaults
+# @arg $@ User input
 parse_input() {
   debug "Running: ${FUNCNAME[0]} $*"
 
-  declare -g BUILD_SWITCH REPO_INSTALL_SWITCH LOCAL_INSTALL_SWITCH \
-    COMPAT_SWITCH TEST_SWITCH CREATEREPO_SWITCH UNINSTALL_SWITCH \
-    YES_SWITCH USER_MC_VERSION MJR_RESTORE_FILE BETAPASS SERVICE_TYPE \
-    VNCPASS USER_DISPLAY MC_REPO BUILD_TARGET REPO_TARGET
-  declare -ga SERVICES CONTAINERS
   local long_opts short_opts input
-  declare -g SCRIPT_PATH; SCRIPT_PATH=$(readlink -f "${BASH_SOURCE[0]}")
-  declare -g SCRIPT_DIR=; SCRIPT_DIR=$(readlink -f "$(dirname "${BASH_SOURCE[0]}")")
-  declare -g CREATEREPO_USER="$USER"
-  declare -g OUTPUT_DIR="$SCRIPT_DIR/output"
-  declare -g CREATEREPO_WEBROOT="/var/www/jriver"
-  declare -g USER="${SUDO_USER:-$USER}"
-  declare -g HOME; HOME=$(getent passwd "$USER" | cut -d: -f6)
-
-  # Set some defaults if zero or one arguments are passed
-  if [[ $# -eq 0 && $ID != "unknown" ]]; then
-    debug "Automatically setting --install repo"
-    REPO_INSTALL_SWITCH=1
-  elif [[ $# -eq 1 || $# -eq 2 ]]; then
-    case "$1" in
-      --debug | -d | -y | --yes | --auto | --mcrepo | --mcversion | \
-      --arch | --betapass | --restorefile | --outputdir | --no-self-update)
-        if  [[ $ID != "unknown" ]]; then
-          debug "Automatically setting --install repo"
-          REPO_INSTALL_SWITCH=1
-        fi
-        ;;
-      --compat)
-        if [[ $# -eq 1 ]]; then
-          BUILD_SWITCH=1
-          LOCAL_INSTALL_SWITCH=1
-        fi
-        ;;
-    esac
-  fi
-
   long_opts="install:,build::,outputdir:,mcversion:,arch:,mcrepo:,compat,"
   long_opts+="restorefile:,betapass:,"
   long_opts+="service-type:,service:,services:,"
-  long_opts+="version,debug,verbose,help,uninstall,tests,yes,auto,no-self-update,"
+  long_opts+="version,debug,verbose,help,uninstall,yes,auto,no-update,"
   long_opts+="createrepo::,createrepo-webroot:,createrepo-user:,"
   long_opts+="vncpass:,display:,container:"
   short_opts="+i:b::s:c:uyvdh"
 
-  # Reset DEBUG and catch with getopt
+  # Reset DEBUG and recatch properly with getopt
   declare -g DEBUG=0
 
   if input=$(getopt -o $short_opts -l $long_opts -- "$@"); then
@@ -165,103 +130,43 @@ parse_input() {
         --install|-i)
           shift
           case $1 in
-            local|rpm)
-              BUILD_SWITCH=1
-              LOCAL_INSTALL_SWITCH=1
-              ;;
-            repo|remote)
-              REPO_INSTALL_SWITCH=1
-              ;;
+            local|rpm|deb) BUILD_SWITCH=1; LOCAL_INSTALL_SWITCH=1 ;;
+            repo|remote) REPO_INSTALL_SWITCH=1 ;;
           esac
           ;;
-        --build|-b)
-          BUILD_SWITCH=1
-          shift && BUILD_TARGET="$1"
-          ;;
-        --outputdir)
-          shift && OUTPUT_DIR="$1"
-          ;;
+        --build|-b) BUILD_SWITCH=1; shift; BUILD_TARGET="$1" ;;
+        --outputdir) shift && OUTPUT_DIR="$1" ;;
         --mcversion)
           shift
           if [[ $1 =~ ([0-9]+.[0-9]+.[0-9]+) ]]; then
             USER_MC_VERSION="$1"
           else
-            err "Bad --mcversion"
-            print_help
-            exit 1
+            err "Bad --mcversion"; print_help; exit 1
           fi
           ;;
-        --arch)
-          shift
-          echo "Switching from $ARCH to $1 architecture"
-          ARCH="$1"
-          ;;
-        --mcrepo)
-          shift && MC_REPO="$1"
-          ;;
-        --restorefile)
-          shift && MJR_RESTORE_FILE="$1"
-          ;;
-        --betapass)
-          shift && BETAPASS="$1"
-          ;;
-        --service-type)
-          shift && SERVICE_TYPE="$1"
-          ;;
-        --service|-s|--services)
-          shift && SERVICES+=("$1")
-          ;;
-        --createrepo)
-          BUILD_SWITCH=1
-          CREATEREPO_SWITCH=1
-          shift && REPO_TARGET="$1" && BUILD_TARGET="$1"
-          ;;
-        --createrepo-webroot)
-          shift && CREATEREPO_WEBROOT="$1"
-          ;;
-        --createrepo-user)
-          shift && CREATEREPO_USER="$1"
-          ;;
-        --vncpass)
-          shift && VNCPASS="$1"
-          ;;
-        --display)
-          shift && USER_DISPLAY="$1"
-          ;;
-        --compat)
-          COMPAT_SWITCH=1
-          BUILD_SWITCH=1
-          ;;
-        --no-self-update)
-          SELF_UPDATE=0
-          ;;
-        --container|-c)
-          shift && CONTAINERS+=("$1")
-          ;;
-        --yes|-y|--auto)
-          YES_SWITCH=1
-          ;;
-        --version|-v)
-          echo "Version: $SCRIPT_VERSION"
-          exit 0
-          ;;
-        --debug|-d|--verbose)
-          DEBUG=1
-          ;;
-        --help|-h)
-          print_help 
-          exit
-          ;;
-        --uninstall|-u)
-          UNINSTALL_SWITCH=1
-          ;;
-        --tests)
-          TEST_SWITCH=1
-          ;;
-        --)
-          shift
-          break
+        --arch) shift; echo "Switching arch from $ARCH to $1"; ARCH="$1" ;;
+        --mcrepo) shift && MC_REPO="$1" ;;
+        --restorefile) shift && MJR_FILE="$1" ;;
+        --betapass) shift && BETAPASS="$1" ;;
+        --service-type) shift && SERVICE_TYPE="$1" ;;
+        --service|-s|--services) shift && SERVICES+=("$1") ;;
+        --createrepo) 
+          BUILD_SWITCH=1; CREATEREPO_SWITCH=1
+          shift; CREATEREPO_TARGET="$1"; BUILD_TARGET="$1"
           ;;
+        --createrepo-webroot) shift && CREATEREPO_WEBROOT="$1" ;;
+        --createrepo-user) shift && CREATEREPO_USER="$1" ;;
+        --vncpass) shift && VNCPASS="$1" ;;
+        --display) shift && USER_DISPLAY="$1" ;;
+        --compat) COMPAT_SWITCH=1; BUILD_SWITCH=1 ;;
+        --no-update) UPDATE_SWITCH=0 ;;
+        --container|-c) shift && CONTAINERS+=("$1") ;;
+        --yes|-y|--auto) YES_SWITCH=1 ;;
+        --version|-v) echo "Version: $SCRIPT_VERSION"; exit 0 ;;
+        --debug|-d|--verbose) DEBUG=1 ;;
+        --help|-h) print_help; exit 0 ;;
+        --uninstall|-u) UNINSTALL_SWITCH=1 ;;
+        --) shift; break ;;
       esac
       shift
     done
@@ -271,37 +176,78 @@ parse_input() {
   fi
 }
 
-# @description Perform OS detection and fallback
-# Generate OS-specific functions
+# @description Perform OS detection and generate OS-specific functions
+# @see parse_input
 init() {
   debug "Running: ${FUNCNAME[0]}"
 
-  declare -g ID RPM_MGR ARCH NAME
+  declare -g USER
+  declare -g SCRIPT_PATH; SCRIPT_PATH=$(readlink -f "${BASH_SOURCE[0]}")
+  declare -g SCRIPT_DIR; SCRIPT_DIR=$(readlink -f "$(dirname "${BASH_SOURCE[0]}")")
+  declare -g OUTPUT_DIR="$SCRIPT_DIR/output"
+  declare -g CREATEREPO_WEBROOT="/var/www/jriver"
+  declare -g CREATEREPO_USER="$USER" # can be root
+  declare -g ID RPM_MGR ARCH NAME \
+    BUILD_SWITCH REPO_INSTALL_SWITCH LOCAL_INSTALL_SWITCH \
+    COMPAT_SWITCH CREATEREPO_SWITCH UNINSTALL_SWITCH \
+    YES_SWITCH USER_MC_VERSION MJR_FILE BETAPASS SERVICE_TYPE \
+    VNCPASS USER_DISPLAY BUILD_TARGET CREATEREPO_TARGET
   declare -ga PKG_INSTALL PKG_REMOVE PKG_UPDATE PKG_QUERY
+  declare -ga SERVICES CONTAINERS
 
-  echo "Starting installJRMC"
-  (( DEBUG )) || echo "To enable debugging output, use --debug or -d"
-  (( EUID == 0 )) && err "Running as root user"
+  # Try to save users from themselves
+  (( EUID == 0 )) && err "Running as root user but continuing"
 
-  if [[ -f /etc/os-release ]]; then
-    source /etc/os-release
+  # Set default user
+  if [[ -n $SUDO_USER ]]; then
+    err "Sudo detected, attempting to continue as $SUDO_USER but this is not recommended"
+    USER="${SUDO_USER:-$USER}"
+  fi
+
+  # Set default command arguments and/or parse user input
+  if [[ $# -eq 0 ]]; then
+    debug "Automatically setting --install repo"
+    REPO_INSTALL_SWITCH=1
   else
-    err "/etc/os-release not found"
-    err "Your OS is unsupported"
-    print_help
-    exit 1
+    # Use --install=repo by default for simple arguments
+    if [[ $# -le 2 ]]; then
+      case "$1" in
+        --debug| -d| --verbose| -y| --yes| --auto| --mcrepo| --mcversion| \
+        --arch| --betapass| --restorefile| --outputdir| --no-update)
+          REPO_INSTALL_SWITCH=1
+          ;;
+        --compat)
+          if [[ $# -eq 1 ]]; then
+            BUILD_SWITCH=1
+            LOCAL_INSTALL_SWITCH=1
+          fi
+          ;;
+      esac
+    fi
+    # Parse input commands with getopt
+    parse_input "$@"
   fi
 
+  # Run the self-updater if enabled
+  ((UPDATE_SWITCH)) && update "$@"
+
+  # Get host information
+  [[ -f /etc/os-release ]] && source /etc/os-release
+
   # Detect architecture and translate to MC convention
-  ARCH=$(uname -m)
-  case $ARCH in
-    x86_64) ARCH="amd64" ;;
-    aarch64) ARCH="arm64" ;;
-  esac
+  if ARCH=$(uname -m); then
+    case $ARCH in
+      x86_64) ARCH="amd64" ;;
+      aarch64) ARCH="arm64" ;;
+    esac
+  else
+    ARCH="amd64"
+    err "Failed to detect host arch, using default: $ARCH"
+  fi
 
   debug "Detected host platform: $ID $VERSION_ID $ARCH"
 
-  # Normalize ID and set distro-specific vars
+  # Normalize ID and set host-specific vars
   case $ID in
     debian|arch) ;;
     centos|fedora)
@@ -309,7 +255,22 @@ init() {
       ;;
     rhel|almalinux) ID="centos" ;;
     linuxmint|neon|zorin|*ubuntu*) ID="ubuntu" ;;
-    *suse*) ID="suse" ;;
+    *suse*)
+      ID="suse"
+      # Currently there is no remote repository for SUSE
+      # installJRMC can easily build one but I'd rather a SUSEian provide it
+      # So use local rpmbuild method by default for SUSE
+      if [[ $# -le 2 ]]; then
+        case "$1" in
+          --debug| -d| --verbose| -y| --yes| --auto| --mcrepo| --mcversion| \
+          --arch| --betapass| --restorefile| --outputdir| --no-update)
+            REPO_INSTALL_SWITCH=0
+            BUILD_SWITCH=1
+            LOCAL_INSTALL_SWITCH=1
+            ;;
+        esac
+      fi
+      ;;
     raspbian) ID="debian" ;;
     *)
       err "Auto-detecting distro, this is unreliable and --compat may be required"
@@ -334,29 +295,27 @@ init() {
       fi
   esac
 
-  # Set defaults
+  # Set default targets
   BUILD_TARGET="${BUILD_TARGET:-$ID}"
-  REPO_TARGET="${REPO_TARGET:-$ID}"
+  CREATEREPO_TARGET="${CREATEREPO_TARGET:-$ID}"
 
-  # Match the MC repo to the system
+  # Match the MC repo to the system codename
   if [[ $ID == debian || $ID == ubuntu ]]; then
-    MC_DEFAULT_REPO=${UBUNTU_CODENAME:-${VERSION_CODENAME:-$MC_DEFAULT_REPO}}
+    MC_REPO=${UBUNTU_CODENAME:-${VERSION_CODENAME:-$MC_REPO}}
   fi
 
   # Change the repo for user-specified legacy versions
-  if [[ -n $USER_MC_VERSION ]]; then
-    case $MC_MVERSION in
-      2[0-6]) MC_DEFAULT_REPO="jessie" ;;
-      2[7-9]|30) MC_DEFAULT_REPO="buster" ;;
-      31) MC_DEFAULT_REPO="bullseye" ;;
-      # After this point, things get messy with multiple repos for the same version
-    esac
-  fi
+  case $MC_MVERSION in
+    2[0-6]) MC_REPO="jessie" ;;
+    2[7-9]|30) MC_REPO="buster" ;;
+    31) MC_REPO="bullseye" ;;
+    # After this point, things get messy with multiple repos for the same MC version
+  esac
 
   debug "Using host platform: $ID $VERSION_ID"
-  debug "Using MC repository: ${MC_REPO:-$MC_DEFAULT_REPO}"
+  debug "Using MC repository: $MC_REPO"
 
-  # Set distro-specific package manager commands 
+  # Set distro-specific package manager commands for normalized IDs
   case $ID in
     fedora|centos)
       PKG_INSTALL=(execute sudo "$RPM_MGR" install -y)
@@ -414,7 +373,7 @@ set_mc_version() {
   && buildah run "$cnt" -- sh -c \
     "apk add apt" &>/dev/null \
   && buildah run "$cnt" -- sh -c \
-    "echo 'deb [trusted=no arch=amd64,i386,armhf,arm64] http://dist.jriver.com/latest/mediacenter/ ${MC_REPO:-$MC_DEFAULT_REPO} main' > /etc/apt/sources.list 2>&1" &>/dev/null \
+    "echo 'deb [trusted=no arch=amd64,i386,armhf,arm64] http://dist.jriver.com/latest/mediacenter/ $MC_REPO main' > /etc/apt/sources.list 2>&1" &>/dev/null \
   && buildah run "$cnt" -- sh -c \
     "apt update --allow-insecure-repositories &>/dev/null" &>/dev/null \
   && MC_VERSION=$(buildah run "$cnt" -- apt-cache policy mediacenter?? | grep Candidate | awk '{print $2}' | sort -V | tail -n1) &>/dev/null \
@@ -450,7 +409,7 @@ set_mc_version() {
     esac
   fi
 
-  echo "Using MC version $MC_VERSION from the ${MC_REPO:-$MC_DEFAULT_REPO} repo (determined by $MC_VERSION_SOURCE)"
+  echo "Using MC version $MC_VERSION from the $MC_REPO repo (determined by $MC_VERSION_SOURCE)"
   return 0
 }
 
@@ -581,7 +540,7 @@ install_mc_repo() {
       install_package wget
       debug "Adding MC repository to $deb_repo_file"
       sudo bash -c "cat <<-EOF > $deb_repo_file
-				deb [trusted=yes arch=amd64,i386,armhf,arm64] http://dist.jriver.com/latest/mediacenter/ ${MC_REPO:-$MC_DEFAULT_REPO} main
+				deb [trusted=yes arch=amd64,i386,armhf,arm64] http://dist.jriver.com/latest/mediacenter/ $MC_REPO main
 			EOF"
       debug "Installing JRiver Media Center RPM key"
       wget -qO- "http://dist.jriver.com/mediacenter@jriver.com.gpg.key" | 
@@ -1024,7 +983,7 @@ link_ssl_certs() {
   done
 }
 
-# @description Restore the mjr license file from MJR_RESTORE_FILE or other common locations
+# @description Restore the mjr license file from MJR_FILE or other common locations
 restore_license() {
   debug "Running: ${FUNCNAME[0]}"
 
@@ -1054,7 +1013,7 @@ restore_license() {
 
     debug "Latest mjrfile: $newest"
 
-    for f in "$MJR_RESTORE_FILE" "$newest"; do
+    for f in "$MJR_FILE" "$newest"; do
       if [[ -f $f ]]; then
         execute "mediacenter$MC_MVERSION" "/RestoreFromFile" "$f"
       fi
@@ -1393,7 +1352,7 @@ service_jriver-createrepo() {
 
 		[Service]
 		$USER_STRING
-		ExecStart=$SCRIPT_DIR/installJRMC --outputdir=$OUTPUT_DIR --createrepo=$REPO_TARGET --createrepo-webroot=$CREATEREPO_WEBROOT --createrepo-user=$CREATEREPO_USER
+		ExecStart=$SCRIPT_DIR/installJRMC --outputdir=$OUTPUT_DIR --createrepo=$CREATEREPO_TARGET --createrepo-webroot=$CREATEREPO_WEBROOT --createrepo-user=$CREATEREPO_USER
 
 		[Install]
 		WantedBy=multi-user.target
@@ -1503,7 +1462,7 @@ uninstall() {
 }
 
 # @description Checks for installJRMC update and re-executes, if necessary
-update_self() {
+update() {
   debug "Running: ${FUNCNAME[0]} $*"
 
   local script_url="https://git.bryanroessler.com/bryan/installJRMC/raw/master/installJRMC"
@@ -1539,7 +1498,7 @@ update_self() {
     after_pull_hash=$(git -C "$SCRIPT_DIR" rev-parse HEAD)
     if [[ "$before_pull_hash" != "$after_pull_hash" ]]; then
       echo "installJRMC repository updated. Restarting script..."
-      exec "$SCRIPT_PATH" "$@" "--no-self-update"
+      exec "$SCRIPT_PATH" "$@" "--no-update"
     fi
   fi
 
@@ -1563,7 +1522,7 @@ update_self() {
     echo "Updating installJRMC $SCRIPT_VERSION to $remote_version"
     execute mv "$tmp" "$SCRIPT_PATH"
     execute chmod +x "$SCRIPT_PATH"
-    exec "$SCRIPT_PATH" "$@" "--no-self-update"
+    exec "$SCRIPT_PATH" "$@" "--no-update"
   fi
 
   rm -f "$tmp"
@@ -1573,20 +1532,16 @@ update_self() {
 main() {
   debug "Running: ${FUNCNAME[0]} $*"
 
-  parse_input "$@"
-  init
-
-  debug "Debugging on"
-  debug "installJRMC version: $SCRIPT_VERSION"
-
-  ((SELF_UPDATE)) && update_self "$@"
-
-  if ((TEST_SWITCH)); then 
-    echo "Running tests, all other options are skipped"
-    tests
-    exit
+  echo "Starting installJRMC"
+  if (( DEBUG )); then
+    echo "Debugging on"
+    echo "installJRMC version: $SCRIPT_VERSION"
+  else
+    echo "To enable debugging output, use --debug or -d"
   fi
 
+  init "$@"
+
   set_mc_version
 
   if (( UNINSTALL_SWITCH )); then
@@ -1655,7 +1610,7 @@ main() {
     [[ -d $OUTPUT_DIR/SOURCES ]] || execute mkdir -p "$OUTPUT_DIR/SOURCES"
     acquire_deb || { err "Could not download Media Center DEB package"; return 1; }
 
-    if [[ $BUILD_TARGET =~ (centos|fedora|suse) || $REPO_TARGET =~ (centos|fedora|suse) ]]; then
+    if [[ $BUILD_TARGET =~ (centos|fedora|suse) || $CREATEREPO_TARGET =~ (centos|fedora|suse) ]]; then
       install_package "dpkg" "rpm-build"
       [[ -d $OUTPUT_DIR/SPECS ]] || execute mkdir -p "$OUTPUT_DIR/SPECS"
       build_rpm