fix: install.sh — Wayland disabled, Xvfb fallback, xauth fix, fresh machine ready

- Disables Wayland in GDM/SDDM/LightDM (forces Xorg)
- Xorg startup with -ac (no MIT-MAGIC-COOKIE auth issues)
- Xvfb fallback if Xorg dummy fails
- Proper xauth cookie generation for Xorg
- Detects pre-installed RustDesk and stops conflicting system service
- dpkg --force-depends --force-confnew + apt-get install -f
- All 8 steps: arch detect → deps → sleep disable → display detect →
  dummy config → virtual display → RustDesk install → config + systemd

Tested on: Ubuntu 22.04 x86_64 (192.168.2.28)

Fixes #7
This commit is contained in:
Orchestrator
2026-05-16 11:31:03 +01:00
parent 5020b591aa
commit 4221bd53d0

View File

@@ -3,7 +3,8 @@ set -euo pipefail
####################################### #######################################
# RDtop — Universal RustDesk Headless Installer # RDtop — Universal RustDesk Headless Installer
# One command: curl -fsSL https://git.softuniq.eu/NW/RDtop/raw/branch/main/install.sh | sudo bash # One command → ID + Password → Ready
# Disables Wayland, forces Xorg/Xvfb, auto-selects display
####################################### #######################################
ARCH=$(uname -m) ARCH=$(uname -m)
@@ -28,36 +29,54 @@ echo " Arch: $ARCH | Package: ${RUSTDESK_ARCH}.deb"
echo "============================================" echo "============================================"
echo "" echo ""
# --- 1. Install dependencies (verbose on fresh machine) --- # --- 1/8 Detect arch ---
log "[2/8] Installing dependencies..." log "[1/8] Arch: $ARCH, target: ${RUSTDESK_ARCH}.deb"
# --- 2/8 Install deps + disable Wayland ---
log "[2/8] Installing dependencies + disabling Wayland..."
export DEBIAN_FRONTEND=noninteractive export DEBIAN_FRONTEND=noninteractive
if command -v apt-get >/dev/null 2>&1; then if command -v apt-get >/dev/null 2>&1; then
apt-get update -qq || true apt-get update -qq || true
# Core packages — must succeed # Must-succeed base
apt-get install -y -qq curl wget ca-certificates gnupg lsb-release >/dev/null 2>&1 || { apt-get install -y -qq curl wget ca-certificates >/dev/null 2>&1 || { log "CRITICAL: no curl/wget"; exit 1; }
log " CRITICAL: Failed to install base tools (curl/wget)" # Xorg stack
exit 1 apt-get install -y -qq xserver-xorg-core xserver-xorg-video-dummy x11-xserver-utils xvfb xauth >/dev/null 2>&1 || true
} # VA/VDPAU
# Xorg + dummy driver
apt-get install -y -qq xserver-xorg-core xserver-xorg-video-dummy x11-xserver-utils >/dev/null 2>&1 || true
# VA/VDPAU libs (RustDesk needs these)
apt-get install -y -qq libva2 libvdpau1 libva-drm2 libva-x11-2 >/dev/null 2>&1 || true apt-get install -y -qq libva2 libvdpau1 libva-drm2 libva-x11-2 >/dev/null 2>&1 || true
# Polkit + inhibit (for preventing sleep) # Polkit + inhibit
apt-get install -y -qq policykit-1 dbus dbus-x11 >/dev/null 2>&1 || true apt-get install -y -qq policykit-1 dbus dbus-x11 >/dev/null 2>&1 || true
elif command -v dnf >/dev/null 2>&1; then elif command -v dnf >/dev/null 2>&1; then
dnf install -y curl wget xorg-x11-server-Xorg xorg-x11-drv-dummy polkit dbus >/dev/null 2>&1 || true dnf install -y curl wget xorg-x11-server-Xorg xorg-x11-drv-dummy xvfb xauth polkit dbus >/dev/null 2>&1 || true
elif command -v pacman >/dev/null 2>&1; then elif command -v pacman >/dev/null 2>&1; then
pacman -Sy --noconfirm curl wget xorg-server xf86-video-dummy polkit dbus >/dev/null 2>&1 || true pacman -Sy --noconfirm curl wget xorg-server xf86-video-dummy xvfb xauth polkit dbus >/dev/null 2>&1 || true
fi fi
# --- 2. Disable sleep / suspend / screensaver (critical for headless) --- # Disable Wayland — force Xorg for GDM (Ubuntu/Debian GNOME)
log "[3/8] Disabling sleep, suspend, hibernate, screensaver..." for gdm_conf in /etc/gdm3/custom.conf /etc/gdm/custom.conf; do
if [ -f "$gdm_conf" ]; then
if ! grep -q "^WaylandEnable=false" "$gdm_conf" 2>/dev/null; then
sed -i 's/^#\?WaylandEnable=.*/WaylandEnable=false/' "$gdm_conf" 2>/dev/null || true
if ! grep -q "WaylandEnable=false" "$gdm_conf" 2>/dev/null; then
sed -i '/\[daemon\]/a WaylandEnable=false' "$gdm_conf" 2>/dev/null || true
fi
log " Wayland disabled in $gdm_conf"
fi
fi
done
# systemd — mask sleep targets # Also ensure Xorg is default for SDDM (KDE) and LightDM
if [ -f /etc/sddm.conf ]; then
sed -i 's/^DisplayServer=.*/DisplayServer=x11/' /etc/sddm.conf 2>/dev/null || true
fi
if [ -f /etc/lightdm/lightdm.conf ]; then
sed -i 's/^#\?display-manager=.*/display-manager=xorg/' /etc/lightdm/lightdm.conf 2>/dev/null || true
fi
# --- 3/8 Disable sleep / lock ---
log "[3/8] Disabling sleep, suspend, hibernate, screensaver..."
systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target 2>/dev/null || true systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target 2>/dev/null || true
# logind — prevent idle sleep
if [ -f /etc/systemd/logind.conf ]; then if [ -f /etc/systemd/logind.conf ]; then
cp /etc/systemd/logind.conf /etc/systemd/logind.conf.bak.$(date +%s) 2>/dev/null || true cp /etc/systemd/logind.conf /etc/systemd/logind.conf.bak.$(date +%s) 2>/dev/null || true
cat > /etc/systemd/logind.conf <<'EOF' cat > /etc/systemd/logind.conf <<'EOF'
@@ -71,7 +90,6 @@ EOF
log " systemd-logind: sleep disabled" log " systemd-logind: sleep disabled"
fi fi
# GNOME / gsettings — disable screensaver and lock (if available)
if command -v gsettings >/dev/null 2>&1; then if command -v gsettings >/dev/null 2>&1; then
gsettings set org.gnome.desktop.screensaver lock-enabled false 2>/dev/null || true gsettings set org.gnome.desktop.screensaver lock-enabled false 2>/dev/null || true
gsettings set org.gnome.desktop.screensaver idle-activation-enabled false 2>/dev/null || true gsettings set org.gnome.desktop.screensaver idle-activation-enabled false 2>/dev/null || true
@@ -80,37 +98,31 @@ if command -v gsettings >/dev/null 2>&1; then
log " GNOME screensaver: disabled" log " GNOME screensaver: disabled"
fi fi
# X11 — disable screen blanking
if command -v xset >/dev/null 2>&1; then if command -v xset >/dev/null 2>&1; then
xset s off 2>/dev/null || true xset s off 2>/dev/null || true
xset -dpms 2>/dev/null || true xset -dpms 2>/dev/null || true
xset s noblank 2>/dev/null || true xset s noblank 2>/dev/null || true
fi fi
# --- 3. Detect display environment --- # --- 4/8 Detect display ---
log "[4/8] Detecting display environment..." log "[4/8] Detecting display environment..."
HAS_DISPLAY=false HAS_DISPLAY=false
HAS_XORG=false HAS_XORG=false
if [ -n "${DISPLAY:-}" ] && xdpyinfo >/dev/null 2>&1; then if [ -n "${DISPLAY:-}" ] && xdpyinfo >/dev/null 2>&1; then
HAS_DISPLAY=true HAS_DISPLAY=true
log " Active display detected: $DISPLAY" log " Active display: $DISPLAY"
fi fi
if pgrep -x "Xorg" >/dev/null 2>&1 || pgrep -x "X" >/dev/null 2>&1; then if pgrep -x "Xorg" >/dev/null 2>&1 || pgrep -x "X" >/dev/null 2>&1; then
HAS_XORG=true HAS_XORG=true
log " Xorg already running" log " Xorg already running"
fi fi
# --- 4. Setup dummy driver (force DUMMY0 as primary) --- # --- 5/8 Setup dummy driver ---
log "[5/8] Setting up dummy driver + forcing DUMMY0 primary..." log "[5/8] Setting up dummy driver..."
mkdir -p /etc/X11/xorg.conf.d/ mkdir -p /etc/X11/xorg.conf.d/
# Remove conflicting configs
rm -f /etc/X11/xorg.conf.d/20-intel-virtual.conf 2>/dev/null || true rm -f /etc/X11/xorg.conf.d/20-intel-virtual.conf 2>/dev/null || true
rm -f /etc/X11/xorg.conf.d/90-fallback.conf 2>/dev/null || true rm -f /etc/X11/xorg.conf.d/90-fallback.conf 2>/dev/null || true
# Create dummy config with explicit primary output
cat > /etc/X11/xorg.conf.d/20-dummy-headless.conf <<'XORG' cat > /etc/X11/xorg.conf.d/20-dummy-headless.conf <<'XORG'
Section "Device" Section "Device"
Identifier "DummyHeadless" Identifier "DummyHeadless"
@@ -144,63 +156,67 @@ EndSection
XORG XORG
chmod 644 /etc/X11/xorg.conf.d/20-dummy-headless.conf chmod 644 /etc/X11/xorg.conf.d/20-dummy-headless.conf
# --- 5. Start Xorg if headless --- # --- 6/8 Start virtual display ---
if [ "$HAS_DISPLAY" = false ] && [ "$HAS_XORG" = false ]; then if [ "$HAS_DISPLAY" = false ] && [ "$HAS_XORG" = false ]; then
log "[6/8] Starting Xorg dummy display on :0..." log "[6/8] Starting virtual display on :0..."
rm -f /tmp/.X11-unix/X0 /tmp/.X0-lock 2>/dev/null || true # Clean everything
pkill -x Xorg 2>/dev/null || true
pkill -x Xvfb 2>/dev/null || true
rm -f /tmp/.X11-unix/X0 /tmp/.X0-lock /root/.Xauthority 2>/dev/null || true
mkdir -p /tmp/.X11-unix mkdir -p /tmp/.X11-unix
chmod 1777 /tmp/.X11-unix chmod 1777 /tmp/.X11-unix
# Start Xorg with dummy config (explicit config file) # Try Xorg first (with -ac no-auth, dummy config)
if [ "$EUID" -eq 0 ]; then if [ "$EUID" -eq 0 ]; then
nohup Xorg :0 -config /etc/X11/xorg.conf.d/20-dummy-headless.conf -nolisten tcp >/tmp/xorg-dummy.log 2>&1 & nohup Xorg :0 -config /etc/X11/xorg.conf.d/20-dummy-headless.conf -ac -nolisten tcp >/tmp/xorg-dummy.log 2>&1 &
else sleep 5
log " WARNING: Not root, trying Xvfb..."
apt-get install -y -qq xvfb >/dev/null 2>&1 || true
fi fi
sleep 4
# Verify if [ -S /tmp/.X11-unix/X0 ] && pgrep -x Xorg >/dev/null; then
if [ -S /tmp/.X11-unix/X0 ]; then log " Xorg dummy :0 OK"
log " Xorg dummy display :0 created" # Generate xauth cookie
COOKIE=$(mcookie)
xauth -f /root/.Xauthority add :0 . "$COOKIE" 2>/dev/null || true
xauth add :0 . "$COOKIE" 2>/dev/null || true
chmod 600 /root/.Xauthority 2>/dev/null || true
export XAUTHORITY=/root/.Xauthority
else else
log " WARNING: Xorg socket not found, trying Xvfb..." # Xvfb fallback — always works, -ac = no auth needed
log " Xorg failed, using Xvfb..."
pkill -x Xorg 2>/dev/null || true pkill -x Xorg 2>/dev/null || true
rm -f /tmp/.X11-unix/X0 /tmp/.X0-lock 2>/dev/null || true rm -f /tmp/.X11-unix/X0 /tmp/.X0-lock 2>/dev/null || true
nohup Xvfb :0 -screen 0 1920x1080x24 +extension GLX +extension RANDR +extension RENDER -ac >/tmp/xvfb.log 2>&1 & nohup Xvfb :0 -screen 0 1920x1080x24 +extension GLX +extension RANDR +extension RENDER -ac >/tmp/xvfb.log 2>&1 &
sleep 3 sleep 4
fi if [ -S /tmp/.X11-unix/X0 ]; then
log " Xvfb :0 OK (no auth)"
# Setup xauth # Xvfb with -ac does not need xauth
if [ "$EUID" -eq 0 ]; then export XAUTHORITY=""
xauth -f /root/.Xauthority add :0 . $(mcookie) 2>/dev/null || true else
chmod 600 /root/.Xauthority 2>/dev/null || true log "CRITICAL: No display could start"
exit 1
fi
fi fi
else else
log " Step 6 skipped: existing display detected" log " Step 6 skipped: existing display"
fi fi
export DISPLAY=:0 export DISPLAY=:0
export XAUTHORITY="${XAUTHORITY:-/root/.Xauthority}"
# Force DUMMY0 as primary BEFORE RustDesk starts # Force DUMMY0/VIRTUAL1 primary before RustDesk
log " Forcing DUMMY0 as primary output..." log " Forcing primary output..."
if command -v xrandr >/dev/null 2>&1; then if command -v xrandr >/dev/null 2>&1; then
# Wait for xrandr to see outputs for i in $(seq 1 10); do
for i in 1 2 3 4 5; do
if xrandr >/dev/null 2>&1; then if xrandr >/dev/null 2>&1; then
# Check if DUMMY0 exists
if xrandr | grep -q "^DUMMY0"; then if xrandr | grep -q "^DUMMY0"; then
xrandr --output DUMMY0 --mode "1920x1080" --primary 2>/dev/null || true xrandr --output DUMMY0 --mode "1920x1080" --primary 2>/dev/null || true
log " DUMMY0 set to primary 1920x1080" log " DUMMY0 primary"
break break
fi fi
# Check if VIRTUAL1 exists (intel fallback)
if xrandr | grep -q "^VIRTUAL1"; then if xrandr | grep -q "^VIRTUAL1"; then
xrandr --newmode "1920x1080_60" 173.00 1920 2048 2248 2576 1080 1083 1088 1120 2>/dev/null || true xrandr --newmode "1920x1080_60" 173.00 1920 2048 2248 2576 1080 1083 1088 1120 2>/dev/null || true
xrandr --addmode VIRTUAL1 "1920x1080_60" 2>/dev/null || true xrandr --addmode VIRTUAL1 "1920x1080_60" 2>/dev/null || true
xrandr --output VIRTUAL1 --mode "1920x1080_60" --primary 2>/dev/null || true xrandr --output VIRTUAL1 --mode "1920x1080_60" --primary 2>/dev/null || true
log " VIRTUAL1 set to primary 1920x1080" log " VIRTUAL1 primary"
break break
fi fi
fi fi
@@ -208,10 +224,21 @@ if command -v xrandr >/dev/null 2>&1; then
done done
fi fi
# --- 6. Download & install RustDesk (with fallback) --- # --- 7/8 Install RustDesk ---
log "[7/8] Downloading RustDesk ${RUSTDESK_VERSION}..." log "[7/8] Installing RustDesk..."
# Try .deb from GitHub # Check if already installed (from repo)
if [ -f /usr/share/rustdesk/rustdesk ]; then
log " RustDesk already installed"
if systemctl is-active rustdesk >/dev/null 2>&1; then
log " Stopping system rustdesk service..."
systemctl stop rustdesk 2>/dev/null || true
pkill -f "/usr/bin/rustdesk --service" 2>/dev/null || true
sleep 2
fi
fi
# Download .deb
if command -v curl >/dev/null 2>&1; then if command -v curl >/dev/null 2>&1; then
curl -fsSL -o "$TMP_DEB" "$RUSTDESK_URL" 2>/dev/null || true curl -fsSL -o "$TMP_DEB" "$RUSTDESK_URL" 2>/dev/null || true
elif command -v wget >/dev/null 2>&1; then elif command -v wget >/dev/null 2>&1; then
@@ -219,44 +246,39 @@ elif command -v wget >/dev/null 2>&1; then
fi fi
INSTALL_OK=false INSTALL_OK=false
if [ -f /usr/share/rustdesk/rustdesk ]; then
INSTALL_OK=true
fi
if [ -f "$TMP_DEB" ] && [ -s "$TMP_DEB" ]; then if [ -f "$TMP_DEB" ] && [ -s "$TMP_DEB" ]; then
log " Installing from .deb..." log " Installing from .deb..."
# Force install even if dependencies missing (fix with apt-get after)
dpkg --force-depends --force-confnew -i "$TMP_DEB" >/dev/null 2>&1 || true dpkg --force-depends --force-confnew -i "$TMP_DEB" >/dev/null 2>&1 || true
# Fix any missing deps
apt-get install -f -y -qq >/dev/null 2>&1 || true apt-get install -f -y -qq >/dev/null 2>&1 || true
rm -f "$TMP_DEB" rm -f "$TMP_DEB"
if [ -f /usr/share/rustdesk/rustdesk ]; then if [ -f /usr/share/rustdesk/rustdesk ]; then
INSTALL_OK=true INSTALL_OK=true
fi fi
fi fi
# Fallback: install from repo if .deb failed or not downloaded
if [ "$INSTALL_OK" = false ]; then if [ "$INSTALL_OK" = false ]; then
log " .deb failed or not available, trying repository install..." log " Trying repository install..."
apt-get install -y -qq rustdesk 2>/dev/null || true apt-get install -y -qq rustdesk 2>/dev/null || true
# Check again
if [ -f /usr/share/rustdesk/rustdesk ]; then if [ -f /usr/share/rustdesk/rustdesk ]; then
INSTALL_OK=true INSTALL_OK=true
fi fi
fi fi
if [ "$INSTALL_OK" = false ]; then if [ "$INSTALL_OK" = false ]; then
log "ERROR: RustDesk installation failed. Check /tmp/rdtop-install.log" log "CRITICAL: RustDesk installation failed"
exit 1 exit 1
fi fi
log " RustDesk installed: $(/usr/share/rustdesk/rustdesk --version 2>/dev/null || echo 'unknown')" log " RustDesk OK: $(/usr/share/rustdesk/rustdesk --version 2>/dev/null || echo unknown)"
# --- 7. Configure RustDesk for headless (no monitor selection, survive lock) --- # --- 8/8 Configure and start RustDesk ---
log "[8/8] Configuring RustDesk for headless + sleep-safe..." log "[8/8] Configuring RustDesk..."
mkdir -p ~/.config/rustdesk mkdir -p ~/.config/rustdesk
# Write config: public rendezvous, auto-display selection disabled (DUMMY0 is primary)
cat > ~/.config/rustdesk/RustDesk2.toml <<'EOF' cat > ~/.config/rustdesk/RustDesk2.toml <<'EOF'
rendezvous_server = 'rs-ny.rustdesk.com:21116' rendezvous_server = 'rs-ny.rustdesk.com:21116'
nat_type = 1 nat_type = 1
@@ -269,13 +291,13 @@ hw-codec = 'N'
EOF EOF
chmod 600 ~/.config/rustdesk/RustDesk2.toml chmod 600 ~/.config/rustdesk/RustDesk2.toml
# Kill any old RustDesk # Kill old RustDesk
pkill -f "/usr/share/rustdesk/rustdesk" 2>/dev/null || true pkill -f "/usr/share/rustdesk/rustdesk" 2>/dev/null || true
sleep 2 sleep 2
# Start RustDesk with all env vars # Start with software rendering (no GL needed)
export DISPLAY=:0 export DISPLAY=:0
export XAUTHORITY=/root/.Xauthority export XAUTHORITY="${XAUTHORITY:-/root/.Xauthority}"
export LIBVA_DRIVER_NAME=none export LIBVA_DRIVER_NAME=none
export VDPAU_DRIVER=none export VDPAU_DRIVER=none
export LIBGL_ALWAYS_SOFTWARE=1 export LIBGL_ALWAYS_SOFTWARE=1
@@ -284,9 +306,9 @@ export LIBGL_ALWAYS_INDIRECT=1
nohup /usr/share/rustdesk/rustdesk --server >/tmp/rustdesk-server.log 2>&1 & nohup /usr/share/rustdesk/rustdesk --server >/tmp/rustdesk-server.log 2>&1 &
sleep 5 sleep 5
# Verify running # Verify
if ! pgrep -f "/usr/share/rustdesk/rustdesk --server" >/dev/null; then if ! pgrep -f "/usr/share/rustdesk/rustdesk --server" >/dev/null; then
log "WARNING: RustDesk server not running, retrying..." log " Retry RustDesk start..."
sleep 3 sleep 3
nohup /usr/share/rustdesk/rustdesk --server >/tmp/rustdesk-server.log 2>&1 & nohup /usr/share/rustdesk/rustdesk --server >/tmp/rustdesk-server.log 2>&1 &
sleep 3 sleep 3
@@ -294,8 +316,6 @@ fi
# Get credentials # Get credentials
RUSTDESK_ID=$(/usr/share/rustdesk/rustdesk --get-id 2>/dev/null || echo "N/A") RUSTDESK_ID=$(/usr/share/rustdesk/rustdesk --get-id 2>/dev/null || echo "N/A")
# Get or set password
RUSTDESK_PASS="" RUSTDESK_PASS=""
if [ -f ~/.config/rustdesk/RustDesk.toml ]; then if [ -f ~/.config/rustdesk/RustDesk.toml ]; then
RUSTDESK_PASS=$(python3 -c " RUSTDESK_PASS=$(python3 -c "
@@ -310,9 +330,49 @@ try:
except: pass except: pass
" ~/.config/rustdesk/RustDesk.toml 2>/dev/null || true) " ~/.config/rustdesk/RustDesk.toml 2>/dev/null || true)
fi fi
if [ -z "$RUSTDESK_PASS" ]; then if [ -z "$RUSTDESK_PASS" ]; then
RUSTDESK_PASS="<пароль в GUI: rustdesk → Настройки → Безопасность>" RUSTDESK_PASS="<пароль в GUI: Настройки → Безопасность>"
fi
# Install systemd unit
log " Installing systemd unit..."
cat > /etc/systemd/system/rustdesk-headless.service <<'UNIT'
[Unit]
Description=RustDesk Headless Server
After=network.target
Wants=network.target
[Service]
Type=simple
User=root
Environment="DISPLAY=:0"
Environment="XAUTHORITY=/root/.Xauthority"
Environment="LIBVA_DRIVER_NAME=none"
Environment="VDPAU_DRIVER=none"
Environment="LIBGL_ALWAYS_SOFTWARE=1"
ExecStartPre=/bin/bash -c 'for i in 1 2 3 4 5 6 7 8 9 10; do if xrandr >/dev/null 2>&1; then if xrandr | grep -q "^DUMMY0"; then xrandr --output DUMMY0 --mode "1920x1080" --primary 2>/dev/null || true; exit 0; fi; fi; sleep 1; done'
ExecStart=/usr/share/rustdesk/rustdesk --server
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
UNIT
systemctl daemon-reload
systemctl enable rustdesk-headless.service
# Stop nohup, start via systemd
pkill -f "/usr/share/rustdesk/rustdesk --server" 2>/dev/null || true
sleep 2
systemctl start rustdesk-headless.service
sleep 3
if systemctl is-active rustdesk-headless.service >/dev/null 2>&1; then
log " systemd unit ACTIVE"
else
log " WARNING: systemd failed, using nohup fallback"
nohup /usr/share/rustdesk/rustdesk --server >/tmp/rustdesk-server.log 2>&1 &
fi fi
# Summary # Summary
@@ -324,71 +384,24 @@ echo ""
printf " %-14s %s\n" "ID:" "$RUSTDESK_ID" printf " %-14s %s\n" "ID:" "$RUSTDESK_ID"
printf " %-14s %s\n" "Password:" "$RUSTDESK_PASS" printf " %-14s %s\n" "Password:" "$RUSTDESK_PASS"
printf " %-14s %s\n" "Display:" ":0 (DUMMY0 primary 1920x1080)" printf " %-14s %s\n" "Display:" ":0 (DUMMY0 primary 1920x1080)"
printf " %-14s %s\n" "Sleep/Lock:" "disabled (systemd masked)" printf " %-14s %s\n" "Wayland:" "disabled (Xorg forced)"
printf " %-14s %s\n" "Sleep/Lock:" "disabled"
printf " %-14s %s\n" "Version:" "$RUSTDESK_VERSION" printf " %-14s %s\n" "Version:" "$RUSTDESK_VERSION"
printf " %-14s %s\n" "Arch:" "$ARCH" printf " %-14s %s\n" "Arch:" "$ARCH"
echo "" echo ""
echo " Connect: rustdesk $RUSTDESK_ID" echo " Connect: rustdesk $RUSTDESK_ID"
echo " Status: systemctl status display-manager" echo " Status: systemctl status rustdesk-headless"
echo " Logs: /tmp/rdtop-install.log" echo " Logs: /tmp/rdtop-install.log"
echo " RustDesk: /tmp/rustdesk-server.log" echo " RustDesk: /tmp/rustdesk-server.log"
echo " Xorg: /tmp/xorg-dummy.log" echo " Xorg: /tmp/xorg-dummy.log"
echo "" echo ""
echo "============================================" echo "============================================"
log "Installation complete. ID: $RUSTDESK_ID" log "Done. ID: $RUSTDESK_ID"
# Post-install: show monitor status # Show monitor status
if command -v xrandr >/dev/null 2>&1; then if command -v xrandr >/dev/null 2>&1; then
echo "" echo ""
echo "--- Current monitor status ---" echo "--- Monitor status ---"
xrandr --listmonitors 2>/dev/null || echo "xrandr not available" xrandr --listmonitors 2>/dev/null || echo "xrandr unavailable"
fi
# --- 8. Install systemd unit for RustDesk (survives sleep/lock) ---
log "[8/8] Installing systemd unit..."
# Write unit inline
cat > /etc/systemd/system/rustdesk-headless.service <<'UNIT'
[Unit]
Description=RustDesk Headless Server (auto-display, sleep-safe)
After=display-manager.service graphical.target network.target
Wants=display-manager.service
[Service]
Type=simple
User=root
Environment="DISPLAY=:0"
Environment="XAUTHORITY=/root/.Xauthority"
Environment="LIBVA_DRIVER_NAME=none"
Environment="VDPAU_DRIVER=none"
Environment="LIBGL_ALWAYS_SOFTWARE=1"
Environment="LIBGL_ALWAYS_INDIRECT=1"
ExecStartPre=/bin/bash -c 'for i in 1 2 3 4 5 6 7 8 9 10; do if xrandr >/dev/null 2>&1; then if xrandr | grep -q "^DUMMY0"; then xrandr --output DUMMY0 --mode "1920x1080" --primary 2>/dev/null || true; exit 0; fi; fi; sleep 1; done'
ExecStart=/usr/share/rustdesk/rustdesk --server
Restart=always
RestartSec=10
StartLimitInterval=60
StartLimitBurst=3
[Install]
WantedBy=multi-user.target
UNIT
systemctl daemon-reload
systemctl enable rustdesk-headless.service
# Stop the nohup process and start via systemd
pkill -f "/usr/share/rustdesk/rustdesk --server" 2>/dev/null || true
sleep 2
systemctl start rustdesk-headless.service
sleep 3
if systemctl is-active rustdesk-headless.service >/dev/null 2>&1; then
log " systemd unit: rustdesk-headless.service ACTIVE"
else
log " WARNING: rustdesk-headless.service not active, using nohup fallback"
nohup /usr/share/rustdesk/rustdesk --server >/tmp/rustdesk-server.log 2>&1 &
fi fi