X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=salomeTools.py;h=02f1dab206848057ae9d6b5a95e5a5d0d943e0c9;hb=e11c874952247cf9040069f8c730199d208bd547;hp=41d109c366b79f6588bf4db7fc420e4b89b5c94a;hpb=f9f6b3e70f68fed49762105d9ff8526b2b12b67b;p=tools%2Fsat.git diff --git a/salomeTools.py b/salomeTools.py index 41d109c..02f1dab 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,19 +76,23 @@ 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 ''' - def __init__(self, opt='', dataDir=None): + def __init__(self, opt='', datadir=None): '''Initialization :param opt str: The sat options - :param: dataDir str : the directory that contain all the external + :param: datadir str : the directory that contain all the external data (like software pyconf and software scripts) ''' # Read the salomeTools options (the list of possible options is @@ -103,7 +108,7 @@ class Sat(object): self.cfg = None # the config that will be read using pyconf module self.arguments = opt self.options = options # the options passed to salomeTools - self.dataDir = dataDir # default value will be /data + self.datadir = datadir # default value will be /data # set the commands by calling the dedicated function self._setCommands(cmdsdir) @@ -135,59 +140,164 @@ 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: + 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 :param args str: The directory path containing the commands ''' - argv = args.split(" ") + # Make sure the internationalization is available + gettext.install('salomeTools', os.path.join(satdir, 'src', 'i18n')) + # Get the arguments in a list and remove the empty elements + 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, + self.cfg = cfgManager.get_config(datadir=self.datadir, application=appliToLoad, options=self.options, command=__nameCmd__) - + + # 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) + # 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 + 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, unless the command is called - # with a logger as parameter + # create log file 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) + + # 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 + os.path.sep + 'sat', - self.arguments.split(' ')[0], + __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 is None: + 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 @@ -265,9 +375,9 @@ 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) + self.cfg = cfgManager.get_config(datadir=self.datadir) # Check if this command exists if not hasattr(self, command):