Salome HOME
SSL mode by default mode
[modules/kernel.git] / bin / runSalome.py
1 #!/usr/bin/env python3
2 #  -*- coding: iso-8859-1 -*-
3 # Copyright (C) 2022 CEA/DEN, EDF R&D
4 #
5 # This library is free software; you can redistribute it and/or
6 # modify it under the terms of the GNU Lesser General Public
7 # License as published by the Free Software Foundation; either
8 # version 2.1 of the License, or (at your option) any later version.
9 #
10 # This library is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 # Lesser General Public License for more details.
14 #
15 # You should have received a copy of the GNU Lesser General Public
16 # License along with this library; if not, write to the Free Software
17 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
18 #
19 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 #
21
22 ## @package runSalome
23 # \brief Module that provides services to launch SALOME
24 #
25
26 import sys, os, string, glob, time, pickle, re
27 import orbmodule
28 import setenv
29 from server import process_id, Server
30 import json
31 import subprocess
32 from salomeContextUtils import ScriptAndArgsObjectEncoder
33 import runSalomeNoServer
34 import runSalomeCommon
35 import platform
36 import logging
37 logger = logging.getLogger()
38
39 # -----------------------------------------------------------------------------
40
41 from killSalome import killAllPorts
42
43 def kill_salome(args):
44     """
45     Kill servers from previous SALOME executions, if needed;
46     depending on args 'killall' or 'portkill', kill all executions,
47     or only execution on the same CORBA port
48     """
49
50     if args['killall']:
51         killAllPorts()
52 #
53 # -----------------------------------------------------------------------------
54
55 def startGUI(clt):
56     """Salome Session Graphic User Interface activation"""
57     import Engines
58     import SALOME
59     import SALOMEDS
60     import SALOME_ModuleCatalog
61     import SALOME_Session_idl
62     session=clt.waitNS("/Kernel/Session",SALOME.Session)
63     session.GetInterface()
64
65 # -----------------------------------------------------------------------------
66
67 def startSalome(args, modules_list, modules_root_dir):
68     """Launch all SALOME servers requested by args"""
69     init_time = os.times()
70
71     logger.debug("startSalome : {} ".format(args))
72
73     # Launch  Session Server (to show splash ASAP)
74     #
75
76     if args["gui"] and not args['launcher_only']:
77         mySessionServ = runSalomeNoServer.NoSessionServer(args,args['modules'],modules_root_dir)
78         mySessionServ.setpath(modules_list,modules_root_dir)
79         mySessionServ.run()
80     
81     end_time = os.times()
82
83     #
84     # Wait until Session Server is registered in naming service
85     #
86     logger.debug("Start SALOME, elapsed time : %5.1f seconds"% (end_time[4] - init_time[4]))
87
88     #
89     # additional external python interpreters
90     #
91     nbaddi=0
92
93     try:
94         if 'interp' in args:
95             nbaddi = args['interp']
96     except Exception:
97         import traceback
98         traceback.print_exc()
99         print("-------------------------------------------------------------")
100         print("-- to get an external python interpreter:runSalome --interp=1")
101         print("-------------------------------------------------------------")
102
103     logger.debug("additional external python interpreters: {}".format(nbaddi))
104     if nbaddi:
105         for i in range(nbaddi):
106             print("i=",i)
107             anInterp=InterpServer(args)
108             anInterp.run()
109
110     # set PYTHONINSPECT variable (python interpreter in interactive mode)
111     if args['pinter']:
112         os.environ["PYTHONINSPECT"]="1"
113         try:
114             import readline
115         except ImportError:
116             pass
117
118     return
119
120 # -----------------------------------------------------------------------------
121
122 def useSalome(args, modules_list, modules_root_dir):
123     """
124     Launch all SALOME servers requested by args,
125     save list of process, give info to user,
126     show registered objects in Naming Service.
127     """
128     global process_id
129
130     try:
131         startSalome(args, modules_list, modules_root_dir)
132     except Exception:
133         import traceback
134         traceback.print_exc()
135         print()
136         print()
137         print("--- Error during Salome launch ---")
138
139     # print(process_id)
140
141     from addToKillList import addToKillList
142     from killSalomeWithPort import getPiDict
143
144     filedict = getPiDict(args['port'])
145     for pid, cmd in list(process_id.items()):
146         addToKillList(pid, cmd, args['port'])
147         pass
148
149     logger.debug("""
150     Saving of the dictionary of Salome processes in %s
151     To kill SALOME processes from a console (kill all sessions from all ports):
152       python killSalome.py
153     To kill SALOME from the present interpreter, if it is not closed :
154       killLocalPort()      --> kill this session
155                                (use CORBA port from args of runSalome)
156       givenPortKill(port)  --> kill a specific session with given CORBA port
157       killAllPorts()       --> kill all sessions
158
159     runSalome, with --killall option, starts with killing
160     the processes resulting from the previous execution.
161     """%filedict)
162
163     return
164
165 def execScript(script_path):
166     print('executing', script_path)
167     sys.path.insert(0, os.path.realpath(os.path.dirname(script_path)))
168     exec(compile(open(script_path).read(), script_path, 'exec'),globals())
169     del sys.path[0]
170
171 # -----------------------------------------------------------------------------
172
173 def addToPidict(args):
174     global process_id
175     from addToKillList import addToKillList
176     for pid, cmd in list(process_id.items()):
177         addToKillList(pid, cmd, args['port'])
178
179 # -----------------------------------------------------------------------------
180
181 def main(exeName=None):
182     """Salome launch as a main application"""
183     keep_env = not os.getenv('SALOME_PLEASE_SETUP_ENVIRONMENT_AS_BEFORE')
184     args, modules_list, modules_root_dir = setenv.get_config(exeName=exeName, keepEnvironment=keep_env)
185     runSalomeCommon.setVerbose(args["verbosity"])
186     kill_salome(args)
187     # --
188     setenv.set_env(args, modules_list, modules_root_dir, keepEnvironment=keep_env)
189     useSalome(args, modules_list, modules_root_dir)
190     return args
191
192 # -----------------------------------------------------------------------------
193
194 def foreGround(args):
195     # --
196     if "session_object" not in args:
197         return
198     session = args["session_object"]
199     # --
200     # Wait until gui is arrived
201     # tmax = nbtot * dt
202     # --
203     gui_detected = False
204     dt = 0.1
205     nbtot = 100
206     nb = 0
207     session_pid = None
208     while 1:
209         try:
210             status = session.GetStatSession()
211             gui_detected = status.activeGUI
212             session_pid = session.getPID()
213         except Exception:
214             pass
215         if gui_detected:
216             break
217         from time import sleep
218         sleep(dt)
219         nb += 1
220         if nb == nbtot:
221             break
222         pass
223     # --
224     if not gui_detected:
225         return
226     # --
227     from salome_utils import getPortNumber
228     port = getPortNumber()
229     # --
230     server = Server({})
231     if sys.platform == "win32":
232       server.CMD = [os.getenv("PYTHONBIN"), "-m", "killSalomeWithPort", "--spy", "%s"%(session_pid or os.getpid()), "%s"%(port)]
233     else:
234       server.CMD = ["killSalomeWithPort.py", "--spy", "%s"%(session_pid or os.getpid()), "%s"%(port)]
235     server.run(True)
236     # os.system("killSalomeWithPort.py --spy %s %s &"%(os.getpid(), port))
237     # --
238     dt = 1.0
239     try:
240         while 1:
241             try:
242                 status = session.GetStatSession()
243                 assert status.activeGUI
244             except Exception:
245                 break
246             from time import sleep
247             sleep(dt)
248             pass
249         pass
250     except KeyboardInterrupt:
251         from killSalomeWithPort import killMyPort
252         killMyPort(port)
253         pass
254     return
255 #
256
257 def runSalome():
258     args = main()
259     # --
260     test = args['gui'] and args['session_gui']
261     test = test or args['wake_up_session']
262     # --
263     # The next test covers the --pinter option or if var PYTHONINSPECT is set
264     # --
265     test = test and not os.environ.get('PYTHONINSPECT')
266     # --
267     # The next test covers the python -i $KERNEL_ROOT_DIR/bin/salome/runSalome.py case
268     # --
269     try:
270         from ctypes import POINTER, c_int, cast, pythonapi
271         iflag_ptr = cast(pythonapi.Py_InteractiveFlag, POINTER(c_int))
272         test = test and not iflag_ptr.contents.value
273     except Exception:
274         pass
275     # --
276 #    test = test and os.getenv("SALOME_TEST_MODE", "0") != "1"
277     test = test and args['foreground']
278     # --
279     if test:
280         from time import sleep
281         sleep(3.0)
282         foreGround(args)
283         pass
284     pass
285 #
286
287 # -----------------------------------------------------------------------------
288
289 if __name__ == "__main__":
290     runSalome()
291 #