X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=system%2Futils.py;h=55a990cc5977df63f4c575ca66c9e12d59f3eba4;hb=refs%2Fheads%2Fmaster;hp=8143b95f686a1db87d5fdc7e5e749edcc9cf7b47;hpb=c8e2f4e3a327181b29521583770a6f0ff68ca6eb;p=tests.git diff --git a/system/utils.py b/system/utils.py index 8143b95..55a990c 100644 --- a/system/utils.py +++ b/system/utils.py @@ -1,7 +1,13 @@ +# -*- python3 -*- # Thierry Parmentelat -# Copyright (C) 2010 INRIA +# Copyright (C) 2015 INRIA # -import time, os, re, glob, sys +import sys +import time +import os +import re +import glob +import subprocess from pprint import PrettyPrinter options={} @@ -13,19 +19,20 @@ def init_options(options_arg): # how could this accept a list again ? def header(message): now = time.strftime("%H:%M:%S", time.localtime()) - print "*", now, '--', message + print("*", now, '--', message) def pprint(message, spec, depth=2): now = time.strftime("%H:%M:%S", time.localtime()) - print ">", now, "--", message + print(">", now, "--", message) PrettyPrinter(indent=8, depth=depth).pprint(spec) - -def system(command, background=False, silent=False, dry_run=None): +# set a default timeout to 15 minutes - this should be plenty even for installations +# call with timeout=None if the intention really is to wait until full completion +def system(command, background=False, silent=False, dry_run=None, timeout=15*60): dry_run = dry_run if dry_run is not None else getattr(options, 'dry_run', False) if dry_run: - print 'dry_run:', command + print('dry_run:', command) return 0 if silent : @@ -35,21 +42,25 @@ def system(command, background=False, silent=False, dry_run=None): if background: command += " &" if silent: - print '.', + print('.', end=' ') sys.stdout.flush() else: now = time.strftime("%H:%M:%S", time.localtime()) # don't show in summary - print "->", now, '--', + print("->", now, '--', end=' ') sys.stdout.flush() if not silent: command = "set -x; " + command - return os.system(command) + try: + return subprocess.call(command, shell=True, timeout=timeout) + except subprocess.TimeoutExpired as e: + header("TIMEOUT when running command {}- {}".format(command, e)) + return -1 ### WARNING : this ALWAYS does its job, even in dry_run mode def output_of (command): - import commands - (code, string) = commands.getstatusoutput(command) + import subprocess + (code, string) = subprocess.getstatusoutput(command) return (code, string) @@ -62,7 +73,7 @@ def match (string, pattern): return re.compile(pattern).match(string) def locate_hooks_scripts (message, path, extensions): - print message, 'searching', path, 'for extensions', extensions + print(message, 'searching', path, 'for extensions', extensions) scripts = [] for ext in extensions: # skip helper programs @@ -74,13 +85,13 @@ def locate_hooks_scripts (message, path, extensions): exclude_options_keys = [ 'ensure_value' , 'read_file', 'read_module' ] def show_options (message, options): now = time.strftime("%H:%M:%S", time.localtime()) - print ">", now, "--", message + print(">", now, "--", message) for k in dir(options): if k.find("_") == 0: continue if k in exclude_options_keys: continue - print " ", k, ":", getattr(options, k) + print(" ", k, ":", getattr(options, k))