|
| 1 | +#!/usr/bin/env bash |
| 2 | + |
| 3 | +BOLD='\033[0;1m' |
| 4 | +RESET='\033[0m' |
| 5 | + |
| 6 | +printf "${BOLD}🖥️ Installing RustDesk Remote Desktop\n${RESET}" |
| 7 | + |
| 8 | +# ---- configurable knobs (env overrides) ---- |
| 9 | +RUSTDESK_VERSION="${RUSTDESK_VERSION:-latest}" |
| 10 | +LOG_PATH="${LOG_PATH:-/tmp/rustdesk.log}" |
| 11 | + |
| 12 | +# ---- fetch latest version if needed ---- |
| 13 | +if [ "$RUSTDESK_VERSION" = "latest" ]; then |
| 14 | + printf "🔍 Fetching latest RustDesk version...\n" |
| 15 | + RUSTDESK_VERSION=$(curl -s https://api.github.com/repos/rustdesk/rustdesk/releases/latest | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/' || echo "1.4.1") |
| 16 | + printf "📌 Fetched RustDesk version: ${RUSTDESK_VERSION}\n" |
| 17 | +else |
| 18 | + printf "📌 Using specified RustDesk version: ${RUSTDESK_VERSION}\n" |
| 19 | +fi |
| 20 | +XVFB_RESOLUTION="${XVFB_RESOLUTION:-1024x768x16}" |
| 21 | +RUSTDESK_PASSWORD="${RUSTDESK_PASSWORD:-}" |
| 22 | + |
| 23 | +# ---- detect package manager & arch ---- |
| 24 | +ARCH="$(uname -m)" |
| 25 | +case "$ARCH" in |
| 26 | + x86_64 | amd64) PKG_ARCH="x86_64" ;; |
| 27 | + aarch64 | arm64) PKG_ARCH="aarch64" ;; |
| 28 | + *) |
| 29 | + echo "❌ Unsupported arch: $ARCH" |
| 30 | + exit 1 |
| 31 | + ;; |
| 32 | +esac |
| 33 | + |
| 34 | +if command -v apt-get > /dev/null 2>&1; then |
| 35 | + PKG_SYS="deb" |
| 36 | + PKG_NAME="rustdesk-${RUSTDESK_VERSION}-${PKG_ARCH}.deb" |
| 37 | + INSTALL_DEPS='apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y wget libva2 libva-drm2 libva-x11-2 libgstreamer-plugins-base1.0-0 gstreamer1.0-pipewire xfce4 xfce4-goodies xvfb x11-xserver-utils dbus-x11 libegl1 libgl1 libglx0 libglu1-mesa mesa-utils libxrandr2 libxss1 libgtk-3-0t64 libgbm1 libdrm2 libxcomposite1 libxdamage1 libxfixes3' |
| 38 | + INSTALL_CMD="apt-get install -y ./${PKG_NAME}" |
| 39 | + CLEAN_CMD="rm -f \"${PKG_NAME}\"" |
| 40 | +elif command -v dnf > /dev/null 2>&1; then |
| 41 | + PKG_SYS="rpm" |
| 42 | + PKG_NAME="rustdesk-${RUSTDESK_VERSION}-${PKG_ARCH}.rpm" |
| 43 | + INSTALL_DEPS='dnf install -y wget libva libva-intel-driver gstreamer1-plugins-base pipewire xfce4-session xfce4-panel xorg-x11-server-Xvfb xorg-x11-xauth dbus-x11 mesa-libEGL mesa-libGL mesa-libGLU mesa-dri-drivers libXrandr libXScrnSaver gtk3 mesa-libgbm libdrm libXcomposite libXdamage libXfixes' |
| 44 | + INSTALL_CMD="dnf install -y ./${PKG_NAME}" |
| 45 | + CLEAN_CMD="rm -f \"${PKG_NAME}\"" |
| 46 | +elif command -v yum > /dev/null 2>&1; then |
| 47 | + PKG_SYS="rpm" |
| 48 | + PKG_NAME="rustdesk-${RUSTDESK_VERSION}-${PKG_ARCH}.rpm" |
| 49 | + INSTALL_DEPS='yum install -y wget libva libva-intel-driver gstreamer1-plugins-base pipewire xfce4-session xfce4-panel xorg-x11-server-Xvfb xorg-x11-xauth dbus-x11 mesa-libEGL mesa-libGL mesa-libGLU mesa-dri-drivers libXrandr libXScrnSaver gtk3 mesa-libgbm libdrm libXcomposite libXdamage libXfixes' |
| 50 | + INSTALL_CMD="yum install -y ./${PKG_NAME}" |
| 51 | + CLEAN_CMD="rm -f \"${PKG_NAME}\"" |
| 52 | +else |
| 53 | + echo "❌ Unsupported distro: need apt, dnf, or yum." |
| 54 | + exit 1 |
| 55 | +fi |
| 56 | + |
| 57 | +# ---- install rustdesk if missing ---- |
| 58 | +if ! command -v rustdesk > /dev/null 2>&1; then |
| 59 | + printf "📦 Installing dependencies...\n" |
| 60 | + sudo bash -c "$INSTALL_DEPS" 2>&1 | tee -a "${LOG_PATH}" |
| 61 | + |
| 62 | + printf "⬇️ Downloading RustDesk ${RUSTDESK_VERSION} (${PKG_SYS}, ${PKG_ARCH})...\n" |
| 63 | + URL="https://github.com/rustdesk/rustdesk/releases/download/${RUSTDESK_VERSION}/${PKG_NAME}" |
| 64 | + wget -q "$URL" 2>&1 | tee -a "${LOG_PATH}" |
| 65 | + |
| 66 | + printf "🔧 Installing RustDesk...\n" |
| 67 | + sudo bash -c "$INSTALL_CMD" 2>&1 | tee -a "${LOG_PATH}" |
| 68 | + |
| 69 | + printf "🧹 Cleaning up...\n" |
| 70 | + bash -c "$CLEAN_CMD" 2>&1 | tee -a "${LOG_PATH}" |
| 71 | +else |
| 72 | + printf "✅ RustDesk already installed\n" |
| 73 | +fi |
| 74 | + |
| 75 | +# ---- start virtual display ---- |
| 76 | +echo "Starting Xvfb with resolution ${XVFB_RESOLUTION}…" |
| 77 | +Xvfb :99 -screen 0 "${XVFB_RESOLUTION}" >> "${LOG_PATH}" 2>&1 & |
| 78 | +export DISPLAY=:99 |
| 79 | + |
| 80 | +# Wait for X to be ready |
| 81 | +for i in {1..10}; do |
| 82 | + if xdpyinfo -display :99 > /dev/null 2>&1; then |
| 83 | + echo "X display is ready" |
| 84 | + break |
| 85 | + fi |
| 86 | + sleep 1 |
| 87 | +done |
| 88 | + |
| 89 | +# ---- create (or accept) password and start rustdesk ---- |
| 90 | +if [[ -z "${RUSTDESK_PASSWORD}" ]]; then |
| 91 | + RUSTDESK_PASSWORD="$(tr -dc 'a-zA-Z0-9@' < /dev/urandom | head -c 10)@97" |
| 92 | +fi |
| 93 | + |
| 94 | +echo "Starting XFCE desktop environment..." |
| 95 | +xfce4-session >> "${LOG_PATH}" 2>&1 & |
| 96 | + |
| 97 | +echo "Waiting for xfce4-session to initialize..." |
| 98 | +sleep 5 |
| 99 | + |
| 100 | +printf "🔐 Setting RustDesk password and starting service...\n" |
| 101 | +rustdesk >> "${LOG_PATH}" 2>&1 & |
| 102 | +sleep 2 |
| 103 | + |
| 104 | +rustdesk --password "${RUSTDESK_PASSWORD}" >> "${LOG_PATH}" 2>&1 & |
| 105 | +sleep 3 |
| 106 | + |
| 107 | +RID="$(rustdesk --get-id 2> /dev/null || echo 'ID_PENDING')" |
| 108 | + |
| 109 | +printf "🥳 RustDesk setup complete!\n\n" |
| 110 | +printf "${BOLD}📋 Connection Details:${RESET}\n" |
| 111 | +printf " RustDesk ID: ${RID}\n" |
| 112 | +printf " RustDesk Password: ${RUSTDESK_PASSWORD}\n" |
| 113 | +printf " Display: ${DISPLAY} (${XVFB_RESOLUTION})\n" |
| 114 | +printf "\n📝 Logs available at: ${LOG_PATH}\n\n" |
| 115 | + |
| 116 | +echo "Setup script completed successfully. All services running in background." |
| 117 | +exit 0 |
0 commit comments