Salome HOME
sat log: Add the full launched command in the hat file
[tools/sat.git] / src / logger.py
index 3e1e5a1ab3e9d36b1e8e8812712b8bb6f3ee6724..eb2ee58b283a4b3e5e3a227e301ce1822f23f586 100644 (file)
@@ -27,12 +27,17 @@ import src
 from . import printcolors
 from . import xmlManager
 
-logCommandFileExpression = "^[0-9]{8}_+[0-9]{6}_+.*\.xml$"
+log_macro_command_file_expression = "^[0-9]{8}_+[0-9]{6}_+.*\.xml$"
+log_all_command_file_expression = "^.*[0-9]{8}_+[0-9]{6}_+.*\.xml$"
 
 class Logger(object):
     '''Class to handle log mechanism.
     '''
-    def __init__(self, config, silent_sysstd=False, all_in_terminal=False):
+    def __init__(self,
+                 config,
+                 silent_sysstd=False,
+                 all_in_terminal=False,
+                 micro_command = False):
         '''Initialization
         
         :param config pyconf.Config: The global configuration.
@@ -44,12 +49,18 @@ class Logger(object):
         self.silentSysStd = silent_sysstd
         
         # Construct xml log file location for sat prints.
-        logFileName = config.VARS.datehour + "_" + config.VARS.command + ".xml"
-        logFilePath = os.path.join(config.SITE.log.log_dir, logFileName)
+        prefix = ""
+        if micro_command:
+            prefix = "micro_"
+        hour_command_host = (config.VARS.datehour + "_" + 
+                             config.VARS.command + "_" + 
+                             config.VARS.hostname)
+        logFileName = prefix + hour_command_host + ".xml"
+        logFilePath = os.path.join(config.USER.log_dir, logFileName)
         # Construct txt file location in order to log 
         # the external commands calls (cmake, make, git clone, etc...)
-        txtFileName = config.VARS.datehour + "_" + config.VARS.command + ".txt"
-        txtFilePath = os.path.join(config.SITE.log.log_dir, "OUT", txtFileName)
+        txtFileName = prefix + hour_command_host + ".txt"
+        txtFilePath = os.path.join(config.USER.log_dir, "OUT", txtFileName)
         
         src.ensure_path_exists(os.path.dirname(logFilePath))
         src.ensure_path_exists(os.path.dirname(txtFilePath))
@@ -164,6 +175,7 @@ class Logger(object):
         else:
             if self.default_level <= current_output_verbose_level and not self.silentSysStd:
                 sys.stdout.write(message)
+        self.flush()
 
     def error(self, message):
         '''Print an error.
@@ -218,7 +230,7 @@ class Logger(object):
         self.xmlFile.write_tree(stylesheet = "command.xsl")
         
         # Dump the config in a pyconf file in the log directory
-        logDir = self.config.SITE.log.log_dir
+        logDir = self.config.USER.log_dir
         dumpedPyconfFileName = (self.config.VARS.datehour 
                                 + "_" 
                                 + self.config.VARS.command 
@@ -275,25 +287,31 @@ def show_command_log(logFilePath, cmd, application, notShownCommands):
     # When the command is not in notShownCommands, no need to go further :
     # Do not show
     if cmd in notShownCommands:
-        return False, None
+        return False, None, None
  
     # Get the application of the log file
-    logFileXml = src.xmlManager.ReadXmlFile(logFilePath)
+    try:
+        logFileXml = src.xmlManager.ReadXmlFile(logFilePath)
+    except Exception as e:
+        msg = _("WARNING: the log file %s cannot be read:" % logFilePath)
+        sys.stdout.write(printcolors.printcWarning("%s\n%s\n" % (msg, e)))
+        return False, None, None
 
     if 'application' in logFileXml.xmlroot.keys():
         appliLog = logFileXml.xmlroot.get('application')
+        launched_cmd = logFileXml.xmlroot.find('Site').attrib['launchedCommand']
         # if it corresponds, then the log has to be shown
         if appliLog == application:
-            return True, appliLog
+            return True, appliLog, launched_cmd
         elif application != 'None':
-            return False, appliLog
+            return False, appliLog, launched_cmd
         
-        return True, appliLog
+        return True, appliLog, launched_cmd
     
     if application == 'None':
-            return True, None    
+            return True, None, None
         
-    return False, None
+    return False, None, None
 
 def list_log_file(dirPath, expression):
     '''Find all files corresponding to expression in dirPath
@@ -309,19 +327,32 @@ def list_log_file(dirPath, expression):
         sExpr = expression
         oExpr = re.compile(sExpr)
         if oExpr.search(fileName):
+            file_name = fileName
+            if fileName.startswith("micro_"):
+                file_name = fileName[len("micro_"):]
             # get date and hour and format it
-            date_hour_cmd = fileName.split('_')
-            date_not_formated = date_hour_cmd[0]
+            date_hour_cmd_host = file_name.split('_')
+            date_not_formated = date_hour_cmd_host[0]
             date = "%s/%s/%s" % (date_not_formated[6:8], 
                                  date_not_formated[4:6], 
                                  date_not_formated[0:4])
-            hour_not_formated = date_hour_cmd[1]
+            hour_not_formated = date_hour_cmd_host[1]
             hour = "%s:%s:%s" % (hour_not_formated[0:2], 
                                  hour_not_formated[2:4], 
                                  hour_not_formated[4:6])
-            cmd = date_hour_cmd[2][:-len('.xml')]
+            if len(date_hour_cmd_host) < 4:
+                cmd = date_hour_cmd_host[2][:-len('.xml')]
+                host = ""
+            else:
+                cmd = date_hour_cmd_host[2]
+                host = date_hour_cmd_host[3][:-len('.xml')]
             lRes.append((os.path.join(dirPath, fileName), 
-                         date_not_formated, date, hour_not_formated, hour, cmd))
+                         date_not_formated,
+                         date,
+                         hour_not_formated,
+                         hour,
+                         cmd,
+                         host))
     return lRes
 
 def update_hat_xml(logDir, application=None, notShownCommands = []):
@@ -337,9 +368,9 @@ def update_hat_xml(logDir, application=None, notShownCommands = []):
                                     "LOGlist", {"application" : application})
     # parse the log directory to find all the command logs, 
     # then add it to the xml file
-    lLogFile = list_log_file(logDir, logCommandFileExpression)
-    for filePath, _, date, _, hour, cmd in lLogFile:
-        showLog, cmdAppli = show_command_log(filePath, cmd,
+    lLogFile = list_log_file(logDir, log_macro_command_file_expression)
+    for filePath, __, date, __, hour, cmd, __ in lLogFile:
+        showLog, cmdAppli, full_cmd = show_command_log(filePath, cmd,
                                               application, notShownCommands)
         #if cmd not in notShownCommands:
         if showLog:
@@ -349,7 +380,8 @@ def update_hat_xml(logDir, application=None, notShownCommands = []):
                                    attrib = {"date" : date, 
                                              "hour" : hour, 
                                              "cmd" : cmd, 
-                                             "application" : cmdAppli})
+                                             "application" : cmdAppli,
+                                             "full_command" : full_cmd})
     
     # Write the file on the hard drive
     xmlHat.write_tree('hat.xsl')
\ No newline at end of file