Compare commits
7 Commits
6b6e045c30
...
ae4a3d3d25
| Author | SHA1 | Date | |
|---|---|---|---|
| ae4a3d3d25 | |||
| 654213f73e | |||
| 35d488430a | |||
| ed247281f4 | |||
| 82ba1f98e0 | |||
| ba20e0cece | |||
| 949b6d2bf7 |
@@ -78,7 +78,7 @@ jriver-createrepo
|
||||
|
||||
MC helper services are installed as system-level services (`--service-type system`) by default and are manipulable as admin: `sudo systemctl stop jriver-servicename@username.service`. It is also possible to create user-level services using `--service-type user` that can be manipulated by the unprivileged user: `systemctl --user stop jriver-mediacenter`.
|
||||
|
||||
Multiple services (but not `--service-types`) can be installed at one time using multiple `--service` blocks: `installJRMC --repo --service jriver-x11vnc --service jriver-mediacenter`
|
||||
Multiple services (but not `--service-types`) can be installed at one time using multiple `--service` blocks: `installJRMC --install repo --service jriver-x11vnc --service jriver-mediacenter`
|
||||
|
||||
### `jriver-x11vnc` versus `jriver-xvnc`
|
||||
|
||||
|
||||
228
installJRMC
228
installJRMC
@@ -1,8 +1,7 @@
|
||||
#!/usr/bin/env bash
|
||||
# This script will install JRiver Media Center and associated services
|
||||
# on Fedora, CentOS, Debian, and Ubuntu
|
||||
# This script will install JRiver Media Center and associated services on most major distros
|
||||
#
|
||||
# Copyright (c) 2021 Bryan C. Roessler
|
||||
# Copyright (c) 2021-2022 Bryan C. Roessler
|
||||
# This software is released under the Apache License.
|
||||
# https://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
@@ -19,7 +18,7 @@
|
||||
|
||||
shopt -s extglob
|
||||
|
||||
declare -g SCRIPTVERSION="1.0b7"
|
||||
declare -g SCRIPTVERSION="1.0b8"
|
||||
declare -g OUTPUTDIR="$PWD/output"
|
||||
declare -g CREATEREPO_WEBROOT="/var/www/jriver"
|
||||
declare -g USER="${SUDO_USER:-$USER}"
|
||||
@@ -109,48 +108,6 @@ askOk() {
|
||||
}
|
||||
|
||||
|
||||
#######################################
|
||||
# Parses /etc/os-release and provide a compatability layer for unrecognzied distros
|
||||
#######################################
|
||||
getOS() {
|
||||
debug "Running: ${FUNCNAME[0]}"
|
||||
|
||||
declare -g ID
|
||||
|
||||
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 "Platform: $ID $VERSION_ID"
|
||||
|
||||
case "$ID" in
|
||||
centos|fedora|debian|ubuntu)
|
||||
return 0
|
||||
;;
|
||||
linuxmint|neon)
|
||||
ID="ubuntu"
|
||||
;;
|
||||
*suse*)
|
||||
ID="suse"
|
||||
;;
|
||||
*)
|
||||
echo "Autodetecting distro, this may be unreliable and --compat may also be required"
|
||||
if hash dnf &>/dev/null || hash yum &>/dev/null; then
|
||||
ID="fedora"
|
||||
elif hash apt &>/dev/null; then
|
||||
ID="ubuntu"
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
||||
debug "Using compatability platform: $ID"
|
||||
}
|
||||
|
||||
|
||||
#######################################
|
||||
# Parses user input and sets sensible defaults
|
||||
#######################################
|
||||
@@ -342,7 +299,8 @@ installPackage() {
|
||||
skip_check_installed=1
|
||||
;;
|
||||
--allow-downgrades)
|
||||
[[ "$ID" =~ (debian|ubuntu) ]] && install_flags+=(--allow-downgrades)
|
||||
[[ "$ID" =~ ^(debian|ubuntu)$ ]] &&
|
||||
install_flags+=(--allow-downgrades)
|
||||
;;
|
||||
--nogpgcheck)
|
||||
if [[ "$ID" =~ ^(fedora|centos)$ ]]; then
|
||||
@@ -430,6 +388,11 @@ addRepo() {
|
||||
wget -q "http://dist.jriver.com/mediacenter@jriver.com.gpg.key" -O- | sudo apt-key add - &>/dev/null
|
||||
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
|
||||
}
|
||||
|
||||
@@ -707,6 +670,12 @@ buildRPM() {
|
||||
}
|
||||
|
||||
|
||||
installMCArch() {
|
||||
debug "Running: ${FUNCNAME[0]}"
|
||||
echo "Arch install under construction"
|
||||
}
|
||||
|
||||
|
||||
#######################################
|
||||
# Copy the RPM to createrepo-webroot and runs createrepo as the createrepo-user
|
||||
#######################################
|
||||
@@ -784,7 +753,7 @@ symlinkCerts() {
|
||||
|
||||
|
||||
#######################################
|
||||
# Rstore the mjr license file if it is next to installJRMC or RESTOREFILE is set
|
||||
# Restore the mjr license file if it is next to installJRMC or RESTOREFILE is set
|
||||
#######################################
|
||||
restoreLicense() {
|
||||
debug "Running: ${FUNCNAME[0]}"
|
||||
@@ -819,12 +788,16 @@ openFirewall() {
|
||||
# Create OS-specific port rules based on argument (service) name
|
||||
declare -a f_ports # for firewall-cmd
|
||||
declare u_ports # for ufw
|
||||
if [[ "$1" == "jriver" ]]; then
|
||||
declare -a n_ports # for nftables
|
||||
declare port
|
||||
if [[ "$1" == "jriver-mediacenter" ]]; then
|
||||
f_ports=(52100-52200/tcp 1900/udp)
|
||||
u_ports="52100:52200/tcp|1900/udp"
|
||||
n_ports=("tcp dport 52100-52200 accept" "udp dport 1900 accept")
|
||||
elif [[ "$1" =~ ^(jriver-x11vnc|jriver-xvnc)$ ]]; then
|
||||
f_ports=("$PORT"/tcp 1900/udp)
|
||||
u_ports="$PORT/tcp|1900/udp"
|
||||
n_ports=("tcp dport $PORT accept" "udp dport 1900 accept")
|
||||
fi
|
||||
|
||||
# Open the ports
|
||||
@@ -834,8 +807,8 @@ openFirewall() {
|
||||
firewall_cmd --permanent --new-service="$1" &>/dev/null
|
||||
firewall_cmd --permanent --service="$1" --set-description="$1 installed by installJRMC" &>/dev/null
|
||||
firewall_cmd --permanent --service="$1" --set-short="$1" &>/dev/null
|
||||
for f_port in "${f_ports[@]}"; do
|
||||
firewall_cmd --permanent --service="$1" --add-port="$f_port" &>/dev/null
|
||||
for port in "${f_ports[@]}"; do
|
||||
firewall_cmd --permanent --service="$1" --add-port="$port" &>/dev/null
|
||||
done
|
||||
firewall_cmd --add-service "$1" --permanent &>/dev/null
|
||||
firewall_cmd --reload &>/dev/null
|
||||
@@ -853,6 +826,13 @@ openFirewall() {
|
||||
fi
|
||||
firewall_cmd app update "$1" &>/dev/null
|
||||
firewall_cmd allow "$1" &>/dev/null
|
||||
elif [[ "$ID" == "arch" ]]; then
|
||||
sysctl -w net.ipv4.ip_forward = 1
|
||||
sudo nft create table inet "jriver"
|
||||
sudo nft create chain inet "jriver" "$1" '{ type filter hook input priority 0; policy accept; }'
|
||||
for port in "${n_ports[@]}"; do
|
||||
sudo nft add rule inet jriver "$1" handle tcp dport "$port"
|
||||
done
|
||||
fi
|
||||
|
||||
# shellcheck disable=SC2181 # More concise
|
||||
@@ -864,43 +844,15 @@ openFirewall() {
|
||||
|
||||
|
||||
#######################################
|
||||
# Create the x11vnc password file
|
||||
#######################################
|
||||
setX11VNCPass() {
|
||||
debug "Running: ${FUNCNAME[0]}"
|
||||
|
||||
declare vncpassfile="$HOME/.vnc/jrmc_passwd"
|
||||
|
||||
[[ ! -d "${vncpassfile%/*}" ]] && mkdir -p "${vncpassfile%/*}"
|
||||
|
||||
if [[ -f "$vncpassfile" ]]; then
|
||||
if [[ ! -v 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 [[ -v VNCPASS ]]; then
|
||||
if ! x11vnc -storepasswd "$VNCPASS" "$vncpassfile"; then
|
||||
err "Could not create VNC password file"
|
||||
return 1
|
||||
fi
|
||||
else
|
||||
declare -g NOVNCAUTH=1
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
#######################################
|
||||
# Create the Xvnc password file
|
||||
# Create the xvnc or x11vnc password file
|
||||
# Arguments:
|
||||
# Service type (xvnc, x11vnc)
|
||||
#######################################
|
||||
setVNCPass() {
|
||||
debug "Running: ${FUNCNAME[0]}"
|
||||
|
||||
declare vncpassfile="$HOME/.vnc/jrmc_passwd"
|
||||
declare vnc_pass_cmd
|
||||
|
||||
[[ ! -d "${vncpassfile%/*}" ]] && mkdir -p "${vncpassfile%/*}"
|
||||
|
||||
@@ -915,7 +867,12 @@ setVNCPass() {
|
||||
fi
|
||||
|
||||
if [[ -v VNCPASS ]]; then
|
||||
if ! echo "$VNCPASS" | vncpasswd -f > "$vncpassfile"; then
|
||||
if [[ $1 == "xvnc" ]]; then
|
||||
vnc_pass_cmd="echo $VNCPASS | vncpasswd -f > $vncpassfile"
|
||||
elif [[ $1 == "x11vnc" ]]; then
|
||||
vnc_pass_cmd="x11vnc -storepasswd $VNCPASS $vncpassfile"
|
||||
fi
|
||||
if ! eval "$vnc_pass_cmd"; then
|
||||
err "Could not create VNC password file"
|
||||
return 1
|
||||
fi
|
||||
@@ -950,7 +907,7 @@ setDisplay() {
|
||||
setServiceVars() {
|
||||
debug "Running: ${FUNCNAME[0]}"
|
||||
|
||||
declare -g SERVICE_NAME SERVICE_FNAME TIMER_NAME TIMER_FNAME USER_STRING
|
||||
declare -g SERVICE_NAME SERVICE_FNAME TIMER_NAME TIMER_FNAME USER_STRING GRAPHICAL_TARGET
|
||||
declare -g SERVICE_TYPE="${SERVICE_TYPE:-system}"
|
||||
declare service_dir="/usr/lib/systemd/$SERVICE_TYPE"
|
||||
|
||||
@@ -966,12 +923,14 @@ setServiceVars() {
|
||||
systemctl_disable_cmd(){ sudo systemctl disable --now "$@"; }
|
||||
systemctl_is_enabled_cmd(){ sudo systemctl is-enabled -q "$@"; }
|
||||
systemctl_is_active_cmd(){ sudo systemctl is-active -q "$@"; }
|
||||
GRAPHICAL_TARGET="graphical.target"
|
||||
elif [[ "$SERVICE_TYPE" == "user" ]]; then
|
||||
systemctl_reload_cmd(){ systemctl --user daemon-reload; }
|
||||
systemctl_enable_cmd(){ systemctl --user enable --now "$@"; }
|
||||
systemctl_disable_cmd(){ systemctl --user disable --now "$@"; }
|
||||
systemctl_is_enabled_cmd(){ systemctl --user is-enabled -q "$@"; }
|
||||
systemctl_is_active(){ sudo systemctl is-active -q "$@"; }
|
||||
GRAPHICAL_TARGET="default.target"
|
||||
fi
|
||||
|
||||
[[ ! -d "$service_dir" ]] && sudo mkdir -p "$service_dir"
|
||||
@@ -1005,7 +964,7 @@ service_jriver-mediacenter() {
|
||||
sudo bash -c "cat <<- EOF > $SERVICE_FNAME
|
||||
[Unit]
|
||||
Description=JRiver Media Center $MVERSION
|
||||
After=graphical.target
|
||||
After=$GRAPHICAL_TARGET
|
||||
|
||||
[Service]
|
||||
$USER_STRING
|
||||
@@ -1019,12 +978,12 @@ service_jriver-mediacenter() {
|
||||
TimeoutStopSec=30
|
||||
|
||||
[Install]
|
||||
WantedBy=graphical.target
|
||||
WantedBy=$GRAPHICAL_TARGET
|
||||
EOF"
|
||||
|
||||
systemctl_reload_cmd &&
|
||||
systemctl_enable_cmd "$SERVICE_NAME" &&
|
||||
openFirewall "jriver"
|
||||
openFirewall "jriver-mediacenter"
|
||||
}
|
||||
|
||||
|
||||
@@ -1053,7 +1012,7 @@ service_jriver-xvnc() {
|
||||
|
||||
installPackage tigervnc-server
|
||||
|
||||
setVNCPass
|
||||
setVNCPass xvnc
|
||||
|
||||
if (( NOVNCAUTH )); then
|
||||
start_cmd="/usr/bin/vncserver $NEXT_DISPLAY -geometry 1440x900 -alwaysshared -name jriver$NEXT_DISPLAY -SecurityTypes None -autokill -xstartup /usr/bin/mediacenter$MVERSION"
|
||||
@@ -1084,7 +1043,7 @@ service_jriver-xvnc() {
|
||||
systemctl_enable_cmd "$SERVICE_NAME" &&
|
||||
echo "Xvnc running on localhost:$PORT" &&
|
||||
openFirewall "jriver-xvnc" &&
|
||||
openFirewall "jriver"
|
||||
openFirewall "jriver-mediacenter"
|
||||
}
|
||||
|
||||
|
||||
@@ -1102,7 +1061,7 @@ service_jriver-x11vnc() {
|
||||
|
||||
installPackage x11vnc
|
||||
|
||||
setX11VNCPass
|
||||
setVNCPass x11vnc
|
||||
|
||||
# Get current desktop resolution
|
||||
# TODO: may need to break this out into its own function and get smarter at identifying multi-monitors
|
||||
@@ -1130,7 +1089,7 @@ service_jriver-x11vnc() {
|
||||
sudo bash -c "cat <<-EOF > $SERVICE_FNAME
|
||||
[Unit]
|
||||
Description=x11vnc
|
||||
After=graphical.target
|
||||
After=$GRAPHICAL_TARGET
|
||||
|
||||
[Service]
|
||||
$USER_STRING
|
||||
@@ -1141,7 +1100,7 @@ service_jriver-x11vnc() {
|
||||
RestartSec=10
|
||||
|
||||
[Install]
|
||||
WantedBy=graphical.target
|
||||
WantedBy=$GRAPHICAL_TARGET
|
||||
EOF"
|
||||
|
||||
systemctl_reload_cmd &&
|
||||
@@ -1352,7 +1311,7 @@ service_jriver-createrepo() {
|
||||
uninstall() {
|
||||
debug "Running: ${FUNCNAME[0]}"
|
||||
|
||||
declare service unit f
|
||||
declare service unit f i
|
||||
|
||||
if ! askOk "Do you really want to uninstall JRiver Media Center"; then
|
||||
echo "Uninstall canceled"
|
||||
@@ -1362,18 +1321,8 @@ uninstall() {
|
||||
echo "Stopping and removing all Media Center services"
|
||||
for service in $(compgen -A "function" "service"); do
|
||||
service="${service##service_}"
|
||||
SERVICE_TYPE=system setServiceVars "$service";
|
||||
for unit in "$SERVICE_NAME" "$TIMER_NAME"; do
|
||||
if systemctl_is_active_cmd "$unit" &>/dev/null ||
|
||||
systemctl_is_enabled_cmd "$unit" &>/dev/null; then
|
||||
debug "Disabling $unit"
|
||||
systemctl_disable_cmd "$unit"
|
||||
fi
|
||||
done
|
||||
for f in "$SERVICE_FNAME" "$TIMER_FNAME"; do
|
||||
[[ -f "$f" ]] && debug "Removing $f" && sudo rm -f "$f"
|
||||
done
|
||||
SERVICE_TYPE=user setServiceVars "$service";
|
||||
for i in user system; do
|
||||
SERVICE_TYPE="$i" setServiceVars "$service";
|
||||
for unit in "$SERVICE_NAME" "$TIMER_NAME"; do
|
||||
if systemctl_is_active_cmd "$unit" &>/dev/null ||
|
||||
systemctl_is_enabled_cmd "$unit" &>/dev/null; then
|
||||
@@ -1386,6 +1335,10 @@ uninstall() {
|
||||
done
|
||||
systemctl_reload_cmd
|
||||
done
|
||||
for f in /etc/systemd/system/jriver-*; do
|
||||
sudo rm -f "$f"
|
||||
done
|
||||
done
|
||||
|
||||
echo "Removing repo files"
|
||||
sudo rm -rf \
|
||||
@@ -1415,6 +1368,8 @@ uninstall() {
|
||||
eval "$firewall_cmd"
|
||||
[[ -f "/etc/ufw/applications.d/jriver" ]] &&
|
||||
sudo rm -f /etc/ufw/applications.d/jriver
|
||||
elif hash nft 2>/dev/null; then
|
||||
sudo nft delete table inet jriver
|
||||
fi
|
||||
|
||||
echo "Uninstalling JRiver Media Center package"
|
||||
@@ -1441,15 +1396,55 @@ tests() {
|
||||
main() {
|
||||
debug "Running: ${FUNCNAME[0]}"
|
||||
|
||||
getOS
|
||||
declare -g ID
|
||||
|
||||
# Distro-specific commands
|
||||
if [[ "$ID" =~ ^(fedora|centos)$ ]]; then
|
||||
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 "Host platform: $ID $VERSION_ID"
|
||||
|
||||
case "$ID" in
|
||||
centos|fedora)
|
||||
if hash dnf &>/dev/null; then
|
||||
declare mgr="dnf"
|
||||
elif hash yum &>/dev/null; then
|
||||
declare mgr="yum"
|
||||
fi
|
||||
;;
|
||||
debian|ubuntu|arch)
|
||||
return 0
|
||||
;;
|
||||
linuxmint|neon)
|
||||
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"
|
||||
declare mgr="dnf"
|
||||
elif hash yum &>/dev/null; then
|
||||
ID="centos"
|
||||
declare mgr="yum"
|
||||
elif hash apt &>/dev/null; then
|
||||
ID="ubuntu"
|
||||
elif hash pacman &>/dev/null; then
|
||||
ID="arch"
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
||||
debug "Host compatability platform: $ID $VERSION_ID"
|
||||
|
||||
# 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; }
|
||||
@@ -1468,6 +1463,12 @@ main() {
|
||||
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 "$@"
|
||||
@@ -1487,7 +1488,7 @@ main() {
|
||||
|
||||
if (( UNINSTALL_SWITCH )); then
|
||||
uninstall
|
||||
exit $?
|
||||
exit
|
||||
fi
|
||||
|
||||
# Some distros need external repos installed for MC libraries
|
||||
@@ -1506,7 +1507,7 @@ main() {
|
||||
echo "JRiver Media Center installed successfully from repo"
|
||||
symlinkCerts
|
||||
restoreLicense
|
||||
openFirewall "jriver"
|
||||
openFirewall "jriver-mediacenter"
|
||||
else
|
||||
err "JRiver Media Center installation from repo failed"
|
||||
exit 1
|
||||
@@ -1525,7 +1526,8 @@ main() {
|
||||
if (( LOCAL_INSTALL_SWITCH )); then
|
||||
if ([[ "$TARGET" =~ (debian|ubuntu) ]] && installMCDEB) ||
|
||||
([[ "$TARGET" =~ (fedora|centos|suse) ]] &&
|
||||
installPackage --skip-check-installed --nogpgcheck "$MCRPM"); then
|
||||
installPackage --skip-check-installed --nogpgcheck "$MCRPM") ||
|
||||
([[ "$TARGET" == "arch" ]] && installMCArch); then
|
||||
echo "JRiver Media Center installed successfully from local package"
|
||||
else
|
||||
err "JRiver Media Center local package installation failed"
|
||||
@@ -1533,7 +1535,7 @@ main() {
|
||||
fi
|
||||
symlinkCerts
|
||||
restoreLicense
|
||||
openFirewall "jriver"
|
||||
openFirewall "jriver-mediacenter"
|
||||
fi
|
||||
|
||||
if (( CREATEREPO_SWITCH )); then
|
||||
|
||||
Reference in New Issue
Block a user