python-websockify/u_Add-support-for-inetd.patch
2017-09-26 08:40:44 +00:00

174 lines
7.3 KiB
Diff

From 1ce74c62c91498f1bf54c030808ba45fb6240aae Mon Sep 17 00:00:00 2001
From: Michal Srb <msrb@suse.com>
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()