27
30
from oslo.config import cfg
32
from manila.openstack.common._i18n import _LI
33
from manila.openstack.common import log as logging
35
help_for_backdoor_port = (
36
"Acceptable values are 0, <port>, and <start>:<end>, where 0 results "
37
"in listening on a random tcp port number; <port> results in listening "
38
"on the specified port number (and not enabling backdoor if that port "
39
"is in use); and <start>:<end> results in listening on the smallest "
40
"unused port number within the specified range of port numbers. The "
41
"chosen port is displayed in the service's log file.")
29
42
eventlet_backdoor_opts = [
30
cfg.IntOpt('backdoor_port',
32
help='port for eventlet backdoor to listen')
43
cfg.StrOpt('backdoor_port',
44
help="Enable eventlet backdoor. %s" % help_for_backdoor_port)
36
48
CONF.register_opts(eventlet_backdoor_opts)
49
LOG = logging.getLogger(__name__)
52
class EventletBackdoorConfigValueError(Exception):
53
def __init__(self, port_range, help_msg, ex):
54
msg = ('Invalid backdoor_port configuration %(range)s: %(ex)s. '
56
{'range': port_range, 'ex': ex, 'help': help_msg})
57
super(EventletBackdoorConfigValueError, self).__init__(msg)
58
self.port_range = port_range
39
61
def _dont_use_this():
40
print "Don't use this, just disconnect instead"
62
print("Don't use this, just disconnect instead")
43
65
def _find_objects(t):
44
return filter(lambda o: isinstance(o, t), gc.get_objects())
66
return [o for o in gc.get_objects() if isinstance(o, t)]
47
69
def _print_greenthreads():
48
70
for i, gt in enumerate(_find_objects(greenlet.greenlet)):
50
72
traceback.print_stack(gt.gr_frame)
54
76
def _print_nativethreads():
55
77
for threadId, stack in sys._current_frames().items():
57
79
traceback.print_stack(stack)
83
def _parse_port_range(port_range):
84
if ':' not in port_range:
85
start, end = port_range, port_range
87
start, end = port_range.split(':', 1)
89
start, end = int(start), int(end)
93
except ValueError as ex:
94
raise EventletBackdoorConfigValueError(port_range, ex,
95
help_for_backdoor_port)
98
def _listen(host, start_port, end_port, listen_func):
102
return listen_func((host, try_port))
103
except socket.error as exc:
104
if (exc.errno != errno.EADDRINUSE or
105
try_port >= end_port):
61
110
def initialize_if_enabled():
80
131
pprint.pprint(val)
81
132
sys.displayhook = displayhook
83
sock = eventlet.listen(('localhost', CONF.backdoor_port))
134
sock = _listen('localhost', start_port, end_port, eventlet.listen)
136
# In the case of backdoor port being zero, a port number is assigned by
137
# listen(). In any case, pull the port number out here.
84
138
port = sock.getsockname()[1]
140
_LI('Eventlet backdoor listening on %(port)s for process %(pid)d') %
141
{'port': port, 'pid': os.getpid()}
85
143
eventlet.spawn_n(eventlet.backdoor.backdoor_server, sock,
86
144
locals=backdoor_locals)