blob: 9311c18b1707a1ea7b5cd4e215536299e6cd33eb [file] [log] [blame] [edit]
############################################################################
# Copyright (C) SchedMD LLC.
############################################################################
import shlex
import subprocess
import sys
import time
# SchedMD
from utils.log import (
log,
log_new_line,
)
CMD_HOOK = "CMD: "
# Run functions with stats
def perform(action_desc, function, *args, verbose=True, new_line=False, decor=".."):
log_func = log
nl = ""
if new_line:
log_func = log_new_line
nl = "\n"
# action_desc: ie Cloning Repo, building slurm,
if verbose:
log_func(f"[{decor}{action_desc}{decor}]{nl}")
start = time.perf_counter()
result = function(*args)
finish = time.perf_counter()
time_stat = round(finish - start, 2)
if verbose:
log_func(f"[{decor}{action_desc}{decor}] finished in {time_stat} seconds")
return result
def run_cmd(cmd, env=None, quiet=False, print_output=False, timeout=None, shell=False):
if not quiet:
log(CMD_HOOK + cmd)
# If shell is specified, then let the shell split and parse the cmd string
if not shell:
cmd = shlex.split(cmd)
if print_output:
std_out = sys.stdout
std_err = sys.stderr
else:
std_out = subprocess.PIPE
std_err = subprocess.PIPE
output = subprocess.run(
cmd,
env=env,
stdout=std_out,
stderr=std_err,
timeout=timeout,
shell=shell,
text=True,
)
if (
not quiet
and not print_output
and output.returncode != 0
and output.stderr != ""
):
log("Error: %s" % output.stderr)
# Access rc from output elsewhere with output.returncode
return output
def run_cmd_or_exit(
cmd, msg, rc=0, quiet=False, print_output=False, timeout=None, shell=False
):
output = run_cmd(
cmd, quiet=quiet, print_output=print_output, timeout=timeout, shell=shell
)
if output.returncode != rc:
log(f"{msg}")
log(f"'{cmd}' failed with returncode {output.returncode}")
log(f"stderr: {output.stderr}")
log(f"stdout: {output.stdout}")
sys.exit("Exiting")
else:
return output