sos/0051-Refactor-Plugin.collect-pathway.patch
Bryn M. Reeves 5261563507 Update sos to 3.1
Update sos to the 3.1 upstream release and add post-release patches
from the development tree.
2014-04-01 12:25:00 +01:00

153 lines
5.9 KiB
Diff

From f98ae415bbff3f633641633a1c99c13021d4b352 Mon Sep 17 00:00:00 2001
From: "Bryn M. Reeves" <bmr@redhat.com>
Date: Thu, 27 Mar 2014 13:47:10 +0000
Subject: [PATCH 51/61] Refactor Plugin.collect() pathway
Clean up and refactor the collect() path in preparation for
fixing the recursive tree copying code.
- Move string and command collection into their own methods
- Move glob expansion from add_copy_spec*() to
collect_copy_specs()
- Rename do_copy_file_or_dir() to do_copy_path()
There are no functional changes as a result of this patch.
Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
---
sos/plugins/__init__.py | 57 +++++++++++++++++++++++++++++--------------------
1 file changed, 34 insertions(+), 23 deletions(-)
diff --git a/sos/plugins/__init__.py b/sos/plugins/__init__.py
index 55c2d48..807bd3f 100644
--- a/sos/plugins/__init__.py
+++ b/sos/plugins/__init__.py
@@ -99,7 +99,7 @@ class Plugin(object):
self.opt_parms = []
self.commons = commons
self.forbidden_paths = []
- self.copy_paths = []
+ self.copy_specs = []
self.copy_strings = []
self.collect_cmds = []
@@ -229,10 +229,10 @@ class Plugin(object):
self.archive.add_link(reldest,srcpath)
# copy the symlink target translating relative targets
- # to absolute paths to pass to do_copy_file_or_dir.
+ # to absolute paths to pass to do_copy_path.
self.soslog.debug("normalized link target %s as %s"
%(linkdest, absdest))
- self.do_copy_file_or_dir(absdest)
+ self.do_copy_path(absdest)
self.copied_files.append({
'srcpath':srcpath,
@@ -242,7 +242,7 @@ class Plugin(object):
def copy_dir(self, srcpath, sub=None):
for afile in os.listdir(srcpath):
- self.do_copy_file_or_dir(os.path.join(srcpath, afile), dest=None, sub=sub)
+ self.do_copy_path(os.path.join(srcpath, afile), dest=None, sub=sub)
def _get_dest_for_srcpath(self, srcpath):
for copied in self.copied_files:
@@ -251,7 +251,7 @@ class Plugin(object):
return None
# Methods for copying files and shelling out
- def do_copy_file_or_dir(self, srcpath, dest=None, sub=None):
+ def do_copy_path(self, srcpath, dest=None, sub=None):
# pylint: disable-msg = R0912
# pylint: disable-msg = R0915
'''Copy file or directory to the destination tree. If a directory, then
@@ -308,7 +308,7 @@ class Plugin(object):
def add_forbidden_path(self, forbiddenPath):
- """Specify a path to not copy, even if it's part of a copy_paths[]
+ """Specify a path to not copy, even if it's part of a copy_specs[]
entry.
"""
# Glob case handling is such that a valid non-glob is a reduced glob
@@ -417,12 +417,11 @@ class Plugin(object):
copied into the sosreport by this module.
"""
if not (copyspec and len(copyspec)):
- # self.soslog.warning("invalid file path")
+ self.soslog.warning("%s added null or empty file path"
+ % self.name())
return False
- # Glob case handling is such that a valid non-glob is a reduced glob
- for filespec in glob.glob(copyspec):
- if filespec not in self.copy_paths:
- self.copy_paths.append((filespec, sub))
+ if copyspec not in self.copy_specs:
+ self.copy_specs.append((copyspec, sub))
def get_command_output(self, prog, timeout=300):
(status, output, runtime) = sos_get_command_output(prog, timeout)
@@ -535,19 +534,16 @@ class Plugin(object):
"""
self.custom_text += text
- def collect(self):
- """Collect the data for a plugin."""
- for path, sub in self.copy_paths:
- self.do_copy_file_or_dir(path, sub=sub)
+ def expand_copy_spec(self, copyspec):
+ return glob.glob(copyspec)
- for string, file_name in self.copy_strings:
- try:
- self.archive.add_string(string,
- os.path.join('sos_strings', self.name(), file_name))
- except Exception as e:
- self.soslog.debug("could not create %s, traceback follows: %s"
- % (file_name, e))
+ def collect_copy_specs(self):
+ # Glob case handling is such that a valid non-glob is a reduced glob
+ for spec, sub in self.copy_specs:
+ for path in self.expand_copy_spec(spec):
+ self.do_copy_path(path, sub=sub)
+ def collect_cmd_output(self):
for progs in zip(self.collect_cmds):
prog, suggest_filename, root_symlink, timeout = progs[0]
self.soslog.debug("collecting output of '%s'" % prog)
@@ -558,6 +554,21 @@ class Plugin(object):
self.soslog.debug("error collecting output of '%s' (%s)"
% (prog, e))
+ def collect_strings(self):
+ for string, file_name in self.copy_strings:
+ try:
+ self.archive.add_string(string,
+ os.path.join('sos_strings', self.name(), file_name))
+ except Exception as e:
+ self.soslog.debug("could not create %s, traceback follows: %s"
+ % (file_name, e))
+
+ def collect(self):
+ """Collect the data for a plugin."""
+ self.collect_copy_specs()
+ self.collect_cmd_output()
+ self.collect_strings()
+
def get_description(self):
""" This function will return the description for the plugin"""
try:
@@ -592,7 +603,7 @@ class Plugin(object):
return True
def setup(self):
- """This method must be overridden to add the copy_paths, forbidden_paths,
+ """This method must be overridden to add the copy_specs, forbidden_paths,
and external programs to be collected at a minimum.
"""
pass
--
1.7.11.7