diff options
-rw-r--r-- | dovetail/container.py | 4 | ||||
-rw-r--r-- | dovetail/utils/dovetail_utils.py | 67 |
2 files changed, 35 insertions, 36 deletions
diff --git a/dovetail/container.py b/dovetail/container.py index 87174727..15e78818 100644 --- a/dovetail/container.py +++ b/dovetail/container.py @@ -20,10 +20,10 @@ class Container: logger = None - def __init__(cls): + def __init__(self): pass - def __str__(cls): + def __str__(self): pass @classmethod diff --git a/dovetail/utils/dovetail_utils.py b/dovetail/utils/dovetail_utils.py index 2d5f0dd1..1c68b7f3 100644 --- a/dovetail/utils/dovetail_utils.py +++ b/dovetail/utils/dovetail_utils.py @@ -15,23 +15,34 @@ import subprocess from collections import Mapping, Set, Sequence +def exec_log(verbose, logger, msg, level, flush=False): + if not verbose: + return + + if logger: + if level == 'info': + logger.info(msg) + elif level == 'error': + logger.error(msg) + elif level == 'debug': + logger.debug(msg) + else: + pass + else: + print(msg) + if flush: + sys.stdout.flush() + + def exec_cmd(cmd, logger=None, exit_on_error=True, info=False, - error_msg="", verbose=True): - if not error_msg: - error_msg = ("The command '%s' failed." % cmd) + err_msg="", verbose=True): + msg_err = ("The command '%s' failed." % cmd) if not err_msg else err_msg msg_exec = ("Executing command: '%s'" % cmd) - if verbose: - if logger: - if info: - logger.info(msg_exec) - else: - logger.debug(msg_exec) - else: - print(msg_exec) - p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, - stderr=subprocess.STDOUT) + level = 'info' if info else 'debug' + exec_log(verbose, logger, msg_exec, level) - # show progress bar + p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, + stderr=subprocess.PIPE) seconds = 0 while p.poll() is None: seconds += 1 @@ -39,29 +50,17 @@ def exec_cmd(cmd, logger=None, exit_on_error=True, info=False, show_progress_bar(seconds) time.sleep(1) - output = p.communicate() - for line in output[0].strip().split('\n'): - line = line.replace('\n', '') - if logger: - if info: - logger.info(line) - else: - logger.debug(line) - else: - print (line) - sys.stdout.flush() - - returncode = p.returncode - if returncode != 0: - if verbose: - if logger: - logger.error(error_msg) - else: - print(error_msg) + (stdout, stderr) = p.communicate() + if p.returncode == 0: + for line in stdout.strip().splitlines(): + exec_log(verbose, logger, line, level, True) + else: + exec_log(verbose, logger, stderr, 'error') + exec_log(verbose, logger, msg_err, 'error') if exit_on_error: sys.exit(1) - return returncode, output[0].strip() + return p.returncode, stdout.strip() # walkthrough the object, yield path and value |