2 # -*- coding: iso-8859-1 -*-
3 # Copyright (C) 2007-2022 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
246 class CommonSessionServer(Server):
247 def __init__(self,args,modules_list,modules_root_dir):
248 self.args = args.copy()
249 # Bug 11512 (Problems with runSalome --xterm on Mandrake and Debian Sarge)
250 #self.args['xterm']=0
253 self.SCMD1=[self.getSessionServerExe()]
254 if "SQUISH_PREFIX" in os.environ:
255 if platform.system() == "Windows" :
256 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])]
258 os.environ["LD_LIBRARY_PATH"] = os.environ["SQUISH_PREFIX"] + "/lib:" + os.environ["LD_LIBRARY_PATH"]
260 if 'launcher' in self.args:
261 pos = args['launcher'].find(":")
263 self.SCMD1+=['-ORBInitRef']
264 machine = args['launcher'][0:pos]
265 port = args['launcher'][pos+1:]
266 self.SCMD1+=["NameService=corbaname::" + machine + ":" + port]
267 if 'registry' in self.args['embedded']:
268 self.SCMD1+=['--with','Registry',
269 '(','--salome_session','theSession',')']
270 if 'moduleCatalog' in self.args['embedded']:
271 self.SCMD1+=['--with','ModuleCatalog','(','-common']
272 home_dir=os.path.expanduser("~")
273 if home_dir is not None:
274 self.SCMD2+=['-personal',os.path.join(home_dir,'Salome','resources','CatalogModulePersonnel.xml')]
276 if 'study' in self.args['embedded']:
277 self.SCMD2+=['--with','SALOMEDS','(',')']
278 if 'cppContainer' in self.args['embedded']:
279 self.SCMD2+=['--with','Container','(','FactoryServer',')']
280 if 'SalomeAppEngine' in self.args['embedded']:
281 self.SCMD2+=['--with','SalomeAppEngine','(',')']
283 if 'cppContainer' in self.args['standalone'] or 'cppContainer' in self.args['embedded']:
285 if 'pyContainer' in self.args['standalone'] or 'pyContainer' in self.args['embedded']:
286 raise Exception('Python containers no longer supported')
288 session_gui = self.args.get('session_gui', True)
290 self.SCMD2+=['--hide-desktop']
292 if not self.args['splash']:
293 self.SCMD2+=['--hide-splash']
295 if self.args['study_hdf'] is not None:
296 self.SCMD2+=['--study-hdf=%s'%self.args['study_hdf']]
299 if 'pyscript' in self.args and len(self.args['pyscript']) > 0:
300 msg = json.dumps(self.args['pyscript'], cls=ScriptAndArgsObjectEncoder)
301 self.SCMD2+=['--pyscript=%s'%(msg)]
305 if self.args['noexcepthandler']:
306 self.SCMD2+=['--no-exception-handler']
307 if 'user_config' in self.args:
308 self.SCMD2+=['--resources=%s'%self.args['user_config']]
309 if 'modules' in self.args:
311 #keep only modules with GUI
312 for m in modules_list:
313 if m not in modules_root_dir:
314 list_modules.insert(0,m)
316 fr1 = os.path.join(modules_root_dir[m],"share","salome","resources",m.lower(),"SalomeApp.xml")
317 fr2 = os.path.join(modules_root_dir[m],"share","salome","resources","SalomeApp.xml")
318 if os.path.exists(fr1) or os.path.exists(fr2):
319 list_modules.insert(0,m)
320 list_modules.reverse()
321 self.SCMD2+=['--modules (%s)' % ":".join(list_modules)]
323 if 'language' in self.args:
324 self.SCMD2+=['--language=%s' % self.args['language']]
325 os_handle, iorfakens = tempfile.mkstemp()
326 self.iorfakens = iorfakens
328 self.SCMD2+=["--iorfakens={}".format(iorfakens)]
332 def getSessionServerExe(self):
335 def setpath(self,modules_list,modules_root_dir):
336 list_modules = modules_list[:]
337 list_modules.reverse()
338 if self.args["gui"] :
339 list_modules = ["KERNEL", "GUI"] + list_modules
341 list_modules = ["KERNEL"] + list_modules
343 cata_path=get_cata_path(list_modules,modules_root_dir)
345 if ("gui" in self.args) & ('moduleCatalog' in self.args['embedded']):
346 #Use '::' instead ":" because drive path with "D:\" is invalid on windows platform
347 self.CMD=self.SCMD1 + ['"' + '"::"'.join(cata_path) + '"'] + self.SCMD2
349 self.CMD=self.SCMD1 + self.SCMD2
350 if 'test' in self.args:
351 self.CMD+=['-test'] + self.args['test']
352 elif 'play' in self.args:
353 self.CMD+=['-play'] + self.args['play']
355 if self.args["gdb_session"] or self.args["ddd_session"]:
356 f = open(".gdbinit4salome", "w")
358 args = " ".join(self.CMD[1:])
359 args = args.replace("(", "\(")
360 args = args.replace(")", "\)")
364 if self.args["ddd_session"]:
365 self.CMD = ["ddd", "--command=.gdbinit4salome", self.CMD[0]]
366 elif self.args["gdb_session"]:
367 self.CMD = ["xterm", "-e", "gdb", "--command=.gdbinit4salome", self.CMD[0]]
371 if self.args["valgrind_session"]:
373 val = os.getenv("VALGRIND_OPTIONS")
377 self.CMD = l + self.CMD
380 class SessionServer(CommonSessionServer):
381 def __init__(self,args,modules_list,modules_root_dir):
382 super().__init__(args,modules_list,modules_root_dir)
384 KernelBasis.setSSLMode(False)
386 def getSessionServerExe(self):
387 return "SALOME_Session_Server"
390 class LauncherServer(Server):
391 def __init__(self,args):
394 self.SCMD1=['SALOME_LauncherServer']
397 if 'registry' in self.args['embedded']:
398 self.SCMD1+=['--with','Registry',
399 '(','--salome_session','theSession',')']
400 if 'moduleCatalog' in self.args['embedded']:
401 self.SCMD1+=['--with','ModuleCatalog','(','-common']
402 home_dir=os.path.expanduser("~")
403 if home_dir is not None:
404 self.SCMD2=['-personal',os.path.join(home_dir,'Salome','resources','CatalogModulePersonnel.xml')]
406 if 'study' in self.args['embedded']:
407 self.SCMD2+=['--with','SALOMEDS','(',')']
408 if 'cppContainer' in self.args['embedded']:
409 self.SCMD2+=['--with','Container','(','FactoryServer',')']
411 def setpath(self,modules_list,modules_root_dir):
412 list_modules = modules_list[:]
413 list_modules.reverse()
414 if self.args["gui"] :
415 list_modules = ["KERNEL", "GUI"] + list_modules
417 list_modules = ["KERNEL"] + list_modules
419 cata_path=get_cata_path(list_modules,modules_root_dir)
421 if ("gui" in self.args) & ('moduleCatalog' in self.args['embedded']):
422 #Use '::' instead ":" because drive path with "D:\" is invalid on windows platform
423 self.CMD=self.SCMD1 + ['"' + '"::"'.join(cata_path) + '"'] + self.SCMD2
425 self.CMD=self.SCMD1 + self.SCMD2