# -*- coding: iso-8859-1 -*-
-# Copyright (C) 2007-2014 CEA/DEN, EDF R&D, OPEN CASCADE
+# Copyright (C) 2007-2016 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
'getShortHostName',
'getAppName',
'getPortNumber',
+ 'getLogDir',
'getTmpDir',
'getHomeDir',
'generateFileName',
"""
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
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():
3. if fails, try HOST environment variable
4. if fails, return 'unknown' as default host name
"""
- import os
try:
import socket
host = socket.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
+ try:
+ socket.gethostbyname(host)
+ except:
+ host = "localhost"
+ pass
return host
# ---
except:
pass
return "unknown" # 'unknown' is default host name
-
+
# ---
def getAppName():
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.
"""
- 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,
pass
#
return _verbose
+# --
def setVerbose(level):
"""
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, 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
+# --