#!/usr/bin/env bash set -e # Purge temp files on init and exit function clean () { rm -rf /tmp/{,.[!.],..?}* || : } trap clean SIGINT SIGTERM clean # Lang if [ ! -z ${LC_ALL+x} ]; then export LANGUAGE="${LC_ALL%.UTF-8}" export LANG="${LC_ALL}" fi # Environment export HOME=/home/kasm-user export KASM_VNC_PATH=/usr/share/kasmvnc export PULSE_RUNTIME_PATH=/var/run/pulse if [ -z ${DRINODE+x} ]; then DRINODE="/dev/dri/renderD128" fi KASMNVC_HW3D='' if [ ! -z ${HW3D+x} ]; then KASMVNC_HW3D="-hw3d" fi # Go URL translation if [ ! -z ${KASM_URL+x} ]; then export BRAVE_CLI=$KASM_URL export CHROME_CLI=$KASM_URL export EDGE_CLI=$KASM_URL export FIREFOX_CLI=$KASM_URL export OPERA_CLI=$KASM_URL export TOR_CLI=$KASM_URL export VIVALDI_CLI=$KASM_URL fi # Notification daemon export $(dbus-launch) dunst & ## Directory setup for home folder ## # Create folders for upload/download mkdir -p $HOME/Desktop $HOME/Downloads for FOLDER in Uploads Downloads; do if [[ ! -L $HOME/Desktop/$FOLDER ]]; then mkdir -p $HOME/$FOLDER ln -sf $HOME/$FOLDER $HOME/Desktop/$FOLDER fi done if [[ ! -L $KASM_VNC_PATH/www/Downloads/Downloads ]]; then ln -sf $HOME/Downloads $KASM_VNC_PATH/www/Downloads/Downloads fi rm -rf $HOME/.config/pulse # Openbox config files if [[ ! -f $HOME/.config/openbox/autostart ]]; then mkdir -p $HOME/.config/openbox cp /defaults/autostart $HOME/.config/openbox/autostart fi if [[ ! -f $HOME/.config/openbox/menu.xml ]]; then mkdir -p $HOME/.config/openbox cp /defaults/menu.xml $HOME/.config/openbox/menu.xml fi # Startup Script for DE mkdir -p $HOME/.vnc cp \ /defaults/startwm.sh \ $HOME/.vnc/xstartup touch $HOME/.vnc/.de-was-selected # Add proot-apps if [ ! -f "${HOME}/.local/bin/proot-apps" ]; then mkdir -p ${HOME}/.local/bin/ cp /proot-apps/* ${HOME}/.local/bin/ echo 'export PATH="$HOME/.local/bin:$PATH"' >> $HOME/.bashrc elif ! diff -q /proot-apps/pversion ${HOME}/.local/bin/pversion > /dev/null; then cp /proot-apps/* ${HOME}/.local/bin/ fi ## Network egress wait ## while :; do interfaces=$(ip link show type veth | awk -F: '/^[0-9]+: / {print $2}' | awk '{print $1}' | sed 's/@.*//') if [ -z "$interfaces" ]; then sleep 1 continue fi for interface in $interfaces; do if [[ $interface == eth* ]]; then break 2 fi if [[ $interface == k-p-* ]]; then egress_file="/dockerstartup/.egress_status" while [ ! -f "$egress_file" ]; do sleep 1 done egress_status=$(cat $egress_file) if [ "$egress_status" == "ready" ]; then if [ -z "$KASM_PROFILE_LDR" ]; then http_proxy="" https_proxy="" curl -k "https://${KASM_API_HOST}:${KASM_API_PORT}/api/set_kasm_session_status?token=${KASM_API_JWT}" -H 'Content-Type: application/json' -d '{"status": "running"}' fi break 2 fi if [ "$egress_status" == "error" ]; then echo "Failed to establish egress gateway. Exiting..." exit 1 fi fi done sleep 1 done ## KasmVNC init ## # Password if [[ -f $HOME/.kasmpasswd ]]; then rm -f $HOME/.kasmpasswd fi if [[ -z ${VNC_PW+x} ]]; then VNC_PW="vncpassword" fi if [[ -z ${VNC_VIEW_ONLY_PW+x} ]]; then VNC_VIEW_ONLY_PW="vncviewonlypassword" fi PASSWD_PATH="$HOME/.kasmpasswd" echo -e "${VNC_PW}\n${VNC_PW}\n" | kasmvncpasswd -u kasm_user -wo echo -e "${VNC_VIEW_ONLY_PW}\n${VNC_VIEW_ONLY_PW}\n" | kasmvncpasswd -u kasm_viewer -r chmod 600 $PASSWD_PATH # SSL cert rm -f ${HOME}/.vnc/self.pem openssl req -x509 \ -nodes \ -days 3650 \ -newkey rsa:2048 \ -keyout ${HOME}/.vnc/self.pem \ -out ${HOME}/.vnc/self.pem \ -subj "/C=US/ST=VA/L=None/O=None/OU=DoFu/CN=kasm/emailAddress=none@none.none" # Start KasmVNC vncserver $DISPLAY \ $KASMVNC_HW3D \ -drinode $DRINODE \ -websocketPort 6901 \ -httpd ${KASM_VNC_PATH}/www \ -FrameRate=60 \ -interface 0.0.0.0 \ -BlacklistThreshold=0 \ -FreeKeyMappings \ -PreferBandwidth \ -DynamicQualityMin=4 \ -DynamicQualityMax=7 \ -DLP_ClipDelay=0 \ -sslOnly \ -UnixRelay printer:/tmp/printer ## Microservice Init ## # Audio /kasmbins/kasm_websocket_relay/kasm_audio_out-linux \ kasmaudio \ 8081 \ 4901 \ ${HOME}/.vnc/self.pem \ ${HOME}/.vnc/self.pem \ "kasm_user:$VNC_PW" & HOME=/var/run/pulse pulseaudio --start HOME=/var/run/pulse no_proxy=127.0.0.1 ffmpeg \ -v verbose \ -f pulse \ -fragment_size ${PULSEAUDIO_FRAGMENT_SIZE:-2000} \ -ar 44100 \ -i default \ -f mpegts \ -correct_ts_overflow 0 \ -codec:a mp2 \ -b:a 128k \ -ac 1 \ -muxdelay 0.001 \ http://127.0.0.1:8081/kasmaudio > /dev/null 2>&1 & # Audio in /kasmbins/kasm_audio_input_server \ --ssl \ --auth-token "kasm_user:$VNC_PW" \ --cert ${HOME}/.vnc/self.pem \ --certkey ${HOME}/.vnc/self.pem & # Uploads /kasmbins/kasm_upload_server \ --ssl \ --auth-token "kasm_user:$VNC_PW" & # Gamepad if [[ ${KASM_SVC_GAMEPAD:-1} == 1 ]]; then /kasmbins/kasm_gamepad_server \ --ssl \ --auth-token "kasm_user:$VNC_PW" \ --cert ${HOME}/.vnc/self.pem \ --certkey ${HOME}/.vnc/self.pem & fi # Webcam if [[ -e /dev/video0 ]]; then /kasmbins/kasm_webcam_server \ --port 4905 \ --ssl \ --cert ${HOME}/.vnc/self.pem \ --certkey ${HOME}/.vnc/self.pem & fi # Printer /kasmbins/kasm_printer_service \ --directory $HOME/PDF \ --relay /tmp/printer & # Show KasmVNC Logs tail -f $HOME/.vnc/*$DISPLAY.log