#!/usr/bin/env bash # Desktop Environment Installation Script # Installs minimal desktop environment with essential applications set -euo pipefail # Load environment variables source /tmp/env-desktop log() { echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1" } error() { echo "[$(date +'%Y-%m-%d %H:%M:%S')] ERROR: $1" >&2 exit 1 } # Detect OS detect_os() { if [[ -f /etc/os-release ]]; then . /etc/os-release OS=$ID VERSION=$VERSION_ID else error "Cannot detect OS" fi log "Detected OS: $OS $VERSION" } # Update system packages update_system() { log "Updating system packages..." case $OS in ubuntu|debian) apt-get update -y apt-get upgrade -y ;; centos|rhel|fedora) if command -v dnf >/dev/null 2>&1; then dnf update -y else yum update -y fi ;; *) error "Unsupported OS: $OS" ;; esac } # Install desktop environment install_desktop_environment() { log "Installing $DESKTOP_TYPE desktop environment..." case $OS in ubuntu|debian) case $DESKTOP_TYPE in xfce) apt-get install -y xfce4 xfce4-goodies if [[ "$DISPLAY_MANAGER" == "lightdm" ]]; then apt-get install -y lightdm lightdm-gtk-greeter fi ;; gnome) apt-get install -y ubuntu-desktop-minimal ;; kde) apt-get install -y kde-plasma-desktop ;; lxde) apt-get install -y lxde ;; mate) apt-get install -y ubuntu-mate-desktop ;; esac ;; centos|rhel|fedora) case $DESKTOP_TYPE in xfce) if command -v dnf >/dev/null 2>&1; then dnf groupinstall -y "Xfce Desktop" else yum groupinstall -y "Xfce Desktop" fi ;; gnome) if command -v dnf >/dev/null 2>&1; then dnf groupinstall -y "GNOME Desktop Environment" else yum groupinstall -y "GNOME Desktop Environment" fi ;; esac ;; esac } # Install VNC server install_vnc_server() { if [[ "$VNC_ENABLED" == "true" ]]; then log "Installing VNC server..." case $OS in ubuntu|debian) apt-get install -y tightvncserver ;; centos|rhel|fedora) if command -v dnf >/dev/null 2>&1; then dnf install -y tigervnc-server else yum install -y tigervnc-server fi ;; esac # Configure VNC for desktop user setup_vnc_user fi } # Setup VNC for desktop user setup_vnc_user() { log "Setting up VNC for user $DESKTOP_USER..." # Create user if not exists if ! id "$DESKTOP_USER" &>/dev/null; then useradd -m -s /bin/bash "$DESKTOP_USER" log "Created user $DESKTOP_USER" fi # Setup VNC directory sudo -u "$DESKTOP_USER" mkdir -p "$DESKTOP_HOME/.vnc" # Create VNC startup script cat > "$DESKTOP_HOME/.vnc/xstartup" << EOF #!/bin/bash xrdb \$HOME/.Xresources startxfce4 & EOF chmod +x "$DESKTOP_HOME/.vnc/xstartup" chown "$DESKTOP_USER:$DESKTOP_USER" "$DESKTOP_HOME/.vnc/xstartup" # Set VNC password if provided if [[ -n "${VNC_PASSWORD:-}" ]]; then echo "$VNC_PASSWORD" | sudo -u "$DESKTOP_USER" vncpasswd -f > "$DESKTOP_HOME/.vnc/passwd" chmod 600 "$DESKTOP_HOME/.vnc/passwd" chown "$DESKTOP_USER:$DESKTOP_USER" "$DESKTOP_HOME/.vnc/passwd" fi # Create VNC service create_vnc_service } # Create VNC systemd service create_vnc_service() { log "Creating VNC systemd service..." cat > "/etc/systemd/system/vncserver@.service" << EOF [Unit] Description=Start TightVNC server at startup After=syslog.target network.target [Service] Type=forking User=$DESKTOP_USER Group=$DESKTOP_USER WorkingDirectory=$DESKTOP_HOME PIDFile=$DESKTOP_HOME/.vnc/%H:%i.pid ExecStartPre=-/usr/bin/vncserver -kill :%i > /dev/null 2>&1 ExecStart=/usr/bin/vncserver -depth $VNC_DEPTH -geometry $VNC_GEOMETRY :%i ExecStop=/usr/bin/vncserver -kill :%i [Install] WantedBy=multi-user.target EOF systemctl daemon-reload systemctl enable "vncserver@1.service" log "VNC service created and enabled" } # Install applications install_applications() { log "Installing applications..." case $OS in ubuntu|debian) # Install packages local packages="" # Editors for editor in $EDITORS; do case $editor in zed) # Install Zed editor install_zed_editor ;; *) packages="$packages $editor" ;; esac done # Add other application categories packages="$packages $BROWSERS $TERMINALS $DEVELOPMENT $MEDIA $OFFICE $UTILITIES" if [[ -n "$packages" ]]; then apt-get install -y $packages fi ;; centos|rhel|fedora) local packages="$BROWSERS $TERMINALS $DEVELOPMENT $MEDIA $OFFICE $UTILITIES" # Install Zed if in editors list if echo "$EDITORS" | grep -q "zed"; then install_zed_editor fi # Remove zed from package list and add other editors local filtered_editors=$(echo "$EDITORS" | sed 's/zed//g') packages="$packages $filtered_editors" if command -v dnf >/dev/null 2>&1; then dnf install -y $packages else yum install -y $packages fi ;; esac } # Install Zed editor install_zed_editor() { log "Installing Zed editor..." # Download and install Zed case $(uname -m) in x86_64) curl -f https://zed.dev/install.sh | sh ;; *) log "Zed editor not available for $(uname -m) architecture, skipping..." ;; esac } # Configure graphics configure_graphics() { log "Configuring graphics driver: $GRAPHICS_DRIVER" case $OS in ubuntu|debian) case $GRAPHICS_DRIVER in nvidia) apt-get install -y nvidia-driver-470 ;; amd) apt-get install -y mesa-vulkan-drivers xserver-xorg-video-amdgpu ;; intel) apt-get install -y mesa-vulkan-drivers xserver-xorg-video-intel ;; nouveau) apt-get install -y xserver-xorg-video-nouveau ;; esac ;; esac } # Setup auto-login if enabled setup_auto_login() { if [[ "$AUTO_LOGIN" == "true" ]]; then log "Setting up auto-login for $DESKTOP_USER..." case $DISPLAY_MANAGER in lightdm) sed -i "s/#autologin-user=/autologin-user=$DESKTOP_USER/" /etc/lightdm/lightdm.conf sed -i "s/#autologin-user-timeout=0/autologin-user-timeout=0/" /etc/lightdm/lightdm.conf ;; gdm) cat > "/etc/gdm3/custom.conf" << EOF [daemon] AutomaticLoginEnable=true AutomaticLogin=$DESKTOP_USER EOF ;; esac fi } # Run remote access setup scripts setup_remote_access() { log "Setting up remote access services..." # Run SSH setup if enabled if [[ "${SSH_ENABLED:-true}" == "true" ]]; then log "Running SSH setup..." bash /tmp/ssh-setup.sh fi # Run RustDesk setup if enabled if [[ "${RUSTDESK_ENABLED:-true}" == "true" ]]; then log "Running RustDesk setup..." bash /tmp/rustdesk-setup.sh fi # Run Zed setup log "Running Zed editor setup..." bash /tmp/zed-setup.sh } # Display connection summary display_connection_summary() { log "" log "=== Desktop Environment Setup Complete ===" log "" log "Remote Access Options:" if [[ "${VNC_ENABLED:-true}" == "true" ]]; then log " VNC Server: Port $VNC_PORT" log " Start with: systemctl start vncserver@1.service" fi if [[ "${RUSTDESK_ENABLED:-true}" == "true" ]]; then log " RustDesk: Ports $RUSTDESK_PORT (main), $RUSTDESK_HBBR_PORT (hbbr)" log " Get ID: sudo -u $DESKTOP_USER rustdesk --get-id" fi if [[ "${SSH_ENABLED:-true}" == "true" ]]; then log " SSH Server: Port $SSH_PORT" log " Connect: ssh $DESKTOP_USER@ -p $SSH_PORT" fi log "" log "Desktop Environment: $DESKTOP_TYPE" log "Desktop User: $DESKTOP_USER" log "Applications installed: Zed editor and standard desktop apps" } # Main installation function main() { log "Starting desktop environment installation..." detect_os update_system install_desktop_environment install_vnc_server install_applications configure_graphics setup_auto_login setup_remote_access display_connection_summary log "Desktop environment installation completed successfully!" } # Run main function main "$@"