Salome HOME
Integration of [CEA 13233] support new xdr.h location
[modules/kernel.git] / bin / salome_utils.py
index a27009a45e81d300c436e11fd996af1bca51291a..80c2adac9fe700dd0ac54f11f299f4892cf62daf 100644 (file)
@@ -1,5 +1,5 @@
 #  -*- coding: iso-8859-1 -*-
 #  -*- coding: iso-8859-1 -*-
-# Copyright (C) 2007-2014  CEA/DEN, EDF R&D, OPEN CASCADE
+# Copyright (C) 2007-2019  CEA/DEN, EDF R&D, OPEN CASCADE
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
@@ -39,6 +39,7 @@ __all__ = [
     'getShortHostName',
     'getAppName',
     'getPortNumber',
     'getShortHostName',
     'getAppName',
     'getPortNumber',
+    'getLogDir',
     'getTmpDir',
     'getHomeDir',
     'generateFileName',
     'getTmpDir',
     'getHomeDir',
     'generateFileName',
@@ -55,10 +56,9 @@ def _try_bool( arg ):
     are supported.
     If <arg> does not represent a boolean, an exception is raised.
     """
     are supported.
     If <arg> does not represent a boolean, an exception is raised.
     """
-    import types
-    if type( arg ) == types.BooleanType  :
+    if isinstance(arg, bool)  :
         return arg
         return arg
-    elif type( arg ) == types.StringType  :
+    elif isinstance(arg, (str, bytes)):
         v = str( arg ).lower()
         if   v in [ "yes", "y", "true"  ]: return True
         elif v in [ "no",  "n", "false" ]: return False
         v = str( arg ).lower()
         if   v in [ "yes", "y", "true"  ]: return True
         elif v in [ "no",  "n", "false" ]: return False
@@ -71,7 +71,7 @@ def getORBcfgInfo():
     """
     Get omniORB current configuration.
     Returns a list of three values: [ orb_version, host_name, port_number ].
     """
     Get omniORB current configuration.
     Returns a list of three values: [ orb_version, host_name, port_number ].
-    
+
     The information is retrieved from the omniORB configuration file defined
     by the OMNIORB_CONFIG environment variable.
     If omniORB configuration file can not be accessed, a list of three empty
     The information is retrieved from the omniORB configuration file defined
     by the OMNIORB_CONFIG environment variable.
     If omniORB configuration file can not be accessed, a list of three empty
@@ -125,12 +125,18 @@ def getPortFromORBcfg():
 def getUserName():
     """
     Get user name:
 def getUserName():
     """
     Get user name:
-    1. try USER environment variable
-    2. if fails, return 'unknown' as default user name
+    1. try USER environment variable (USERNAME on windows)
+    2. if fails, try LOGNAME (un*x)
+    3. if fails return 'unknown' as default user name
     """
     """
-    import os
-    return os.getenv( "USER", "unknown" ) # 'unknown' is default user name
-
+    import os, sys
+    if sys.platform == "win32":
+        return os.getenv("USERNAME", "unknown")
+    else:
+        user = os.getenv("USER")
+        if user:
+            return user
+        return os.getenv("LOGNAME", "unknown")
 # ---
 
 def getHostName():
 # ---
 
 def getHostName():
@@ -141,7 +147,6 @@ def getHostName():
     3. if fails, try HOST environment variable
     4. if fails, return 'unknown' as default host name
     """
     3. if fails, try HOST environment variable
     4. if fails, return 'unknown' as default host name
     """
-    import os
     try:
         import socket
         host = socket.gethostname()
     try:
         import socket
         host = socket.gethostname()
@@ -151,6 +156,11 @@ def getHostName():
     if not host: host = os.getenv("HOSTNAME")
     if not host: host = os.getenv("HOST")
     if not host: host = "unknown"           # 'unknown' is default host name
     if not host: host = os.getenv("HOSTNAME")
     if not host: host = os.getenv("HOST")
     if not host: host = "unknown"           # 'unknown' is default host name
+    try:
+        socket.gethostbyname(host)
+    except:
+        host = "localhost"
+    pass
     return host
 
 # ---
     return host
 
 # ---
@@ -168,7 +178,7 @@ def getShortHostName():
     except:
         pass
     return "unknown"           # 'unknown' is default host name
     except:
         pass
     return "unknown"           # 'unknown' is default host name
-    
+
 # ---
 
 def getAppName():
 # ---
 
 def getAppName():
@@ -208,47 +218,33 @@ def getHomeDir():
     """
     Get home directory.
     """
     """
     Get home directory.
     """
-    import os, sys
-    if sys.platform == "win32":
-        # for Windows the home directory is detected in the following way:
-        # 1. try USERPROFILE env variable
-        # 2. try combination of HOMEDRIVE and HOMEPATH env variables
-        # 3. try HOME env variable
-        # TODO: on Windows, also GetUserProfileDirectoryW() system function might be used
-        dir = os.getenv("USERPROFILE")
-        if not dir and os.getenv("HOMEDRIVE") and os.getenv("HOMEPATH"):
-            dir = os.path.join(os.getenv("HOMEDRIVE"), os.getenv("HOMEPATH"))
-        if not dir:
-            dir = os.getenv("HOME")
-        pass
-    else:
-        # for Linux: use HOME variable
-        dir = os.getenv("HOME")
-        pass
-    return dir
+    import os
+    return os.path.realpath(os.path.expanduser('~'))
+# ---
+
+def getLogDir():
+    """
+    Get directory to be used for the log files.
+    """
+    import os
+    return os.path.join(getTmpDir(), "logs", getUserName())
 # ---
 
 def getTmpDir():
     """
     Get directory to be used for the temporary files.
     """
 # ---
 
 def getTmpDir():
     """
     Get directory to be used for the temporary files.
     """
-    import os, sys
-    if sys.platform == "win32":
-        # for Windows: temporarily using home directory for tmp files;
-        # to be replaced with TEMP environment variable later...
-        dir = os.getenv("HOME")
-    else:
-        # for Linux: use /tmp/logs/{user} folder
-        dir = os.path.join( '/tmp', 'logs', getUserName() )
-        pass
-    return dir
-
+    import os, tempfile
+    f = tempfile.NamedTemporaryFile()
+    tmpdir = os.path.dirname(f.name)
+    f.close()
+    return tmpdir
 # ---
 
 def generateFileName( dir, prefix = None, suffix = None, extension = None,
                       unique = False, separator = "_", hidden = False, **kwargs ):
     """
 # ---
 
 def generateFileName( dir, prefix = None, suffix = None, extension = None,
                       unique = False, separator = "_", hidden = False, **kwargs ):
     """
-    Generate file name by sepecified parameters. If necessary, file name
+    Generate file name by specified parameters. If necessary, file name
     can be generated to be unique.
 
     Parameters:
     can be generated to be unique.
 
     Parameters:
@@ -297,7 +293,7 @@ def generateFileName( dir, prefix = None, suffix = None, extension = None,
     ### check unsupported parameters
     for kw in kwargs:
         if kw not in supported and verbose():
     ### check unsupported parameters
     for kw in kwargs:
         if kw not in supported and verbose():
-            print 'Warning! salome_utilitie.py: generateFileName(): parameter %s is not supported' % kw
+            print('Warning! salome_utilitie.py: generateFileName(): parameter %s is not supported' % kw)
             pass
         pass
     ### process supported keywords
             pass
         pass
     ### process supported keywords
@@ -378,7 +374,7 @@ def generateFileName( dir, prefix = None, suffix = None, extension = None,
 
 # ---
 
 
 # ---
 
-def makeTmpDir( path, mode=0777 ):
+def makeTmpDir( path, mode=0o777 ):
     """
     Make temporary directory with the specified path.
     If the directory exists then clear its contents.
     """
     Make temporary directory with the specified path.
     If the directory exists then clear its contents.
@@ -481,6 +477,7 @@ def verbose():
         pass
     #
     return _verbose
         pass
     #
     return _verbose
+# --
 
 def setVerbose(level):
     """
 
 def setVerbose(level):
     """
@@ -489,4 +486,107 @@ def setVerbose(level):
     global _verbose
     _verbose = level
     return
     global _verbose
     _verbose = level
     return
+# --
+
+import signal
+def killpid(pid, sig = 9):
+    """
+    Send signal sig to the process by pid.
 
 
+    Parameters:
+    - pid : PID of process
+    - sig : signal for sending
+            Possible values of signals: 
+            9 means kill the process
+            0 only check existing of the process
+            NOTE: Other values are not processed on Windows
+    Returns:
+     1 Success
+     0 Fail, no such process
+    -1 Fail, another reason
+
+    """
+    if not pid: return
+    import os, sys
+    if sig != 0:
+        if verbose(): print("######## killpid pid = ", pid)
+    try:
+        if sys.platform == "win32":
+            import ctypes
+            if sig == 0:
+                # PROCESS_QUERY_INFORMATION (0x0400)    Required to retrieve certain information about a process
+                handle = ctypes.windll.kernel32.OpenProcess(0x0400, False, int(pid))
+                if handle: 
+                    ret = 1
+                    ctypes.windll.kernel32.CloseHandle(handle)
+                else:
+                    ret = 0
+            if sig == 9:
+                # PROCESS_TERMINATE (0x0001)    Required to terminate a process using TerminateProcess.
+                handle = ctypes.windll.kernel32.OpenProcess(0x0001, False, int(pid))
+                ret = ctypes.windll.kernel32.TerminateProcess(handle, -1)
+                ctypes.windll.kernel32.CloseHandle(handle)
+                pass
+            pass
+        else:
+            # Default: signal.SIGKILL = 9
+            os.kill(int(pid),sig)
+            ret = 1
+            pass
+        pass
+    except OSError as e:
+        # errno.ESRCH == 3 is 'No such process'
+        if e.errno == 3:
+            ret = 0
+        else:
+            ret = -1
+            pass
+        pass
+    return ret
+# --
+
+def getOmniNamesPid(port):
+    """
+    Return OmniNames pid by port number.
+    """
+    import sys,subprocess,re
+    if sys.platform == "win32":
+        # Get process list by WMI Command Line Utility(WMIC)
+        # Output is formatted with each value listed on a separate line and with the name of the property:
+        #   ...
+        #   Caption=<caption0>
+        #   CommandLine=<commandline0>
+        #   ProcessId=<processid0>
+        #
+        #
+        #
+        #   Caption=<caption1>
+        #   CommandLine=<commandline1>
+        #   ProcessId=<processid1>
+        #   ...
+        cmd = 'WMIC PROCESS get Caption,Commandline,Processid /VALUE'
+        proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
+        # Get stdout
+        allProc = proc.communicate()[0]
+        # find Pid of omniNames
+        pid = re.findall(r'Caption=.*omniNames.*\n?CommandLine=.*omniNames.*\D%s\D.*\n?ProcessId=(\d*)'%(port),allProc)[0]
+    else:        
+        cmd = "ps -eo pid,command | grep -v grep | grep -E \"omniNames.*%s\" | awk '{print $1}'"%(port)
+        proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
+        pid = proc.communicate()[0]
+        pass
+
+    return pid
+# --
+
+def killOmniNames(port):
+    """
+    Kill OmniNames process by port number.
+    """
+    try:
+        pid = getOmniNamesPid(port)
+        if pid: killpid(pid)
+    except:
+        pass
+    pass
+# --