#!/bin/bash usage() { if [ "$*" ]; then echo "$*" echo fi echo "Usage: ${NAME} [--listen PORT] [--vnc VNC_HOST:PORT] [--cert CERT]" echo echo "Starts the WebSockets proxy and a mini-webserver and " echo "provides a cut-and-paste URL to go to." echo echo " --listen PORT Port for proxy/webserver to listen on" echo " Default: 6080" echo " --vnc VNC_HOST:PORT VNC server host:port proxy target" echo " Default: localhost:5900" echo " --cert CERT Path to combined cert/key file" echo " Default: self.pem" exit 2 } NAME="$(basename $0)" HERE="$(cd "$(dirname "$0")" && pwd)" PORT="6080" VNC_DEST="localhost:5900" CERT="" proxy_pid="" die() { echo "$*" exit 1 } cleanup() { trap - TERM QUIT INT EXIT trap "true" CHLD # Ignore cleanup messages echo if [ -n "${proxy_pid}" ]; then echo "Terminating WebSockets proxy (${proxy_pid})" kill ${proxy_pid} fi } # Process Arguments # Arguments that only apply to chrooter itself while [ "$*" ]; do param=$1; shift; OPTARG=$1 case $param in --listen) PORT="${OPTARG}"; shift ;; --vnc) VNC_DEST="${OPTARG}"; shift ;; --cert) CERT="${OPTARG}"; shift ;; -h|--help) usage ;; -*) usage "Unknown chrooter option: ${param}" ;; *) break ;; esac done # Sanity checks which netstat >/dev/null 2>&1 \ || die "Must have netstat installed" netstat -ltn | grep -qs "${PORT}.*LISTEN" \ && die "Port ${PORT} in use. Try --listen PORT" trap "cleanup" TERM QUIT INT EXIT # Find vnc.html if [ -e "$(pwd)/vnc.html" ]; then WEB=$(pwd) elif [ -e "${HERE}/../vnc.html" ]; then WEB=${HERE}/../ elif [ -e "${HERE}/vnc.html" ]; then WEB=${HERE} else die "Could not find vnc.html" fi # Find self.pem if [ -n "${CERT}" ]; then if [ ! -e "${CERT}" ]; then die "Could not find ${CERT}" fi elif [ -e "$(pwd)/self.pem" ]; then CERT="$(pwd)/self.pem" elif [ -e "${HERE}/../self.pem" ]; then CERT="${HERE}/../self.pem" elif [ -e "${HERE}/self.pem" ]; then CERT="${HERE}/self.pem" else echo "Warning: could not find self.pem" fi echo "Starting webserver and WebSockets proxy on port ${PORT}" ${HERE}/wsproxy.py --web ${WEB} ${CERT:+--cert ${CERT}} ${PORT} ${VNC_DEST} & proxy_pid="$!" sleep 1 if ! ps -p ${proxy_pid} >/dev/null; then proxy_pid= echo "Failed to start WebSockets proxy" exit 1 fi echo -e "\n\nNavigate to to this URL:\n" echo -e " http://$(hostname):${PORT}/vnc.html?host=$(hostname)&port=${PORT}\n" echo -e "Press Ctrl-C to exit\n\n" wait ${proxy_pid}