Salome HOME
add sat log on http.server 8765
authorChristian Van Wambeke <christian.van-wambeke@cea.fr>
Fri, 10 Dec 2021 13:41:46 +0000 (14:41 +0100)
committercrouzet <nicolas.crouzet@cea.fr>
Fri, 8 Apr 2022 09:38:26 +0000 (11:38 +0200)
12 files changed:
commands/log.py
commands/source.py
src/ElementTree.py
src/debug.py
src/system.py
src/xmlManager.py
src/xsl/command.xsl
src/xsl/hat.xsl
src/xsl/jobs_board_report.xsl
src/xsl/jobs_global_report.xsl
src/xsl/test.xsl
src/xsl/test_history.xsl

index e2c190286d34ea16b72cd2656fe3f9f5e935a3f4..22a788570fc8fa85895c4ea82891a55e1b865ba6 100644 (file)
@@ -347,7 +347,7 @@ def run(args, runner, logger):
     # open the hat xml in the user editor
     if not options.no_browser:
         logger.write(_("\nOpening the hat log file %s\n" % xmlHatFilePath), 3)
-        src.system.show_in_editor(runner.cfg.USER.browser, xmlHatFilePath, logger)
+        src.system.show_in_webbrowser(runner.cfg.USER.browser, xmlHatFilePath, logger)
     else:
         logger.write("\nHat log File is %s\n" % xmlHatFilePath, 3)
     return 0
index 2b078cda46c5360f7127a3fe5764c262d723cbd0..0740ba125b90b3e9b43bea86b8920025beaa47c9 100644 (file)
@@ -120,8 +120,8 @@ def get_source_from_git(config,
     git_options= ''
     if "git_options" in product_info.git_info:
         git_options = product_info.git_info.git_options
-    sub_dir = None
 
+    sub_dir = None
     # what do we do with git tree structure and history
     if is_dev and "sub_dir" in product_info.git_info:
         logger.error("dev mode for product is incompatible with 'sub_dir' option")
@@ -130,10 +130,10 @@ def get_source_from_git(config,
     if not is_dev and "sub_dir" in product_info.git_info:
         sub_dir = product_info.git_info.sub_dir
 
-    if sub_dir  is None:
+    if sub_dir is None:
       # Call the system function that do the extraction in git mode
       retcode = src.system.git_extract(repo_git,
-                                   product_info.git_info.tag,git_options,
+                                   product_info.git_info.tag, git_options,
                                    source_dir, logger, environ)
     else:
       # Call the system function that do the extraction of a sub_dir in git mode
@@ -376,7 +376,7 @@ def get_product_sources(config,
 
     if product_info.get_source == "git":
         return get_source_from_git(config, product_info, source_dir, logger, pad, 
-                                    is_dev,env_appli)
+                                    is_dev, env_appli)
 
     if product_info.get_source == "archive":
         return get_source_from_archive(config, product_info, source_dir, logger)
@@ -386,20 +386,13 @@ def get_product_sources(config,
     
     if product_info.get_source == "cvs":
         cvs_user = config.USER.cvs_user
-        return get_source_from_cvs(cvs_user, 
-                                    product_info, 
-                                    source_dir, 
-                                    checkout, 
-                                    logger,
-                                    pad,
-                                    env_appli)
+        return get_source_from_cvs(cvs_user, product_info, source_dir, 
+                                    checkout, logger, pad, env_appli)
 
     if product_info.get_source == "svn":
         svn_user = config.USER.svn_user
         return get_source_from_svn(svn_user, product_info, source_dir, 
-                                    checkout,
-                                    logger,
-                                    env_appli)
+                                    checkout, logger, env_appli)
 
     if product_info.get_source == "native":
         # for native products we check the corresponding system packages are installed
@@ -487,12 +480,8 @@ def get_all_product_sources(config, products, logger):
             continue
 
         # Call to the function that get the sources for one product
-        retcode = get_product_sources(config, 
-                                     product_info, 
-                                     is_dev, 
-                                     source_dir,
-                                     logger, 
-                                     max_product_name_len, 
+        retcode = get_product_sources(config, product_info, is_dev, 
+                                     source_dir, logger, max_product_name_len, 
                                      checkout=False)
         
         '''
@@ -583,9 +572,7 @@ def run(args, runner, logger):
     products_infos = src.product.get_products_list(options, runner.cfg, logger)
     
     # Call to the function that gets all the sources
-    good_result, results = get_all_product_sources(runner.cfg, 
-                                                  products_infos,
-                                                  logger)
+    good_result, results = get_all_product_sources(runner.cfg, products_infos, logger)
 
     # Display the results (how much passed, how much failed, etc...)
     status = src.OK_STATUS
index 8b1b92bf8f5c17bd0aa330263cbf4784e54ef3bb..b871200f6461694aa6ff92d2fa83ab6bf8576130 100644 (file)
@@ -13,14 +13,14 @@ _versionPython = sys.version_info[0]
 if _versionPython < 3:
   # python2 previous historic mode
   import src.ElementTreePython2 as etree
-  DBG.write("ElementTree Python2", etree.__file__, DBG.isDeveloper())
+  DBG.write("ElementTree Python2 %s" % etree.VERSION, etree.__file__, DBG.isDeveloper())
   tostring = etree.tostring
 
 else:
   # python3 mode
   # import xml.etree.ElementTree as etree # native version
   import src.ElementTreePython3 as etree # VERSION 1.3.0 plus _serialize 'pretty_xml'
-  DBG.write("ElementTree Python3 VERSION 1.3.0", etree.__file__, DBG.isDeveloper())
+  DBG.write("ElementTree Python3 %s" % etree.VERSION, etree.__file__, DBG.isDeveloper())
 
   def tostring(node, encoding='utf-8'):
     """
index 1fbdcd47b39827ac27eed8a147492be0b651dc7d..330fb6df37c33468237c5c49f03f4e04528161b4 100755 (executable)
@@ -72,14 +72,17 @@ except ImportError:
 
 _debug = [False] #support push/pop for temporary activate debug outputs
 
-# wambeke is christian at home
-_developers = ["xchristian", "xwambeke"]
-
 
 def isDeveloper():
-    """if you are a developer, sometimes you want verbose traces etc."""
-    res = src.architecture.get_user()  in _developers
-    return res
+    """
+    if you are a developer, sometimes you want verbose traces unconditionally
+    export SAT_DEVELOPER_MODE=1 before launch sat command to do that
+    """
+    res = os.getenv("SAT_DEVELOPER_MODE", "0")
+    if res in "YES yes 1 Y y".split():
+        return True
+    else:
+        return False
 
 def indent(text, amount=2, ch=' '):
     """indent multi lines message"""
@@ -148,7 +151,7 @@ def format_exception(msg, limit=None, trace=None):
   """
   Format a stack trace and the exception information.
   as traceback.format_exception(), without color
-  with traceback only if (_debug) or (DBG._user in DBG._developers)
+  with traceback only if (_debug) or (DBG.isDeveloper())
   """
   etype, value, tb = sys.exc_info()
   res = msg
index c54452b4343efdadb1742d26ce59687418b4785d..553aab9100c0ba2d063a9ebabdcbd10531f87c85 100644 (file)
@@ -22,9 +22,12 @@ like open a browser or an editor, or call a git command
 '''
 
 import os
-import subprocess
+import subprocess as SP
 import time
 import tarfile
+import psutil
+import time
 
 import debug as DBG
 import utilsSat as UTS
@@ -49,21 +52,62 @@ def show_in_editor(editor, filePath, logger):
         # launch cmd using subprocess.Popen
         cmd = editor % filePath
         logger.write('Launched command:\n' + cmd + '\n', 5)
-        p = subprocess.Popen(cmd, shell=True)
+        p = SP.Popen(cmd, shell=True)
         p.communicate()
     except:
         logger.write(printcolors.printcError(_("Unable to edit file %s\n") 
                                              % filePath), 1)
 
+def show_in_webbrowser(editor, filePath, logger):
+    '''open filePath using web browser firefox, chromium etc...
+    if file is xml, previous http sever is done before to fix new security problems
+    
+    :param editor str: The web browser to use.
+    :param filePath str: The path to the file to open.
+    '''
+    # default editor is firefox
+    if editor is None or len(editor) == 0:
+        editor = 'firefox'
+    
+    path, namefile = os.path.split(filePath)
+    basefile, ext = os.path.splitext(namefile)
+
+    # previouly http.server 8765 kill ... or not ? TODO wait and see REX
+    for proc in psutil.process_iter():
+      # help(proc)
+      cmdline = " ".join(proc.cmdline())
+      if "python3 -m http.server 8765" in cmdline:
+        print("kill previous process '%s'" % cmdline)
+        proc.kill()  # TODO may be not owner ? -> change 8765+n
+        
+    # The argument -u will make it so that stdout and stderr are not buffered 
+    # and will be written in real time.
+    cmd = """
+set -x
+cd %(path)s
+python3 -m http.server 8765 &> /dev/null &
+%(editor)s http://localhost:8765/%(namefile)s
+""" % {"path": path, "editor": editor, "namefile": namefile}
+
+    # print("show_in_webbrowser:\n%s" % cmd)
+    
+    try:
+        # launch cmd using subprocess.Popen
+        logger.write('Launched command:\n%s\n' % cmd, 5)
+        p = SP.Popen(cmd, shell=True, stdout=SP.PIPE, stderr=SP.STDOUT)
+        res_out, res_err = p.communicate() # res_err = None as stderr=SP.STDOUT
+        # print("Launched command stdout:\n%s" % res_out)
+    except Exception as e:
+        logger.write(printcolors.printcError(_("Unable to display file %s\n%s\n") 
+                                             % (filePath, e)), 1)
+    
+
 def git_describe(repo_path):
     '''Use git describe --tags command to return tag description of the git repository"
     :param repo_path str: The git repository to describe
     '''
     git_cmd="cd %s;git describe --tags" % repo_path
-    p = subprocess.Popen(git_cmd, shell=True,
-                    stdin=subprocess.PIPE,
-                    stdout=subprocess.PIPE,
-                    stderr=subprocess.PIPE)
+    p = SP.Popen(git_cmd, shell=True, stdin=SP.PIPE, stdout=SP.PIPE, stderr=SP.PIPE)
     p.wait()
     if p.returncode != 0:
         return False
@@ -99,7 +143,9 @@ def git_extract(from_what, tag, git_options, where, logger, environment=None):
 set -x
 git clone %(git_options)s %(remote)s %(where)s
 res=$?
-if [ $res -eq 0 ]; then   touch -d "$(git --git-dir=%(where_git)s  log -1 --format=date_format)" %(where)s;fi
+if [ $res -eq 0 ]; then
+  touch -d "$(git --git-dir=%(where_git)s  log -1 --format=date_format)" %(where)s
+fi
 exit $res
 """
     cmd = cmd % {'git_options': git_options, 'remote': from_what, 'tag': tag, 'where': str(where), 'where_git': where_git}
@@ -116,8 +162,10 @@ rm -rf %(where)s
 git clone %(git_options)s %(remote)s %(where)s && \
 git --git-dir=%(where_git)s --work-tree=%(where)s checkout %(tag)s
 res=$?
-git --git-dir=%(where_git)s status|grep HEAD
-if [ $res -eq 0 -a $? -ne 0 ]; then   touch -d "$(git --git-dir=%(where_git)s  log -1 --format=date_format)" %(where)s;fi
+git --git-dir=%(where_git)s status | grep HEAD
+if [ $res -eq 0 -a $? -ne 0 ]; then
+  touch -d "$(git --git-dir=%(where_git)s  log -1 --format=date_format)" %(where)s
+fi
 exit $res
 """
     cmd = cmd % {'git_options': git_options,
@@ -127,7 +175,7 @@ exit $res
                  'where_git': where_git}
 
 
-  cmd=cmd.replace('date_format','"%ai"')
+  cmd=cmd.replace('date_format', '"%ai"')
   logger.logTxtFile.write("\n" + cmd + "\n")
   logger.logTxtFile.flush()
 
@@ -279,12 +327,11 @@ def cvs_extract(protocol, user, server, base, tag, product, where,
 
     logger.logTxtFile.write("\n" + command + "\n")
     logger.logTxtFile.flush()        
-    res = subprocess.call(command,
-                          cwd=str(where.dir()),
-                          env=environment.environ.environ,
-                          shell=True,
-                          stdout=logger.logTxtFile,
-                          stderr=subprocess.STDOUT)
+    res = SP.call(command, cwd=str(where.dir()),
+                           env=environment.environ.environ,
+                           shell=True,
+                           stdout=logger.logTxtFile,
+                           stderr=SP.STDOUT)
     return (res == 0)
 
 def svn_extract(user,
@@ -331,12 +378,11 @@ def svn_extract(user,
     logger.write(command + "\n", 5)
     logger.logTxtFile.write("\n" + command + "\n")
     logger.logTxtFile.flush()
-    res = subprocess.call(command,
-                          cwd=str(where.dir()),
-                          env=environment.environ.environ,
-                          shell=True,
-                          stdout=logger.logTxtFile,
-                          stderr=subprocess.STDOUT)
+    res = SP.call(command, cwd=str(where.dir()),
+                           env=environment.environ.environ,
+                           shell=True,
+                           stdout=logger.logTxtFile,
+                           stderr=SP.STDOUT)
     return (res == 0)
 
 def get_pkg_check_cmd(dist_name):
@@ -354,12 +400,12 @@ def get_pkg_check_cmd(dist_name):
     cmd_which_apt=["which", "apt"]
     with open(os.devnull, 'w') as devnull:
         # 1) we search for apt (debian based systems)
-        completed=subprocess.call(cmd_which_apt,stdout=devnull, stderr=subprocess.STDOUT)
+        completed=SP.call(cmd_which_apt,stdout=devnull, stderr=SP.STDOUT)
         if completed==0 and linux=="DB":
             cmd_is_package_installed=["apt", "list", "--installed"]
         else:
             # 2) if apt not found search for rpm (redhat)
-            completed=subprocess.call(cmd_which_rpm,stdout=devnull, stderr=subprocess.STDOUT) # only 3.8! ,capture_output=True)
+            completed=SP.call(cmd_which_rpm,stdout=devnull, stderr=SP.STDOUT) # only 3.8! ,capture_output=True)
             if completed==0 and linux=="RH":
                 cmd_is_package_installed=["rpm", "-q"]
             else:
@@ -389,19 +435,15 @@ def check_system_pkg(check_cmd,pkg):
         # also apt do not return status, we need to use grep
         # and apt output is too messy for being used 
         cmd_is_package_installed[-1]+="*" # we don't specify in pyconf the exact name because of version numbers
-        p=subprocess.Popen(cmd_is_package_installed,
-                           stdout=subprocess.PIPE,
-                           stderr=FNULL)
+        p=SP.Popen(cmd_is_package_installed, stdout=SP.PIPE, stderr=FNULL)
         try:
-            output = subprocess.check_output(['grep', pkg], stdin=p.stdout)
+            output = SP.check_output(['grep', pkg], stdin=p.stdout)
             msg_status=src.printcolors.printcSuccess("OK")
         except:
             msg_status=src.printcolors.printcError("KO")
             msg_status+=" (package is not installed!)\n"
     else:
-        p=subprocess.Popen(cmd_is_package_installed,
-                           stdout=subprocess.PIPE,
-                           stderr=FNULL)
+        p=SP.Popen(cmd_is_package_installed, stdout=SP.PIPE, stderr=FNULL)
         output, err = p.communicate()
         rc = p.returncode
         if rc==0:
index 4b4fa61cfc08152cc98c29eb82b9f17756859910..6a4bb660eebf4ec231cedc40f0b753724116654a 100644 (file)
@@ -61,7 +61,12 @@ class XmlLogFile(object):
           with open(log_file_path, 'w') as f:
             f.write("<?xml version='1.0' encoding='utf-8'?>\n")
             if stylesheet:
-                f.write("<?xml-stylesheet type='text/xsl' href='%s'?>\n" %  stylesheet)
+                # example as href='./hat.xsl' 
+                # as local file xml with local file xsl
+                # with 'python3 -m http.server 8765 &' and
+                # 'chromium-browser http://localhost:8765/hat.xml' or
+                # 'firefox http://localhost:8765/hat.xml'
+                f.write("<?xml-stylesheet type='text/xsl' href='./%s'?>\n" %  stylesheet)
                 pass
             res= etree.tostring(self.xmlroot, encoding='utf-8')
             f.write(res)
index aab7b647b60d9e36ff1b3c56b4483390b79c02b7..1f5e1c01aba1d219c7ec79358a4a77795571e0d5 100644 (file)
                        border-collapse:collapse;
                        empty-cells : show;
                      }
-         td          { vertical-align : center; padding: 15px; }
+         td          { vertical-align : center; padding: 10px; }
          h1          { text-align : center; font-style: italic; font-size: 20px; }
          .legend     { font-weight : bold;
                        text-align : center;
                      } 
-         .def        { font-family: Arial, Verdana, "Times New Roman", Times, serif;}
+         .def        { font-family: monospace;}
          hr.note     { color: #BFBFBF; }
          .note       { text-align : right; font-style: italic; font-size: small; }
          div.release { -moz-column-count: 2;
index 87931fcd123e99447e8c848734f4e658784fee3a..0683a3866eee4a28ab4e4322ee9f02a7e29d7e2e 100644 (file)
@@ -7,17 +7,18 @@
     <title>SAlomeTools log</title>
     <style type="text/css">
         table       { 
-                      margin:1px;
-                      padding:1px;
+                      margin: 1px;
+                      padding: 1px;
                       border-collapse:collapse;
                       empty-cells : show;
                     }
-        td          { vertical-align : center;}
+        td          { vertical-align : center; text-align : left; font-size: 15px; padding: 5px;}
+        th          { vertical-align : center; text-align : left; font-weight : bold; font-size: 18px; padding: 10px;}
         h1          { text-align : center; font-style: italic; }
         .legend     { font-weight : bold;
                       text-align : center;
                     } 
-        .def        { font-family: Arial, Verdana, "Times New Roman", Times, serif;}
+        .def        { font-family: monospace, Arial, Verdana, "Times New Roman", Times, serif;}
         hr.note     { color: #BFBFBF; }
         .note       { text-align : right; font-style: italic; font-size: small; }
         div.release { -moz-column-count: 2;
                        </xsl:choose>
                        <table border="1">
                                <tr>
-                               <td width="100px" bgcolor="Beige">Command</td><td width="100px" bgcolor="Beige">date</td><td width="100px" bgcolor="Beige">time</td><td bgcolor="Beige">application</td><td bgcolor="Beige">full command</td>
+                                 <th bgcolor="Beige">Command</th>
+          <th bgcolor="Beige">date</th>
+          <th bgcolor="Beige">time</th>
+          <th bgcolor="Beige">application</th>
+          <th bgcolor="Beige">full command</th>
                                </tr>
                                <xsl:for-each select="LOGlist/LogCommand">
                                        <xsl:sort select="." order="descending" />
index ea60ca4204b15c823624bb42307f289b1ad7a16c..5a94a39cd6a4e39812fe4b906a7dc4f56f05c132 100644 (file)
@@ -74,7 +74,7 @@
     h4            { text-align : left; font-size: small; font-weight: bold; display: inline; }
     h_err         { text-align : left; font-size: small; font-weight: normal; display: inline;         color: red; }
     .legend       { text-align : center; } 
-    .def        { font-family: Arial, Verdana, "Times New Roman", Times, serif;}
+    .def        { font-family: monospace, Arial, Verdana, "Times New Roman", Times, serif;}
    
 </style>
 
index 9b7e80001e9080a78574128508c850c4b1762c46..79873e671891128eef2a2551e25df8d660f2592d 100644 (file)
@@ -74,7 +74,7 @@
     h4            { text-align : left; font-size: small; font-weight: bold; display: inline; }
     h_err         { text-align : left; font-size: small; font-weight: normal; display: inline;         color: red; }
     .legend       { text-align : center; } 
-    .def        { font-family: Arial, Verdana, "Times New Roman", Times, serif; background-color:#FFFFCC;}
+    .def        { font-family: monospace, Arial, Verdana, "Times New Roman", Times, serif; background-color:#FFFFCC;}
    
 </style>
 
index 24dbfc5f4bdfced185edc54ecce3ea4354b3002c..96bad114097cbb3aa003cca85b275efc364b8d44 100644 (file)
@@ -7,7 +7,7 @@
 <head>
 <title>Tests of <xsl:value-of select="//product/@name" /></title>
 <style type="text/css">
-    .def        { font-family: Arial, Verdana, "Times New Roman", Times, serif;}
+    .def        { font-family: monospace, Arial, Verdana, "Times New Roman", Times, serif;}
     .OK         { background-color:#00FF00; }
     .KO         { background-color:#FF0000; }
     .KF         { background-color:#FFA500; }
index e46f56db2056005a1e5c6c7f9d59190202be2c7d..7d9ef716f052fa363e2ba74c39f1b5a663f987d9 100644 (file)
@@ -7,7 +7,7 @@
 <head>
 <title>Tests of <xsl:value-of select="//product/@name" /></title>
 <style type="text/css">
-    .def        { font-family: Arial, Verdana, "Times New Roman", Times, serif;}
+    .def        { font-family: monospace, Arial, Verdana, "Times New Roman", Times, serif;}
     .OK         { background-color:#00FF00; }
     .KO         { background-color:#FF0000; }
     .KF         { background-color:#FFA500; }