]> git.proxmox.com Git - mirror_novnc.git/blame - utils/launch.sh
adds qualityLevel property to RFB class for updating JPEG quality level encoding...
[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 " "
b89c6db3
JM
30 exit 2
31}
32
33NAME="$(basename $0)"
2ace90e6
SR
34REAL_NAME="$(readlink -f $0)"
35HERE="$(cd "$(dirname "$REAL_NAME")" && pwd)"
96bc3d30 36PORT="6080"
b89c6db3 37VNC_DEST="localhost:5900"
96bc3d30 38CERT=""
97924ebd 39KEY=""
3516bdf3 40WEB=""
b89c6db3 41proxy_pid=""
c77d9fcc 42SSLONLY=""
ee3493c0 43RECORD_ARG=""
b89c6db3
JM
44
45die() {
46 echo "$*"
47 exit 1
48}
49
50cleanup() {
51 trap - TERM QUIT INT EXIT
52 trap "true" CHLD # Ignore cleanup messages
53 echo
b89c6db3
JM
54 if [ -n "${proxy_pid}" ]; then
55 echo "Terminating WebSockets proxy (${proxy_pid})"
56 kill ${proxy_pid}
57 fi
58}
59
60# Process Arguments
61
62# Arguments that only apply to chrooter itself
63while [ "$*" ]; do
64 param=$1; shift; OPTARG=$1
65 case $param in
96bc3d30
JM
66 --listen) PORT="${OPTARG}"; shift ;;
67 --vnc) VNC_DEST="${OPTARG}"; shift ;;
68 --cert) CERT="${OPTARG}"; shift ;;
97924ebd 69 --key) KEY="${OPTARG}"; shift ;;
3516bdf3 70 --web) WEB="${OPTARG}"; shift ;;
c77d9fcc 71 --ssl-only) SSLONLY="--ssl-only" ;;
ee3493c0 72 --record) RECORD_ARG="--record ${OPTARG}"; shift ;;
96bc3d30 73 -h|--help) usage ;;
b89c6db3 74 -*) usage "Unknown chrooter option: ${param}" ;;
96bc3d30 75 *) break ;;
b89c6db3
JM
76 esac
77done
78
79# Sanity checks
9700e359
HV
80if bash -c "exec 7<>/dev/tcp/localhost/${PORT}" &> /dev/null; then
81 exec 7<&-
82 exec 7>&-
83 die "Port ${PORT} in use. Try --listen PORT"
84else
85 exec 7<&-
86 exec 7>&-
87fi
b89c6db3
JM
88
89trap "cleanup" TERM QUIT INT EXIT
90
0f7f146f 91# Find vnc.html
3516bdf3
JM
92if [ -n "${WEB}" ]; then
93 if [ ! -e "${WEB}/vnc.html" ]; then
94 die "Could not find ${WEB}/vnc.html"
95 fi
96elif [ -e "$(pwd)/vnc.html" ]; then
96bc3d30 97 WEB=$(pwd)
0f7f146f 98elif [ -e "${HERE}/../vnc.html" ]; then
96bc3d30 99 WEB=${HERE}/../
0f7f146f 100elif [ -e "${HERE}/vnc.html" ]; then
96bc3d30 101 WEB=${HERE}
3516bdf3
JM
102elif [ -e "${HERE}/../share/novnc/vnc.html" ]; then
103 WEB=${HERE}/../share/novnc/
0f7f146f
JM
104else
105 die "Could not find vnc.html"
106fi
0f7f146f 107
96bc3d30
JM
108# Find self.pem
109if [ -n "${CERT}" ]; then
110 if [ ! -e "${CERT}" ]; then
111 die "Could not find ${CERT}"
112 fi
113elif [ -e "$(pwd)/self.pem" ]; then
114 CERT="$(pwd)/self.pem"
115elif [ -e "${HERE}/../self.pem" ]; then
116 CERT="${HERE}/../self.pem"
117elif [ -e "${HERE}/self.pem" ]; then
118 CERT="${HERE}/self.pem"
b89c6db3 119else
96bc3d30 120 echo "Warning: could not find self.pem"
b89c6db3
JM
121fi
122
97924ebd
PO
123# Check key file
124if [ -n "${KEY}" ]; then
125 if [ ! -e "${KEY}" ]; then
126 die "Could not find ${KEY}"
127 fi
128fi
129
6f514864 130# try to find websockify (prefer local, try global, then download local)
188c9a59 131if [[ -d ${HERE}/websockify ]]; then
6f514864
SR
132 WEBSOCKIFY=${HERE}/websockify/run
133
134 if [[ ! -x $WEBSOCKIFY ]]; then
135 echo "The path ${HERE}/websockify exists, but $WEBSOCKIFY either does not exist or is not executable."
54e835ee 136 echo "If you intended to use an installed websockify package, please remove ${HERE}/websockify."
6f514864
SR
137 exit 1
138 fi
139
140 echo "Using local websockify at $WEBSOCKIFY"
141else
e1d50c8c
TE
142 WEBSOCKIFY_FROMSYSTEM=$(which websockify 2>/dev/null)
143 WEBSOCKIFY_FROMSNAP=${HERE}/../usr/bin/python2-websockify
144 [ -f $WEBSOCKIFY_FROMSYSTEM ] && WEBSOCKIFY=$WEBSOCKIFY_FROMSYSTEM
145 [ -f $WEBSOCKIFY_FROMSNAP ] && WEBSOCKIFY=$WEBSOCKIFY_FROMSNAP
6f514864 146
e1d50c8c 147 if [ ! -f "$WEBSOCKIFY" ]; then
6f514864
SR
148 echo "No installed websockify, attempting to clone websockify..."
149 WEBSOCKIFY=${HERE}/websockify/run
101ff127 150 git clone https://github.com/novnc/websockify ${HERE}/websockify
6f514864
SR
151
152 if [[ ! -e $WEBSOCKIFY ]]; then
153 echo "Unable to locate ${HERE}/websockify/run after downloading"
154 exit 1
155 fi
156
157 echo "Using local websockify at $WEBSOCKIFY"
158 else
159 echo "Using installed websockify at $WEBSOCKIFY"
160 fi
161fi
162
96bc3d30 163echo "Starting webserver and WebSockets proxy on port ${PORT}"
6f514864 164#${HERE}/websockify --web ${WEB} ${CERT:+--cert ${CERT}} ${PORT} ${VNC_DEST} &
97924ebd 165${WEBSOCKIFY} ${SSLONLY} --web ${WEB} ${CERT:+--cert ${CERT}} ${KEY:+--key ${KEY}} ${PORT} ${VNC_DEST} ${RECORD_ARG} &
b89c6db3
JM
166proxy_pid="$!"
167sleep 1
f2538f33 168if ! ps -p ${proxy_pid} >/dev/null; then
b89c6db3
JM
169 proxy_pid=
170 echo "Failed to start WebSockets proxy"
171 exit 1
172fi
173
19ed81fd 174echo -e "\n\nNavigate to this URL:\n"
27a1f6cb
WF
175if [ "x$SSLONLY" == "x" ]; then
176 echo -e " http://$(hostname):${PORT}/vnc.html?host=$(hostname)&port=${PORT}\n"
177else
178 echo -e " https://$(hostname):${PORT}/vnc.html?host=$(hostname)&port=${PORT}\n"
179fi
180
b89c6db3
JM
181echo -e "Press Ctrl-C to exit\n\n"
182
96bc3d30 183wait ${proxy_pid}