]>
Commit | Line | Data |
---|---|---|
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 |
6 | usage() { |
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 | ||
40 | NAME="$(basename $0)" | |
2ace90e6 SR |
41 | REAL_NAME="$(readlink -f $0)" |
42 | HERE="$(cd "$(dirname "$REAL_NAME")" && pwd)" | |
96bc3d30 | 43 | PORT="6080" |
b89c6db3 | 44 | VNC_DEST="localhost:5900" |
96bc3d30 | 45 | CERT="" |
97924ebd | 46 | KEY="" |
3516bdf3 | 47 | WEB="" |
b89c6db3 | 48 | proxy_pid="" |
c77d9fcc | 49 | SSLONLY="" |
ee3493c0 | 50 | RECORD_ARG="" |
18256baa | 51 | SYSLOG_ARG="" |
5dbacc5e PR |
52 | HEARTBEAT_ARG="" |
53 | IDLETIMEOUT_ARG="" | |
54 | TIMEOUT_ARG="" | |
b89c6db3 JM |
55 | |
56 | die() { | |
57 | echo "$*" | |
58 | exit 1 | |
59 | } | |
60 | ||
61 | cleanup() { | |
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 | |
74 | while [ "$*" ]; 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 |
92 | done | |
93 | ||
94 | # Sanity checks | |
9700e359 HV |
95 | if 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" | |
99 | else | |
100 | exec 7<&- | |
101 | exec 7>&- | |
102 | fi | |
b89c6db3 JM |
103 | |
104 | trap "cleanup" TERM QUIT INT EXIT | |
105 | ||
0f7f146f | 106 | # Find vnc.html |
3516bdf3 JM |
107 | if [ -n "${WEB}" ]; then |
108 | if [ ! -e "${WEB}/vnc.html" ]; then | |
109 | die "Could not find ${WEB}/vnc.html" | |
110 | fi | |
111 | elif [ -e "$(pwd)/vnc.html" ]; then | |
96bc3d30 | 112 | WEB=$(pwd) |
0f7f146f | 113 | elif [ -e "${HERE}/../vnc.html" ]; then |
96bc3d30 | 114 | WEB=${HERE}/../ |
0f7f146f | 115 | elif [ -e "${HERE}/vnc.html" ]; then |
96bc3d30 | 116 | WEB=${HERE} |
3516bdf3 JM |
117 | elif [ -e "${HERE}/../share/novnc/vnc.html" ]; then |
118 | WEB=${HERE}/../share/novnc/ | |
0f7f146f JM |
119 | else |
120 | die "Could not find vnc.html" | |
121 | fi | |
0f7f146f | 122 | |
96bc3d30 JM |
123 | # Find self.pem |
124 | if [ -n "${CERT}" ]; then | |
125 | if [ ! -e "${CERT}" ]; then | |
126 | die "Could not find ${CERT}" | |
127 | fi | |
128 | elif [ -e "$(pwd)/self.pem" ]; then | |
129 | CERT="$(pwd)/self.pem" | |
130 | elif [ -e "${HERE}/../self.pem" ]; then | |
131 | CERT="${HERE}/../self.pem" | |
132 | elif [ -e "${HERE}/self.pem" ]; then | |
133 | CERT="${HERE}/self.pem" | |
b89c6db3 | 134 | else |
96bc3d30 | 135 | echo "Warning: could not find self.pem" |
b89c6db3 JM |
136 | fi |
137 | ||
97924ebd PO |
138 | # Check key file |
139 | if [ -n "${KEY}" ]; then | |
140 | if [ ! -e "${KEY}" ]; then | |
141 | die "Could not find ${KEY}" | |
142 | fi | |
143 | fi | |
144 | ||
6f514864 | 145 | # try to find websockify (prefer local, try global, then download local) |
188c9a59 | 146 | if [[ -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" | |
156 | else | |
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 | |
176 | fi | |
177 | ||
96bc3d30 | 178 | echo "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 |
181 | proxy_pid="$!" |
182 | sleep 1 | |
f2538f33 | 183 | if ! ps -p ${proxy_pid} >/dev/null; then |
b89c6db3 JM |
184 | proxy_pid= |
185 | echo "Failed to start WebSockets proxy" | |
186 | exit 1 | |
187 | fi | |
188 | ||
19ed81fd | 189 | echo -e "\n\nNavigate to this URL:\n" |
27a1f6cb WF |
190 | if [ "x$SSLONLY" == "x" ]; then |
191 | echo -e " http://$(hostname):${PORT}/vnc.html?host=$(hostname)&port=${PORT}\n" | |
192 | else | |
193 | echo -e " https://$(hostname):${PORT}/vnc.html?host=$(hostname)&port=${PORT}\n" | |
194 | fi | |
195 | ||
b89c6db3 JM |
196 | echo -e "Press Ctrl-C to exit\n\n" |
197 | ||
96bc3d30 | 198 | wait ${proxy_pid} |