959 lines
30 KiB
Bash
Executable File
959 lines
30 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# This script will download, build, and install JRiver Media Center with optional systemd services
|
|
# on Fedora, CentOS, Debian, and Ubuntu
|
|
#
|
|
# To-dos:
|
|
# 1. Raspberry Pi support -- do not own one so difficult to test
|
|
# 2. Arch support -- would love some testing and PRs
|
|
# 3. ncurses graphical installer
|
|
shopt -s extglob
|
|
|
|
installJRMC () {
|
|
|
|
########################
|
|
####### DEFAULTS #######
|
|
########################
|
|
|
|
_scriptversion="0.1"
|
|
|
|
[[ -z "$_boardurl" ]] && \
|
|
_boardurl="https://yabb.jriver.com/interact/index.php/board,64.0.html"
|
|
|
|
[[ -z "$_outputdir" ]] && \
|
|
_outputdir="$_basedir/output"
|
|
|
|
[[ -z $_createrepo_webroot ]] && \
|
|
_createrepo_webroot="/srv/jriver"
|
|
|
|
[[ -z $_createrepo_user ]] && \
|
|
_createrepo_user="$(whoami)"
|
|
|
|
[[ -z $_user ]] && \
|
|
_user="$(whoami)"
|
|
|
|
[[ -z $_display ]] && \
|
|
_display="${DISPLAY:-":0"}"
|
|
|
|
########################
|
|
###### FUNCTIONS #######
|
|
########################
|
|
|
|
_printHelpAndExit () {
|
|
|
|
_runDebug "${FUNCNAME[0]}"
|
|
|
|
cat <<-'EOF'
|
|
USAGE:
|
|
installJRMC [[OPTION] [VALUE]]...
|
|
|
|
OPTIONS
|
|
--rpmbuild
|
|
Debian/Ubuntu: Build RPM from source DEB
|
|
Fedora/CentOS: Build RPM from source DEB and install it
|
|
--outputdir PATH
|
|
Generate rpmbuild output in this directory (Default: $PWD/outputdir)
|
|
--mcversion VERSION
|
|
Build or install a specific version (Default: scrape the latest version from Interact)
|
|
--restorefile RESTOREFILE
|
|
Restore file location for registration (Default: skip registration)
|
|
--betapass PASSWORD
|
|
Enter beta team password for access to beta builds
|
|
--service SERVICE
|
|
See SERVICES section below for a list of possible service to install
|
|
-v|--version
|
|
Print this script version and exit
|
|
-d|--debug
|
|
Enter debug mode
|
|
-h|--help
|
|
Print help dialog and exit
|
|
-u|--uninstall
|
|
Uninstall JRiver MC, cleanup service files, and remove firewall rules (does not remove
|
|
library files)
|
|
|
|
CREATEREPO
|
|
--createrepo
|
|
Build rpm, copy to webroot, and run createrepo
|
|
|
|
--createrepo-webroot PATH
|
|
The webroot directory to install the repo (Default: /srv/jriver/)
|
|
--createrepo-user USER
|
|
The web server user (Default: current user)
|
|
|
|
SERVICES
|
|
mediaserver
|
|
Create and enable a JRiver MC Media Server systemd service for the current user
|
|
|
|
x11vnc-mediaserver
|
|
Create and enable a JRiver MC mediaserver service and x11vnc (for headless
|
|
installations without an existing X server) service for the current user
|
|
|
|
--vncpass PASSWORD
|
|
Set vnc password for x11vnc access. If no password is set, the script will either use
|
|
existing password stored in ~/.vnc/jrmc_passwd or use no password
|
|
--display DISPLAY
|
|
Start X11VNC on this display (Default: The current display or :0 if current display is
|
|
unaccessible)
|
|
|
|
createrepo
|
|
Install service to build latest MC RPM and run createrepo hourly for the current user
|
|
EOF
|
|
|
|
# Exit using passed exit code
|
|
[[ -z $1 ]] && exit 0 || exit "$1"
|
|
}
|
|
|
|
|
|
_parseInput () {
|
|
|
|
_runDebug "${FUNCNAME[0]}"
|
|
|
|
if _input=$(getopt -o +vdhu -l rpmbuild,outputdir:,mcversion:,restorefile:,betapass:,service:,version,debug,help,uninstall,createrepo,createrepo-webroot:,createrepo-user:,vncpass:,display: -- "$@"); then
|
|
eval set -- "$_input"
|
|
while true; do
|
|
case "$1" in
|
|
--rpmbuild)
|
|
_rpmbuild="true"
|
|
;;
|
|
--outputdir)
|
|
shift && _outputdir="$1"
|
|
;;
|
|
--mcversion)
|
|
shift && _mcversion="$1"
|
|
;;
|
|
--restorefile)
|
|
shift && _restorefile="$1"
|
|
;;
|
|
--betapass)
|
|
shift && _betapass="$1"
|
|
;;
|
|
--service)
|
|
shift && _service="$1"
|
|
;;
|
|
--version|-v)
|
|
echo "Version: $_scriptversion"
|
|
exit 0
|
|
;;
|
|
--debug|-d)
|
|
echo "Debugging on"
|
|
_debug="true"
|
|
;;
|
|
--help|-h)
|
|
_printHelpAndExit 0
|
|
;;
|
|
--uninstall|-u)
|
|
_uninstall="true"
|
|
;;
|
|
--createrepo)
|
|
_createrepo="true"
|
|
;;
|
|
--createrepo-webroot)
|
|
shift && _createrepo_webroot="$1"
|
|
;;
|
|
--createrepo-user)
|
|
shift && _createrepo_user="$1"
|
|
;;
|
|
--vncpass)
|
|
shift && _vncpass="$1"
|
|
;;
|
|
--display)
|
|
shift && _display="$1"
|
|
;;
|
|
--)
|
|
shift
|
|
break
|
|
;;
|
|
esac
|
|
shift
|
|
done
|
|
else
|
|
echo "Incorrect options provided"
|
|
_printHelpAndExit 1
|
|
fi
|
|
}
|
|
|
|
|
|
_runDebug () {
|
|
|
|
[[ -n $_debug ]] && echo "Running: " "$@"
|
|
}
|
|
|
|
|
|
_checkUser () {
|
|
|
|
_runDebug "${FUNCNAME[0]}"
|
|
|
|
if [[ "$_user" == "root" ]]; then
|
|
|
|
cat <<EOF
|
|
Warning! You are currently running installJRMC as the root user. This is not recommended! When
|
|
running as a regular user, installJRMC will ask you for your sudo password when necessary.
|
|
|
|
Installation will continue but any systemd services will be installed as system services and you
|
|
may run into permissions issues.
|
|
EOF
|
|
else
|
|
[[ -n $_debug ]] && echo "Installing as user: $_user"
|
|
fi
|
|
}
|
|
|
|
|
|
_getOS () {
|
|
|
|
_runDebug "${FUNCNAME[0]}"
|
|
|
|
if [[ -e /etc/os-release ]]; then
|
|
source /etc/os-release
|
|
else
|
|
echo "No /etc/os-release found!"
|
|
echo "Your OS is unsupported"
|
|
_printHelpAndExit 1
|
|
fi
|
|
|
|
[[ -n $_debug ]] && echo "Platform: $ID $VERSION_ID"
|
|
}
|
|
|
|
|
|
_buildCommands () {
|
|
|
|
_runDebug "${FUNCNAME[0]}"
|
|
|
|
# build some basic command arrays based on OS and user input
|
|
if [[ "$ID" =~ ^(fedora|centos)$ ]]; then
|
|
_install_cmd=("dnf" "install" "-y")
|
|
_update_cmd=("dnf" "makecache" "-y")
|
|
_pkg_query_cmd=("rpm" "-q")
|
|
_firewall_cmd=("firewall-cmd")
|
|
elif [[ "$ID" =~ ^(ubuntu|debian)$ ]]; then
|
|
_install_cmd=("apt-get" "install" "-y")
|
|
_update_cmd=("apt-get" "update" "-y")
|
|
_pkg_query_cmd=("dpkg" "-l")
|
|
_firewall_cmd=("ufw")
|
|
fi
|
|
|
|
_bash_cmd=("bash" "-c")
|
|
_rm_cmd=("rm" "-rf")
|
|
|
|
_install_cmd_nogpg=("${_install_cmd[@]}" "--nogpgcheck")
|
|
|
|
# append sudo for non-root users
|
|
if [[ "$_user" != "root" ]]; then
|
|
_install_cmd=("sudo" "${_install_cmd[@]}")
|
|
_install_cmd_nogpg=("sudo" "${_install_cmd_nogpg[@]}")
|
|
_update_cmd=("sudo" "${_update_cmd[@]}")
|
|
_bash_cmd=("sudo" "${_bash_cmd[@]}")
|
|
_rm_cmd=("sudo" "${_rm_cmd[@]}")
|
|
_firewall_cmd=("sudo" "${_firewall_cmd[@]}")
|
|
#_pkg_query_cmd=("sudo" "${_pkg_query_cmd[@]}")
|
|
fi
|
|
|
|
[[ -n $_debug ]] && \
|
|
echo "Install command: " "${_install_cmd[@]}" && \
|
|
echo "Update command: " "${_update_cmd[@]}" && \
|
|
echo "Bash command: " "${_bash_cmd[@]}" && \
|
|
echo "Package query command: " "${_pkg_query_cmd[@]}"
|
|
}
|
|
|
|
|
|
_installPackage () {
|
|
|
|
_runDebug "${FUNCNAME[0]}" "$@"
|
|
|
|
# We will add packages to this array if their command is not available
|
|
local -a _pkg_array
|
|
local -a _url_pkg_array
|
|
|
|
# parse commands
|
|
for _pkg in "$@"; do
|
|
# Clean up package name and handle OS-specific tweaks
|
|
_packageQuirks "$_pkg"
|
|
# Insert the package name to test if already installed
|
|
if [[ "$_pkg" != "" ]] && ! "${_pkg_query_cmd[@]}" "$_pkg" > /dev/null 2>&1; then
|
|
if [[ -n $_url_pkg ]]; then
|
|
_url_pkg_array+=("$_url_pkg")
|
|
else
|
|
_pkg_array+=("$_pkg")
|
|
fi
|
|
fi
|
|
done
|
|
|
|
if [[ ${#_pkg_array[@]} -ge 1 ]]; then
|
|
echo "Installing: " "${_pkg_array[@]}"
|
|
"${_install_cmd[@]}" "${_pkg_array[@]}" > /dev/null 2>&1
|
|
fi
|
|
|
|
if [[ ${#_url_pkg_array[@]} -ge 1 ]]; then
|
|
echo "Installing: " "${_url_pkg_array[@]}"
|
|
"${_install_cmd_nogpg[@]}" "${_url_pkg_array[@]}" > /dev/null 2>&1
|
|
fi
|
|
}
|
|
|
|
|
|
_packageQuirks () {
|
|
|
|
_runDebug "${FUNCNAME[0]}" "$@"
|
|
|
|
unset _url_pkg
|
|
|
|
if [[ "$1" == "rpm-build" && "$ID" =~ ^(ubuntu|debian)$ ]]; then
|
|
_pkg="rpm"
|
|
elif [[ "$1" == "createrepo_c" && "$ID" =~ ^(ubuntu|debian)$ ]]; then
|
|
_pkg="createrepo"
|
|
elif [[ "$1" == "rpmfusion-free-release" ]]; then
|
|
if [[ "$ID" == "fedora" ]]; then
|
|
_url_pkg="https://download1.rpmfusion.org/free/$ID/rpmfusion-free-release-$VERSION_ID.noarch.rpm"
|
|
_pkg="$1"
|
|
elif [[ "$ID" == "centos" ]]; then
|
|
_url_pkg="https://download1.rpmfusion.org/free/el/rpmfusion-free-release-$VERSION_ID.noarch.rpm"
|
|
_pkg="$1"
|
|
else
|
|
_pkg=""
|
|
fi
|
|
elif [[ "$1" == "epel-release" && "$ID" != "centos" ]]; then
|
|
_pkg=""
|
|
else
|
|
_pkg="$1"
|
|
fi
|
|
}
|
|
|
|
|
|
_setVersion () {
|
|
|
|
_runDebug "${FUNCNAME[0]}"
|
|
|
|
if [[ -z "$_mcversion" ]]; then
|
|
|
|
_installPackage wget
|
|
|
|
# Get latest version from Interact
|
|
echo -n "Scraping latest MC version number from Interact..."
|
|
if ! _mcversion=$(wget -qO- "$_boardurl" | grep -o "[0-9][0-9]\.[0-9]\.[0-9]\+" | head -n 1); then
|
|
echo "MC version could not be scraped. Please specify a version manually using --mcversion or check your --boardurl"
|
|
fi
|
|
fi
|
|
|
|
if [[ "$_mcversion" =~ ^[0-9]+.[0-9].[0-9]+ ]]; then
|
|
echo "$_mcversion"
|
|
else
|
|
echo "MC version: $_mcversion could not be parsed!"
|
|
_printHelpAndExit 1
|
|
fi
|
|
|
|
# Extract major and variation version numbers
|
|
_mversion="${_mcversion%%.*}"
|
|
#_variation="${_mcversion##*.}"
|
|
}
|
|
|
|
_sanityChecks () {
|
|
|
|
_runDebug "${FUNCNAME[0]}"
|
|
|
|
# Cannot create a repo without an rpm
|
|
if [[ -n $_createrepo || "$_service" == "createrepo" ]]; then
|
|
_rpmbuild="true"
|
|
fi
|
|
|
|
# Check for bad service name
|
|
if [[ -n $_service && ! "$_service" =~ ^(mediaserver|x11vnc-mediaserver|createrepo)$ ]]; then
|
|
echo "Incorrect service type provided!"
|
|
_printHelpAndExit 1
|
|
fi
|
|
}
|
|
|
|
|
|
_installExternalRepos () {
|
|
|
|
_runDebug "${FUNCNAME[0]}"
|
|
|
|
_installPackage rpmfusion-free-release epel-release
|
|
}
|
|
|
|
|
|
_installRepo () {
|
|
|
|
_runDebug "${FUNCNAME[0]}"
|
|
|
|
_installPackage wget gnupg
|
|
|
|
if [[ "$ID" =~ ^(fedora|centos)$ ]]; then
|
|
|
|
"${_bash_cmd[@]}" 'cat <<-EOF > /etc/yum.repos.d/jriver.repo
|
|
[jriver]
|
|
name=JRiver Media Center repo by BryanC
|
|
baseurl=https://repos.bryanroessler.com/jriver
|
|
gpgcheck=0
|
|
EOF'
|
|
[[ -n $_debug ]] && cat /etc/yum.repos.d/jriver.repo
|
|
echo "Installing latest JRiver Media Center from repo..."
|
|
if "${_update_cmd[@]}" && "${_install_cmd[@]}" MediaCenter > /dev/null 2>&1; then
|
|
echo "JRiver Media Center installed successfully!"
|
|
echo "You can check for future MC updates by running \"sudo dnf update\""
|
|
else
|
|
echo "JRiver Media Center installation failed!"
|
|
_printHelpAndExit 1
|
|
fi
|
|
|
|
elif [[ "$ID" =~ ^(ubuntu|debian)$ ]]; then
|
|
if [[ $_user != "root" ]]; then
|
|
wget -q "http://dist.jriver.com/mediacenter@jriver.com.gpg.key" -O- | sudo apt-key add - > /dev/null 2>&1
|
|
sudo wget "http://dist.jriver.com/latest/mediacenter/mediacenter$_mversion.list" -O "/etc/apt/sources.list.d/jriver.list" > /dev/null 2>&1
|
|
else
|
|
wget -q "http://dist.jriver.com/mediacenter@jriver.com.gpg.key" -O- | apt-key add - > /dev/null 2>&1
|
|
wget "http://dist.jriver.com/latest/mediacenter/mediacenter$_mversion.list" -O "/etc/apt/sources.list.d/jriver.list" > /dev/null 2>&1
|
|
fi
|
|
|
|
[[ -n $_debug ]] && cat "/etc/apt/sources.list.d/jriver.list"
|
|
echo "Installing JRiver Media Center from repo..."
|
|
if "${_update_cmd[@]}" > /dev/null 2>&1 && "${_install_cmd[@]}" "mediacenter$_mversion" > /dev/null 2>&1; then
|
|
echo "JRiver Media Center installed successfully!"
|
|
echo "You can check for future MC updates by running \"apt-get update && apt-get dist-upgrade\""
|
|
else
|
|
echo "JRiver Media Center installation failed!"
|
|
_printHelpAndExit 1
|
|
fi
|
|
fi
|
|
|
|
}
|
|
|
|
|
|
_acquireDeb () {
|
|
|
|
_runDebug "${FUNCNAME[0]}"
|
|
|
|
# If necessary, create SOURCES dir
|
|
[[ ! -d "$_outputdir/SOURCES" ]] && mkdir -p "$_outputdir/SOURCES"
|
|
|
|
# If deb file already exists, skip download
|
|
if [[ -f "$_outputdir/SOURCES/MediaCenter-${_mcversion}-amd64.deb" ]]; then
|
|
echo "Using local DEB file: $_outputdir/SOURCES/MediaCenter-${_mcversion}-amd64.deb"
|
|
# Else check beta repo
|
|
elif [[ -n $_betapass ]]; then
|
|
if wget -q -O "$_outputdir/SOURCES/MediaCenter-${_mcversion}-amd64.deb" \
|
|
"https://files.jriver.com/mediacenter/channels/v${_mversion}/beta/${_betapass}/MediaCenter-${_mcversion}-amd64.deb"; then
|
|
true
|
|
fi
|
|
# Else check test repo
|
|
elif wget -q -O "$_outputdir/SOURCES/MediaCenter-${_mcversion}-amd64.deb" \
|
|
"https://files.jriver.com/mediacenter/test/MediaCenter-${_mcversion}-amd64.deb"; then
|
|
true
|
|
# Else check latest repo
|
|
elif wget -q -O "$_outputdir/SOURCES/MediaCenter-${_mcversion}-amd64.deb" \
|
|
"https://files.jriver.com/mediacenter/channels/v${_mversion}/latest/MediaCenter-${_mcversion}-amd64.deb"; then
|
|
true
|
|
else
|
|
echo "Cannot find DEB file. Exiting..." && exit 1
|
|
fi
|
|
|
|
if [[ ! -f "$_outputdir/SOURCES/MediaCenter-${_mcversion}-amd64.deb" ]]; then
|
|
echo "Downloaded DEB file missing or corrupted, exiting..."
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
|
|
|
|
_buildRPM () {
|
|
|
|
_runDebug "${FUNCNAME[0]}"
|
|
|
|
# install build dependencies
|
|
_installPackage wget dpkg rpm-build
|
|
|
|
# If necessary, make build directories
|
|
[[ ! -d "$_outputdir/SPECS" ]] && mkdir -p "$_outputdir/SPECS"
|
|
|
|
# rpmbuild uses rpm to check for build dependencies
|
|
# this will fail on non-rpm distros
|
|
if [[ "$ID" =~ ^(fedora|centos)$ ]]; then
|
|
_build_requires=$'BuildRequires: rpm >= 4.11.0\nBuildRequires: dpkg'
|
|
else
|
|
_build_requires=''
|
|
fi
|
|
|
|
if [[ "$ID" != "centos" ]]; then
|
|
_requires='Requires: pangox-compat >= 0.0.2'
|
|
else
|
|
_requires=''
|
|
fi
|
|
|
|
|
|
|
|
# Create spec file
|
|
bash -c "cat <<EOF > $_outputdir/SPECS/mediacenter.spec
|
|
Name: MediaCenter
|
|
Version: $_mcversion
|
|
Release: 1
|
|
Summary: JRiver Media Center
|
|
Group: Applications/Media
|
|
Source0: http://files.jriver.com/mediacenter/channels/v$_mversion/latest/MediaCenter-$_mcversion-amd64.deb
|
|
$_build_requires
|
|
BuildArch: x86_64
|
|
%define _rpmfilename %%{ARCH}/%%{NAME}-%%{version}.%%{ARCH}.rpm
|
|
|
|
AutoReq: 0
|
|
Requires: glibc >= 2.19
|
|
Requires: alsa-lib >= 1.0.28
|
|
Requires: libuuid >= 2.25
|
|
Requires: libX11 >= 1.6
|
|
Requires: libX11-common >= 1.6
|
|
Requires: libXext >= 1.3
|
|
Requires: libxcb >= 1.1
|
|
Requires: libXdmcp >= 1.1
|
|
Requires: libstdc++ >= 4.9
|
|
Requires: gtk3 >= 3.14
|
|
Requires: mesa-libGL
|
|
Requires: libglvnd-glx
|
|
Requires: pango >= 1.36
|
|
$_requires
|
|
Requires: xdg-utils
|
|
Requires: libgomp >= 4.9
|
|
Requires: gstreamer1 >= 1.4.4
|
|
Requires: gstreamer1-plugins-base >= 1.4.4
|
|
Requires: nss >= 3.26
|
|
Requires: nspr >= 4.12
|
|
Requires: ca-certificates
|
|
Requires: python3
|
|
Recommends: vorbis-tools >= 1.4.0
|
|
|
|
Provides: mediacenter$_mversion
|
|
|
|
License: Copyright 1998-2020, JRiver, Inc. All rights reserved. Protected by U.S. patents #7076468 and #7062468
|
|
URL: http://www.jriver.com/
|
|
|
|
%description
|
|
Media Center is more than a world class player.
|
|
|
|
%global __os_install_post %{nil}
|
|
%prep
|
|
|
|
%build
|
|
|
|
%install
|
|
dpkg -x %{S:0} %{buildroot}
|
|
|
|
%post -p /sbin/ldconfig
|
|
%postun -p /sbin/ldconfig
|
|
|
|
%files
|
|
%{_bindir}/mediacenter$_mversion
|
|
%{_libdir}/jriver
|
|
%{_datadir}
|
|
/etc/security/limits.d/*
|
|
EOF"
|
|
|
|
# skip rebuilding the rpm if it already exists
|
|
if [[ -f "$_outputdir/RPMS/x86_64/MediaCenter-$_mcversion.x86_64.rpm" ]]; then
|
|
echo "$_outputdir/RPMS/x86_64/MediaCenter-$_mcversion.x86_64.rpm already exists! Skipping build step..."
|
|
else
|
|
# Run rpmbuild
|
|
echo "Building version $_mcversion, please wait..."
|
|
if rpmbuild --quiet --define="%_topdir $_outputdir" --define="%_libdir /usr/lib" -bb "$_outputdir/SPECS/mediacenter.spec"; then
|
|
echo "Build complete!"
|
|
echo "The RPM is located at $_outputdir/RPMS/x86_64/MediaCenter-$_mcversion.x86_64.rpm"
|
|
else
|
|
echo "Build failed! Exiting..."
|
|
exit 1
|
|
fi
|
|
fi
|
|
}
|
|
|
|
|
|
_runCreateRepo () {
|
|
|
|
_runDebug "${FUNCNAME[0]}"
|
|
|
|
_installPackage createrepo_c
|
|
|
|
unset _prefix
|
|
if [[ $_createrepo_user != "root" ]]; then
|
|
_prefix=("sudo" "-u" "$_createrepo_user")
|
|
fi
|
|
|
|
_createrepo_cmd=("createrepo" "-q")
|
|
|
|
# If the webroot does not exist, create it
|
|
if [[ ! -d "$_createrepo_webroot" ]]; then
|
|
if ! "${_prefix[@]}" mkdir -p "$_createrepo_webroot"; then
|
|
echo "Could not create the createrepo-webroot path!"
|
|
echo "Make sure that the createrepo-webroot is writeable by createrepo-user!"
|
|
fi
|
|
fi
|
|
|
|
# Copy built rpms to webroot
|
|
if "${_prefix[@]}" cp -n "$_outputdir/RPMS/x86_64/MediaCenter-$_mcversion.x86_64.rpm" "$_createrepo_webroot"; then
|
|
echo "Copied $_outputdir/RPMS/x86_64/MediaCenter-$_mcversion.x86_64.rpm to $_createrepo_webroot/MediaCenter-$_mcversion.x86_64.rpm"
|
|
else
|
|
echo "Could not copy the RPM to the createrepo-webroot path!"
|
|
echo "Make sure that the createrepo-webroot path is writeable by createrepo-user!"
|
|
fi
|
|
|
|
# If repodata exists, append --update to createrepo command
|
|
[[ -d "$_createrepo_webroot/repodata" ]] && _createrepo_cmd+=("--update")
|
|
|
|
# Run createrepo
|
|
if "${_prefix[@]}" "${_createrepo_cmd[@]}" "$_createrepo_webroot"; then
|
|
echo "Successfully updated repo!"
|
|
else
|
|
echo "Update repo failed!"
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
|
|
_installRPM () {
|
|
|
|
_runDebug "${FUNCNAME[0]}"
|
|
|
|
# skip installing same version
|
|
_installed_ver="$(rpm --query MediaCenter)"
|
|
_to_be_installed_ver="MediaCenter-$_mcversion.x86_64"
|
|
if [[ $_installed_ver == "$_to_be_installed_ver" ]]; then
|
|
echo "JRiver Media Center $_mcversion is already installed! Skipping installation..."
|
|
return
|
|
fi
|
|
|
|
# install rpm
|
|
if [[ -f "$_outputdir/RPMS/x86_64/MediaCenter-$_mcversion.x86_64.rpm" ]]; then
|
|
echo "Attempting to install version $_mcversion..."
|
|
if "${_install_cmd[@]}" "$_outputdir/RPMS/x86_64/MediaCenter-$_mcversion.x86_64.rpm"; then
|
|
echo "JRiver Media Center $_mcversion was installed successfully!"
|
|
else
|
|
echo "JRiver Media Center $_mcversion installation failed!"
|
|
exit 1
|
|
fi
|
|
else
|
|
echo "$_outputdir/RPMS/x86_64/MediaCenter-${_mcversion}.x86_64.rpm is missing!"
|
|
echo "JRiver Media Center ${_mcversion} installation failed!"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
|
|
_symlinkCerts () {
|
|
|
|
_runDebug "${FUNCNAME[0]}"
|
|
|
|
if [[ ! -f /etc/ssl/certs/ca-certificates.crt && \
|
|
-f /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem ]]; then
|
|
echo "Symlinking /etc/ssl/certs/ca-certificates.crt to /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem"
|
|
if [[ "$_user" == "root" ]]; then
|
|
ln -s /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem /etc/ssl/certs/ca-certificates.crt
|
|
else
|
|
sudo ln -s /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem /etc/ssl/certs/ca-certificates.crt
|
|
fi
|
|
fi
|
|
}
|
|
|
|
|
|
_restoreLicense () {
|
|
|
|
_runDebug "${FUNCNAME[0]}"
|
|
|
|
# Allow user to drop an mjr file next to installJRMC
|
|
if [[ -z $_restorefile ]]; then
|
|
for _mjr in "$_basedir"/*.mjr; do
|
|
[[ $_mjr -nt $_restorefile ]] && _restorefile="$_mjr"
|
|
done
|
|
fi
|
|
|
|
# Restore license
|
|
if [[ -f "$_restorefile" ]]; then
|
|
if ! "mediacenter${_mversion}" /RestoreFromFile "$_restorefile"; then
|
|
echo "Automatic license restore failed"
|
|
fi
|
|
fi
|
|
}
|
|
|
|
|
|
_openFirewall () {
|
|
|
|
_runDebug "${FUNCNAME[0]}"
|
|
|
|
# RHEL
|
|
if [[ "$ID" =~ ^(fedora|centos)$ ]] && [[ -x $(command -v firewall-cmd) ]]; then
|
|
if ! firewall-cmd --get-services | grep -q jriver; then
|
|
# shellcheck disable=SC2140,SC1079,SC1078
|
|
"${_firewall_cmd[@]}" --permanent --new-service=jriver > /dev/null 2>&1
|
|
"${_firewall_cmd[@]}" --permanent --service=jriver --set-description="JRiver Media Center Media Server" > /dev/null 2>&1
|
|
"${_firewall_cmd[@]}" --permanent --service=jriver --set-short="jriver" > /dev/null 2>&1
|
|
"${_firewall_cmd[@]}" --permanent --service=jriver --add-port=52100-52200/tcp > /dev/null 2>&1
|
|
"${_firewall_cmd[@]}" --permanent --service=jriver --add-port=1900/udp > /dev/null 2>&1
|
|
"${_firewall_cmd[@]}" --reload > /dev/null 2>&1
|
|
fi
|
|
|
|
# Ubuntu
|
|
elif [[ "$ID" =~ ^(ubuntu|debian)$ ]] && [[ -x $(command -v ufw) ]]; then
|
|
if [[ ! -f "/etc/ufw/applications.d/jriver.service" ]]; then
|
|
"${_bash_cmd[@]}" "cat <<-EOF > /etc/ufw/applications.d/jriver.service
|
|
[jriver]
|
|
title=JRiver Media Center
|
|
description=Allows JRiver Media Server access
|
|
ports=52100:52200/tcp|1900/udp
|
|
EOF"
|
|
fi
|
|
|
|
"${_firewall_cmd[@]}" allow jriver > /dev/null 2>&1
|
|
fi
|
|
}
|
|
|
|
|
|
_setVNCPass () {
|
|
|
|
_runDebug "${FUNCNAME[0]}"
|
|
|
|
_vncpassfile="$HOME/.vnc/jrmc_passwd"
|
|
|
|
if [[ -n $_vncpass ]]; then
|
|
# Remove existing password file if it exists and write a new one
|
|
[[ -f "$_vncpassfile" ]] && rm -f "$_vncpassfile"
|
|
x11vnc -storepasswd "$_vncpass" "$_vncpassfile"
|
|
# Else disable authentication
|
|
elif [[ ! -f "$_vncpassfile" ]]; then
|
|
_novncauth="true"
|
|
fi
|
|
}
|
|
|
|
|
|
_systemctlReloadAndEnable () {
|
|
|
|
_runDebug "${FUNCNAME[0]}"
|
|
|
|
echo "Enabling $1"
|
|
|
|
if [[ "$_user" == "root" ]]; then
|
|
systemctl daemon-reload
|
|
systemctl enable --now "$1" > /dev/null 2>&1
|
|
else
|
|
sudo systemctl daemon-reload
|
|
sudo systemctl enable --now "$1" > /dev/null 2>&1
|
|
fi
|
|
}
|
|
|
|
|
|
_generateServiceVars () {
|
|
|
|
_runDebug "${FUNCNAME[0]}"
|
|
|
|
unset _service_fname _service_name _timer_fname _timer_name _user_specifier
|
|
|
|
if [[ "$_user" == "root" ]]; then
|
|
_service_fname="/usr/lib/systemd/system/$1.service"
|
|
_timer_fname="/usr/lib/systemd/system/$1.timer"
|
|
_service_name="$1.service"
|
|
_timer_name="$1.timer"
|
|
_user_specifier=""
|
|
else
|
|
_service_fname="/usr/lib/systemd/system/$1@.service"
|
|
_timer_fname="/usr/lib/systemd/system/$1@.timer"
|
|
_service_name="$1@$_user.service"
|
|
_timer_name="$1@$_user.timer"
|
|
_user_specifier="User=%I"
|
|
fi
|
|
}
|
|
|
|
|
|
_serviceMediaserver () {
|
|
|
|
_runDebug "${FUNCNAME[0]}"
|
|
|
|
_generateServiceVars "jriver-mediaserver"
|
|
|
|
"${_bash_cmd[@]}" "cat <<-EOF > $_service_fname
|
|
[Unit]
|
|
Description=JRiver Media Center $_mversion Media Server
|
|
After=graphical.target
|
|
|
|
[Service]
|
|
$_user_specifier
|
|
Type=simple
|
|
Environment=DISPLAY=$_display
|
|
ExecStart=/usr/bin/mediacenter$_mversion /MediaServer
|
|
Restart=always
|
|
RestartSec=10
|
|
KillSignal=SIGHUP
|
|
TimeoutStopSec=30
|
|
|
|
[Install]
|
|
WantedBy=graphical.target
|
|
EOF"
|
|
_systemctlReloadAndEnable "$_service_name"
|
|
}
|
|
|
|
|
|
_serviceX11VNC () {
|
|
|
|
_runDebug "${FUNCNAME[0]}"
|
|
|
|
_installPackage x11vnc
|
|
_setVNCPass
|
|
|
|
_generateServiceVars "jriver-x11vnc"
|
|
|
|
if [[ "$_novncauth" == "true" ]]; then
|
|
_exec_start_cmd="/usr/bin/x11vnc -display $_display -noscr -geometry 1920x1080 -auth guess -forever -bg -nopw"
|
|
else
|
|
_exec_start_cmd="/usr/bin/x11vnc -display $_display -noscr -geometry 1920x1080 -rfbauth $HOME/.vnc/jrmc_passwd -auth guess -forever -bg"
|
|
fi
|
|
|
|
"${_bash_cmd[@]}" "cat <<-EOF > $_service_fname
|
|
[Unit]
|
|
Description=x11vnc
|
|
After=display-manager.service
|
|
|
|
[Service]
|
|
$_user_specifier
|
|
Type=forking
|
|
Environment=DISPLAY=$_display
|
|
ExecStart=$_exec_start_cmd
|
|
Restart=always
|
|
RestartSec=10
|
|
|
|
[Install]
|
|
WantedBy=default.target
|
|
EOF"
|
|
_systemctlReloadAndEnable "$_service_name"
|
|
}
|
|
|
|
|
|
_serviceCreaterepo () {
|
|
|
|
_runDebug "${FUNCNAME[0]}"
|
|
|
|
_generateServiceVars "jriver-createrepo"
|
|
|
|
"${_bash_cmd[@]}" "cat <<-EOF > $_service_fname
|
|
[Unit]
|
|
Description=Builds JRiver Media Center RPM file, moves it to the repo dir, and runs createrepo
|
|
|
|
[Service]
|
|
$_user_specifier
|
|
ExecStart=$_basedir/installJRMC --outputdir $_outputdir --createrepo --createrepo-webroot $_createrepo_webroot --createrepo-user $_createrepo_user
|
|
|
|
[Install]
|
|
WantedBy=default.target
|
|
EOF"
|
|
"${_bash_cmd[@]}" "cat <<-EOF > $_timer_fname
|
|
[Unit]
|
|
Description=Run JRiver MC rpmbuild hourly
|
|
|
|
[Timer]
|
|
OnCalendar=hourly
|
|
Persistent=true
|
|
|
|
[Install]
|
|
WantedBy=timers.target
|
|
EOF"
|
|
_systemctlReloadAndEnable "$_timer_name"
|
|
}
|
|
|
|
|
|
_uninstall () {
|
|
|
|
_runDebug "${FUNCNAME[0]}"
|
|
|
|
read -r -p "Do you really want to uninstall all JRiver Media Center files? [y/N] " _response
|
|
_response=${_response,,} # tolower
|
|
[[ ! "$_response" =~ ^(yes|y)$ ]] && echo "Cancelling uninstall..." && exit 0
|
|
echo "Stopping and disabling all Media Center services"
|
|
sudo systemctl disable --now jriver-createrepo.timer jriver-x11vnc.service jriver-mediaserver.service
|
|
echo "Removing repo and service files"
|
|
for _service in "jriver-mediaserver" "jriver-x11vnc" "jriver-createrepo"; do
|
|
_generateServiceVars _service
|
|
[[ -f "$_service_fname" ]] && "${_rm_cmd[@]}" "$_service_fname"
|
|
[[ -f "$_timer_fname" ]] && "${_rm_cmd[@]}" "$_timer_fname"
|
|
done
|
|
[[ -f "/etc/yum.repos.d/jriver.repo" ]] \
|
|
&& "${_rm_cmd[@]}" "/etc/yum.repos.d/jriver.repo"
|
|
[[ -f "/etc/apt/sources.list.d/jriver.list" ]] \
|
|
&& "${_rm_cmd[@]}" "/etc/apt/sources.list.d/jriver.list"
|
|
if [[ -x $(command -v firewall-cmd) ]]; then
|
|
echo "Removing firewall rules"
|
|
sudo firewall-cmd --permanent --remove-service=jriver > /dev/null 2>&1
|
|
sudo firewall-cmd --permanent --delete-service=jriver > /dev/null 2>&1
|
|
sudo firewall-cmd --reload > /dev/null 2>&1
|
|
elif [[ -x $(command -v ufw) ]]; then
|
|
echo "Removing firewall rules"
|
|
sudo ufw delete allow jriver > /dev/null 2>&1
|
|
[[ -f "/etc/ufw/applications.d/jriver.service" ]] \
|
|
&& "${_rm_cmd[@]}" /etc/ufw/applications.d/jriver.service
|
|
fi
|
|
echo "Uninstalling Media Center"
|
|
if [[ "$ID" =~ ^(fedora|centos)$ ]]; then
|
|
sudo dnf remove MediaCenter -y
|
|
elif [[ "$ID" =~ ^(ubuntu|debian)$ ]]; then
|
|
sudo apt-get remove "mediacenter$_mversion" -y
|
|
fi
|
|
echo "JRiver Media Center has been completely uninstalled"
|
|
echo "Your library files will remain at $HOME/.jriver"
|
|
}
|
|
|
|
|
|
__main () {
|
|
|
|
# Check user
|
|
_checkUser
|
|
|
|
# Parse input
|
|
_parseInput "$@"
|
|
|
|
# Detect OS
|
|
_getOS
|
|
|
|
# Build some commands based on the selected OS
|
|
_buildCommands
|
|
|
|
# Set version to install/uninstall
|
|
_setVersion
|
|
|
|
# Sanity checks
|
|
_sanityChecks
|
|
|
|
# Uninstall and exit
|
|
if [[ -n $_uninstall ]]; then
|
|
_uninstall
|
|
return $?
|
|
fi
|
|
|
|
# Install external repos
|
|
_installExternalRepos
|
|
|
|
# install MC using package manager (default)
|
|
if [[ -z $_rpmbuild ]]; then
|
|
_installRepo
|
|
_symlinkCerts
|
|
_restoreLicense
|
|
_openFirewall
|
|
else
|
|
_acquireDeb
|
|
_buildRPM
|
|
if [[ -n $_createrepo ]]; then
|
|
_runCreateRepo
|
|
# Go ahead and install MC from RPM if on a supported platform
|
|
elif [[ "$ID" =~ ^(fedora|centos)$ ]]; then
|
|
_installRPM
|
|
_symlinkCerts
|
|
_restoreLicense
|
|
_openFirewall
|
|
fi
|
|
fi
|
|
|
|
# Install systemd services
|
|
if [[ "$_service" == "createrepo" ]]; then
|
|
_serviceCreaterepo
|
|
elif [[ "$_service" == "x11vnc-mediaserver" ]]; then
|
|
_serviceMediaserver
|
|
_serviceX11VNC
|
|
elif [[ "$_service" == "mediaserver" ]]; then
|
|
_serviceMediaserver
|
|
fi
|
|
}
|
|
|
|
# Execute main function when called
|
|
__main "$@"
|
|
}
|
|
|
|
# Allow this file to be executed directly if not being sourced
|
|
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
|
|
_basedir=$(dirname "$(readlink -f "$0")")
|
|
installJRMC "$@"
|
|
fi
|