2 Commits

Author SHA1 Message Date
4a797d68d5 Update README 2020-04-25 09:27:31 -04:00
26c6054b3a Complete vncserver service 2020-04-25 09:27:23 -04:00
2 changed files with 212 additions and 90 deletions

111
README.md
View File

@@ -1,10 +1,11 @@
# installJRMC
This script will help install [JRiver Media Center](https://www.jriver.com/) and associated services on Fedora (>=29), CentOS (>=8), Ubuntu (>=16.04), and Debian.
This script will help install [JRiver Media Center](https://www.jriver.com/) and associated services on Fedora (>=29), CentOS (>=8), Ubuntu (>=16.04), and Debian (>=9).
## Notes
This script will not point major upgrades (i.e. from v25 to v26) to your old library. You should **first perform a library backup**, install the new major version, and then restore the library backup in the new version.
1. This script will not point major upgrades (i.e. from v25 to v26) to your old library. You should **first perform a library backup**, install the new major version, and then restore the library backup in the new version.
2. It is recommended to run `installJRMC` as your normal system user (i.e. don't run it with `sudo`). Services are installed for the user that executes the script so do not execute as root unless you want to install system-wide services like `createrepo` (see services section below for more information).
## Installing
@@ -20,6 +21,7 @@ chmod +x ./installJRMC
```
./installJRMC
```
You will be prompted to enter your sudo password to install dependencies, etc.
## Options
@@ -27,9 +29,14 @@ Running `installJRMC` without any options will install the latest version of JRi
Here is a list of additional options that can be passed to the script. You can always find the latest supported options by running `installJRMC --help`.
```text
--install-repo
Install JRiver Media Center from repository using package manager (Default)
DEB-based OSes: Official package repository
RPM-based OSes: BryanC unofficial repository
--install-rpmbuild
(RPM-based OSes only!) Build RPM from source DEB and install it
--rpmbuild
Debian/Ubuntu: Build RPM from source DEB
Fedora/CentOS: Build RPM from source DEB and install it
Build RPM from source DEB
--outputdir PATH
Generate rpmbuild output in this directory (Default: $PWD/outputdir)
--mcversion VERSION
@@ -38,61 +45,71 @@ Here is a list of additional options that can be passed to the script. You can a
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)
```
Some options are incompatible with each other, for example it is not possible to install the `mediaserver` service on Ubuntu/Debian when using `--rpmbuild` or `--createrepo` since those options do not actually install Media Center.
#### createrepo
```text
--service, -s SERVICE
See SERVICES section below for a list of possible services to install
--container, -c CONTAINER
See CONTAINERS section below for a list of possible services to install
--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)
--createrepo-webroot PATH
The webroot directory to install the repo (Default: /srv/jriver/)
--createrepo-user USER
The web server user (Default: current user)
--version, -v
Print this script version and exit
--debug, -d
Print debug output
--force, -f
Force reinstallation and ignore/overwrite previous output
--help, -h
Print help dialog and exit
--uninstall, -u
Uninstall JRiver MC, cleanup service files, and remove firewall rules (does not remove library files)
```
**Some options are incompatible** with each other, for example it is not possible to install the `mediaserver` service on Ubuntu/Debian when using `--rpmbuild` or `--createrepo` since those options do not actually install Media Center. `installJRMC` does perform sanity checks to automatically fix conflicting options, but it may not catch all edge cases.
#### services
When installing systemd services it is important to execute `installJRMC` as the user you wish to run the services. Typically this is your normal user account but for some server installations it may be necessary to execute the script as root.
```text
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
Enable and start a mediaserver systemd service (requires an existing X server)
mediacenter
Enable and start a mediacenter systemd service (requires an existing X server)
x11vnc
Enable and start x11vnc for the local desktop (requires an existing X server)
--vncpass and --display are valid options (see below)
mediacenter-vncserver
Enable and start a vncserver
--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
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)
Display to start vncserver/x11vnc (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 (can also take additional input arguments --createrepo-webroot and/or createrepo-user)
Install hourly service to build latest MC RPM and run createrepo
```
I utilize `--service createrepo` to build the rpm repository used by Fedora/CentOS.
#### containers
**Coming soon!**
### Examples
* `installJRMC`
Installs the latest version of JRiver Media Center from the repository.
* `installJRMC --service mediaserver`
Installs JRiver Media Center using the package manager and starts the jriver-mediaserver service.
Installs JRiver Media Center from the repository and starts/enables the mediaserver service.
* `installJRMC --restorefile /path/to/license.mjr --mcversion 26.0.15`
* `installJRMC --install-rpmbuild --restorefile /path/to/license.mjr --mcversion 26.0.56`
Builds JRiver Media Center version 26.0.15 RPM from the source DEB (and installs it on Fedora/CentOS along with the associated license).
Builds JRiver Media Center version 26.0.56 RPM from the source DEB, installs it, and activates it using the specified .mjr license file (Fedora/CentOS only).
* `installJRMC --createrepo --createrepo-webroot /srv/jriver/repo --createrepo-user www-user`
@@ -100,4 +117,16 @@ I utilize `--service createrepo` to build the rpm repository used by Fedora/Cent
* `installJRMC --service createrepo --createrepo-webroot /srv/jriver/repo --createrepo-user www-user`
Installs the jriver-createrepo timer and service to build the RPM and move it to the webroot as `www-user`.
Installs the jriver-createrepo timer and service to build the RPM, move it to the webroot, and run createrepo as `www-user`.
* `installJRMC --service x11vnc --service mediacenter --vncpass "letmein"`
Installs services to share the existing local desktop via VNC and automatically run Media Center
* `installJRMC --service mediacenter-vncserver --vncpass "letmein"`
Installs a service that starts a vncserver containing Media Center
* `installJRMC --uninstall`
Uninstalls JRiver Media Center and its associated services and firewall rules. This will **not** remove your media library and database in case you want to reinstall.

View File

@@ -26,7 +26,8 @@ installJRMC() {
_createrepo_webroot="/srv/jriver"
_createrepo_user="$(whoami)"
_user="$(whoami)"
_available_services=("createrepo" "x11vnc" "mediaserver" "mediacenter" "vnc")
_available_services=("createrepo" "x11vnc" "mediaserver" "mediacenter" "vncserver")
#_available_containers=("mediacenter-vncserver" "createrepo")
_printHelpAndExit() {
@@ -38,11 +39,11 @@ USAGE:
installJRMC [[OPTION] [VALUE]]...
OPTIONS
--repo-install
Install JRiver MediaCenter from repository using package manager (Default)
--install-repo
Install JRiver Media Center from repository using package manager (Default)
DEB-based OSes: Official package repository
RPM-based OSes: BryanC unofficial repository
--rpmbuild-install
--install-rpmbuild
(RPM-based OSes only!) Build RPM from source DEB and install it
--rpmbuild
Build RPM from source DEB
@@ -56,6 +57,8 @@ OPTIONS
Enter beta team password for access to beta builds
--service, -s SERVICE
See SERVICES section below for a list of possible services to install
--container, -c CONTAINER
See CONTAINERS section below for a list of possible services to install
--createrepo
Build rpm, copy to webroot, and run createrepo
--createrepo-webroot PATH
@@ -65,7 +68,7 @@ OPTIONS
--version, -v
Print this script version and exit
--debug, -d
Enter debug mode
Print debug output
--force, -f
Force reinstallation and ignore/overwrite previous output
--help, -h
@@ -74,29 +77,27 @@ OPTIONS
Uninstall JRiver MC, cleanup service files, and remove firewall rules (does not remove library files)
SERVICES
mediaserver
Create and enable a mediaserver systemd service (requires an existing X server)
Enable and start a mediaserver systemd service (requires an existing X server)
mediacenter
Create and enable a mediacenter systemd service (requires an existing X server)
Enable and start a mediacenter systemd service (requires an existing X server)
x11vnc
Create and enable an x11vnc server (requires an existing X server)
Enable and start x11vnc for the local desktop (requires an existing X server)
--vncpass and --display are valid options (see below)
vnc
Create and enable a new VNC X server
mediacenter-vncserver
Enable and start a vncserver running JRiver Media Center
--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
Display to start vncserver/x11vnc (Default: The current display or :0 if current display
is unaccessible)
createrepo
Install hourly service to build latest MC RPM and run createrepo
CONTAINERS
mediacenter-vncserver (Under construction!)
createrepo (Under construction!)
EOF
# Exit using passed exit code
@@ -108,16 +109,16 @@ EOF
_runDebug "${FUNCNAME[0]}"
if _input=$(getopt -o +vdhus: -l repo-install,rpmbuild-install,rpmbuild,outputdir:,mcversion:,restorefile:,betapass:,service:,version,debug,force,help,uninstall,createrepo,createrepo-webroot:,createrepo-user:,vncpass:,display: -- "$@"); then
if _input=$(getopt -o +vdhus:c: -l install-repo,install-rpmbuild,rpmbuild,outputdir:,mcversion:,restorefile:,betapass:,service:,version,debug,force,help,uninstall,createrepo,createrepo-webroot:,createrepo-user:,vncpass:,display:,container: -- "$@"); then
eval set -- "$_input"
while true; do
case "$1" in
--repo-install)
--install-repo)
_repoinstall="true"
;;
--rpmbuild-install)
_rpminstall="true"
--install-rpmbuild)
_rpmbuild="true"
_rpminstall="true"
;;
--rpmbuild)
_rpmbuild="true"
@@ -137,6 +138,9 @@ EOF
--service|-s)
shift && _services+=("$1")
;;
--container|-c)
shift && _containers+=("$1")
;;
--version|-v)
echo "Version: $_scriptversion"
exit 0
@@ -561,7 +565,7 @@ EOF
#######################################
# Installs JRiver Media Center from a repository
# Returns:
# 0 if JRiver Media Center installed sucessfully, 1 if installation failed
# 0 if JRiver Media Center installed sucessfully
#######################################
_installMCFromRepo() {
@@ -581,19 +585,30 @@ EOF'
local _mcpkg="MediaCenter"
elif [[ "$ID" =~ ^(ubuntu|debian)$ ]]; then
wget -q "http://dist.jriver.com/mediacenter@jriver.com.gpg.key" -O- | _ifSudo apt-key add - > /dev/null 2>&1
_ifSudo wget "http://dist.jriver.com/latest/mediacenter/mediacenter$_mversion.list" -O "/etc/apt/sources.list.d/jriver.list" > /dev/null 2>&1
_bash_cmd 'cat <<-EOF > /etc/apt/sources.list.d/jriver.list
deb [arch=amd64,i386,armhf] http://dist.jriver.com/latest/mediacenter/ jessie main
EOF'
local _mcpkg="mediacenter$_mversion"
fi
# Update packages and install JRiver MediaCenter
if _pkg_update > /dev/null 2>&1 && _pkg_install "$_mcpkg" > /dev/null 2>&1; then
# Update packages and install JRiver Media Center
if [[ -n $_debug ]]; then
_pkg_update && \
_pkg_install "$_mcpkg"
else
_pkg_update > /dev/null 2>&1 && \
_pkg_install "$_mcpkg" > /dev/null 2>&1
fi
# shellcheck disable=SC2181
# Rationale: More compact to check this once
if [[ $? -eq 0 ]]; then
echo "JRiver Media Center installed successfully!"
return 0
else
err "JRiver Media Center installation failed!"
return 1
exit 1
fi
}
@@ -809,7 +824,7 @@ EOF"
#######################################
# Symlink certificates where JRiver MediaCenter expects them to be on Fedora/CentOS
# Symlink certificates where JRiver Media Center expects them to be on Fedora/CentOS
# them on Debian/Ubuntu
# Returns:
# 0 if symlinking is unecessary or successful, 1 if not
@@ -861,7 +876,7 @@ EOF"
#######################################
# Open the default JRiver MediaCenter ports using the system firewall tool
# Open the default JRiver Media Center ports using the system firewall tool
# Requires:
# ID
# _bash_cmd
@@ -917,13 +932,45 @@ EOF"
#######################################
# Create the VNC password file
# Requires:
# _vncpass
# Create the x11vnc password file
# Globals:
# _novncauth
# Returns:
# 0 if ports opened sucessfully, 1 if not
# 0 if password created sucessfully, 1 if not
#######################################
_setX11VNCPass() {
_runDebug "${FUNCNAME[0]}"
_vncpassfile="$HOME/.vnc/jrmc_passwd"
[[ ! -d "${_vncpassfile%/*}" ]] && mkdir -p "${_vncpassfile%/*}"
if [[ -f "$_vncpassfile" ]]; then
if [[ -z $_vncpass ]]; then
err "Refusing to overwrite existing $_vncpassfile with an empty password"
err "Remove existing $_vncpassfile or set --vncpass to use an empty password"
exit 1
else
rm -f "$_vncpassfile"
fi
fi
if [[ -n $_vncpass ]]; then
if ! x11vnc -storepasswd "$_vncpass" "$_vncpassfile"; then
err "Could not create VNC password file"
return 1
fi
else
_novncauth="true"
fi
}
#######################################
# Create the vncserver password file
# Returns:
# 0 if password created sucessfully, 1 if not
#######################################
_setVNCPass() {
@@ -931,14 +978,24 @@ EOF"
_vncpassfile="$HOME/.vnc/jrmc_passwd"
[[ ! -d "${_vncpassfile%/*}" ]] && mkdir -p "${_vncpassfile%/*}"
if [[ -f "$_vncpassfile" ]]; then
if [[ -z $_vncpass ]]; then
err "Refusing to overwrite existing $_vncpassfile with an empty password"
err "Remove existing $_vncpassfile or set --vncpass to use an empty password"
exit 1
else
rm -f "$_vncpassfile"
fi
fi
if [[ -n $_vncpass ]]; then
# Remove existing password file if it exists and write a new one
[[ -f "$_vncpassfile" ]] && rm -f "$_vncpassfile"
if ! x11vnc -storepasswd "$_vncpass" "$_vncpassfile"; then
if ! echo "$_vncpass" | vncpasswd -f > "$_vncpassfile"; then
err "Could not create VNC password file"
return 1
fi
elif [[ ! -f "$_vncpassfile" ]]; then
else
_novncauth="true"
fi
}
@@ -964,15 +1021,18 @@ EOF"
_timer_name="jriver-${1}@$_user.timer"
_user_specifier="User=%I"
fi
[[ -z $_display ]] && _display="${DISPLAY:-":0"}"
}
#######################################
# SERVICES
#######################################
_serviceMediaserver() {
_runDebug "${FUNCNAME[0]}"
[[ -z $_display ]] && _display="${DISPLAY:-":0"}"
_bash_cmd "cat <<-EOF > $_service_fname
[Unit]
Description=JRiver Media Center $_mversion Media Server
@@ -1000,6 +1060,8 @@ EOF"
_runDebug "${FUNCNAME[0]}"
[[ -z $_display ]] && _display="${DISPLAY:-":0"}"
_bash_cmd "cat <<-EOF > $_service_fname
[Unit]
Description=JRiver Media Center $_mversion
@@ -1027,11 +1089,18 @@ EOF"
_runDebug "${FUNCNAME[0]}"
_setVNCPass
_installPackage tigervnc-server
_setVNCPass
if [[ -n $_novncauth ]]; then
_exec_start_cmd="/usr/bin/vncserver $_display -geometry 1440x900 -alwaysshared -fg -SecurityTypes None -xstartup /usr/bin/mediacenter$_mversion"
else
_exec_start_cmd="/usr/bin/vncserver $_display -geometry 1440x900 -alwaysshared -fg -rfbauth $HOME/.vnc/jrmc_passwd -xstartup /usr/bin/mediacenter$_mversion"
fi
if [[ -z $_display ]]; then
# If we are running on existing X server then increment DISPLAY by one
if [[ -n $DISPLAY ]]; then
_display=$(( ${DISPLAY#:} + 1 ))
_display=":$_display"
@@ -1040,11 +1109,7 @@ EOF"
fi
fi
if [[ "$_novncauth" == "true" ]]; then
_exec_start_cmd="/usr/bin/vncserver $_display -geometry 1440x900 -alwaysshared -fg"
else
_exec_start_cmd="/usr/bin/vncserver $_display -geometry 1440x900 -alwaysshared -fg -rfbauth $HOME/.vnc/jrmc_passwd"
fi
local _port=$(( ${_display#:} + 5900 ))
_bash_cmd "cat <<-EOF > $_service_fname
[Unit]
@@ -1062,6 +1127,8 @@ ExecStop=/usr/bin/vncserver -kill $_display
WantedBy=multi-user.target
EOF"
_systemctl_reload && _systemctl_enable "$_service_name"
echo "vncserver service should be running on localhost:$_port"
echo "You can diagnose issues using \"sudo systemctl status $_service_name\""
}
@@ -1071,9 +1138,9 @@ EOF"
_installPackage x11vnc
_setVNCPass
_setX11VNCPass
if [[ "$_novncauth" == "true" ]]; then
if [[ -n $_novncauth ]]; 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 -auth guess -forever -bg -rfbauth $HOME/.vnc/jrmc_passwd"
@@ -1129,6 +1196,19 @@ EOF"
}
#######################################
# CONTAINERS
#######################################
_containerCreaterepo() {
:
}
_containerVNC() {
:
}
_uninstall() {
_runDebug "${FUNCNAME[0]}"
@@ -1244,12 +1324,25 @@ EOF"
mediacenter)
_serviceMediacenter
;;
vnc)
mediacenter-vncserver)
_serviceVNC
;;
*)
esac
done
# Install containers
for _container in "${_containers[@]}"; do
case "$_container" in
createrepo)
_containerCreaterepo
;;
mediacenter-vncserver)
_containerVNC
;;
*)
esac
done
}
}