3 import sys, os, string, glob, time, pickle
5 ### read launch configure xml file and command line options
6 import launchConfigureParser
7 args = launchConfigureParser.args
9 ### kill servers if it is need
11 from killSalome import killAllPorts
14 from killSalomeWithPort import killMyPort
15 my_port=str(args['port'])
19 print "problem in killLocalPort()"
25 elif args['portkill']:
28 # -----------------------------------------------------------------------------
30 # Fonctions helper pour ajouter des variables d'environnement
33 def add_path(directory, variable_name):
34 if not os.environ.has_key(variable_name):
35 os.environ[variable_name] = ""
37 if os.path.exists(directory):
39 for _dir in os.environ[variable_name].split(":"):
40 if os.path.exists(_dir):
41 if not os.path.samefile(_dir, directory):
44 if os.path.abspath(_dir) != os.path.abspath(directory):
48 newpath[:0] = [ directory ]
49 newpath = string.join(newpath,":")
50 os.environ[variable_name] = newpath
51 if variable_name == "PYTHONPATH":
52 sys.path[:0] = [directory]
55 init_time = os.times()
56 # -----------------------------------------------------------------------------
58 # Check variables <module>_ROOT_DIR and set list of used modules (without KERNEL)
59 # Add to the PATH-variables modules' specific paths
62 if args.has_key("modules"):
63 modules_list += args["modules"]
64 modules_list[:0] = ["KERNEL"] # KERNEL must be last in the list to locate it at the first place in PATH variables
65 modules_list.reverse()
68 modules_root_dir_list = []
69 python_version="python%d.%d" % sys.version_info[0:2]
72 for module in modules_list :
73 module_variable=module.upper()+"_ROOT_DIR"
74 if not os.environ.has_key(module_variable):
75 print "*******************************************************************************"
77 print "* Environment variable",module_variable,"must be set"
78 print "* Module", module, "will be not available"
80 print "*******************************************************************************"
81 to_remove_list.append(module)
84 module_root_dir = os.environ[module_variable]
85 modules_root_dir[module]=module_root_dir
86 modules_root_dir_list[:0] = [module_root_dir]
87 add_path(os.path.join(module_root_dir,"lib",args['appname']), "LD_LIBRARY_PATH")
88 add_path(os.path.join(module_root_dir,"bin",args['appname']), "PATH")
89 if os.path.exists(module_root_dir + "/examples") :
90 add_path(os.path.join(module_root_dir,"examples"), "PYTHONPATH")
92 for to_remove in to_remove_list:
93 modules_list.remove(to_remove)
95 while "KERNEL" in modules_list:
96 modules_list.remove("KERNEL")
99 # KERNEL must be last in the list to locate it at the first place in PYTHONPATH variable
100 list_modules = modules_list[:] + ["KERNEL"]
101 for module in list_modules:
102 module_root_dir = modules_root_dir[module]
103 add_path(os.path.join(module_root_dir,"bin",args['appname']), "PYTHONPATH")
104 add_path(os.path.join(module_root_dir,"lib",python_version,"site-packages",args['appname']), "PYTHONPATH")
105 add_path(os.path.join(module_root_dir,"lib",args['appname']), "PYTHONPATH")
106 add_path(os.path.join(module_root_dir,"lib",python_version,"site-packages",args['appname'],"shared_modules"), "PYTHONPATH")
108 #os.environ["SALOMEPATH"]=":".join(modules_root_dir.values())
109 os.environ["SALOMEPATH"]=":".join(modules_root_dir_list)
110 if "SUPERV" in modules_list and not 'superv' in args['standalone']:
111 args['standalone'].append("superv")
115 # -----------------------------------------------------------------------------
117 # Définition des classes d'objets pour le lancement des Server CORBA
123 ARGS=['xterm', '-iconic', '-sb', '-sl', '500', '-hold']
131 # (Debian) Transfert variable LD_LIBRARY_PATH aux shells fils (xterm)
132 env_ld_library_path=['env', 'LD_LIBRARY_PATH='+ os.getenv("LD_LIBRARY_PATH")]
133 myargs = myargs +['-T']+self.CMD[:1]+['-e'] + env_ld_library_path
134 command = myargs + self.CMD
135 #print "command = ", command
136 pid = os.spawnvp(os.P_NOWAIT, command[0], command)
137 process_id[pid]=self.CMD
139 class CatalogServer(Server):
140 SCMD1=['SALOME_ModuleCatalog_Server','-common']
141 SCMD2=['-personal','${HOME}/Salome/resources/CatalogModulePersonnel.xml']
143 def setpath(self,modules_list):
145 list_modules = modules_list[:]
146 list_modules.reverse()
147 for module in ["KERNEL"] + list_modules:
148 module_root_dir=modules_root_dir[module]
149 module_cata=module+"Catalog.xml"
150 print " ", module_cata
151 cata_path.extend(glob.glob(os.path.join(module_root_dir,"share",args['appname'],"resources",module_cata)))
152 self.CMD=self.SCMD1 + [string.join(cata_path,':')] + self.SCMD2
154 class SalomeDSServer(Server):
155 CMD=['SALOMEDS_Server']
157 class RegistryServer(Server):
158 CMD=['SALOME_Registry_Server', '--salome_session','theSession']
160 class ContainerCPPServer(Server):
161 #CMD=['SALOME_Container','FactoryServer','-ORBInitRef','NameService=corbaname::localhost']
162 CMD=['SALOME_Container','FactoryServer']
164 class ContainerPYServer(Server):
165 #CMD=['SALOME_ContainerPy.py','FactoryServerPy','-ORBInitRef','NameService=corbaname::localhost']
166 CMD=['SALOME_ContainerPy.py','FactoryServerPy']
168 class ContainerSUPERVServer(Server):
169 #CMD=['SALOME_Container','SuperVisionContainer','-ORBInitRef','NameService=corbaname::localhost']
170 CMD=['SALOME_Container','SuperVisionContainer']
172 class LoggerServer(Server):
173 CMD=['SALOME_Logger_Server', 'logger.log']
175 class SessionLoader(Server):
176 CMD=['SALOME_Session_Loader']
177 if "cpp" in args['containers']:
179 if "python" in args['containers']:
181 if "superv" in args['containers']:
186 class SessionServer(Server):
187 SCMD1=['SALOME_Session_Server']
189 if 'registry' in args['embedded']:
190 SCMD1+=['--with','Registry','(','--salome_session','theSession',')']
191 if 'moduleCatalog' in args['embedded']:
192 SCMD1+=['--with','ModuleCatalog','(','-common']
193 SCMD2+=['-personal','${HOME}/Salome/resources/CatalogModulePersonnel.xml',')']
194 if 'study' in args['embedded']:
195 SCMD2+=['--with','SALOMEDS','(',')']
196 if 'cppContainer' in args['embedded']:
197 SCMD2+=['--with','Container','(','FactoryServer',')']
199 def setpath(self,modules_list):
201 list_modules = modules_list[:]
202 list_modules.reverse()
203 for module in ["KERNEL"] + list_modules:
204 module_root_dir=modules_root_dir[module]
205 module_cata=module+"Catalog.xml"
206 print " ", module_cata
207 cata_path.extend(glob.glob(os.path.join(module_root_dir,"share",args['appname'],"resources",module_cata)))
208 if 'moduleCatalog' in args['embedded']:
209 self.CMD=self.SCMD1 + [string.join(cata_path,':')] + self.SCMD2
211 self.CMD=self.SCMD1 + self.SCMD2
213 class NotifyServer(Server):
214 myLogName = os.environ["LOGNAME"]
215 CMD=['notifd','-c',modules_root_dir["KERNEL"]+'/share/salome/resources/channel.cfg', '-DFactoryIORFileName=/tmp/'+myLogName+'_rdifact.ior', '-DChannelIORFileName=/tmp/'+myLogName+'_rdichan.ior']
217 # -----------------------------------------------------------------------------
219 # initialisation des variables d'environnement
222 os.environ["SALOME_trace"]="local"
224 os.environ["SALOME_trace"]="with_logger"
225 locdir=os.environ['PWD']
226 libtracedir=os.path.join(locdir,"libSalomeTrace")
227 libtrace = os.path.join(modules_root_dir["KERNEL"],"lib",args['appname'],"libSALOMELoggerClient.so.0.0.0")
228 libtraceln = os.path.join(libtracedir,"libSALOMELocalTrace.so")
229 aCommand = 'rm -rf ' + libtracedir + "; "
230 aCommand += 'mkdir ' + libtracedir + "; "
231 aCommand += 'ln -s ' + libtrace + " " + libtraceln + "; "
232 aCommand += 'ln -s ' + libtrace + " " + libtraceln + ".0; "
233 aCommand += 'ln -s ' + libtrace + " " + libtraceln + ".0.0.0; "
235 add_path(libtracedir, "LD_LIBRARY_PATH")
237 # set environment for SMESH plugins
239 if "SMESH" in modules_list:
240 os.environ["SMESH_MeshersList"]="StdMeshers"
241 if not os.environ.has_key("SALOME_StdMeshersResources"):
242 os.environ["SALOME_StdMeshersResources"] = modules_root_dir["SMESH"]+"/share/"+args["appname"]+"/resources"
244 if args.has_key("SMESH_plugins"):
245 for plugin in args["SMESH_plugins"]:
246 if os.environ.has_key(plugin.upper()+"_ROOT_DIR"):
247 os.environ["SMESH_MeshersList"]=os.environ["SMESH_MeshersList"]+":"+plugin
248 plugin_root = os.environ[plugin.upper()+"_ROOT_DIR"]
249 if not os.environ.has_key("SALOME_"+plugin+"Resources"):
250 os.environ["SALOME_"+plugin+"Resources"] = plugin_root+"/share/"+args["appname"]+"/resources"
251 add_path(os.path.join(plugin_root,"lib",python_version,"site-packages",args['appname']), "PYTHONPATH")
252 add_path(os.path.join(plugin_root,"lib",args['appname']), "PYTHONPATH")
253 add_path(os.path.join(plugin_root,"lib",args['appname']), "LD_LIBRARY_PATH")
254 add_path(os.path.join(plugin_root,"bin",args['appname']), "PYTHONPATH")
255 add_path(os.path.join(plugin_root,"bin",args['appname']), "PATH")
259 # set environment for SUPERV module
260 os.environ["ENABLE_MACRO_NODE"]="1"
265 # -----------------------------------------------------------------------------
270 session=clt.waitNS("/Kernel/Session",SALOME.Session)
273 # Activation du GUI de Session Server
276 session.GetInterface()
279 # -----------------------------------------------------------------------------
285 # Lancement Session Loader
289 SessionLoader().run()
292 # Initialisation ORB et Naming Service
295 clt=orbmodule.client()
297 # (non obligatoire) Lancement Logger Server et attente de sa disponibilite dans le naming service
302 clt.waitLogger("Logger")
304 # Notify Server launch
309 # Lancement Registry Server, attente de la disponibilité du Registry dans le Naming Service
311 if 'registry' not in args['embedded']:
312 RegistryServer().run()
313 clt.waitNS("/Registry")
316 # Lancement Catalog Server, attente de la disponibilité du Catalog Server dans le Naming Service
319 if 'moduleCatalog' not in args['embedded']:
320 cataServer=CatalogServer()
321 cataServer.setpath(modules_list)
323 import SALOME_ModuleCatalog
324 clt.waitNS("/Kernel/ModulCatalog",SALOME_ModuleCatalog.ModuleCatalog)
327 # Lancement SalomeDS Server, attente de la disponibilité du SalomeDS dans le Naming Service
330 os.environ["CSF_PluginDefaults"]=os.path.join(modules_root_dir["KERNEL"],"share",args['appname'],"resources")
331 os.environ["CSF_SALOMEDS_ResourcesDefaults"]=os.path.join(modules_root_dir["KERNEL"],"share",args['appname'],"resources")
333 if "GEOM" in modules_list:
334 print "GEOM OCAF Resources"
335 os.environ["CSF_GEOMDS_ResourcesDefaults"]=os.path.join(modules_root_dir["GEOM"],"share",args['appname'],"resources")
336 print "GEOM Shape Healing Resources"
337 os.environ["CSF_ShHealingDefaults"]=os.path.join(modules_root_dir["GEOM"],"share",args['appname'],"resources")
339 if 'study' not in args['embedded']:
340 SalomeDSServer().run()
341 clt.waitNS("/myStudyManager")
344 # Lancement Session Server
347 mySessionServ=SessionServer()
348 mySessionServ.setpath(modules_list)
352 # Attente de la disponibilité du Session Server dans le Naming Service
356 #session=clt.waitNS("/Kernel/Session",SALOME.Session)
358 if os.getenv("HOSTNAME") == None:
359 if os.getenv("HOST") == None:
360 os.environ["HOSTNAME"]="localhost"
362 os.environ["HOSTNAME"]=os.getenv("HOST")
364 theComputer = os.getenv("HOSTNAME")
365 computerSplitName = theComputer.split('.')
366 theComputer = computerSplitName[0]
369 # Lancement Container C++ local, attente de la disponibilité du Container C++ local dans le Naming Service
372 if 'cppContainer' in args['standalone']:
373 ContainerCPPServer().run()
374 clt.waitNS("/Containers/" + theComputer + "/FactoryServer")
377 # Lancement Container Python local, attente de la disponibilité du Container Python local dans le Naming Service
380 if 'pyContainer' in args['standalone']:
381 ContainerPYServer().run()
382 clt.waitNS("/Containers/" + theComputer + "/FactoryServerPy")
385 # Lancement Container Supervision local, attente de la disponibilité du Container Supervision local dans le Naming Service
388 if 'supervContainer' in args['standalone']:
389 ContainerSUPERVServer().run()
390 clt.waitNS("/Containers/" + theComputer + "/SuperVisionContainer")
392 end_time = os.times()
394 print "Start SALOME, elapsed time : %5.1f seconds"% (end_time[4] - init_time[4])
399 # -----------------------------------------------------------------------------
403 if __name__ == "__main__":
410 print "--- erreur au lancement Salome ---"
414 filedict='/tmp/'+os.getenv('USER')+"_"+str(args['port'])+'_'+args['appname'].upper()+'_pidict'
415 #filedict='/tmp/'+os.getlogin()+'_SALOME_pidict'
420 fpid=open(filedict, 'r')
421 process_ids=pickle.load(fpid)
426 fpid=open(filedict, 'w')
427 process_ids.append(process_id)
428 pickle.dump(process_ids,fpid)
432 Saving of the dictionary of Salome processes in %s
433 To kill SALOME processes from a console (kill all sessions from all ports):
435 To kill SALOME from the present interpreter, if it is not closed :
436 killLocalPort() --> kill this session
437 killAllPorts() --> kill all sessions
439 runSalome, with --killall option, starts with killing the processes resulting from the previous execution.
443 # Impression arborescence Naming Service
448 print " --- registered objects tree in Naming Service ---"