1 # -*- coding: iso-8859-1 -*-
2 # Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE
4 # This library is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU Lesser General Public
6 # License as published by the Free Software Foundation; either
7 # version 2.1 of the License, or (at your option) any later version.
9 # This library is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 # Lesser General Public License for more details.
14 # You should have received a copy of the GNU Lesser General Public
15 # License along with this library; if not, write to the Free Software
16 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
22 # File : salome_utils.py
23 # Author : Vadim SANDLER, Open CASCADE S.A.S. (vadim.sandler@opencascade.com)
26 ## @package salome_utils
27 # \brief Set of utility functions used by SALOME python scripts.
54 Check if specified parameter represents boolean value and returns its value.
55 String values like 'True', 'TRUE', 'YES', 'Yes', 'y', 'NO', 'false', 'n', etc
57 If <arg> does not represent a boolean, an exception is raised.
60 if type( arg ) == types.BooleanType :
62 elif type( arg ) == types.StringType :
63 v = str( arg ).lower()
64 if v in [ "yes", "y", "true" ]: return True
65 elif v in [ "no", "n", "false" ]: return False
67 raise Exception("Not boolean value")
73 Get omniORB current configuration.
74 Returns a list of three values: [ orb_version, host_name, port_number ].
76 The information is retrieved from the omniORB configuration file defined
77 by the OMNIORB_CONFIG environment variable.
78 If omniORB configuration file can not be accessed, a list of three empty
84 f = open( os.getenv( "OMNIORB_CONFIG" ) )
87 regvar = re.compile( "(ORB)?InitRef.*corbaname::(.*):(\d+)\s*$" )
92 if m.group(1) is None:
111 def getHostFromORBcfg():
113 Get current omniORB host.
115 return getORBcfgInfo()[1]
118 def getPortFromORBcfg():
120 Get current omniORB port.
122 return getORBcfgInfo()[2]
129 1. try USER environment variable (USERNAME on windows)
130 2. if fails, try LOGNAME (un*x)
131 3. if fails return 'unknown' as default user name
134 if sys.platform == "win32":
135 return os.getenv("USERNAME", "unknown")
137 user = os.getenv("USER")
140 return os.getenv("LOGNAME", "unknown")
146 1. try socket python module gethostname() function
147 2. if fails, try HOSTNAME environment variable
148 3. if fails, try HOST environment variable
149 4. if fails, return 'unknown' as default host name
154 host = socket.gethostname()
158 if not host: host = os.getenv("HOSTNAME")
159 if not host: host = os.getenv("HOST")
160 if not host: host = "unknown" # 'unknown' is default host name
165 def getShortHostName():
168 1. try socket python module gethostname() function
169 2. if fails, try HOSTNAME environment variable
170 3. if fails, try HOST environment variable
171 4. if fails, return 'unknown' as default host name
174 return getHostName().split('.')[0]
177 return "unknown" # 'unknown' is default host name
183 Get application name:
184 1. try APPNAME environment variable
185 2. if fails, return 'SALOME' as default application name
188 return os.getenv( "APPNAME", "SALOME" ) # 'SALOME' is default user name
192 def getPortNumber(use_default=True):
194 Get current naming server port number:
195 1. try NSPORT environment variable
196 1. if fails, try to parse config file defined by OMNIORB_CONFIG environment variable
197 2. if fails, return 2809 as default port number (if use_default is True) or None (id use_default is False)
201 return int( os.getenv( "NSPORT" ) )
205 port = int( getPortFromORBcfg() )
206 if port is not None: return port
209 if use_default: return 2809 # '2809' is default port number
219 return os.path.realpath(os.path.expanduser('~'))
224 Get directory to be used for the log files.
227 return os.path.join(getTmpDir(), "logs", getUserName())
232 Get directory to be used for the temporary files.
235 f = tempfile.NamedTemporaryFile()
236 tmpdir = os.path.dirname(f.name)
241 def generateFileName( dir, prefix = None, suffix = None, extension = None,
242 unique = False, separator = "_", hidden = False, **kwargs ):
244 Generate file name by sepecified parameters. If necessary, file name
245 can be generated to be unique.
248 - dir : directory path
249 - prefix : file prefix (not added by default)
250 - suffix : file suffix (not added by default)
251 - extension : file extension (not added by default)
252 - unique : if this parameter is True, the unique file name is generated:
253 in this case, if the file with the generated name already exists
254 in the <dir> directory, an integer suffix is added to the end of the
255 file name. This parameter is False by default.
256 - separator : separator of the words ('_' by default)
257 - hidden : if this parameter is True, the file name is prepended by . (dot)
258 symbol. This parameter is False by default.
260 Other keyword parameters are:
261 - with_username : 'add user name' flag/option:
262 * boolean value can be passed to determine user name automatically
263 * string value to be used as user name
264 - with_hostname : 'add host name' flag/option:
265 * boolean value can be passed to determine host name automatically
266 * string value to be used as host name
267 - with_port : 'add port number' flag/option:
268 * boolean value can be passed to determine port number automatically
269 * string value to be used as port number
270 - with_app : 'add application name' flag/option:
271 * boolean value can be passed to determine application name automatically
272 * string value to be used as application name
273 All <with_...> parameters are optional.
275 supported = [ 'with_username', 'with_hostname', 'with_port', 'with_app' ]
276 from launchConfigureParser import verbose
279 if separator is None:
283 separator = str( separator )
285 # prefix (if specified)
286 if prefix is not None:
287 filename.append( str( prefix ) )
289 # additional keywords
290 ### check unsupported parameters
292 if kw not in supported and verbose():
293 print 'Warning! salome_utilitie.py: generateFileName(): parameter %s is not supported' % kw
296 ### process supported keywords
298 if kw not in kwargs: continue
300 if kw == 'with_username':
303 if _try_bool( kwargs[kw] ): filename.append( getUserName() )
306 # user name given as parameter
307 filename.append( kwargs[kw] )
311 elif kw == 'with_hostname':
314 if _try_bool( kwargs[kw] ): filename.append( getShortHostName() )
317 # host name given as parameter
318 filename.append( kwargs[kw] )
322 elif kw == 'with_port':
325 if _try_bool( kwargs[kw] ): filename.append( str( getPortNumber() ) )
328 # port number given as parameter
329 filename.append( str( kwargs[kw] ) )
333 elif kw == 'with_app':
335 # auto application name ?
336 if _try_bool( kwargs[kw] ): filename.append( getAppName() )
339 # application name given as parameter
340 filename.append( kwargs[kw] )
344 # suffix (if specified)
345 if suffix is not None:
346 filename.append( str( suffix ) )
348 # raise an exception if file name is empty
350 raise Exception("Empty file name")
352 if extension is not None and extension.startswith("."): extension = extension[1:]
355 name = separator.join( filename )
356 if hidden: name = "." + name # add dot for hidden files
357 if extension: name = name + "." + str( extension ) # add extension if defined
358 name = os.path.join( dir, name )
360 # create unique file name
362 while os.path.exists( name ):
364 name = separator.join( filename ) + separator + str( index )
365 if hidden: name = "." + name # add dot for hidden files
366 if extension: name = name + "." + str( extension ) # add extension if defined
367 name = os.path.join( dir, name )
370 return os.path.normpath(name)
374 def makeTmpDir( path, mode=0777 ):
376 Make temporary directory with the specified path.
377 If the directory exists then clear its contents.
380 - path : absolute path to the directory to be created.
384 if os.path.exists( path ):
386 if sys.platform == "win32":
387 os.system( "rmdir /S /Q " + '"' + path + '"' )
388 os.system( "mkdir " + '"' + path + '"' )
390 os.system( "rm -rf " + path + "/*" )
392 dirs = path.split("/")
394 if not dirs[0]: shift1 = 1
395 if dirs[-1]: shift2 = 1
396 for i in range(1+shift1,len(dirs)+shift2):
397 p = "/".join(dirs[:i])
406 def uniteFiles( src_file, dest_file ):
408 Unite contents of the source file with contents of the destination file
409 and put result of the uniting to the destination file.
410 If the destination file does not exist then the source file is simply
414 - src_file : absolute path to the source file
415 - dest_file : absolute path to the destination file
419 if not os.path.exists( src_file ):
423 if os.path.exists( dest_file ):
424 # add a symbol of new line to contents of the destination file (just in case)
425 dest = open( dest_file, 'r' )
426 dest_lines = dest.readlines()
429 dest_lines.append( "\n" )
431 dest = open( dest_file, 'w' )
432 dest.writelines( dest_lines )
436 if sys.platform == "win32":
437 command = "type " + '"' + src_file + '"' + " >> " + '"' + dest_file + '"'
439 command = "cat " + src_file + " >> " + dest_file
444 if sys.platform == "win32":
445 command = "copy " + '"' + src_file + '"' + " " + '"' + dest_file + '"' + " > nul"
447 command = "cp " + src_file + " " + dest_file
459 Get verbosity level. Default verbosity level is specified via the environment variable
460 SALOME_VERBOSE, e.g.:
461 [bash %] export SALOME_VERBOSE=1
462 The function setVerbose() can be used to change verbosity level explicitly.
465 # verbose has already been called
466 if _verbose is not None:
470 from os import getenv
471 _verbose = int(getenv('SALOME_VERBOSE'))
479 def setVerbose(level):
481 Change verbosity level. The function verbose() can be used to get current verbosity level.
489 def killpid(pid, sig = 9):
491 Send signal sig to the process by pid.
494 - pid : PID of process
495 - sig : signal for sending
496 Possible values of signals:
497 9 means kill the process
498 0 only check existing of the process
499 NOTE: Other values are not processed on Windows
502 0 Fail, no such process
503 -1 Fail, another reason
509 if verbose(): print "######## killpid pid = ", pid
511 if sys.platform == "win32":
514 # PROCESS_QUERY_INFORMATION (0x0400) Required to retrieve certain information about a process
515 handle = ctypes.windll.kernel32.OpenProcess(0x0400, False, int(pid))
518 ctypes.windll.kernel32.CloseHandle(handle)
522 # PROCESS_TERMINATE (0x0001) Required to terminate a process using TerminateProcess.
523 handle = ctypes.windll.kernel32.OpenProcess(0x0001, False, int(pid))
524 ret = ctypes.windll.kernel32.TerminateProcess(handle, -1)
525 ctypes.windll.kernel32.CloseHandle(handle)
529 # Default: signal.SIGKILL = 9
530 os.kill(int(pid),sig)
535 # errno.ESRCH == 3 is 'No such process'
545 def getOmniNamesPid(port):
547 Return OmniNames pid by port number.
549 import sys,subprocess,re
550 if sys.platform == "win32":
551 # Get process list by WMI Command Line Utility(WMIC)
552 # Output is formatted with each value listed on a separate line and with the name of the property:
555 # CommandLine=<commandline0>
556 # ProcessId=<processid0>
561 # CommandLine=<commandline1>
562 # ProcessId=<processid1>
564 cmd = 'WMIC PROCESS get Caption,Commandline,Processid /VALUE'
565 proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
567 allProc = proc.communicate()[0]
568 # find Pid of omniNames
569 pid = re.findall(r'Caption=.*omniNames.*\n?CommandLine=.*omniNames.*\D%s\D.*\n?ProcessId=(\d*)'%(port),allProc)[0]
571 cmd = "ps -eo pid,command | grep -v grep | grep -E \"omniNames.*%s\" | awk '{print $1}'"%(port)
572 proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
573 pid = proc.communicate()[0]
579 def killOmniNames(port):
581 Kill OmniNames process by port number.
584 pid = getOmniNamesPid(port)