r0c/webtty/webr0c.sh

109 lines
3.3 KiB
Bash
Executable File

#!/bin/bash
set -e
# fixed set of arguments to always give ttyd;
# * write-enable (needed by v1.7.4+)
# * don't reconnect if the user quits
# * disable some more stuff
# * the bifrost color scheme :^)
ttyd_fargs=(
-W
-t disableReconnect=true
-t enableSixel=false
-t enableTrzsz=false
-t enableZmodem=false
-t 'theme={"background":"#222","black":"#404040","red":"#f03669","green":"#b8e346","yellow":"#ffa402","blue":"#02a2ff","magenta":"#f65be3","cyan":"#3da698","white":"#d2d2d2","brightBlack":"#606060","brightRed":"#c75b79","brightGreen":"#c8e37e","brightYellow":"#ffbe4a","brightBlue":"#71cbff","brightMagenta":"#b67fe3","brightCyan":"#9cf0ed","brightWhite":"#fff"}'
)
# then the additional arguments to give ttyd by default;
# * listen on port 8023, http://127.0.0.1:8023/
# * listen on all interfaces (needed by v1.7.4+)
# * window title = r0c
# * dom works on phones (canvas/webgl is jank)
ttyd_args=(
-p 8023
-i 0.0.0.0
-t titleFixed=r0c
-t rendererType=dom
-t disableResizeOverlay=true
)
# then the arguments to give r0c if nothing is given to the script;
# --ara is recommended because otherwise everyone will be admin
r0c_args=(
--ara
)
# now, if this script is executed with any arguments at all, then the
# default r0c_args will be cleared and replaced with those, however
# you can also specify ttyd_args by separating them with "--";
# that way ttyd gets everything before that and r0c gets the rest:
# ./webr0c.sh -p 8023 -- --ara -tpt 2424 -tpn 1515
if [ "$1" ]; then
r0c_args=()
while [ "$1" ]; do
[ "$1" = -- ] && {
ttyd_args=("${r0c_args[@]}")
r0c_args=()
shift
continue
}
r0c_args+=("$1")
shift
done
fi
ttyd_args+=("${ttyd_fargs[@]}") # append the fixed set of args
echo
echo " >>> will run ttyd with: ${ttyd_args[*]}"
echo
echo " >>> will run r0c with: ${r0c_args[*]}"
echo
########################################################################
# ensure we cleanup on exit
pids=()
trap 'kill ${pids[@]} 2>/dev/null;sleep 0.1' INT TERM EXIT
# first check if ttyd is installed system-wide,
# otherwise try ./ttyd.x86_64, and if that also fails
# just assume exactly one other binary is present
ttyd=$(command -v ttyd || echo ./ttyd.x86_64)
[ -e $ttyd ] || ttyd=./ttyd.*
if echo q | telnet -E -c; then
# telnet seems to be working;
# connect to port 23 if root, 2323 otherwise
[ $(id -u) -eq 0 ] && p=23 || p=2323
$ttyd "${ttyd_args[@]}" telnet -E -c 127.0.0.1 $p &
else
echo "telnet not found; okay, using bash instead"
# connect to port 531 if root, 1531 otherwise
[ $(id -u) -eq 0 ] && p=531 || p=1531
$ttyd "${ttyd_args[@]}" ./bashclient.sh 127.0.0.1 $p &
fi
pids+=($!)
# now it's time to start r0c,
# first check if installed system-wide,
# then try ./r0c.py, and panic if that also fails
if python3 -c 'import r0c' 2>/dev/null; then
python3 -m r0c "${r0c_args[@]}" &
else
python3 r0c.py "${r0c_args[@]}" &
fi
pids+=($!)
# figure out what port ttyd is listening on and print a helpful message
PORT=$(printf ' %s\n' "${ttyd_args[*]}" | sed -r 's/.* -p *([0-9]+).*/\1/; s/.*[^0-9].*//; s/^$/7681/')
printf '\n\033[32m >>> r0c available at http://127.0.0.1:%s/\n\033[0m (and telnet and netcat too)\n' $PORT
# if either r0c or ttyd exits, kill the other
wait -n
kill ${pids[@]}