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.
10 import sys,os,string,glob,time,signal,pickle
13 liste_modules=sys.argv[1:]
17 # -----------------------------------------------------------------------------
19 # Vérification des variables d'environnement
22 kernel_root_dir=os.environ["KERNEL_ROOT_DIR"]
23 modules_root_dir["KERNEL"]=kernel_root_dir
28 for module in liste_modules :
31 module_root_dir=os.environ[module +"_ROOT_DIR"]
32 modules_root_dir[module]=module_root_dir
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
42 if "KERNEL" in liste_modules:liste_modules.remove("KERNEL")
43 liste_modules[:0]=["KERNEL"]
45 #print modules_root_dir
49 # -----------------------------------------------------------------------------
51 # Définition des classes d'objets pour le lancement des Server CORBA
56 ARGS=['xterm', '-iconic', '-sb', '-sl', '500', '-e']
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
64 class CatalogServer(Server):
65 SCMD1=['SALOME_ModuleCatalog_Server','-common']
66 SCMD2=['-personal','${HOME}/Salome/resources/CatalogModulePersonnel.xml']
68 def setpath(self,liste_modules):
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
77 class SalomeDSServer(Server):
78 CMD=['SALOMEDS_Server']
80 class RegistryServer(Server):
81 CMD=['SALOME_Registry_Server', '--salome_session','theSession']
83 class ContainerCPPServer(Server):
84 CMD=['SALOME_Container','FactoryServer','-ORBInitRef','NameService=corbaname::localhost']
86 class ContainerPYServer(Server):
87 CMD=['SALOME_ContainerPy.py','FactoryServerPy','-ORBInitRef','NameService=corbaname::localhost']
89 class ContainerSUPERVServer(Server):
90 CMD=['SALOME_Container','SuperVisionContainer','-ORBInitRef','NameService=corbaname::localhost']
92 class LoggerServer(Server):
93 CMD=['SALOME_Logger_Server', 'logger.log']
95 class SessionServer(Server):
96 CMD=['SALOME_Session_Server']
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']
101 # -----------------------------------------------------------------------------
103 # Fonction d'arrêt de salome
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")
114 # -----------------------------------------------------------------------------
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")
126 # -----------------------------------------------------------------------------
128 # Fonctions helper pour ajouter des variables d'environnement
131 def add_path(directory):
132 os.environ["PATH"]=directory + ":" + os.environ["PATH"]
134 def add_ld_library_path(directory):
135 os.environ["LD_LIBRARY_PATH"]=directory + ":" + os.environ["LD_LIBRARY_PATH"]
137 def add_python_path(directory):
138 os.environ["PYTHONPATH"]=directory + ":" + os.environ["PYTHONPATH"]
139 sys.path[:0]=[directory]
141 # -----------------------------------------------------------------------------
143 # initialisation des variables d'environnement
146 python_version="python%d.%d" % sys.version_info[0:2]
149 # Ajout du chemin d'acces aux executables de KERNEL dans le PATH
152 add_path(os.path.join(kernel_root_dir,"bin","salome"))
153 #print "PATH=",os.environ["PATH"]
156 # Ajout des modules dans le LD_LIBRARY_PATH
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"]
164 # Ajout des modules dans le PYTHONPATH (KERNEL prioritaire, donc en dernier)
167 liste_modules_reverse=liste_modules[:]
168 liste_modules_reverse.reverse()
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"))
177 #print "PYTHONPATH=",sys.path
180 # -----------------------------------------------------------------------------
185 # Initialisation ORB et Naming Service
188 clt=orbmodule.client()
190 # (non obligatoire) Lancement Logger Server et attente de sa disponibilite dans le naming service
193 #LoggerServer().run()
194 #clt.waitLogger("Logger")
197 # Lancement Registry Server
200 RegistryServer().run()
203 # Attente de la disponibilité du Registry dans le Naming Service
206 clt.waitNS("/Registry")
209 # Lancement Catalog Server
212 cataServer=CatalogServer()
213 cataServer.setpath(liste_modules)
217 # Attente de la disponibilité du Catalog Server dans le Naming Service
220 import SALOME_ModuleCatalog
221 clt.waitNS("/Kernel/ModulCatalog",SALOME_ModuleCatalog.ModuleCatalog)
224 # Lancement SalomeDS Server
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()
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")
237 # Attente de la disponibilité du SalomeDS dans le Naming Service
240 clt.waitNS("/myStudyManager")
243 # Lancement Session Server
246 SessionServer().run()
249 # Attente de la disponibilité du Session Server dans le Naming Service
253 session=clt.waitNS("/Kernel/Session",SALOME.Session)
256 # Lancement Container C++ local
259 ContainerCPPServer().run()
262 # Attente de la disponibilité du Container C++ local dans le Naming Service
265 theComputer = os.getenv("HOSTNAME")
266 computerSplitName = theComputer.split('.')
267 theComputer = computerSplitName[0]
269 clt.waitNS("/Containers/" + theComputer + "/FactoryServer")
272 # Lancement Container Python local
275 ContainerPYServer().run()
278 # Attente de la disponibilité du Container Python local dans le Naming Service
281 clt.waitNS("/Containers/" + theComputer + "/FactoryServerPy")
284 if "SUPERV" in liste_modules:
287 # Lancement Container Supervision local
290 ContainerSUPERVServer().run()
293 # Attente de la disponibilité du Container Supervision local dans le Naming Service
296 clt.waitNS("/Containers/" + theComputer + "/SuperVisionContainer")
299 # Activation du GUI de Session Server
302 session.GetInterface()
304 end_time = os.times()
306 print "Start SALOME, elpased time : %5.1f seconds"% (end_time[4] - init_time[4])
311 # -----------------------------------------------------------------------------
320 print "--- erreur au lancement Salome ---"
325 filedict='/tmp/'+os.getenv('USER')+'_SALOME_pidict'
326 #filedict='/tmp/'+os.getlogin()+'_SALOME_pidict'
328 fpid=open(filedict, 'w')
329 pickle.dump(process_id,fpid)
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."
340 # Impression arborescence Naming Service
345 print " --- registered objects tree in Naming Service ---"