2 # -*- coding: iso-8859-1 -*-
3 # Copyright (C) 2007-2021 CEA/DEN, EDF R&D, OPEN CASCADE
5 # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
6 # CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
8 # This library is free software; you can redistribute it and/or
9 # modify it under the terms of the GNU Lesser General Public
10 # License as published by the Free Software Foundation; either
11 # version 2.1 of the License, or (at your option) any later version.
13 # This library is distributed in the hope that it will be useful,
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 # Lesser General Public License for more details.
18 # You should have received a copy of the GNU Lesser General Public
19 # License along with this library; if not, write to the Free Software
20 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
26 # \brief Module that provides services to launch SALOME
29 import sys, os, string, glob, time, pickle, re
31 from server import process_id, Server
34 from salomeContextUtils import ScriptAndArgsObjectEncoder
37 logger = logging.getLogger()
39 class ColoredFormatter(logging.Formatter):
40 BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE = range(30,38)
41 COLORS = { 'WARNING': YELLOW, 'INFO': WHITE, 'DEBUG': BLUE, 'CRITICAL': YELLOW, 'ERROR': RED }
42 def __init__(self, *args, **kwargs):
43 logging.Formatter.__init__(self, *args, **kwargs)
44 def format(self, record):
46 COLOR_SEQ = "\033[1;%dm"
47 record.levelname = COLOR_SEQ % ColoredFormatter.COLORS[record.levelname] + record.levelname + RESET_SEQ
48 return logging.Formatter.format(self, record)
50 def setVerbose(verbose):
52 formatter = logging.Formatter('%(levelname)s : %(asctime)s : %(message)s ',style='%')
53 formatter.default_time_format = '%H:%M:%S'
54 formatter.default_msec_format = "%s.%03d"
55 stream_handler = logging.StreamHandler()
56 stream_handler.setFormatter(formatter)
57 logger.addHandler(stream_handler)
59 verbose_map = { "0": logging.WARNING, "1": logging.INFO, "2": logging.DEBUG}
60 if verbose in verbose_map:
61 logger.setLevel(verbose_map[verbose])
63 # -----------------------------------------------------------------------------
65 # Class definitions to launch CORBA Servers
68 class InterpServer(Server):
69 def __init__(self,args):
71 if sys.platform == "win32":
72 self.CMD=['cmd', '/c', 'start cmd.exe', '/K', 'python']
73 elif sys.platform == "darwin":
74 env_ld_library_path=['env', 'DYLD_LIBRARY_PATH=' + os.getenv("LD_LIBRARY_PATH")]
75 self.CMD=['xterm', '-e'] + env_ld_library_path + ['python']
77 env_ld_library_path=['env', 'LD_LIBRARY_PATH=' + os.getenv("LD_LIBRARY_PATH")]
78 self.CMD=['xterm', '-e'] + env_ld_library_path + ['python']
83 print("INTERPSERVER::command = ", command)
85 pid = subprocess.Popen(command).pid
86 process_id[pid]=self.CMD
91 def get_cata_path(list_modules,modules_root_dir):
92 """Build a list of catalog paths (cata_path) to initialize the ModuleCatalog server
97 for module in list_modules:
98 if module in modules_root_dir:
99 module_root_dir=modules_root_dir[module]
100 module_cata=module+"Catalog.xml"
101 cata_file=os.path.join(module_root_dir, "share",setenv.salome_subdir, "resources",module.lower(), module_cata)
103 if os.path.exists(cata_file):
104 cata_path.append(cata_file)
105 modules_cata[module]=cata_file
107 cata_file=os.path.join(module_root_dir, "share",setenv.salome_subdir, "resources", module_cata)
108 if os.path.exists(cata_file):
109 cata_path.append(cata_file)
110 modules_cata[module]=cata_file
112 for path in os.getenv("SALOME_CATALOGS_PATH","").split(os.pathsep):
113 if os.path.exists(path):
114 for cata_file in glob.glob(os.path.join(path,"*Catalog.xml")):
115 module_name= os.path.basename(cata_file)[:-11]
116 if module_name not in modules_cata:
117 cata_path.append(cata_file)
118 modules_cata[module_name]=cata_file
122 class CatalogServer(Server):
123 def __init__(self,args):
126 self.SCMD1=['SALOME_ModuleCatalog_Server']
127 if 'launcher' in self.args:
128 pos = args['launcher'].find(":")
130 self.SCMD1+=['-ORBInitRef']
131 machine = args['launcher'][0:pos]
132 port = args['launcher'][pos+1:]
133 self.SCMD1+=["NameService=corbaname::" + machine + ":" + port]
134 self.SCMD1+=['-common']
136 home_dir=os.path.expanduser("~")
137 if home_dir is not None:
138 self.SCMD2=['-personal',os.path.join(home_dir,'Salome', 'resources', 'CatalogModulePersonnel.xml')]
140 def setpath(self,modules_list,modules_root_dir):
141 list_modules = modules_list[:]
142 list_modules.reverse()
143 if self.args["gui"] :
144 list_modules = ["KERNEL", "GUI"] + list_modules
146 list_modules = ["KERNEL"] + list_modules
148 cata_path=get_cata_path(list_modules,modules_root_dir)
150 self.CMD=self.SCMD1 + ['"' + '"::"'.join(cata_path) + '"'] + self.SCMD2
154 class SalomeDSServer(Server):
155 def __init__(self,args):
158 self.CMD=['SALOMEDS_Server']
159 if 'launcher' in self.args:
160 pos = args['launcher'].find(":")
162 self.CMD+=['-ORBInitRef']
163 machine = args['launcher'][0:pos]
164 port = args['launcher'][pos+1:]
165 self.CMD+=["NameService=corbaname::" + machine + ":" + port]
169 class ConnectionManagerServer(Server):
170 def __init__(self,args):
173 self.CMD=['SALOME_ConnectionManagerServer']
174 if 'launcher' in self.args:
175 pos = args['launcher'].find(":")
177 self.CMD+=['-ORBInitRef']
178 machine = args['launcher'][0:pos]
179 port = args['launcher'][pos+1:]
180 self.CMD+=["NameService=corbaname::" + machine + ":" + port]
185 class RegistryServer(Server):
186 def __init__(self,args):
189 self.CMD=['SALOME_Registry_Server', '--salome_session','theSession']
190 if 'launcher' in self.args:
191 pos = args['launcher'].find(":")
193 self.CMD+=['-ORBInitRef']
194 machine = args['launcher'][0:pos]
195 port = args['launcher'][pos+1:]
196 self.CMD+=["NameService=corbaname::" + machine + ":" + port]
200 class ContainerCPPServer(Server):
201 def __init__(self,args,with_gui=False):
204 self.CMD=['SALOME_Container']
205 if 'launcher' in self.args:
206 pos = args['launcher'].find(":")
208 self.CMD+=['-ORBInitRef']
209 machine = args['launcher'][0:pos]
210 port = args['launcher'][pos+1:]
211 self.CMD+=["NameService=corbaname::" + machine + ":" + port]
212 self.CMD+=['FactoryServer']
213 if not with_gui and self.args["valgrind_session"]:
215 val = os.getenv("VALGRIND_OPTIONS")
219 self.CMD = l + self.CMD
224 class LoggerServer(Server):
225 def __init__(self,args):
228 from salome_utils import generateFileName, getLogDir
229 logfile = generateFileName( getLogDir(),
235 print("===========================================================")
236 print("Logger server: put log to the file:")
238 print("===========================================================")
239 self.CMD=['SALOME_Logger_Server', logfile]
241 pass # end of LoggerServer class
245 class CommonSessionServer(Server):
246 def __init__(self,args,modules_list,modules_root_dir):
247 self.args = args.copy()
248 # Bug 11512 (Problems with runSalome --xterm on Mandrake and Debian Sarge)
249 #self.args['xterm']=0
252 self.SCMD1=[self.getSessionServerExe()]
253 if "SQUISH_PREFIX" in os.environ:
254 if platform.system() == "Windows" :
255 self.SCMD1 = [os.path.join(os.getenv("SQUISH_PREFIX"), "bin", "dllpreload.exe"),os.path.join(os.getenv("SQUISH_SALOME_PATH"), "W64", "GUI", "bin", "salome", self.SCMD1[0])]
257 os.environ["LD_LIBRARY_PATH"] = os.environ["SQUISH_PREFIX"] + "/lib:" + os.environ["LD_LIBRARY_PATH"]
259 if 'launcher' in self.args:
260 pos = args['launcher'].find(":")
262 self.SCMD1+=['-ORBInitRef']
263 machine = args['launcher'][0:pos]
264 port = args['launcher'][pos+1:]
265 self.SCMD1+=["NameService=corbaname::" + machine + ":" + port]
266 if 'registry' in self.args['embedded']:
267 self.SCMD1+=['--with','Registry',
268 '(','--salome_session','theSession',')']
269 if 'moduleCatalog' in self.args['embedded']:
270 self.SCMD1+=['--with','ModuleCatalog','(','-common']
271 home_dir=os.path.expanduser("~")
272 if home_dir is not None:
273 self.SCMD2+=['-personal',os.path.join(home_dir,'Salome','resources','CatalogModulePersonnel.xml')]
275 if 'study' in self.args['embedded']:
276 self.SCMD2+=['--with','SALOMEDS','(',')']
277 if 'cppContainer' in self.args['embedded']:
278 self.SCMD2+=['--with','Container','(','FactoryServer',')']
279 if 'SalomeAppEngine' in self.args['embedded']:
280 self.SCMD2+=['--with','SalomeAppEngine','(',')']
282 if 'cppContainer' in self.args['standalone'] or 'cppContainer' in self.args['embedded']:
284 if 'pyContainer' in self.args['standalone'] or 'pyContainer' in self.args['embedded']:
285 raise Exception('Python containers no longer supported')
287 session_gui = self.args.get('session_gui', True)
289 self.SCMD2+=['--hide-desktop']
291 if not self.args['splash']:
292 self.SCMD2+=['--hide-splash']
294 if self.args['study_hdf'] is not None:
295 self.SCMD2+=['--study-hdf=%s'%self.args['study_hdf']]
298 if 'pyscript' in self.args and len(self.args['pyscript']) > 0:
299 msg = json.dumps(self.args['pyscript'], cls=ScriptAndArgsObjectEncoder)
300 self.SCMD2+=['--pyscript=%s'%(msg)]
304 if self.args['noexcepthandler']:
305 self.SCMD2+=['--no-exception-handler']
306 if 'user_config' in self.args:
307 self.SCMD2+=['--resources=%s'%self.args['user_config']]
308 if 'modules' in self.args:
310 #keep only modules with GUI
311 for m in modules_list:
312 if m not in modules_root_dir:
313 list_modules.insert(0,m)
315 fr1 = os.path.join(modules_root_dir[m],"share","salome","resources",m.lower(),"SalomeApp.xml")
316 fr2 = os.path.join(modules_root_dir[m],"share","salome","resources","SalomeApp.xml")
317 if os.path.exists(fr1) or os.path.exists(fr2):
318 list_modules.insert(0,m)
319 list_modules.reverse()
320 self.SCMD2+=['--modules (%s)' % ":".join(list_modules)]
322 if 'language' in self.args:
323 self.SCMD2+=['--language=%s' % self.args['language']]
327 def getSessionServerExe(self):
330 def setpath(self,modules_list,modules_root_dir):
331 list_modules = modules_list[:]
332 list_modules.reverse()
333 if self.args["gui"] :
334 list_modules = ["KERNEL", "GUI"] + list_modules
336 list_modules = ["KERNEL"] + list_modules
338 cata_path=get_cata_path(list_modules,modules_root_dir)
340 if ("gui" in self.args) & ('moduleCatalog' in self.args['embedded']):
341 #Use '::' instead ":" because drive path with "D:\" is invalid on windows platform
342 self.CMD=self.SCMD1 + ['"' + '"::"'.join(cata_path) + '"'] + self.SCMD2
344 self.CMD=self.SCMD1 + self.SCMD2
345 if 'test' in self.args:
346 self.CMD+=['-test'] + self.args['test']
347 elif 'play' in self.args:
348 self.CMD+=['-play'] + self.args['play']
350 if self.args["gdb_session"] or self.args["ddd_session"]:
351 f = open(".gdbinit4salome", "w")
353 args = " ".join(self.CMD[1:])
354 args = args.replace("(", "\(")
355 args = args.replace(")", "\)")
359 if self.args["ddd_session"]:
360 self.CMD = ["ddd", "--command=.gdbinit4salome", self.CMD[0]]
361 elif self.args["gdb_session"]:
362 self.CMD = ["xterm", "-e", "gdb", "--command=.gdbinit4salome", self.CMD[0]]
366 if self.args["valgrind_session"]:
368 val = os.getenv("VALGRIND_OPTIONS")
372 self.CMD = l + self.CMD
375 class SessionServer(CommonSessionServer):
376 def __init__(self,args,modules_list,modules_root_dir):
377 super().__init__(args,modules_list,modules_root_dir)
379 KernelBasis.setSSLMode(False)
381 def getSessionServerExe(self):
382 return "SALOME_Session_Server"
385 class LauncherServer(Server):
386 def __init__(self,args):
389 self.SCMD1=['SALOME_LauncherServer']
392 if 'registry' in self.args['embedded']:
393 self.SCMD1+=['--with','Registry',
394 '(','--salome_session','theSession',')']
395 if 'moduleCatalog' in self.args['embedded']:
396 self.SCMD1+=['--with','ModuleCatalog','(','-common']
397 home_dir=os.path.expanduser("~")
398 if home_dir is not None:
399 self.SCMD2=['-personal',os.path.join(home_dir,'Salome','resources','CatalogModulePersonnel.xml')]
401 if 'study' in self.args['embedded']:
402 self.SCMD2+=['--with','SALOMEDS','(',')']
403 if 'cppContainer' in self.args['embedded']:
404 self.SCMD2+=['--with','Container','(','FactoryServer',')']
406 def setpath(self,modules_list,modules_root_dir):
407 list_modules = modules_list[:]
408 list_modules.reverse()
409 if self.args["gui"] :
410 list_modules = ["KERNEL", "GUI"] + list_modules
412 list_modules = ["KERNEL"] + list_modules
414 cata_path=get_cata_path(list_modules,modules_root_dir)
416 if ("gui" in self.args) & ('moduleCatalog' in self.args['embedded']):
417 #Use '::' instead ":" because drive path with "D:\" is invalid on windows platform
418 self.CMD=self.SCMD1 + ['"' + '"::"'.join(cata_path) + '"'] + self.SCMD2
420 self.CMD=self.SCMD1 + self.SCMD2