Example #1
0
 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))
Example #2
0
 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))
Example #3
0
 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))
Example #4
0
    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))
Example #5
0
    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))
Example #6
0
    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))
Example #7
0
 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))
Example #8
0
    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))
Example #9
0
 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))
Example #10
0
 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))
Example #11
0
 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))
Example #12
0
 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))
Example #13
0
    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)