mirror of
https://github.com/linuxserver/docker-baseimage-kasmvnc.git
synced 2026-01-09 07:10:59 +08:00
210 lines
5.4 KiB
Bash
Executable File
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
|