if self._async(proc, args, **kwargs):
return proc
stdout, stderr = proc.communicate(kwargs["input"])
+ # can occur if we were doing interactive communication; i.e.
+ # we didn't pass in PIPE.
+ if stdout is None:
+ stdout = ""
+ if stderr is None:
+ stderr = ""
if not kwargs["interactive"]:
if kwargs["strip"]:
self._log(None, stderr)
logging.debug("STDERR:\n" + stderr)
def _wait(self):
pass
- def _async(self):
+ def _async(self, *args, **kwargs):
return False
def callAsUser(self, *args, **kwargs):
"""
on working directory context. Keyword arguments are the
same as :meth:`call`.
"""
+ if os.getuid():
+ return self.call(*args, **kwargs)
uid = os.stat(os.getcwd()).st_uid
# consider also checking ruid?
if uid != os.geteuid():
return
on_success(stdout, stderr)
+# Setup a convenience global instance
+shell = Shell()
+call = shell.call
+callAsUser = shell.callAsUser
+safeCall = shell.safeCall
+eval = shell.eval
class DummyParallelShell(ParallelShell):
"""Same API as :class:`ParallelShell`, but doesn't actually