From 33af04a607297cf650896c1d4b0bffc4f0a28a35 Mon Sep 17 00:00:00 2001 From: bryan Date: Sun, 26 Apr 2020 17:06:21 -0400 Subject: [PATCH] debug version, do not use --- installJRMC | 373 +++++++++++++++++++++++++++------------------------- 1 file changed, 191 insertions(+), 182 deletions(-) diff --git a/installJRMC b/installJRMC index 98b063d..c08dfc3 100755 --- a/installJRMC +++ b/installJRMC @@ -20,19 +20,18 @@ shopt -s extglob ####################################### installJRMC() { - _scriptversion="0.3" + _scriptversion="0.4" _boardurl="https://yabb.jriver.com/interact/index.php/board,64.0.html" _outputdir="$_basedir/output" _createrepo_webroot="/srv/jriver" - _createrepo_user="$(whoami)" - _user="$(whoami)" - _available_services=("createrepo" "x11vnc" "mediaserver" "mediacenter" "mediacenter-vncserver") + _exec_user="$(whoami)" + _available_services=("jriver-createrepo" "jriver-x11vnc" "jriver-mediaserver" "jriver-mediacenter" "jriver-vnc-mediacenter") #_available_containers=("mediacenter-vncserver" "createrepo") _printHelpAndExit() { - _runDebug "${FUNCNAME[0]}" + debug "Running: ${FUNCNAME[0]}" cat <<-'EOF' USAGE: @@ -55,6 +54,8 @@ OPTIONS Restore file location for registration (Default: skip registration) --betapass PASSWORD Enter beta team password for access to beta builds + --service-user USER + Install systemd services and containers for USER --service, -s SERVICE See SERVICES section below for a list of possible services to install --container, -c CONTAINER @@ -69,29 +70,28 @@ OPTIONS 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) SERVICES - mediaserver + jriver-mediaserver Enable and start a mediaserver systemd service (requires an existing X server) - mediacenter + jriver-mediacenter Enable and start a mediacenter systemd service (requires an existing X server) - x11vnc + jriver-x11vnc Enable and start x11vnc for the local desktop (requires an existing X server) --vncpass and --display are also valid options (see below) - mediacenter-vncserver + jriver-vnc-mediacenter 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 + Set vnc password for x11vnc/vncserver access. If no password is set, the script + will either use existing password stored in ~/.vnc/jrmc_passwd or use no password --display DISPLAY - Display to start vncserver/x11vnc (Default: The current display (x11vnc) or next available display (vncserver)) - createrepo + Display to start vncserver/x11vnc (Default: The current display (x11vnc) or next + available display (vncserver)) + jriver-createrepo Install hourly service to build latest MC RPM and run createrepo CONTAINERS @@ -106,7 +106,7 @@ EOF _parseInput() { - _runDebug "${FUNCNAME[0]}" + debug "Running: ${FUNCNAME[0]}" # set default behavior if [[ $# == 0 ]]; then @@ -114,7 +114,7 @@ EOF return 1 fi - 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 + if _input=$(getopt -o +vdhus:c: -l install-repo,install-rpmbuild,rpmbuild,outputdir:,mcversion:,restorefile:,betapass:,service-user:,service:,version,debug,help,uninstall,createrepo,createrepo-webroot:,createrepo-user:,vncpass:,display:,container: -- "$@"); then eval set -- "$_input" while true; do case "$1" in @@ -140,6 +140,9 @@ EOF --betapass) shift && _betapass="$1" ;; + --service-user) + shift && _service_user="$1" + ;; --service|-s) shift && _services+=("$1") ;; @@ -154,9 +157,6 @@ EOF echo "Debugging on" _debug="true" ;; - --force|-f) - _force="true" - ;; --help|-h) _printHelpAndExit 0 ;; @@ -195,25 +195,27 @@ EOF err() { - echo "[$(date +'%Y-%m-%dT%H:%M:%S%z')]: $*" >&2 + echo "Error: $*" >&2 } ####################################### # Call this at the beginning of every function in order to track ####################################### - _runDebug() { + debug() { - [[ -n $_debug ]] && echo "Running: " "$@" + [[ -n $_debug ]] && echo "Debug: $*" } ####################################### - # Prepend this to any command that you wish to execute with sudo (i.e. when _user is NOT root) + # Prepend this to any command that you wish to execute with sudo + # Requires: + # _exec_user ####################################### _ifSudo() { - if [[ "$_user" != "root" ]]; then + if [[ "$_exec_user" != "root" ]]; then sudo "$@" else "$@" @@ -221,35 +223,16 @@ EOF } - _checkUser() { - - _runDebug "${FUNCNAME[0]}" - - if [[ "$_user" == "root" ]]; then - - cat < $_outputdir/SPECS/mediacenter.spec Name: MediaCenter @@ -742,6 +750,7 @@ Requires: mesa-libGL Requires: libglvnd-glx Requires: pango >= 1.36 $_requires +Requires: libXScrnSaver Requires: xdg-utils Requires: libgomp >= 4.9 Requires: gstreamer1 >= 1.4.4 @@ -781,7 +790,7 @@ EOF" declare -g _mcrpm="$_outputdir/RPMS/x86_64/MediaCenter-$_mcversion.x86_64.rpm" # skip rebuilding the rpm if it already exists - if [[ -f "$_mcrpm" && -z "$_force" ]]; then + if [[ -f "$_mcrpm" ]]; then echo "$_mcrpm already exists. Skipping build step..." return 0 # this is fine else @@ -814,7 +823,7 @@ EOF" ####################################### _runCreaterepo() { - _runDebug "${FUNCNAME[0]}" + debug "Running: ${FUNCNAME[0]}" _installPackage createrepo_c @@ -822,7 +831,7 @@ EOF" # If the webroot does not exist, create it if [[ ! -d "$_createrepo_webroot" ]]; then - if ! _mkdir_cmd "$_createrepo_webroot"; then + if ! _cr_mkdir_cmd "$_createrepo_webroot"; then err "Could not create the createrepo-webroot path!" err "Make sure that the createrepo-webroot is writeable by createrepo-user" return 1 @@ -830,7 +839,7 @@ EOF" fi # Copy built rpms to webroot - if ! _cp_cmd "$_rpmfile" "$_createrepo_webroot"; then + if ! _cr_cp_cmd "$_rpmfile" "$_createrepo_webroot"; then err "Could not copy the RPM to the createrepo-webroot path" err "Make sure that the createrepo-webroot path is writeable by createrepo-user" return 1 @@ -855,7 +864,7 @@ EOF" ####################################### _symlinkCerts() { - _runDebug "${FUNCNAME[0]}" + debug "Running: ${FUNCNAME[0]}" if [[ ! -f /etc/ssl/certs/ca-certificates.crt && \ -f /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem ]]; then @@ -878,7 +887,7 @@ EOF" ####################################### _restoreLicense() { - _runDebug "${FUNCNAME[0]}" + debug "Running: ${FUNCNAME[0]}" local _mjr @@ -913,7 +922,7 @@ EOF" ####################################### _openFirewall() { - _runDebug "${FUNCNAME[0]}" + debug "Running: ${FUNCNAME[0]}" # Create OS-specific port rules based on argument (service) name local -a _f_ports # for firewall_cmd @@ -924,6 +933,9 @@ EOF" elif [[ "$1" =~ ^(x11vnc|vncserver)$ ]]; then _f_ports=("$_port/tcp") _u_ports="$_port/tcp" + else + err "_openFirewall unrecognized service name" + exit 1 fi # Open the ports @@ -969,7 +981,7 @@ EOF" ####################################### _setX11VNCPass() { - _runDebug "${FUNCNAME[0]}" + debug "Running: ${FUNCNAME[0]}" _vncpassfile="$HOME/.vnc/jrmc_passwd" @@ -1003,7 +1015,7 @@ EOF" ####################################### _setVNCPass() { - _runDebug "${FUNCNAME[0]}" + debug "Running: ${FUNCNAME[0]}" _vncpassfile="$HOME/.vnc/jrmc_passwd" @@ -1031,23 +1043,59 @@ EOF" ####################################### - # Create associated service variables based on service name + # Set display and port variables # Arguments: - # Requires exactly one argument, the name of the service to parse + # One optional integer argument to increment _service_display by + # Globals: + # _service_display + # _service_displaynum + # _port + ####################################### + _setDisplayAndPort() { + + declare -g _service_display + declare -g _service_displaynum + declare -g _port + + if [[ -n $_display ]]; then + _service_display="$_display" + elif [[ -n $DISPLAY ]]; then + _service_displaynum="${DISPLAY#:}" # strip colon + _service_displaynum="${_service_displaynum%.*}" # strip suffix + _service_displaynum=$(( _service_displaynum + "${1:-0}" )) # incr by $1 + _service_display=":$_service_displaynum" + else + _service_display=":0" + fi + + _port=$(( _service_displaynum + 5900 )) + } + + + ####################################### + # Create associated service variables based on service name + # Requires: + # _service_user + # Globals: + # _service_fname + # _timer_fname + # _service_name + # _timer_name + # _user_specifier ####################################### _servicePrep() { - if [[ "$_user" == "root" ]]; then - _service_fname="/usr/lib/systemd/system/jriver-${1}.service" - _timer_fname="/usr/lib/systemd/system/jriver-${1}.timer" + if [[ "$_service_user" == "root" ]]; then + _service_fname="/usr/lib/systemd/system/${1}.service" + _timer_fname="/usr/lib/systemd/system/${1}.timer" _service_name="jriver-${1}.service" _timer_name="jriver-${1}}.timer" _user_specifier="" else - _service_fname="/usr/lib/systemd/system/jriver-${1}@.service" - _timer_fname="/usr/lib/systemd/system/jriver-${1}@.timer" - _service_name="jriver-${1}@$_user.service" - _timer_name="jriver-${1}@$_user.timer" + _service_fname="/usr/lib/systemd/system/${1}@.service" + _timer_fname="/usr/lib/systemd/system/${1}@.timer" + _service_name="${1}@$_service_user.service" + _timer_name="${1}@$_service_user.timer" _user_specifier="User=%I" fi } @@ -1056,11 +1104,11 @@ EOF" ####################################### # SERVICES ####################################### - _serviceMediaserver() { + _service_jriver-mediaserver() { - _runDebug "${FUNCNAME[0]}" + debug "Running: ${FUNCNAME[0]}" - [[ -z $_display ]] && _display="${DISPLAY:-":0"}" + _setDisplayAndPort _bash_cmd "cat <<-EOF > $_service_fname [Unit] @@ -1083,16 +1131,16 @@ WantedBy=graphical.target EOF" _systemctl_reload && \ _systemctl_start "$_service_name" && \ - _systemctl_enable "$_service_name" + _systemctl_enable "$_service_name" && \ + _openFirewall "jriver" } - _serviceMediacenter() { + _service_jriver-mediacenter() { - _runDebug "${FUNCNAME[0]}" + debug "Running: ${FUNCNAME[0]}" - # Set the display to use - [[ -z $_display ]] && _display="${DISPLAY:-":0"}" + _setDisplayAndPort _bash_cmd "cat <<-EOF > $_service_fname [Unit] @@ -1102,7 +1150,7 @@ After=graphical.target [Service] $_user_specifier Type=simple -Environment=DISPLAY=$_display +Environment=DISPLAY=$_service_display Environment=XAUTHORITY=$XAUTHORITY ExecStart=/usr/bin/mediacenter$_mversion Restart=always @@ -1115,36 +1163,27 @@ WantedBy=graphical.target EOF" _systemctl_reload && \ _systemctl_start "$_service_name" && \ - _systemctl_enable "$_service_name" + _systemctl_enable "$_service_name" && \ + _openFirewall "jriver" } - _serviceVNC() { + _service_jriver-vnc-mediacenter() { - _runDebug "${FUNCNAME[0]}" + debug "Running: ${FUNCNAME[0]}" _installPackage tigervnc-server + _setDisplayAndPort 1 _setVNCPass if [[ -n $_novncauth ]]; then - _exec_start_cmd="/usr/bin/vncserver $_display -geometry 1440x900 -alwaysshared -fg -SecurityTypes None -xstartup /usr/bin/mediacenter$_mversion" + _exec_start_cmd="/usr/bin/vncserver $_service_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" + _exec_start_cmd="/usr/bin/vncserver $_service_display -geometry 1440x900 -alwaysshared -fg -rfbauth $HOME/.vnc/jrmc_passwd -xstartup /usr/bin/mediacenter$_mversion" fi - # Set the display to use - 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" - else - _display=":0" - fi - fi - - declare -g _port=$(( ${_display#:} + 5900 )) + declare -g _port=$(( ${_service_display#:} + 5900 )) _bash_cmd "cat <<-EOF > $_service_fname [Unit] @@ -1154,9 +1193,9 @@ After=syslog.target network.target [Service] Type=simple $_user_specifier -ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill $_display > /dev/null 2>&1 || :' +ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill $_service_display > /dev/null 2>&1 || :' ExecStart=$_exec_start_cmd -ExecStop=/usr/bin/vncserver -kill $_display +ExecStop=/usr/bin/vncserver -kill $_service_display [Install] WantedBy=multi-user.target @@ -1164,31 +1203,30 @@ EOF" _systemctl_reload && \ _systemctl_start "$_service_name" && \ _systemctl_enable "$_service_name" && \ - echo "vncserver running on localhost:$_port" + echo "vncserver running on localhost:$_port" && \ + _openFirewall "vncserver" && \ + _openFirewall "jriver" } - _serviceX11VNC() { + _service_jriver-x11vnc() { - _runDebug "${FUNCNAME[0]}" + debug "Running: ${FUNCNAME[0]}" _installPackage x11vnc + _setDisplayAndPort _setX11VNCPass - [[ -z $_display ]] && _display="${DISPLAY:-":0"}" - - declare -g _port=$(( ${_display#:} + 5900 )) - # Get current desktop resolution # TODO: may need to break this out into its own function and get smarter at identifying multi-monitors local _res _res=$(xdpyinfo | grep dimensions | awk '{print $2}') if [[ -n $_novncauth ]]; then - _exec_start_cmd="/usr/bin/x11vnc -display $_display -noscr -geometry $_res -auth guess -forever -bg -nopw" + _exec_start_cmd="/usr/bin/x11vnc -display $_service_display -noscr -geometry $_res -auth guess -forever -bg -nopw" else - _exec_start_cmd="/usr/bin/x11vnc -display $_display -noscr -geometry $_res -auth guess -forever -bg -rfbauth $HOME/.vnc/jrmc_passwd" + _exec_start_cmd="/usr/bin/x11vnc -display $_service_display -noscr -geometry $_res -auth guess -forever -bg -rfbauth $HOME/.vnc/jrmc_passwd" fi _bash_cmd "cat <<-EOF > $_service_fname @@ -1199,7 +1237,7 @@ After=multi.service [Service] $_user_specifier Type=forking -Environment=DISPLAY=$_display +Environment=DISPLAY=$_service_display ExecStart=$_exec_start_cmd Restart=always RestartSec=10 @@ -1209,14 +1247,15 @@ WantedBy=multi-user.target EOF" _systemctl_reload && \ _systemctl_start "$_service_name" && \ - _systemctl_enable "$_service_name" - echo "x11vnc running on localhost:$_port" + _systemctl_enable "$_service_name" && \ + echo "x11vnc running on localhost:$_port" && \ + _openFirewall "x11vnc" } - _serviceCreaterepo() { + _service_jriver-createrepo() { - _runDebug "${FUNCNAME[0]}" + debug "Running: ${FUNCNAME[0]}" _bash_cmd "cat <<-EOF > $_service_fname [Unit] @@ -1266,7 +1305,7 @@ EOF" _uninstall() { - _runDebug "${FUNCNAME[0]}" + debug "Running: ${FUNCNAME[0]}" read -r -p "Do you really want to uninstall JRiver Media Center? [y/N] " _response _response=${_response,,} # tolower @@ -1314,21 +1353,21 @@ EOF" __main() { - # Check user - _checkUser - # Parse input _parseInput "$@" + # Sanity checks + _sanityChecks + + # Set user variables + _setUser + # Build some OS-specific commands based on the selected OS _buildCommands # Set version to install/uninstall _setVersion - # Sanity checks - _sanityChecks - # Uninstall and exit if [[ -n $_uninstall ]]; then _uninstall @@ -1369,42 +1408,12 @@ EOF" # Install services for _service in "${_services[@]}"; do _servicePrep "$_service" - case "$_service" in - createrepo) - _serviceCreaterepo - ;; - x11vnc) - _serviceX11VNC - _openFirewall "x11vnc" - ;; - mediaserver) - _serviceMediaserver - ;; - mediacenter) - _serviceMediacenter - ;; - mediacenter-vncserver) - _serviceVNC - _openFirewall "vncserver" - ;; - *) - esac + "_service_$_service" done # Install containers for _container in "${_containers[@]}"; do - case "$_container" in - createrepo) - _containerCreaterepo - ;; - mediacenter-vncserver) - _containerVNC - ;; - mediacenter) - _containerMC - ;; - *) - esac + "_container_$_container" done } }