]> SALOME platform Git repositories - modules/kernel.git/blob - bin/runSalomeCommon.py
Salome HOME
1e3295a7e77166142f0a52fad9b7aa7cb1550984
[modules/kernel.git] / bin / runSalomeCommon.py
1 #!/usr/bin/env python3
2 #  -*- coding: iso-8859-1 -*-
3 # Copyright (C) 2007-2021  CEA/DEN, EDF R&D, OPEN CASCADE
4 #
5 # Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
6 # CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
7 #
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.
12 #
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.
17 #
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
21 #
22 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
23 #
24
25 ## @package runSalome
26 # \brief Module that provides services to launch SALOME
27 #
28
29 import sys, os, string, glob, time, pickle, re
30 import setenv
31 from server import process_id, Server
32 import json
33 import subprocess
34 from salomeContextUtils import ScriptAndArgsObjectEncoder
35 import platform
36 import logging
37 logger = logging.getLogger()
38
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):
45         RESET_SEQ = "\033[0m"
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)
49
50 def setVerbose(verbose):
51     global logger
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)
58
59     verbose_map = { "0": logging.WARNING, "1": logging.INFO, "2": logging.DEBUG}
60     if verbose in verbose_map:
61         logger.setLevel(verbose_map[verbose])
62
63 # -----------------------------------------------------------------------------
64 #
65 # Class definitions to launch CORBA Servers
66 #
67
68 class InterpServer(Server):
69     def __init__(self,args):
70         self.args=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']
76         else:
77           env_ld_library_path=['env', 'LD_LIBRARY_PATH=' + os.getenv("LD_LIBRARY_PATH")]
78           self.CMD=['xterm', '-e'] + env_ld_library_path + ['python']
79
80     def run(self):
81         global process_id
82         command = self.CMD
83         print("INTERPSERVER::command = ", command)
84         import subprocess
85         pid = subprocess.Popen(command).pid
86         process_id[pid]=self.CMD
87         self.PID = pid
88
89 # ---
90
91 def get_cata_path(list_modules,modules_root_dir):
92     """Build a list of catalog paths (cata_path) to initialize the ModuleCatalog server
93     """
94     modules_cata={}
95     cata_path=[]
96
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)
102
103             if os.path.exists(cata_file):
104                 cata_path.append(cata_file)
105                 modules_cata[module]=cata_file
106             else:
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
111
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
119
120     return cata_path
121
122 class CatalogServer(Server):
123     def __init__(self,args):
124         self.args=args
125         self.initArgs()
126         self.SCMD1=['SALOME_ModuleCatalog_Server']
127         if 'launcher' in self.args:
128             pos = args['launcher'].find(":")
129             if pos != -1:
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']
135         self.SCMD2=[]
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')]
139
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
145         else :
146             list_modules = ["KERNEL"] + list_modules
147
148         cata_path=get_cata_path(list_modules,modules_root_dir)
149
150         self.CMD=self.SCMD1 + ['"' + '"::"'.join(cata_path) + '"'] + self.SCMD2
151
152 # ---
153
154 class SalomeDSServer(Server):
155     def __init__(self,args):
156         self.args=args
157         self.initArgs()
158         self.CMD=['SALOMEDS_Server']
159         if 'launcher' in self.args:
160             pos = args['launcher'].find(":")
161             if pos != -1:
162               self.CMD+=['-ORBInitRef']
163               machine = args['launcher'][0:pos]
164               port = args['launcher'][pos+1:]
165               self.CMD+=["NameService=corbaname::" + machine + ":" + port]
166
167 # ---
168
169 class ConnectionManagerServer(Server):
170     def __init__(self,args):
171         self.args=args
172         self.initArgs()
173         self.CMD=['SALOME_ConnectionManagerServer']
174         if 'launcher' in self.args:
175             pos = args['launcher'].find(":")
176             if pos != -1:
177               self.CMD+=['-ORBInitRef']
178               machine = args['launcher'][0:pos]
179               port = args['launcher'][pos+1:]
180               self.CMD+=["NameService=corbaname::" + machine + ":" + port]
181
182
183 # ---
184
185 class RegistryServer(Server):
186     def __init__(self,args):
187         self.args=args
188         self.initArgs()
189         self.CMD=['SALOME_Registry_Server', '--salome_session','theSession']
190         if 'launcher' in self.args:
191             pos = args['launcher'].find(":")
192             if pos != -1:
193               self.CMD+=['-ORBInitRef']
194               machine = args['launcher'][0:pos]
195               port = args['launcher'][pos+1:]
196               self.CMD+=["NameService=corbaname::" + machine + ":" + port]
197
198 # ---
199
200 class ContainerCPPServer(Server):
201     def __init__(self,args,with_gui=False):
202         self.args=args
203         self.initArgs()
204         self.CMD=['SALOME_Container']
205         if 'launcher' in self.args:
206             pos = args['launcher'].find(":")
207             if pos != -1:
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"]:
214             l = ["valgrind"]
215             val = os.getenv("VALGRIND_OPTIONS")
216             if val:
217                 l += val.split()
218                 pass
219             self.CMD = l + self.CMD
220             pass
221
222 # ---
223
224 class LoggerServer(Server):
225     def __init__(self,args):
226         self.args=args
227         self.initArgs()
228         from salome_utils import generateFileName, getLogDir
229         logfile = generateFileName( getLogDir(),
230                                     prefix="logger",
231                                     extension="log",
232                                     with_username=True,
233                                     with_hostname=True,
234                                     with_port=True)
235         print("===========================================================")
236         print("Logger server: put log to the file:")
237         print(logfile)
238         print("===========================================================")
239         self.CMD=['SALOME_Logger_Server', logfile]
240         pass
241     pass # end of LoggerServer class
242
243 # ---
244 import abc
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
250         #
251         self.initArgs()
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])]
256             else :
257                 os.environ["LD_LIBRARY_PATH"] = os.environ["SQUISH_PREFIX"] + "/lib:" + os.environ["LD_LIBRARY_PATH"]
258         self.SCMD2=[]
259         if 'launcher' in self.args:
260             pos = args['launcher'].find(":")
261             if pos != -1:
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')]
274             self.SCMD2+=[')']
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','(',')']
281
282         if 'cppContainer' in self.args['standalone'] or 'cppContainer' in self.args['embedded']:
283             self.SCMD2+=['CPP']
284         if 'pyContainer' in self.args['standalone'] or 'pyContainer' in self.args['embedded']:
285             raise Exception('Python containers no longer supported')
286         if self.args['gui']:
287             session_gui = self.args.get('session_gui', True)
288             if not session_gui:
289                 self.SCMD2+=['--hide-desktop']
290             else:
291                 if not self.args['splash']:
292                     self.SCMD2+=['--hide-splash']
293                     pass
294                 if self.args['study_hdf'] is not None:
295                     self.SCMD2+=['--study-hdf=%s'%self.args['study_hdf']]
296                     pass
297                 pass
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)]
301                     pass
302                 pass
303             pass
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:
309             list_modules = []
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)
314               else:
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)]
321             pass
322         if 'language' in self.args:
323             self.SCMD2+=['--language=%s' % self.args['language']]
324         pass
325
326     @abc.abstractmethod
327     def getSessionServerExe(self):
328         pass
329     
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
335         else :
336             list_modules = ["KERNEL"] + list_modules
337
338         cata_path=get_cata_path(list_modules,modules_root_dir)
339
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
343         else:
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']
349
350         if self.args["gdb_session"] or self.args["ddd_session"]:
351             f = open(".gdbinit4salome", "w")
352             f.write("set args ")
353             args = " ".join(self.CMD[1:])
354             args = args.replace("(", "\(")
355             args = args.replace(")", "\)")
356             f.write(args)
357             f.write("\n")
358             f.close()
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]]
363                 pass
364             pass
365
366         if self.args["valgrind_session"]:
367             l = ["valgrind"]
368             val = os.getenv("VALGRIND_OPTIONS")
369             if val:
370                 l += val.split()
371                 pass
372             self.CMD = l + self.CMD
373             pass
374
375 class SessionServer(CommonSessionServer):
376     def __init__(self,args,modules_list,modules_root_dir):
377         super().__init__(args,modules_list,modules_root_dir)
378         import KernelBasis
379         KernelBasis.setSSLMode(False)
380     
381     def getSessionServerExe(self):
382         return "SALOME_Session_Server"
383 # ---
384
385 class LauncherServer(Server):
386     def __init__(self,args):
387         self.args=args
388         self.initArgs()
389         self.SCMD1=['SALOME_LauncherServer']
390         self.SCMD2=[]
391         if args["gui"] :
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')]
400                 self.SCMD2+=[')']
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',')']
405
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
411         else :
412             list_modules = ["KERNEL"] + list_modules
413
414         cata_path=get_cata_path(list_modules,modules_root_dir)
415
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
419         else:
420             self.CMD=self.SCMD1 + self.SCMD2