3 usage="""USAGE: runSalome.py [options]
5 [command line options] :
6 --help : affichage de l'aide
7 --gui : lancement du GUI
8 --logger : redirection des messages dans un fichier
9 --xterm : les serveurs ouvrent une fenêtre xterm et les messages sont affichés dans cette fenêtre
10 --modules=module1,module2,... : où modulen est le nom d'un module Salome à charger dans le catalogue
11 --containers=cpp,python,superv: lancement des containers cpp, python et de supervision
12 --killall : arrêt des serveurs de salome
14 La variable d'environnement <modulen>_ROOT_DIR doit etre préalablement
15 positionnée (modulen doit etre en majuscule).
16 KERNEL_ROOT_DIR est obligatoire.
19 # -----------------------------------------------------------------------------
21 # Fonction d'arrêt de salome
25 print "arret des serveurs SALOME"
26 for pid, cmd in process_id.items():
27 print "arret du process %s : %s"% (pid, cmd[0])
29 os.kill(pid,signal.SIGKILL)
31 print " ------------------ process %s : %s inexistant"% (pid, cmd[0])
32 print "arret du naming service"
33 os.system("killall -9 omniNames")
35 # -----------------------------------------------------------------------------
40 def message(code, msg=''):
44 import sys,os,string,glob,time,signal,pickle,getopt
47 opts, args=getopt.getopt(sys.argv[1:], 'hmglxck:', ['help','modules=','gui','logger','xterm','containers=','killall'])
57 with_container_python=0
58 with_container_superv=0
62 if o in ('-h', '--help'):
65 elif o in ('-g', '--gui'):
67 elif o in ('-l', '--logger'):
69 elif o in ('-x', '--xterm'):
71 elif o in ('-m', '--modules'):
72 liste_modules = [x.upper() for x in a.split(',')]
73 elif o in ('-c', '--containers'):
74 liste_containers = [x.lower() for x in a.split(',')]
75 for r in liste_containers:
76 if r not in ('cpp', 'python', 'superv'):
77 message(1, 'Invalid -c/--containers option: %s' % a)
78 if 'cpp' in liste_containers:
82 if 'python' in liste_containers:
83 with_container_python=1
85 with_container_python=0
86 if 'superv' in liste_containers:
87 with_container_superv=1
89 with_container_superv=0
90 elif o in ('-k', '--killall'):
91 filedict='/tmp/'+os.getenv('USER')+'_SALOME_pidict'
92 #filedict='/tmp/'+os.getlogin()+'_SALOME_pidict'
95 fpid=open(filedict, 'r')
98 print "le fichier %s des process SALOME n'est pas accessible"% filedict
101 process_id=pickle.load(fpid)
107 except getopt.error, msg:
111 # -----------------------------------------------------------------------------
113 # Vérification des variables d'environnement
116 kernel_root_dir=os.environ["KERNEL_ROOT_DIR"]
117 modules_root_dir["KERNEL"]=kernel_root_dir
122 for module in liste_modules :
124 module=module.upper()
125 module_root_dir=os.environ[module +"_ROOT_DIR"]
126 modules_root_dir[module]=module_root_dir
131 # il faut KERNEL en premier dans la liste des modules
132 # - l'ordre des modules dans le catalogue sera identique
133 # - la liste des modules presents dans le catalogue est exploitée pour charger les modules CORBA python,
134 # il faut charger les modules python du KERNEL en premier
136 if "KERNEL" in liste_modules:liste_modules.remove("KERNEL")
137 liste_modules[:0]=["KERNEL"]
139 #print modules_root_dir
141 os.environ["SALOMEPATH"]=":".join(modules_root_dir.values())
142 if "SUPERV" in liste_modules:with_container_superv=1
145 # -----------------------------------------------------------------------------
147 # Définition des classes d'objets pour le lancement des Server CORBA
153 ARGS=['xterm', '-iconic', '-sb', '-sl', '500', '-hold']
160 # (Debian) Transfert variable LD_LIBRARY_PATH aux shells fils (xterm)
161 env_ld_library_path=['env', 'LD_LIBRARY_PATH='+ os.getenv("LD_LIBRARY_PATH")]
162 args = args +['-T']+self.CMD[:1]+['-e'] + env_ld_library_path
163 args = args + self.CMD
164 #print "args = ", args
165 pid = os.spawnvp(os.P_NOWAIT, args[0], args)
166 process_id[pid]=self.CMD
168 class CatalogServer(Server):
169 SCMD1=['SALOME_ModuleCatalog_Server','-common']
170 SCMD2=['-personal','${HOME}/Salome/resources/CatalogModulePersonnel.xml']
172 def setpath(self,liste_modules):
174 for module in liste_modules:
175 module_root_dir=modules_root_dir[module]
176 module_cata=module+"Catalog.xml"
177 print " ", module_cata
178 cata_path.extend(glob.glob(os.path.join(module_root_dir,"share","salome","resources",module_cata)))
179 self.CMD=self.SCMD1 + [string.join(cata_path,':')] + self.SCMD2
181 class SalomeDSServer(Server):
182 CMD=['SALOMEDS_Server']
184 class RegistryServer(Server):
185 CMD=['SALOME_Registry_Server', '--salome_session','theSession']
187 class ContainerCPPServer(Server):
188 CMD=['SALOME_Container','FactoryServer','-ORBInitRef','NameService=corbaname::localhost']
190 class ContainerPYServer(Server):
191 CMD=['SALOME_ContainerPy.py','FactoryServerPy','-ORBInitRef','NameService=corbaname::localhost']
193 class ContainerSUPERVServer(Server):
194 CMD=['SALOME_Container','SuperVisionContainer','-ORBInitRef','NameService=corbaname::localhost']
196 class LoggerServer(Server):
197 CMD=['SALOME_Logger_Server', 'logger.log']
199 class SessionLoader(Server):
200 CMD=['SALOME_Session_Loader']
201 if with_container_cpp:
203 if with_container_python:
205 if with_container_superv:
210 class SessionServer(Server):
211 CMD=['SALOME_Session_Server']
213 class NotifyServer(Server):
214 CMD=['notifd','-c','${KERNEL_ROOT_DIR}/share/salome/resources/channel.cfg -DFactoryIORFileName=/tmp/${LOGNAME}_rdifact.ior -DChannelIORFileName=/tmp/${LOGNAME}_rdichan.ior']
216 # -----------------------------------------------------------------------------
222 # create an LifeCycleCORBA instance
223 import LifeCycleCORBA
224 lcc = LifeCycleCORBA.LifeCycleCORBA(clt.orb)
225 med = lcc.FindOrLoadComponent("FactoryServer", "MED")
226 #pycalc = lcc.FindOrLoadComponent("FactoryServerPy", "CalculatorPy")
228 # -----------------------------------------------------------------------------
230 # Fonctions helper pour ajouter des variables d'environnement
233 def add_path(directory):
234 os.environ["PATH"]=directory + ":" + os.environ["PATH"]
236 def add_ld_library_path(directory):
237 os.environ["LD_LIBRARY_PATH"]=directory + ":" + os.environ["LD_LIBRARY_PATH"]
239 def add_python_path(directory):
240 os.environ["PYTHONPATH"]=directory + ":" + os.environ["PYTHONPATH"]
241 sys.path[:0]=[directory]
243 # -----------------------------------------------------------------------------
245 # initialisation des variables d'environnement
248 python_version="python%d.%d" % sys.version_info[0:2]
251 # Ajout du chemin d'acces aux executables de KERNEL dans le PATH
254 add_path(os.path.join(kernel_root_dir,"bin","salome"))
255 #print "PATH=",os.environ["PATH"]
258 # Ajout des modules dans le LD_LIBRARY_PATH
260 for module in liste_modules:
261 module_root_dir=modules_root_dir[module]
262 add_ld_library_path(os.path.join(module_root_dir,"lib","salome"))
264 os.environ["SALOME_trace"]="local"
266 os.environ["SALOME_trace"]="with_logger"
267 locdir=os.environ['PWD']
268 libtracedir=os.path.join(locdir,"libSalomeTrace")
269 libtrace = os.path.join(kernel_root_dir,"lib","salome","libSALOMELoggerClient.so.0.0.0")
270 libtraceln = os.path.join(libtracedir,"libSALOMELocalTrace.so")
271 aCommand = 'rm -rf ' + libtracedir + "; "
272 aCommand += 'mkdir ' + libtracedir + "; "
273 aCommand += 'ln -s ' + libtrace + " " + libtraceln + "; "
274 aCommand += 'ln -s ' + libtrace + " " + libtraceln + ".0; "
275 aCommand += 'ln -s ' + libtrace + " " + libtraceln + ".0.0.0; "
277 add_ld_library_path(libtracedir)
279 #print "LD_LIBRARY_PATH=",os.environ["LD_LIBRARY_PATH"]
282 # Ajout des modules dans le PYTHONPATH (KERNEL prioritaire, donc en dernier)
285 liste_modules_reverse=liste_modules[:]
286 liste_modules_reverse.reverse()
288 #print liste_modules_reverse
289 for module in liste_modules_reverse:
290 module_root_dir=modules_root_dir[module]
291 add_python_path(os.path.join(module_root_dir,"bin","salome"))
292 add_python_path(os.path.join(module_root_dir,"lib",python_version,"site-packages","salome"))
293 add_python_path(os.path.join(module_root_dir,"lib","salome"))
294 add_python_path(os.path.join(module_root_dir,"lib",python_version,"site-packages","salome","shared_modules"))
296 #print "PYTHONPATH=",sys.path
301 # -----------------------------------------------------------------------------
306 session=clt.waitNS("/Kernel/Session",SALOME.Session)
309 # Activation du GUI de Session Server
312 session.GetInterface()
315 # -----------------------------------------------------------------------------
321 # Lancement Session Loader
325 SessionLoader().run()
328 # Initialisation ORB et Naming Service
331 clt=orbmodule.client()
333 # (non obligatoire) Lancement Logger Server et attente de sa disponibilite dans le naming service
338 clt.waitLogger("Logger")
342 # Lancement Registry Server
345 RegistryServer().run()
348 # Attente de la disponibilité du Registry dans le Naming Service
351 clt.waitNS("/Registry")
354 # Lancement Catalog Server
357 cataServer=CatalogServer()
358 cataServer.setpath(liste_modules)
362 # Attente de la disponibilité du Catalog Server dans le Naming Service
365 import SALOME_ModuleCatalog
366 clt.waitNS("/Kernel/ModulCatalog",SALOME_ModuleCatalog.ModuleCatalog)
369 # Lancement SalomeDS Server
372 os.environ["CSF_PluginDefaults"]=os.path.join(kernel_root_dir,"share","salome","resources")
373 os.environ["CSF_SALOMEDS_ResourcesDefaults"]=os.path.join(kernel_root_dir,"share","salome","resources")
374 SalomeDSServer().run()
376 if "GEOM" in liste_modules:
377 print "GEOM OCAF Resources"
378 os.environ["CSF_GEOMDS_ResourcesDefaults"]=os.path.join(modules_root_dir["GEOM"],"share","salome","resources")
382 # Attente de la disponibilité du SalomeDS dans le Naming Service
385 clt.waitNS("/myStudyManager")
388 # Lancement Session Server
391 SessionServer().run()
394 # Attente de la disponibilité du Session Server dans le Naming Service
398 session=clt.waitNS("/Kernel/Session",SALOME.Session)
400 if os.getenv("HOSTNAME") == None:
401 if os.getenv("HOST") == None:
402 os.environ["HOSTNAME"]="localhost"
404 os.environ["HOSTNAME"]=os.getenv("HOST")
406 theComputer = os.getenv("HOSTNAME")
407 computerSplitName = theComputer.split('.')
408 theComputer = computerSplitName[0]
411 # Lancement Container C++ local
413 if with_container_cpp:
414 ContainerCPPServer().run()
417 # Attente de la disponibilité du Container C++ local dans le Naming Service
420 clt.waitNS("/Containers/" + theComputer + "/FactoryServer")
423 # Lancement Container Python local
426 if with_container_python:
427 ContainerPYServer().run()
430 # Attente de la disponibilité du Container Python local dans le Naming Service
433 clt.waitNS("/Containers/" + theComputer + "/FactoryServerPy")
435 if with_container_superv:
438 # Lancement Container Supervision local
441 ContainerSUPERVServer().run()
444 # Attente de la disponibilité du Container Supervision local dans le Naming Service
447 clt.waitNS("/Containers/" + theComputer + "/SuperVisionContainer")
451 # Activation du GUI de Session Server
454 #session.GetInterface()
456 end_time = os.times()
458 print "Start SALOME, elpased time : %5.1f seconds"% (end_time[4] - init_time[4])
463 # -----------------------------------------------------------------------------
466 if __name__ == "__main__":
473 print "--- erreur au lancement Salome ---"
478 filedict='/tmp/'+os.getenv('USER')+'_SALOME_pidict'
479 #filedict='/tmp/'+os.getlogin()+'_SALOME_pidict'
481 fpid=open(filedict, 'w')
482 pickle.dump(process_id,fpid)
486 print "Sauvegarde du dictionnaire des process dans ", filedict
487 print "Pour tuer les process SALOME, executer : python killSalome.py depuis"
488 print "une console, ou bien killSalome() depuis le present interpreteur,"
489 print "s'il n'est pas fermé."
491 print "runSalome, avec l'option --killall, commence par tuer les process restants d'une execution précédente."
493 print "Pour lancer uniquement le GUI, executer startGUI() depuis le present interpreteur,"
494 print "s'il n'est pas fermé."
497 # Impression arborescence Naming Service
502 print " --- registered objects tree in Naming Service ---"