/usr/lib/python3/dist-packages/cloudinit/subp.py is in cloud-init 18.2-14-g6d48d265-0ubuntu1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | # This file is part of cloud-init. See LICENSE file for license information.
"""Common utility functions for interacting with subprocess."""
# TODO move subp shellify and runparts related functions out of util.py
import logging
LOG = logging.getLogger(__name__)
def prepend_base_command(base_command, commands):
"""Ensure user-provided commands start with base_command; warn otherwise.
Each command is either a list or string. Perform the following:
- If the command is a list, pop the first element if it is None
- If the command is a list, insert base_command as the first element if
not present.
- When the command is a string not starting with 'base-command', warn.
Allow flexibility to provide non-base-command environment/config setup if
needed.
@commands: List of commands. Each command element is a list or string.
@return: List of 'fixed up' commands.
@raise: TypeError on invalid config item type.
"""
warnings = []
errors = []
fixed_commands = []
for command in commands:
if isinstance(command, list):
if command[0] is None: # Avoid warnings by specifying None
command = command[1:]
elif command[0] != base_command: # Automatically prepend
command.insert(0, base_command)
elif isinstance(command, str):
if not command.startswith('%s ' % base_command):
warnings.append(command)
else:
errors.append(str(command))
continue
fixed_commands.append(command)
if warnings:
LOG.warning(
'Non-%s commands in %s config:\n%s',
base_command, base_command, '\n'.join(warnings))
if errors:
raise TypeError(
'Invalid {name} config.'
' These commands are not a string or list:\n{errors}'.format(
name=base_command, errors='\n'.join(errors)))
return fixed_commands
# vi: ts=4 expandtab
|