forked from Mirror/pmbootstrap
Replace the "kill_as_root" argument with a much simpler "sudo" argument and remove the now obsolete check for the output mode of "kill_as_root". "kill_as_root" would only get set to True if both conditions are met: a) command is running with sudo b) command is running with an output mode ("log" or "stdout") where pmb.helpers.run_core would kill it if it does not output anything before a timeout is reached The new "sudo" argument just indicates if the command is running with sudo (a), regardless of the output mode (b).
78 lines
2.5 KiB
Python
78 lines
2.5 KiB
Python
# Copyright 2020 Oliver Smith
|
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
|
import shlex
|
|
import pmb.helpers.run_core
|
|
|
|
|
|
def flat_cmd(cmd, working_dir=None, env={}):
|
|
"""
|
|
Convert a shell command passed as list into a flat shell string with
|
|
proper escaping.
|
|
|
|
:param cmd: command as list, e.g. ["echo", "string with spaces"]
|
|
:param working_dir: when set, prepend "cd ...;" to execute the command
|
|
in the given working directory
|
|
:param env: dict of environment variables to be passed to the command, e.g.
|
|
{"JOBS": "5"}
|
|
:returns: the flat string, e.g.
|
|
echo 'string with spaces'
|
|
cd /home/pmos;echo 'string with spaces'
|
|
"""
|
|
# Merge env and cmd into escaped list
|
|
escaped = []
|
|
for key, value in env.items():
|
|
escaped.append(key + "=" + shlex.quote(value))
|
|
for i in range(len(cmd)):
|
|
escaped.append(shlex.quote(cmd[i]))
|
|
|
|
# Prepend working dir
|
|
ret = " ".join(escaped)
|
|
if working_dir:
|
|
ret = "cd " + shlex.quote(working_dir) + ";" + ret
|
|
|
|
return ret
|
|
|
|
|
|
def user(args, cmd, working_dir=None, output="log", output_return=False,
|
|
check=None, env={}, sudo=False):
|
|
"""
|
|
Run a command on the host system as user.
|
|
|
|
:param env: dict of environment variables to be passed to the command, e.g.
|
|
{"JOBS": "5"}
|
|
|
|
See pmb.helpers.run_core.core() for a detailed description of all other
|
|
arguments and the return value.
|
|
"""
|
|
# Readable log message (without all the escaping)
|
|
msg = "% "
|
|
for key, value in env.items():
|
|
msg += key + "=" + value + " "
|
|
if working_dir:
|
|
msg += "cd " + working_dir + "; "
|
|
msg += " ".join(cmd)
|
|
|
|
# Add environment variables and run
|
|
if env:
|
|
cmd = ["sh", "-c", flat_cmd(cmd, env=env)]
|
|
return pmb.helpers.run_core.core(args, msg, cmd, working_dir, output,
|
|
output_return, check, sudo)
|
|
|
|
|
|
def root(args, cmd, working_dir=None, output="log", output_return=False,
|
|
check=None, env={}):
|
|
"""
|
|
Run a command on the host system as root, with sudo.
|
|
|
|
:param env: dict of environment variables to be passed to the command, e.g.
|
|
{"JOBS": "5"}
|
|
|
|
See pmb.helpers.run_core.core() for a detailed description of all other
|
|
arguments and the return value.
|
|
"""
|
|
if env:
|
|
cmd = ["sh", "-c", flat_cmd(cmd, env=env)]
|
|
cmd = ["sudo"] + cmd
|
|
|
|
return user(args, cmd, working_dir, output, output_return, check, env,
|
|
True)
|