From 7fa86a08d3fd47299aa13ad23f04a74382c7a5cc Mon Sep 17 00:00:00 2001 From: Anthony Young Date: Tue, 1 May 2012 14:19:05 -0700 Subject: [PATCH] Some more re-org --- README.md | 6 +-- bin/websockify | 88 ++++++++++++++++++++++++++++++++++++++++ websockify/proxy.py | 71 -------------------------------- websockify/websockify | 1 - websockify/websockify.py | 1 - 5 files changed, 91 insertions(+), 76 deletions(-) create mode 100755 bin/websockify mode change 100755 => 100644 websockify/proxy.py delete mode 120000 websockify/websockify delete mode 120000 websockify/websockify.py diff --git a/README.md b/README.md index 48c790a..70ceb8a 100644 --- a/README.md +++ b/README.md @@ -110,7 +110,7 @@ new (moved) port of the program. The program wrap mode is invoked by replacing the target with `--` followed by the program command line to wrap. - `./websockify 2023 -- PROGRAM ARGS` + `bin/websockify 2023 -- PROGRAM ARGS` The `--wrap-mode` option can be used to indicate what action to take when the wrapped program exits or daemonizes. @@ -119,13 +119,13 @@ Here is an example of using websockify to wrap the vncserver command (which backgrounds itself) for use with [noVNC](https://github.com/kanaka/noVNC): - `./websockify 5901 --wrap-mode=ignore -- vncserver -geometry 1024x768 :1` + `bin/websockify 5901 --wrap-mode=ignore -- vncserver -geometry 1024x768 :1` Here is an example of wrapping telnetd (from krb5-telnetd).telnetd exits after the connection closes so the wrap mode is set to respawn the command: - `sudo ./websockify 2023 --wrap-mode=respawn -- telnetd -debug 2023` + `sudo bin/websockify 2023 --wrap-mode=respawn -- telnetd -debug 2023` The `wstelnet.html` page demonstrates a simple WebSockets based telnet client. diff --git a/bin/websockify b/bin/websockify new file mode 100755 index 0000000..9c8e4fa --- /dev/null +++ b/bin/websockify @@ -0,0 +1,88 @@ +#!/usr/bin/env python + +''' +A WebSocket to TCP socket proxy with support for "wss://" encryption. +Copyright 2011 Joel Martin +Licensed under LGPL version 3 (see docs/LICENSE.LGPL-3) + +You can make a cert/key with openssl using: +openssl req -new -x509 -days 365 -nodes -out self.pem -keyout self.pem +as taken from http://docs.python.org/dev/library/ssl.html#certificates + +''' + + +import optparse, os, sys +from websockify.proxy import WebSocketProxy + + +def websockify_init(): + usage = "\n %prog [options]" + usage += " [source_addr:]source_port target_addr:target_port" + usage += "\n %prog [options]" + usage += " [source_addr:]source_port -- WRAP_COMMAND_LINE" + parser = optparse.OptionParser(usage=usage) + parser.add_option("--verbose", "-v", action="store_true", + help="verbose messages and per frame traffic") + parser.add_option("--record", + help="record sessions to FILE.[session_number]", metavar="FILE") + parser.add_option("--daemon", "-D", + dest="daemon", action="store_true", + help="become a daemon (background process)") + parser.add_option("--run-once", action="store_true", + help="handle a single WebSocket connection and exit") + parser.add_option("--timeout", type=int, default=0, + help="after TIMEOUT seconds exit when not connected") + parser.add_option("--cert", default="self.pem", + help="SSL certificate file") + parser.add_option("--key", default=None, + help="SSL key file (if separate from cert)") + parser.add_option("--ssl-only", action="store_true", + help="disallow non-encrypted connections") + parser.add_option("--web", default=None, metavar="DIR", + help="run webserver on same port. Serve files from DIR.") + parser.add_option("--wrap-mode", default="exit", metavar="MODE", + choices=["exit", "ignore", "respawn"], + help="action to take when the wrapped program exits " + "or daemonizes: exit (default), ignore, respawn") + (opts, args) = parser.parse_args() + + # Sanity checks + if len(args) < 2: + parser.error("Too few arguments") + if sys.argv.count('--'): + opts.wrap_cmd = args[1:] + else: + opts.wrap_cmd = None + if len(args) > 2: + parser.error("Too many arguments") + + if opts.ssl_only and not os.path.exists(opts.cert): + parser.error("SSL only and %s not found" % opts.cert) + + # Parse host:port and convert ports to numbers + if args[0].count(':') > 0: + opts.listen_host, opts.listen_port = args[0].rsplit(':', 1) + else: + opts.listen_host, opts.listen_port = '', args[0] + + try: opts.listen_port = int(opts.listen_port) + except: parser.error("Error parsing listen port") + + if opts.wrap_cmd: + opts.target_host = None + opts.target_port = None + else: + if args[1].count(':') > 0: + opts.target_host, opts.target_port = args[1].rsplit(':', 1) + else: + parser.error("Error parsing target") + try: opts.target_port = int(opts.target_port) + except: parser.error("Error parsing target port") + + # Create and start the WebSockets proxy + server = WebSocketProxy(**opts.__dict__) + server.start_server() + +if __name__ == '__main__': + websockify_init() diff --git a/websockify/proxy.py b/websockify/proxy.py old mode 100755 new mode 100644 index 550dff7..7a46cec --- a/websockify/proxy.py +++ b/websockify/proxy.py @@ -212,74 +212,3 @@ Traffic Legend: if closed: # TODO: What about blocking on client socket? raise self.CClose(closed['code'], closed['reason']) - -def websockify_init(): - usage = "\n %prog [options]" - usage += " [source_addr:]source_port target_addr:target_port" - usage += "\n %prog [options]" - usage += " [source_addr:]source_port -- WRAP_COMMAND_LINE" - parser = optparse.OptionParser(usage=usage) - parser.add_option("--verbose", "-v", action="store_true", - help="verbose messages and per frame traffic") - parser.add_option("--record", - help="record sessions to FILE.[session_number]", metavar="FILE") - parser.add_option("--daemon", "-D", - dest="daemon", action="store_true", - help="become a daemon (background process)") - parser.add_option("--run-once", action="store_true", - help="handle a single WebSocket connection and exit") - parser.add_option("--timeout", type=int, default=0, - help="after TIMEOUT seconds exit when not connected") - parser.add_option("--cert", default="self.pem", - help="SSL certificate file") - parser.add_option("--key", default=None, - help="SSL key file (if separate from cert)") - parser.add_option("--ssl-only", action="store_true", - help="disallow non-encrypted connections") - parser.add_option("--web", default=None, metavar="DIR", - help="run webserver on same port. Serve files from DIR.") - parser.add_option("--wrap-mode", default="exit", metavar="MODE", - choices=["exit", "ignore", "respawn"], - help="action to take when the wrapped program exits " - "or daemonizes: exit (default), ignore, respawn") - (opts, args) = parser.parse_args() - - # Sanity checks - if len(args) < 2: - parser.error("Too few arguments") - if sys.argv.count('--'): - opts.wrap_cmd = args[1:] - else: - opts.wrap_cmd = None - if len(args) > 2: - parser.error("Too many arguments") - - if opts.ssl_only and not os.path.exists(opts.cert): - parser.error("SSL only and %s not found" % opts.cert) - - # Parse host:port and convert ports to numbers - if args[0].count(':') > 0: - opts.listen_host, opts.listen_port = args[0].rsplit(':', 1) - else: - opts.listen_host, opts.listen_port = '', args[0] - - try: opts.listen_port = int(opts.listen_port) - except: parser.error("Error parsing listen port") - - if opts.wrap_cmd: - opts.target_host = None - opts.target_port = None - else: - if args[1].count(':') > 0: - opts.target_host, opts.target_port = args[1].rsplit(':', 1) - else: - parser.error("Error parsing target") - try: opts.target_port = int(opts.target_port) - except: parser.error("Error parsing target port") - - # Create and start the WebSockets proxy - server = WebSocketProxy(**opts.__dict__) - server.start_server() - -if __name__ == '__main__': - websockify_init() diff --git a/websockify/websockify b/websockify/websockify deleted file mode 120000 index 799385c..0000000 --- a/websockify/websockify +++ /dev/null @@ -1 +0,0 @@ -proxy.py \ No newline at end of file diff --git a/websockify/websockify.py b/websockify/websockify.py deleted file mode 120000 index 799385c..0000000 --- a/websockify/websockify.py +++ /dev/null @@ -1 +0,0 @@ -proxy.py \ No newline at end of file