Salome HOME
af5d4c114f9fd937b6f52431a65999d6ff04568c
[modules/kernel.git] / bin / runSalome.py
1 #!/usr/bin/env python
2
3 import sys, os, string, glob, time, pickle
4
5 ### read launch configure xml file and command line options
6 import launchConfigureParser
7 args = launchConfigureParser.args
8
9 ### kill servers if it is need
10
11 from killSalome import killAllPorts
12
13 def killLocalPort():
14     from killSalomeWithPort import killMyPort
15     my_port=str(args['port'])
16     try:
17         killMyPort(my_port)
18     except:
19         print "problem in killLocalPort()"
20         pass
21     pass
22     
23 if args['killall']:
24     killAllPorts()
25 elif args['portkill']:
26     killLocalPort()
27         
28 # -----------------------------------------------------------------------------
29 #
30 # Fonctions helper pour ajouter des variables d'environnement
31 #
32
33 def add_path(directory, variable_name):
34     if not os.environ.has_key(variable_name):
35         os.environ[variable_name] = ""
36         pass
37     if os.path.exists(directory):
38         newpath=[]
39         for _dir in os.environ[variable_name].split(":"):
40             if os.path.exists(_dir):
41                 if not os.path.samefile(_dir, directory):
42                   newpath.append(_dir)
43             else:
44                 if os.path.abspath(_dir) != os.path.abspath(directory):
45                   newpath.append(_dir)
46             pass
47         import string
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]
53
54
55 init_time = os.times()
56 # -----------------------------------------------------------------------------
57 #
58 # Check variables <module>_ROOT_DIR and set list of used modules (without KERNEL)
59 # Add to the PATH-variables modules' specific paths
60 #
61 modules_list = []
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()
66
67 modules_root_dir = {}
68 modules_root_dir_list = []
69 python_version="python%d.%d" % sys.version_info[0:2]
70
71 to_remove_list=[]
72 for module in modules_list :
73     module_variable=module.upper()+"_ROOT_DIR"
74     if not os.environ.has_key(module_variable):
75         print "*******************************************************************************"
76         print "*"
77         print "* Environment variable",module_variable,"must be set"
78         print "* Module", module, "will be not available"
79         print "*"
80         print "*******************************************************************************"
81         to_remove_list.append(module)
82         continue
83         pass
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")
91
92 for to_remove in to_remove_list:
93     modules_list.remove(to_remove)
94
95 while "KERNEL" in modules_list:
96     modules_list.remove("KERNEL")
97     pass
98
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")
107       
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")
112     pass
113
114
115 # -----------------------------------------------------------------------------
116 #
117 # Définition des classes d'objets pour le lancement des Server CORBA
118 #
119
120 class Server:
121    CMD=[]
122    if args['xterm']:
123         ARGS=['xterm', '-iconic', '-sb', '-sl', '500', '-hold']
124    else:
125         ARGS=[] 
126
127    def run(self):
128        global process_id
129        myargs=self.ARGS
130        if args['xterm']:
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
138
139 class CatalogServer(Server):
140    SCMD1=['SALOME_ModuleCatalog_Server','-common']
141    SCMD2=['-personal','${HOME}/Salome/resources/CatalogModulePersonnel.xml'] 
142
143    def setpath(self,modules_list):
144       cata_path=[]
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
153
154 class SalomeDSServer(Server):
155    CMD=['SALOMEDS_Server']
156
157 class RegistryServer(Server):
158    CMD=['SALOME_Registry_Server', '--salome_session','theSession']
159
160 class ContainerCPPServer(Server):
161    #CMD=['SALOME_Container','FactoryServer','-ORBInitRef','NameService=corbaname::localhost']
162    CMD=['SALOME_Container','FactoryServer']
163
164 class ContainerPYServer(Server):
165    #CMD=['SALOME_ContainerPy.py','FactoryServerPy','-ORBInitRef','NameService=corbaname::localhost']
166    CMD=['SALOME_ContainerPy.py','FactoryServerPy']
167
168 class ContainerSUPERVServer(Server):
169    #CMD=['SALOME_Container','SuperVisionContainer','-ORBInitRef','NameService=corbaname::localhost']
170    CMD=['SALOME_Container','SuperVisionContainer']
171
172 class LoggerServer(Server):
173    CMD=['SALOME_Logger_Server', 'logger.log']
174
175 class SessionLoader(Server):
176    CMD=['SALOME_Session_Loader']
177    if "cpp" in args['containers']:
178        CMD=CMD+['CPP']
179    if "python" in args['containers']:
180        CMD=CMD+['PY']
181    if "superv" in args['containers']:
182        CMD=CMD+['SUPERV']
183    if args['gui']:
184        CMD=CMD+['GUI']
185
186 class SessionServer(Server):
187    SCMD1=['SALOME_Session_Server']
188    SCMD2=[]
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',')']
198
199    def setpath(self,modules_list):
200       cata_path=[]
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
210       else:
211           self.CMD=self.SCMD1 + self.SCMD2
212
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']
216
217 # -----------------------------------------------------------------------------
218 #
219 # initialisation des variables d'environnement
220 #
221
222 os.environ["SALOME_trace"]="local"
223 if args['logger']:
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; "
234    os.system(aCommand)
235    add_path(libtracedir, "LD_LIBRARY_PATH")
236
237 # set environment for SMESH plugins
238
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"
243         pass
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")
256         pass
257     pass
258    
259 import orbmodule
260
261 #
262 # -----------------------------------------------------------------------------
263 #
264
265 def startGUI():
266   import SALOME
267   session=clt.waitNS("/Kernel/Session",SALOME.Session)
268
269   #
270   # Activation du GUI de Session Server
271   #
272         
273   session.GetInterface()
274   
275 #
276 # -----------------------------------------------------------------------------
277 #
278
279 def startSalome():
280
281   #
282   # Lancement Session Loader
283   #
284
285   if args['gui']:
286      SessionLoader().run()
287
288   #
289   # Initialisation ORB et Naming Service
290   #
291    
292   clt=orbmodule.client()
293
294   # (non obligatoire) Lancement Logger Server et attente de sa disponibilite dans le naming service
295   #
296
297   if args['logger']:
298         LoggerServer().run()
299         clt.waitLogger("Logger")
300
301   # Notify Server launch
302   #
303   NotifyServer().run()
304
305   #
306   # Lancement Registry Server, attente de la disponibilité du Registry dans le Naming Service
307   #
308   if 'registry' not in args['embedded']:
309       RegistryServer().run()
310       clt.waitNS("/Registry")
311
312   #
313   # Lancement Catalog Server, attente de la disponibilité du Catalog Server dans le Naming Service
314   #
315
316   if 'moduleCatalog' not in args['embedded']:
317       cataServer=CatalogServer()
318       cataServer.setpath(modules_list)
319       cataServer.run()
320       import SALOME_ModuleCatalog
321       clt.waitNS("/Kernel/ModulCatalog",SALOME_ModuleCatalog.ModuleCatalog)
322
323   #
324   # Lancement SalomeDS Server, attente de la disponibilité du SalomeDS dans le Naming Service
325   #
326
327   os.environ["CSF_PluginDefaults"]=os.path.join(modules_root_dir["KERNEL"],"share",args['appname'],"resources")
328   os.environ["CSF_SALOMEDS_ResourcesDefaults"]=os.path.join(modules_root_dir["KERNEL"],"share",args['appname'],"resources")
329
330   if "GEOM" in modules_list:
331         print "GEOM OCAF Resources"
332         os.environ["CSF_GEOMDS_ResourcesDefaults"]=os.path.join(modules_root_dir["GEOM"],"share",args['appname'],"resources")
333
334   if 'study' not in args['embedded']:
335       SalomeDSServer().run()
336       clt.waitNS("/myStudyManager")
337
338   #
339   # Lancement Session Server
340   #
341
342   mySessionServ=SessionServer()
343   mySessionServ.setpath(modules_list)
344   mySessionServ.run()
345
346   #
347   # Attente de la disponibilité du Session Server dans le Naming Service
348   #
349
350   #import SALOME
351   #session=clt.waitNS("/Kernel/Session",SALOME.Session)
352
353   if os.getenv("HOSTNAME") == None:
354      if os.getenv("HOST") == None:
355         os.environ["HOSTNAME"]="localhost"
356      else:
357         os.environ["HOSTNAME"]=os.getenv("HOST")
358
359   theComputer = os.getenv("HOSTNAME")
360   computerSplitName = theComputer.split('.')
361   theComputer = computerSplitName[0]
362   
363   #
364   # Lancement Container C++ local, attente de la disponibilité du Container C++ local dans le Naming Service
365   #
366
367   if 'cppContainer' in args['standalone']:
368           ContainerCPPServer().run()
369           clt.waitNS("/Containers/" + theComputer + "/FactoryServer")
370
371   #
372   # Lancement Container Python local, attente de la disponibilité du Container Python local dans le Naming Service
373   #
374
375   if 'pyContainer' in args['standalone']:
376           ContainerPYServer().run()
377           clt.waitNS("/Containers/" + theComputer + "/FactoryServerPy")
378
379   #
380   # Lancement Container Supervision local, attente de la disponibilité du Container Supervision local dans le Naming Service
381   #
382
383   if 'supervContainer' in args['standalone']:
384       ContainerSUPERVServer().run()
385       clt.waitNS("/Containers/" + theComputer + "/SuperVisionContainer")
386
387   end_time = os.times()
388   print
389   print "Start SALOME, elapsed time : %5.1f seconds"% (end_time[4] - init_time[4])
390
391   return clt
392
393 #
394 # -----------------------------------------------------------------------------
395 #
396
397 process_id = {}
398 if __name__ == "__main__":
399     clt=None
400     try:
401         clt = startSalome()
402     except:
403         print
404         print
405         print "--- erreur au lancement Salome ---"
406         
407     #print process_id
408     
409     filedict='/tmp/'+os.getenv('USER')+"_"+str(args['port'])+'_'+args['appname'].upper()+'_pidict'
410     #filedict='/tmp/'+os.getlogin()+'_SALOME_pidict'
411     
412     
413     process_ids = []
414     try:
415         fpid=open(filedict, 'r')
416         process_ids=pickle.load(fpid)
417         fpid.close()
418     except:
419         pass
420     
421     fpid=open(filedict, 'w')
422     process_ids.append(process_id)
423     pickle.dump(process_ids,fpid)
424     fpid.close()
425     
426     print """
427     Saving of the dictionary of Salome processes in %s
428     To kill SALOME processes from a console (kill all sessions from all ports):
429       python killSalome.py 
430     To kill SALOME from the present interpreter, if it is not closed :
431       killLocalPort()  --> kill this session
432       killAllPorts()   --> kill all sessions
433     
434     runSalome, with --killall option, starts with killing the processes resulting from the previous execution.
435     """%filedict
436     
437     #
438     #  Impression arborescence Naming Service
439     #
440     
441     if clt != None:
442         print
443         print " --- registered objects tree in Naming Service ---"
444         clt.showNS()