launch.sh 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. #!/usr/bin/env bash
  2. usage() {
  3. if [ "$*" ]; then
  4. echo "$*"
  5. echo
  6. fi
  7. echo "Usage: ${NAME} [--listen PORT] [--vnc VNC_HOST:PORT] [--cert CERT]"
  8. echo
  9. echo "Starts the WebSockets proxy and a mini-webserver and "
  10. echo "provides a cut-and-paste URL to go to."
  11. echo
  12. echo " --listen PORT Port for proxy/webserver to listen on"
  13. echo " Default: 6080"
  14. echo " --vnc VNC_HOST:PORT VNC server host:port proxy target"
  15. echo " Default: localhost:5900"
  16. echo " --cert CERT Path to combined cert/key file"
  17. echo " Default: self.pem"
  18. exit 2
  19. }
  20. NAME="$(basename $0)"
  21. HERE="$(cd "$(dirname "$0")" && pwd)"
  22. PORT="6080"
  23. VNC_DEST="localhost:5900"
  24. CERT=""
  25. proxy_pid=""
  26. die() {
  27. echo "$*"
  28. exit 1
  29. }
  30. cleanup() {
  31. trap - TERM QUIT INT EXIT
  32. trap "true" CHLD # Ignore cleanup messages
  33. echo
  34. if [ -n "${proxy_pid}" ]; then
  35. echo "Terminating WebSockets proxy (${proxy_pid})"
  36. kill ${proxy_pid}
  37. fi
  38. }
  39. # Process Arguments
  40. # Arguments that only apply to chrooter itself
  41. while [ "$*" ]; do
  42. param=$1; shift; OPTARG=$1
  43. case $param in
  44. --listen) PORT="${OPTARG}"; shift ;;
  45. --vnc) VNC_DEST="${OPTARG}"; shift ;;
  46. --cert) CERT="${OPTARG}"; shift ;;
  47. -h|--help) usage ;;
  48. -*) usage "Unknown chrooter option: ${param}" ;;
  49. *) break ;;
  50. esac
  51. done
  52. # Sanity checks
  53. which netstat >/dev/null 2>&1 \
  54. || die "Must have netstat installed"
  55. netstat -ltn | grep -qs "${PORT} .*LISTEN" \
  56. && die "Port ${PORT} in use. Try --listen PORT"
  57. trap "cleanup" TERM QUIT INT EXIT
  58. # Find vnc.html
  59. if [ -e "$(pwd)/vnc.html" ]; then
  60. WEB=$(pwd)
  61. elif [ -e "${HERE}/../vnc.html" ]; then
  62. WEB=${HERE}/../
  63. elif [ -e "${HERE}/vnc.html" ]; then
  64. WEB=${HERE}
  65. else
  66. die "Could not find vnc.html"
  67. fi
  68. # Find self.pem
  69. if [ -n "${CERT}" ]; then
  70. if [ ! -e "${CERT}" ]; then
  71. die "Could not find ${CERT}"
  72. fi
  73. elif [ -e "$(pwd)/self.pem" ]; then
  74. CERT="$(pwd)/self.pem"
  75. elif [ -e "${HERE}/../self.pem" ]; then
  76. CERT="${HERE}/../self.pem"
  77. elif [ -e "${HERE}/self.pem" ]; then
  78. CERT="${HERE}/self.pem"
  79. else
  80. echo "Warning: could not find self.pem"
  81. fi
  82. echo "Starting webserver and WebSockets proxy on port ${PORT}"
  83. ${HERE}/wsproxy.py --web ${WEB} ${CERT:+--cert ${CERT}} ${PORT} ${VNC_DEST} &
  84. proxy_pid="$!"
  85. sleep 1
  86. if ! ps -p ${proxy_pid} >/dev/null; then
  87. proxy_pid=
  88. echo "Failed to start WebSockets proxy"
  89. exit 1
  90. fi
  91. echo -e "\n\nNavigate to this URL:\n"
  92. echo -e " http://$(hostname):${PORT}/vnc.html?host=$(hostname)&port=${PORT}\n"
  93. echo -e "Press Ctrl-C to exit\n\n"
  94. wait ${proxy_pid}