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):
38 for _dir in os.environ[variable_name].split(":"):
39 if os.path.exists(_dir):
40 if os.path.samefile(_dir, directory):
43 if os.path.abspath(_dir) == os.path.abspath(directory):
46 if os.environ[variable_name] == "":
47 os.environ[variable_name] = directory
49 os.environ[variable_name] = directory + ":" + os.environ[variable_name]
50 if variable_name == "PYTHONPATH":
51 sys.path[:0] = [directory]
54 init_time = os.times()
55 # -----------------------------------------------------------------------------
57 # Check variables <module>_ROOT_DIR and set list of used modules (without KERNEL)
58 # Add to the PATH-variables modules' specific paths
61 if args.has_key("modules"):
62 modules_list += args["modules"]
63 modules_list[:0] = ["KERNEL"] # KERNEL must be last in the list to locate it at the first place in PATH variables
64 modules_list.reverse()
67 modules_root_dir_list = []
68 python_version="python%d.%d" % sys.version_info[0:2]
71 for module in modules_list :
72 module_variable=module.upper()+"_ROOT_DIR"
73 if not os.environ.has_key(module_variable):
74 print "*******************************************************************************"
76 print "* Environment variable",module_variable,"must be set"
77 print "* Module", module, "will be not available"
79 print "*******************************************************************************"
80 to_remove_list.append(module)
83 module_root_dir = os.environ[module_variable]
84 modules_root_dir[module]=module_root_dir
85 modules_root_dir_list[:0] = [module_root_dir]
86 add_path(os.path.join(module_root_dir,"lib",args['appname']), "LD_LIBRARY_PATH")
87 add_path(os.path.join(module_root_dir,"bin",args['appname']), "PATH")
88 if os.path.exists(module_root_dir + "/examples") :
89 add_path(os.path.join(module_root_dir,"examples"), "PYTHONPATH")
91 for to_remove in to_remove_list:
92 modules_list.remove(to_remove)
94 while "KERNEL" in modules_list:
95 modules_list.remove("KERNEL")
98 # KERNEL must be last in the list to locate it at the first place in PYTHONPATH variable
99 list_modules = modules_list[:] + ["KERNEL"]
100 for module in list_modules:
101 module_root_dir = modules_root_dir[module]
102 add_path(os.path.join(module_root_dir,"bin",args['appname']), "PYTHONPATH")
103 add_path(os.path.join(module_root_dir,"lib",python_version,"site-packages",args['appname']), "PYTHONPATH")
104 add_path(os.path.join(module_root_dir,"lib",args['appname']), "PYTHONPATH")
105 add_path(os.path.join(module_root_dir,"lib",python_version,"site-packages",args['appname'],"shared_modules"), "PYTHONPATH")
107 #os.environ["SALOMEPATH"]=":".join(modules_root_dir.values())
108 os.environ["SALOMEPATH"]=":".join(modules_root_dir_list)
109 if "SUPERV" in modules_list and not 'superv' in args['standalone']:
110 args['standalone'].append("superv")
114 # -----------------------------------------------------------------------------
116 # Définition des classes d'objets pour le lancement des Server CORBA
122 ARGS=['xterm', '-iconic', '-sb', '-sl', '500', '-hold']
130 # (Debian) Transfert variable LD_LIBRARY_PATH aux shells fils (xterm)
131 env_ld_library_path=['env', 'LD_LIBRARY_PATH='+ os.getenv("LD_LIBRARY_PATH")]
132 myargs = myargs +['-T']+self.CMD[:1]+['-e'] + env_ld_library_path
133 command = myargs + self.CMD
134 #print "command = ", command
135 pid = os.spawnvp(os.P_NOWAIT, command[0], command)
136 process_id[pid]=self.CMD
138 class CatalogServer(Server):
139 SCMD1=['SALOME_ModuleCatalog_Server','-common']
140 SCMD2=['-personal','${HOME}/Salome/resources/CatalogModulePersonnel.xml']
142 def setpath(self,modules_list):
144 list_modules = modules_list[:]
145 list_modules.reverse()
146 for module in ["KERNEL"] + list_modules:
147 module_root_dir=modules_root_dir[module]
148 module_cata=module+"Catalog.xml"
149 print " ", module_cata
150 cata_path.extend(glob.glob(os.path.join(module_root_dir,"share",args['appname'],"resources",module_cata)))
151 self.CMD=self.SCMD1 + [string.join(cata_path,':')] + self.SCMD2
153 class SalomeDSServer(Server):
154 CMD=['SALOMEDS_Server']
156 class RegistryServer(Server):
157 CMD=['SALOME_Registry_Server', '--salome_session','theSession']
159 class ContainerCPPServer(Server):
160 #CMD=['SALOME_Container','FactoryServer','-ORBInitRef','NameService=corbaname::localhost']
161 CMD=['SALOME_Container','FactoryServer']
163 class ContainerPYServer(Server):
164 #CMD=['SALOME_ContainerPy.py','FactoryServerPy','-ORBInitRef','NameService=corbaname::localhost']
165 CMD=['SALOME_ContainerPy.py','FactoryServerPy']
167 class ContainerSUPERVServer(Server):
168 #CMD=['SALOME_Container','SuperVisionContainer','-ORBInitRef','NameService=corbaname::localhost']
169 CMD=['SALOME_Container','SuperVisionContainer']
171 class LoggerServer(Server):
172 CMD=['SALOME_Logger_Server', 'logger.log']
174 class SessionLoader(Server):
175 CMD=['SALOME_Session_Loader']
176 if "cpp" in args['containers']:
178 if "python" in args['containers']:
180 if "superv" in args['containers']:
185 class SessionServer(Server):
186 SCMD1=['SALOME_Session_Server']
188 if 'registry' in args['embedded']:
189 SCMD1+=['--with','Registry','(','--salome_session','theSession',')']
190 if 'moduleCatalog' in args['embedded']:
191 SCMD1+=['--with','ModuleCatalog','(','-common']
192 SCMD2+=['-personal','${HOME}/Salome/resources/CatalogModulePersonnel.xml',')']
193 if 'study' in args['embedded']:
194 SCMD2+=['--with','SALOMEDS','(',')']
195 if 'cppContainer' in args['embedded']:
196 SCMD2+=['--with','Container','(','FactoryServer',')']
198 def setpath(self,modules_list):
200 list_modules = modules_list[:]
201 list_modules.reverse()
202 for module in ["KERNEL"] + list_modules:
203 module_root_dir=modules_root_dir[module]
204 module_cata=module+"Catalog.xml"
205 print " ", module_cata
206 cata_path.extend(glob.glob(os.path.join(module_root_dir,"share",args['appname'],"resources",module_cata)))
207 if 'moduleCatalog' in args['embedded']:
208 self.CMD=self.SCMD1 + [string.join(cata_path,':')] + self.SCMD2
210 self.CMD=self.SCMD1 + self.SCMD2
212 class NotifyServer(Server):
213 myLogName = os.environ["LOGNAME"]
214 CMD=['notifd','-c',modules_root_dir["KERNEL"]+'/share/salome/resources/channel.cfg', '-DFactoryIORFileName=/tmp/'+myLogName+'_rdifact.ior', '-DChannelIORFileName=/tmp/'+myLogName+'_rdichan.ior']
216 # -----------------------------------------------------------------------------
218 # initialisation des variables d'environnement
221 os.environ["SALOME_trace"]="local"
223 os.environ["SALOME_trace"]="with_logger"
224 locdir=os.environ['PWD']
225 libtracedir=os.path.join(locdir,"libSalomeTrace")
226 libtrace = os.path.join(modules_root_dir["KERNEL"],"lib",args['appname'],"libSALOMELoggerClient.so.0.0.0")
227 libtraceln = os.path.join(libtracedir,"libSALOMELocalTrace.so")
228 aCommand = 'rm -rf ' + libtracedir + "; "
229 aCommand += 'mkdir ' + libtracedir + "; "
230 aCommand += 'ln -s ' + libtrace + " " + libtraceln + "; "
231 aCommand += 'ln -s ' + libtrace + " " + libtraceln + ".0; "
232 aCommand += 'ln -s ' + libtrace + " " + libtraceln + ".0.0.0; "
234 add_path(libtracedir, "LD_LIBRARY_PATH")
236 # set environment for SMESH plugins
238 if "SMESH" in modules_list:
239 os.environ["SMESH_MeshersList"]="StdMeshers"
240 if not os.environ.has_key("SALOME_StdMeshersResources"):
241 os.environ["SALOME_StdMeshersResources"] = modules_root_dir["SMESH"]+"/share/"+args["appname"]+"/resources"
243 if args.has_key("SMESH_plugins"):
244 for plugin in args["SMESH_plugins"]:
245 if os.environ.has_key(plugin.upper()+"_ROOT_DIR"):
246 os.environ["SMESH_MeshersList"]=os.environ["SMESH_MeshersList"]+":"+plugin
247 plugin_root = os.environ[plugin.upper()+"_ROOT_DIR"]
248 if not os.environ.has_key("SALOME_"+plugin+"Resources"):
249 os.environ["SALOME_"+plugin+"Resources"] = plugin_root+"/share/"+args["appname"]+"/resources"
250 add_path(os.path.join(plugin_root,"lib",python_version,"site-packages",args['appname']), "PYTHONPATH")
251 add_path(os.path.join(plugin_root,"lib",args['appname']), "PYTHONPATH")
252 add_path(os.path.join(plugin_root,"lib",args['appname']), "LD_LIBRARY_PATH")
253 add_path(os.path.join(plugin_root,"bin",args['appname']), "PYTHONPATH")
254 add_path(os.path.join(plugin_root,"bin",args['appname']), "PATH")
261 # -----------------------------------------------------------------------------
266 session=clt.waitNS("/Kernel/Session",SALOME.Session)
269 # Activation du GUI de Session Server
272 session.GetInterface()
275 # -----------------------------------------------------------------------------
281 # Lancement Session Loader
285 SessionLoader().run()
288 # Initialisation ORB et Naming Service
291 clt=orbmodule.client()
293 # (non obligatoire) Lancement Logger Server et attente de sa disponibilite dans le naming service
298 clt.waitLogger("Logger")
300 # Notify Server launch
305 # Lancement Registry Server, attente de la disponibilité du Registry dans le Naming Service
307 if 'registry' not in args['embedded']:
308 RegistryServer().run()
309 clt.waitNS("/Registry")
312 # Lancement Catalog Server, attente de la disponibilité du Catalog Server dans le Naming Service
315 if 'moduleCatalog' not in args['embedded']:
316 cataServer=CatalogServer()
317 cataServer.setpath(modules_list)
319 import SALOME_ModuleCatalog
320 clt.waitNS("/Kernel/ModulCatalog",SALOME_ModuleCatalog.ModuleCatalog)
323 # Lancement SalomeDS Server, attente de la disponibilité du SalomeDS dans le Naming Service
326 os.environ["CSF_PluginDefaults"]=os.path.join(modules_root_dir["KERNEL"],"share",args['appname'],"resources")
327 os.environ["CSF_SALOMEDS_ResourcesDefaults"]=os.path.join(modules_root_dir["KERNEL"],"share",args['appname'],"resources")
329 if "GEOM" in modules_list:
330 print "GEOM OCAF Resources"
331 os.environ["CSF_GEOMDS_ResourcesDefaults"]=os.path.join(modules_root_dir["GEOM"],"share",args['appname'],"resources")
333 if 'study' not in args['embedded']:
334 SalomeDSServer().run()
335 clt.waitNS("/myStudyManager")
338 # Lancement Session Server
341 mySessionServ=SessionServer()
342 mySessionServ.setpath(modules_list)
346 # Attente de la disponibilité du Session Server dans le Naming Service
350 #session=clt.waitNS("/Kernel/Session",SALOME.Session)
352 if os.getenv("HOSTNAME") == None:
353 if os.getenv("HOST") == None:
354 os.environ["HOSTNAME"]="localhost"
356 os.environ["HOSTNAME"]=os.getenv("HOST")
358 theComputer = os.getenv("HOSTNAME")
359 computerSplitName = theComputer.split('.')
360 theComputer = computerSplitName[0]
363 # Lancement Container C++ local, attente de la disponibilité du Container C++ local dans le Naming Service
366 if 'cppContainer' in args['standalone']:
367 ContainerCPPServer().run()
368 clt.waitNS("/Containers/" + theComputer + "/FactoryServer")
371 # Lancement Container Python local, attente de la disponibilité du Container Python local dans le Naming Service
374 if 'pyContainer' in args['standalone']:
375 ContainerPYServer().run()
376 clt.waitNS("/Containers/" + theComputer + "/FactoryServerPy")
379 # Lancement Container Supervision local, attente de la disponibilité du Container Supervision local dans le Naming Service
382 if 'supervContainer' in args['standalone']:
383 ContainerSUPERVServer().run()
384 clt.waitNS("/Containers/" + theComputer + "/SuperVisionContainer")
386 end_time = os.times()
388 print "Start SALOME, elapsed time : %5.1f seconds"% (end_time[4] - init_time[4])
393 # -----------------------------------------------------------------------------
397 if __name__ == "__main__":
404 print "--- erreur au lancement Salome ---"
408 filedict='/tmp/'+os.getenv('USER')+"_"+str(args['port'])+'_'+args['appname'].upper()+'_pidict'
409 #filedict='/tmp/'+os.getlogin()+'_SALOME_pidict'
414 fpid=open(filedict, 'r')
415 process_ids=pickle.load(fpid)
420 fpid=open(filedict, 'w')
421 process_ids.append(process_id)
422 pickle.dump(process_ids,fpid)
426 Saving of the dictionary of Salome processes in %s
427 To kill SALOME processes from a console (kill all sessions from all ports):
429 To kill SALOME from the present interpreter, if it is not closed :
430 killLocalPort() --> kill this session
431 killAllPorts() --> kill all sessions
433 runSalome, with --killall option, starts with killing the processes resulting from the previous execution.
437 # Impression arborescence Naming Service
442 print " --- registered objects tree in Naming Service ---"