diff --git a/python-websockify.changes b/python-websockify.changes index 7ec2d44..e92df0a 100644 --- a/python-websockify.changes +++ b/python-websockify.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Mon Sep 25 08:37:21 UTC 2017 - msrb@suse.com + +- add u_Add-support-for-inetd.patch: fate#323880 +- add u_Fix-inetd-mode-on-python-2.patch: fate#323880 + ------------------------------------------------------------------- Fri Aug 25 09:42:56 UTC 2017 - tbechtold@suse.com diff --git a/python-websockify.spec b/python-websockify.spec index 8f1d1b3..5bac717 100644 --- a/python-websockify.spec +++ b/python-websockify.spec @@ -25,6 +25,10 @@ License: LGPL-3.0 and MPL-2.0 and BSD-2-Clause and BSD-3-Clause Group: Development/Languages/Python Url: https://github.com/kanaka/websockify Source: https://files.pythonhosted.org/packages/source/w/websockify/websockify-%{version}.tar.gz +# PATCH-FEATURE-UPSTREAM u_Add-support-for-inetd.patch fate#323880 msrb@suse.com -- https://github.com/novnc/websockify/pull/293 +Patch1: u_Add-support-for-inetd.patch +# PATCH-FEATURE-UPSTREAM u_Fix-inetd-mode-on-python-2.patch fate#323880 msrb@suse.com -- https://github.com/novnc/websockify/pull/293 +Patch2: u_Fix-inetd-mode-on-python-2.patch BuildRequires: %{python_module devel} BuildRequires: %{python_module setuptools} BuildRequires: python-rpm-macros @@ -68,6 +72,8 @@ This package contains common files. %prep %setup -q -n websockify-%{version} +%patch1 -p1 +%patch2 -p1 # remove unwanted shebang sed -i '1 { /^#!/ d }' websockify/websocket*.py # drop unneeded executable bit diff --git a/u_Add-support-for-inetd.patch b/u_Add-support-for-inetd.patch new file mode 100644 index 0000000..cf5280d --- /dev/null +++ b/u_Add-support-for-inetd.patch @@ -0,0 +1,173 @@ +From 1ce74c62c91498f1bf54c030808ba45fb6240aae Mon Sep 17 00:00:00 2001 +From: Michal Srb +Date: Mon, 31 Jul 2017 15:38:52 +0200 +Subject: [PATCH] Add support for inetd. + +--- + websockify/websocketproxy.py | 52 +++++++++++++++++++++++++++--------------- + websockify/websockifyserver.py | 28 +++++++++++++++-------- + 2 files changed, 52 insertions(+), 28 deletions(-) + +Index: websockify-0.8.0/websockify/websocketproxy.py +=================================================================== +--- websockify-0.8.0.orig/websockify/websocketproxy.py ++++ websockify-0.8.0/websockify/websocketproxy.py +@@ -285,12 +285,17 @@ class WebSocketProxy(websocket.WebSocket + else: + dst_string = "%s:%s" % (self.target_host, self.target_port) + ++ if self.listen_fd != None: ++ src_string = "socket %d" % self.listen_fd ++ else: ++ src_string = "%s:%s" % (self.listen_host, self.listen_port) ++ + if self.token_plugin: +- msg = " - proxying from %s:%s to targets generated by %s" % ( +- self.listen_host, self.listen_port, type(self.token_plugin).__name__) ++ msg = " - proxying from %s to targets generated by %s" % ( ++ src_string, type(self.token_plugin).__name__) + else: +- msg = " - proxying from %s:%s to %s" % ( +- self.listen_host, self.listen_port, dst_string) ++ msg = " - proxying from %s to %s" % ( ++ src_string, dst_string) + + if self.ssl_target: + msg += " (using SSL)" +@@ -377,6 +382,8 @@ def websockify_init(): + help="connect to SSL target as SSL client") + parser.add_option("--unix-target", + help="connect to unix socket target", metavar="FILE") ++ parser.add_option("--inetd", ++ help="inetd mode, receive listening socket from stdin", action="store_true") + 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", +@@ -447,15 +454,10 @@ def websockify_init(): + + del opts.target_cfg + +- # Sanity checks +- if len(args) < 2 and not (opts.token_plugin or opts.unix_target): +- 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 not websocket.ssl and opts.ssl_target: + parser.error("SSL target requested and Python SSL module not loaded."); +@@ -463,28 +465,42 @@ def websockify_init(): + 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) +- opts.listen_host = opts.listen_host.strip('[]') ++ if opts.inetd: ++ opts.listen_fd = sys.stdin.fileno() + else: +- opts.listen_host, opts.listen_port = '', args[0] ++ if len(args) < 1: ++ parser.error("Too few arguments") ++ arg = args.pop(0) ++ # Parse host:port and convert ports to numbers ++ if arg.count(':') > 0: ++ opts.listen_host, opts.listen_port = arg.rsplit(':', 1) ++ opts.listen_host = opts.listen_host.strip('[]') ++ else: ++ opts.listen_host, opts.listen_port = '', arg + +- try: opts.listen_port = int(opts.listen_port) +- except: parser.error("Error parsing listen port") ++ try: opts.listen_port = int(opts.listen_port) ++ except: parser.error("Error parsing listen port") ++ ++ del opts.inetd + + if opts.wrap_cmd or opts.unix_target or opts.token_plugin: + opts.target_host = None + opts.target_port = None + else: +- if args[1].count(':') > 0: +- opts.target_host, opts.target_port = args[1].rsplit(':', 1) ++ if len(args) < 1: ++ parser.error("Too few arguments") ++ arg = args.pop(0) ++ if arg.count(':') > 0: ++ opts.target_host, opts.target_port = arg.rsplit(':', 1) + opts.target_host = opts.target_host.strip('[]') + else: + parser.error("Error parsing target") + try: opts.target_port = int(opts.target_port) + except: parser.error("Error parsing target port") + ++ if len(args) > 0 and opts.wrap_cmd == None: ++ parser.error("Too many arguments") ++ + if opts.token_plugin is not None: + if '.' not in opts.token_plugin: + opts.token_plugin = ( +Index: websockify-0.8.0/websockify/websocket.py +=================================================================== +--- websockify-0.8.0.orig/websockify/websocket.py ++++ websockify-0.8.0/websockify/websocket.py +@@ -601,8 +601,8 @@ class WebSocketServer(object): + class Terminate(Exception): + pass + +- def __init__(self, RequestHandlerClass, listen_host='', +- listen_port=None, source_is_ipv6=False, ++ def __init__(self, RequestHandlerClass, listen_fd=None, ++ listen_host='', listen_port=None, source_is_ipv6=False, + verbose=False, cert='', key='', ssl_only=None, + daemon=False, record='', web='', + file_only=False, +@@ -613,6 +613,7 @@ class WebSocketServer(object): + # settings + self.RequestHandlerClass = RequestHandlerClass + self.verbose = verbose ++ self.listen_fd = listen_fd + self.listen_host = listen_host + self.listen_port = listen_port + self.prefer_ipv6 = source_is_ipv6 +@@ -658,8 +659,11 @@ class WebSocketServer(object): + + # Show configuration + self.msg("WebSocket server settings:") +- self.msg(" - Listen on %s:%s", +- self.listen_host, self.listen_port) ++ if self.listen_fd != None: ++ self.msg(" - Listen on fd %d", self.listen_fd) ++ else: ++ self.msg(" - Listen on %s:%s", ++ self.listen_host, self.listen_port) + self.msg(" - Flash security policy server") + if self.web: + if self.file_only: +@@ -965,12 +969,16 @@ class WebSocketServer(object): + is a WebSockets client then call new_websocket_client() method (which must + be overridden) for each new client connection. + """ +- lsock = self.socket(self.listen_host, self.listen_port, False, +- self.prefer_ipv6, +- tcp_keepalive=self.tcp_keepalive, +- tcp_keepcnt=self.tcp_keepcnt, +- tcp_keepidle=self.tcp_keepidle, +- tcp_keepintvl=self.tcp_keepintvl) ++ ++ if self.listen_fd != None: ++ lsock = socket.fromfd(self.listen_fd, socket.AF_INET, socket.SOCK_STREAM) ++ else: ++ lsock = self.socket(self.listen_host, self.listen_port, False, ++ self.prefer_ipv6, ++ tcp_keepalive=self.tcp_keepalive, ++ tcp_keepcnt=self.tcp_keepcnt, ++ tcp_keepidle=self.tcp_keepidle, ++ tcp_keepintvl=self.tcp_keepintvl) + + if self.daemon: + keepfd = self.get_log_fd() diff --git a/u_Fix-inetd-mode-on-python-2.patch b/u_Fix-inetd-mode-on-python-2.patch new file mode 100644 index 0000000..c1652d6 --- /dev/null +++ b/u_Fix-inetd-mode-on-python-2.patch @@ -0,0 +1,27 @@ +From 7b382d043e9b85fab2fcddf46a54d19bbd4d601c Mon Sep 17 00:00:00 2001 +From: Michal Srb +Date: Tue, 1 Aug 2017 15:35:34 +0200 +Subject: [PATCH] Fix inetd mode on Python 2. + +In python 2 the ssl.wrap_socket doesn't work on sockets created using socket.fromfd. +The workaround is to wrap the socket returned by socket.fromfd into another socket +object using the private _sock constructor parameter. +--- + websockify/websockifyserver.py | 4 ++++ + 1 file changed, 4 insertions(+) + +Index: websockify-0.8.0/websockify/websocket.py +=================================================================== +--- websockify-0.8.0.orig/websockify/websocket.py ++++ websockify-0.8.0/websockify/websocket.py +@@ -972,6 +972,10 @@ class WebSocketServer(object): + + if self.listen_fd != None: + lsock = socket.fromfd(self.listen_fd, socket.AF_INET, socket.SOCK_STREAM) ++ if sys.hexversion < 0x3000000: ++ # For python 2 we have to wrap the "raw" socket into a socket object, ++ # otherwise ssl wrap_socket doesn't work. ++ lsock = socket.socket(_sock=lsock) + else: + lsock = self.socket(self.listen_host, self.listen_port, False, + self.prefer_ipv6,