Make it easier to use the eventlet backdoor locally
In order to determine what to do about this module it is quite useful to provide for a way to run it as its own main program (and interact with it from another telnet session). This adds a simple `main` function and uses it. This can then be used like: $ python oslo_service/eventlet_backdoor.py --backdoor_port 8000 Then from another terminal: $ telnet localhost 8000 Change-Id: I8c2b93dfad328929e1a106c5883903fe0bfb188a
This commit is contained in:
parent
eea13af645
commit
c527448894
@ -93,7 +93,7 @@ def _listen(host, start_port, end_port, listen_func):
|
|||||||
try_port += 1
|
try_port += 1
|
||||||
|
|
||||||
|
|
||||||
def initialize_if_enabled(conf):
|
def _initialize_if_enabled(conf):
|
||||||
conf.register_opts(_options.eventlet_backdoor_opts)
|
conf.register_opts(_options.eventlet_backdoor_opts)
|
||||||
backdoor_locals = {
|
backdoor_locals = {
|
||||||
'exit': _dont_use_this, # So we don't exit the entire process
|
'exit': _dont_use_this, # So we don't exit the entire process
|
||||||
@ -127,6 +127,40 @@ def initialize_if_enabled(conf):
|
|||||||
_LI('Eventlet backdoor listening on %(port)s for process %(pid)d'),
|
_LI('Eventlet backdoor listening on %(port)s for process %(pid)d'),
|
||||||
{'port': port, 'pid': os.getpid()}
|
{'port': port, 'pid': os.getpid()}
|
||||||
)
|
)
|
||||||
eventlet.spawn_n(eventlet.backdoor.backdoor_server, sock,
|
thread = eventlet.spawn(eventlet.backdoor.backdoor_server, sock,
|
||||||
locals=backdoor_locals)
|
locals=backdoor_locals)
|
||||||
|
return (port, thread)
|
||||||
|
|
||||||
|
|
||||||
|
def initialize_if_enabled(conf):
|
||||||
|
port_thread = _initialize_if_enabled(conf)
|
||||||
|
if not port_thread:
|
||||||
|
return None
|
||||||
|
else:
|
||||||
|
port, _thread = port_thread
|
||||||
return port
|
return port
|
||||||
|
|
||||||
|
|
||||||
|
def _main():
|
||||||
|
import eventlet
|
||||||
|
eventlet.monkey_patch(all=True)
|
||||||
|
|
||||||
|
from oslo_config import cfg
|
||||||
|
|
||||||
|
logging.basicConfig(level=logging.DEBUG)
|
||||||
|
|
||||||
|
conf = cfg.ConfigOpts()
|
||||||
|
conf.register_cli_opts(_options.eventlet_backdoor_opts)
|
||||||
|
conf(sys.argv[1:])
|
||||||
|
|
||||||
|
port_thread = _initialize_if_enabled(conf)
|
||||||
|
if not port_thread:
|
||||||
|
raise RuntimeError("Did not create backdoor at requested port")
|
||||||
|
else:
|
||||||
|
_port, thread = port_thread
|
||||||
|
thread.wait()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
# simple CLI for testing
|
||||||
|
_main()
|
||||||
|
@ -36,7 +36,7 @@ class BackdoorPortTest(base.ServiceBaseTestCase):
|
|||||||
def common_backdoor_port_setup(self):
|
def common_backdoor_port_setup(self):
|
||||||
self.sock = self.mox.CreateMockAnything()
|
self.sock = self.mox.CreateMockAnything()
|
||||||
self.mox.StubOutWithMock(eventlet, 'listen')
|
self.mox.StubOutWithMock(eventlet, 'listen')
|
||||||
self.mox.StubOutWithMock(eventlet, 'spawn_n')
|
self.mox.StubOutWithMock(eventlet, 'spawn')
|
||||||
|
|
||||||
def test_backdoor_port_inuse(self):
|
def test_backdoor_port_inuse(self):
|
||||||
self.config(backdoor_port=2345)
|
self.config(backdoor_port=2345)
|
||||||
@ -52,7 +52,7 @@ class BackdoorPortTest(base.ServiceBaseTestCase):
|
|||||||
self.common_backdoor_port_setup()
|
self.common_backdoor_port_setup()
|
||||||
eventlet.listen(('localhost', 8800)).AndReturn(self.sock)
|
eventlet.listen(('localhost', 8800)).AndReturn(self.sock)
|
||||||
self.sock.getsockname().AndReturn(('127.0.0.1', 8800))
|
self.sock.getsockname().AndReturn(('127.0.0.1', 8800))
|
||||||
eventlet.spawn_n(eventlet.backdoor.backdoor_server, self.sock,
|
eventlet.spawn(eventlet.backdoor.backdoor_server, self.sock,
|
||||||
locals=moxstubout.mox.IsA(dict))
|
locals=moxstubout.mox.IsA(dict))
|
||||||
self.mox.ReplayAll()
|
self.mox.ReplayAll()
|
||||||
port = eventlet_backdoor.initialize_if_enabled(self.conf)
|
port = eventlet_backdoor.initialize_if_enabled(self.conf)
|
||||||
|
@ -287,11 +287,11 @@ class LauncherTest(base.ServiceBaseTestCase):
|
|||||||
|
|
||||||
sock = self.mox.CreateMockAnything()
|
sock = self.mox.CreateMockAnything()
|
||||||
self.mox.StubOutWithMock(eventlet, 'listen')
|
self.mox.StubOutWithMock(eventlet, 'listen')
|
||||||
self.mox.StubOutWithMock(eventlet, 'spawn_n')
|
self.mox.StubOutWithMock(eventlet, 'spawn')
|
||||||
|
|
||||||
eventlet.listen(('localhost', 1234)).AndReturn(sock)
|
eventlet.listen(('localhost', 1234)).AndReturn(sock)
|
||||||
sock.getsockname().AndReturn(('127.0.0.1', 1234))
|
sock.getsockname().AndReturn(('127.0.0.1', 1234))
|
||||||
eventlet.spawn_n(eventlet.backdoor.backdoor_server, sock,
|
eventlet.spawn(eventlet.backdoor.backdoor_server, sock,
|
||||||
locals=mox.IsA(dict))
|
locals=mox.IsA(dict))
|
||||||
|
|
||||||
self.mox.ReplayAll()
|
self.mox.ReplayAll()
|
||||||
@ -315,13 +315,13 @@ class LauncherTest(base.ServiceBaseTestCase):
|
|||||||
|
|
||||||
sock = self.mox.CreateMockAnything()
|
sock = self.mox.CreateMockAnything()
|
||||||
self.mox.StubOutWithMock(eventlet, 'listen')
|
self.mox.StubOutWithMock(eventlet, 'listen')
|
||||||
self.mox.StubOutWithMock(eventlet, 'spawn_n')
|
self.mox.StubOutWithMock(eventlet, 'spawn')
|
||||||
|
|
||||||
eventlet.listen(('localhost', 8800)).AndRaise(
|
eventlet.listen(('localhost', 8800)).AndRaise(
|
||||||
socket.error(errno.EADDRINUSE, ''))
|
socket.error(errno.EADDRINUSE, ''))
|
||||||
eventlet.listen(('localhost', 8801)).AndReturn(sock)
|
eventlet.listen(('localhost', 8801)).AndReturn(sock)
|
||||||
sock.getsockname().AndReturn(('127.0.0.1', 8801))
|
sock.getsockname().AndReturn(('127.0.0.1', 8801))
|
||||||
eventlet.spawn_n(eventlet.backdoor.backdoor_server, sock,
|
eventlet.spawn(eventlet.backdoor.backdoor_server, sock,
|
||||||
locals=mox.IsA(dict))
|
locals=mox.IsA(dict))
|
||||||
|
|
||||||
self.mox.ReplayAll()
|
self.mox.ReplayAll()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user