Salome HOME
updated copyright message
[modules/kernel.git] / bin / runSession.py
index bf0c5c6b7a518b52c9bf84e80bca12a6fcb832a2..39d20593d9f57b44787d1eab9513fa5094d6ec17 100644 (file)
@@ -1,5 +1,5 @@
 #  -*- coding: iso-8859-1 -*-
-# Copyright (C) 2007-2017  CEA/DEN, EDF R&D, OPEN CASCADE
+# Copyright (C) 2007-2023  CEA, EDF, OPEN CASCADE
 #
 # Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 # CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -118,15 +118,25 @@ User "myself" connects to remotemachine to run the script concatenate.py in
                     help="[Remote mode] The user on the computer to connect to."
                     )
 
+  parser.add_option('-l', '--launcher', dest="launcher", default=None,
+                    help="[Remote mode] The machine and the port to connect to."
+                    )
+
   short_args, extra_args = getShortAndExtraArgs(args)
   try:
     (options, args) = parser.parse_args(short_args)
-  except Exception, e:
-    print e
+  except Exception as e:
+    print(e)
     return None, []
 
   port = options.port
   host = options.host
+  launcher = options.launcher
+  if launcher is not None:
+    pos = launcher.find(":")
+    if pos != -1:
+      host = launcher[0:pos]
+      port = launcher[pos+1:]
 
   # :GLITCH: this code defines specific environment variables (OMNIORB_CONFIG, NSPORT,
   # NSHOST) which are later used by other modules. Working, but not really "safe"...
@@ -140,6 +150,11 @@ User "myself" connects to remotemachine to run the script concatenate.py in
         os.environ['OMNIORB_CONFIG'] = fileOmniConfig
         # --- set environment variables for port and hostname of NamingService
         host, port = getNSparams()
+        try:
+            # keep short name for host, for a correct comparison with getShortHostName() later
+            host=host.split('.')[0]
+        except Exception:
+            pass
       else:
         # No running session
         host = "no_host"
@@ -162,7 +177,7 @@ User "myself" connects to remotemachine to run the script concatenate.py in
   # determine running mode, that is either 'local' or 'remote'
   here = getShortHostName()
   mode = "local"
-  if host != here and host != "localhost" and host != "no_host":
+  if host != here and host != "localhost" and host != "no_host" and launcher is None:
     mode="remote"
     pass
   params = SessionParameters(mode, port, host, options.user, options.directory)
@@ -205,7 +220,7 @@ def __runLocalSession(command):
         if proc.returncode != 0:
           any_error = True
           error_code = proc.returncode
-      except:
+      except Exception:
           any_error = True
           pass
 
@@ -252,7 +267,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)
@@ -276,7 +291,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
@@ -285,10 +300,10 @@ 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."
+    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."
+    print("ERROR: The remote directory MUST be given.")
     return 1
 
   # sa_obj.script may be 'python script.py' --> only process .py file
@@ -298,11 +313,13 @@ def __runRemoteSession(sa_obj, params):
   tmp_in, tmp_out, tmp_script = __copyFiles(params.user, params.machine, script, sa_obj.args or [], sa_obj.out or [])
 
   # execute command on the remote SALOME application
-  command = "ssh %s@%s %s/salome shell " % (params.user, params.machine, params.directory)
+  command = "%s/salome shell" % (params.directory)
   if params.port:
-    command = command + "-p %s "%params.port
-  command = command + " %s %s args:%s"%(header, tmp_script, ",".join(tmp_in))
-  print '[  SSH   ] ' + command
+    command += " -p %s "%params.port
+  command += " %s %s args:%s"%(header, tmp_script, ",".join(tmp_in))
+  # salome shell command must run in a login shell because of module function
+  command = "ssh %s@%s -t 'bash -l -c \"%s\"'" % (params.user, params.machine, command)
+  print('[  SSH   ] ' + command)
   os.system(command)
 
   # Get remote files and clean
@@ -312,12 +329,12 @@ 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)