#!/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
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
VNC_PW_HASH=$(python3 -c "import crypt; print(crypt.crypt('${VNC_PW}', '\$5\$kasm\$'));")
VNC_VIEW_PW_HASH=$(python3 -c "import crypt; print(crypt.crypt('${VNC_VIEW_ONLY_PW}', '\$5\$kasm\$'));")
echo "kasm_user:${VNC_PW_HASH}:ow" > $HOME/.kasmpasswd
echo "kasm_viewer:${VNC_VIEW_PW_HASH}:" >> $HOME/.kasmpasswd
chmod 600 $HOME/.kasmpasswd
# 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
