#!/usr/bin/env python3 import subprocess class CommandUtils: @staticmethod def findFile(filename, sourcePath): (out, _, _) = CommandUtils.runBashCmd( f"find -L {sourcePath} -name {filename} -not -type d", capture=True, ignore_rc=True, ) """ We don't check the return val here because find could return 1 but still be able to find the result. We shouldn't blindly return None without even checking the result. The reason we want to suppress this is because for built RPMs, we first copy it to the location with a random name and move it to the real name. find will complain our action and return 1. find's flag ignore_readdir_race can suppress this but it isn't working. https://bugs.centos.org/view.php?id=13685 """ return out.split() if out else None @staticmethod def runBashCmd( cmd, logfile=None, logfn=None, capture=False, ignore_rc=False ): fp = None if logfile: fp = open(logfile, "w") elif capture or logfn: fp = subprocess.PIPE stdout = fp sp = subprocess.Popen( cmd, shell=True, executable="/bin/bash", stdout=stdout, stderr=stdout, ) out, err = sp.communicate() rc = sp.wait() out = out.decode() if out else "" err = err.decode() if err else "" if logfn: logfn(out) if logfile: fp.close() if rc and not ignore_rc: print(f"Stdout: {out}\nStderr: {err}") raise Exception(f"Error while running:\n{cmd}") return out, err, rc @staticmethod def strtobool(val): val = val.lower() if val in ("y", "yes", "t", "true", "on", "1", "enable"): return 1 if val in ("n", "no", "f", "false", "off", "0", "disable"): return 0 raise ValueError("invalid truth value {!r}".format(val))