summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Urban <hydrogen18@gmail.com>2013-10-06 21:23:20 -0400
committerJakub Stasiak <jakub@stasiak.at>2016-01-11 23:28:48 +0100
commit24d283cfdb3cb9e6f0b4cad3d676940b4a3ce252 (patch)
tree609a92d7acf71380357c46508f7981a978828306
parent16aa6cb370c44ea29f4781d9d0a2ee799ebc8c12 (diff)
downloadeventlet-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.py32
-rw-r--r--tests/backdoor_test.py30
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()