diff options
author | Jesse Jaggars <jjaggars@redhat.com> | 2012-04-05 15:48:02 -0500 |
---|---|---|
committer | Jesse Jaggars <jjaggars@redhat.com> | 2012-04-05 15:48:02 -0500 |
commit | 26ffd0d8bd1336e6c4471b39cd129eff06a608db (patch) | |
tree | e8004b63884cf1c5dad34789382f066c4c3f9018 | |
parent | 4b351b751e2f847b12ebbe7922a39cdc0959ea2e (diff) | |
parent | 3a09cb48bc8781f4d8693debec33e8c304096e08 (diff) | |
download | sos-26ffd0d8bd1336e6c4471b39cd129eff06a608db.tar.gz |
Merge branch 'master' of github.com:sosreport/sosreport
-rw-r--r-- | sos/plugins/__init__.py | 5 | ||||
-rw-r--r-- | sos/utilities.py | 9 | ||||
-rw-r--r-- | tests/utilities_tests.py | 9 |
3 files changed, 16 insertions, 7 deletions
diff --git a/sos/plugins/__init__.py b/sos/plugins/__init__.py index 4ee9e419..aaf439bd 100644 --- a/sos/plugins/__init__.py +++ b/sos/plugins/__init__.py @@ -404,13 +404,12 @@ class Plugin(object): if filespec not in self.copyPaths: self.copyPaths.append((filespec, sub)) - def callExtProg(self, prog): + def callExtProg(self, prog, timeout=300): """Execute a command independantly of the output gathering part of sosreport. """ # pylint: disable-msg = W0612 - status, shout, runtime = sosGetCommandOutput(prog) - return (status, shout, runtime) + return sosGetCommandOutput(prog, timeout) def checkExtprog(self, prog): """Execute a command independently of the output gathering part of diff --git a/sos/utilities.py b/sos/utilities.py index 046a9a51..ee241589 100644 --- a/sos/utilities.py +++ b/sos/utilities.py @@ -149,6 +149,11 @@ def sosGetCommandOutput(command, timeout=300): cmdfile = command.strip("(").split()[0] if is_executable(cmdfile): + + # use /usr/bin/timeout to implement a timeout + if timeout and is_executable("/usr/bin/timeout"): + command = "/usr/bin/timeout %ds %s" % (timeout, command) + p = Popen(command, shell=True, stdout=PIPE, stderr=PIPE, bufsize=-1) stdout, stderr = p.communicate() return (p.returncode, stdout.strip(), 0) @@ -173,9 +178,7 @@ def import_module(module_fqname, superclasses=None): def shell_out(cmd): """Uses subprocess.Popen to make a system call and returns stdout. Does not handle exceptions.""" - p = Popen(cmd, shell=True, stdout=PIPE, stderr=PIPE) - return p.communicate()[0] - + return sosGetCommandOutput(cmd)[1] class Archive(object): diff --git a/tests/utilities_tests.py b/tests/utilities_tests.py index 24bc950b..fd9699fe 100644 --- a/tests/utilities_tests.py +++ b/tests/utilities_tests.py @@ -2,7 +2,7 @@ import os.path import unittest from StringIO import StringIO -from sos.utilities import grep, DirTree, checksum, get_hash_name, is_executable, sosGetCommandOutput, find, tail +from sos.utilities import grep, DirTree, checksum, get_hash_name, is_executable, sosGetCommandOutput, find, tail, shell_out import sos TEST_DIR = os.path.dirname(__file__) @@ -71,6 +71,9 @@ class ExecutableTest(unittest.TestCase): path = os.path.join(TEST_DIR, 'test_exe.py') self.assertTrue(is_executable(path)) + def test_exe_file_abs_path(self): + self.assertTrue(is_executable("/usr/bin/timeout")) + def test_output(self): path = os.path.join(TEST_DIR, 'test_exe.py') ret, out, junk = sosGetCommandOutput(path) @@ -83,6 +86,10 @@ class ExecutableTest(unittest.TestCase): self.assertEquals(ret, 127) self.assertEquals(out, "") + def test_shell_out(self): + path = os.path.join(TEST_DIR, 'test_exe.py') + self.assertEquals("executed", shell_out(path)) + class FindTest(unittest.TestCase): |