def test_json_message(self): payload = """body: {"changePassword": {"adminPass": "******"}}""" expected = """body: {"changePassword": {"adminPass": "******"}}""" self.assertEqual(expected, log.mask_password(payload)) payload = """body: {"rescue": {"admin_pass": "******"}}""" expected = """body: {"rescue": {"admin_pass": "******"}}""" self.assertEqual(expected, log.mask_password(payload)) payload = """body: {"rescue": {"password": "******"}}""" expected = """body: {"rescue": {"password": "******"}}""" self.assertEqual(expected, log.mask_password(payload))
def test_json(self): # Test 'adminPass' w/o spaces payload = """{'adminPass':'******'}""" expected = """{'adminPass':'******'}""" self.assertEqual(expected, log.mask_password(payload)) # Test 'adminPass' with spaces payload = """{ 'adminPass' : 'mypassword' }""" expected = """{ 'adminPass' : '***' }""" self.assertEqual(expected, log.mask_password(payload)) # Test 'admin_pass' w/o spaces payload = """{'admin_pass':'******'}""" expected = """{'admin_pass':'******'}""" self.assertEqual(expected, log.mask_password(payload)) # Test 'admin_pass' with spaces payload = """{ 'admin_pass' : 'mypassword' }""" expected = """{ 'admin_pass' : '***' }""" self.assertEqual(expected, log.mask_password(payload)) # Test 'admin_password' w/o spaces payload = """{'admin_password':'******'}""" expected = """{'admin_password':'******'}""" self.assertEqual(expected, log.mask_password(payload)) # Test 'admin_password' with spaces payload = """{ 'admin_password' : 'mypassword' }""" expected = """{ 'admin_password' : '***' }""" self.assertEqual(expected, log.mask_password(payload)) # Test 'password' w/o spaces payload = """{'password':'******'}""" expected = """{'password':'******'}""" self.assertEqual(expected, log.mask_password(payload)) # Test 'password' with spaces payload = """{ 'password' : 'mypassword' }""" expected = """{ 'password' : '***' }""" self.assertEqual(expected, log.mask_password(payload))
def test_xml_message(self): payload = """<?xml version="1.0" encoding="UTF-8"?> <rebuild xmlns="http://docs.openstack.org/compute/api/v1.1" name="foobar" imageRef="http://openstack.example.com/v1.1/32278/images/70a599e0-31e7" accessIPv4="1.2.3.4" accessIPv6="fe80::100" adminPass="******"> <metadata> <meta key="My Server Name">Apache1</meta> </metadata> </rebuild>""" expected = """<?xml version="1.0" encoding="UTF-8"?> <rebuild xmlns="http://docs.openstack.org/compute/api/v1.1" name="foobar" imageRef="http://openstack.example.com/v1.1/32278/images/70a599e0-31e7" accessIPv4="1.2.3.4" accessIPv6="fe80::100" adminPass="******"> <metadata> <meta key="My Server Name">Apache1</meta> </metadata> </rebuild>""" self.assertEqual(expected, log.mask_password(payload)) payload = """<?xml version="1.0" encoding="UTF-8"?> <rescue xmlns="http://docs.openstack.org/compute/api/v1.1" admin_pass="******"/>""" expected = """<?xml version="1.0" encoding="UTF-8"?> <rescue xmlns="http://docs.openstack.org/compute/api/v1.1" admin_pass="******"/>""" self.assertEqual(expected, log.mask_password(payload)) payload = """<?xml version="1.0" encoding="UTF-8"?> <rescue xmlns="http://docs.openstack.org/compute/api/v1.1" admin_password="******"/>""" expected = """<?xml version="1.0" encoding="UTF-8"?> <rescue xmlns="http://docs.openstack.org/compute/api/v1.1" admin_password="******"/>""" self.assertEqual(expected, log.mask_password(payload)) payload = """<?xml version="1.0" encoding="UTF-8"?> <rescue xmlns="http://docs.openstack.org/compute/api/v1.1" password="******"/>""" expected = """<?xml version="1.0" encoding="UTF-8"?> <rescue xmlns="http://docs.openstack.org/compute/api/v1.1" password="******"/>""" self.assertEqual(expected, log.mask_password(payload))
def test_mask_password(self): payload = "test = 'password' : 'aaaaaa'" expected = "test = 'password' : '111'" self.assertEqual(expected, log.mask_password(payload, secret='111')) payload = 'test = "original_password" : "aaaaaaaaa"' expected = 'test = "original_password" : "***"' self.assertEqual(expected, log.mask_password(payload)) payload = 'test = "param1" : "value"' expected = 'test = "param1" : "value"' self.assertEqual(expected, log.mask_password(payload)) payload = """{'adminPass':'******'}""" payload = unicode(payload) expected = """{'adminPass':'******'}""" self.assertEqual(expected, log.mask_password(payload))
def test_xml(self): # Test 'adminPass' w/o spaces payload = """<adminPass>mypassword</adminPass>""" expected = """<adminPass>***</adminPass>""" self.assertEqual(expected, log.mask_password(payload)) # Test 'adminPass' with spaces payload = """<adminPass> mypassword </adminPass>""" expected = """<adminPass>***</adminPass>""" self.assertEqual(expected, log.mask_password(payload)) # Test 'admin_pass' w/o spaces payload = """<admin_pass>mypassword</admin_pass>""" expected = """<admin_pass>***</admin_pass>""" self.assertEqual(expected, log.mask_password(payload)) # Test 'admin_pass' with spaces payload = """<admin_pass> mypassword </admin_pass>""" expected = """<admin_pass>***</admin_pass>""" self.assertEqual(expected, log.mask_password(payload)) # Test 'password' w/o spaces payload = """<password>mypassword</password>""" expected = """<password>***</password>""" self.assertEqual(expected, log.mask_password(payload)) # Test 'password' with spaces payload = """<password> mypassword </password>""" expected = """<password>***</password>""" self.assertEqual(expected, log.mask_password(payload))
def test_xml_message(self): payload = """<?xml version="1.0" encoding="UTF-8"?> <rebuild xmlns="http://docs.openstack.org/compute/api/v1.1" name="foobar" imageRef="http://openstack.example.com/v1.1/32278/images/70a599e0-31e7" accessIPv4="1.2.3.4" accessIPv6="fe80::100" adminPass="******"> <metadata> <meta key="My Server Name">Apache1</meta> </metadata> </rebuild>""" expected = """<?xml version="1.0" encoding="UTF-8"?> <rebuild xmlns="http://docs.openstack.org/compute/api/v1.1" name="foobar" imageRef="http://openstack.example.com/v1.1/32278/images/70a599e0-31e7" accessIPv4="1.2.3.4" accessIPv6="fe80::100" adminPass="******"> <metadata> <meta key="My Server Name">Apache1</meta> </metadata> </rebuild>""" self.assertEqual(expected, log.mask_password(payload)) payload = """<?xml version="1.0" encoding="UTF-8"?> <rescue xmlns="http://docs.openstack.org/compute/api/v1.1" admin_pass="******"/>""" expected = """<?xml version="1.0" encoding="UTF-8"?> <rescue xmlns="http://docs.openstack.org/compute/api/v1.1" admin_pass="******"/>""" self.assertEqual(expected, log.mask_password(payload)) payload = """<?xml version="1.0" encoding="UTF-8"?> <rescue xmlns="http://docs.openstack.org/compute/api/v1.1" password="******"/>""" expected = """<?xml version="1.0" encoding="UTF-8"?> <rescue xmlns="http://docs.openstack.org/compute/api/v1.1" password="******"/>""" self.assertEqual(expected, log.mask_password(payload))
def test_json(self): # Test 'adminPass' w/o spaces payload = """{'adminPass':'******'}""" expected = """{'adminPass':'******'}""" self.assertEqual(expected, log.mask_password(payload)) # Test 'adminPass' with spaces payload = """{ 'adminPass' : 'mypassword' }""" expected = """{ 'adminPass' : '***' }""" self.assertEqual(expected, log.mask_password(payload)) # Test 'admin_pass' w/o spaces payload = """{'admin_pass':'******'}""" expected = """{'admin_pass':'******'}""" self.assertEqual(expected, log.mask_password(payload)) # Test 'admin_pass' with spaces payload = """{ 'admin_pass' : 'mypassword' }""" expected = """{ 'admin_pass' : '***' }""" self.assertEqual(expected, log.mask_password(payload)) # Test 'password' w/o spaces payload = """{'password':'******'}""" expected = """{'password':'******'}""" self.assertEqual(expected, log.mask_password(payload)) # Test 'password' with spaces payload = """{ 'password' : 'mypassword' }""" expected = """{ 'password' : '***' }""" self.assertEqual(expected, log.mask_password(payload))
def test_xml_attribute(self): # Test 'adminPass' w/o spaces payload = """adminPass='******'""" expected = """adminPass='******'""" self.assertEqual(expected, log.mask_password(payload)) # Test 'adminPass' with spaces payload = """adminPass = '******'""" expected = """adminPass = '******'""" self.assertEqual(expected, log.mask_password(payload)) # Test 'adminPass' with double quotes payload = """adminPass = "******"""" expected = """adminPass = "******"""" self.assertEqual(expected, log.mask_password(payload)) # Test 'admin_pass' w/o spaces payload = """admin_pass='******'""" expected = """admin_pass='******'""" self.assertEqual(expected, log.mask_password(payload)) # Test 'admin_pass' with spaces payload = """admin_pass = '******'""" expected = """admin_pass = '******'""" self.assertEqual(expected, log.mask_password(payload)) # Test 'admin_pass' with double quotes payload = """admin_pass = "******"""" expected = """admin_pass = "******"""" self.assertEqual(expected, log.mask_password(payload)) # Test 'password' w/o spaces payload = """password='******'""" expected = """password='******'""" self.assertEqual(expected, log.mask_password(payload)) # Test 'password' with spaces payload = """password = '******'""" expected = """password = '******'""" self.assertEqual(expected, log.mask_password(payload)) # Test 'password' with double quotes payload = """password = "******"""" expected = """password = "******"""" self.assertEqual(expected, log.mask_password(payload))
def test_mask_password(self): payload = "test = 'password' : 'aaaaaa'" expected = "test = 'password' : '111'" self.assertEqual(expected, log.mask_password(payload, secret='111')) payload = 'test = "original_password" : "aaaaaaaaa"' expected = 'test = "original_password" : "***"' self.assertEqual(expected, log.mask_password(payload)) payload = 'test = "param1" : "value"' expected = 'test = "param1" : "value"' self.assertEqual(expected, log.mask_password(payload)) payload = """{'adminPass':'******'}""" payload = six.text_type(payload) expected = """{'adminPass':'******'}""" self.assertEqual(expected, log.mask_password(payload)) payload = ("test = 'node.session.auth.password','-v','mypassword'," "'nomask'") expected = ("test = 'node.session.auth.password','-v','***'," "'nomask'") self.assertEqual(expected, log.mask_password(payload)) payload = ("test = 'node.session.auth.password', '--password', " "'mypassword', 'nomask'") expected = ("test = 'node.session.auth.password', '--password', " "'***', 'nomask'") self.assertEqual(expected, log.mask_password(payload)) payload = "test = node.session.auth.password -v mypassword nomask" expected = "test = node.session.auth.password -v *** nomask" self.assertEqual(expected, log.mask_password(payload)) payload = ("test = node.session.auth.password --password mypassword " "nomask") expected = ("test = node.session.auth.password --password *** " "nomask") self.assertEqual(expected, log.mask_password(payload))
def execute(*cmd, **kwargs): """Helper method to shell out and execute a command through subprocess. Allows optional retry. :param cmd: Passed to subprocess.Popen. :type cmd: string :param process_input: Send to opened process. :type process_input: string :param env_variables: Environment variables and their values that will be set for the process. :type env_variables: dict :param check_exit_code: Single bool, int, or list of allowed exit codes. Defaults to [0]. Raise :class:`ProcessExecutionError` unless program exits with one of these code. :type check_exit_code: boolean, int, or [int] :param delay_on_retry: True | False. Defaults to True. If set to True, wait a short amount of time before retrying. :type delay_on_retry: boolean :param attempts: How many times to retry cmd. :type attempts: int :param run_as_root: True | False. Defaults to False. If set to True, the command is prefixed by the command specified in the root_helper kwarg. :type run_as_root: boolean :param root_helper: command to prefix to commands called with run_as_root=True :type root_helper: string :param shell: whether or not there should be a shell used to execute this command. Defaults to false. :type shell: boolean :param loglevel: log level for execute commands. :type loglevel: int. (Should be stdlib_logging.DEBUG or stdlib_logging.INFO) :returns: (stdout, stderr) from process execution :raises: :class:`UnknownArgumentError` on receiving unknown arguments :raises: :class:`ProcessExecutionError` """ process_input = kwargs.pop('process_input', None) env_variables = kwargs.pop('env_variables', None) check_exit_code = kwargs.pop('check_exit_code', [0]) ignore_exit_code = False delay_on_retry = kwargs.pop('delay_on_retry', True) attempts = kwargs.pop('attempts', 1) run_as_root = kwargs.pop('run_as_root', False) root_helper = kwargs.pop('root_helper', '') shell = kwargs.pop('shell', False) loglevel = kwargs.pop('loglevel', stdlib_logging.DEBUG) if isinstance(check_exit_code, bool): ignore_exit_code = not check_exit_code check_exit_code = [0] elif isinstance(check_exit_code, int): check_exit_code = [check_exit_code] if kwargs: raise UnknownArgumentError(_('Got unknown keyword args ' 'to utils.execute: %r') % kwargs) if run_as_root and hasattr(os, 'geteuid') and os.geteuid() != 0: if not root_helper: raise NoRootWrapSpecified( message=_('Command requested root, but did not ' 'specify a root helper.')) cmd = shlex.split(root_helper) + list(cmd) cmd = map(str, cmd) while attempts > 0: attempts -= 1 try: LOG.log(loglevel, 'Running cmd (subprocess): %s', ' '.join(logging.mask_password(cmd))) _PIPE = subprocess.PIPE # pylint: disable=E1101 if os.name == 'nt': preexec_fn = None close_fds = False else: preexec_fn = _subprocess_setup close_fds = True obj = subprocess.Popen(cmd, stdin=_PIPE, stdout=_PIPE, stderr=_PIPE, close_fds=close_fds, preexec_fn=preexec_fn, shell=shell, env=env_variables) result = None for _i in six.moves.range(20): # NOTE(russellb) 20 is an arbitrary number of retries to # prevent any chance of looping forever here. try: if process_input is not None: result = obj.communicate(process_input) else: result = obj.communicate() except OSError as e: if e.errno in (errno.EAGAIN, errno.EINTR): continue raise break obj.stdin.close() # pylint: disable=E1101 _returncode = obj.returncode # pylint: disable=E1101 LOG.log(loglevel, 'Result was %s' % _returncode) if not ignore_exit_code and _returncode not in check_exit_code: (stdout, stderr) = result raise ProcessExecutionError(exit_code=_returncode, stdout=stdout, stderr=stderr, cmd=' '.join(cmd)) return result except ProcessExecutionError: if not attempts: raise else: LOG.log(loglevel, '%r failed. Retrying.', cmd) if delay_on_retry: greenthread.sleep(random.randint(20, 200) / 100.0) finally: # NOTE(termie): this appears to be necessary to let the subprocess # call clean something up in between calls, without # it two execute calls in a row hangs the second one greenthread.sleep(0)