|
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
|