浏览代码

Complete vncserver service

bryan 5 年之前
父节点
当前提交
26c6054b3a
共有 1 个文件被更改,包括 141 次插入48 次删除
  1. 141 48
      installJRMC

+ 141 - 48
installJRMC

@@ -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,28 +932,70 @@ 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
     #######################################
-    _setVNCPass() {
+    _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
-            # Remove existing password file if it exists and write a new one
-            [[ -f "$_vncpassfile" ]] && rm -f "$_vncpassfile"
             if ! x11vnc -storepasswd "$_vncpass" "$_vncpassfile"; then
                 err "Could not create VNC password file"
                 return 1
             fi
-        elif [[ ! -f "$_vncpassfile" ]]; then
+        else
+            _novncauth="true"
+        fi
+    }
+
+
+    #######################################
+    # Create the vncserver password file
+    # Returns:
+    #   0 if password created sucessfully, 1 if not
+    #######################################
+    _setVNCPass() {
+
+        _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 ! echo "$_vncpass" | vncpasswd -f > "$_vncpassfile"; then
+                err "Could not create VNC password file"
+                return 1
+            fi
+        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]}"
 
+        _installPackage tigervnc-server
+
         _setVNCPass
 
-        _installPackage tigervnc-server
+        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
     }
 }