X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=salomeTools.py;h=4b25cfa68fdd9ae902fd8f5ced8d13bc7c2b624b;hb=e78f0659aceb8e693fd02b01531215180256543c;hp=3f431284e433f3d5c4b24d690ac136ffab67d666;hpb=612f1bca84eb646c559f1b9058f7bc4fec5add6c;p=tools%2Fsat.git diff --git a/salomeTools.py b/salomeTools.py index 3f43128..4b25cfa 100755 --- a/salomeTools.py +++ b/salomeTools.py @@ -22,6 +22,7 @@ # python imports import os import sys +import tempfile import imp import types import gettext @@ -75,10 +76,14 @@ parser.add_option('o', 'overwrite', 'list', "overwrite", _("overwrites a configuration parameters.")) parser.add_option('g', 'debug', 'boolean', 'debug_mode', _("run salomeTools in debug mode.")) -parser.add_option('l', 'level', 'int', "output_level", - _("change output level (default is 3).")) -parser.add_option('s', 'silent', 'boolean', 'silent', - _("do not write log or show errors.")) +parser.add_option('v', 'verbose', 'int', "output_verbose_level", + _("change output verbose level (default is 3).")) +parser.add_option('b', 'batch', 'boolean', "batch", + _("batch mode (no question).")) +parser.add_option('t', 'all_in_terminal', 'boolean', "all_in_terminal", + _("All traces in the terminal (for example compilation logs).")) +parser.add_option('l', 'logs_paths_in_file', 'string', "logs_paths_in_file", + _("Put the command result and paths to log files in .")) class Sat(object): '''The main class that stores all the commands of salomeTools @@ -135,11 +140,24 @@ class Sat(object): ''' # loop on the commands name for nameCmd in lCommand: + + # Exception for the jobs command that requires the paramiko module + if nameCmd == "jobs": + try: + saveout = sys.stderr + ff = tempfile.TemporaryFile() + sys.stderr = ff + import paramiko + sys.stderr = saveout + except: + sys.stderr = saveout + continue + # load the module that has name nameCmd in dirPath (file_, pathname, description) = imp.find_module(nameCmd, [dirPath]) module = imp.load_module(nameCmd, file_, pathname, description) - def run_command(args='', logger=None): + def run_command(args='', batch = False, verbose = -1, logger_add_link = None): '''The function that will load the configuration (all pyconf) and return the function run of the command corresponding to module @@ -149,43 +167,101 @@ class Sat(object): gettext.install('salomeTools', os.path.join(satdir, 'src', 'i18n')) # Get the arguments in a list and remove the empty elements - argv = args.split(" ") - if argv != ['']: - while "" in argv: argv.remove("") + argv_0 = args.split(" ") + if argv_0 != ['']: + while "" in argv_0: argv_0.remove("") + # Format the argv list in order to prevent strings + # that contain a blank to be separated + argv = [] + elem_old = "" + for elem in argv_0: + if argv == [] or elem_old.startswith("-") or elem.startswith("-"): + argv.append(elem) + else: + argv[-1] += " " + elem + elem_old = elem + # if it is provided by the command line, get the application appliToLoad = None if argv != [''] and argv[0][0] != "-": appliToLoad = argv[0].rstrip('*') argv = argv[1:] - + # read the configuration from all the pyconf files cfgManager = config.ConfigManager() self.cfg = cfgManager.get_config(datadir=self.datadir, application=appliToLoad, options=self.options, command=__nameCmd__) - - # set output level - if self.options.output_level: - self.cfg.USER.output_level = self.options.output_level - if self.cfg.USER.output_level < 1: - self.cfg.USER.output_level = 1 + + # Set the verbose mode if called + if verbose > -1: + verbose_save = self.options.output_verbose_level + self.options.__setattr__("output_verbose_level", verbose) + + # Set batch mode if called + if batch: + batch_save = self.options.batch + self.options.__setattr__("batch", True) - # create log file, unless the command is called - # with a logger as parameter + # set output level + if self.options.output_verbose_level is not None: + self.cfg.USER.output_verbose_level = self.options.output_verbose_level + if self.cfg.USER.output_verbose_level < 1: + self.cfg.USER.output_verbose_level = 0 + silent = (self.cfg.USER.output_verbose_level == 0) + + # create log file + micro_command = False + if logger_add_link: + micro_command = True logger_command = src.logger.Logger(self.cfg, - silent_sysstd=self.options.silent) - if logger: - logger_command = logger + silent_sysstd=silent, + all_in_terminal=self.options.all_in_terminal, + micro_command=micro_command) + + # Check that the path given by the logs_paths_in_file option + # is a file path that can be written + if self.options.logs_paths_in_file: + try: + self.options.logs_paths_in_file = os.path.abspath( + self.options.logs_paths_in_file) + dir_file = os.path.dirname(self.options.logs_paths_in_file) + if not os.path.exists(dir_file): + os.makedirs(dir_file) + if os.path.exists(self.options.logs_paths_in_file): + os.remove(self.options.logs_paths_in_file) + file_test = open(self.options.logs_paths_in_file, "w") + file_test.close() + except Exception as e: + msg = _("WARNING: the logs_paths_in_file option will " + "not be taken into account.\nHere is the error:") + logger_command.write("%s\n%s\n\n" % (src.printcolors.printcWarning(msg), str(e))) + self.options.logs_paths_in_file = None try: + res = None # Execute the hooks (if there is any) # and run method of the command self.run_hook(__nameCmd__, C_PRE_HOOK, logger_command) res = __module__.run(argv, self, logger_command) self.run_hook(__nameCmd__, C_POST_HOOK, logger_command) - finally: + + # set res if it is not set in the command + if res is None: + res = 0 + + # come back in the original batch mode if + # batch argument was called + if batch: + self.options.__setattr__("batch", batch_save) + + # come back in the original verbose mode if + # verbose argument was called + if verbose > -1: + self.options.__setattr__("output_verbose_level", + verbose_save) # put final attributes in xml log file # (end time, total time, ...) and write it launchedCommand = ' '.join([self.cfg.VARS.salometoolsway + @@ -193,7 +269,40 @@ class Sat(object): 'sat', __nameCmd__, args]) - logger_command.end_write({"launchedCommand" : launchedCommand}) + launchedCommand = launchedCommand.replace('"', "'") + + # Add a link to the parent command + if logger_add_link is not None: + logger_add_link.add_link(logger_command.logFileName, + __nameCmd__, + res, + launchedCommand) + logger_add_link.l_logFiles += logger_command.l_logFiles + + finally: + launchedCommand = ' '.join([self.cfg.VARS.salometoolsway + + os.path.sep + + 'sat', + __nameCmd__, + args]) + launchedCommand = launchedCommand.replace('"', "'") + + # Put the final attributes corresponding to end time and + # Write the file to the hard drive + logger_command.end_write( + {"launchedCommand" : launchedCommand}) + + if res != 0: + res = 1 + # If the logs_paths_in_file was called, write the result + # and log files in the given file path + if self.options.logs_paths_in_file: + file_res = open(self.options.logs_paths_in_file, "w") + file_res.write(str(res) + "\n") + for i, filepath in enumerate(logger_command.l_logFiles): + file_res.write(filepath) + if i < len(logger_command.l_logFiles): + file_res.write("\n") return res @@ -271,7 +380,7 @@ class Sat(object): return # get command name command = opt[0] - # read the configuration from all the pyconf files + # read the configuration from all the pyconf files cfgManager = config.ConfigManager() self.cfg = cfgManager.get_config(datadir=self.datadir)