This commit is contained in:
2020-04-08 15:53:04 -04:00
parent af06ca0d34
commit 460658f29f

View File

@@ -45,10 +45,8 @@ USAGE:
installJRMC [[OPTION] [VALUE]]... installJRMC [[OPTION] [VALUE]]...
OPTIONS OPTIONS
--repo --rpmbuild
Install JRiver MC repository using the OS package manager (recommended) Build RPM from source DEB
--build
Build the rpm, do nothing else
--buildpath PATH --buildpath PATH
Run rpmbuild in this directory (Default: the current working directory) Run rpmbuild in this directory (Default: the current working directory)
--mcversion VERSION --mcversion VERSION
@@ -61,6 +59,8 @@ OPTIONS
Specify URL to source DEB package (Default: automatic) Specify URL to source DEB package (Default: automatic)
--betapass PASSWORD --betapass PASSWORD
Enter beta team password for access to beta builds 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 -v|--version
Print this script version and exit Print this script version and exit
-d|--debug -d|--debug
@@ -80,14 +80,13 @@ OPTIONS
--createrepo-user USER --createrepo-user USER
The web server user (Default: www-user) The web server user (Default: www-user)
See SERVICES for service-createrepo to automate createrepo
SERVICES SERVICES
--service-mediaserver mediaserver
Install JRiver MC mediaserver service Create and enable a JRiver MC Media Server systemd service for the current user
--service-x11vnc-mediaserver
Install JRiver MC mediaserver service and x11vnc (for headless installations without x11vnc-mediaserver
an existing X server) 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 --vncpass PASSWORD
Set vnc password for x11vnc access. If no password is set, the script will either use Set vnc password for x11vnc access. If no password is set, the script will either use
@@ -96,29 +95,28 @@ OPTIONS
Start X11VNC on this display (Default: The current display or :0 if current display is Start X11VNC on this display (Default: The current display or :0 if current display is
unaccessible) unaccessible)
--service-createrepo createrepo
Install service to build latest MC and run createrepo hourly Install service to build latest MC RPM and run createrepo hourly for the current user
--createrepo-webroot PATH
The webroot directory to install the repo (Default: /var/www/html)
--createrepo-user USER
The web server user (Default: www-user)
EOF EOF
# Exit using passed exit code # Exit using passed exit code
[[ -z $1 ]] && exit 0 || exit "$1" [[ -z $1 ]] && exit 0 || exit "$1"
} }
_parseInput () { _parseInput () {
if _input=$(getopt -o +vdhu -l repo,build,outputdir:,mcversion:,restorefile:,boardurl:,deburl:,betapass:,version,debug,help,uninstall,createrepo,createrepo-webroot:,createrepo-user:,service-mediaserver,service-x11vnc-mediaserver,vncpass:,display:,service-createrepo -- "$@"); then if _input=$(getopt -o +vdhu -l rpmbuild,outputdir:,mcversion:,restorefile:,boardurl:,deburl:,betapass:,service:,version,debug,help,uninstall,createrepo,createrepo-webroot:,createrepo-user:,vncpass:,display: -- "$@"); then
eval set -- "$_input" eval set -- "$_input"
while true; do while true; do
case "$1" in case "$1" in
--repo) --rpmbuild)
echo "Installing JRMC from repository" _rpmbuild="true"
_installrepo="true"
;;
--build)
echo "Using build only mode"
_buildonly="true"
;; ;;
--outputdir) --outputdir)
shift && _outputdir="$1" shift && _outputdir="$1"
@@ -138,6 +136,9 @@ EOF
--betapass) --betapass)
shift && _betapass="$1" shift && _betapass="$1"
;; ;;
--service)
shift && _service="$1"
;;
--version|-v) --version|-v)
echo "Version: $_scriptversion" echo "Version: $_scriptversion"
exit 0 exit 0
@@ -150,7 +151,6 @@ EOF
_printHelpAndExit 0 _printHelpAndExit 0
;; ;;
--uninstall|-u) --uninstall|-u)
echo "Uninstalling..."
_uninstall="true" _uninstall="true"
;; ;;
--createrepo) --createrepo)
@@ -162,21 +162,12 @@ EOF
--createrepo-user) --createrepo-user)
shift && _createrepo_user="$1" shift && _createrepo_user="$1"
;; ;;
--service-mediaserver)
_service_ms="true"
;;
--service-x11vnc-mediaserver)
_service_xms="true"
;;
--vncpass) --vncpass)
shift && _vncpass="$1" shift && _vncpass="$1"
;; ;;
--display) --display)
shift && _display="$1" shift && _display="$1"
;; ;;
--service-createrepo)
_service_createrepo="true"
;;
--) --)
shift shift
break break
@@ -186,7 +177,7 @@ EOF
done done
else else
echo "Incorrect options provided" echo "Incorrect options provided"
_print-help-and-exit 1 _printHelpAndExit 1
fi fi
} }
@@ -220,30 +211,14 @@ EOF
} }
_sanityChecks () {
if [[ -n $_service_ms && -n $_service_xms ]]; then
echo "--service-mediaserver is redundant when --service-x11vnc-mediaserver is set, unsetting..."
unset _service_ms
fi
if ! [[ "$ID" == "fedora" || "$ID" == "centos" ]] && \
[[ -z $_installrepo && -z $_buildonly && -z $_createrepo ]]; then
echo "You must specify --repo, --build, or --createrepo on non-RHEL distributions!"
_printHelpAndExit 1
fi
}
_buildCommands () { _buildCommands () {
# build some basic command arrays based on OS and user input # build some basic command arrays based on OS and user input
if [[ "$ID" == "fedora" || "$ID" == "centos" ]]; then if [[ "$ID" =~ ^(fedora|centos)$ ]]; then
_install_cmd=("dnf" "install" "-y") _install_cmd=("dnf" "install" "-y")
_update_cmd=("dnf" "update" "-y") _update_cmd=("dnf" "update" "-y")
_pkg_query_cmd=("rpm" "-q") _pkg_query_cmd=("rpm" "-q")
elif [[ "$ID" == "ubuntu" || "$ID" == "debian" ]]; then elif [[ "$ID" =~ ^(ubuntu|debian)$ ]]; then
_install_cmd=("apt-get" "install" "-y") _install_cmd=("apt-get" "install" "-y")
_update_cmd=("apt-get" "update" "-y") _update_cmd=("apt-get" "update" "-y")
_pkg_query_cmd=("dpkg" "-l") _pkg_query_cmd=("dpkg" "-l")
@@ -253,7 +228,7 @@ EOF
_install_cmd_nogpg=("${_install_cmd[@]}" "--nogpgcheck") _install_cmd_nogpg=("${_install_cmd[@]}" "--nogpgcheck")
# append sudo to non-containers and non-root users # append sudo for non-root users
if [[ "$_user" != "root" ]]; then if [[ "$_user" != "root" ]]; then
_install_cmd=("sudo" "${_install_cmd[@]}") _install_cmd=("sudo" "${_install_cmd[@]}")
_install_cmd_nogpg=("sudo" "${_install_cmd_nogpg[@]}") _install_cmd_nogpg=("sudo" "${_install_cmd_nogpg[@]}")
@@ -333,6 +308,20 @@ EOF
#_variation="${_mcversion##*.}" #_variation="${_mcversion##*.}"
} }
_sanityChecks () {
# Cannot create a repo without an rpm
if [[ -n $_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 () { _installExternalRepos () {
@@ -358,7 +347,7 @@ EOF
_installPackage wget gnupg _installPackage wget gnupg
if [[ "$ID" == "fedora" || "$ID" == "centos" ]]; then if [[ "$ID" =~ ^(fedora|centos)$ ]]; then
"${_bash_cmd[@]}" 'cat <<-EOF > /etc/yum.repos.d/jriver.repo "${_bash_cmd[@]}" 'cat <<-EOF > /etc/yum.repos.d/jriver.repo
[jriver] [jriver]
name=JRiver Media Center repo by BryanC name=JRiver Media Center repo by BryanC
@@ -449,7 +438,7 @@ EOF'
# rpmbuild uses rpm to check for build dependencies # rpmbuild uses rpm to check for build dependencies
# this will fail on non-rpm distros # this will fail on non-rpm distros
if [[ "$ID" == "fedora" || "$ID" == "centos" ]]; then if [[ "$ID" =~ ^(fedora|centos)$ ]]; then
_build_requires=$'BuildRequires: rpm >= 4.11.0\nBuildRequires: dpkg' _build_requires=$'BuildRequires: rpm >= 4.11.0\nBuildRequires: dpkg'
else else
_build_requires='' _build_requires=''
@@ -626,32 +615,27 @@ EOF"
} }
_openFirewallPorts () { _openFirewall () {
# RHEL # RHEL
if [[ "$ID" == "fedora" || "$ID" == "centos" ]] && [[ -x $(command -v firewall-cmd) ]]; then if [[ "$ID" =~ ^(fedora|centos)$ ]] && [[ -x $(command -v firewall-cmd) ]]; then
if ! firewall-cmd --get-services | grep -q jriver; then if ! firewall-cmd --get-services | grep -q jriver; then
# shellcheck disable=SC2140,SC1079,SC1078
"${_bash_cmd[@]}" "cat <<-EOF > /etc/firewalld/services/jriver.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>jriver</short>
<description>JRiver Media Center Media Server</description>
<port protocol="udp" port="1900" />
<port protocol="tcp" port="52100-52200"/>
</service>
EOF"
fi
# Enable service
if [[ "$_user" == "root" ]]; then if [[ "$_user" == "root" ]]; then
firewall-cmd --permanent --add-service=jriver _firewallcmd=("firewall-cmd")
else else
sudo firewall-cmd --permanent --add-service=jriver _firewallcmd=("sudo" "firewall-cmd")
fi
# shellcheck disable=SC2140,SC1079,SC1078
"${_firewallcmd[@]}" --permanent --new-service=jriver
"${_firewallcmd[@]}" --permanent --service=jriver --set-description="JRiver Media Center Media Server"
"${_firewallcmd[@]}" --permanent --service=jriver --set-short="jriver"
"${_firewallcmd[@]}" --permanent --service=jriver --add-port=52100-52200/tcp
"${_firewallcmd[@]}" --permanent --service=jriver --add-port=1900/udp
"${_firewallcmd[@]}" --reload
fi fi
# Ubuntu # Ubuntu
elif [[ "$ID" == "ubuntu" && -x $(command -v ufw) ]]; then elif [[ "$ID" =~ ^(ubuntu|debian)$ ]] && [[ -x $(command -v ufw) ]]; then
if [[ ! -f "/etc/ufw/applications.d/jriver.service" ]]; then if [[ ! -f "/etc/ufw/applications.d/jriver.service" ]]; then
"${_bash_cmd[@]}" "cat <<-EOF > /etc/ufw/applications.d/jriver.service "${_bash_cmd[@]}" "cat <<-EOF > /etc/ufw/applications.d/jriver.service
[jriver] [jriver]
@@ -700,29 +684,28 @@ EOF"
systemctl daemon-reload systemctl daemon-reload
systemctl enable --now "$1" systemctl enable --now "$1"
else else
systemctl --user daemon-reload sudo systemctl daemon-reload
systemctl --user enable --now "$1" sudo systemctl enable --now "$1"
fi fi
} }
_generateServiceVars () { _generateServiceVars () {
unset _service_fname _service_name _timer_fname _timer_name _systemd_user unset _service_fname _service_name _timer_fname _timer_name _user_specifier
_service_name="$1.service"
_timer_name="$1.timer"
if [[ "$_user" == "root" ]]; then if [[ "$_user" == "root" ]]; then
_service_fname="/usr/lib/systemd/system/$1.service" _service_fname="/usr/lib/systemd/system/$1.service"
_timer_fname="/usr/lib/systemd/system/$1.timer" _timer_fname="/usr/lib/systemd/system/$1.timer"
_service_name="$1.service"
_timer_name="$1.timer"
_user_specifier=""
else else
if [[ ! -d "$HOME/.config/systemd/user" ]]; then _service_fname="/usr/lib/systemd/system/$1@.service"
mkdir -p "$HOME/.config/systemd/user" _timer_fname="/usr/lib/systemd/system/$1@.timer"
fi _service_name="$1@$_user.service"
_service_fname="$HOME/.config/systemd/user/$1.service" _timer_name="$1@$_user.timer"
_timer_fname="$HOME/.config/systemd/user/$1.timer" _user_specifier="User=%I"
_systemd_user="User=$_user"
fi fi
} }
@@ -737,8 +720,8 @@ Description=JRiver Media Center $_mversion Media Server
After=graphical.target After=graphical.target
[Service] [Service]
$_user_specifier
Type=simple Type=simple
$_systemd_user
Environment=DISPLAY=$_display Environment=DISPLAY=$_display
ExecStart=/usr/bin/mediacenter$_mversion /MediaServer ExecStart=/usr/bin/mediacenter$_mversion /MediaServer
Restart=always Restart=always
@@ -761,9 +744,9 @@ EOF"
_generateServiceVars "jriver-x11vnc" _generateServiceVars "jriver-x11vnc"
if [[ "$_novncauth" == "true" ]]; then if [[ "$_novncauth" == "true" ]]; then
_exec_start_cmd="/usr/bin/x11vnc -display $_display -geometry 1920x1080 -auth guess -forever -bg -nopw" _exec_start_cmd="/usr/bin/x11vnc -display $_display -noscr -geometry 1920x1080 -auth guess -forever -bg -nopw"
else else
_exec_start_cmd="/usr/bin/x11vnc -display $_display -geometry 1920x1080 -rfbauth $HOME/.vnc/jrmc_passwd -auth guess -forever -bg" _exec_start_cmd="/usr/bin/x11vnc -display $_display -noscr -geometry 1920x1080 -rfbauth $HOME/.vnc/jrmc_passwd -auth guess -forever -bg"
fi fi
"${_bash_cmd[@]}" "cat <<-EOF > $_service_fname "${_bash_cmd[@]}" "cat <<-EOF > $_service_fname
@@ -772,15 +755,15 @@ Description=x11vnc
After=display-manager.service After=display-manager.service
[Service] [Service]
$_user_specifier
Type=forking Type=forking
$_systemd_user
Environment=DISPLAY=$_display Environment=DISPLAY=$_display
ExecStart=$_exec_start_cmd ExecStart=$_exec_start_cmd
Restart=always Restart=always
RestartSec=10 RestartSec=10
[Install] [Install]
WantedBy=graphical.target WantedBy=default.target
EOF" EOF"
_systemctlReloadAndEnable "$_service_name" _systemctlReloadAndEnable "$_service_name"
} }
@@ -795,11 +778,11 @@ EOF"
Description=Builds JRiver Media Center RPM file, moves it to the repo dir, and runs createrepo Description=Builds JRiver Media Center RPM file, moves it to the repo dir, and runs createrepo
[Service] [Service]
$_systemd_user $_user_specifier
ExecStart=$_basedir/installJRMC --buildpath=$_outputdir --createrepo --createrepo-webroot $_createrepo_webroot --createrepo-user $_createrepo_user ExecStart=$_basedir/installJRMC --buildpath=$_outputdir --createrepo --createrepo-webroot $_createrepo_webroot --createrepo-user $_createrepo_user
[Install] [Install]
WantedBy=multi-user.target WantedBy=default.target
EOF" EOF"
"${_bash_cmd[@]}" "cat <<-EOF > $_timer_fname "${_bash_cmd[@]}" "cat <<-EOF > $_timer_fname
[Unit] [Unit]
@@ -847,9 +830,9 @@ EOF"
[[ -f "/etc/ufw/applications.d/jriver.service" ]] && sudo rm /etc/ufw/applications.d/jriver.service [[ -f "/etc/ufw/applications.d/jriver.service" ]] && sudo rm /etc/ufw/applications.d/jriver.service
fi fi
echo "Uninstalling Media Center" echo "Uninstalling Media Center"
if [[ "$ID" == "fedora" || "$ID" == "centos" ]]; then if [[ "$ID" =~ ^(fedora|centos)$ ]]; then
sudo dnf remove MediaCenter -y sudo dnf remove MediaCenter -y
elif [[ "$ID" == "ubuntu" || "$ID" == "debian" ]]; then elif [[ "$ID" =~ ^(ubuntu|debian)$ ]]; then
sudo apt-get remove "mediacenter$_mversion" -y sudo apt-get remove "mediacenter$_mversion" -y
fi fi
echo "JRiver Media Center has been completely uninstalled" echo "JRiver Media Center has been completely uninstalled"
@@ -857,6 +840,7 @@ EOF"
} }
__main () { __main () {
# Check user # Check user
@@ -868,15 +852,15 @@ EOF"
# Detect OS # Detect OS
_getOS _getOS
# Sanity checks
_sanityChecks
# Build some commands based on the selected OS # Build some commands based on the selected OS
_buildCommands _buildCommands
# Set version to install # Set version to install/uninstall
_setVersion _setVersion
# Sanity checks
_sanityChecks
# Uninstall and exit # Uninstall and exit
if [[ -n $_uninstall ]]; then if [[ -n $_uninstall ]]; then
_uninstall _uninstall
@@ -886,52 +870,38 @@ EOF"
# Install external repos # Install external repos
_installExternalRepos _installExternalRepos
# install repo file and install MC using package manager # install MC using package manager (default)
if [[ -n $_installrepo ]]; then if [[ -z $_rpmbuild ]]; then
_installRepo _installRepo
_symlinkCerts _symlinkCerts
_restoreLicense _restoreLicense
return $? _openFirewall
fi else
# Install MC systemd services
if [[ -n $_service_xms ]]; then
_serviceMediaserver
_serviceX11VNC
fi
if [[ -n $_service_ms ]]; then
_serviceMediaserver
fi
# Install createrepo systemd service
if [[ -n $_service_createrepo ]]; then
_serviceCreaterepo
fi
# Acquire source deb package
_acquireDeb _acquireDeb
# build
_buildRPM _buildRPM
if [[ -n $_buildonly ]]; then
return 0
fi
# create repo at webroot
if [[ -n $_createrepo ]]; then if [[ -n $_createrepo ]]; then
_runCreateRepo _runCreateRepo
return $? # Go ahead and install MC from RPM if on a supported platform
fi elif [[ "$ID" =~ ^(fedora|centos)$ ]]; then
# install MC
_installRPM _installRPM
_symlinkCerts _symlinkCerts
_restoreLicense _restoreLicense
_openFirewallPorts _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 function when called # Execute main function when called
__main "$@" __main "$@"
} }