New RPM package naming convention

This commit is contained in:
2022-06-08 10:48:09 -04:00
parent 5da37a0bc3
commit 59a876afe6

View File

@@ -1,12 +1,11 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# This script will install JRiver Media Center and associated services on most major distros # Install JRiver Media Center and associated services
# See installJRMC --help or printHelp() below
# #
# Copyright (c) 2021-2022 Bryan C. Roessler # Copyright (c) 2021-2022 Bryan C. Roessler
# This software is released under the Apache License. # This software is released under the Apache License.
# https://www.apache.org/licenses/LICENSE-2.0 # https://www.apache.org/licenses/LICENSE-2.0
# #
# See installJRMC --help or printHelp() below
#
# TODO (v2) # TODO (v2)
# 1. Raspberry Pi OS support # 1. Raspberry Pi OS support
# 2. Interactive installation (ncurses?) # 2. Interactive installation (ncurses?)
@@ -18,7 +17,7 @@
shopt -s extglob shopt -s extglob
declare -g SCRIPTVERSION="1.0b16" declare -g SCRIPTVERSION="1.0b17"
declare -g OUTPUTDIR="$PWD/output" declare -g OUTPUTDIR="$PWD/output"
declare -g CREATEREPO_WEBROOT="/var/www/jriver" declare -g CREATEREPO_WEBROOT="/var/www/jriver"
declare -g USER="${SUDO_USER:-$USER}" declare -g USER="${SUDO_USER:-$USER}"
@@ -27,7 +26,7 @@ declare -g HOME; HOME=$(getent passwd "$USER" | cut -d: -f6)
printHelp() { printHelp() {
debug "Running: ${FUNCNAME[0]}" debug "Running: ${FUNCNAME[0]}"
cat <<- 'EOF' cat <<-'EOF'
USAGE: USAGE:
installJRMC [[OPTION] [VALUE]]... installJRMC [[OPTION] [VALUE]]...
@@ -43,7 +42,7 @@ printHelp() {
--compat --compat
Build/install MC locally without minimum library specifiers Build/install MC locally without minimum library specifiers
--mcversion VERSION --mcversion VERSION
Specify the MC version, ex. "29.0.18" (Default: latest) Specify the MC version, ex. "29.0.58" (Default: latest)
--outputdir PATH --outputdir PATH
Generate rpmbuild output in this directory (Default: ./output) Generate rpmbuild output in this directory (Default: ./output)
--restorefile RESTOREFILE --restorefile RESTOREFILE
@@ -115,10 +114,10 @@ askOk() {
parseInput() { parseInput() {
debug "Running: ${FUNCNAME[0]}" debug "Running: ${FUNCNAME[0]}"
declare -g BUILD_SWITCH REPO_INSTALL_SWITCH COMPAT_SWITCH LOCAL_INSTALL_SWITCH CREATEREPO_SWITCH UNINSTALL_SWITCH declare -g BUILD_SWITCH REPO_INSTALL_SWITCH COMPAT_SWITCH LOCAL_INSTALL_SWITCH CREATEREPO_SWITCH UNINSTALL_SWITCH TEST_SWITCH
declare -g OUTPUTDIR RESTOREFILE BETAPASS SERVICE_TYPE VNCPASS USER_DISPLAY CREATEREPO_WEBROOT declare -g OUTPUTDIR RESTOREFILE BETAPASS SERVICE_TYPE VNCPASS USER_DISPLAY CREATEREPO_WEBROOT
declare -ga SERVICES CONTAINERS declare -ga SERVICES CONTAINERS
declare long_opts short_opts declare long_opts short_opts input
# Allow some environment variables to override and set sane fallbacks # Allow some environment variables to override and set sane fallbacks
declare -g TARGET=${TARGET:-$ID} declare -g TARGET=${TARGET:-$ID}
@@ -136,8 +135,8 @@ parseInput() {
long_opts+="createrepo-webroot:,createrepo-user:,vncpass:,display:,container:,tests,compat" long_opts+="createrepo-webroot:,createrepo-user:,vncpass:,display:,container:,tests,compat"
short_opts="+i:vb::dhus:c:" short_opts="+i:vb::dhus:c:"
if _input=$(getopt -o $short_opts -l $long_opts -- "$@"); then if input=$(getopt -o $short_opts -l $long_opts -- "$@"); then
eval set -- "$_input" eval set -- "$input"
while true; do while true; do
case "$1" in case "$1" in
--install|-i) --install|-i)
@@ -202,19 +201,17 @@ parseInput() {
exit 0 exit 0
;; ;;
--debug|-d) --debug|-d)
echo "Debugging on"
echo "installJRMC version: $SCRIPTVERSION"
DEBUG=1 DEBUG=1
;; ;;
--help|-h) --help|-h)
printHelp && exit $? printHelp
exit
;; ;;
--uninstall|-u) --uninstall|-u)
UNINSTALL_SWITCH=1 UNINSTALL_SWITCH=1
;; ;;
--tests) --tests)
echo "Running tests, all other options are skipped" TEST_SWITCH=1
tests
;; ;;
--) --)
shift shift
@@ -227,8 +224,68 @@ parseInput() {
err "Incorrect options provided" err "Incorrect options provided"
printHelp && exit 1 printHelp && exit 1
fi fi
}
(( DEBUG )) || echo "Use --debug for verbose output"
#######################################
# Perform OS detection and apply compatability overrides
#######################################
getOS() {
debug "Running: ${FUNCNAME[0]}"
declare -g ID RPM_MGR
if [[ -e "/etc/os-release" ]]; then
source "/etc/os-release"
else
err "/etc/os-release not found"
err "Your OS is unsupported"
printHelp
exit 1
fi
debug "Detected host platform: $ID $VERSION_ID"
# normalize ID
case "$ID" in
arch|debian)
;;
centos|fedora)
if hash dnf &>/dev/null; then
RPM_MGR="dnf"
elif hash yum &>/dev/null; then
RPM_MGR="yum"
fi
;;
rhel)
ID="centos"
;;
linuxmint|neon|*ubuntu*)
ID="ubuntu"
;;
*suse*)
ID="suse"
;;
*)
echo "Autodetecting distro, this may be unreliable and --compat may also be required"
if hash dnf &>/dev/null; then
ID="fedora"
RPM_MGR="dnf"
elif hash yum &>/dev/null; then
ID="centos"
RPM_MGR="yum"
COMPAT_SWITCH=1
elif hash apt &>/dev/null; then
ID="ubuntu"
elif hash pacman &>/dev/null; then
ID="arch"
else
err "OS detection failed!"
exit 1
fi
esac
debug "Using host platform: $ID $VERSION_ID"
} }
@@ -239,9 +296,8 @@ parseInput() {
getVersion() { getVersion() {
debug "Running: ${FUNCNAME[0]}" debug "Running: ${FUNCNAME[0]}"
declare -g MCVERSION VERSION_SOURCE MVERSION MCPKG BASE="buster" # For container method declare -g MCVERSION VERSION_SOURCE MVERSION MCPKG MCRPM BASE="buster" #BASE_NEXT="bullseye"
#declare -g BASE_NEXT="bullseye" # TODO possibly use for fallback to smooth upgrades declare boardurl="https://yabb.jriver.com/interact/index.php/board,74.0.html" # MC29 (Buster)
declare boardurl="https://yabb.jriver.com/interact/index.php/board,74.0.html" # MC28 (Buster), for fallback webscrape
# User input # User input
if [[ -v MCVERSION && "$MCVERSION" =~ ([0-9]+.[0-9]+.[0-9]+) ]]; then if [[ -v MCVERSION && "$MCVERSION" =~ ([0-9]+.[0-9]+.[0-9]+) ]]; then
@@ -263,16 +319,24 @@ getVersion() {
VERSION_SOURCE="webscrape" VERSION_SOURCE="webscrape"
# Hardcoded # Hardcoded
else else
MCVERSION="29.0.18" MCVERSION="29.0.58"
VERSION_SOURCE="hardcoded version" VERSION_SOURCE="hardcoded version"
err "Warning! Using hardcoded version number" err "Warning! Using hardcoded version number"
fi fi
echo "Using MC version $MCVERSION determined by $VERSION_SOURCE"
[[ "$VERSION_SOURCE" != "user input" ]] && echo "To override, use --mcversion"
# Extract major version number
MVERSION="${MCVERSION%%.*}" MVERSION="${MCVERSION%%.*}"
MCPKG="mediacenter$MVERSION"
MCRPM="$OUTPUTDIR/RPMS/x86_64/mediacenter$MVERSION-$MCVERSION.x86_64.rpm"
if [[ "$VERSION_SOURCE" == "user input" ]]; then
# Append explicit package version when user provides --mcversion
[[ "$ID" =~ ^(fedora|centos|suse)$ ]] && MCPKG+="-$MCVERSION"
[[ "$ID" =~ ^(debian|ubuntu)$ ]] && MCPKG+="=$MCVERSION"
else
echo "To override, use --mcversion"
fi
echo "Using MC version $MCVERSION determined by $VERSION_SOURCE"
debug "MVERSION: $MVERSION, MCVERSION: $MCVERSION, MCPKG: $MCPKG, MCRPM: $MCRPM"
} }
@@ -358,72 +422,59 @@ installPackage() {
####################################### #######################################
# Adds the JRiver repository files # Installs JRiver Media Center from a remote repository
#######################################
addRepo() {
debug "Running: ${FUNCNAME[0]}"
if [[ "$ID" == "suse" ]]; then
echo "A SUSE repository is not yet available"
echo "Use --install local to locally install a SUSE RPM"
exit 1
fi
echo "Adding JRiver repository to package manager"
if [[ "$ID" =~ ^(fedora|centos)$ ]]; then
declare sources_dir="/etc/yum.repos.d/"
sudo bash -c "cat <<- EOF > $sources_dir/jriver.repo
[jriver]
name=JRiver Media Center repo by BryanC
baseurl=https://repos.bryanroessler.com/jriver
gpgcheck=0
EOF"
elif [[ "$ID" =~ ^(debian|ubuntu)$ ]]; then
declare sources_dir="/etc/apt/sources.list.d"
[[ ! -d $sources_dir ]] && sudo mkdir -p "$sources_dir"
sudo rm -rf "$sources_dir"/mediacenter*.list
installPackage wget
sudo bash -c "cat <<- EOF > $sources_dir/jriver.list
deb [trusted=yes arch=amd64,i386,armhf,arm64] http://dist.jriver.com/latest/mediacenter/ $BASE main
EOF"
#wget -q "http://dist.jriver.com/mediacenter@jriver.com.gpg.key" -O- | sudo apt-key add - &>/dev/null
wget -qO- "http://dist.jriver.com/mediacenter@jriver.com.gpg.key" | sudo tee /etc/apt/trusted.gpg.d/jriver.asc
elif [[ "$ID" == "suse" ]]; then
sudo zypper addrepo --no-gpgcheck "https://repos.bryanroessler.com/jriver" jriver &>/dev/null
elif [[ "$ID" == "arch" ]]; then
sudo bash -c "cat <<- EOF >
EOF"
fi
}
#######################################
# Installs JRiver Media Center from a repository
####################################### #######################################
installMCFromRepo() { installMCFromRepo() {
debug "Running: ${FUNCNAME[0]}" debug "Running: ${FUNCNAME[0]}"
addRepo declare repo_dir
case "$ID" in
fedora|centos)
repo_dir="/etc/yum.repos.d/"
sudo bash -c "cat <<-EOF > $repo_dir/jriver.repo
[jriver]
name=JRiver Media Center repo by BryanC
baseurl=https://repos.bryanroessler.com/jriver
gpgcheck=0
EOF"
;;
debian|ubuntu)
repo_dir="/etc/apt/sources.list.d"
[[ ! -d $repo_dir ]] && sudo mkdir -p "$repo_dir"
sudo rm -rf "$repo_dir"/mediacenter*.list
installPackage wget
sudo bash -c "cat <<-EOF > $repo_dir/jriver.list
deb [trusted=yes arch=amd64,i386,armhf,arm64] http://dist.jriver.com/latest/mediacenter/ $BASE main
EOF"
wget -qO- "http://dist.jriver.com/mediacenter@jriver.com.gpg.key" | sudo tee /etc/apt/trusted.gpg.d/jriver.asc
;;
*)
err "An MC repository for $ID is not yet available."
err "Try using --install local to install MC on $ID."
return 1
;;
esac
# Update package list # Update package list
pkg_update_cmd="pkg_update" declare pkg_update_cmd="pkg_update"
debug "$pkg_update_cmd" || pkg_update_cmd+=" &>/dev/null" debug "$pkg_update_cmd" || pkg_update_cmd+=" &>/dev/null"
if ! eval "$pkg_update_cmd"; then if ! eval "$pkg_update_cmd"; then
err "Package update failed!" err "Package update failed!"
exit 1 return 1
fi fi
echo "Installing JRiver Media Center using package manager" declare pkg_install_cmd="installPackage --skip-check-installed --nogpgcheck $MCPKG"
pkg_install_cmd="installPackage --skip-check-installed --nogpgcheck $MCPKG"
debug "$pkg_install_cmd" || pkg_install_cmd+=" &>/dev/null" debug "$pkg_install_cmd" || pkg_install_cmd+=" &>/dev/null"
eval "$pkg_install_cmd" if ! eval "$pkg_install_cmd"; then
err "Package install failed!"
return 1
fi
} }
####################################### #######################################
# Acquires the source DEB package from JRiver's servers # Acquires the source DEB package from JRiver
####################################### #######################################
acquireDeb() { acquireDeb() {
debug "Running: ${FUNCNAME[0]}" debug "Running: ${FUNCNAME[0]}"
@@ -435,7 +486,7 @@ acquireDeb() {
# If deb file already exists, skip download # If deb file already exists, skip download
if [[ -f "$MCDEB" ]]; then if [[ -f "$MCDEB" ]]; then
echo "Using local source DEB: $MCDEB" echo "Using existing DEB: $MCDEB"
return 0 return 0
fi fi
@@ -465,36 +516,6 @@ acquireDeb() {
} }
#######################################
# Installs Media Center DEB package and optional compatability fixes
#######################################
installMCDEB() {
debug "Running: ${FUNCNAME[0]}"
declare pkg_install_cmd="installPackage --skip-check-installed --nogpgcheck"
if (( COMPAT_SWITCH )); then
declare extract_dir && extract_dir="$(mktemp -d)"
pushd "$extract_dir" &>/dev/null || return
ar x "$MCDEB"
tar -xJf "control.tar.xz"
# Remove minimum version specifiers from control file
sed -i 's/ ([^)]*)//g' "control"
sed -i 's/([^)]*)//g' "control" # TODO MC DEB package error
[[ "$ID" == "ubuntu" && "${VERSION_ID%.*}" -le 16 ]] &&
sed -i 's/libva2/libva1/g' "control"
tar -cJf "control.tar.xz" "control" "postinst"
declare -g MCDEB="${MCDEB/.deb/.compat.deb}"
ar rcs "$MCDEB" "debian-binary" "control.tar.xz" "data.tar.xz"
popd &>/dev/null || return
rm -rf "$extract_dir"
pkg_install_cmd+=" --allow-downgrades"
fi
pkg_install_cmd+=" $MCDEB"
debug "$pkg_install_cmd" || pkg_install_cmd+=" &>/dev/null"
eval "$pkg_install_cmd"
}
####################################### #######################################
# Creates a SPEC file and builds the RPM from the source DEB using rpmbuild # Creates a SPEC file and builds the RPM from the source DEB using rpmbuild
####################################### #######################################
@@ -503,7 +524,6 @@ buildRPM() {
declare i rpmbuild_cmd declare i rpmbuild_cmd
declare -a requires recommends declare -a requires recommends
declare -A dupes
# skip rebuilding the rpm if it already exists # skip rebuilding the rpm if it already exists
if [[ -f "$MCRPM" ]]; then if [[ -f "$MCRPM" ]]; then
@@ -589,15 +609,6 @@ buildRPM() {
;; ;;
esac esac
# Remove duplicates
for i in "${requires[@]}"; do
if [[ ! -v dupes[${i%% *}] ]]; then
tmp+=("$i")
fi
dupes["${i%% *}"]=1
done
requires=("${tmp[@]}")
# Convert array to newline delim'd string (for heredoc) # Convert array to newline delim'd string (for heredoc)
printf -v requires "Requires: %s\n" "${requires[@]}" printf -v requires "Requires: %s\n" "${requires[@]}"
printf -v recommends "Recommends: %s\n" "${recommends[@]}" printf -v recommends "Recommends: %s\n" "${recommends[@]}"
@@ -605,14 +616,14 @@ buildRPM() {
requires="${requires%?}" requires="${requires%?}"
recommends="${recommends%?}" recommends="${recommends%?}"
if (( COMPAT_SWITCH )); then if (( COMPAT_SWITCH )); then
# Strip minimum versions # Strip minimum versions
requires=$(echo "$requires" | awk -F" " 'NF == 4 {print $1 " " $2} NF != 4 {print $0}') requires=$(echo "$requires" | awk -F" " 'NF == 4 {print $1 " " $2} NF != 4 {print $0}')
fi fi
# Create spec file # Create spec file
cat <<- EOF > "$OUTPUTDIR/SPECS/mediacenter.spec" cat <<-EOF > "$OUTPUTDIR/SPECS/mediacenter.spec"
Name: MediaCenter Name: mediacenter$MVERSION
Version: $MCVERSION Version: $MCVERSION
Release: 1 Release: 1
Summary: JRiver Media Center Summary: JRiver Media Center
@@ -626,6 +637,8 @@ buildRPM() {
$requires $requires
$recommends $recommends
Conflicts: MediaCenter
Provides: mediacenter$MVERSION Provides: mediacenter$MVERSION
License: Copyright 1998-2022, JRiver, Inc. All rights reserved. Protected by U.S. patents #7076468 and #7062468 License: Copyright 1998-2022, JRiver, Inc. All rights reserved. Protected by U.S. patents #7076468 and #7062468
@@ -656,7 +669,8 @@ buildRPM() {
EOF EOF
# Run rpmbuild # Run rpmbuild
echo "Building RPM for MC $MCVERSION, this may take awhile" echo "Building MC $MCVERSION RPM, this may take awhile"
(( DEBUG )) || echo "Use --debug for verbose output"
rpmbuild_cmd="rpmbuild --define=\"%_topdir $OUTPUTDIR\" --define=\"%_libdir /usr/lib\" -bb" rpmbuild_cmd="rpmbuild --define=\"%_topdir $OUTPUTDIR\" --define=\"%_libdir /usr/lib\" -bb"
rpmbuild_cmd+=" $OUTPUTDIR/SPECS/mediacenter.spec" rpmbuild_cmd+=" $OUTPUTDIR/SPECS/mediacenter.spec"
debug "$rpmbuild_cmd" || rpmbuild_cmd+=" &>/dev/null" debug "$rpmbuild_cmd" || rpmbuild_cmd+=" &>/dev/null"
@@ -672,9 +686,52 @@ buildRPM() {
} }
installMCArch() { #######################################
# Installs local Media Center DEB package and optional compatability fixes
#######################################
installMCDEB() {
debug "Running: ${FUNCNAME[0]}"
declare pkg_install_cmd="installPackage --skip-check-installed --nogpgcheck"
if (( COMPAT_SWITCH )); then
declare extract_dir && extract_dir="$(mktemp -d)"
pushd "$extract_dir" &>/dev/null || return
ar x "$MCDEB"
tar -xJf "control.tar.xz"
# Remove minimum version specifiers from control file
sed -i 's/ ([^)]*)//g' "control"
sed -i 's/([^)]*)//g' "control" # TODO MC DEB package error
[[ "$ID" == "ubuntu" && "${VERSION_ID%.*}" -le 16 ]] &&
sed -i 's/libva2/libva1/g' "control"
tar -cJf "control.tar.xz" "control" "postinst"
declare -g MCDEB="${MCDEB/.deb/.compat.deb}"
ar rcs "$MCDEB" "debian-binary" "control.tar.xz" "data.tar.xz"
popd &>/dev/null || return
rm -rf "$extract_dir"
pkg_install_cmd+=" --allow-downgrades"
fi
pkg_install_cmd+=" $MCDEB"
debug "$pkg_install_cmd" || pkg_install_cmd+=" &>/dev/null"
eval "$pkg_install_cmd"
}
#######################################
# Installs local Media Center RPM package
#######################################
installMCRPM() {
debug "Running: ${FUNCNAME[0]}"
installPackage --skip-check-installed --nogpgcheck "$MCRPM"
}
#######################################
# Installs local Media Center PKGBUILD
#######################################
installMCARCH() {
debug "Running: ${FUNCNAME[0]}" debug "Running: ${FUNCNAME[0]}"
echo "Arch install under construction" echo "Arch install under construction"
} }
@@ -731,8 +788,6 @@ runCreaterepo() {
return 1 return 1
fi fi
fi fi
echo "Successfully updated repo"
} }
@@ -801,55 +856,56 @@ openFirewall() {
# Create OS-specific port rules based on argument (service) name # Create OS-specific port rules based on argument (service) name
declare -a f_ports # for firewall-cmd declare -a f_ports # for firewall-cmd
declare u_ports # for ufw declare u_ports # for ufw
declare -a n_ports # for nftables #declare -a n_ports # for nftables
declare port declare port
if [[ "$1" == "jriver-mediacenter" ]]; then if [[ "$1" == "jriver-mediacenter" ]]; then
f_ports=(52100-52200/tcp 1900/udp) f_ports=(52100-52200/tcp 1900/udp)
u_ports="52100:52200/tcp|1900/udp" u_ports="52100:52200/tcp|1900/udp"
n_ports=("tcp dport 52100-52200 accept" "udp dport 1900 accept") #n_ports=("tcp dport 52100-52200 accept" "udp dport 1900 accept")
elif [[ "$1" =~ ^(jriver-x11vnc|jriver-xvnc)$ ]]; then elif [[ "$1" =~ ^(jriver-x11vnc|jriver-xvnc)$ ]]; then
f_ports=("$PORT"/tcp 1900/udp) f_ports=("$PORT"/tcp 1900/udp)
u_ports="$PORT/tcp|1900/udp" u_ports="$PORT/tcp|1900/udp"
n_ports=("tcp dport $PORT accept" "udp dport 1900 accept") #n_ports=("tcp dport $PORT accept" "udp dport 1900 accept")
fi fi
# Open the ports # Open the ports
if [[ "$ID" =~ ^(fedora|centos|suse)$ ]]; then if ! case "$ID" in
hash firewall-cmd 2>/dev/null || installPackage firewalld fedora|centos|suse)
if ! firewall_cmd --get-services | grep -q "$1"; then hash firewall-cmd 2>/dev/null || installPackage firewalld
firewall_cmd --permanent --new-service="$1" &>/dev/null if ! firewall_cmd --get-services | grep -q "$1"; then
firewall_cmd --permanent --service="$1" --set-description="$1 installed by installJRMC" &>/dev/null firewall_cmd --permanent --new-service="$1" &>/dev/null
firewall_cmd --permanent --service="$1" --set-short="$1" &>/dev/null firewall_cmd --permanent --service="$1" --set-description="$1 installed by installJRMC" &>/dev/null
for port in "${f_ports[@]}"; do firewall_cmd --permanent --service="$1" --set-short="$1" &>/dev/null
firewall_cmd --permanent --service="$1" --add-port="$port" &>/dev/null for port in "${f_ports[@]}"; do
done firewall_cmd --permanent --service="$1" --add-port="$port" &>/dev/null
firewall_cmd --add-service "$1" --permanent &>/dev/null done
firewall_cmd --reload &>/dev/null firewall_cmd --add-service "$1" --permanent &>/dev/null
fi firewall_cmd --reload &>/dev/null
elif [[ "$ID" =~ ^(debian|ubuntu)$ ]]; then fi
# Debian ufw package state is broken on fresh installations ;;
hash ufw 2>/dev/null || installPackage ufw debian|ubuntu)
if [[ ! -f "/etc/ufw/applications.d/$1" ]]; then # Debian ufw package state is broken on fresh installations
sudo bash -c "cat <<- EOF > /etc/ufw/applications.d/$1 hash ufw 2>/dev/null || installPackage ufw
[$1] if [[ ! -f "/etc/ufw/applications.d/$1" ]]; then
title=$1 sudo bash -c "cat <<-EOF > /etc/ufw/applications.d/$1
description=$1 installed by installJRMC [$1]
ports=$u_ports title=$1
EOF" description=$1 installed by installJRMC
fi ports=$u_ports
firewall_cmd app update "$1" &>/dev/null EOF"
firewall_cmd allow "$1" &>/dev/null fi
elif [[ "$ID" == "arch" ]]; then firewall_cmd app update "$1" &>/dev/null
sysctl -w net.ipv4.ip_forward = 1 firewall_cmd allow "$1" &>/dev/null
sudo nft create table inet "jriver" ;;
sudo nft create chain inet "jriver" "$1" '{ type filter hook input priority 0; policy accept; }' arch)
for port in "${n_ports[@]}"; do # sysctl -w net.ipv4.ip_forward = 1
sudo nft add rule inet jriver "$1" handle tcp dport "$port" # sudo nft create table inet "jriver"
done # sudo nft create chain inet "jriver" "$1" '{ type filter hook input priority 0; policy accept; }'
fi # for port in "${n_ports[@]}"; do
# sudo nft add rule inet jriver "$1" handle tcp dport "$port"
# shellcheck disable=SC2181 # More concise # done
if [[ $? -ne 0 ]]; then ;;
esac; then
err "Firewall ports could not be opened" err "Firewall ports could not be opened"
return 1 return 1
fi fi
@@ -974,7 +1030,7 @@ service_jriver-mediacenter() {
setServiceVars "${FUNCNAME[0]##*_}" setServiceVars "${FUNCNAME[0]##*_}"
sudo bash -c "cat <<- EOF > $SERVICE_FNAME sudo bash -c "cat <<-EOF > $SERVICE_FNAME
[Unit] [Unit]
Description=JRiver Media Center $MVERSION Description=JRiver Media Center $MVERSION
After=$GRAPHICAL_TARGET After=$GRAPHICAL_TARGET
@@ -1033,7 +1089,7 @@ service_jriver-xvnc() {
start_cmd="/usr/bin/vncserver $NEXT_DISPLAY -geometry 1440x900 -alwaysshared -rfbauth $HOME/.vnc/jrmc_passwd -autokill -xstartup /usr/bin/mediacenter$MVERSION" start_cmd="/usr/bin/vncserver $NEXT_DISPLAY -geometry 1440x900 -alwaysshared -rfbauth $HOME/.vnc/jrmc_passwd -autokill -xstartup /usr/bin/mediacenter$MVERSION"
fi fi
sudo bash -c "cat <<- EOF > $SERVICE_FNAME sudo bash -c "cat <<-EOF > $SERVICE_FNAME
[Unit] [Unit]
Description=Remote desktop service (VNC) Description=Remote desktop service (VNC)
After=multi-user.target After=multi-user.target
@@ -1306,7 +1362,7 @@ service_jriver-createrepo() {
# brc add-pkg --virtual .build-deps wget # brc add-pkg --virtual .build-deps wget
# brc sh -s <<- EOF # brc sh -s <<-EOF
# wget -q "http://dist.jriver.com/mediacenter@jriver.com.gpg.key" -O- | apt-key add - &>/dev/null # wget -q "http://dist.jriver.com/mediacenter@jriver.com.gpg.key" -O- | apt-key add - &>/dev/null
# EOF # EOF
@@ -1319,70 +1375,6 @@ service_jriver-createrepo() {
# brc del-pkg .build-deps # brc del-pkg .build-deps
# } # }
#######################################
# Perform OS detection and use compatability modes if necessary
#######################################
getOS() {
debug "Running: ${FUNCNAME[0]}"
declare -g ID MGR
if [[ -e "/etc/os-release" ]]; then
source "/etc/os-release"
else
err "/etc/os-release not found"
err "Your OS is unsupported"
printHelp && exit 1
fi
debug "Detected host platform: $ID $VERSION_ID"
# normalize ID
case "$ID" in
fedora|arch|debian|centos)
;;
rhel)
ID="centos"
;;
linuxmint|neon|*ubuntu*)
ID="ubuntu"
;;
*suse*)
ID="suse"
;;
*)
echo "Autodetecting distro, this may be unreliable and --compat may also be required"
if hash dnf &>/dev/null; then
ID="fedora"
MGR="dnf"
elif hash yum &>/dev/null; then
ID="centos"
MGR="yum"
COMPAT_SWITCH=1
elif hash apt &>/dev/null; then
ID="ubuntu"
elif hash pacman &>/dev/null; then
ID="arch"
else
err "OS detection failed!"
exit 1
fi
esac
# Set package manager for RPM distros
case "$ID" in
centos|fedora)
if hash dnf &>/dev/null; then
MGR="dnf"
elif hash yum &>/dev/null; then
MGR="yum"
fi
;;
esac
debug "Using host platform: $ID $VERSION_ID"
}
####################################### #######################################
# Detects if MC is installed on btrfs and disables CoW # Detects if MC is installed on btrfs and disables CoW
@@ -1432,11 +1424,6 @@ uninstall() {
declare service unit f i declare service unit f i
if ! askOk "Do you really want to uninstall JRiver Media Center"; then
echo "Uninstall canceled"
exit 0
fi
echo "Stopping and removing all Media Center services" echo "Stopping and removing all Media Center services"
for service in $(compgen -A "function" "service"); do for service in $(compgen -A "function" "service"); do
service="${service##service_}" service="${service##service_}"
@@ -1487,8 +1474,8 @@ uninstall() {
eval "$firewall_cmd" eval "$firewall_cmd"
[[ -f "/etc/ufw/applications.d/jriver" ]] && [[ -f "/etc/ufw/applications.d/jriver" ]] &&
sudo rm -f /etc/ufw/applications.d/jriver sudo rm -f /etc/ufw/applications.d/jriver
elif hash nft 2>/dev/null; then # elif hash nft 2>/dev/null; then
sudo nft delete table inet jriver # sudo nft delete table inet jriver
fi fi
echo "Uninstalling JRiver Media Center package" echo "Uninstalling JRiver Media Center package"
@@ -1498,8 +1485,7 @@ uninstall() {
echo "JRiver Media Center has been completely uninstalled" echo "JRiver Media Center has been completely uninstalled"
echo "To remove your library files, run: rm -rf $HOME/.jriver" echo "To remove your library files, run: rm -rf $HOME/.jriver"
elif [[ $? -eq 100 ]]; then elif [[ $? -eq 100 ]]; then
err "JRiver Media Center package '$MCPKG' is not present" err "JRiver Media Center package '$MCPKG' is not present and was not uninstalled"
err "and was not uninstalled"
else else
err "Could not remove Media Center package" err "Could not remove Media Center package"
fi fi
@@ -1517,65 +1503,84 @@ main() {
getOS getOS
# Distro-specific commands
if [[ "$ID" =~ ^(fedora|centos)$ ]]; then
pkg_install(){ sudo "$MGR" install -y "$@"; }
pkg_remove(){ sudo "$MGR" remove -y "$@"; }
pkg_update(){ sudo "$MGR" makecache; }
pkg_query(){ rpm -q "$@"; }
firewall_cmd(){ sudo firewall-cmd "$@"; }
elif [[ "$ID" =~ ^(debian|ubuntu)$ ]]; then
pkg_install(){ sudo apt-get install -y -q0 "$@"; }
pkg_remove(){ sudo apt-get remove --auto-remove -y -q0 "$@"; }
pkg_update(){ sudo apt-get update -y -q0; }
pkg_query(){ dpkg -s "$@"; }
firewall_cmd(){ sudo ufw "$@"; }
elif [[ "$ID" == "suse" ]]; then
pkg_install(){ sudo zypper --non-interactive -q install --force --no-confirm "$@"; }
pkg_remove(){ sudo zypper --non-interactive -q remove --clean-deps "$@"; }
pkg_update(){ sudo zypper --non-interactive -q refresh jriver; }
pkg_query(){ rpm -q "$@"; }
firewall_cmd(){ sudo firewall-cmd "$@"; }
elif [[ "$ID" == "arch" ]]; then
pkg_install(){ sudo pacman -Sy --noconfirm "$@"; }
pkg_remove(){ sudo pacman -Rs --noconfirm "$@"; }
pkg_update(){ sudo pacman -Syy ; }
pkg_query(){ sudo pacman -Qs "$@"; }
firewall_cmd(){ sudo nft -A INPUT "$@"; }
fi
parseInput "$@" parseInput "$@"
getVersion if (( DEBUG )); then
echo "Debugging on"
# Set target package name echo "installJRMC version: $SCRIPTVERSION"
if [[ "$ID" =~ ^(fedora|centos|suse)$ ]]; then
MCPKG="MediaCenter"
[[ "$VERSION_SOURCE" == "user input" ]] && MCPKG="$MCPKG-$MCVERSION"
elif [[ "$ID" =~ ^(debian|ubuntu)$ ]]; then
MCPKG="mediacenter$MVERSION"
[[ "$VERSION_SOURCE" == "user input" ]] && MCPKG="$MCPKG=$MCVERSION"
fi fi
declare -g MCRPM="$OUTPUTDIR/RPMS/x86_64/MediaCenter-$MCVERSION.x86_64.rpm" # Distro-specific commands
case "$ID" in
fedora|centos)
pkg_install(){ sudo "$RPM_MGR" install -y "$@"; }
pkg_install_local() { installMCRPM; }
pkg_remove(){ sudo "$RPM_MGR" remove -y "$@"; }
pkg_update(){ sudo "$RPM_MGR" makecache; }
pkg_query(){ rpm -q "$@"; }
firewall_cmd(){ sudo firewall-cmd "$@"; }
;;
debian|ubuntu)
pkg_install(){ sudo apt-get install -y -q0 "$@"; }
pkg_install_local() { installMCDEB; }
pkg_remove(){ sudo apt-get remove --auto-remove -y -q0 "$@"; }
pkg_update(){ sudo apt-get update -y -q0; }
pkg_query(){ dpkg -s "$@"; }
firewall_cmd(){ sudo ufw "$@"; }
;;
suse)
pkg_install(){ sudo zypper --non-interactive -q install --force --no-confirm "$@"; }
pkg_install_local() { installMCRPM; }
pkg_remove(){ sudo zypper --non-interactive -q remove --clean-deps "$@"; }
pkg_update(){ sudo zypper --non-interactive -q refresh jriver; }
pkg_query(){ rpm -q "$@"; }
firewall_cmd(){ sudo firewall-cmd "$@"; }
;;
arch)
pkg_install(){ sudo pacman -Sy --noconfirm "$@"; }
pkg_install_local() { installMCARCH; }
pkg_remove(){ sudo pacman -Rs --noconfirm "$@"; }
pkg_update(){ sudo pacman -Syy ; }
pkg_query(){ sudo pacman -Qs "$@"; }
#firewall_cmd(){ sudo nft -A INPUT "$@"; }
;;
esac
if (( UNINSTALL_SWITCH )); then if ((TEST_SWITCH)); then
uninstall echo "Running tests, all other options are skipped"
tests
exit exit
fi fi
# Some distros need external repos installed for MC libraries getVersion
if [[ "$ID" == "ubuntu" ]]; then
if ! grep ^deb /etc/apt/sources.list|grep -q universe; then if (( UNINSTALL_SWITCH )); then
echo "Adding universe repository" if askOk "Do you really want to uninstall JRiver Media Center?"; then
sudo add-apt-repository universe uninstall
fi else
elif [[ "$ID" =~ ^(centos)$ ]] && ! hash dpkg &>/dev/null; then echo "Uninstall canceled."
echo "Adding EPEL repository" fi
installPackage epel-release exit
fi fi
# Install external repos, if required
case "$ID" in
ubuntu)
if ! grep ^deb /etc/apt/sources.list|grep -q universe; then
echo "Adding universe repository"
sudo add-apt-repository universe
fi
;;
centos)
if ! hash dpkg &>/dev/null; then
echo "Adding EPEL repository"
installPackage epel-release
fi
;;
esac
if (( REPO_INSTALL_SWITCH )); then if (( REPO_INSTALL_SWITCH )); then
echo "Installing JRiver Media Center from remote repository"
if installMCFromRepo; then if installMCFromRepo; then
echo "JRiver Media Center installed successfully from repo" echo "JRiver Media Center installed successfully from repo"
symlinkCerts symlinkCerts
@@ -1585,7 +1590,7 @@ main() {
disableCoW disableCoW
else else
err "JRiver Media Center installation from repo failed" err "JRiver Media Center installation from repo failed"
exit 1 return 1
fi fi
fi fi
@@ -1599,14 +1604,11 @@ main() {
fi fi
if (( LOCAL_INSTALL_SWITCH )); then if (( LOCAL_INSTALL_SWITCH )); then
if ([[ "$TARGET" =~ (debian|ubuntu) ]] && installMCDEB) || if pkg_install_local; then
([[ "$TARGET" =~ (fedora|centos|suse) ]] &&
installPackage --skip-check-installed --nogpgcheck "$MCRPM") ||
([[ "$TARGET" == "arch" ]] && installMCArch); then
echo "JRiver Media Center installed successfully from local package" echo "JRiver Media Center installed successfully from local package"
else else
err "JRiver Media Center local package installation failed" err "JRiver Media Center local package installation failed"
exit 1 return 1
fi fi
symlinkCerts symlinkCerts
migrateLibrary migrateLibrary
@@ -1616,7 +1618,11 @@ main() {
fi fi
if (( CREATEREPO_SWITCH )); then if (( CREATEREPO_SWITCH )); then
runCreaterepo if runCreaterepo; then
echo "Successfully updated repo"
else
err "Repo creation failed"
fi
fi fi
if [[ "${#SERVICES[@]}" -gt 0 ]]; then if [[ "${#SERVICES[@]}" -gt 0 ]]; then
@@ -1643,7 +1649,5 @@ main() {
# done # done
} }
# Quickly turn debugging on (catch for real with getopt in parseInput())
[[ " $* " =~ ( --debug | -d ) ]] && echo "First Debugging on!" && DEBUG=1
main "$@" main "$@"