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