#!/bin/bash set -e display=:10 interface=0.0.0.0 cert_group=ssl-cert xstartup_script=~/.vnc/xstartup de_was_selected_file="$HOME/.vnc/.kasmvncserver-easy-start-de-was-selected" action=start manual_xstartup_choice="Manually edit xstartup" declare -A all_desktop_environments=( [Cinnamon]=cinnamon-session [Mate]="XDG_CURRENT_DESKTOP=MATE dbus-launch --exit-with-session mate-session" [LXDE]=lxsession [Lxqt]=startlxqt [KDE]=startkde [Gnome]="XDG_CURRENT_DESKTOP=GNOME dbus-launch --exit-with-session /usr/bin/gnome-session" [XFCE]=xfce4-session) readarray -t sorted_desktop_environments < <(for de in "${!all_desktop_environments[@]}"; do echo "$de"; done | sort) all_desktop_environments[$manual_xstartup_choice]="" sorted_desktop_environments+=("$manual_xstartup_choice") detected_desktop_environments=() declare -A numbered_desktop_environments debug() { if [ -z "$debug" ]; then return; fi echo "$@" } print_detected_desktop_environments() { declare -i i=1 echo "Please choose Desktop Environment to run:" for detected_de in "${detected_desktop_environments[@]}"; do echo "[$i] $detected_de" numbered_desktop_environments[$i]=$detected_de i+=1 done } detect_desktop_environments() { for de_name in "${sorted_desktop_environments[@]}"; do if [[ "$de_name" = "$manual_xstartup_choice" ]]; then detected_desktop_environments+=("$de_name") continue; fi local executable=${all_desktop_environments[$de_name]} executable=($executable) executable=${executable[-1]} if detect_desktop_environment "$de_name" "$executable"; then detected_desktop_environments+=("$de_name") fi done } ask_user_to_choose_de() { while : ; do print_detected_desktop_environments read -r de_number_to_run de_name_from_number "$de_number_to_run" if [[ -n "$de_name" ]]; then break; fi echo "Incorrect number: $de_number_to_run" echo done } remember_de_choice() { touch "$de_was_selected_file" } de_was_selected() { [[ -f "$de_was_selected_file" ]] } detect_desktop_environment() { local de_name="$1" local executable="$2" if command -v "$executable" &>/dev/null; then return 0 fi return 1 } did_user_forbid_replacing_xstartup() { grep -q -v KasmVNC-safe-to-replace-this-file "$xstartup_script" } de_cmd_from_name() { de_cmd=${all_desktop_environments[$de_name]} } de_name_from_number() { local de_number_to_run="$1" de_name=${numbered_desktop_environments[$de_number_to_run]} } setup_de_to_run_via_xstartup() { generate_xstartup "$de_name" } generate_xstartup() { local de_name="$1" de_cmd_from_name cat <<-SCRIPT > "$xstartup_script" #!/bin/sh exec $de_cmd SCRIPT chmod +x "$xstartup_script" } enable_debug() { debug=1 log_option="-log *:stderr:100" } kill_vnc_server() { vncserver -kill $display } process_cli_options() { for option in "$@"; do case "$option" in --help) show_help exit ;; -d) enable_debug ;; -kill) kill_vnc_server exit ;; -select-de) action=select-de-and-start ;; *) echo >&2 "Unsupported argument: $option" exit 1 esac done } user_asked_to_select_de() { [[ "$action" = "select-de-and-start" ]] } show_help() { cat >&2 <<-USAGE Usage: `basename $0` [options] -d Debug output -kill Kill vncserver -select-de Select desktop environent to run --help show this help USAGE } process_cli_options "$@" if groups | grep -qvw ssl-cert; then cat <<-EOF Can't access TLS certificate. Please add your user to $cert_group via 'addgroup ssl-cert' EOF exit 1 fi if user_asked_to_select_de || ! de_was_selected; then detect_desktop_environments ask_user_to_choose_de debug "You selected $de_name desktop environment" if [[ "$de_name" != "$manual_xstartup_choice" ]]; then setup_de_to_run_via_xstartup fi remember_de_choice fi vncserver $display -interface $interface vncserver -kill $display vncserver $display -depth 24 -geometry 1280x1050 -websocketPort 8443 \ -cert /etc/ssl/certs/ssl-cert-snakeoil.pem \ -key /etc/ssl/private/ssl-cert-snakeoil.key -sslOnly -FrameRate=24 \ -interface $interface -httpd /usr/share/kasmvnc/www $log_option