Salome HOME
NRI : Add new SALOME launch procedure.
[modules/yacs.git] / bin / runSalome.py
1 #!/usr/bin/env python
2
3 usage="""USAGE: runSalome.py module1 module2 ...
4  où modulen est le nom d'un module Salome à charger dans le catalogue
5  La variable d'environnement <modulen>_ROOT_DIR doit etre préalablement
6  positionnée (modulen doit etre en majuscule).
7  KERNEL_ROOT_DIR est obligatoire.
8 """
9
10 import sys,os,string,glob,time,signal,pickle
11
12 init_time=os.times()
13 liste_modules=sys.argv[1:]
14 modules_root_dir={}
15 process_id={}
16
17 # -----------------------------------------------------------------------------
18 #
19 # Vérification des variables d'environnement
20 #
21 try:
22   kernel_root_dir=os.environ["KERNEL_ROOT_DIR"]
23   modules_root_dir["KERNEL"]=kernel_root_dir
24 except:
25   print usage
26   sys.exit(1)
27
28 for module in liste_modules :
29    try:
30       module=module.upper()
31       module_root_dir=os.environ[module +"_ROOT_DIR"]
32       modules_root_dir[module]=module_root_dir
33    except:
34       print usage
35       sys.exit(1)
36
37 # il faut KERNEL en premier dans la liste des modules
38 # - l'ordre des modules dans le catalogue sera identique
39 # - la liste des modules presents dans le catalogue est exploitée pour charger les modules CORBA python,
40 #   il faut charger les modules python du KERNEL en premier
41
42 if "KERNEL" in liste_modules:liste_modules.remove("KERNEL")
43 liste_modules[:0]=["KERNEL"]
44 #print liste_modules
45 #print modules_root_dir
46
47 import orbmodule
48
49 # -----------------------------------------------------------------------------
50 #
51 # Définition des classes d'objets pour le lancement des Server CORBA
52 #
53
54 class Server:
55    CMD=[]
56    ARGS=['xterm', '-iconic', '-sb', '-sl', '500', '-e']
57    #ARGS=[]
58    def run(self):
59       args = self.ARGS+self.CMD
60       #print "args = ", args
61       pid = os.spawnvp(os.P_NOWAIT, args[0], args)
62       process_id[pid]=self.CMD
63
64 class CatalogServer(Server):
65    SCMD1=['SALOME_ModuleCatalog_Server','-common']
66    SCMD2=['-personal','${HOME}/Salome/resources/CatalogModulePersonnel.xml'] 
67
68    def setpath(self,liste_modules):
69       cata_path=[]
70       for module in liste_modules:
71           module_root_dir=modules_root_dir[module]
72           module_cata=module+"Catalog.xml"
73           print "   ", module_cata
74           cata_path.extend(glob.glob(os.path.join(module_root_dir,"share","salome","resources",module_cata)))
75       self.CMD=self.SCMD1 + [string.join(cata_path,':')] + self.SCMD2
76
77 class SalomeDSServer(Server):
78    CMD=['SALOMEDS_Server']
79
80 class RegistryServer(Server):
81    CMD=['SALOME_Registry_Server', '--salome_session','theSession']
82
83 class ContainerCPPServer(Server):
84    CMD=['SALOME_Container','FactoryServer','-ORBInitRef','NameService=corbaname::localhost']
85
86 class ContainerPYServer(Server):
87    CMD=['SALOME_ContainerPy.py','FactoryServerPy','-ORBInitRef','NameService=corbaname::localhost']
88
89 class ContainerSUPERVServer(Server):
90    CMD=['SALOME_Container','SuperVisionContainer','-ORBInitRef','NameService=corbaname::localhost']
91
92 class LoggerServer(Server):
93    CMD=['SALOME_Logger_Server', 'logger.log']
94
95 class SessionServer(Server):
96    CMD=['SALOME_Session_Server']
97
98 class NotifyServer(Server):
99    CMD=['notifd','-c','${KERNEL_ROOT_DIR}/share/salome/resources/channel.cfg -DFactoryIORFileName=/tmp/${LOGNAME}_rdifact.ior -DChannelIORFileName=/tmp/${LOGNAME}_rdichan.ior']
100
101 # -----------------------------------------------------------------------------
102 #
103 # Fonction d'arrêt de salome
104 #
105
106 def killSalome():
107    print "arret des serveurs SALOME"
108    for pid, cmd in process_id.items():
109       print "arret du process %s : %s"% (pid, cmd[0])
110       os.kill(pid,signal.SIGKILL)
111    print "arret du naming service"
112    os.system("killall -9 omniNames")
113    
114 # -----------------------------------------------------------------------------
115 #
116 # Fonction de test
117 #
118
119 def test(clt):
120    # create an LifeCycleCORBA instance
121    import LifeCycleCORBA 
122    lcc = LifeCycleCORBA.LifeCycleCORBA(clt.orb)
123    med = lcc.FindOrLoadComponent("FactoryServer", "MED")
124    #pycalc = lcc.FindOrLoadComponent("FactoryServerPy", "CalculatorPy")
125
126 # -----------------------------------------------------------------------------
127 #
128 # Fonctions helper pour ajouter des variables d'environnement
129 #
130
131 def add_path(directory):
132    os.environ["PATH"]=directory + ":" + os.environ["PATH"]
133
134 def add_ld_library_path(directory):
135    os.environ["LD_LIBRARY_PATH"]=directory + ":" + os.environ["LD_LIBRARY_PATH"]
136
137 def add_python_path(directory):
138    os.environ["PYTHONPATH"]=directory + ":" + os.environ["PYTHONPATH"]
139    sys.path[:0]=[directory]
140
141 # -----------------------------------------------------------------------------
142 #
143 # initialisation des variables d'environnement
144 #
145
146 python_version="python%d.%d" % sys.version_info[0:2]
147
148 #
149 # Ajout du chemin d'acces aux executables de KERNEL dans le PATH
150 #
151
152 add_path(os.path.join(kernel_root_dir,"bin","salome"))
153 #print "PATH=",os.environ["PATH"]
154
155 #
156 # Ajout des modules dans le LD_LIBRARY_PATH
157 #
158 for module in liste_modules:
159     module_root_dir=modules_root_dir[module]
160     add_ld_library_path(os.path.join(module_root_dir,"lib","salome"))
161 #print "LD_LIBRARY_PATH=",os.environ["LD_LIBRARY_PATH"]
162
163 #
164 # Ajout des modules dans le PYTHONPATH (KERNEL prioritaire, donc en dernier)
165 #
166
167 liste_modules_reverse=liste_modules[:]
168 liste_modules_reverse.reverse()
169 #print liste_modules
170 #print liste_modules_reverse
171 for module in liste_modules_reverse:
172     module_root_dir=modules_root_dir[module]
173     add_python_path(os.path.join(module_root_dir,"bin","salome"))
174     add_python_path(os.path.join(module_root_dir,"lib",python_version,"site-packages","salome"))
175     add_python_path(os.path.join(module_root_dir,"lib","salome"))
176
177 #print "PYTHONPATH=",sys.path
178
179 #
180 # -----------------------------------------------------------------------------
181 #
182    
183 def startSalome():
184   #
185   # Initialisation ORB et Naming Service
186   #
187    
188   clt=orbmodule.client()
189
190   # (non obligatoire) Lancement Logger Server et attente de sa disponibilite dans le naming service
191   #
192
193   #LoggerServer().run()
194   #clt.waitLogger("Logger")
195
196   #
197   # Lancement Registry Server
198   #
199
200   RegistryServer().run()
201
202   #
203   # Attente de la disponibilité du Registry dans le Naming Service
204   #
205
206   clt.waitNS("/Registry")
207
208   #
209   # Lancement Catalog Server
210   #
211
212   cataServer=CatalogServer()
213   cataServer.setpath(liste_modules)
214   cataServer.run()
215
216   #
217   # Attente de la disponibilité du Catalog Server dans le Naming Service
218   #
219
220   import SALOME_ModuleCatalog
221   clt.waitNS("/Kernel/ModulCatalog",SALOME_ModuleCatalog.ModuleCatalog)
222
223   #
224   # Lancement SalomeDS Server
225   #
226
227   os.environ["CSF_PluginDefaults"]=os.path.join(kernel_root_dir,"share","salome","resources")
228   os.environ["CSF_SALOMEDS_ResourcesDefaults"]=os.path.join(kernel_root_dir,"share","salome","resources")
229   SalomeDSServer().run()
230
231   if "GEOM" in liste_modules:
232         print "GEOM OCAF Resources"
233         os.environ["CSF_GEOMDS_ResourcesDefaults"]=os.path.join(modules_root_dir["GEOM"],"share","salome","resources")
234
235
236   #
237   # Attente de la disponibilité du SalomeDS dans le Naming Service
238   #
239
240   clt.waitNS("/myStudyManager")
241
242   #
243   # Lancement Session Server
244   #
245
246   SessionServer().run()
247
248   #
249   # Attente de la disponibilité du Session Server dans le Naming Service
250   #
251
252   import SALOME
253   session=clt.waitNS("/Kernel/Session",SALOME.Session)
254
255   #
256   # Lancement Container C++ local
257   #
258
259   ContainerCPPServer().run()
260
261   #
262   # Attente de la disponibilité du Container C++ local dans le Naming Service
263   #
264
265   theComputer = os.getenv("HOSTNAME")
266   computerSplitName = theComputer.split('.')
267   theComputer = computerSplitName[0]
268
269   clt.waitNS("/Containers/" + theComputer + "/FactoryServer")
270
271   #
272   # Lancement Container Python local
273   #
274
275   ContainerPYServer().run()
276
277   #
278   # Attente de la disponibilité du Container Python local dans le Naming Service
279   #
280
281   clt.waitNS("/Containers/" + theComputer + "/FactoryServerPy")
282
283
284   if "SUPERV" in liste_modules:
285
286         #
287         # Lancement Container Supervision local
288         #
289
290         ContainerSUPERVServer().run()
291
292         #
293         # Attente de la disponibilité du Container Supervision local dans le Naming Service
294         #
295
296         clt.waitNS("/Containers/" + theComputer + "/SuperVisionContainer")
297
298   #
299   # Activation du GUI de Session Server
300   #
301
302   session.GetInterface()
303
304   end_time = os.times()
305   print
306   print "Start SALOME, elpased time : %5.1f seconds"% (end_time[4] - init_time[4])
307
308   return clt
309
310 #
311 # -----------------------------------------------------------------------------
312 #
313
314 clt=None
315 try:
316    clt = startSalome()
317 except:
318    print
319    print
320    print "--- erreur au lancement Salome ---"
321
322 #print process_id
323
324
325 filedict='/tmp/'+os.getenv('USER')+'_SALOME_pidict'
326 #filedict='/tmp/'+os.getlogin()+'_SALOME_pidict'
327
328 fpid=open(filedict, 'w')
329 pickle.dump(process_id,fpid)
330 fpid.close()
331
332 print
333 print "Sauvegarde du dictionnaire des process dans ", filedict
334 print "Pour tuer les process SALOME, executer : python killSalome.py depuis"
335 print "une console, ou bien killSalome() depuis le present interpreteur,"
336 print "s'il n'est pas fermé."
337 print "runSalome commence par tuer les process restants d'une execution précédente."
338
339 #
340 #  Impression arborescence Naming Service
341 #
342
343 if clt != None:
344   print
345   print " --- registered objects tree in Naming Service ---"
346   clt.showNS()
347