3 import sys, os, string, glob, time, pickle
8 # salome_subdir variable is used for composing paths like $KERNEL_ROOT_DIR/share/salome/resources, etc.
9 # before moving to SUIT-based gui, instead of salome_subdir there was args['appname'] used.
10 # but after - 'appname' = "SalomeApp", so using it in making the subdirectory is an error.
11 salome_subdir = "salome"
13 # -----------------------------------------------------------------------------
15 def add_path(directory, variable_name):
16 """Function helper to add environment variables"""
17 if not os.environ.has_key(variable_name):
18 os.environ[variable_name] = ""
20 if os.path.exists(directory):
22 for _dir in os.environ[variable_name].split(":"):
23 if os.path.exists(_dir):
24 if not os.path.samefile(_dir, directory):
27 if os.path.abspath(_dir) != os.path.abspath(directory):
31 newpath[:0] = [ directory ]
32 newpath = string.join(newpath,":")
33 os.environ[variable_name] = newpath
34 if variable_name == "PYTHONPATH":
35 sys.path[:0] = [directory]
37 # -----------------------------------------------------------------------------
41 Get list of modules, paths.
43 Read args from launch configure xml file and command line options.
44 Check variables <module>_ROOT_DIR and set list of used modules.
45 Return args, modules_list, modules_root_dir
48 # read args from launch configure xml file and command line options
50 import launchConfigureParser
51 args = launchConfigureParser.args
53 # Check variables <module>_ROOT_DIR
54 # and set list of used modules (without KERNEL)
57 if args.has_key("modules"):
58 modules_list += args["modules"]
59 # KERNEL must be last in the list to locate it at the first place in PATH
60 modules_list[:0] = ["KERNEL"]
61 modules_list.reverse()
66 for module in modules_list :
67 module_variable=module.upper()+"_ROOT_DIR"
68 if not os.environ.has_key(module_variable):
69 print "*******************************************************"
71 print "* Environment variable",module_variable,"must be set"
72 print "* Module", module, "will be not available"
74 print "********************************************************"
75 to_remove_list.append(module)
78 module_root_dir = os.environ[module_variable]
79 modules_root_dir[module]=module_root_dir
81 for to_remove in to_remove_list:
82 modules_list.remove(to_remove)
84 while "KERNEL" in modules_list:
85 modules_list.remove("KERNEL")
88 if "SUPERV" in modules_list and not 'superv' in args['standalone']:
89 args['standalone'].append("superv")
92 return args, modules_list, modules_root_dir
94 # -----------------------------------------------------------------------------
96 def set_env(args, modules_list, modules_root_dir):
97 """Add to the PATH-variables modules specific paths"""
99 python_version="python%d.%d" % sys.version_info[0:2]
100 modules_root_dir_list = []
101 modules_list = modules_list[:] + ["KERNEL"]
102 for module in modules_list :
103 module_root_dir = modules_root_dir[module]
104 modules_root_dir_list[:0] = [module_root_dir]
105 add_path(os.path.join(module_root_dir,"lib",salome_subdir),
107 add_path(os.path.join(module_root_dir,"bin",salome_subdir),
109 if os.path.exists(module_root_dir + "/examples") :
110 add_path(os.path.join(module_root_dir,"examples"),
112 add_path(os.path.join(module_root_dir,"bin",salome_subdir),
114 add_path(os.path.join(module_root_dir,"lib",
115 python_version,"site-packages",salome_subdir),
117 add_path(os.path.join(module_root_dir,"lib",salome_subdir),
119 add_path(os.path.join(module_root_dir,"lib",
120 python_version,"site-packages",salome_subdir,
124 os.environ["SALOMEPATH"]=":".join(modules_root_dir_list)
126 # special path for logger lib if needeed
128 os.environ["SALOME_trace"]="local"
130 os.environ["SALOME_trace"]=args['file'][0]
132 os.environ["SALOME_trace"]="with_logger"
133 locdir=os.environ['PWD']
134 libtracedir=os.path.join(locdir,"libSalomeTrace")
135 libtrace = os.path.join(modules_root_dir["KERNEL"],"lib",
137 "libSALOMELoggerClient.so.0.0.0")
138 libtraceln = os.path.join(libtracedir,"libSALOMELocalTrace.so")
139 aCommand = 'rm -rf ' + libtracedir + "; "
140 aCommand += 'mkdir ' + libtracedir + "; "
141 aCommand += 'ln -s ' + libtrace + " " + libtraceln + "; "
142 aCommand += 'ln -s ' + libtrace + " " + libtraceln + ".0; "
143 aCommand += 'ln -s ' + libtrace + " " + libtraceln + ".0.0.0; "
145 add_path(libtracedir, "LD_LIBRARY_PATH")
147 # set environment for SMESH plugins
149 if "SMESH" in modules_list:
150 os.environ["SMESH_MeshersList"]="StdMeshers"
151 if not os.environ.has_key("SALOME_StdMeshersResources"):
152 os.environ["SALOME_StdMeshersResources"] \
153 = modules_root_dir["SMESH"]+"/share/"+args["appname"]+"/resources"
155 if args.has_key("SMESH_plugins"):
156 for plugin in args["SMESH_plugins"]:
157 if os.environ.has_key(plugin.upper()+"_ROOT_DIR"):
158 os.environ["SMESH_MeshersList"] \
159 = os.environ["SMESH_MeshersList"]+":"+plugin
160 plugin_root = os.environ[plugin.upper()+"_ROOT_DIR"]
161 if not os.environ.has_key("SALOME_"+plugin+"Resources"):
162 os.environ["SALOME_"+plugin+"Resources"] \
163 = plugin_root+"/share/"+args["appname"]+"/resources"
164 add_path(os.path.join(plugin_root,"lib",python_version,
165 "site-packages",salome_subdir),
167 add_path(os.path.join(plugin_root,"lib",salome_subdir),
169 add_path(os.path.join(plugin_root,"lib",salome_subdir),
171 add_path(os.path.join(plugin_root,"bin",salome_subdir),
173 add_path(os.path.join(plugin_root,"bin",salome_subdir),
178 # set environment for SUPERV module
179 os.environ["ENABLE_MACRO_NODE"]="1"
182 # -----------------------------------------------------------------------------
184 from killSalome import killAllPorts
188 kill servers from a previous SALOME exection, if needed,
189 on the CORBA port given in args of runSalome
192 from killSalomeWithPort import killMyPort
193 my_port=str(args['port'])
197 print "problem in killLocalPort()"
201 def givenPortKill(port):
203 kill servers from a previous SALOME exection, if needed,
204 on the same CORBA port
207 from killSalomeWithPort import killMyPort
212 print "problem in LocalPortKill(), killMyPort("<<port<<")"
216 def kill_salome(args):
218 Kill servers from previous SALOME executions, if needed;
219 depending on args 'killall' or 'portkill', kill all executions,
220 or only execution on the same CORBA port
225 elif args['portkill']:
226 givenPortKill(str(args['port']))
228 # -----------------------------------------------------------------------------
230 # Definition des classes d'objets pour le lancement des Server CORBA
234 """Generic class for CORBA server launch"""
239 if self.args['xterm']:
240 self.ARGS=['xterm', '-iconic', '-sb', '-sl', '500', '-hold']
242 def __init__(self,args):
250 if self.args['xterm']:
251 # (Debian) send LD_LIBRARY_PATH to children shells (xterm)
252 env_ld_library_path=['env', 'LD_LIBRARY_PATH='
253 + os.getenv("LD_LIBRARY_PATH")]
254 myargs = myargs +['-T']+self.CMD[:1]+['-e'] + env_ld_library_path
255 command = myargs + self.CMD
256 print "command = ", command
257 pid = os.spawnvp(os.P_NOWAIT, command[0], command)
258 process_id[pid]=self.CMD
261 class InterpServer(Server):
262 def __init__(self,args):
264 env_ld_library_path=['env', 'LD_LIBRARY_PATH=' + os.getenv("LD_LIBRARY_PATH")]
265 self.CMD=['xterm', '-e']+ env_ld_library_path + ['python']
266 #self.CMD=['xterm', '-e', 'python']
271 print "command = ", command
272 pid = os.spawnvp(os.P_NOWAIT, command[0], command)
273 process_id[pid]=self.CMD
277 class CatalogServer(Server):
278 def __init__(self,args):
281 self.SCMD1=['SALOME_ModuleCatalog_Server','-common']
283 home_dir=os.getenv('HOME')
284 if home_dir is not None:
285 self.SCMD2=['-personal',os.path.join(home_dir,'Salome/resources/CatalogModulePersonnel.xml')]
287 def setpath(self,modules_list,modules_root_dir):
289 list_modules = modules_list[:]
290 list_modules.reverse()
291 for module in ["KERNEL"] + list_modules:
292 module_root_dir=modules_root_dir[module]
293 module_cata=module+"Catalog.xml"
294 print " ", module_cata
296 glob.glob(os.path.join(module_root_dir,
297 "share",salome_subdir,
298 "resources",module_cata)))
299 self.CMD=self.SCMD1 + [string.join(cata_path,':')] + self.SCMD2
303 class SalomeDSServer(Server):
304 def __init__(self,args):
307 self.CMD=['SALOMEDS_Server']
311 class RegistryServer(Server):
312 def __init__(self,args):
315 self.CMD=['SALOME_Registry_Server', '--salome_session','theSession']
319 class ContainerCPPServer(Server):
320 def __init__(self,args):
323 self.CMD=['SALOME_Container','FactoryServer']
327 class ContainerPYServer(Server):
328 def __init__(self,args):
331 self.CMD=['SALOME_ContainerPy.py','FactoryServerPy']
335 class ContainerSUPERVServer(Server):
336 def __init__(self,args):
339 self.CMD=['SALOME_Container','SuperVisionContainer']
343 class LoggerServer(Server):
344 def __init__(self,args):
347 self.CMD=['SALOME_Logger_Server', 'logger.log']
351 # class SessionLoader(Server):
352 # def __init__(self,args):
355 # self.CMD=['SALOME_Session_Loader']
356 # if "cppContainer" in self.args['standalone'] \
357 # or "cppContainer" in self.args['embedded']:
358 # self.CMD=self.CMD+['CPP']
359 # if "pyContainer" in self.args['standalone'] \
360 # or "pyContainer" in self.args['embedded']:
361 # self.CMD=self.CMD+['PY']
362 # if "supervContainer" in self.args['containers'] \
363 # or "supervContainer" in self.args['standalone']:
364 # self.CMD=self.CMD+['SUPERV']
365 # if self.args['gui']:
366 # self.CMD=self.CMD+['GUI']
371 class SessionServer(Server):
372 def __init__(self,args):
375 self.SCMD1=['SALOME_Session_Server']
377 if 'registry' in self.args['embedded']:
378 self.SCMD1+=['--with','Registry',
379 '(','--salome_session','theSession',')']
380 if 'moduleCatalog' in self.args['embedded']:
381 self.SCMD1+=['--with','ModuleCatalog','(','-common']
382 home_dir=os.getenv('HOME')
383 if home_dir is not None:
384 self.SCMD2+=['-personal',os.path.join(home_dir,'Salome/resources/CatalogModulePersonnel.xml')]
386 if 'study' in self.args['embedded']:
387 self.SCMD2+=['--with','SALOMEDS','(',')']
388 if 'cppContainer' in self.args['embedded']:
389 self.SCMD2+=['--with','Container','(','FactoryServer',')']
390 if 'SalomeAppEngine' in self.args['embedded']:
391 self.SCMD2+=['--with','SalomeAppEngine','(',')']
393 if 'cppContainer' in self.args['standalone'] or 'cppContainer' in self.args['embedded']:
395 if 'pyContainer' in self.args['standalone'] or 'pyContainer' in self.args['embedded']:
397 if 'supervContainer' in self.args['containers'] or 'supervContainer' in self.args['standalone']:
398 self.SCMD2+=['SUPERV']
401 if self.args['splash']:
402 self.SCMD2+=['SPLASH']
404 def setpath(self,modules_list,modules_root_dir):
406 list_modules = modules_list[:]
407 list_modules.reverse()
408 for module in ["KERNEL"] + list_modules:
409 module_root_dir=modules_root_dir[module]
410 module_cata=module+"Catalog.xml"
411 print " ", module_cata
413 glob.glob(os.path.join(module_root_dir,"share",
414 salome_subdir,"resources",
416 if 'moduleCatalog' in self.args['embedded']:
417 self.CMD=self.SCMD1 + [string.join(cata_path,':')] + self.SCMD2
419 self.CMD=self.SCMD1 + self.SCMD2
421 # arguments SALOME_Session_Server pour ddd
434 class ContainerManagerServer(Server):
435 def __init__(self,args):
438 self.SCMD1=['SALOME_ContainerManagerServer']
440 if 'registry' in self.args['embedded']:
441 self.SCMD1+=['--with','Registry',
442 '(','--salome_session','theSession',')']
443 if 'moduleCatalog' in self.args['embedded']:
444 self.SCMD1+=['--with','ModuleCatalog','(','-common']
445 self.SCMD2+=['-personal',
446 '${HOME}/Salome/resources/CatalogModulePersonnel.xml',')']
447 if 'study' in self.args['embedded']:
448 self.SCMD2+=['--with','SALOMEDS','(',')']
449 if 'cppContainer' in self.args['embedded']:
450 self.SCMD2+=['--with','Container','(','FactoryServer',')']
452 def setpath(self,modules_list,modules_root_dir):
454 list_modules = modules_list[:]
455 list_modules.reverse()
456 for module in ["KERNEL"] + list_modules:
457 module_root_dir=modules_root_dir[module]
458 module_cata=module+"Catalog.xml"
459 print " ", module_cata
461 glob.glob(os.path.join(module_root_dir,"share",
462 self.args['appname'],"resources",
464 if 'moduleCatalog' in self.args['embedded']:
465 self.CMD=self.SCMD1 + [string.join(cata_path,':')] + self.SCMD2
467 self.CMD=self.SCMD1 + self.SCMD2
469 class NotifyServer(Server):
470 def __init__(self,args,modules_root_dir):
473 self.modules_root_dir=modules_root_dir
474 myLogName = os.environ["LOGNAME"]
475 self.CMD=['notifd','-c',
476 self.modules_root_dir["KERNEL"] +'/share/salome/resources/channel.cfg',
477 '-DFactoryIORFileName=/tmp/'+myLogName+'_rdifact.ior',
478 '-DChannelIORFileName=/tmp/'+myLogName+'_rdichan.ior',
479 '-DReportLogFile=/tmp/'+myLogName+'_notifd.report',
480 '-DDebugLogFile=/tmp/'+myLogName+'_notifd.debug',
484 # -----------------------------------------------------------------------------
487 """Salome Session Graphic User Interface activation"""
489 import SALOME_Session_idl
490 session=clt.waitNS("/Kernel/Session",SALOME.Session)
491 session.GetInterface()
493 # -----------------------------------------------------------------------------
495 def startSalome(args, modules_list, modules_root_dir):
496 """Launch all SALOME servers requested by args"""
497 init_time = os.times()
499 print "startSalome ", args
502 # Initialisation ORB et Naming Service
505 clt=orbmodule.client()
508 # Lancement Session Server
510 mySessionServ = SessionServer(args)
511 mySessionServ.setpath(modules_list,modules_root_dir)
514 # (non obligatoire) Lancement Logger Server
515 # et attente de sa disponibilite dans le naming service
519 myServer=LoggerServer(args)
521 clt.waitLogger("Logger")
523 # Notify Server launch
526 print "Notify Server to launch"
528 myServer=NotifyServer(args,modules_root_dir)
532 # Lancement Registry Server,
533 # attente de la disponibilite du Registry dans le Naming Service
536 if 'registry' not in args['embedded']:
537 myServer=RegistryServer(args)
539 clt.waitNS("/Registry")
542 # Lancement Catalog Server,
543 # attente de la disponibilite du Catalog Server dans le Naming Service
547 if 'moduleCatalog' not in args['embedded']:
548 cataServer=CatalogServer(args)
549 cataServer.setpath(modules_list,modules_root_dir)
551 import SALOME_ModuleCatalog
552 clt.waitNS("/Kernel/ModulCatalog",SALOME_ModuleCatalog.ModuleCatalog)
555 # Lancement SalomeDS Server,
556 # attente de la disponibilite du SalomeDS dans le Naming Service
559 os.environ["CSF_PluginDefaults"] \
560 = os.path.join(modules_root_dir["KERNEL"],"share",
561 salome_subdir,"resources")
562 os.environ["CSF_SALOMEDS_ResourcesDefaults"] \
563 = os.path.join(modules_root_dir["KERNEL"],"share",
564 salome_subdir,"resources")
566 if "GEOM" in modules_list:
567 print "GEOM OCAF Resources"
568 os.environ["CSF_GEOMDS_ResourcesDefaults"] \
569 = os.path.join(modules_root_dir["GEOM"],"share",
570 salome_subdir,"resources")
571 print "GEOM Shape Healing Resources"
572 os.environ["CSF_ShHealingDefaults"] \
573 = os.path.join(modules_root_dir["GEOM"],"share",
574 salome_subdir,"resources")
577 if 'study' not in args['embedded']:
579 myServer=SalomeDSServer(args)
581 clt.waitNS("/myStudyManager")
584 # Lancement ContainerManagerServer
587 myCmServer = ContainerManagerServer(args)
588 myCmServer.setpath(modules_list,modules_root_dir)
592 from Utils_Identity import getShortHostName
594 if os.getenv("HOSTNAME") == None:
595 if os.getenv("HOST") == None:
596 os.environ["HOSTNAME"]=getShortHostName()
598 os.environ["HOSTNAME"]=os.getenv("HOST")
600 theComputer = getShortHostName()
603 # Lancement Container C++ local,
604 # attente de la disponibilite du Container C++ local dans le Naming Service
607 if 'cppContainer' in args['standalone']:
608 myServer=ContainerCPPServer(args)
610 clt.waitNS("/Containers/" + theComputer + "/FactoryServer")
613 # Lancement Container Python local,
614 # attente de la disponibilite du Container Python local
615 # dans le Naming Service
618 if 'pyContainer' in args['standalone']:
619 myServer=ContainerPYServer(args)
621 clt.waitNS("/Containers/" + theComputer + "/FactoryServerPy")
624 # Lancement Container Supervision local,
625 # attente de la disponibilite du Container Supervision local
626 # dans le Naming Service
629 if 'supervContainer' in args['standalone']:
630 myServer=ContainerSUPERVServer(args)
632 clt.waitNS("/Containers/" + theComputer + "/SuperVisionContainer")
636 #pid = os.spawnvp(os.P_NOWAIT, macomm2[0], macomm2)
638 # Attente de la disponibilite du Session Server dans le Naming Service
642 import SALOME_Session_idl
643 session=clt.waitNS("/Kernel/Session",SALOME.Session)
645 end_time = os.times()
647 print "Start SALOME, elapsed time : %5.1f seconds"% (end_time[4]
650 # ASV start GUI without Loader
652 # session.GetInterface()
655 # additionnal external python interpreters
662 nbaddi = int(args['interp'][0])
665 traceback.print_exc()
666 print "-------------------------------------------------------------"
667 print "-- to get an external python interpreter:runSalome --interp=1"
668 print "-------------------------------------------------------------"
670 print "additional external python interpreters: ", nbaddi
672 for i in range(nbaddi):
674 anInterp=InterpServer(args)
679 # -----------------------------------------------------------------------------
681 def useSalome(args, modules_list, modules_root_dir):
683 Launch all SALOME servers requested by args,
684 save list of process, give info to user,
685 show registered objects in Naming Service.
690 clt = startSalome(args, modules_list, modules_root_dir)
693 traceback.print_exc()
696 print "--- erreur au lancement Salome ---"
700 # filedict = '/tmp/' + os.getenv('USER') + "_" + str(args['port']) \
701 # + '_' + args['appname'].upper() + '_pidict'
702 # replaced args['appname'] by "SALOME" because in killSalome.py use of 'SALOME' in file name is hardcoded.
703 filedict = os.getenv("HOME") + '/' + os.getenv('USER') + "_" + str(args['port']) \
704 + '_' + 'SALOME' + '_pidict'
707 fpid=open(filedict, 'r')
708 process_ids=pickle.load(fpid)
713 fpid=open(filedict, 'w')
714 process_ids.append(process_id)
715 pickle.dump(process_ids,fpid)
719 Saving of the dictionary of Salome processes in %s
720 To kill SALOME processes from a console (kill all sessions from all ports):
722 To kill SALOME from the present interpreter, if it is not closed :
723 killLocalPort() --> kill this session
724 (use CORBA port from args of runSalome)
725 givenPortKill(port) --> kill a specific session with given CORBA port
726 killAllPorts() --> kill all sessions
728 runSalome, with --killall option, starts with killing
729 the processes resulting from the previous execution.
733 # Impression arborescence Naming Service
738 print " --- registered objects tree in Naming Service ---"
743 # -----------------------------------------------------------------------------
745 def registerEnv(args, modules_list, modules_root_dir):
747 Register args, modules_list, modules_root_dir in a file
748 for further use, when SALOME is launched embedded in an other application.
750 fileEnv = '/tmp/' + os.getenv('USER') + "_" + str(args['port']) \
751 + '_' + args['appname'].upper() + '_env'
752 fenv=open(fileEnv,'w')
753 pickle.dump((args, modules_list, modules_root_dir),fenv)
755 os.environ["SALOME_LAUNCH_CONFIG"] = fileEnv
757 # -----------------------------------------------------------------------------
760 """Salome Launch, when embedded in other application"""
761 fileEnv = os.environ["SALOME_LAUNCH_CONFIG"]
762 fenv=open(fileEnv,'r')
763 args, modules_list, modules_root_dir = pickle.load(fenv)
766 clt = useSalome(args, modules_list, modules_root_dir)
769 # -----------------------------------------------------------------------------
772 """Salome launch as a main application"""
773 args, modules_list, modules_root_dir = get_config()
775 set_env(args, modules_list, modules_root_dir)
776 clt = useSalome(args, modules_list, modules_root_dir)
779 # -----------------------------------------------------------------------------
781 if __name__ == "__main__":