diff --git a/kasmvnc/README.md b/kasmvnc/README.md index b90e1b2..676d4cc 100644 --- a/kasmvnc/README.md +++ b/kasmvnc/README.md @@ -9,7 +9,7 @@ tags: [helper, vnc, desktop] # KasmVNC -Automatically install [KasmVNC](https://kasmweb.com/kasmvnc) in a workspace, and create an app to access it via the dashboard. Add latest version of KasmVNC with [`xfce`](https://xfce.org/) desktop environment. +Automatically install [KasmVNC](https://kasmweb.com/kasmvnc) in a workspace, and create an app to access it via the dashboard. ```tf module "kasmvnc" { @@ -19,4 +19,4 @@ module "kasmvnc" { } ``` -> **Note:** This module only works on debian-based workspaces. It is recommended to use an image with a desktop environment pre-installed to speed up the installation process. +> **Note:** This module only works on workspaces with a pre-installed desktop environment. diff --git a/kasmvnc/main.tf b/kasmvnc/main.tf index 6634b89..4b36eb2 100644 --- a/kasmvnc/main.tf +++ b/kasmvnc/main.tf @@ -26,10 +26,13 @@ variable "kasm_version" { default = "1.3.1" } -variable "wait_for_script" { +variable "desktop_environment" { type = string - description = "The script to wait for before running the KasmVNC script." - default = "" + description = "Specifies the desktop environment of the workspace. This should be pre-installed on the workspace." + validation { + condition = contains(["xfce", "kde", "gnome", "lxde", "lxqt", "xfce"], var.desktop_environment) + error_message = "Invalid desktop environment. Please specify a valid desktop environment." + } } resource "coder_script" "kasm_vnc" { @@ -38,7 +41,7 @@ resource "coder_script" "kasm_vnc" { icon = "/icon/kasmvnc.svg" script = templatefile("${path.module}/run.sh", { PORT : var.port, - WAIT_FOR_SCRIPT : var.wait_for_script, + DESKTOP_ENVIRONMENT : var.desktop_environment, VERSION : var.kasm_version }) run_on_start = true diff --git a/kasmvnc/run.sh b/kasmvnc/run.sh index 6cf3b02..cbde54d 100644 --- a/kasmvnc/run.sh +++ b/kasmvnc/run.sh @@ -1,38 +1,137 @@ #!/usr/bin/env bash -# check if there is a WAIT_FOR_SCRIPT env variable and if so, wait for it to be available - -# Wait for the startup script to complete -if [ -n "${WAIT_FOR_SCRIPT}" ]; then - # This assumes that the script will create a file called /tmp/.coder-${WAIT_FOR_SCRIPT}.done - while [ ! -f /tmp/.coder-${WAIT_FOR_SCRIPT}.done ]; do - sleep 1 - done -fi +#!/bin/bash + +# Function to check if vncserver is already installed +check_installed() { + if command -v vncserver &> /dev/null; then + echo "vncserver is already installed." + return 0 # Don't exit, just indicate it's installed + else + return 1 # Indicates not installed + fi +} + +# Function to install kasmvncserver for debian-based distros +install_deb() { + local url=$1 + wget $url -O /tmp/kasmvncserver.deb + sudo apt-get install ./kasmvncserver_*.deb -y + sudo adduser $USER ssl-cert + rm /tmp/kasmvncserver.deb +} + +# Function to install kasmvncserver for Oracle 8 +install_rpm_oracle8() { + local url=$1 + wget $url -O /tmp/kasmvncserver.rpm + sudo dnf config-manager --set-enabled ol8_codeready_builder + sudo dnf install oracle-epel-release-el8 -y + sudo dnf localinstall ./kasmvncserver_*.rpm -y + sudo usermod -a -G kasmvnc-cert $USER + rm /tmp/kasmvncserver.rpm +} + +# Function to install kasmvncserver for CentOS 7 +install_rpm_centos7() { + local url=$1 + wget $url -O /tmp/kasmvncserver.rpm + sudo yum install epel-release -y + sudo yum install ./kasmvncserver_*.rpm -y + sudo usermod -a -G kasmvnc-cert $USER + rm /tmp/kasmvncserver.rpm +} -PACKAGES="xfce4 xfce4-goodies libdatetime-perl" -# Check if desktop environment is installed -if ! dpkg -s $PACKAGES &> /dev/null; then - sudo apt-get update - DEBIAN_FRONTEND=noninteractive sudo apt-get install -y $PACKAGES --no-install-recommends --no-install-suggests +# Function to install kasmvncserver for rpm-based distros +install_rpm() { + local url=$1 + wget $url -O /tmp/kasmvncserver.rpm + sudo rpm -i /tmp/kasmvncserver.rpm + rm /tmp/kasmvncserver.rpm +} + +# Function to install kasmvncserver for Alpine Linux +install_alpine() { + local url=$1 + wget $url -O /tmp/kasmvncserver.tgz + tar -xzf /tmp/kasmvncserver.tgz -C /usr/local/bin/ + rm /tmp/kasmvncserver.tgz +} + +# Detect system information +distro=$(grep "^ID=" /etc/os-release | awk -F= '{print $2}') +version=$(grep "^VERSION_ID=" /etc/os-release | awk -F= '{print $2}' | tr -d '"') +arch=$(uname -m) + +echo "Detected Distribution: $distro" +echo "Detected Version: $version" +echo "Detected Architecture: $arch" + +# Map arch to package arch +if [[ "$arch" == "x86_64" ]]; then + arch="x86_64" +elif [[ "$arch" == "aarch64" || "$arch" == "arm64" ]]; then + arch="aarch64" else - echo "$PACKAGES are already installed." + echo "Unsupported architecture: $arch" + exit 1 fi -# Check if vncserver is installed -if ! dpkg -s kasmvncserver &> /dev/null; then - DISTRO=$(lsb_release -c -s) - ARCH=$(dpkg --print-architecture) - wget -q https://github.com/kasmtech/KasmVNC/releases/download/v${VERSION}/kasmvncserver_$${DISTRO}_${VERSION}_$${ARCH}.deb -O /tmp/kasmvncserver.deb - sudo apt-get install -y /tmp/kasmvncserver.deb - printf "🥳 KasmVNC v${VERSION} has been successfully installed!\n\n" - sudo rm -f /tmp/kasmvncserver.deb +# Check if vncserver is installed, and install if not +if ! check_installed; then + case $distro in + ubuntu | debian | kali) + case $version in + "18.04") + install_deb "https://github.com/kasmtech/KasmVNC/releases/download/v${VERSION}/kasmvncserver_bionic_${VERSION}_$${arch}.deb" + ;; + "20.04") + install_deb "https://github.com/kasmtech/KasmVNC/releases/download/v${VERSION}/kasmvncserver_focal_${VERSION}_$${arch}.deb" + ;; + "22.04") + install_deb "https://github.com/kasmtech/KasmVNC/releases/download/v${VERSION}/kasmvncserver_jammy_${VERSION}_$${arch}.deb" + ;; + *) + echo "Unsupported Ubuntu/Debian/Kali version: $${version}" + exit 1 + ;; + esac + ;; + oracle) + if [[ "$version" == "8" ]]; then + install_rpm_oracle8 "https://github.com/kasmtech/KasmVNC/releases/download/v${VERSION}/kasmvncserver_oracle_8_${VERSION}_$${arch}.rpm" + else + echo "Unsupported Oracle version: $${version}" + exit 1 + fi + ;; + centos) + if [[ "$version" == "7" ]]; then + install_rpm_centos7 "https://github.com/kasmtech/KasmVNC/releases/download/v${VERSION}/kasmvncserver_centos_core_${VERSION}_$${arch}.rpm" + else + install_rpm "https://github.com/kasmtech/KasmVNC/releases/download/v${VERSION}/kasmvncserver_centos_core_${VERSION}_$${arch}.rpm" + fi + ;; + alpine) + if [[ "$version" == "3.17" || "$version" == "3.18" || "$version" == "3.19" ]]; then + install_alpine "https://github.com/kasmtech/KasmVNC/releases/download/v${VERSION}/kasmvnc.alpine_$${version}_$${arch}.tgz" + else + echo "Unsupported Alpine version: $${version}" + exit 1 + fi + ;; + fedora | opensuse) + install_rpm "https://github.com/kasmtech/KasmVNC/releases/download/v${VERSION}/kasmvncserver_$${distro}_$${version}_${VERSION}_$${arch}.rpm" + ;; + *) + echo "Unsupported distribution: $${distro}" + exit 1 + ;; + esac else - echo "KasmVNC is already installed." + echo "vncserver already installed. Skipping installation." fi -sudo addgroup $USER ssl-cert - # Coder port-forwarding from dashboard only supports HTTP sudo bash -c "cat > /etc/kasmvnc/kasmvnc.yaml < /tmp/kassmvncserver.log 2>&1 & +sudo -u $USER bash -c "vncserver -select-de ${DESKTOP_ENVIRONMENT} -disableBasicAuth" > /tmp/kasmvncserver.log 2>&1 &