Blame cloudinit/subp.py

Packit bc9a3a
# This file is part of cloud-init. See LICENSE file for license information.
Packit bc9a3a
"""Common utility functions for interacting with subprocess."""
Packit bc9a3a
Packit bc9a3a
# TODO move subp shellify and runparts related functions out of util.py
Packit bc9a3a
Packit bc9a3a
import logging
Packit bc9a3a
Packit bc9a3a
LOG = logging.getLogger(__name__)
Packit bc9a3a
Packit bc9a3a
Packit bc9a3a
def prepend_base_command(base_command, commands):
Packit bc9a3a
    """Ensure user-provided commands start with base_command; warn otherwise.
Packit bc9a3a
Packit bc9a3a
    Each command is either a list or string. Perform the following:
Packit bc9a3a
       - If the command is a list, pop the first element if it is None
Packit bc9a3a
       - If the command is a list, insert base_command as the first element if
Packit bc9a3a
         not present.
Packit bc9a3a
       - When the command is a string not starting with 'base-command', warn.
Packit bc9a3a
Packit bc9a3a
    Allow flexibility to provide non-base-command environment/config setup if
Packit bc9a3a
    needed.
Packit bc9a3a
Packit bc9a3a
    @commands: List of commands. Each command element is a list or string.
Packit bc9a3a
Packit bc9a3a
    @return: List of 'fixed up' commands.
Packit bc9a3a
    @raise: TypeError on invalid config item type.
Packit bc9a3a
    """
Packit bc9a3a
    warnings = []
Packit bc9a3a
    errors = []
Packit bc9a3a
    fixed_commands = []
Packit bc9a3a
    for command in commands:
Packit bc9a3a
        if isinstance(command, list):
Packit bc9a3a
            if command[0] is None:  # Avoid warnings by specifying None
Packit bc9a3a
                command = command[1:]
Packit bc9a3a
            elif command[0] != base_command:  # Automatically prepend
Packit bc9a3a
                command.insert(0, base_command)
Packit bc9a3a
        elif isinstance(command, str):
Packit bc9a3a
            if not command.startswith('%s ' % base_command):
Packit bc9a3a
                warnings.append(command)
Packit bc9a3a
        else:
Packit bc9a3a
            errors.append(str(command))
Packit bc9a3a
            continue
Packit bc9a3a
        fixed_commands.append(command)
Packit bc9a3a
Packit bc9a3a
    if warnings:
Packit bc9a3a
        LOG.warning(
Packit bc9a3a
            'Non-%s commands in %s config:\n%s',
Packit bc9a3a
            base_command, base_command, '\n'.join(warnings))
Packit bc9a3a
    if errors:
Packit bc9a3a
        raise TypeError(
Packit bc9a3a
            'Invalid {name} config.'
Packit bc9a3a
            ' These commands are not a string or list:\n{errors}'.format(
Packit bc9a3a
                name=base_command, errors='\n'.join(errors)))
Packit bc9a3a
    return fixed_commands
Packit bc9a3a
Packit bc9a3a
Packit bc9a3a
# vi: ts=4 expandtab