parent: don't generate illegal default remote names.

getpass.getuser() output may contain slashes, which must be avoided as
they break virtualenv when present in argv[0].

Closes #344.
pull/350/head
David Wilson 6 years ago
parent 3d588323ff
commit 06e2e846c5

@ -64,6 +64,9 @@ Mitogen for Ansible
* `#343 <https://github.com/dw/mitogen/issues/343>`_: the sudo ``--login`` * `#343 <https://github.com/dw/mitogen/issues/343>`_: the sudo ``--login``
option is supported. option is supported.
* `#344 <https://github.com/dw/mitogen/issues/344>`_: connections no longer
fail when the parent machine's logged in username contains slashes.
* Runs with many targets executed the module dependency scanner redundantly * Runs with many targets executed the module dependency scanner redundantly
due to missing synchronization, causing significant wasted computation in the due to missing synchronization, causing significant wasted computation in the
connection multiplexer subprocess. For one real-world playbook the scanner connection multiplexer subprocess. For one real-world playbook the scanner
@ -101,6 +104,7 @@ Thanks!
Mitogen would not be possible without the support of users. A huge thanks for Mitogen would not be possible without the support of users. A huge thanks for
the bug reports in this release contributed by the bug reports in this release contributed by
`Alex Russu <https://github.com/alexrussu>`_, `Alex Russu <https://github.com/alexrussu>`_,
`atoom <https://github.com/atoom>`_,
`Dan Quackenbush <https://github.com/danquack>`_, `Dan Quackenbush <https://github.com/danquack>`_,
`Jesse London <https://github.com/jesteria>`_, `Jesse London <https://github.com/jesteria>`_,
`Luca Nunzi <https://github.com/0xlc>`_, `Luca Nunzi <https://github.com/0xlc>`_,

@ -93,6 +93,19 @@ def get_core_source():
return inspect.getsource(mitogen.core) return inspect.getsource(mitogen.core)
def get_default_remote_name():
"""
Return the default name appearing in argv[0] of remote machines.
"""
s = u'%s@%s:%d'
s %= (getpass.getuser(), socket.gethostname(), os.getpid())
# In mixed UNIX/Windows environments, the username may contain slashes.
return s.translate({
ord(u'\\'): ord(u'_'),
ord(u'/'): ord(u'_')
})
def is_immediate_child(msg, stream): def is_immediate_child(msg, stream):
""" """
Handler policy that requires messages to arrive only from immediately Handler policy that requires messages to arrive only from immediately
@ -765,8 +778,7 @@ class Stream(mitogen.core.Stream):
if connect_timeout: if connect_timeout:
self.connect_timeout = connect_timeout self.connect_timeout = connect_timeout
if remote_name is None: if remote_name is None:
remote_name = '%s@%s:%d' remote_name = get_default_remote_name()
remote_name %= (getpass.getuser(), socket.gethostname(), os.getpid())
if '/' in remote_name or '\\' in remote_name: if '/' in remote_name or '\\' in remote_name:
raise ValueError('remote_name= cannot contain slashes') raise ValueError('remote_name= cannot contain slashes')
self.remote_name = remote_name self.remote_name = remote_name

@ -5,6 +5,7 @@ import sys
import tempfile import tempfile
import time import time
import mock
import unittest2 import unittest2
import testlib import testlib
@ -28,6 +29,21 @@ def wait_for_child(pid, timeout=1.0):
assert False, "wait_for_child() timed out" assert False, "wait_for_child() timed out"
class GetDefaultRemoteNameTest(testlib.TestCase):
func = staticmethod(mitogen.parent.get_default_remote_name)
@mock.patch('os.getpid')
@mock.patch('getpass.getuser')
@mock.patch('socket.gethostname')
def test_slashes(self, mock_gethostname, mock_getuser, mock_getpid):
# Ensure slashes appearing in the remote name are replaced with
# underscores.
mock_gethostname.return_value = 'box'
mock_getuser.return_value = 'ECORP\\Administrator'
mock_getpid.return_value = 123
self.assertEquals("ECORP_Administrator@box:123", self.func())
class ReapChildTest(testlib.RouterMixin, testlib.TestCase): class ReapChildTest(testlib.RouterMixin, testlib.TestCase):
def test_connect_timeout(self): def test_connect_timeout(self):
# Ensure the child process is reaped if the connection times out. # Ensure the child process is reaped if the connection times out.

Loading…
Cancel
Save