2024-09-09 11:50:17 -04:00

210 lines
5.4 KiB
Bash
Executable File

#!/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