X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=src%2Fnepi%2Futil%2Fexecfuncs.py;h=cc95bdf0f94ff932afe418932bda25ccb6ac982f;hb=6285ca51026efb69642eea9dfc7c480e722d84a9;hp=d2da3ace35efe80d066c9034f57e7c61a4290ef5;hpb=2efd5eabeba8a6577ace9132d6336d44be0510e8;p=nepi.git diff --git a/src/nepi/util/execfuncs.py b/src/nepi/util/execfuncs.py index d2da3ace..cc95bdf0 100644 --- a/src/nepi/util/execfuncs.py +++ b/src/nepi/util/execfuncs.py @@ -3,9 +3,8 @@ # Copyright (C) 2013 INRIA # # This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. +# it under the terms of the GNU General Public License version 2 as +# published by the Free Software Foundation; # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -17,8 +16,10 @@ # # Author: Alina Quereilhac -from nepi.util.sshfuncs import ProcStatus, STDOUT +from nepi.util.sshfuncs import ProcStatus, STDOUT, log, shell_escape +import logging +import shlex import subprocess def lexec(command, @@ -36,15 +37,26 @@ def lexec(command, if sudo: command = "sudo %s" % command - elif user: - command = "su %s ; %s " % (user, command) + + # XXX: Doing 'su user' blocks waiting for a password on stdin + #elif user: + # command = "su %s ; %s " % (user, command) + + proc = subprocess.Popen(command, + shell = True, + stdout = subprocess.PIPE, + stderr = subprocess.PIPE) + out = err = "" + log_msg = "lexec - command %s " % command - proc = subprocess.Popen(command, shell=True, - stdout = subprocess.PIPE, - stderr = subprocess.PIPE) + try: + out, err = proc.communicate() + log(log_msg, logging.DEBUG, out, err) + except: + log(log_msg, logging.ERROR, out, err) + raise - out, err = proc.communicate() return ((out, err), proc) def lcopy(source, dest, recursive = False): @@ -52,28 +64,35 @@ def lcopy(source, dest, recursive = False): Copies from/to localy. """ - if TRACE: - print "scp", source, dest - - command = ["cp"] + args = ["cp"] if recursive: - command.append("-R") + args.append("-r") - if isinstance(dest, str): - dest = dest.split(";") - - if isinstance(src, str): - src = src.split(";") - - args.extend(src) + if isinstance(source, list): + args.extend(source) + else: + args.append(source) - args.extend(dest) + if isinstance(dest, list): + args.extend(dest) + else: + args.append(dest) - proc = subprocess.Popen(command, + proc = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - out, err = proc.communicate() + out = err = "" + command = " ".join(args) + log_msg = " lcopy - command %s " % command + + try: + out, err = proc.communicate() + log(log_msg, logging.DEBUG, out, err) + except: + log(log_msg, logging.ERROR, out, err) + raise + return ((out, err), proc) def lspawn(command, pidfile, @@ -125,7 +144,7 @@ def lspawn(command, pidfile, 'stdin' : stdin, } - cmd = "%(create)s%(gohome)s rm -f %(pidfile)s ; %(sudo)s nohup bash -c %(command)s " % { + cmd = "%(create)s%(gohome)s rm -f %(pidfile)s ; %(sudo)s bash -c %(command)s " % { 'command' : shell_escape(daemon_command), 'sudo' : 'sudo -S' if sudo else '', 'pidfile' : shell_escape(pidfile), @@ -136,7 +155,7 @@ def lspawn(command, pidfile, (out,err), proc = lexec(cmd) if proc.wait(): - raise RuntimeError, "Failed to set up application on host %s: %s %s" % (host, out,err,) + raise RuntimeError("Failed to set up application on host %s: %s %s" % (host, out,err,)) return ((out,err), proc)