X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=bin%2FrunSession.py;h=c6676b8020708a55a737aae2ddb030d8a626cae1;hb=ee44cdc8da140e8f0aabaa1b9d9485939899cfdf;hp=1948d44764bcd848f71d4123dc42e6eeefcac3c5;hpb=9a965a48d4bc1a6cd1f73229a91e77b10bffa881;p=modules%2Fkernel.git diff --git a/bin/runSession.py b/bin/runSession.py index 1948d4476..c6676b802 100644 --- a/bin/runSession.py +++ b/bin/runSession.py @@ -1,5 +1,5 @@ # -*- coding: iso-8859-1 -*- -# Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE +# Copyright (C) 2007-2017 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, # CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS @@ -28,7 +28,8 @@ from NSparam import getNSparams import socket import subprocess import re -from salomeContextUtils import getScriptsAndArgs, formatScriptsAndArgs +from salomeContextUtils import getScriptsAndArgs, formatScriptsAndArgs, getShortAndExtraArgs +from salome_utils import getUserName, getShortHostName # Use to display newlines (\n) in epilog class MyParser(OptionParser): @@ -43,35 +44,63 @@ class SessionParameters: self.machine = machine self.user = user self.directory = directory + # + def __repr__(self): + msg = "\n# Session Parameters:\n" + msg += " * mode: %s\n"%self.mode + msg += " * port: %s\n"%self.port + msg += " * machine: %s\n"%self.machine + msg += " * user: %s\n"%self.user + msg += " * directory: %s\n"%self.directory + return msg + # # def configureSession(args=None, exe=None): if args is None: args = [] if exe: - usage = "Usage: %s [options] [command]"%exe + usage = "Usage: %s [options] [command] [-- ]"%exe else: - usage = "Usage: %prog [options] [command]" + usage = "Usage: %prog [options] [command] [-- ]" epilog = """\n If command is not given a shell is opened; else execute the given command.\n -* Command may be an executable script or program, either identified by its full path or located in a directory pointed by a system variable (e.g. PATH).\n -* Command may also be a series of Python scripts with arguments: [PYTHON_FILE [args] [PYTHON_FILE [args]...]] -Python file arguments, if any, must be comma-separated (without blank characters) and prefixed by "args:" (without quotes). +* Command may be an executable script or program, either identified by its + full path or located in a directory pointed by a system variable (e.g. + PATH).\n +* Command may also be a series of Python scripts with arguments: + [PYTHON_FILE [args] [PYTHON_FILE [args]...]] +Python file arguments, if any, must be comma-separated (without blank + characters) and prefixed by "args:" keyword (without quotes). For example: salome shell hello.py add.py args:1,2 hello.py args:you -will successively say hello, add 1+2, and say hello to you. +will successively say hello, add 1+2, and say hello to you.\n +The double dash (--) syntax indicates an extra command to be run "as is". It + allows calling a extern program or system command with options and + arguments, using the syntax: -- [options] [arguments]. +For example: + salome shell -- ls -l *.py + salome shell -- python -tt hello.py \n -If PORT and MACHINE are not given, try to connect to the last active session on the local machine. -If PORT and MACHINE are given, try to connect to the remote session associated with PORT on MACHINE. -If MACHINE is not given, try to connect to the session associated to PORT on the local machine. -If PORT is not given, try to connect to the remote session associated to port 2810 on MACHINE.\n +If PORT and MACHINE are not given, try to connect to the last active session + on the local machine. +If PORT and MACHINE are given, try to connect to the remote session associated + with PORT on MACHINE. +If MACHINE is not given, try to connect to the session associated to PORT on + the local machine. +If PORT is not given, try to connect to the remote session associated to port + 2810 on MACHINE.\n If MACHINE is remote, the following options MUST be provided: * DIRECTORY: The full path to the salome command on remote machine. * USER: The user on the computer to connect to.\n -In case of remote call, syntax "out:res1,res2,..." can be used to get results from remote machine. +In case of remote call, syntax "out:res1,res2,..." can be used to get results + from remote machine. For example: - salome shell -m remotemachine -p 2810 -u myself -d /full/path/to/salome concatenate.py args:file1.txt,file2.txt out:result.txt -User "myself" connects to remotemachine to run the script concatenate.py in a SALOME session on port 2810; the script takes two input parameters and produces one result file.\n + salome shell -m remotemachine -p 2810 -u myself -d /full/path/to/salome + concatenate.py args:file1.txt,file2.txt out:result.txt +User "myself" connects to remotemachine to run the script concatenate.py in + a SALOME session on port 2810; the script takes two input parameters and + produces one result file.\n """ parser = MyParser(usage=usage, epilog=epilog) parser.add_option("-p", "--port", metavar="", default=0, @@ -88,11 +117,13 @@ User "myself" connects to remotemachine to run the script concatenate.py in a SA parser.add_option('-u', '--user', dest="user", default=None, help="[Remote mode] The user on the computer to connect to." ) + + short_args, extra_args = getShortAndExtraArgs(args) try: - (options, args) = parser.parse_args(args) - except Exception, e: - print e - return + (options, args) = parser.parse_args(short_args) + except Exception as e: + print(e) + return None, [] port = options.port host = options.host @@ -104,7 +135,7 @@ User "myself" connects to remotemachine to run the script concatenate.py in a SA # neither MACHINE nor PORT are given # --- set omniORB configuration to current session if any omniorbUserPath = os.environ['OMNIORB_USER_PATH'] - fileOmniConfig = omniorbUserPath + '/.omniORB_' + os.environ['USER'] + '_last.cfg' + fileOmniConfig = omniorbUserPath + '/.omniORB_' + getUserName() + '_last.cfg' if os.path.isfile(fileOmniConfig): os.environ['OMNIORB_CONFIG'] = fileOmniConfig # --- set environment variables for port and hostname of NamingService @@ -121,27 +152,27 @@ User "myself" connects to remotemachine to run the script concatenate.py in a SA else: if not host: # only PORT is given - host = socket.gethostname() + host = getShortHostName() # both MACHINE and PORT are given _writeConfigFile(port, host) # os.environ['NSPORT'] = port os.environ['NSHOST'] = host - # determine running mode, taht is either 'local' or 'remote' - here = socket.gethostname() + # determine running mode, that is either 'local' or 'remote' + here = getShortHostName() mode = "local" if host != here and host != "localhost" and host != "no_host": mode="remote" pass params = SessionParameters(mode, port, host, options.user, options.directory) - return params, args + return params, args+extra_args # # --- set the OMNIORB_CONFIG file and environment relative to this run of SALOME def _writeConfigFile(port, host): path = os.environ['OMNIORB_USER_PATH'] - kwargs = {'with_username' : os.environ['USER']} + kwargs = {'with_username' : getUserName()} from ORBConfigFile import writeORBConfigFile [ filename, msgSize ] = writeORBConfigFile(path, host, port, kwargs) @@ -162,6 +193,7 @@ def __runLocalSession(command): for cmd in command: single_cmd = cmd.strip().split(' ') any_error = False + error_code = 1 try: proc = subprocess.Popen(single_cmd) (stdoutdata, stderrdata) = proc.communicate() # Wait for process to terminate @@ -172,6 +204,7 @@ def __runLocalSession(command): if proc.returncode != 0: any_error = True + error_code = proc.returncode except: any_error = True pass @@ -182,14 +215,18 @@ def __runLocalSession(command): sys.stdout.write("".join(outmsg)) if errmsg: sys.stderr.write("".join(errmsg)) - sys.exit(1) + sys.exit(error_code) - return ("".join(outmsg), "".join(errmsg)) + return 0 else: absoluteAppliPath = os.getenv('ABSOLUTE_APPLI_PATH','') - cmd = ["/bin/bash", "--rcfile", absoluteAppliPath + "/.bashrc" ] + if sys.platform == "win32": + cmd = ["cmd", "/K", "set PROMPT=[SALOME] $P$G"] + else: + cmd = ["/bin/bash", "--rcfile", absoluteAppliPath + "/.bashrc" ] proc = subprocess.Popen(cmd, shell=False, close_fds=True) - return proc.communicate() + proc.communicate() + return proc.returncode # def __copyFiles(user, machine, script, infiles, outfiles): @@ -215,7 +252,7 @@ def __copyFiles(user, machine, script, infiles, outfiles): # copy the infile to the remote server cmd = "scp %s %s@%s:%s" % (infile, user, machine, tmp_file) - print "[ SCP ]", cmd + print("[ SCP ]", cmd) os.system(cmd) list_infiles.append(tmp_file) @@ -239,7 +276,7 @@ def __copyFiles(user, machine, script, infiles, outfiles): # copy the salome script on the remote server cmd = "scp %s %s@%s:%s" % (tmp_script, user, machine, tmp_script) - print "[ SCP ]", cmd + print("[ SCP ]", cmd) os.system(cmd) return list_infiles, list_outfiles, tmp_script @@ -248,11 +285,11 @@ def __copyFiles(user, machine, script, infiles, outfiles): # sa_obj is a ScriptAndArgs object (from salomeContextUtils) def __runRemoteSession(sa_obj, params): if not params.user: - print "ERROR: The user login on remote machine MUST be given." - return + print("ERROR: The user login on remote machine MUST be given.") + return 1 if not params.directory: - print "ERROR: The remote directory MUST be given." - return + print("ERROR: The remote directory MUST be given.") + return 1 # sa_obj.script may be 'python script.py' --> only process .py file header = " ".join(sa_obj.script.split()[:-1]) @@ -265,7 +302,7 @@ def __runRemoteSession(sa_obj, params): if params.port: command = command + "-p %s "%params.port command = command + " %s %s args:%s"%(header, tmp_script, ",".join(tmp_in)) - print '[ SSH ] ' + command + print('[ SSH ] ' + command) os.system(command) # Get remote files and clean @@ -275,15 +312,16 @@ def __runRemoteSession(sa_obj, params): for outfile in (sa_obj.out or []): remote_outfile = tmp_out.pop(0) command = "scp %s@%s:%s %s" %(params.user, params.machine, remote_outfile, outfile) - print "[ SCP ] " + command + print("[ SCP ] " + command) os.system(command) # clean temporary files command = "ssh %s@%s \\rm -f %s" % (params.user, params.machine, " ".join(temp_files)) - print '[ SSH ] ' + command + print('[ SSH ] ' + command) os.system(command) os.remove(tmp_script) + return 0 # def runSession(params, args): @@ -294,6 +332,10 @@ def runSession(params, args): return __runLocalSession(command) elif params.mode == "remote": + any_error = 0 for sa_obj in scriptArgs: - __runRemoteSession(sa_obj, params) + ok = __runRemoteSession(sa_obj, params) + if not ok: + any_error = 1 + return any_error #