diff options
| author | Eric Urban <hydrogen18@gmail.com> | 2013-10-06 21:23:20 -0400 |
|---|---|---|
| committer | Jakub Stasiak <jakub@stasiak.at> | 2016-01-11 23:28:48 +0100 |
| commit | 24d283cfdb3cb9e6f0b4cad3d676940b4a3ce252 (patch) | |
| tree | 609a92d7acf71380357c46508f7981a978828306 | |
| parent | 16aa6cb370c44ea29f4781d9d0a2ee799ebc8c12 (diff) | |
| download | eventlet-backdoor.tar.gz | |
backdoor: Add Unix and IPv6 socket supportbackdoor
BitBucket: https://github.com/eventlet/eventlet/issues/157
GitHub: https://github.com/eventlet/eventlet/pull/56
| -rw-r--r-- | eventlet/backdoor.py | 32 | ||||
| -rw-r--r-- | tests/backdoor_test.py | 30 |
2 files changed, 56 insertions, 6 deletions
diff --git a/eventlet/backdoor.py b/eventlet/backdoor.py index 2067772..04b47cf 100644 --- a/eventlet/backdoor.py +++ b/eventlet/backdoor.py @@ -4,6 +4,8 @@ from code import InteractiveConsole import errno import socket import sys +import errno +import traceback import eventlet from eventlet import hubs @@ -69,7 +71,12 @@ class SocketConsole(greenlets.greenlet): def finalize(self): # restore the state of the socket self.desc = None - print("backdoor closed to %s:%s" % self.hostport) + if len(self.hostport) >= 2: + host = self.hostport[0] + port = self.hostport[1] + print("backdoor closed to %s:%s" % (host, port,)) + else: + print('backdoor closed') def backdoor_server(sock, locals=None): @@ -81,7 +88,16 @@ def backdoor_server(sock, locals=None): of the interpreters. It can be convenient to stick important application variables in here. """ - print("backdoor server listening on %s:%s" % sock.getsockname()) + listening_on = sock.getsockname() + if sock.family == socket.AF_INET: + #Expand result to IP + port + listening_on = '%s:%s' % listening_on + elif sock.family == socket.AF_INET6: + ip, port, _, _ = listening_on + listening_on = '%s:%s' % (ip, port,) + # No action needed if sock.family == socket.AF_UNIX + + print("backdoor server listening on %s" % (listening_on,)) try: try: while True: @@ -102,10 +118,16 @@ def backdoor(conn_info, locals=None): (such as backdoor_server). """ conn, addr = conn_info - host, port = addr - print("backdoor to %s:%s" % (host, port)) + if conn.family == socket.AF_INET: + host, port = addr + print("backdoor to %s:%s" % (host, port)) + elif conn.family == socket.AF_INET6: + host, port, _, _ = addr + print("backdoor to %s:%s" % (host, port)) + else: + print('backdoor opened') fl = conn.makefile("rw") - console = SocketConsole(fl, (host, port), locals) + console = SocketConsole(fl, addr, locals) hub = hubs.get_hub() hub.schedule_call_global(0, console.switch) diff --git a/tests/backdoor_test.py b/tests/backdoor_test.py index 6facffe..03d5752 100644 --- a/tests/backdoor_test.py +++ b/tests/backdoor_test.py @@ -1,4 +1,8 @@ +import os +import os.path + import eventlet + from eventlet import backdoor from eventlet.green import socket @@ -13,6 +17,9 @@ class BackdoorTest(LimitedTestCase): serv = eventlet.spawn(backdoor.backdoor_server, listener) client = socket.socket() client.connect(('localhost', listener.getsockname()[1])) + self._run_test_on_client_and_server(client, serv) + + def _run_test_on_client_and_server(self, client, server_thread): f = client.makefile('rw') assert 'Python' in f.readline() f.readline() # build info @@ -25,10 +32,31 @@ class BackdoorTest(LimitedTestCase): self.assertEqual('>>> ', f.read(4)) f.close() client.close() - serv.kill() + server_thread.kill() # wait for the console to discover that it's dead eventlet.sleep(0.1) + def test_server_on_ipv6_socket(self): + listener = socket.socket(socket.AF_INET6) + listener.bind(('::1',0)) + listener.listen(5) + serv = eventlet.spawn(backdoor.backdoor_server, listener) + client = socket.socket(socket.AF_INET6) + client.connect(listener.getsockname()) + self._run_test_on_client_and_server(client, serv) + + def test_server_on_unix_socket(self): + SOCKET_PATH = '/tmp/eventlet_backdoor_test.socket' + if os.path.exists(SOCKET_PATH): + os.unlink(SOCKET_PATH) + listener = socket.socket(socket.AF_UNIX) + listener.bind(SOCKET_PATH) + listener.listen(5) + serv = eventlet.spawn(backdoor.backdoor_server, listener) + client = socket.socket(socket.AF_UNIX) + client.connect(SOCKET_PATH) + self._run_test_on_client_and_server(client, serv) + if __name__ == '__main__': main() |
