X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=src%2Fnepi%2Futil%2Fexecfuncs.py;h=17531199a8e20f95f3cd072c53650c20c2c40ca4;hb=e55924b6886bd7382a28e1ae235c4810f852e163;hp=7e2d506d3050c5b9c2fe9232138e1f7d281566a1;hpb=eb111746f316ddd70f6eed77e432151c8ab96fe6;p=nepi.git
diff --git a/src/nepi/util/execfuncs.py b/src/nepi/util/execfuncs.py
index 7e2d506d..17531199 100644
--- a/src/nepi/util/execfuncs.py
+++ b/src/nepi/util/execfuncs.py
@@ -1,11 +1,30 @@
-from nepi.util.sshfuncs import RUNNING, FINISHED, NOT_STARTED, STDOUT
+#
+# NEPI, a framework to manage network experiments
+# 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 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
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+#
+# Author: Alina Quereilhac
+from nepi.util.sshfuncs import ProcStatus, STDOUT, log, shell_escape
+
+import logging
+import shlex
import subprocess
def lexec(command,
user = None,
sudo = False,
- stdin = None,
env = None):
"""
Executes a local command, returns ((stdout,stderr),process)
@@ -18,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
- p = subprocess.Popen(command,
- stdout = subprocess.PIPE,
- stderr = subprocess.PIPE,
- stdin = stdin)
+ try:
+ out, err = proc.communicate()
+ log(log_msg, logging.DEBUG, out, err)
+ except:
+ log(log_msg, logging.ERROR, out, err)
+ raise
- out, err = p.communicate()
return ((out, err), proc)
def lcopy(source, dest, recursive = False):
@@ -34,21 +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")
-
- command.append(src)
- command.append(dst)
-
- p = subprocess.Popen(command,
+ args.append("-r")
+
+ if isinstance(source, list):
+ args.extend(source)
+ else:
+ args.append(source)
+
+ if isinstance(dest, list):
+ args.extend(dest)
+ else:
+ args.append(dest)
+
+ proc = subprocess.Popen(args,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
- out, err = p.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,
@@ -100,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),
@@ -108,14 +152,14 @@ def lspawn(command, pidfile,
'create' : 'mkdir -p %s ; ' % (shell_escape(home),) if create_home else '',
}
- (out,err),proc = lexec(cmd)
+ (out,err), proc = lexec(cmd)
if proc.wait():
raise RuntimeError, "Failed to set up application on host %s: %s %s" % (host, out,err,)
- return (out,err),proc
+ return ((out,err), proc)
-def lcheckpid(pidfile):
+def lgetpid(pidfile):
"""
Check the pidfile of a process spawned with remote_spawn.
@@ -128,7 +172,7 @@ def lcheckpid(pidfile):
or None if the pidfile isn't valid yet (maybe the process is still starting).
"""
- (out,err),proc = lexec("cat %s" % pidfile )
+ (out,err), proc = lexec("cat %s" % pidfile )
if proc.wait():
return None
@@ -152,7 +196,7 @@ def lstatus(pid, ppid):
One of NOT_STARTED, RUNNING, FINISHED
"""
- (out,err),proc = lexec(
+ (out,err), proc = lexec(
# Check only by pid. pid+ppid does not always work (especially with sudo)
" (( ps --pid %(pid)d -o pid | grep -c %(pid)d && echo 'wait') || echo 'done' ) | tail -n 1" % {
'ppid' : ppid,
@@ -160,15 +204,15 @@ def lstatus(pid, ppid):
})
if proc.wait():
- return NOT_STARTED
+ return ProcStatus.NOT_STARTED
status = False
if out:
status = (out.strip() == 'wait')
else:
- return NOT_STARTED
- return RUNNING if status else FINISHED
-
+ return ProcStatus.NOT_STARTED
+
+ return ProcStatus.RUNNING if status else ProcStatus.FINISHED
def lkill(pid, ppid, sudo = False):
"""