From fe3c416205b9c07c42df6bdece35e22e0902d042 Mon Sep 17 00:00:00 2001 From: "Bryn M. Reeves" Date: Tue, 16 Sep 2014 20:15:04 +0100 Subject: [utilities,plugin] check for return status 126 A return status of 126 indicates 'found but not executable'. This is returned from timeout for some malformed commands when running as a normal user but not when running as root, e.g.: Running 1/1: multipath... [plugin:multipath] collecting path '/etc/multipath/' [plugin:multipath] unpacked command tuple: ('['multipath -l', 'multipath -v4 -ll']', 'None', 'None', 300, 'None') [plugin:multipath] collecting output of '['multipath -l', 'multipath -v4 -ll']' Traceback (most recent call last): File "/usr/sbin/sosreport", line 25, in main(sys.argv[1:]) File "/usr/lib/python2.7/site-packages/sos/sosreport.py", line 1389, in main sos.execute() AttributeError: 'list' object has no attribute 'split' > /usr/lib/python2.7/site-packages/sos/plugins/__init__.py(563)get_cmd_output_now() -> % (exe.split()[0], time() - start)) (Pdb) bt /usr/sbin/sosreport(25)() -> main(sys.argv[1:]) /usr/lib/python2.7/site-packages/sos/sosreport.py(1389)main() -> sos.execute() /usr/lib/python2.7/site-packages/sos/sosreport.py(1369)execute() -> self.collect() /usr/lib/python2.7/site-packages/sos/sosreport.py(1144)collect() -> plug.collect() /usr/lib/python2.7/site-packages/sos/plugins/__init__.py(633)collect() -> self._collect_cmd_output() /usr/lib/python2.7/site-packages/sos/plugins/__init__.py(613)_collect_cmd_output() -> timeout=timeout, runat=runat) > /usr/lib/python2.7/site-packages/sos/plugins/__init__.py(563)get_cmd_output_now() -> % (exe.split()[0], time() - start)) (Pdb) result {'status': 126, 'output': u"timeout: failed to run command '[multipath -l,': Permission denied\n"} Signed-off-by: Bryn M. Reeves --- sos/plugins/__init__.py | 6 ++++-- sos/utilities.py | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/sos/plugins/__init__.py b/sos/plugins/__init__.py index f53fc94f..03e82f1b 100644 --- a/sos/plugins/__init__.py +++ b/sos/plugins/__init__.py @@ -468,7 +468,8 @@ class Plugin(object): if result['status'] == 124: self._log_warn("command '%s' timed out after %ds" % (prog, timeout)) - if result['status'] == 127: + # 126 means 'found but not executable' + if result['status'] == 126 or result['status'] == 127: self._log_debug("could not run '%s': command not found" % prog) return result @@ -557,7 +558,8 @@ class Plugin(object): """ start = time() result = self.get_command_output(exe, timeout=timeout, runat=runat) - if result['status'] == 127: + # 126 means 'found but not executable' + if result['status'] == 126 or result['status'] == 127: return None self._log_debug("collected output of '%s' in %s" % (exe.split()[0], time() - start)) diff --git a/sos/utilities.py b/sos/utilities.py index 333d7d0c..4dffe695 100644 --- a/sos/utilities.py +++ b/sos/utilities.py @@ -153,7 +153,7 @@ def sos_get_command_output(command, timeout=300, runat=None): # Required hack while we still pass shell=True to Popen; a Popen # call with shell=False for a non-existant binary will raise OSError. - if p.returncode == 127: + if p.returncode == 126 or p.returncode == 127: stdout = six.binary_type(b"") return {'status': p.returncode, 'output': stdout.decode('utf-8')} -- cgit