]> git.proxmox.com Git - mirror_novnc.git/blame - utils/launch.sh
Merge branches 'logs' and 'timeout' of https://github.com/jcpunk/noVNC
[mirror_novnc.git] / utils / launch.sh
CommitLineData
e9155818 1#!/usr/bin/env bash
b89c6db3 2
84586c0f 3# Copyright (C) 2018 The noVNC Authors
15e733f5
JM
4# Licensed under MPL 2.0 or any later version (see LICENSE.txt)
5
b89c6db3
JM
6usage() {
7 if [ "$*" ]; then
8 echo "$*"
9 echo
10 fi
c77d9fcc 11 echo "Usage: ${NAME} [--listen PORT] [--vnc VNC_HOST:PORT] [--cert CERT] [--ssl-only]"
b89c6db3 12 echo
f2538f33
JM
13 echo "Starts the WebSockets proxy and a mini-webserver and "
14 echo "provides a cut-and-paste URL to go to."
6f514864 15 echo
f2538f33 16 echo " --listen PORT Port for proxy/webserver to listen on"
96bc3d30 17 echo " Default: 6080"
b89c6db3
JM
18 echo " --vnc VNC_HOST:PORT VNC server host:port proxy target"
19 echo " Default: localhost:5900"
97924ebd
PO
20 echo " --cert CERT Path to combined cert/key file, or just"
21 echo " the cert file if used with --key"
96bc3d30 22 echo " Default: self.pem"
97924ebd 23 echo " --key KEY Path to key file, when not combined with cert"
3516bdf3
JM
24 echo " --web WEB Path to web files (e.g. vnc.html)"
25 echo " Default: ./"
c77d9fcc
WF
26 echo " --ssl-only Disable non-https connections."
27 echo " "
ee3493c0
SR
28 echo " --record FILE Record traffic to FILE.session.js"
29 echo " "
18256baa
PR
30 echo " --syslog SERVER Can be local socket such as /dev/log, or a UDP host:port pair."
31 echo " "
5dbacc5e
PR
32 echo " --heartbeat SEC send a ping to the client every SEC seconds"
33 echo " --timeout SEC after SEC seconds exit when not connected"
34 echo " --idle-timeout SEC server exits after SEC seconds if there are no"
35 echo " active connections"
ee3493c0 36 echo " "
b89c6db3
JM
37 exit 2
38}
39
40NAME="$(basename $0)"
2ace90e6
SR
41REAL_NAME="$(readlink -f $0)"
42HERE="$(cd "$(dirname "$REAL_NAME")" && pwd)"
96bc3d30 43PORT="6080"
b89c6db3 44VNC_DEST="localhost:5900"
96bc3d30 45CERT=""
97924ebd 46KEY=""
3516bdf3 47WEB=""
b89c6db3 48proxy_pid=""
c77d9fcc 49SSLONLY=""
ee3493c0 50RECORD_ARG=""
18256baa 51SYSLOG_ARG=""
5dbacc5e
PR
52HEARTBEAT_ARG=""
53IDLETIMEOUT_ARG=""
54TIMEOUT_ARG=""
b89c6db3
JM
55
56die() {
57 echo "$*"
58 exit 1
59}
60
61cleanup() {
62 trap - TERM QUIT INT EXIT
63 trap "true" CHLD # Ignore cleanup messages
64 echo
b89c6db3
JM
65 if [ -n "${proxy_pid}" ]; then
66 echo "Terminating WebSockets proxy (${proxy_pid})"
67 kill ${proxy_pid}
68 fi
69}
70
71# Process Arguments
72
73# Arguments that only apply to chrooter itself
74while [ "$*" ]; do
75 param=$1; shift; OPTARG=$1
76 case $param in
96bc3d30
JM
77 --listen) PORT="${OPTARG}"; shift ;;
78 --vnc) VNC_DEST="${OPTARG}"; shift ;;
79 --cert) CERT="${OPTARG}"; shift ;;
97924ebd 80 --key) KEY="${OPTARG}"; shift ;;
3516bdf3 81 --web) WEB="${OPTARG}"; shift ;;
c77d9fcc 82 --ssl-only) SSLONLY="--ssl-only" ;;
ee3493c0 83 --record) RECORD_ARG="--record ${OPTARG}"; shift ;;
18256baa 84 --syslog) SYSLOG_ARG="--syslog ${OPTARG}"; shift ;;
5dbacc5e
PR
85 --heartbeat) HEARTBEAT_ARG="--heartbeat ${OPTARG}"; shift ;;
86 --idle-timeout) IDLETIMEOUT_ARG="--idle-timeout ${OPTARG}"; shift ;;
87 --timeout) TIMEOUT_ARG="--timeout ${OPTARG}"; shift ;;
96bc3d30 88 -h|--help) usage ;;
b89c6db3 89 -*) usage "Unknown chrooter option: ${param}" ;;
96bc3d30 90 *) break ;;
b89c6db3
JM
91 esac
92done
93
94# Sanity checks
9700e359
HV
95if bash -c "exec 7<>/dev/tcp/localhost/${PORT}" &> /dev/null; then
96 exec 7<&-
97 exec 7>&-
98 die "Port ${PORT} in use. Try --listen PORT"
99else
100 exec 7<&-
101 exec 7>&-
102fi
b89c6db3
JM
103
104trap "cleanup" TERM QUIT INT EXIT
105
0f7f146f 106# Find vnc.html
3516bdf3
JM
107if [ -n "${WEB}" ]; then
108 if [ ! -e "${WEB}/vnc.html" ]; then
109 die "Could not find ${WEB}/vnc.html"
110 fi
111elif [ -e "$(pwd)/vnc.html" ]; then
96bc3d30 112 WEB=$(pwd)
0f7f146f 113elif [ -e "${HERE}/../vnc.html" ]; then
96bc3d30 114 WEB=${HERE}/../
0f7f146f 115elif [ -e "${HERE}/vnc.html" ]; then
96bc3d30 116 WEB=${HERE}
3516bdf3
JM
117elif [ -e "${HERE}/../share/novnc/vnc.html" ]; then
118 WEB=${HERE}/../share/novnc/
0f7f146f
JM
119else
120 die "Could not find vnc.html"
121fi
0f7f146f 122
96bc3d30
JM
123# Find self.pem
124if [ -n "${CERT}" ]; then
125 if [ ! -e "${CERT}" ]; then
126 die "Could not find ${CERT}"
127 fi
128elif [ -e "$(pwd)/self.pem" ]; then
129 CERT="$(pwd)/self.pem"
130elif [ -e "${HERE}/../self.pem" ]; then
131 CERT="${HERE}/../self.pem"
132elif [ -e "${HERE}/self.pem" ]; then
133 CERT="${HERE}/self.pem"
b89c6db3 134else
96bc3d30 135 echo "Warning: could not find self.pem"
b89c6db3
JM
136fi
137
97924ebd
PO
138# Check key file
139if [ -n "${KEY}" ]; then
140 if [ ! -e "${KEY}" ]; then
141 die "Could not find ${KEY}"
142 fi
143fi
144
6f514864 145# try to find websockify (prefer local, try global, then download local)
188c9a59 146if [[ -d ${HERE}/websockify ]]; then
6f514864
SR
147 WEBSOCKIFY=${HERE}/websockify/run
148
149 if [[ ! -x $WEBSOCKIFY ]]; then
150 echo "The path ${HERE}/websockify exists, but $WEBSOCKIFY either does not exist or is not executable."
54e835ee 151 echo "If you intended to use an installed websockify package, please remove ${HERE}/websockify."
6f514864
SR
152 exit 1
153 fi
154
155 echo "Using local websockify at $WEBSOCKIFY"
156else
e1d50c8c
TE
157 WEBSOCKIFY_FROMSYSTEM=$(which websockify 2>/dev/null)
158 WEBSOCKIFY_FROMSNAP=${HERE}/../usr/bin/python2-websockify
159 [ -f $WEBSOCKIFY_FROMSYSTEM ] && WEBSOCKIFY=$WEBSOCKIFY_FROMSYSTEM
160 [ -f $WEBSOCKIFY_FROMSNAP ] && WEBSOCKIFY=$WEBSOCKIFY_FROMSNAP
6f514864 161
e1d50c8c 162 if [ ! -f "$WEBSOCKIFY" ]; then
6f514864
SR
163 echo "No installed websockify, attempting to clone websockify..."
164 WEBSOCKIFY=${HERE}/websockify/run
101ff127 165 git clone https://github.com/novnc/websockify ${HERE}/websockify
6f514864
SR
166
167 if [[ ! -e $WEBSOCKIFY ]]; then
168 echo "Unable to locate ${HERE}/websockify/run after downloading"
169 exit 1
170 fi
171
172 echo "Using local websockify at $WEBSOCKIFY"
173 else
174 echo "Using installed websockify at $WEBSOCKIFY"
175 fi
176fi
177
96bc3d30 178echo "Starting webserver and WebSockets proxy on port ${PORT}"
6f514864 179#${HERE}/websockify --web ${WEB} ${CERT:+--cert ${CERT}} ${PORT} ${VNC_DEST} &
90456dbe 180${WEBSOCKIFY} ${SYSLOG_ARG} ${SSLONLY} --web ${WEB} ${CERT:+--cert ${CERT}} ${KEY:+--key ${KEY}} ${PORT} ${VNC_DEST} ${HEARTBEAT_ARG} ${IDLETIMEOUT_ARG} ${RECORD_ARG} ${TIMEOUT_ARG} &
b89c6db3
JM
181proxy_pid="$!"
182sleep 1
f2538f33 183if ! ps -p ${proxy_pid} >/dev/null; then
b89c6db3
JM
184 proxy_pid=
185 echo "Failed to start WebSockets proxy"
186 exit 1
187fi
188
19ed81fd 189echo -e "\n\nNavigate to this URL:\n"
27a1f6cb
WF
190if [ "x$SSLONLY" == "x" ]; then
191 echo -e " http://$(hostname):${PORT}/vnc.html?host=$(hostname)&port=${PORT}\n"
192else
193 echo -e " https://$(hostname):${PORT}/vnc.html?host=$(hostname)&port=${PORT}\n"
194fi
195
b89c6db3
JM
196echo -e "Press Ctrl-C to exit\n\n"
197
96bc3d30 198wait ${proxy_pid}