[sos] Update sos to 3.1

Bryn Reeves bmr at fedoraproject.org
Tue Apr 1 11:26:25 UTC 2014


commit 5261563507701900744778f821175056ba130130
Author: Bryn M. Reeves <bmr at redhat.com>
Date:   Tue Apr 1 12:25:00 2014 +0100

    Update sos to 3.1
    
    Update sos to the 3.1 upstream release and add post-release patches
    from the development tree.

 .gitignore                                         |    1 +
 0001-Fix-cluster-module-crm_report-support.patch   |   81 +
 ...bsolete-diagnostics-code-from-ldap-plugin.patch |   36 +
 ...rclass-postproc-method-is-called-in-ldap-.patch |   39 +
 0004-Fix-cluster-postproc-regression.patch         |   29 +
 0005-Fix-get_option-use-in-cluster-plugin.patch    |   32 +
 0006-Fix-verbose-file-logging.patch                |   44 +
 ...ays-treat-rhevm-vdsmlogs-option-as-string.patch |   33 +
 0008-Add-rhsm-debug-collection-to-yum-plugin.patch |   26 +
 ...ke-get_cmd_output_now-behaviour-match-2.2.patch |   35 +
 ...-geo-replication-status-in-gluster-plugin.patch |   34 +
 0011-postgresql-minor-fixes.patch                  |  132 ++
 ...postgresql-add-logs-about-errors-warnings.patch |   68 +
 0013-postgresql-added-license-and-copyright.patch  |   41 +
 0014-postgresql-allow-use-TCP-socket.patch         |   56 +
 0015-Pass-no-archive-to-rhsm-debug-script.patch    |   31 +
 ...ed-fds-are-closed-when-calling-subprocess.patch |   81 +
 0017-Fix-gluster-volume-name-extraction.patch      |   31 +
 0018-Add-distupgrade-plugin.patch                  |   65 +
 ...Fix-command-output-substitution-exception.patch |   49 +
 ...or-message-when-cluster.crm_from-is-inval.patch |   38 +
 ...ove-useless-check_enabled-from-sar-plugin.patch |   38 +
 ...hard-coded-var-log-sa-paths-in-sar-plugin.patch |   40 +
 ...p_default_authtok-password-in-sssd-plugin.patch |   38 +
 ...-package-check-with-file-check-in-anacron.patch |   33 +
 0025-Remove-the-rhevm-plugin.patch                 |   51 +
 ...c-Move-VPD-related-tool-under-common-code.patch |   45 +
 0027-Add-PowerNV-specific-debug-data.patch         |   33 +
 ...ng-use-of-obsolete-get_cmd_dir-in-plugins.patch |   44 +
 0029-Update-systemd-support.patch                  |   35 +
 0030-Add-tuned-plugin.patch                        |   53 +
 ...t_cmd_path-make_cmd_path-make_cmd_dirs-me.patch |  173 ++
 ...oken-binary-detection-in-satellite-plugin.patch |   35 +
 ...-Rename-validatePlugin-to-validate_plugin.patch |   44 +
 ...olicy_tests.py-for-validate_plugin-change.patch |   50 +
 0035-Match-plugins-against-policies.patch          |  150 ++
 0036-Do-not-collect-isos-in-cobbler-plugin.patch   |   24 +
 0037-Call-rhsm-debug-with-the-sos-switch.patch     |   26 +
 0038-Fix-plugin_test-exception-on-six.PY2.patch    |   32 +
 0039-Remove-profile-support.patch                  |  244 +++
 0040-Dead-code-removal-sos_relative_path.patch     |   78 +
 0041-Dead-code-removal-DirTree.patch               |  146 ++
 0042-Dead-code-removal-utilities.checksum.patch    |   72 +
 0043-Add-vim-tags-to-all-python-source-files.patch | 1830 ++++++++++++++++++++
 ...ad-code-removal-sos.plugins.common_prefix.patch |   39 +
 0045-Dead-code-removal-PluginException.patch       |   31 +
 0046-Convert-infiniband-to-package-list.patch      |   33 +
 ...elf.policy-.pkg_by_name-us-in-Logs-plugin.patch |   28 +
 ...ean-up-package-checks-in-processor-plugin.patch |   52 +
 0049-Pythonify-Plugin._path_in_pathlist.patch      |   29 +
 ...ix-x86-arch-detection-in-processor-plugin.patch |   26 +
 0051-Refactor-Plugin.collect-pathway.patch         |  152 ++
 ...lete-checksum-reference-from-utilities_te.patch |   27 +
 ...plugin_tests.py-to-match-new-method-names.patch |   54 +
 0054-Drop-RedHatPlugin-from-procenv.patch          |   32 +
 ...e-sub-parameter-from-Plugin.add_copy_spec.patch |  164 ++
 ...rences-to-sub-parameter-from-plugin-tests.patch |   46 +
 0057-Use-a-set-for-Plugin.copy_paths.patch         |   58 +
 ...Plugin-tests-to-treat-copy_paths-as-a-set.patch |   26 +
 ...s-for-Plugin.add_copy_spec-add_copy_specs.patch |   61 +
 ...eError-if-add_copy_specs-is-called-with-a.patch |   48 +
 ...ion-of-grub-configuration-for-UEFI-system.patch |   61 +
 sos.spec                                           |  289 +++-
 sources                                            |    2 +-
 64 files changed, 5548 insertions(+), 6 deletions(-)
---
diff --git a/.gitignore b/.gitignore
index 23ce7a6..31fc852 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,3 @@
 sos-2.2.tar.gz
 /sos-3.0.tar.gz
+/sos-3.1.tar.gz
diff --git a/0001-Fix-cluster-module-crm_report-support.patch b/0001-Fix-cluster-module-crm_report-support.patch
new file mode 100644
index 0000000..795b82c
--- /dev/null
+++ b/0001-Fix-cluster-module-crm_report-support.patch
@@ -0,0 +1,81 @@
+From 4ab4b086c1011997246c40d4c97079c3c001031c Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr at redhat.com>
+Date: Fri, 31 Jan 2014 15:08:28 +0000
+Subject: [PATCH 01/61] Fix cluster module crm_report support
+
+The cluster plugin used an obsolete sos-2.2 method to determine
+the command output directory. This causes an excaption at runtime
+since the referenced properties no longer exist.
+
+The crm_report script also expects a --from date and will not
+collect data unless this is passed. Default to passing a value 72
+hours before the current time and add a 'crm_from' option to the
+cluster module to allow the user to override this.
+
+Signed-off-by: Bryn M. Reeves <bmr at redhat.com>
+---
+ sos/plugins/cluster.py | 27 +++++++++++++++++++--------
+ 1 file changed, 19 insertions(+), 8 deletions(-)
+
+diff --git a/sos/plugins/cluster.py b/sos/plugins/cluster.py
+index 50e0e0b..c2ce42b 100644
+--- a/sos/plugins/cluster.py
++++ b/sos/plugins/cluster.py
+@@ -13,16 +13,17 @@
+ ## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ 
+ from sos.plugins import Plugin, RedHatPlugin
+-import re
++import re, os
+ from glob import glob
++from datetime import datetime, timedelta
+ 
+ class Cluster(Plugin, RedHatPlugin):
+     """cluster suite and GFS related information
+     """
+ 
+     plugin_name = 'cluster'
+-    option_list = [("gfslockdump",
+-                    'gather output of gfs lockdumps', 'slow', False),
++    option_list = [("gfslockdump", 'gather output of gfs lockdumps', 'slow', False),
++                    ("crm_from", 'specify the --from parameter passed to crm_report', 'fast', False),
+                     ('lockdump', 'gather dlm lockdumps', 'slow', False)]
+ 
+     packages = [
+@@ -83,9 +84,21 @@ class Cluster(Plugin, RedHatPlugin):
+         self.add_cmd_output("dlm_tool dump")
+         self.add_cmd_output("dlm_tool ls -n")
+         self.add_cmd_output("mkqdisk -L")
+-        crm_dest = os.path.join(self.cInfo['cmddir'],
+-                                self.name(), 'crm_report')
+-        self.collectExtOutput("crm_report -S --dest %s" % crm_dest)
++        # crm_report needs to be given a --from "YYYY-MM-DD HH:MM:SS" start
++        # time in order to collect data.
++        crm_from = (datetime.today()
++                    - timedelta(hours=72)).strftime("%Y-%m-%d %H:%m:%S")
++        if self.get_option('crm_from') != False:
++            if re.match(r'\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}',
++                        str(self.getOption('crm_from'))):
++                crm_from = self.getOption('crm_from')
++            else:
++                self.soslog.error("crm_from parameter '%s' is not a valid date"
++                            % self.getOption('crm_from'))
++
++        crm_dest = os.path.join(self.get_cmd_dir(), 'crm_report')
++        self.add_cmd_output('crm_report -S -d --dest %s --from "%s"'
++                    % (crm_dest, crm_from))
+ 
+     def do_lockdump(self):
+         status, output, time = self.call_ext_prog("dlm_tool ls")
+@@ -106,8 +119,6 @@ class Cluster(Plugin, RedHatPlugin):
+             self.do_file_sub(cluster_conf,
+                         r"(\s*\<fencedevice\s*.*\s*passwd\s*=\s*)\S+(\")",
+                         r"\1%s" %('"***"'))
+-        for luci_cfg in glob("/var/lib/luci/etc/*.ini*"):
+-            self.do_file_sub(luci_cfg, r"(.*secret\s*=\s*)\S+", r"\1******")
+         self.do_cmd_output_sub("corosync-objctl",
+                         r"(.*fence.*\.passwd=)(.*)",
+                         r"\1******")
+-- 
+1.7.11.7
+
diff --git a/0002-Remove-obsolete-diagnostics-code-from-ldap-plugin.patch b/0002-Remove-obsolete-diagnostics-code-from-ldap-plugin.patch
new file mode 100644
index 0000000..ba959b1
--- /dev/null
+++ b/0002-Remove-obsolete-diagnostics-code-from-ldap-plugin.patch
@@ -0,0 +1,36 @@
+From c344b0396b4ef4435860eb6e3954972e028e3491 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr at redhat.com>
+Date: Fri, 31 Jan 2014 15:25:15 +0000
+Subject: [PATCH 02/61] Remove obsolete diagnostics code from ldap plugin
+
+Signed-off-by: Bryn M. Reeves <bmr at redhat.com>
+---
+ sos/plugins/ldap.py | 12 ------------
+ 1 file changed, 12 deletions(-)
+
+diff --git a/sos/plugins/ldap.py b/sos/plugins/ldap.py
+index 361de73..f1032a9 100644
+--- a/sos/plugins/ldap.py
++++ b/sos/plugins/ldap.py
+@@ -22,18 +22,6 @@ class Ldap(Plugin):
+     plugin_name = "ldap"
+     ldap_conf = "/etc/openldap/ldap.conf"
+ 
+-    def get_ldap_opts(self):
+-        # capture /etc/openldap/ldap.conf options in dict
+-        # FIXME: possibly not hardcode these options in?
+-        ldapopts=["URI","BASE","TLS_CACERTDIR"]
+-        results={}
+-        tmplist=[]
+-        for i in ldapopts:
+-            t=self.do_regex_find_all(r"^(%s)\s+(.*)" % i,self.ldap_conf)
+-            for x in t:
+-                results[x[0]]=x[1].rstrip("\n")
+-        return results
+-
+     def setup(self):
+         super(Ldap, self).setup()
+         self.add_copy_spec("/etc/ldap.conf")
+-- 
+1.7.11.7
+
diff --git a/0003-Ensure-superclass-postproc-method-is-called-in-ldap-.patch b/0003-Ensure-superclass-postproc-method-is-called-in-ldap-.patch
new file mode 100644
index 0000000..81e116b
--- /dev/null
+++ b/0003-Ensure-superclass-postproc-method-is-called-in-ldap-.patch
@@ -0,0 +1,39 @@
+From 3c52bbd14c881748998c0edfb328c8c0ca92842f Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr at redhat.com>
+Date: Fri, 31 Jan 2014 15:43:44 +0000
+Subject: [PATCH 03/61] Ensure superclass postproc method is called in ldap
+ plugin
+
+Since the ldap plugins add files and post-processing methods at
+multiple class levels (Ldap, RedHatLdap etc.) derived classes
+must explicitly call their parent class's postproc() method to
+apply all substitutions to collected data.
+
+Signed-off-by: Bryn M. Reeves <bmr at redhat.com>
+---
+ sos/plugins/ldap.py | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/sos/plugins/ldap.py b/sos/plugins/ldap.py
+index f1032a9..79d8394 100644
+--- a/sos/plugins/ldap.py
++++ b/sos/plugins/ldap.py
+@@ -45,6 +45,7 @@ class RedHatLdap(Ldap, RedHatPlugin):
+         ])
+ 
+     def postproc(self):
++        super(RedHatLdap, self).postproc()
+         self.do_file_sub("/etc/nslcd.conf",
+                         r"(\s*bindpw\s*)\S+", r"\1********")
+         self.do_file_sub("/etc/pam_ldap.conf",
+@@ -77,6 +78,7 @@ class DebianLdap(Ldap, DebianPlugin, UbuntuPlugin):
+             suggest_filename="access_control_lists")
+ 
+     def postproc(self):
++        super(RedHatLdap, self).postproc()
+         self.do_cmd_output_sub(
+         "ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:/// -b cn=config '(!(objectClass=olcSchemaConfig))'",
+             r"(olcRootPW\: \s*)\S+", r"\1********")
+-- 
+1.7.11.7
+
diff --git a/0004-Fix-cluster-postproc-regression.patch b/0004-Fix-cluster-postproc-regression.patch
new file mode 100644
index 0000000..33fca95
--- /dev/null
+++ b/0004-Fix-cluster-postproc-regression.patch
@@ -0,0 +1,29 @@
+From 43268795e09c91ef7cc8dbef3cb1ddfc5c2bf686 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr at redhat.com>
+Date: Fri, 31 Jan 2014 16:03:31 +0000
+Subject: [PATCH 04/61] Fix cluster postproc regression
+
+Commit 4ab4b08 inadvertently removed the postprocessing rules for
+luci configuration. Revert that part of the commit.
+
+Signed-off-by: Bryn M. Reeves <bmr at redhat.com>
+---
+ sos/plugins/cluster.py | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/sos/plugins/cluster.py b/sos/plugins/cluster.py
+index c2ce42b..0fc4ded 100644
+--- a/sos/plugins/cluster.py
++++ b/sos/plugins/cluster.py
+@@ -119,6 +119,8 @@ class Cluster(Plugin, RedHatPlugin):
+             self.do_file_sub(cluster_conf,
+                         r"(\s*\<fencedevice\s*.*\s*passwd\s*=\s*)\S+(\")",
+                         r"\1%s" %('"***"'))
++        for luci_cfg in glob("/var/lib/luci/etc/*.ini*"):
++            self.do_file_sub(luci_cfg, r"(.*secret\s*=\s*)\S+", r"\1******")
+         self.do_cmd_output_sub("corosync-objctl",
+                         r"(.*fence.*\.passwd=)(.*)",
+                         r"\1******")
+-- 
+1.7.11.7
+
diff --git a/0005-Fix-get_option-use-in-cluster-plugin.patch b/0005-Fix-get_option-use-in-cluster-plugin.patch
new file mode 100644
index 0000000..2fc6014
--- /dev/null
+++ b/0005-Fix-get_option-use-in-cluster-plugin.patch
@@ -0,0 +1,32 @@
+From c73207037d86a96550b1e0aca9fb8172f4e68754 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr at redhat.com>
+Date: Mon, 3 Feb 2014 11:48:46 +0000
+Subject: [PATCH 05/61] Fix get_option() use in cluster plugin
+
+Signed-off-by: Bryn M. Reeves <bmr at redhat.com>
+---
+ sos/plugins/cluster.py | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/sos/plugins/cluster.py b/sos/plugins/cluster.py
+index 0fc4ded..eeacdab 100644
+--- a/sos/plugins/cluster.py
++++ b/sos/plugins/cluster.py
+@@ -90,11 +90,11 @@ class Cluster(Plugin, RedHatPlugin):
+                     - timedelta(hours=72)).strftime("%Y-%m-%d %H:%m:%S")
+         if self.get_option('crm_from') != False:
+             if re.match(r'\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}',
+-                        str(self.getOption('crm_from'))):
+-                crm_from = self.getOption('crm_from')
++                        str(self.get_option('crm_from'))):
++                crm_from = self.get_option('crm_from')
+             else:
+                 self.soslog.error("crm_from parameter '%s' is not a valid date"
+-                            % self.getOption('crm_from'))
++                            % self.get_option('crm_from'))
+ 
+         crm_dest = os.path.join(self.get_cmd_dir(), 'crm_report')
+         self.add_cmd_output('crm_report -S -d --dest %s --from "%s"'
+-- 
+1.7.11.7
+
diff --git a/0006-Fix-verbose-file-logging.patch b/0006-Fix-verbose-file-logging.patch
new file mode 100644
index 0000000..01d2122
--- /dev/null
+++ b/0006-Fix-verbose-file-logging.patch
@@ -0,0 +1,44 @@
+From 0338a955a930286beaa7b66c5167be9b15d34d78 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr at redhat.com>
+Date: Mon, 3 Feb 2014 12:09:57 +0000
+Subject: [PATCH 06/61] Fix verbose file logging
+
+Prior versions of sos enable debug logging to the embedded log
+file (sos_logs/sos.log) when a single '-v' is given. Restore this
+behaviour and ensure that command-not-found messages are reported
+at 'info' rather than 'warning' level.
+
+Signed-off-by: Bryn M. Reeves <bmr at redhat.com>
+---
+ sos/plugins/__init__.py | 2 +-
+ sos/sosreport.py        | 1 +
+ 2 files changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/sos/plugins/__init__.py b/sos/plugins/__init__.py
+index 7c63631..8df430d 100644
+--- a/sos/plugins/__init__.py
++++ b/sos/plugins/__init__.py
+@@ -488,7 +488,7 @@ class Plugin(object):
+             self.soslog.warning("command '%s' timed out after %ds"
+                     % (prog, timeout))
+         if status == 127:
+-            self.soslog.warning("could not run '%s': command not found" % prog)
++            self.soslog.info("could not run '%s': command not found" % prog)
+         return (status, output, runtime)
+ 
+     def call_ext_prog(self, prog, timeout=300):
+diff --git a/sos/sosreport.py b/sos/sosreport.py
+index 4b52572..0faa364 100644
+--- a/sos/sosreport.py
++++ b/sos/sosreport.py
+@@ -659,6 +659,7 @@ class SoSReport(object):
+                 flog.setLevel(logging.DEBUG)
+             elif self.opts.verbosity and self.opts.verbosity > 0:
+                 console.setLevel(logging.INFO)
++                flog.setLevel(logging.DEBUG)
+             else:
+                 console.setLevel(logging.WARNING)
+             self.soslog.addHandler(console)
+-- 
+1.7.11.7
+
diff --git a/0007-Always-treat-rhevm-vdsmlogs-option-as-string.patch b/0007-Always-treat-rhevm-vdsmlogs-option-as-string.patch
new file mode 100644
index 0000000..695046c
--- /dev/null
+++ b/0007-Always-treat-rhevm-vdsmlogs-option-as-string.patch
@@ -0,0 +1,33 @@
+From 03662edf4405ab66c0284a76bf68662c1657d5ab Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr at redhat.com>
+Date: Mon, 3 Feb 2014 12:26:45 +0000
+Subject: [PATCH 07/61] Always treat rhevm vdsmlogs option as string
+
+The rhevm plugin has a 'vdsmlogs' option to pass in a set of log
+files to be collected. When run with '-a' (or with
+'-krhevm.vdsmlogs) this evaluates to 'True' (a bool) and causes
+an exception when this is passed to add_copy_specs().
+
+Always treat the value as a string.
+
+Signed-off-by: Bryn M. Reeves <bmr at redhat.com>
+---
+ sos/plugins/rhevm.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/sos/plugins/rhevm.py b/sos/plugins/rhevm.py
+index 39b32f4..8068e05 100644
+--- a/sos/plugins/rhevm.py
++++ b/sos/plugins/rhevm.py
+@@ -13,7 +13,7 @@ class RhevM(Plugin, RedHatPlugin):
+         self.add_copy_spec("/etc/rhevm")
+         self.add_copy_spec("/var/log/rhevm")
+         if self.get_option("vdsmlogs"):
+-            self.add_copy_spec(self.get_option("vdsmlogs"))
++            self.add_copy_spec(str(self.get_option("vdsmlogs")))
+ 
+     def postproc(self):
+         """
+-- 
+1.7.11.7
+
diff --git a/0008-Add-rhsm-debug-collection-to-yum-plugin.patch b/0008-Add-rhsm-debug-collection-to-yum-plugin.patch
new file mode 100644
index 0000000..ea2535a
--- /dev/null
+++ b/0008-Add-rhsm-debug-collection-to-yum-plugin.patch
@@ -0,0 +1,26 @@
+From 3b727c296b86172a64dae83cb02a42fe4c5c6af9 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr at redhat.com>
+Date: Mon, 3 Feb 2014 13:03:04 +0000
+Subject: [PATCH 08/61] Add rhsm-debug collection to yum plugin
+
+Signed-off-by: Bryn M. Reeves <bmr at redhat.com>
+---
+ sos/plugins/yum.py | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/sos/plugins/yum.py b/sos/plugins/yum.py
+index 867302c..a9ae4e4 100644
+--- a/sos/plugins/yum.py
++++ b/sos/plugins/yum.py
+@@ -48,6 +48,8 @@ class Yum(Plugin, RedHatPlugin):
+             "/var/log/rhsm/rhsmcertd.log"])
+         self.add_cmd_output("subscription-manager list --installed")
+         self.add_cmd_output("subscription-manager list --consumed")
++        self.add_cmd_output("rhsm-debug system --destination %s"
++                % self.get_cmd_dir())
+ 
+         if self.get_option("yumlist"):
+             # List various information about available packages
+-- 
+1.7.11.7
+
diff --git a/0009-Make-get_cmd_output_now-behaviour-match-2.2.patch b/0009-Make-get_cmd_output_now-behaviour-match-2.2.patch
new file mode 100644
index 0000000..52065e9
--- /dev/null
+++ b/0009-Make-get_cmd_output_now-behaviour-match-2.2.patch
@@ -0,0 +1,35 @@
+From a9bf294a6898bb1defb396c0c0bca29234855db6 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr at redhat.com>
+Date: Mon, 3 Feb 2014 14:36:46 +0000
+Subject: [PATCH 09/61] Make get_cmd_output_now() behaviour match 2.2
+
+The equivalent method in sos-2.2, collectOutputNow() returned an
+absolute path to the collected file. Since the archive changes in
+3.0 this now returns a path relative to the root of the archive.
+
+This breaks existing users of the interface that try to open and
+process the content of the collected file (e.g. gluster).
+
+Return a join of the archive path and file path to the caller.
+
+Signed-off-by: Bryn M. Reeves <bmr at redhat.com>
+---
+ sos/plugins/__init__.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/sos/plugins/__init__.py b/sos/plugins/__init__.py
+index 8df430d..7130c7a 100644
+--- a/sos/plugins/__init__.py
++++ b/sos/plugins/__init__.py
+@@ -593,7 +593,7 @@ class Plugin(object):
+             time_passed = time() - start_time
+             self.proflog.debug("output: %-75s time: %f" % (exe, time_passed))
+ 
+-        return outfn
++        return os.path.join(self.archive.get_archive_path(), outfn)
+ 
+     # For adding output
+     def add_alert(self, alertstring):
+-- 
+1.7.11.7
+
diff --git a/0010-Include-geo-replication-status-in-gluster-plugin.patch b/0010-Include-geo-replication-status-in-gluster-plugin.patch
new file mode 100644
index 0000000..0baf562
--- /dev/null
+++ b/0010-Include-geo-replication-status-in-gluster-plugin.patch
@@ -0,0 +1,34 @@
+From 722f87787eaf8b50d16a3964892b16880c8bdbbb Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr at redhat.com>
+Date: Mon, 3 Feb 2014 15:17:55 +0000
+Subject: [PATCH 10/61] Include geo-replication status in gluster plugin
+
+Add the output of 'gluster volume geo-replication status' for
+each discovered gluster volume to the report.
+
+Signed-off-by: Bryn M. Reeves <bmr at redhat.com>
+---
+ sos/plugins/gluster.py | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+diff --git a/sos/plugins/gluster.py b/sos/plugins/gluster.py
+index 7c54fa0..02dbac3 100644
+--- a/sos/plugins/gluster.py
++++ b/sos/plugins/gluster.py
+@@ -102,6 +102,13 @@ class Gluster(Plugin, RedHatPlugin):
+         self.add_copy_spec('/tmp/glusterdump.options')
+         self.add_copy_spec(self.statedump_dir)
+ 
++        volume_file = self.get_cmd_output_now("gluster volume info",
++                        "gluster_volume_info")
++        if volume_file:
++            for volname in self.get_volume_names(volume_file):
++                self.add_cmd_output("gluster volume geo-replication %s status"
++                                    % volname)
++
+         self.add_cmd_output("gluster volume status")
+         # collect this last as some of the other actions create log entries
+         self.add_copy_spec("/var/log/glusterfs")
+-- 
+1.7.11.7
+
diff --git a/0011-postgresql-minor-fixes.patch b/0011-postgresql-minor-fixes.patch
new file mode 100644
index 0000000..592b80e
--- /dev/null
+++ b/0011-postgresql-minor-fixes.patch
@@ -0,0 +1,132 @@
+From ec82bf842d2c8537bf020909cfd406ec0ec3f023 Mon Sep 17 00:00:00 2001
+From: Sandro Bonazzola <sbonazzo at redhat.com>
+Date: Tue, 4 Feb 2014 15:15:10 +0000
+Subject: [PATCH 11/61] postgresql: minor fixes
+
+- pep8 / style fixes
+- Avoid redefining built-in 'file'
+
+Signed-off-by: Sandro Bonazzola <sbonazzo at redhat.com>
+Signed-off-by: Bryn M. Reeves <bmr at redhat.com>
+---
+ sos/plugins/postgresql.py | 60 ++++++++++++++++++++++++++++++-----------------
+ 1 file changed, 39 insertions(+), 21 deletions(-)
+
+diff --git a/sos/plugins/postgresql.py b/sos/plugins/postgresql.py
+index 0a8e5ac..478faff 100644
+--- a/sos/plugins/postgresql.py
++++ b/sos/plugins/postgresql.py
+@@ -4,6 +4,7 @@ import tempfile
+ from sos.plugins import Plugin, RedHatPlugin, UbuntuPlugin, DebianPlugin
+ from sos.utilities import find
+ 
++
+ class PostgreSQL(Plugin):
+     """PostgreSQL related information"""
+ 
+@@ -14,26 +15,31 @@ class PostgreSQL(Plugin):
+     tmp_dir = None
+ 
+     option_list = [
+-        ("pghome",  'PostgreSQL server home directory.', '', '/var/lib/pgsql'),
+-        ("username",  'username for pg_dump', '', 'postgres'),
+-        ("password",  'password for pg_dump', '', ''),
+-        ("dbname",  'database name to dump for pg_dump', '', ''),
++        ('pghome', 'PostgreSQL server home directory.', '', '/var/lib/pgsql'),
++        ('username', 'username for pg_dump', '', 'postgres'),
++        ('password', 'password for pg_dump', '', ''),
++        ('dbname', 'database name to dump for pg_dump', '', ''),
+     ]
+ 
+     def pg_dump(self):
+         dest_file = os.path.join(self.tmp_dir, "sos_pgdump.tar")
+         old_env_pgpassword = os.environ.get("PGPASSWORD")
+         os.environ["PGPASSWORD"] = self.get_option("password")
+-        (status, output, rtime) = self.call_ext_prog("pg_dump %s -U %s -w -f %s -F t" %
+-                                                   (self.get_option("dbname"),
+-                                                    self.get_option("username"),
+-                                                    dest_file))
++        (status, output, rtime) = self.call_ext_prog(
++            "pg_dump %s -U %s -w -f %s -F t" % (
++                self.get_option("dbname"),
++                self.get_option("username"),
++                dest_file
++            )
++        )
+         if old_env_pgpassword is not None:
+             os.environ["PGPASSWORD"] = old_env_pgpassword
+         if (status == 0):
+             self.add_copy_spec(dest_file)
+         else:
+-            self.add_alert("ERROR: Unable to execute pg_dump.  Error(%s)" % (output))
++            self.add_alert(
++                "ERROR: Unable to execute pg_dump.  Error(%s)" % (output)
++            )
+ 
+     def setup(self):
+         if self.get_option("dbname"):
+@@ -41,13 +47,16 @@ class PostgreSQL(Plugin):
+                 self.tmp_dir = tempfile.mkdtemp()
+                 self.pg_dump()
+             else:
+-                self.add_alert("WARN: password must be supplied to dump a database.")
++                self.add_alert(
++                    "WARN: password must be supplied to dump a database."
++                )
+ 
+     def postproc(self):
+         import shutil
+         if self.tmp_dir:
+             shutil.rmtree(self.tmp_dir)
+ 
++
+ class RedHatPostgreSQL(PostgreSQL, RedHatPlugin):
+     """PostgreSQL related information for Red Hat distributions"""
+ 
+@@ -55,14 +64,27 @@ class RedHatPostgreSQL(PostgreSQL, RedHatPlugin):
+         super(RedHatPostgreSQL, self).setup()
+ 
+         # Copy PostgreSQL log files.
+-        for file in find("*.log", self.get_option("pghome")):
+-            self.add_copy_spec(file)
++        for filename in find("*.log", self.get_option("pghome")):
++            self.add_copy_spec(filename)
+         # Copy PostgreSQL config files.
+-        for file in find("*.conf", self.get_option("pghome")):
+-            self.add_copy_spec(file)
++        for filename in find("*.conf", self.get_option("pghome")):
++            self.add_copy_spec(filename)
++
++        self.add_copy_spec(
++            os.path.join(
++                self.get_option("pghome"),
++                "data",
++                "PG_VERSION"
++            )
++        )
++        self.add_copy_spec(
++            os.path.join(
++                self.get_option("pghome"),
++                "data",
++                "postmaster.opts"
++            )
++        )
+ 
+-        self.add_copy_spec(os.path.join(self.get_option("pghome"), "data" , "PG_VERSION"))
+-        self.add_copy_spec(os.path.join(self.get_option("pghome"), "data" , "postmaster.opts"))
+ 
+ class DebianPostgreSQL(PostgreSQL, DebianPlugin, UbuntuPlugin):
+     """PostgreSQL related information for Debian/Ubuntu distributions"""
+@@ -78,8 +100,4 @@ class DebianPostgreSQL(PostgreSQL, DebianPlugin, UbuntuPlugin):
+         self.add_copy_spec("/var/lib/postgresql/*/main/PG_VERSION")
+         self.add_copy_spec("/var/lib/postgresql/*/main/postmaster.opts")
+ 
+-
+-
+-
+-
+-
++# vim: expandtab tabstop=4 shiftwidth=4
+-- 
+1.7.11.7
+
diff --git a/0012-postgresql-add-logs-about-errors-warnings.patch b/0012-postgresql-add-logs-about-errors-warnings.patch
new file mode 100644
index 0000000..31ce0b9
--- /dev/null
+++ b/0012-postgresql-add-logs-about-errors-warnings.patch
@@ -0,0 +1,68 @@
+From 7c53bbe37e1841777a95331ccaf6a43f39e23f86 Mon Sep 17 00:00:00 2001
+From: Sandro Bonazzola <sbonazzo at redhat.com>
+Date: Tue, 4 Feb 2014 15:15:51 +0000
+Subject: [PATCH 12/61] postgresql: add logs about errors / warnings
+
+give more info to support about what happened while
+collecting the report.
+
+Signed-off-by: Sandro Bonazzola <sbonazzo at redhat.com>
+Signed-off-by: Bryn M. Reeves <bmr at redhat.com>
+---
+ sos/plugins/postgresql.py | 23 +++++++++++++++++++++--
+ 1 file changed, 21 insertions(+), 2 deletions(-)
+
+diff --git a/sos/plugins/postgresql.py b/sos/plugins/postgresql.py
+index 478faff..0aa67a1 100644
+--- a/sos/plugins/postgresql.py
++++ b/sos/plugins/postgresql.py
+@@ -33,10 +33,13 @@ class PostgreSQL(Plugin):
+             )
+         )
+         if old_env_pgpassword is not None:
+-            os.environ["PGPASSWORD"] = old_env_pgpassword
++            os.environ["PGPASSWORD"] = str(old_env_pgpassword)
+         if (status == 0):
+             self.add_copy_spec(dest_file)
+         else:
++            self.soslog.error(
++                "Unable to execute pg_dump. Error(%s)" % (output)
++            )
+             self.add_alert(
+                 "ERROR: Unable to execute pg_dump.  Error(%s)" % (output)
+             )
+@@ -47,14 +50,30 @@ class PostgreSQL(Plugin):
+                 self.tmp_dir = tempfile.mkdtemp()
+                 self.pg_dump()
+             else:
++                self.soslog.warning(
++                    "password must be supplied to dump a database."
++                )
+                 self.add_alert(
+                     "WARN: password must be supplied to dump a database."
+                 )
++        else:
++            self.soslog.warning(
++                "dbname must be supplied to dump a database."
++            )
++            self.add_alert(
++                "WARN: dbname must be supplied to dump a database."
++            )
+ 
+     def postproc(self):
+         import shutil
+         if self.tmp_dir:
+-            shutil.rmtree(self.tmp_dir)
++            try:
++                shutil.rmtree(self.tmp_dir)
++            except shutil.Error:
++                self.soslog.exception(
++                    "Unable to remove %s." % (self.tmp_dir)
++                )
++                self.add_alert("ERROR: Unable to remove %s." % (self.tmp_dir))
+ 
+ 
+ class RedHatPostgreSQL(PostgreSQL, RedHatPlugin):
+-- 
+1.7.11.7
+
diff --git a/0013-postgresql-added-license-and-copyright.patch b/0013-postgresql-added-license-and-copyright.patch
new file mode 100644
index 0000000..7e2a475
--- /dev/null
+++ b/0013-postgresql-added-license-and-copyright.patch
@@ -0,0 +1,41 @@
+From b2cc567aa3c6671de9992375032dedeec9d2d4bd Mon Sep 17 00:00:00 2001
+From: Sandro Bonazzola <sbonazzo at redhat.com>
+Date: Tue, 4 Feb 2014 15:18:24 +0000
+Subject: [PATCH 13/61] postgresql: added license and copyright
+
+Signed-off-by: Sandro Bonazzola <sbonazzo at redhat.com>
+Signed-off-by: Bryn M. Reeves <bmr at redhat.com>
+---
+ sos/plugins/postgresql.py | 19 +++++++++++++++++++
+ 1 file changed, 19 insertions(+)
+
+diff --git a/sos/plugins/postgresql.py b/sos/plugins/postgresql.py
+index 0aa67a1..df14f86 100644
+--- a/sos/plugins/postgresql.py
++++ b/sos/plugins/postgresql.py
+@@ -1,3 +1,22 @@
++## Copyright (C) 2014 Red Hat, Inc., Sandro Bonazzola <sbonazzo at redhat.com>
++## Copyright (C) 2013 Chris J Arges <chris.j.arges at canonical.com>
++## Copyright (C) 2012-2013 Red Hat, Inc., Bryn M. Reeves <bmr at redhat.com>
++## Copyright (C) 2011 Red Hat, Inc., Jesse Jaggars <jjaggars at redhat.com>
++
++### This program is free software; you can redistribute it and/or modify
++## it under the terms of the GNU General Public License as published by
++## the Free Software Foundation; either version 2 of the License, or
++## (at your option) any later version.
++
++## 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, write to the Free Software
++## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++
+ import os
+ import tempfile
+ 
+-- 
+1.7.11.7
+
diff --git a/0014-postgresql-allow-use-TCP-socket.patch b/0014-postgresql-allow-use-TCP-socket.patch
new file mode 100644
index 0000000..ae36e48
--- /dev/null
+++ b/0014-postgresql-allow-use-TCP-socket.patch
@@ -0,0 +1,56 @@
+From cfef4d7ee758bffe6242c0d342261300a0e8194c Mon Sep 17 00:00:00 2001
+From: Sandro Bonazzola <sbonazzo at redhat.com>
+Date: Tue, 4 Feb 2014 15:19:19 +0000
+Subject: [PATCH 14/61] postgresql: allow use TCP socket
+
+allow to use TCP socket and not only UNIX socket
+for connecting to postgresql database
+
+Signed-off-by: Sandro Bonazzola <sbonazzo at redhat.com>
+Signed-off-by: Bryn M. Reeves <bmr at redhat.com>
+---
+ sos/plugins/postgresql.py | 20 +++++++++++++++-----
+ 1 file changed, 15 insertions(+), 5 deletions(-)
+
+diff --git a/sos/plugins/postgresql.py b/sos/plugins/postgresql.py
+index df14f86..cc51195 100644
+--- a/sos/plugins/postgresql.py
++++ b/sos/plugins/postgresql.py
+@@ -38,19 +38,29 @@ class PostgreSQL(Plugin):
+         ('username', 'username for pg_dump', '', 'postgres'),
+         ('password', 'password for pg_dump', '', ''),
+         ('dbname', 'database name to dump for pg_dump', '', ''),
++        ('dbhost', 'database hostname/IP (do not use unix socket)', '', ''),
++        ('dbport', 'database server port number', '', '5432')
+     ]
+ 
+     def pg_dump(self):
+         dest_file = os.path.join(self.tmp_dir, "sos_pgdump.tar")
+         old_env_pgpassword = os.environ.get("PGPASSWORD")
+         os.environ["PGPASSWORD"] = self.get_option("password")
+-        (status, output, rtime) = self.call_ext_prog(
+-            "pg_dump %s -U %s -w -f %s -F t" % (
+-                self.get_option("dbname"),
++        if self.get_option("dbhost"):
++            cmd = "pg_dump -U %s -h %s -p %s -w -f %s -F t %s" % (
+                 self.get_option("username"),
+-                dest_file
++                self.get_option("dbhost"),
++                self.get_option("dbport"),
++                dest_file,
++                self.get_option("dbname")
+             )
+-        )
++        else:
++            cmd = "pg_dump -C -U %s -w -f %s -F t %s " % (
++                self.get_option("username"),
++                dest_file,
++                self.get_option("dbname")
++            )
++        (status, output, rtime) = self.call_ext_prog(cmd)
+         if old_env_pgpassword is not None:
+             os.environ["PGPASSWORD"] = str(old_env_pgpassword)
+         if (status == 0):
+-- 
+1.7.11.7
+
diff --git a/0015-Pass-no-archive-to-rhsm-debug-script.patch b/0015-Pass-no-archive-to-rhsm-debug-script.patch
new file mode 100644
index 0000000..9af36c7
--- /dev/null
+++ b/0015-Pass-no-archive-to-rhsm-debug-script.patch
@@ -0,0 +1,31 @@
+From f57c793a07e86c1659b2f5c6b49b93f5007c139c Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr at redhat.com>
+Date: Tue, 4 Feb 2014 15:43:56 +0000
+Subject: [PATCH 15/61] Pass --no-archive to rhsm-debug script
+
+Versions of subscription-manager since 1.10.11-2.el7 support the
+--no-archive option to disable creation of a zip archive. Pass
+this to the script to have the output stored in a directory in
+the archive.
+
+Signed-off-by: Bryn M. Reeves <bmr at redhat.com>
+---
+ sos/plugins/yum.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/sos/plugins/yum.py b/sos/plugins/yum.py
+index a9ae4e4..81788f1 100644
+--- a/sos/plugins/yum.py
++++ b/sos/plugins/yum.py
+@@ -48,7 +48,7 @@ class Yum(Plugin, RedHatPlugin):
+             "/var/log/rhsm/rhsmcertd.log"])
+         self.add_cmd_output("subscription-manager list --installed")
+         self.add_cmd_output("subscription-manager list --consumed")
+-        self.add_cmd_output("rhsm-debug system --destination %s"
++        self.add_cmd_output("rhsm-debug system --no-archive --destination %s"
+                 % self.get_cmd_dir())
+ 
+         if self.get_option("yumlist"):
+-- 
+1.7.11.7
+
diff --git a/0016-Ensure-unused-fds-are-closed-when-calling-subprocess.patch b/0016-Ensure-unused-fds-are-closed-when-calling-subprocess.patch
new file mode 100644
index 0000000..51ba6ef
--- /dev/null
+++ b/0016-Ensure-unused-fds-are-closed-when-calling-subprocess.patch
@@ -0,0 +1,81 @@
+From a96a5e8397b465f556c5a10274a4c7248e737fbf Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr at redhat.com>
+Date: Tue, 4 Feb 2014 11:37:15 +0000
+Subject: [PATCH 16/61] Ensure unused fds are closed when calling subprocesses
+ via Popen
+
+When sos communicates with a child process using Popen all IO
+takes place on stdin/stdout/stderr (or a subset). No other open
+file descriptors should be inherited by the child.
+
+Make all calls to Popen set close_fds=True.
+
+Signed-off-by: Bryn M. Reeves <bmr at redhat.com>
+---
+ sos/archive.py         | 6 +++++-
+ sos/plugins/emc.py     | 3 ++-
+ sos/policies/redhat.py | 3 ++-
+ sos/utilities.py       | 2 +-
+ 4 files changed, 10 insertions(+), 4 deletions(-)
+
+diff --git a/sos/archive.py b/sos/archive.py
+index f1d4d1f..9e6029b 100644
+--- a/sos/archive.py
++++ b/sos/archive.py
+@@ -252,7 +252,11 @@ class TarFileArchive(FileCacheArchive):
+                 cmd = "%s -1" % cmd
+             try:
+                 command = shlex.split("%s %s" % (cmd, self.name()))
+-                p = Popen(command, stdout=PIPE, stderr=PIPE, bufsize=-1)
++                p = Popen(command,
++                          stdout=PIPE,
++                          stderr=PIPE,
++                          bufsize=-1,
++                          close_fds=True)
+                 stdout, stderr = p.communicate()
+                 if stdout:
+                     log.info(stdout.decode('utf-8'))
+diff --git a/sos/plugins/emc.py b/sos/plugins/emc.py
+index 6eac7d0..5a2495e 100644
+--- a/sos/plugins/emc.py
++++ b/sos/plugins/emc.py
+@@ -196,7 +196,8 @@ class Emc(Plugin, RedHatPlugin):
+             while CLARiiON_IP_loop == "stay_in":
+                 ans = raw_input("CLARiiON SP IP Address or [Enter] to exit: ")
+                 ## Check to make sure the CLARiiON SP IP address provided is valid
+-                p = Popen("navicli -h %s getsptime" % (ans,), shell=True, stdout=PIPE, stderr=PIPE)
++                p = Popen("navicli -h %s getsptime" % (ans,),
++                            shell=True, stdout=PIPE, stderr=PIPE, close_fds=True)
+                 out, err = p.communicate()
+                 if p.returncode == 0:
+                     CLARiiON_IP_address_list.append(ans)
+diff --git a/sos/policies/redhat.py b/sos/policies/redhat.py
+index 5b3a446..4e5b363 100644
+--- a/sos/policies/redhat.py
++++ b/sos/policies/redhat.py
+@@ -68,7 +68,8 @@ class RedHatPolicy(LinuxPolicy):
+                   shell=True,
+                   stdout=PIPE,
+                   stderr=PIPE,
+-                  bufsize=-1)
++                  bufsize=-1,
++                  close_fds=True)
+         out, err = p.communicate()
+         if err:
+             return ret
+diff --git a/sos/utilities.py b/sos/utilities.py
+index 7a8674a..a9aca74 100644
+--- a/sos/utilities.py
++++ b/sos/utilities.py
+@@ -159,7 +159,7 @@ def sos_get_command_output(command, timeout=300):
+ 
+         p = Popen(command, shell=True,
+                 stdout=PIPE, stderr=STDOUT,
+-                bufsize=-1, env = cmd_env)
++                bufsize=-1, env = cmd_env, close_fds = True)
+         stdout, stderr = p.communicate()
+         return (p.returncode, stdout.decode('utf-8'), 0)
+     else:
+-- 
+1.7.11.7
+
diff --git a/0017-Fix-gluster-volume-name-extraction.patch b/0017-Fix-gluster-volume-name-extraction.patch
new file mode 100644
index 0000000..03ffb97
--- /dev/null
+++ b/0017-Fix-gluster-volume-name-extraction.patch
@@ -0,0 +1,31 @@
+From aa0a14db011c59116beb51413ee9a0b253e04f1a Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr at redhat.com>
+Date: Mon, 10 Feb 2014 15:07:36 +0000
+Subject: [PATCH 17/61] Fix gluster volume name extraction
+
+The get_volume_names() function in the gluster plugin tries to
+extract volume names from the output of the "gluster volume info"
+command using a slice range. The range start should be 12 to
+account for the "Volume Name:" label at the start of the line.
+
+Signed-off-by: Bryn M. Reeves <bmr at redhat.com>
+---
+ sos/plugins/gluster.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/sos/plugins/gluster.py b/sos/plugins/gluster.py
+index 02dbac3..4286b59 100644
+--- a/sos/plugins/gluster.py
++++ b/sos/plugins/gluster.py
+@@ -39,7 +39,7 @@ class Gluster(Plugin, RedHatPlugin):
+         for line in fp.readlines():
+             if not line.startswith("Volume Name:"):
+                 continue
+-            volname = line[14:-1]
++            volname = line[12:-1]
+             out.append(volname)
+         fp.close()
+         return out
+-- 
+1.7.11.7
+
diff --git a/0018-Add-distupgrade-plugin.patch b/0018-Add-distupgrade-plugin.patch
new file mode 100644
index 0000000..e731d0f
--- /dev/null
+++ b/0018-Add-distupgrade-plugin.patch
@@ -0,0 +1,65 @@
+From 7f6d34d154b9fe110c168a5b44083d8e35bb2068 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr at redhat.com>
+Date: Mon, 10 Feb 2014 15:27:24 +0000
+Subject: [PATCH 18/61] Add distupgrade plugin
+
+Add a new plugin to collect data relating to completed or
+attempted distribution upgrades. Currently supports the Red Hat
+set of tools and files but other distributions can supply their
+own filelists or override setup() to perform other distribution
+specific actions.
+
+Signed-off-by: Bryn M. Reeves <bmr at redhat.com>
+---
+ sos/plugins/distupgrade.py | 39 +++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 39 insertions(+)
+ create mode 100644 sos/plugins/distupgrade.py
+
+diff --git a/sos/plugins/distupgrade.py b/sos/plugins/distupgrade.py
+new file mode 100644
+index 0000000..b45d099
+--- /dev/null
++++ b/sos/plugins/distupgrade.py
+@@ -0,0 +1,39 @@
++## Copyright (C) 2014 Red Hat, Inc., Bryn M. Reeves <bmr at redhat.com>
++
++### This program is free software; you can redistribute it and/or modify
++## it under the terms of the GNU General Public License as published by
++## the Free Software Foundation; either version 2 of the License, or
++## (at your option) any later version.
++
++## 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, write to the Free Software
++## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++
++import os
++from sos.plugins import Plugin, RedHatPlugin
++
++class DistUpgrade(Plugin):
++    """ Distribution upgrade data """
++
++    plugin_name = "distupgrade"
++
++    files = None
++
++    def setup(self):
++        self.add_copy_specs(list(self.files))
++
++class RedHatDistUpgrade(DistUpgrade, RedHatPlugin):
++
++    files = (
++        "/var/log/upgrade.log",
++        "/var/log/redhat_update_tool.log",
++        "/root/preupgrade/all-xccdf*",
++        "/root/preupgrade/kickstart"
++    )
++
++
+-- 
+1.7.11.7
+
diff --git a/0019-Fix-command-output-substitution-exception.patch b/0019-Fix-command-output-substitution-exception.patch
new file mode 100644
index 0000000..42ff946
--- /dev/null
+++ b/0019-Fix-command-output-substitution-exception.patch
@@ -0,0 +1,49 @@
+From c48b762c2e98ee05a17375af7427af702f9c9925 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr at redhat.com>
+Date: Tue, 11 Feb 2014 16:53:16 +0000
+Subject: [PATCH 19/61] Fix command output substitution exception
+
+If a comand has a substitution registered via do_cmd_output_sub()
+but no data was collected (e.g. command not found) the postproc
+code will throw an exception as the return value ('replacements')
+is never assigned.
+
+Initialise replacements to None before scanning the list of run
+commands and return this if no substitutions were made.
+
+Signed-off-by: Bryn M. Reeves <bmr at redhat.com>
+---
+ sos/plugins/__init__.py | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+diff --git a/sos/plugins/__init__.py b/sos/plugins/__init__.py
+index 7130c7a..9b643ab 100644
+--- a/sos/plugins/__init__.py
++++ b/sos/plugins/__init__.py
+@@ -181,6 +181,7 @@ class Plugin(object):
+         if not self.executed_commands:
+             return 0
+ 
++        replacements = None
+         try:
+             for called in self.executed_commands:
+                 # was anything collected?
+@@ -194,12 +195,12 @@ class Plugin(object):
+                             regexp, subst, readable.read())
+                     if replacements:
+                         self.archive.add_string(result, path)
+-                    else:
+-                        replacements = 0
++
+         except Exception as e:
+             msg = 'regex substitution failed for %s in plugin %s with: "%s"'
+             self.soslog.error(msg % (called['exe'], self.name(), e))
+-            replacements = 0
++            replacements = None
++
+         if self.commons['cmdlineopts'].profiler:
+             time_passed = time() - start_time
+             self.proflog.debug("subst: %-75s time: %f"
+-- 
+1.7.11.7
+
diff --git a/0020-Improve-error-message-when-cluster.crm_from-is-inval.patch b/0020-Improve-error-message-when-cluster.crm_from-is-inval.patch
new file mode 100644
index 0000000..66474ff
--- /dev/null
+++ b/0020-Improve-error-message-when-cluster.crm_from-is-inval.patch
@@ -0,0 +1,38 @@
+From 61e8147e436533c5ccb75a6061a4fcc7368970b6 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr at redhat.com>
+Date: Tue, 11 Feb 2014 16:56:37 +0000
+Subject: [PATCH 20/61] Improve error message when cluster.crm_from is invalid
+
+If a user passes a non-date string value as the crm_from parameter
+of the cluster plugin an error message is logged:
+
+  crm_from parameter 'True' is not a valid date
+
+The plugin continues to run and uses the default value (T-72hrs)
+as the value of crm_from. Make this clear in the message displayed
+to users:
+
+  crm_from parameter 'True' is not a valid date: using default
+
+Signed-off-by: Bryn M. Reeves <bmr at redhat.com>
+---
+ sos/plugins/cluster.py | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/sos/plugins/cluster.py b/sos/plugins/cluster.py
+index eeacdab..8d73dc1 100644
+--- a/sos/plugins/cluster.py
++++ b/sos/plugins/cluster.py
+@@ -93,7 +93,8 @@ class Cluster(Plugin, RedHatPlugin):
+                         str(self.get_option('crm_from'))):
+                 crm_from = self.get_option('crm_from')
+             else:
+-                self.soslog.error("crm_from parameter '%s' is not a valid date"
++                self.soslog.error(
++                    "crm_from parameter '%s' is not a valid date: using default"
+                             % self.get_option('crm_from'))
+ 
+         crm_dest = os.path.join(self.get_cmd_dir(), 'crm_report')
+-- 
+1.7.11.7
+
diff --git a/0021-Remove-useless-check_enabled-from-sar-plugin.patch b/0021-Remove-useless-check_enabled-from-sar-plugin.patch
new file mode 100644
index 0000000..8d9749a
--- /dev/null
+++ b/0021-Remove-useless-check_enabled-from-sar-plugin.patch
@@ -0,0 +1,38 @@
+From 2591ac0719c256af3ed3b392f5bc5972ed3a1104 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr at redhat.com>
+Date: Fri, 14 Feb 2014 16:54:15 +0000
+Subject: [PATCH 21/61] Remove useless check_enabled() from sar plugin
+
+The sar plugin implemented a check_enabled() to catch cases where
+the plugin is force-enabled on a system with no sar installation.
+
+This is better handled by runtime checking in setup() which the
+plugin also does. Kill the check and its annoying error message.
+
+Signed-off-by: Bryn M. Reeves <bmr at redhat.com>
+---
+ sos/plugins/sar.py | 8 --------
+ 1 file changed, 8 deletions(-)
+
+diff --git a/sos/plugins/sar.py b/sos/plugins/sar.py
+index 1086208..cf53d5b 100644
+--- a/sos/plugins/sar.py
++++ b/sos/plugins/sar.py
+@@ -28,14 +28,6 @@ class Sar(Plugin,):
+     # size-limit SAR data collected by default (MB)
+     sa_size = 20
+ 
+-    def check_enabled(self):
+-        # check to see if we are force-enabled with no sar installation
+-        if not os.path.exists(self.sa_path) or not os.path.isdir(self.sa_path):
+-            self.soslog.info("sar directory %s does not exist" % self.sa_path
+-                            + " or is not a directory")
+-            return False
+-        return True
+-
+     def setup(self):
+         if self.get_option("all_sar"):
+             self.sa_size = 0
+-- 
+1.7.11.7
+
diff --git a/0022-Eliminate-hard-coded-var-log-sa-paths-in-sar-plugin.patch b/0022-Eliminate-hard-coded-var-log-sa-paths-in-sar-plugin.patch
new file mode 100644
index 0000000..816db87
--- /dev/null
+++ b/0022-Eliminate-hard-coded-var-log-sa-paths-in-sar-plugin.patch
@@ -0,0 +1,40 @@
+From 80e251f4c30d9f8263c472e07d18a4b0b21ebf4e Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr at redhat.com>
+Date: Fri, 14 Feb 2014 17:20:25 +0000
+Subject: [PATCH 22/61] Eliminate hard-coded /var/log/sa paths in sar plugin
+
+The Sar plugin classes define a self.sa_path - use it consistently
+throughout the plugin when generating strings containing the path.
+
+Suggested by David Kutalek.
+
+Signed-off-by: Bryn M. Reeves <bmr at redhat.com>
+---
+ sos/plugins/sar.py | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/sos/plugins/sar.py b/sos/plugins/sar.py
+index cf53d5b..470d82f 100644
+--- a/sos/plugins/sar.py
++++ b/sos/plugins/sar.py
+@@ -32,14 +32,14 @@ class Sar(Plugin,):
+         if self.get_option("all_sar"):
+             self.sa_size = 0
+ 
+-        self.add_copy_spec_limit("/var/log/sa/sar[0-9]*",
++        self.add_copy_spec_limit("%s/sar[0-9]*" % self.sa_path,
+                                  sizelimit = self.sa_size)
+-        self.add_copy_spec_limit("/var/log/sa/sa[0-9]*",
++        self.add_copy_spec_limit("%s/sa[0-9]*" % self.sa_path,
+                               sizelimit = self.sa_size)
+         try:
+             dirList = os.listdir(self.sa_path)
+         except:
+-            self.soslog.warning("sar: could not list /var/log/sa")
++            self.soslog.warning("sar: could not list %s" % self.sa_path)
+             return
+         # find all the sa file that don't have an existing sar file
+         for fname in dirList:
+-- 
+1.7.11.7
+
diff --git a/0023-Scrub-ldap_default_authtok-password-in-sssd-plugin.patch b/0023-Scrub-ldap_default_authtok-password-in-sssd-plugin.patch
new file mode 100644
index 0000000..e9a917b
--- /dev/null
+++ b/0023-Scrub-ldap_default_authtok-password-in-sssd-plugin.patch
@@ -0,0 +1,38 @@
+From fec14d2d9e0114e959d9626ca1457cd578c1d029 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr at redhat.com>
+Date: Fri, 14 Feb 2014 20:12:14 +0000
+Subject: [PATCH 23/61] Scrub ldap_default_authtok password in sssd plugin
+
+The file sssd.conf collected by the sssd plugin may contain an
+ldap password. Add a postproc() method to replace the string with
+blanks.
+
+Signed-off-by: Bryn M. Reeeves <bmr at redhat.com>
+---
+ sos/plugins/sssd.py | 10 +++++++++-
+ 1 file changed, 9 insertions(+), 1 deletion(-)
+
+diff --git a/sos/plugins/sssd.py b/sos/plugins/sssd.py
+index b28f4b4..0d201f4 100644
+--- a/sos/plugins/sssd.py
++++ b/sos/plugins/sssd.py
+@@ -24,7 +24,15 @@ class Sssd(Plugin):
+     packages = ('sssd',)
+ 
+     def setup(self):
+-        self.add_copy_specs(["/etc/sssd", "/var/log/sssd/*"])
++        self.add_copy_specs([
++            "/etc/sssd/sssd.conf",
++            "/var/log/sssd/*"
++        ])
++
++    def postproc(self):
++        self.do_file_sub("/etc/sssd/sssd.conf",
++                    r"(\s*ldap_default_authtok\s*=\s*)\S+",
++                    r"\1********")
+ 
+ class RedHatSssd(Sssd, RedHatPlugin):
+     """sssd-related Diagnostic Information on Red Hat based distributions
+-- 
+1.7.11.7
+
diff --git a/0024-Replace-package-check-with-file-check-in-anacron.patch b/0024-Replace-package-check-with-file-check-in-anacron.patch
new file mode 100644
index 0000000..687b243
--- /dev/null
+++ b/0024-Replace-package-check-with-file-check-in-anacron.patch
@@ -0,0 +1,33 @@
+From 3dac227dde7af1168fa3c668836d7dde711981bd Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr at redhat.com>
+Date: Mon, 3 Mar 2014 13:56:23 +0000
+Subject: [PATCH 24/61] Replace package check with file check in anacron
+
+The anacron facility may be provided by packages named 'anacron',
+'chronie-anacron' etc. They all use a common /etc/anacrontab file
+so check for this instead.
+
+Signed-off-by: Bryn M. Reeves <bmr at redhat.com>
+---
+ sos/plugins/anacron.py | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+diff --git a/sos/plugins/anacron.py b/sos/plugins/anacron.py
+index a60c85e..e9595a8 100644
+--- a/sos/plugins/anacron.py
++++ b/sos/plugins/anacron.py
+@@ -21,7 +21,9 @@ class Anacron(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
+     
+     plugin_name = 'anacron'
+ 
+-    packages = ('anacron',)
++    # anacron may be provided by anacron, cronie-anacron etc.
++    # just look for the configuration file which is common
++    files = ('/etc/anacrontab',)
+ 
+     def setup(self):
+-        self.add_copy_spec("/etc/anacrontab")
++        self.add_copy_specs(list(self.files))
+-- 
+1.7.11.7
+
diff --git a/0025-Remove-the-rhevm-plugin.patch b/0025-Remove-the-rhevm-plugin.patch
new file mode 100644
index 0000000..c049307
--- /dev/null
+++ b/0025-Remove-the-rhevm-plugin.patch
@@ -0,0 +1,51 @@
+From 3758b10e367117945148c797b4b709d77277b84b Mon Sep 17 00:00:00 2001
+From: Lee Yarwood <lyarwood at redhat.com>
+Date: Tue, 4 Mar 2014 16:18:00 +0000
+Subject: [PATCH 25/61] Remove the rhevm plugin.
+
+This functionality is now provided by the ovirt-log-collector project [1] and independently shipped
+VDSM sos plugin [2].
+
+[1] http://gerrit.ovirt.org/gitweb?p=ovirt-log-collector.git
+[2] http://gerrit.ovirt.org/gitweb?p=vdsm.git;a=tree;f=vdsm/sos;hb=HEAD
+
+Signed-off-by: Lee Yarwood <lyarwood at redhat.com>
+---
+ sos/plugins/rhevm.py | 25 -------------------------
+ 1 file changed, 25 deletions(-)
+ delete mode 100644 sos/plugins/rhevm.py
+
+diff --git a/sos/plugins/rhevm.py b/sos/plugins/rhevm.py
+deleted file mode 100644
+index 8068e05..0000000
+--- a/sos/plugins/rhevm.py
++++ /dev/null
+@@ -1,25 +0,0 @@
+-from sos.plugins import Plugin, RedHatPlugin
+-
+-# Class name must be the same as file name and method names must not change
+-class RhevM(Plugin, RedHatPlugin):
+-    """RHEV-Manager related information"""
+-
+-    plugin_name = 'rhevm'
+-
+-    option_list = [("vdsmlogs",  'Directory containing all of the SOS logs from the RHEV hypervisor(s)', '', False)]
+-
+-    def setup(self):
+-        # Copy rhevm config files.
+-        self.add_copy_spec("/etc/rhevm")
+-        self.add_copy_spec("/var/log/rhevm")
+-        if self.get_option("vdsmlogs"):
+-            self.add_copy_spec(str(self.get_option("vdsmlogs")))
+-
+-    def postproc(self):
+-        """
+-        Obfuscate passwords.
+-        """
+-
+-        self.do_file_sub("/etc/rhevm/rhevm-config/rhevm-config.properties",
+-                        r"Password.type=(.*)",
+-                        r'Password.type=********')
+-- 
+1.7.11.7
+
diff --git a/0026-powerpc-Move-VPD-related-tool-under-common-code.patch b/0026-powerpc-Move-VPD-related-tool-under-common-code.patch
new file mode 100644
index 0000000..a0efa0a
--- /dev/null
+++ b/0026-powerpc-Move-VPD-related-tool-under-common-code.patch
@@ -0,0 +1,45 @@
+From 6fb9d5df14b3b0e21db458fd5fcd10691bb9fd0e Mon Sep 17 00:00:00 2001
+From: Vasant Hegde <hegdevasant at linux.vnet.ibm.com>
+Date: Tue, 11 Mar 2014 11:07:51 +0000
+Subject: [PATCH 26/61] powerpc: Move VPD related tool under common code
+
+VPD related tools (lsvpd, lscfg, lsmcode) is supported on both
+pSeries and PowerNV platform. Hence moving these commands under
+common code.
+
+Also added support to grab vpd database (/var/lib/lsvpd).
+
+Signed-off-by: Vasant Hegde <hegdevasant at linux.vnet.ibm.com>
+---
+ sos/plugins/powerpc.py |    7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+---
+ sos/plugins/powerpc.py | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+diff --git a/sos/plugins/powerpc.py b/sos/plugins/powerpc.py
+index dfaacb9..8fd6b4f 100644
+--- a/sos/plugins/powerpc.py
++++ b/sos/plugins/powerpc.py
+@@ -52,14 +52,15 @@ class PowerPC(Plugin, RedHatPlugin, UbuntuPlugin, DebianPlugin):
+             self.add_cmd_output("ppc64_cpu --run-mode")
+             self.add_cmd_output("ppc64_cpu --frequency")
+             self.add_cmd_output("ppc64_cpu --dscr")
++            self.add_cmd_output("lscfg -vp")
++            self.add_cmd_output("lsmcode -A")
++            self.add_cmd_output("lsvpd --debug")
++            self.add_copy_spec("/var/lib/lsvpd/")
+ 
+         if ispSeries:
+             self.add_copy_spec("/proc/ppc64/lparcfg")
+             self.add_copy_spec("/proc/ppc64/eeh")
+             self.add_copy_spec("/proc/ppc64/systemcfg")
+-            self.add_cmd_output("lscfg -vp")
+-            self.add_cmd_output("lsmcode -A")
+-            self.add_cmd_output("lsvpd --debug")
+             self.add_cmd_output("lsvio -des")
+             self.add_cmd_output("servicelog --dump")
+             self.add_cmd_output("servicelog_notify --list")
+-- 
+1.7.11.7
+
diff --git a/0027-Add-PowerNV-specific-debug-data.patch b/0027-Add-PowerNV-specific-debug-data.patch
new file mode 100644
index 0000000..ef5ef48
--- /dev/null
+++ b/0027-Add-PowerNV-specific-debug-data.patch
@@ -0,0 +1,33 @@
+From a66d4fccfe093dfa29dfaa4808f361bc7063c742 Mon Sep 17 00:00:00 2001
+From: Vasant Hegde <hegdevasant at linux.vnet.ibm.com>
+Date: Tue, 11 Mar 2014 12:18:26 +0000
+Subject: [PATCH 27/61] Add PowerNV specific debug data
+
+This patch adds support to collect more debug files on
+PowerNV platform.
+
+Signed-off-by: Vasant Hegde <hegdevasant linux vnet ibm com>
+Signed-off-by: Bryn M. Reeves <bmr at redhat.com>
+---
+ sos/plugins/powerpc.py |    5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+---
+ sos/plugins/powerpc.py | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/sos/plugins/powerpc.py b/sos/plugins/powerpc.py
+index 8fd6b4f..9681094 100644
+--- a/sos/plugins/powerpc.py
++++ b/sos/plugins/powerpc.py
+@@ -72,4 +72,7 @@ class PowerPC(Plugin, RedHatPlugin, UbuntuPlugin, DebianPlugin):
+ 
+         if isPowerNV:
+             self.add_copy_spec("/proc/ppc64/")
+-            
++            self.add_copy_spec("/sys/kernel/debug/powerpc/")
++            if os.path.isdir("/var/log/dump"):
++                self.add_cmd_output("ls -l /var/log/dump")
++
+-- 
+1.7.11.7
+
diff --git a/0028-Fix-remaining-use-of-obsolete-get_cmd_dir-in-plugins.patch b/0028-Fix-remaining-use-of-obsolete-get_cmd_dir-in-plugins.patch
new file mode 100644
index 0000000..9c7ae57
--- /dev/null
+++ b/0028-Fix-remaining-use-of-obsolete-get_cmd_dir-in-plugins.patch
@@ -0,0 +1,44 @@
+From 877f93bcd469b939ec044539b9ea4a0d33e9f177 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr at redhat.com>
+Date: Tue, 11 Mar 2014 15:27:31 +0000
+Subject: [PATCH 28/61] Fix remaining use of obsolete 'get_cmd_dir()' in
+ plugins
+
+The get_cmd_dir() method was renamed to get_cmd_path(). Fix the
+two remaining uses in yum and cluster plugins.
+
+Signed-off-by: Bryn M. Reeves <bmr at redhat.com>
+---
+ sos/plugins/cluster.py | 2 +-
+ sos/plugins/yum.py     | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/sos/plugins/cluster.py b/sos/plugins/cluster.py
+index 8d73dc1..7957498 100644
+--- a/sos/plugins/cluster.py
++++ b/sos/plugins/cluster.py
+@@ -97,7 +97,7 @@ class Cluster(Plugin, RedHatPlugin):
+                     "crm_from parameter '%s' is not a valid date: using default"
+                             % self.get_option('crm_from'))
+ 
+-        crm_dest = os.path.join(self.get_cmd_dir(), 'crm_report')
++        crm_dest = os.path.join(self.get_cmd_path(), 'crm_report')
+         self.add_cmd_output('crm_report -S -d --dest %s --from "%s"'
+                     % (crm_dest, crm_from))
+ 
+diff --git a/sos/plugins/yum.py b/sos/plugins/yum.py
+index 81788f1..aa8cb18 100644
+--- a/sos/plugins/yum.py
++++ b/sos/plugins/yum.py
+@@ -49,7 +49,7 @@ class Yum(Plugin, RedHatPlugin):
+         self.add_cmd_output("subscription-manager list --installed")
+         self.add_cmd_output("subscription-manager list --consumed")
+         self.add_cmd_output("rhsm-debug system --no-archive --destination %s"
+-                % self.get_cmd_dir())
++                % self.get_cmd_path())
+ 
+         if self.get_option("yumlist"):
+             # List various information about available packages
+-- 
+1.7.11.7
+
diff --git a/0029-Update-systemd-support.patch b/0029-Update-systemd-support.patch
new file mode 100644
index 0000000..1a56ea1
--- /dev/null
+++ b/0029-Update-systemd-support.patch
@@ -0,0 +1,35 @@
+From 7146472eb85bb4ea39a244ca252e66478b3e30dd Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr at redhat.com>
+Date: Wed, 12 Mar 2014 13:02:39 +0000
+Subject: [PATCH 29/61] Update systemd support
+
+- Drop support for 'systemctl dump' as this no longer exists.
+- Add 'systemctl list-units' for convenience
+- add systemctl show-environment
+
+Signed-off-by: Bryn M. Reeves <bmr at redhat.com>
+---
+ sos/plugins/systemd.py | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/sos/plugins/systemd.py b/sos/plugins/systemd.py
+index 915c8fc..38be63e 100644
+--- a/sos/plugins/systemd.py
++++ b/sos/plugins/systemd.py
+@@ -27,10 +27,11 @@ class Systemd(Plugin, RedHatPlugin):
+ 
+     def setup(self):
+         self.add_cmd_output("systemctl show --all")
++        self.add_cmd_output("systemctl list-units")
+         self.add_cmd_output("systemctl list-units --failed")
+-        self.add_cmd_output("systemctl list-unit-files")
+         self.add_cmd_output("systemctl list-units --all")
+-        self.add_cmd_output("systemctl dump")
++        self.add_cmd_output("systemctl list-unit-files")
++        self.add_cmd_output("systemctl show-environment")
+         self.add_cmd_output("systemd-delta")
+         self.add_cmd_output("journalctl --verify")
+         self.add_cmd_output("journalctl --all --this-boot --no-pager")
+-- 
+1.7.11.7
+
diff --git a/0030-Add-tuned-plugin.patch b/0030-Add-tuned-plugin.patch
new file mode 100644
index 0000000..7939fa8
--- /dev/null
+++ b/0030-Add-tuned-plugin.patch
@@ -0,0 +1,53 @@
+From c55c58cf2dabf93c924c839c8ed045c18e31ba1c Mon Sep 17 00:00:00 2001
+From: Peter Portante <peter.portante at redhat.com>
+Date: Wed, 29 Jan 2014 21:50:27 -0500
+Subject: [PATCH 30/61] Add tuned plugin
+
+Resolves Issue #232.
+
+Signed-off-by: Peter Portante <peter.portante at redhat.com>
+Signed-off-by: Bryn M. Reeves <bmr at redhat.com>
+---
+ sos/plugins/tuned.py | 30 ++++++++++++++++++++++++++++++
+ 1 file changed, 30 insertions(+)
+ create mode 100644 sos/plugins/tuned.py
+
+diff --git a/sos/plugins/tuned.py b/sos/plugins/tuned.py
+new file mode 100644
+index 0000000..60c22bc
+--- /dev/null
++++ b/sos/plugins/tuned.py
+@@ -0,0 +1,30 @@
++## Copyright (C) 2014 Red Hat, Inc., Peter Portante <peter.portante at redhat.com>
++
++### This program is free software; you can redistribute it and/or modify
++## it under the terms of the GNU General Public License as published by
++## the Free Software Foundation; either version 2 of the License, or
++## (at your option) any later version.
++
++## 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, write to the Free Software
++## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++
++from sos.plugins import Plugin, RedHatPlugin
++
++class Tuned(Plugin, RedHatPlugin):
++    """Tuned related information
++    """
++    packages = ('tuned',)
++    plugin_name = 'tuned'
++
++    def setup(self):
++        self.add_cmd_output("tuned-adm list")
++        self.add_cmd_output("tuned-adm active")
++        self.add_cmd_output("tuned-adm recommend")
++        self.add_copy_spec("/var/log/tuned/tuned.log")
++
+-- 
+1.7.11.7
+
diff --git a/0031-Clean-up-get_cmd_path-make_cmd_path-make_cmd_dirs-me.patch b/0031-Clean-up-get_cmd_path-make_cmd_path-make_cmd_dirs-me.patch
new file mode 100644
index 0000000..07e4ef2
--- /dev/null
+++ b/0031-Clean-up-get_cmd_path-make_cmd_path-make_cmd_dirs-me.patch
@@ -0,0 +1,173 @@
+From ef4e4b60eeaef33fa5e4ee074c6736cd3412397b Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr at redhat.com>
+Date: Wed, 12 Mar 2014 16:27:34 +0000
+Subject: [PATCH 31/61] Clean up get_cmd_path/make_cmd_path/make_cmd_dirs mess
+
+Clean up the Plugin helper methods for handling command output
+paths. This better matches the proposal in Issue #181 and
+simplifies code for plugins that need to generate their own
+paths under sos_commands/<plugin>/.
+
+- Rename get_cmd_path() to get_cmd_output_path()
+- Add an optional 'name' parameter to specify a subdirectory
+  name in the plugin's sos_commands/<plugin>/ directory.
+- Default to creating directories if they do not exist
+
+Finally fix up all existing users of get_cmd_path() to use the
+new interface and remove handrolled uses of os.path.join(...) for
+generating these paths.
+
+Signed-off-by: Bryn M. Reeves <bmr at redhat.com>
+---
+ sos/plugins/__init__.py  | 26 +++++++++-----------------
+ sos/plugins/cluster.py   |  2 +-
+ sos/plugins/foreman.py   |  6 ++----
+ sos/plugins/katello.py   |  6 ++----
+ sos/plugins/lvm2.py      |  2 +-
+ sos/plugins/rhui.py      |  8 +-------
+ sos/plugins/satellite.py |  2 +-
+ sos/plugins/yum.py       |  2 +-
+ 8 files changed, 18 insertions(+), 36 deletions(-)
+
+diff --git a/sos/plugins/__init__.py b/sos/plugins/__init__.py
+index 9b643ab..efb6950 100644
+--- a/sos/plugins/__init__.py
++++ b/sos/plugins/__init__.py
+@@ -512,26 +512,18 @@ class Plugin(object):
+         """Run a program and collect the output"""
+         self.collect_cmds.append( (exe, suggest_filename, root_symlink, timeout) )
+ 
+-    def get_cmd_path(self):
++    def get_cmd_output_path(self, name=None, make=True):
+         """Return a path into which this module should store collected
+         command output
+         """
+-        return os.path.join(self.archive.get_tmp_dir(),
+-                            'sos_commands', self.name())
+-
+-    def make_cmd_path(self, path):
+-        """Return a string representing an absolute path within this
+-        plug-in's command output directory by apending the relative path
+-        name 'path'.
+-        """
+-        return os.path.join(self.get_cmd_path(), path)
+-        
+-
+-    def make_cmd_dirs(self, path):
+-        """Recursively create new subdirectories under this plug-in's
+-        command output path.
+-        """
+-        os.makedirs(self.make_cmd_path(path))
++        cmd_output_path = os.path.join(self.archive.get_tmp_dir(),
++                                        'sos_commands', self.name())
++        if name:
++            cmd_output_path = os.path.join(cmd_output_path, name)
++        if make:
++            os.makedirs(cmd_output_path)
++
++        return cmd_output_path
+ 
+     def file_grep(self, regexp, *fnames):
+         """Returns lines matched in fnames, where fnames can either be
+diff --git a/sos/plugins/cluster.py b/sos/plugins/cluster.py
+index 7957498..0b839fa 100644
+--- a/sos/plugins/cluster.py
++++ b/sos/plugins/cluster.py
+@@ -97,7 +97,7 @@ class Cluster(Plugin, RedHatPlugin):
+                     "crm_from parameter '%s' is not a valid date: using default"
+                             % self.get_option('crm_from'))
+ 
+-        crm_dest = os.path.join(self.get_cmd_path(), 'crm_report')
++        crm_dest = self.get_cmd_output_path(name='crm_report')
+         self.add_cmd_output('crm_report -S -d --dest %s --from "%s"'
+                     % (crm_dest, crm_from))
+ 
+diff --git a/sos/plugins/foreman.py b/sos/plugins/foreman.py
+index ab4dfcb..a2f2881 100644
+--- a/sos/plugins/foreman.py
++++ b/sos/plugins/foreman.py
+@@ -25,7 +25,5 @@ class Foreman(Plugin, RedHatPlugin):
+     packages = ('foreman')
+ 
+     def setup(self):
+-        foreman_debug_path = os.path.join(
+-            self.get_cmd_path(),"foreman-debug")
+-        self.add_cmd_output("%s -q -a -d %s"
+-            % ("foreman-debug", foreman_debug_path))
++        self.add_cmd_output("%s -q -a -d %s" % ("foreman-debug",
++                           self.get_cmd_output_path(name="foreman-debug")))
+diff --git a/sos/plugins/katello.py b/sos/plugins/katello.py
+index 1999388..acf5d90 100644
+--- a/sos/plugins/katello.py
++++ b/sos/plugins/katello.py
+@@ -25,7 +25,5 @@ class Katello(Plugin, RedHatPlugin):
+     packages = ('katello', 'katello-common', 'katello-headpin')
+ 
+     def setup(self):
+-        katello_debug_path = os.path.join(
+-            self.get_cmd_path(),"katello-debug")
+-        self.add_cmd_output("%s --notar -d %s"
+-            % ("katello-debug", katello_debug_path))
++        self.add_cmd_output("katello-debug --notar -d %s"
++                            % self.get_cmd_output_path(name="katello-debug"))
+diff --git a/sos/plugins/lvm2.py b/sos/plugins/lvm2.py
+index 1a4d589..102df26 100644
+--- a/sos/plugins/lvm2.py
++++ b/sos/plugins/lvm2.py
+@@ -34,7 +34,7 @@ class Lvm2(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
+         if metadata:
+             lvmdump_opts = "-a -m"
+         cmd = lvmdump_cmd % (lvmdump_opts,
+-                             os.path.join(self.get_cmd_path(), "lvmdump"))
++                             self.get_cmd_output_path(name="lvmdump"))
+         self.add_cmd_output(cmd)
+ 
+     def setup(self):
+diff --git a/sos/plugins/rhui.py b/sos/plugins/rhui.py
+index a291515..f0413b4 100644
+--- a/sos/plugins/rhui.py
++++ b/sos/plugins/rhui.py
+@@ -32,13 +32,7 @@ class Rhui(Plugin, RedHatPlugin):
+         else:
+             cds = ""
+ 
+-        rhui_debug_dst_path = os.path.join(self.get_cmd_path(),
+-                self.commons['cmddir'], self.name())
+-        try:
+-            os.mkdir(rhui_debug_dst_path)
+-        except:
+-            return
+-
++        rhui_debug_dst_path = self.get_cmd_output_path()
+         self.add_cmd_output("python %s %s --dir %s"
+                 % (self.rhui_debug_path, cds, rhui_debug_dst_path),
+                 suggest_filename="rhui-debug")
+diff --git a/sos/plugins/satellite.py b/sos/plugins/satellite.py
+index 7f4aafd..474933a 100644
+--- a/sos/plugins/satellite.py
++++ b/sos/plugins/satellite.py
+@@ -78,7 +78,7 @@ class Satellite(Plugin, RedHatPlugin):
+                                 "/etc/tomcat6/", "/var/log/tomcat6/"])
+             if os.path.exists("spacewalk-debug"):
+                 self.add_cmd_output("spacewalk-debug --dir %s"
+-                        % os.path.join(self.get_cmd_path()))
++                        % self.get_cmd_output_path(name="spacewalk-debug"))
+ 
+         if self.proxy:
+             self.add_copy_specs(["/etc/squid", "/var/log/squid"])
+diff --git a/sos/plugins/yum.py b/sos/plugins/yum.py
+index aa8cb18..c978842 100644
+--- a/sos/plugins/yum.py
++++ b/sos/plugins/yum.py
+@@ -49,7 +49,7 @@ class Yum(Plugin, RedHatPlugin):
+         self.add_cmd_output("subscription-manager list --installed")
+         self.add_cmd_output("subscription-manager list --consumed")
+         self.add_cmd_output("rhsm-debug system --no-archive --destination %s"
+-                % self.get_cmd_path())
++                % self.get_cmd_output_path())
+ 
+         if self.get_option("yumlist"):
+             # List various information about available packages
+-- 
+1.7.11.7
+
diff --git a/0032-Fix-broken-binary-detection-in-satellite-plugin.patch b/0032-Fix-broken-binary-detection-in-satellite-plugin.patch
new file mode 100644
index 0000000..484e211
--- /dev/null
+++ b/0032-Fix-broken-binary-detection-in-satellite-plugin.patch
@@ -0,0 +1,35 @@
+From 15f46d44afa055edc169670303c81fb97dcfd0ae Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr at redhat.com>
+Date: Wed, 12 Mar 2014 17:57:34 +0000
+Subject: [PATCH 32/61] Fix broken binary detection in satellite plugin
+
+The satellite plugin attempts to check for the existence of the
+'satellite-debug' binary before running it. This was broken by
+the mass conversion to PATH for running external commands.
+
+Remove the check and just attempt to run the command regardless.
+
+Signed-off-by: Bryn M. Reeves <bmr at redhat.com>
+---
+ sos/plugins/satellite.py | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+diff --git a/sos/plugins/satellite.py b/sos/plugins/satellite.py
+index 474933a..28c8bca 100644
+--- a/sos/plugins/satellite.py
++++ b/sos/plugins/satellite.py
+@@ -76,9 +76,8 @@ class Satellite(Plugin, RedHatPlugin):
+         if self.satellite:
+             self.add_copy_specs(["/etc/tnsnames.ora", "/etc/jabberd",
+                                 "/etc/tomcat6/", "/var/log/tomcat6/"])
+-            if os.path.exists("spacewalk-debug"):
+-                self.add_cmd_output("spacewalk-debug --dir %s"
+-                        % self.get_cmd_output_path(name="spacewalk-debug"))
++            self.add_cmd_output("spacewalk-debug --dir %s"
++                    % self.get_cmd_output_path(name="spacewalk-debug"))
+ 
+         if self.proxy:
+             self.add_copy_specs(["/etc/squid", "/var/log/squid"])
+-- 
+1.7.11.7
+
diff --git a/0033-Rename-validatePlugin-to-validate_plugin.patch b/0033-Rename-validatePlugin-to-validate_plugin.patch
new file mode 100644
index 0000000..10372e1
--- /dev/null
+++ b/0033-Rename-validatePlugin-to-validate_plugin.patch
@@ -0,0 +1,44 @@
+From db8839351479c60234bb6873394d93b56f0174eb Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr at redhat.com>
+Date: Wed, 12 Mar 2014 19:36:02 +0000
+Subject: [PATCH 33/61] Rename validatePlugin to validate_plugin
+
+This one somehow didn't get the memo about camelCase not being
+cool any more in sos. Rename the method to comply with pep8 and
+not be so ugly.
+
+Signed-off-by: Bryn M. Reeves <bmr at redhat.com>
+---
+ sos/policies/__init__.py | 2 +-
+ sos/sosreport.py         | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/sos/policies/__init__.py b/sos/policies/__init__.py
+index c272e5c..b91d0fd 100644
+--- a/sos/policies/__init__.py
++++ b/sos/policies/__init__.py
+@@ -198,7 +198,7 @@ No changes will be made to system configuration.
+             return tempfile.gettempdir()
+         return opt_tmp_dir
+ 
+-    def validatePlugin(self, plugin_class):
++    def validate_plugin(self, plugin_class):
+         """
+         Verifies that the plugin_class should execute under this policy
+         """
+diff --git a/sos/sosreport.py b/sos/sosreport.py
+index 0faa364..fe78abd 100644
+--- a/sos/sosreport.py
++++ b/sos/sosreport.py
+@@ -763,7 +763,7 @@ class SoSReport(object):
+                         tuple(self.policy.valid_subclasses))
+ 
+                 for plugin_class in plugin_classes:
+-                    if not self.policy.validatePlugin(plugin_class):
++                    if not self.policy.validate_plugin(plugin_class):
+                         self.soslog.warning(_("plugin %s does not validate, skipping") % plug)
+                         if self.opts.verbosity > 0:
+                             self._skip(plugin_class, _("does not validate"))
+-- 
+1.7.11.7
+
diff --git a/0034-Update-policy_tests.py-for-validate_plugin-change.patch b/0034-Update-policy_tests.py-for-validate_plugin-change.patch
new file mode 100644
index 0000000..101861e
--- /dev/null
+++ b/0034-Update-policy_tests.py-for-validate_plugin-change.patch
@@ -0,0 +1,50 @@
+From 3eb24386719ee06c9e726550065c5427f1021c6f Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr at redhat.com>
+Date: Thu, 13 Mar 2014 10:48:36 +0000
+Subject: [PATCH 34/61] Update policy_tests.py for validate_plugin change
+
+The policy_tests unit tests call validatePlugin(). Update them to
+use the new name.
+
+Signed-off-by: Bryn M. Reeves <bmr at redhat.com>
+---
+ tests/policy_tests.py | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/tests/policy_tests.py b/tests/policy_tests.py
+index aa74da7..764af83 100644
+--- a/tests/policy_tests.py
++++ b/tests/policy_tests.py
+@@ -21,25 +21,25 @@ class PolicyTests(unittest.TestCase):
+         p = FauxPolicy()
+         p.valid_subclasses = []
+ 
+-        self.assertTrue(p.validatePlugin(FauxPlugin))
++        self.assertTrue(p.validate_plugin(FauxPlugin))
+ 
+     def test_redhat(self):
+         p = FauxPolicy()
+         p.valid_subclasses = [RedHatPlugin]
+ 
+-        self.assertTrue(p.validatePlugin(FauxRedHatPlugin))
++        self.assertTrue(p.validate_plugin(FauxRedHatPlugin))
+ 
+     def test_debian(self):
+         p = FauxPolicy()
+         p.valid_subclasses = [DebianPlugin]
+ 
+-        self.assertTrue(p.validatePlugin(FauxDebianPlugin))
++        self.assertTrue(p.validate_plugin(FauxDebianPlugin))
+ 
+     def test_fails(self):
+         p = FauxPolicy()
+         p.valid_subclasses = []
+ 
+-        self.assertFalse(p.validatePlugin(FauxDebianPlugin))
++        self.assertFalse(p.validate_plugin(FauxDebianPlugin))
+ 
+     def test_can_import(self):
+         self.assertTrue(import_policy('redhat') is not None)
+-- 
+1.7.11.7
+
diff --git a/0035-Match-plugins-against-policies.patch b/0035-Match-plugins-against-policies.patch
new file mode 100644
index 0000000..6debc83
--- /dev/null
+++ b/0035-Match-plugins-against-policies.patch
@@ -0,0 +1,150 @@
+From 4d1351efbd09220c36e889e222c40fe3ae68958a Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr at redhat.com>
+Date: Wed, 12 Mar 2014 20:25:19 +0000
+Subject: [PATCH 35/61] Match plugins against policies
+
+Fixes Issue #238.
+
+When tagging classes are used to enable plugins on multiple
+platforms it is possible for there to be more than one valid class
+instance for a given policy. For e.g.:
+
+  class DebianFooPlugin(Plugin, DebianPlugin):
+  ///
+  class UbuntuFooPlugin(Plugin, UbuntuPlugin):
+  ///
+
+Since UbuntuPolicy includes both DebianPlugin and UbuntuPlugin in
+its valid_subclasses list both classes pass the validity test and
+both are added to the loaded_plugins list. This causes plugins
+to run twice:
+
+2014-03-12 19:57:50,974 DEBUG: copying file /var/log/mail.log to /var/log/mail.log
+2014-03-12 19:57:50,975 DEBUG: added /var/log/mail.log to FileCacheArchive /tmp/sosreport-u1210-vm1-20140312195750
+2014-03-12 19:57:51,293 DEBUG: copying file /var/log/mail.log to /var/log/mail.log
+2014-03-12 19:57:51,294 DEBUG: added /var/log/mail.log to FileCacheArchive /tmp/sosreport-u1210-vm1-20140312195750
+
+Fix this by adding a match_plugin() method to the policy base
+class and prefer plugins that are subclasses of the first entry
+in the list. This patch also reverses the order of the
+valid_subclasses list for the UbuntuPolicy to ensure preference
+is given to native plugins:
+
+  self.valid_subclasses = [UbuntuPlugin, DebianPlugin]
+
+Signed-off-by: Bryn M. Reeves <bmr at redhat.com>
+---
+ sos/policies/__init__.py | 10 +++++++++
+ sos/policies/ubuntu.py   |  2 +-
+ sos/sosreport.py         | 53 +++++++++++++++++++++++++-----------------------
+ 3 files changed, 39 insertions(+), 26 deletions(-)
+
+diff --git a/sos/policies/__init__.py b/sos/policies/__init__.py
+index b91d0fd..08ce8b4 100644
+--- a/sos/policies/__init__.py
++++ b/sos/policies/__init__.py
+@@ -198,6 +198,16 @@ No changes will be made to system configuration.
+             return tempfile.gettempdir()
+         return opt_tmp_dir
+ 
++    def match_plugin(self, plugin_classes):
++        if len(plugin_classes) > 1:
++            for p in plugin_classes:
++                # Give preference to the first listed tagging class
++                # so that e.g. UbuntuPlugin is chosen over DebianPlugin
++                # on an Ubuntu installation.
++                if issubclass(p, self.valid_subclasses[0]):
++                    return p
++        return plugin_classes[0]
++
+     def validate_plugin(self, plugin_class):
+         """
+         Verifies that the plugin_class should execute under this policy
+diff --git a/sos/policies/ubuntu.py b/sos/policies/ubuntu.py
+index c9a8177..3039f43 100644
+--- a/sos/policies/ubuntu.py
++++ b/sos/policies/ubuntu.py
+@@ -12,7 +12,7 @@ class UbuntuPolicy(DebianPolicy):
+ 
+     def __init__(self):
+         super(UbuntuPolicy, self).__init__()
+-        self.valid_subclasses = [DebianPlugin, UbuntuPlugin]
++        self.valid_subclasses = [UbuntuPlugin, DebianPlugin]
+ 
+     @classmethod
+     def check(self):
+diff --git a/sos/sosreport.py b/sos/sosreport.py
+index fe78abd..13a46bf 100644
+--- a/sos/sosreport.py
++++ b/sos/sosreport.py
+@@ -761,39 +761,42 @@ class SoSReport(object):
+             try:
+                 plugin_classes = import_plugin(plugbase,
+                         tuple(self.policy.valid_subclasses))
+-
+-                for plugin_class in plugin_classes:
+-                    if not self.policy.validate_plugin(plugin_class):
+-                        self.soslog.warning(_("plugin %s does not validate, skipping") % plug)
+-                        if self.opts.verbosity > 0:
+-                            self._skip(plugin_class, _("does not validate"))
++                if not len(plugin_classes):
++                    # no valid plugin classes for this policy
++                    continue
++
++                plugin_class = self.policy.match_plugin(plugin_classes)
++                if not self.policy.validate_plugin(plugin_class):
++                    self.soslog.warning(_("plugin %s does not validate, skipping") % plug)
++                    if self.opts.verbosity > 0:
++                        self._skip(plugin_class, _("does not validate"))
+                         continue
+ 
+-                    if plugin_class.requires_root and not self._is_root:
+-                        self.soslog.info(_("plugin %s requires root permissions to execute, skipping") % plug)
+-                        self._skip(plugin_class, _("requires root"))
+-                        continue
++                if plugin_class.requires_root and not self._is_root:
++                    self.soslog.info(_("plugin %s requires root permissions to execute, skipping") % plug)
++                    self._skip(plugin_class, _("requires root"))
++                    continue
+ 
+-                    # plug-in is valid, let's decide whether run it or not
+-                    self.plugin_names.append(plugbase)
++                # plug-in is valid, let's decide whether run it or not
++                self.plugin_names.append(plugbase)
+ 
+-                    if  self._is_skipped(plugbase):
+-                        self._skip(plugin_class, _("skipped"))
+-                        continue
++                if  self._is_skipped(plugbase):
++                    self._skip(plugin_class, _("skipped"))
++                    continue
+ 
+-                    if  self._is_inactive(plugbase, plugin_class):
+-                        self._skip(plugin_class, _("inactive"))
+-                        continue
++                if  self._is_inactive(plugbase, plugin_class):
++                    self._skip(plugin_class, _("inactive"))
++                    continue
+ 
+-                    if  self._is_not_default(plugbase, plugin_class):
+-                        self._skip(plugin_class, _("not default"))
+-                        continue
++                if  self._is_not_default(plugbase, plugin_class):
++                    self._skip(plugin_class, _("not default"))
++                    continue
+ 
+-                    if  self._is_not_specified(plugbase):
+-                        self._skip(plugin_class, _("not specified"))
+-                        continue
++                if  self._is_not_specified(plugbase):
++                    self._skip(plugin_class, _("not specified"))
++                    continue
+ 
+-                    self._load(plugin_class)
++                self._load(plugin_class)
+             except Exception as e:
+                 self.soslog.warning(_("plugin %s does not install, skipping: %s") % (plug, e))
+                 if self.raise_plugins:
+-- 
+1.7.11.7
+
diff --git a/0036-Do-not-collect-isos-in-cobbler-plugin.patch b/0036-Do-not-collect-isos-in-cobbler-plugin.patch
new file mode 100644
index 0000000..9473816
--- /dev/null
+++ b/0036-Do-not-collect-isos-in-cobbler-plugin.patch
@@ -0,0 +1,24 @@
+From 3ff674035d8962bf3ca3320900fccc6619af7a3d Mon Sep 17 00:00:00 2001
+From: Adam Stokes <adam.stokes at ubuntu.com>
+Date: Fri, 14 Mar 2014 15:03:29 -0400
+Subject: [PATCH 36/61] Do not collect isos in cobbler plugin
+
+In Ubuntu isos are being added to the tarball, do not do that.
+
+Signed-off-by: Adam Stokes <adam.stokes at ubuntu.com>
+---
+ sos/plugins/cobbler.py | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/sos/plugins/cobbler.py b/sos/plugins/cobbler.py
+index e3d289e..b754813 100644
+--- a/sos/plugins/cobbler.py
++++ b/sos/plugins/cobbler.py
+@@ -39,3 +39,4 @@ class DebianCobbler(Cobbler, DebianPlugin, UbuntuPlugin):
+         self.add_copy_spec("/etc/cobbler")
+         self.add_copy_spec("/var/log/cobbler")
+         self.add_copy_spec("/var/lib/cobbler")
++        self.add_forbidden_path("/var/lib/cobbler/isos")
+-- 
+1.7.11.7
+
diff --git a/0037-Call-rhsm-debug-with-the-sos-switch.patch b/0037-Call-rhsm-debug-with-the-sos-switch.patch
new file mode 100644
index 0000000..60d1806
--- /dev/null
+++ b/0037-Call-rhsm-debug-with-the-sos-switch.patch
@@ -0,0 +1,26 @@
+From f617db3b8232c5864726c60b11a91162409d867f Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr at redhat.com>
+Date: Thu, 20 Mar 2014 18:56:58 +0000
+Subject: [PATCH 37/61] Call rhsm-debug with the --sos switch
+
+Signed-off-by: Bryn M. Reeves <bmr at redhat.com>
+---
+ sos/plugins/yum.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/sos/plugins/yum.py b/sos/plugins/yum.py
+index c978842..b05c0fe 100644
+--- a/sos/plugins/yum.py
++++ b/sos/plugins/yum.py
+@@ -48,7 +48,7 @@ class Yum(Plugin, RedHatPlugin):
+             "/var/log/rhsm/rhsmcertd.log"])
+         self.add_cmd_output("subscription-manager list --installed")
+         self.add_cmd_output("subscription-manager list --consumed")
+-        self.add_cmd_output("rhsm-debug system --no-archive --destination %s"
++        self.add_cmd_output("rhsm-debug system --sos --no-archive --destination %s"
+                 % self.get_cmd_output_path())
+ 
+         if self.get_option("yumlist"):
+-- 
+1.7.11.7
+
diff --git a/0038-Fix-plugin_test-exception-on-six.PY2.patch b/0038-Fix-plugin_test-exception-on-six.PY2.patch
new file mode 100644
index 0000000..391beba
--- /dev/null
+++ b/0038-Fix-plugin_test-exception-on-six.PY2.patch
@@ -0,0 +1,32 @@
+From eb2b77cc38130882db71b73a5a026a454d261684 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr at redhat.com>
+Date: Tue, 25 Mar 2014 17:26:11 +0000
+Subject: [PATCH 38/61] Fix plugin_test exception on six.PY2
+
+Replace explicit test for six.PY2 with try/exception handling of
+StringIO import.
+
+Signed-off-by: Bryn M. Reeves <bmr at redhat.com>
+---
+ tests/plugin_tests.py | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/tests/plugin_tests.py b/tests/plugin_tests.py
+index c4b540f..31ffae4 100644
+--- a/tests/plugin_tests.py
++++ b/tests/plugin_tests.py
+@@ -4,9 +4,9 @@ import tempfile
+ 
+ # PYCOMPAT
+ import six
+-if six.PY2:
++try:
+     from StringIO import StringIO
+-else:
++except:
+     from io import StringIO
+ 
+ from sos.plugins import Plugin, regex_findall, sos_relative_path, mangle_command
+-- 
+1.7.11.7
+
diff --git a/0039-Remove-profile-support.patch b/0039-Remove-profile-support.patch
new file mode 100644
index 0000000..b46de42
--- /dev/null
+++ b/0039-Remove-profile-support.patch
@@ -0,0 +1,244 @@
+From 4553f0942c00b47342deea7fc47bb9822484a65e Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr at redhat.com>
+Date: Tue, 25 Mar 2014 17:28:31 +0000
+Subject: [PATCH 39/61] Remove --profile support
+
+The handrolled profile logging support in sos hasn't been widely
+used in a long time and is a problem better solved with external
+profiling and coverage tools.
+
+Rip out all the support and documentation. This shortens and
+simplifies numerous Plugin class methods.
+
+Fixes Issue #244.
+
+Signed-off-by: Bryn M. Reeves <bmr at redhat.com>
+---
+ man/en/sosreport.1      |  5 +----
+ sos/plugins/__init__.py | 30 ------------------------------
+ sos/sosreport.py        | 35 +----------------------------------
+ tests/plugin_tests.py   |  4 +---
+ 4 files changed, 3 insertions(+), 71 deletions(-)
+
+diff --git a/man/en/sosreport.1 b/man/en/sosreport.1
+index c800576..e189433 100644
+--- a/man/en/sosreport.1
++++ b/man/en/sosreport.1
+@@ -11,7 +11,7 @@ sosreport \- Collect and package diagnostic and support data
+           [--report] [--config-file conf] [--batch]\fR
+           [--build] [--name name] [--ticket-number number]
+           [--debug] [--tmp-dir directory]\fR
+-          [--profile] [--help]\fR
++          [--help]\fR
+ .SH DESCRIPTION
+ \fBsosreport\fR generates a compressed tar archive of diagnostic
+ information from the running system. The archive may be stored
+@@ -84,9 +84,6 @@ archive as a temporary file or directory tree.
+ Enable interactive debugging using the python debugger. Exceptions in
+ sos or plug-in code will cause a trap to the pdb shell.
+ .TP
+-.B \--profile
+-Enable profiler logging.
+-.TP
+ .B \--help
+ Display usage message.
+ .SH MAINTAINER
+diff --git a/sos/plugins/__init__.py b/sos/plugins/__init__.py
+index efb6950..cf2a710 100644
+--- a/sos/plugins/__init__.py
++++ b/sos/plugins/__init__.py
+@@ -137,7 +137,6 @@ class Plugin(object):
+         self.collect_cmds = []
+ 
+         self.soslog = self.commons['soslog'] if 'soslog' in self.commons else logging.getLogger('sos')
+-        self.proflog = self.commons['proflog'] if 'proflog' in self.commons else logging.getLogger('sosprofile')
+ 
+         # get the option list into a dictionary
+         for opt in self.option_list:
+@@ -171,9 +170,6 @@ class Plugin(object):
+ 
+         This function returns the number of replacements made.
+         '''
+-        if self.commons['cmdlineopts'].profiler:
+-            start_time = time()
+-
+         globstr = '*' + cmd + '*'
+         self.soslog.debug("substituting '%s' for '%s' in commands matching %s"
+                     % (subst, regexp, globstr))
+@@ -200,11 +196,6 @@ class Plugin(object):
+             msg = 'regex substitution failed for %s in plugin %s with: "%s"'
+             self.soslog.error(msg % (called['exe'], self.name(), e))
+             replacements = None
+-
+-        if self.commons['cmdlineopts'].profiler:
+-            time_passed = time() - start_time
+-            self.proflog.debug("subst: %-75s time: %f"
+-                            % (globstr, time_passed))
+         return replacements
+         
+     def do_file_sub(self, srcpath, regexp, subst):
+@@ -215,9 +206,6 @@ class Plugin(object):
+ 
+         This function returns the number of replacements made.
+         '''
+-        if self.commons['cmdlineopts'].profiler:
+-            start_time = time()
+-
+         try:
+             path = self._get_dest_for_srcpath(srcpath)
+             self.soslog.debug("substituting '%s' for '%s' in %s"
+@@ -234,10 +222,6 @@ class Plugin(object):
+             msg = 'regex substitution failed for %s in plugin %s with: "%s"'
+             self.soslog.error(msg % (path, self.name(), e))
+             replacements = 0
+-        if self.commons['cmdlineopts'].profiler:
+-            time_passed = time() - start_time
+-            self.proflog.debug("subst : %-75s time: %f"
+-                            % (srcpath, time_passed))
+         return replacements
+ 
+     def do_regex_find_all(self, regex, fname):
+@@ -314,10 +298,6 @@ class Plugin(object):
+         /etc/my_file.conf the file would end up at
+         /configurations/my_file.conf.
+         '''
+-
+-        if self.commons['cmdlineopts'].profiler:
+-            start_time = time()
+-
+         if self._path_in_path_list(srcpath, self.forbidden_paths):
+             self.soslog.debug("%s is in the forbidden path list" % srcpath)
+             return ''
+@@ -358,9 +338,6 @@ class Plugin(object):
+                 'dstpath':dest,
+                 'symlink':"no"})
+ 
+-            if self.commons['cmdlineopts'].profiler:
+-                time_passed = time() - start_time
+-                self.proflog.debug("copied: %-75s time: %f" % (srcpath, time_passed))
+         except Exception as e:
+             self.soslog.error("Unable to copy %s to %s" % (srcpath, dest))
+             self.soslog.error(traceback.format_exc())
+@@ -560,9 +537,6 @@ class Plugin(object):
+         """Execute a command and save the output to a file for inclusion in the
+         report.
+         """
+-        if self.commons['cmdlineopts'].profiler:
+-            start_time = time()
+-
+         # pylint: disable-msg = W0612
+         status, shout, runtime = self.get_command_output(exe, timeout=timeout)
+         if (status == 127):
+@@ -582,10 +556,6 @@ class Plugin(object):
+         self.executed_commands.append({'exe': exe, 'file':outfn_strip}) # save in our list
+         self.commons['xmlreport'].add_command(cmdline=exe,exitcode=status,f_stdout=outfn_strip,runtime=runtime)
+ 
+-        if self.commons['cmdlineopts'].profiler:
+-            time_passed = time() - start_time
+-            self.proflog.debug("output: %-75s time: %f" % (exe, time_passed))
+-
+         return os.path.join(self.archive.get_archive_path(), outfn)
+ 
+     # For adding output
+diff --git a/sos/sosreport.py b/sos/sosreport.py
+index 13a46bf..afa5371 100644
+--- a/sos/sosreport.py
++++ b/sos/sosreport.py
+@@ -220,7 +220,6 @@ class SoSOptions(object):
+     _config_file = ""
+     _tmp_dir = ""
+     _report = True
+-    _profiler = False
+     _compression_type = 'auto'
+ 
+     _options = None
+@@ -431,19 +430,6 @@ class SoSOptions(object):
+         self._report = value
+ 
+     @property
+-    def profiler(self):
+-        if self._options != None:
+-            return self._options.profiler
+-        return self._profiler
+-
+-    @profiler.setter
+-    def profiler(self, value):
+-        self._check_options_initialized()
+-        if not isinstance(value, bool):
+-            raise TypeError("SoSOptions.profiler expects a boolean")
+-        self._profiler = value
+-
+-    @property
+     def compression_type(self):
+         if self._options != None:
+             return self._options.compression_type
+@@ -508,9 +494,6 @@ class SoSOptions(object):
+         parser.add_option("--no-report", action="store_true",
+                              dest="report",
+                              help="Disable HTML/XML reporting", default=False)
+-        parser.add_option("--profile", action="store_true",
+-                             dest="profiler",
+-                             help="turn on profiling", default=False)
+         parser.add_option("-z", "--compression-type", dest="compression_type",
+                             help="compression technology to use [auto, zip, gzip, bzip2, xz] (default=auto)",
+                             default="auto")
+@@ -563,7 +546,6 @@ class SoSReport(object):
+                 'rptdir': self.rptdir,
+                 'tmpdir': self.tmpdir,
+                 'soslog': self.soslog,
+-                'proflog' : self.proflog,
+                 'policy': self.policy,
+                 'verbosity': self.opts.verbosity,
+                 'xmlreport': self.xml_report,
+@@ -680,32 +662,17 @@ class SoSReport(object):
+             ui_console.setLevel(logging.INFO)
+             self.ui_log.addHandler(ui_console)
+ 
+-        # profile logging
+-        if self.opts.profiler:
+-            self.proflog = logging.getLogger('sosprofile')
+-            self.proflog.setLevel(logging.DEBUG)
+-            self.sos_profile_log_file = self.get_temp_file()
+-            plog = logging.FileHandler(self.sos_profile_log_file.name)
+-            plog.setFormatter(logging.Formatter('%(message)s'))
+-            plog.setLevel(logging.DEBUG)
+-            self.proflog.addHandler(plog)
+-        else:
+-             self.proflog = logging.getLogger('sosprofile')
+-             self.proflog.setLevel(logging.FATAL)
+-
+     def _finish_logging(self):
+         logging.shutdown()
+ 
+         # the logging module seems to persist in the jython/jboss/eap world
+         # so the handlers need to be removed
+-        for logger in [logging.getLogger(x) for x in ('sos', 'sosprofile', 'sos_ui')]:
++        for logger in [logging.getLogger(x) for x in ('sos', 'sos_ui')]:
+             for h in logger.handlers:
+                 logger.removeHandler(h)
+ 
+         if getattr(self, "sos_log_file", None):
+             self.archive.add_file(self.sos_log_file.name, dest=os.path.join('sos_logs', 'sos.log'))
+-        if getattr(self, "sos_profile_log_file", None):
+-            self.archive.add_file(self.sos_profile_log_file.name, dest=os.path.join('sos_logs', 'profile.log'))
+         if getattr(self, "sos_ui_log_file", None):
+             self.archive.add_file(self.sos_ui_log_file.name, dest=os.path.join('sos_logs', 'ui.log'))
+ 
+diff --git a/tests/plugin_tests.py b/tests/plugin_tests.py
+index 31ffae4..0f8ef5d 100644
+--- a/tests/plugin_tests.py
++++ b/tests/plugin_tests.py
+@@ -89,9 +89,7 @@ class EnablerPlugin(Plugin):
+ 
+ 
+ class MockOptions(object):
+-
+-    profiler = False
+-
++    pass
+ 
+ 
+ class PluginToolTests(unittest.TestCase):
+-- 
+1.7.11.7
+
diff --git a/0040-Dead-code-removal-sos_relative_path.patch b/0040-Dead-code-removal-sos_relative_path.patch
new file mode 100644
index 0000000..4ab2e65
--- /dev/null
+++ b/0040-Dead-code-removal-sos_relative_path.patch
@@ -0,0 +1,78 @@
+From e708041c050245bf05a7205e6661f8402e8e6a66 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr at redhat.com>
+Date: Wed, 26 Mar 2014 12:22:29 +0000
+Subject: [PATCH 40/61] Dead code removal: sos_relative_path()
+
+The function is defined and even has test cases. But no callers..
+Remove the function and the test cases that exercise it.
+
+Signed-off-by: Bryn M. Reeves <bmr at redhat.com>
+---
+ sos/plugins/__init__.py | 15 ---------------
+ tests/plugin_tests.py   | 17 +----------------
+ 2 files changed, 1 insertion(+), 31 deletions(-)
+
+diff --git a/sos/plugins/__init__.py b/sos/plugins/__init__.py
+index cf2a710..d420cd0 100644
+--- a/sos/plugins/__init__.py
++++ b/sos/plugins/__init__.py
+@@ -58,21 +58,6 @@ def common_prefix(l1, l2, common = None):
+         return (common, [l1, l2])
+     return common_prefix(l1[1:], l2[1:], common+[l1[0]])
+ 
+-def sos_relative_path(path1, path2, sep=os.path.sep, pardir=os.path.pardir):
+-    '''Return a relative path from path1 equivalent to path path2.  In
+-    particular: the empty string, if path1 == path2; path2, if path1 and path2
+-    have no common prefix.
+-    '''
+-    try:
+-        common, (u1, u2) = common_prefix(path1.split(sep), path2.split(sep))
+-    except AttributeError:
+-        return path2
+-
+-    if not common:
+-        return path2      # leave path absolute if nothing at all in common
+-    return sep.join( [pardir]*len(u1) + u2 )
+-
+-
+ def regex_findall(regex, fname):
+     '''Return a list of all non overlapping matches in the string(s)'''
+     try:
+diff --git a/tests/plugin_tests.py b/tests/plugin_tests.py
+index 0f8ef5d..5eb1304 100644
+--- a/tests/plugin_tests.py
++++ b/tests/plugin_tests.py
+@@ -9,7 +9,7 @@ try:
+ except:
+     from io import StringIO
+ 
+-from sos.plugins import Plugin, regex_findall, sos_relative_path, mangle_command
++from sos.plugins import Plugin, regex_findall, mangle_command
+ from sos.archive import TarFileArchive, ZipFileArchive
+ import sos.policies
+ 
+@@ -114,21 +114,6 @@ class PluginToolTests(unittest.TestCase):
+         matches = regex_findall(r".*", 1)
+         self.assertEquals(matches, [])
+ 
+-    def test_rel_path(self):
+-        path1 = "/usr/lib/foo"
+-        path2 = "/usr/lib/boo"
+-        self.assertEquals(sos_relative_path(path1, path2), "../boo")
+-
+-    def test_abs_path(self):
+-        path1 = "usr/lib/foo"
+-        path2 = "foo/lib/boo"
+-        self.assertEquals(sos_relative_path(path1, path2), "foo/lib/boo")
+-
+-    def test_bad_path(self):
+-        path1 = None
+-        path2 = "foo/lib/boo"
+-        self.assertEquals(sos_relative_path(path1, path2), "foo/lib/boo")
+-
+     def test_mangle_command(self):
+         self.assertEquals("foo", mangle_command("/usr/bin/foo"))
+         self.assertEquals("foo_-x", mangle_command("/usr/bin/foo -x"))
+-- 
+1.7.11.7
+
diff --git a/0041-Dead-code-removal-DirTree.patch b/0041-Dead-code-removal-DirTree.patch
new file mode 100644
index 0000000..fec2b9f
--- /dev/null
+++ b/0041-Dead-code-removal-DirTree.patch
@@ -0,0 +1,146 @@
+From 6b3b56ee17e14a0f0de8a16a6a52b3708d01146b Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr at redhat.com>
+Date: Wed, 26 Mar 2014 12:24:33 +0000
+Subject: [PATCH 41/61] Dead code removal: DirTree
+
+The DirTree class has remained unused since it was implemented.
+Remove the definition and associated test cases.
+
+Signed-off-by: Bryn M. Reeves <bmr at redhat.com>
+---
+ sos/utilities.py         | 89 ------------------------------------------------
+ tests/utilities_tests.py | 11 +-----
+ 2 files changed, 1 insertion(+), 99 deletions(-)
+
+diff --git a/sos/utilities.py b/sos/utilities.py
+index a9aca74..8602a52 100644
+--- a/sos/utilities.py
++++ b/sos/utilities.py
+@@ -185,95 +185,6 @@ def shell_out(cmd):
+     Does not handle exceptions."""
+     return sos_get_command_output(cmd)[1]
+ 
+-class DirTree(object):
+-    """Builds an ascii representation of a directory structure"""
+-
+-    def __init__(self, top_directory):
+-        self.directory_count = 0
+-        self.file_count = 0
+-        self.buffer = []
+-        self.top_directory = top_directory
+-        self._build_tree()
+-
+-    def buf(self, s):
+-        self.buffer.append(s)
+-
+-    def printtree(self):
+-        print (six.u(self))
+-
+-    def as_string(self):
+-        return self.__str__()
+-
+-    def __str__(self):
+-        return "\n".join(self.buffer)
+-
+-    def _build_tree(self):
+-        self.buf(os.path.abspath(self.top_directory))
+-        self.tree_i(self.top_directory, first=True)
+-
+-    def _get_user(self, stats):
+-        try:
+-            import pwd
+-            return pwd.getpwuid(stats.st_uid)[0]
+-        except:
+-            return six.u(stats.st_uid)
+-
+-    def _get_group(self, stats):
+-        try:
+-            import grp
+-            return grp.getgrgid(stats.st_gid)[0]
+-        except:
+-            return six.u(stats.st_uid)
+-
+-    def _format(self, path):
+-        """Conditionally adds detail to paths"""
+-        stats = os.stat(path)
+-        details = {
+-                "filename": os.path.basename(path),
+-                "user": self._get_user(stats),
+-                "group": self._get_group(stats),
+-                "filesize": convert_bytes(stats.st_size),
+-                }
+-        return ("[%(user)s %(group)s %(filesize)s] " % details, "%(filename)s" % details)
+-
+-    def tree_i(self, dir_, padding='', first=False, fmt="%-30s %s%s%s"):
+-        if not first:
+-            details, filename = self._format(os.path.abspath(dir_))
+-            line = fmt % (details, padding[:-1], "+-- ", filename)
+-            self.buf(line)
+-            padding += '   '
+-
+-        count = 0
+-        files = os.listdir(dir_)
+-        files.sort(key=str.lower)
+-        for f in files:
+-            count += 1
+-            path = os.path.join(dir_, f)
+-
+-            if f.startswith("."):
+-                pass
+-            elif os.path.isfile(path):
+-                self.file_count += 1
+-                details, filename = self._format(path)
+-                line = fmt % (details, padding, "+-- ", filename)
+-                self.buf(line)
+-            elif os.path.islink(path):
+-                self.buf(padding +
+-                         '+-- ' +
+-                         f +
+-                         ' -> ' + os.path.basename(os.path.realpath(path)))
+-                if os.path.isdir(path):
+-                    self.directory_count += 1
+-                else:
+-                    self.file_count += 1
+-            elif os.path.isdir(path):
+-                self.directory_count += 1
+-                if count == len(files):
+-                    self.tree_i(path, padding + ' ')
+-                else:
+-                    self.tree_i(path, padding + '|')
+-
+-
+ class ImporterHelper(object):
+     """Provides a list of modules that can be imported in a package.
+     Importable modules are located along the module __path__ list and modules
+diff --git a/tests/utilities_tests.py b/tests/utilities_tests.py
+index 04c5241..da0987f 100644
+--- a/tests/utilities_tests.py
++++ b/tests/utilities_tests.py
+@@ -5,7 +5,7 @@ import unittest
+ import six
+ from six import StringIO
+ 
+-from sos.utilities import grep, DirTree, checksum, get_hash_name, is_executable, sos_get_command_output, find, tail, shell_out
++from sos.utilities import grep, checksum, get_hash_name, is_executable, sos_get_command_output, find, tail, shell_out
+ import sos
+ 
+ TEST_DIR = os.path.dirname(__file__)
+@@ -43,15 +43,6 @@ class TailTest(unittest.TestCase):
+         self.assertEquals(t, six.b(expected))
+ 
+ 
+-class DirTreeTest(unittest.TestCase):
+-
+-    def test_makes_tree(self):
+-        # I'll admit, this a pretty lame test, but it will at least sniff out
+-        # some syntax issues
+-        t = DirTree(os.path.dirname(sos.__file__)).as_string()
+-        self.assertTrue('sos' in t)
+-
+-
+ class ChecksumTest(unittest.TestCase):
+ 
+     def test_simple_hash(self):
+-- 
+1.7.11.7
+
diff --git a/0042-Dead-code-removal-utilities.checksum.patch b/0042-Dead-code-removal-utilities.checksum.patch
new file mode 100644
index 0000000..ef15e25
--- /dev/null
+++ b/0042-Dead-code-removal-utilities.checksum.patch
@@ -0,0 +1,72 @@
+From 9c88a8ff071c9a74e3b412bd4f4ef19cd9248611 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr at redhat.com>
+Date: Wed, 26 Mar 2014 12:40:17 +0000
+Subject: [PATCH 42/61] Dead code removal: utilities.checksum()
+
+Has test case but no callers. Delete it.
+
+Signed-off-by: Bryn M. Reeves <bmr at redhat.com>
+---
+ sos/utilities.py         | 15 ---------------
+ tests/utilities_tests.py | 12 ------------
+ 2 files changed, 27 deletions(-)
+
+diff --git a/sos/utilities.py b/sos/utilities.py
+index 8602a52..1a56f9f 100644
+--- a/sos/utilities.py
++++ b/sos/utilities.py
+@@ -63,19 +63,6 @@ def fileobj(path_or_file, mode='r'):
+     else:
+         return closing(path_or_file)
+ 
+-def checksum(file_, chunk_size=128, algorithm=None):
+-    """Returns the checksum of the supplied filename. The file is read in
+-    chunk_size blocks"""
+-    if not algorithm:
+-        algorithm = get_hash_name()
+-    digest = hashlib.new(algorithm)
+-    with fileobj(file_, 'rb') as fd:
+-        data = fd.read(chunk_size)
+-        while data:
+-            digest.update(six.b(data))
+-            data = fd.read(chunk_size)
+-        return digest.hexdigest()
+-
+ def get_hash_name():
+     """Returns the algorithm used when computing a hash"""
+     import sos.policies
+@@ -101,8 +88,6 @@ def convert_bytes(bytes_, K=1 << 10, M=1 << 20, G=1 << 30, T=1 << 40):
+     else:
+         return '%d' % bytes_
+ 
+-
+-
+ def find(file_pattern, top_dir, max_depth=None, path_pattern=None):
+     """generator function to find files recursively. Usage:
+ 
+diff --git a/tests/utilities_tests.py b/tests/utilities_tests.py
+index da0987f..395fde1 100644
+--- a/tests/utilities_tests.py
++++ b/tests/utilities_tests.py
+@@ -43,18 +43,6 @@ class TailTest(unittest.TestCase):
+         self.assertEquals(t, six.b(expected))
+ 
+ 
+-class ChecksumTest(unittest.TestCase):
+-
+-    def test_simple_hash(self):
+-        self.assertEquals(checksum(StringIO('this is a test'), algorithm="sha256"),
+-                '2e99758548972a8e8822ad47fa1017ff72f06f3ff6a016851f45c398732bc50c')
+-
+-    def test_hash_loading(self):
+-       # not the greatest test, since we are asking the policy to pick for us
+-       name = get_hash_name()
+-       self.assertTrue(name in ('md5', 'sha256'))
+-
+-
+ class ExecutableTest(unittest.TestCase):
+ 
+     def test_nonexe_file(self):
+-- 
+1.7.11.7
+
diff --git a/0043-Add-vim-tags-to-all-python-source-files.patch b/0043-Add-vim-tags-to-all-python-source-files.patch
new file mode 100644
index 0000000..e6957a1
--- /dev/null
+++ b/0043-Add-vim-tags-to-all-python-source-files.patch
@@ -0,0 +1,1830 @@
+From 747189c07e5536151de3e656bc8fa5d23d8baf3c Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr at redhat.com>
+Date: Wed, 26 Mar 2014 13:07:13 +0000
+Subject: [PATCH 43/61] Add vim tags to all python source files
+
+Fixes Issue #243.
+
+Signed-off-by: Bryn M. Reeves <bmr at redhat.com>
+---
+ __run__.py                          | 2 ++
+ example_plugins/example.py          | 2 ++
+ setup.py                            | 2 ++
+ sos/__init__.py                     | 2 ++
+ sos/archive.py                      | 2 ++
+ sos/plugins/__init__.py             | 2 ++
+ sos/plugins/abrt.py                 | 2 ++
+ sos/plugins/acpid.py                | 2 ++
+ sos/plugins/anaconda.py             | 2 ++
+ sos/plugins/anacron.py              | 2 ++
+ sos/plugins/apache.py               | 2 ++
+ sos/plugins/apparmor.py             | 2 ++
+ sos/plugins/apport.py               | 2 ++
+ sos/plugins/apt.py                  | 2 ++
+ sos/plugins/ata.py                  | 2 ++
+ sos/plugins/auditd.py               | 2 ++
+ sos/plugins/autofs.py               | 2 ++
+ sos/plugins/azure.py                | 2 ++
+ sos/plugins/block.py                | 2 ++
+ sos/plugins/boot.py                 | 2 ++
+ sos/plugins/ceph.py                 | 2 ++
+ sos/plugins/cgroups.py              | 2 ++
+ sos/plugins/cluster.py              | 2 ++
+ sos/plugins/cobbler.py              | 2 ++
+ sos/plugins/corosync.py             | 2 ++
+ sos/plugins/cron.py                 | 2 ++
+ sos/plugins/cs.py                   | 2 ++
+ sos/plugins/cups.py                 | 2 ++
+ sos/plugins/devicemapper.py         | 2 ++
+ sos/plugins/dhcp.py                 | 2 ++
+ sos/plugins/distupgrade.py          | 2 ++
+ sos/plugins/dmraid.py               | 2 ++
+ sos/plugins/dovecot.py              | 2 ++
+ sos/plugins/dpkg.py                 | 2 ++
+ sos/plugins/ds.py                   | 2 ++
+ sos/plugins/emc.py                  | 2 ++
+ sos/plugins/filesys.py              | 2 ++
+ sos/plugins/foreman.py              | 2 ++
+ sos/plugins/gdm.py                  | 2 ++
+ sos/plugins/general.py              | 2 ++
+ sos/plugins/gluster.py              | 2 ++
+ sos/plugins/grub.py                 | 2 ++
+ sos/plugins/grub2.py                | 2 ++
+ sos/plugins/hardware.py             | 2 ++
+ sos/plugins/hts.py                  | 2 ++
+ sos/plugins/i18n.py                 | 2 ++
+ sos/plugins/infiniband.py           | 2 ++
+ sos/plugins/ipa.py                  | 2 ++
+ sos/plugins/ipsec.py                | 2 ++
+ sos/plugins/iscsi.py                | 2 ++
+ sos/plugins/iscsitarget.py          | 2 ++
+ sos/plugins/java.py                 | 2 ++
+ sos/plugins/juju.py                 | 2 ++
+ sos/plugins/katello.py              | 2 ++
+ sos/plugins/kdump.py                | 2 ++
+ sos/plugins/kernel.py               | 2 ++
+ sos/plugins/kernelrt.py             | 2 ++
+ sos/plugins/krb5.py                 | 2 ++
+ sos/plugins/kvm.py                  | 2 ++
+ sos/plugins/landscape.py            | 2 ++
+ sos/plugins/ldap.py                 | 2 ++
+ sos/plugins/libraries.py            | 2 ++
+ sos/plugins/libvirt.py              | 2 ++
+ sos/plugins/lilo.py                 | 2 ++
+ sos/plugins/logrotate.py            | 2 ++
+ sos/plugins/logs.py                 | 2 ++
+ sos/plugins/lsbrelease.py           | 2 ++
+ sos/plugins/lvm2.py                 | 2 ++
+ sos/plugins/maas.py                 | 2 ++
+ sos/plugins/md.py                   | 2 ++
+ sos/plugins/memory.py               | 2 ++
+ sos/plugins/mrggrid.py              | 2 ++
+ sos/plugins/mrgmessg.py             | 2 ++
+ sos/plugins/multipath.py            | 2 ++
+ sos/plugins/mysql.py                | 2 ++
+ sos/plugins/named.py                | 2 ++
+ sos/plugins/networking.py           | 2 ++
+ sos/plugins/neutron.py              | 2 ++
+ sos/plugins/nfs.py                  | 2 ++
+ sos/plugins/nfsserver.py            | 2 ++
+ sos/plugins/nis.py                  | 2 ++
+ sos/plugins/nscd.py                 | 2 ++
+ sos/plugins/ntp.py                  | 2 ++
+ sos/plugins/oddjob.py               | 2 ++
+ sos/plugins/openhpi.py              | 2 ++
+ sos/plugins/openshift.py            | 2 ++
+ sos/plugins/openssl.py              | 2 ++
+ sos/plugins/openstack_ceilometer.py | 2 ++
+ sos/plugins/openstack_cinder.py     | 2 ++
+ sos/plugins/openstack_glance.py     | 2 ++
+ sos/plugins/openstack_heat.py       | 2 ++
+ sos/plugins/openstack_horizon.py    | 2 ++
+ sos/plugins/openstack_keystone.py   | 2 ++
+ sos/plugins/openstack_neutron.py    | 2 ++
+ sos/plugins/openstack_nova.py       | 2 ++
+ sos/plugins/openstack_swift.py      | 2 ++
+ sos/plugins/openswan.py             | 2 ++
+ sos/plugins/pam.py                  | 2 ++
+ sos/plugins/pci.py                  | 2 ++
+ sos/plugins/postfix.py              | 2 ++
+ sos/plugins/postgresql.py           | 3 ++-
+ sos/plugins/powerpc.py              | 2 ++
+ sos/plugins/ppp.py                  | 2 ++
+ sos/plugins/procenv.py              | 2 ++
+ sos/plugins/process.py              | 2 ++
+ sos/plugins/processor.py            | 2 ++
+ sos/plugins/psacct.py               | 2 ++
+ sos/plugins/pxe.py                  | 2 ++
+ sos/plugins/qpid.py                 | 2 ++
+ sos/plugins/quagga.py               | 2 ++
+ sos/plugins/radius.py               | 2 ++
+ sos/plugins/rhui.py                 | 2 ++
+ sos/plugins/rpm.py                  | 2 ++
+ sos/plugins/s390.py                 | 2 ++
+ sos/plugins/samba.py                | 2 ++
+ sos/plugins/sanlock.py              | 2 ++
+ sos/plugins/sar.py                  | 2 ++
+ sos/plugins/satellite.py            | 2 ++
+ sos/plugins/scsi.py                 | 2 ++
+ sos/plugins/selinux.py              | 2 ++
+ sos/plugins/sendmail.py             | 2 ++
+ sos/plugins/smartcard.py            | 2 ++
+ sos/plugins/snmp.py                 | 2 ++
+ sos/plugins/soundcard.py            | 2 ++
+ sos/plugins/squid.py                | 2 ++
+ sos/plugins/ssh.py                  | 2 ++
+ sos/plugins/sssd.py                 | 2 ++
+ sos/plugins/startup.py              | 2 ++
+ sos/plugins/sunrpc.py               | 2 ++
+ sos/plugins/system.py               | 2 ++
+ sos/plugins/systemd.py              | 2 ++
+ sos/plugins/systemtap.py            | 2 ++
+ sos/plugins/sysvipc.py              | 2 ++
+ sos/plugins/tftpserver.py           | 2 ++
+ sos/plugins/tomcat.py               | 2 ++
+ sos/plugins/tuned.py                | 2 ++
+ sos/plugins/udev.py                 | 2 ++
+ sos/plugins/upstart.py              | 2 ++
+ sos/plugins/usb.py                  | 2 ++
+ sos/plugins/veritas.py              | 2 ++
+ sos/plugins/vmware.py               | 2 ++
+ sos/plugins/vsftpd.py               | 2 ++
+ sos/plugins/x11.py                  | 2 ++
+ sos/plugins/xen.py                  | 2 ++
+ sos/plugins/xfs.py                  | 2 ++
+ sos/plugins/xinetd.py               | 2 ++
+ sos/plugins/yum.py                  | 2 ++
+ sos/policies/__init__.py            | 2 ++
+ sos/policies/debian.py              | 2 ++
+ sos/policies/osx.py                 | 2 ++
+ sos/policies/redhat.py              | 3 ++-
+ sos/policies/ubuntu.py              | 2 ++
+ sos/policies/windows.py             | 2 ++
+ sos/reporting.py                    | 2 ++
+ sos/sosreport.py                    | 2 ++
+ sos/utilities.py                    | 2 ++
+ tests/archive_tests.py              | 2 ++
+ tests/importer_tests.py             | 2 ++
+ tests/option_tests.py               | 2 ++
+ tests/plugin_tests.py               | 2 ++
+ tests/policy_tests.py               | 2 ++
+ tests/report_tests.py               | 2 ++
+ tests/sosreport_pexpect.py          | 2 ++
+ tests/test_exe.py                   | 2 ++
+ tests/utilities_tests.py            | 2 ++
+ 165 files changed, 330 insertions(+), 2 deletions(-)
+
+diff --git a/__run__.py b/__run__.py
+index 663ee14..0f46807 100755
+--- a/__run__.py
++++ b/__run__.py
+@@ -15,3 +15,5 @@ from sos.sosreport import main
+ import sys
+ 
+ main(sys.argv[1:])
++
++# vim: et ts=4 sw=4
+diff --git a/example_plugins/example.py b/example_plugins/example.py
+index e13d92b..31e8c78 100755
+--- a/example_plugins/example.py
++++ b/example_plugins/example.py
+@@ -55,3 +55,5 @@ class example(Plugin, RedHatPlugin):
+         # Here's how to execute a command
+         self.collectExtOutput("/bin/ps -ef")
+ 
++
++# vim: et ts=4 sw=4
+diff --git a/setup.py b/setup.py
+index 0ae87b3..09d164f 100644
+--- a/setup.py
++++ b/setup.py
+@@ -70,3 +70,5 @@ setup(name='sosreport',
+       requires=['six'],
+      )
+ 
++
++# vim: et ts=4 sw=4
+diff --git a/sos/__init__.py b/sos/__init__.py
+index f2b8e32..fc6738b 100644
+--- a/sos/__init__.py
++++ b/sos/__init__.py
+@@ -32,3 +32,5 @@ def _default(msg):
+     return gettext.dgettext(gettext_app, msg)
+ 
+ _sos = _default
++
++# vim: et ts=4 sw=4
+diff --git a/sos/archive.py b/sos/archive.py
+index 9e6029b..3cca9b7 100644
+--- a/sos/archive.py
++++ b/sos/archive.py
+@@ -332,3 +332,5 @@ class ZipFileArchive(Archive):
+ 
+     def close(self):
+         self.zipfile.close()
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/__init__.py b/sos/plugins/__init__.py
+index d420cd0..9ee0b61 100644
+--- a/sos/plugins/__init__.py
++++ b/sos/plugins/__init__.py
+@@ -700,3 +700,5 @@ def import_plugin(name, superclasses=None):
+     if not superclasses:
+         superclasses = (Plugin,)
+     return import_module(plugin_fqname, superclasses)
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/abrt.py b/sos/plugins/abrt.py
+index 148d57a..660c0f7 100644
+--- a/sos/plugins/abrt.py
++++ b/sos/plugins/abrt.py
+@@ -44,3 +44,5 @@ class Abrt(Plugin, RedHatPlugin):
+             self.do_backtraces()
+ 
+ 
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/acpid.py b/sos/plugins/acpid.py
+index 9a2d123..b9371f0 100644
+--- a/sos/plugins/acpid.py
++++ b/sos/plugins/acpid.py
+@@ -31,3 +31,5 @@ class DebianAcpid(Acpid, DebianPlugin, UbuntuPlugin):
+     def setup(self):
+         self.add_copy_specs([
+             "/etc/acpi/events/powerbtn*"])
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/anaconda.py b/sos/plugins/anaconda.py
+index dcec704..e165ba7 100644
+--- a/sos/plugins/anaconda.py
++++ b/sos/plugins/anaconda.py
+@@ -44,3 +44,5 @@ class Anaconda(Plugin, RedHatPlugin):
+         self.do_file_sub("/root/anaconda-ks.cfg",
+                         r"(\s*rootpw\s*).*",
+                         r"\1******")
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/anacron.py b/sos/plugins/anacron.py
+index e9595a8..60efa27 100644
+--- a/sos/plugins/anacron.py
++++ b/sos/plugins/anacron.py
+@@ -27,3 +27,5 @@ class Anacron(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
+ 
+     def setup(self):
+         self.add_copy_specs(list(self.files))
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/apache.py b/sos/plugins/apache.py
+index d889125..bad943b 100644
+--- a/sos/plugins/apache.py
++++ b/sos/plugins/apache.py
+@@ -50,3 +50,5 @@ class DebianApache(Apache, DebianPlugin, UbuntuPlugin):
+             "/etc/default/apache2"])
+         if self.get_option("log"):
+             self.add_copy_spec("/var/log/apache2/*")
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/apparmor.py b/sos/plugins/apparmor.py
+index afdad18..76ca9db 100644
+--- a/sos/plugins/apparmor.py
++++ b/sos/plugins/apparmor.py
+@@ -25,3 +25,5 @@ class Apparmor(Plugin, UbuntuPlugin):
+         self.add_copy_specs([
+             "/etc/apparmor"
+         ])
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/apport.py b/sos/plugins/apport.py
+index e3a02ef..b7f884f 100644
+--- a/sos/plugins/apport.py
++++ b/sos/plugins/apport.py
+@@ -23,3 +23,5 @@ class Apport(Plugin, DebianPlugin, UbuntuPlugin):
+ 
+     def setup(self):
+         self.add_copy_spec("/etc/apport/*")
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/apt.py b/sos/plugins/apt.py
+index ad2fe1a..8aea629 100644
+--- a/sos/plugins/apt.py
++++ b/sos/plugins/apt.py
+@@ -29,3 +29,5 @@ class Apt(Plugin, DebianPlugin, UbuntuPlugin):
+         self.add_cmd_output("apt-config dump")
+         self.add_cmd_output("apt-cache stats")
+         self.add_cmd_output("apt-cache policy")
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/ata.py b/sos/plugins/ata.py
+index eb0f53f..f947455 100644
+--- a/sos/plugins/ata.py
++++ b/sos/plugins/ata.py
+@@ -34,3 +34,5 @@ class Ata(Plugin, RedHatPlugin, UbuntuPlugin, DebianPlugin):
+                     self.add_cmd_output("hdparm %s" % disk_path)
+                     self.add_cmd_output("smartctl -a %s" % disk_path)
+ 
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/auditd.py b/sos/plugins/auditd.py
+index c031e14..1f51306 100644
+--- a/sos/plugins/auditd.py
++++ b/sos/plugins/auditd.py
+@@ -28,3 +28,5 @@ class Auditd(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
+                             "/etc/audit/audit.rules"])
+         self.add_copy_spec_limit("/var/log/audit*",
+                 sizelimit = self.get_option("logsize"))
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/autofs.py b/sos/plugins/autofs.py
+index b1d264b..a4dbfea 100644
+--- a/sos/plugins/autofs.py
++++ b/sos/plugins/autofs.py
+@@ -65,3 +65,5 @@ class DebianAutofs(Autofs, DebianPlugin, UbuntuPlugin):
+     def setup(self):
+         super(DebianAutofs, self).setup()
+         self.add_cmd_output("dpkg-query -s autofs")
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/azure.py b/sos/plugins/azure.py
+index 65ba9ac..6f16c75 100644
+--- a/sos/plugins/azure.py
++++ b/sos/plugins/azure.py
+@@ -29,3 +29,5 @@ class Azure(Plugin, UbuntuPlugin):
+                            "/etc/default/kv-kvp-daemon-init",
+                            "/sys/module/hv_netvsc/parameters/ring_size",
+                            "/sys/module/hv_storvsc/parameters/storvsc_ringbuffer_size"])
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/block.py b/sos/plugins/block.py
+index 044345b..de0de81 100644
+--- a/sos/plugins/block.py
++++ b/sos/plugins/block.py
+@@ -41,3 +41,5 @@ class Block(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
+                 self.add_cmd_output("udevadm info -ap /sys/block/%s" % (disk))
+                 self.add_cmd_output("parted -s %s print" % (disk_path))
+                 self.add_cmd_output("fdisk -l %s" % disk_path)
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/boot.py b/sos/plugins/boot.py
+index bf50120..22ca155 100644
+--- a/sos/plugins/boot.py
++++ b/sos/plugins/boot.py
+@@ -42,3 +42,5 @@ class Boot(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
+                     continue
+                 self.add_cmd_output("lsinitrd %s" % image)
+ 
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/ceph.py b/sos/plugins/ceph.py
+index decd161..b408f8f 100644
+--- a/sos/plugins/ceph.py
++++ b/sos/plugins/ceph.py
+@@ -42,3 +42,5 @@ class Ceph(Plugin, RedHatPlugin, UbuntuPlugin):
+         self.add_forbidden_path("/etc/ceph/*keyring")
+         self.add_forbidden_path("/var/lib/ceph/*/*keyring")
+         self.add_forbidden_path("/var/lib/ceph/*keyring")
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/cgroups.py b/sos/plugins/cgroups.py
+index 102b71c..6f34e64 100644
+--- a/sos/plugins/cgroups.py
++++ b/sos/plugins/cgroups.py
+@@ -40,3 +40,5 @@ class RedHatCgroups(Cgroups, RedHatPlugin):
+                            "/etc/cgconfig.conf",
+                            "/etc/cgrules.conf"])
+ 
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/cluster.py b/sos/plugins/cluster.py
+index 0b839fa..f4ed405 100644
+--- a/sos/plugins/cluster.py
++++ b/sos/plugins/cluster.py
+@@ -126,3 +126,5 @@ class Cluster(Plugin, RedHatPlugin):
+                         r"(.*fence.*\.passwd=)(.*)",
+                         r"\1******")
+         return
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/cobbler.py b/sos/plugins/cobbler.py
+index b754813..061e2a6 100644
+--- a/sos/plugins/cobbler.py
++++ b/sos/plugins/cobbler.py
+@@ -40,3 +40,5 @@ class DebianCobbler(Cobbler, DebianPlugin, UbuntuPlugin):
+         self.add_copy_spec("/var/log/cobbler")
+         self.add_copy_spec("/var/lib/cobbler")
+         self.add_forbidden_path("/var/lib/cobbler/isos")
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/corosync.py b/sos/plugins/corosync.py
+index 79333c2..e91a9d4 100644
+--- a/sos/plugins/corosync.py
++++ b/sos/plugins/corosync.py
+@@ -51,3 +51,5 @@ class DebianCorosync(Corosync, DebianPlugin, UbuntuPlugin):
+         super(DebianCorosync, self).setup()
+ 
+     files = ('/usr/sbin/corosync',)
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/cron.py b/sos/plugins/cron.py
+index f0f4856..ae2b479 100644
+--- a/sos/plugins/cron.py
++++ b/sos/plugins/cron.py
+@@ -30,3 +30,5 @@ class Cron(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
+         ])
+         self.add_cmd_output("crontab -l -u root",
+                 suggest_filename = "root_crontab")
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/cs.py b/sos/plugins/cs.py
+index 3adf1f6..7ae79d3 100644
+--- a/sos/plugins/cs.py
++++ b/sos/plugins/cs.py
+@@ -87,3 +87,5 @@ class CertificateSystem(Plugin, RedHatPlugin):
+                 "/var/log/pki-*/ra-debug.log",
+                 "/var/log/pki-*/transactions",
+                 "/var/log/pki-*/system"])
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/cups.py b/sos/plugins/cups.py
+index aaa3971..17ca3cc 100644
+--- a/sos/plugins/cups.py
++++ b/sos/plugins/cups.py
+@@ -34,3 +34,5 @@ class Printing(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
+         self.add_cmd_output("lpstat -t")
+         self.add_cmd_output("lpstat -s")
+         self.add_cmd_output("lpstat -d")
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/devicemapper.py b/sos/plugins/devicemapper.py
+index 9e553c2..cc10268 100644
+--- a/sos/plugins/devicemapper.py
++++ b/sos/plugins/devicemapper.py
+@@ -27,3 +27,5 @@ class DeviceMapper(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
+         self.add_cmd_output("dmsetup status")
+         self.add_cmd_output("dmsetup ls --tree")
+ 
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/dhcp.py b/sos/plugins/dhcp.py
+index 71946c2..344e1e3 100644
+--- a/sos/plugins/dhcp.py
++++ b/sos/plugins/dhcp.py
+@@ -44,3 +44,5 @@ class UbuntuDhcp(Dhcp, UbuntuPlugin):
+             "/etc/default/udhcpd",
+             "/etc/udhcpd.conf"
+         ])
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/distupgrade.py b/sos/plugins/distupgrade.py
+index b45d099..d618dfc 100644
+--- a/sos/plugins/distupgrade.py
++++ b/sos/plugins/distupgrade.py
+@@ -37,3 +37,5 @@ class RedHatDistUpgrade(DistUpgrade, RedHatPlugin):
+     )
+ 
+ 
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/dmraid.py b/sos/plugins/dmraid.py
+index 12242bf..12613b5 100644
+--- a/sos/plugins/dmraid.py
++++ b/sos/plugins/dmraid.py
+@@ -25,3 +25,5 @@ class Dmraid(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
+     def setup(self):
+         for opt in self.dmraid_options:
+             self.add_cmd_output("dmraid -%s" % (opt,))
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/dovecot.py b/sos/plugins/dovecot.py
+index 2d92a6b..37e504b 100644
+--- a/sos/plugins/dovecot.py
++++ b/sos/plugins/dovecot.py
+@@ -41,3 +41,5 @@ class DebianDovecot(Dovecot, DebianPlugin, UbuntuPlugin):
+         super(DebianDovecot, self).setup()
+ 
+     files = ('/etc/dovecot/README',)
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/dpkg.py b/sos/plugins/dpkg.py
+index 1912e34..266b2ee 100644
+--- a/sos/plugins/dpkg.py
++++ b/sos/plugins/dpkg.py
+@@ -24,3 +24,5 @@ class Dpkg(Plugin, DebianPlugin, UbuntuPlugin):
+     def setup(self):
+         self.add_copy_spec("/var/log/dpkg.log")
+         self.add_cmd_output("dpkg -l", root_symlink = "installed-debs")
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/ds.py b/sos/plugins/ds.py
+index 1bbcd64..7092701 100644
+--- a/sos/plugins/ds.py
++++ b/sos/plugins/ds.py
+@@ -46,3 +46,5 @@ class DirectoryServer(Plugin, RedHatPlugin):
+             self.add_copy_specs([
+                 "/opt/redhat-ds/slapd-*/config",
+                 "/opt/redhat-ds/slapd-*/logs"])
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/emc.py b/sos/plugins/emc.py
+index 5a2495e..d5fb1ed 100644
+--- a/sos/plugins/emc.py
++++ b/sos/plugins/emc.py
+@@ -219,3 +219,5 @@ class Emc(Plugin, RedHatPlugin):
+         ## Only provide About EMC if EMC products are installed
+         if add_about_emc != "no":
+             self.about_emc()
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/filesys.py b/sos/plugins/filesys.py
+index 7564ddf..9deb75d 100644
+--- a/sos/plugins/filesys.py
++++ b/sos/plugins/filesys.py
+@@ -48,3 +48,5 @@ class Filesys(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
+             ext_fs_regex = r"^(/dev/.+).+ext[234]\s+"
+             for dev in zip(self.do_regex_find_all(ext_fs_regex, mounts)):
+                 self.add_cmd_output("dumpe2fs -h %s" % (dev))
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/foreman.py b/sos/plugins/foreman.py
+index a2f2881..661c075 100644
+--- a/sos/plugins/foreman.py
++++ b/sos/plugins/foreman.py
+@@ -27,3 +27,5 @@ class Foreman(Plugin, RedHatPlugin):
+     def setup(self):
+         self.add_cmd_output("%s -q -a -d %s" % ("foreman-debug",
+                            self.get_cmd_output_path(name="foreman-debug")))
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/gdm.py b/sos/plugins/gdm.py
+index 05601f3..3863813 100644
+--- a/sos/plugins/gdm.py
++++ b/sos/plugins/gdm.py
+@@ -22,3 +22,5 @@ class Gdm(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
+ 
+     def setup(self):
+         self.add_copy_spec("/etc/gdm/*")
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/general.py b/sos/plugins/general.py
+index a6964c4..0906de1 100644
+--- a/sos/plugins/general.py
++++ b/sos/plugins/general.py
+@@ -78,3 +78,5 @@ class UbuntuGeneral(DebianGeneral):
+     def setup(self):
+         super(UbuntuGeneral, self).setup()
+         self.add_copy_spec("/etc/os-release")
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/gluster.py b/sos/plugins/gluster.py
+index 4286b59..d9c35d3 100644
+--- a/sos/plugins/gluster.py
++++ b/sos/plugins/gluster.py
+@@ -113,3 +113,5 @@ class Gluster(Plugin, RedHatPlugin):
+         # collect this last as some of the other actions create log entries
+         self.add_copy_spec("/var/log/glusterfs")
+ 
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/grub.py b/sos/plugins/grub.py
+index bdda115..cc4d593 100644
+--- a/sos/plugins/grub.py
++++ b/sos/plugins/grub.py
+@@ -29,3 +29,5 @@ class Grub(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
+             "/etc/grub.d"
+         ])
+ 
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/grub2.py b/sos/plugins/grub2.py
+index fd86211..c9f64b0 100644
+--- a/sos/plugins/grub2.py
++++ b/sos/plugins/grub2.py
+@@ -32,3 +32,5 @@ class Grub2(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
+         ])
+         self.add_cmd_output("ls -lanR /boot")
+         self.add_cmd_output("grub2-mkconfig")
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/hardware.py b/sos/plugins/hardware.py
+index eda0060..f3c968e 100644
+--- a/sos/plugins/hardware.py
++++ b/sos/plugins/hardware.py
+@@ -53,3 +53,5 @@ class DebianHardware(Hardware, DebianPlugin, UbuntuPlugin):
+ 
+     def setup(self):
+         super(DebianHardware, self).setup()
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/hts.py b/sos/plugins/hts.py
+index d514bf8..2200793 100644
+--- a/sos/plugins/hts.py
++++ b/sos/plugins/hts.py
+@@ -23,3 +23,5 @@ class HardwareTestSuite(Plugin, RedHatPlugin):
+     def setup(self):
+         self.add_copy_spec("/etc/httpd/conf.d/hts.conf")
+         self.add_copy_spec("/var/hts")
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/i18n.py b/sos/plugins/i18n.py
+index 0361c55..dd2b36a 100644
+--- a/sos/plugins/i18n.py
++++ b/sos/plugins/i18n.py
+@@ -23,3 +23,5 @@ class I18n(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
+     def setup(self):
+         self.add_copy_specs(["/etc/X11/xinit/xinput.d/*", "/etc/locale.conf"])
+         self.add_cmd_output("locale")
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/infiniband.py b/sos/plugins/infiniband.py
+index e1288c9..2c890a5 100644
+--- a/sos/plugins/infiniband.py
++++ b/sos/plugins/infiniband.py
+@@ -39,3 +39,5 @@ class Infiniband(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
+         self.add_cmd_output("ibhosts")
+ 
+         return
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/ipa.py b/sos/plugins/ipa.py
+index 0061659..2812939 100644
+--- a/sos/plugins/ipa.py
++++ b/sos/plugins/ipa.py
+@@ -81,3 +81,5 @@ class Ipa(Plugin, RedHatPlugin):
+         subst = r"\1********"
+         self.do_file_sub("/etc/named.conf", match, subst)
+ 
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/ipsec.py b/sos/plugins/ipsec.py
+index 1f00d51..b389432 100644
+--- a/sos/plugins/ipsec.py
++++ b/sos/plugins/ipsec.py
+@@ -42,3 +42,5 @@ class DebianIPSec(IPSec, DebianPlugin, UbuntuPlugin):
+         self.add_copy_specs(["/etc/ipsec-tools.conf",
+                            "/etc/ipsec-tools.d",
+                            "/etc/default/setkey"])
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/iscsi.py b/sos/plugins/iscsi.py
+index 2a49ee4..3dbecf4 100644
+--- a/sos/plugins/iscsi.py
++++ b/sos/plugins/iscsi.py
+@@ -37,3 +37,5 @@ class RedHatIscsi(Iscsi, RedHatPlugin):
+         self.add_cmd_output("iscsiadm -m node -P 3")
+         self.add_cmd_output("iscsiadm -m iface -P 1")
+         self.add_cmd_output("iscsiadm -m node --op=show")
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/iscsitarget.py b/sos/plugins/iscsitarget.py
+index a3a3e7e..d91c222 100644
+--- a/sos/plugins/iscsitarget.py
++++ b/sos/plugins/iscsitarget.py
+@@ -47,3 +47,5 @@ class DebianIscsiTarget(IscsiTarget, DebianPlugin, UbuntuPlugin):
+             "/etc/sysctl.d/30-iscsitarget.conf",
+             "/etc/default/iscsitarget"
+             ])
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/java.py b/sos/plugins/java.py
+index bad726c..d316bc1 100644
+--- a/sos/plugins/java.py
++++ b/sos/plugins/java.py
+@@ -27,3 +27,5 @@ class Java(Plugin, RedHatPlugin, UbuntuPlugin, DebianPlugin):
+                                         root_symlink="java")
+         self.add_cmd_output("readlink -f /usr/bin/java")
+ 
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/juju.py b/sos/plugins/juju.py
+index c7bbdf1..ef2cdbf 100644
+--- a/sos/plugins/juju.py
++++ b/sos/plugins/juju.py
+@@ -28,3 +28,5 @@ class Juju(Plugin, UbuntuPlugin):
+ 
+         self.add_cmd_output("juju -v status")
+         self.add_cmd_output("juju -v get-constraints")
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/katello.py b/sos/plugins/katello.py
+index acf5d90..6fd0fb7 100644
+--- a/sos/plugins/katello.py
++++ b/sos/plugins/katello.py
+@@ -27,3 +27,5 @@ class Katello(Plugin, RedHatPlugin):
+     def setup(self):
+         self.add_cmd_output("katello-debug --notar -d %s"
+                             % self.get_cmd_output_path(name="katello-debug"))
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/kdump.py b/sos/plugins/kdump.py
+index 81ce574..460d69e 100644
+--- a/sos/plugins/kdump.py
++++ b/sos/plugins/kdump.py
+@@ -50,3 +50,5 @@ class DebianKDump(KDump, DebianPlugin, UbuntuPlugin):
+         self.add_copy_specs([
+             "/etc/default/kdump-tools"
+         ])
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/kernel.py b/sos/plugins/kernel.py
+index f96fe6c..d40f549 100644
+--- a/sos/plugins/kernel.py
++++ b/sos/plugins/kernel.py
+@@ -66,3 +66,5 @@ class Kernel(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
+         ])
+ 
+         self.add_cmd_output("dkms status")
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/kernelrt.py b/sos/plugins/kernelrt.py
+index b5fdc5d..ad5c4e7 100644
+--- a/sos/plugins/kernelrt.py
++++ b/sos/plugins/kernelrt.py
+@@ -35,3 +35,5 @@ class KernelRT(Plugin, RedHatPlugin):
+         self.add_copy_spec('/sys/devices/system/clocksource/clocksource0/current_clocksource')
+         if self.is_installed('tuna'):
+             self.add_cmd_output('tuna -CP | /usthead -20')
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/krb5.py b/sos/plugins/krb5.py
+index 0d33094..78a8c6a 100644
+--- a/sos/plugins/krb5.py
++++ b/sos/plugins/krb5.py
+@@ -26,3 +26,5 @@ class Krb5(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
+         self.add_copy_spec("/etc/krb5.conf")
+         self.add_cmd_output("klist -ket /etc/krb5.keytab")
+ 
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/kvm.py b/sos/plugins/kvm.py
+index a0c44c1..51b8488 100644
+--- a/sos/plugins/kvm.py
++++ b/sos/plugins/kvm.py
+@@ -42,3 +42,5 @@ class Kvm(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
+     def postproc(self):
+         if self._debugfs_cleanup and os.path.ismount("/sys/kernel/debug"):
+             os.popen("umount /sys/kernel/debug")
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/landscape.py b/sos/plugins/landscape.py
+index 4096039..699786f 100644
+--- a/sos/plugins/landscape.py
++++ b/sos/plugins/landscape.py
+@@ -71,3 +71,5 @@ class Landscape(Plugin, UbuntuPlugin):
+         )
+         
+                                                     
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/ldap.py b/sos/plugins/ldap.py
+index 79d8394..eb8e755 100644
+--- a/sos/plugins/ldap.py
++++ b/sos/plugins/ldap.py
+@@ -82,3 +82,5 @@ class DebianLdap(Ldap, DebianPlugin, UbuntuPlugin):
+         self.do_cmd_output_sub(
+         "ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:/// -b cn=config '(!(objectClass=olcSchemaConfig))'",
+             r"(olcRootPW\: \s*)\S+", r"\1********")
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/libraries.py b/sos/plugins/libraries.py
+index 1ab5f17..b6e6195 100644
+--- a/sos/plugins/libraries.py
++++ b/sos/plugins/libraries.py
+@@ -28,3 +28,5 @@ class Libraries(Plugin, RedHatPlugin, UbuntuPlugin):
+         if self.get_option("ldconfigv"):
+             self.add_cmd_output("ldconfig -v -N -X")
+         self.add_cmd_output("ldconfig -p -N -X")
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/libvirt.py b/sos/plugins/libvirt.py
+index e525f1b..c031409 100644
+--- a/sos/plugins/libvirt.py
++++ b/sos/plugins/libvirt.py
+@@ -29,3 +29,5 @@ class Libvirt(Plugin, RedHatPlugin, UbuntuPlugin, DebianPlugin):
+             self.do_file_sub(xmlfile,
+                     r"(\s*passwd=\s*')([^']*)('.*$)",
+                     r"\1******\3")
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/lilo.py b/sos/plugins/lilo.py
+index 237cfc6..46c1814 100644
+--- a/sos/plugins/lilo.py
++++ b/sos/plugins/lilo.py
+@@ -24,3 +24,5 @@ class Lilo(Plugin, RedHatPlugin, UbuntuPlugin):
+     def setup(self):
+         self.add_copy_spec("/etc/lilo.conf")
+         self.add_cmd_output("lilo -q")
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/logrotate.py b/sos/plugins/logrotate.py
+index c4b1fc5..1ab4410 100644
+--- a/sos/plugins/logrotate.py
++++ b/sos/plugins/logrotate.py
+@@ -26,3 +26,5 @@ class LogRotate(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
+         self.add_copy_specs([
+             "/etc/logrotate*",
+             "/var/lib/logrotate.status"])
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/logs.py b/sos/plugins/logs.py
+index 7e7545f..1cd767c 100644
+--- a/sos/plugins/logs.py
++++ b/sos/plugins/logs.py
+@@ -85,3 +85,5 @@ class UbuntuLogs(Logs, UbuntuPlugin):
+             "/var/log/landscape",
+         ])
+ 
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/lsbrelease.py b/sos/plugins/lsbrelease.py
+index e364a17..7a8ceed 100644
+--- a/sos/plugins/lsbrelease.py
++++ b/sos/plugins/lsbrelease.py
+@@ -26,3 +26,5 @@ class LsbRelease(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
+         self.add_cmd_output("lsb_release -a")
+         self.add_cmd_output("lsb_release -d", suggest_filename = "lsb_release", root_symlink = "lsb-release")
+         self.add_copy_spec("/etc/lsb-release*")
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/lvm2.py b/sos/plugins/lvm2.py
+index 102df26..82f7255 100644
+--- a/sos/plugins/lvm2.py
++++ b/sos/plugins/lvm2.py
+@@ -53,3 +53,5 @@ class Lvm2(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
+             self.do_lvmdump(metadata=True)
+ 
+ 
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/maas.py b/sos/plugins/maas.py
+index 4ed94d4..af0db3d 100644
+--- a/sos/plugins/maas.py
++++ b/sos/plugins/maas.py
+@@ -34,3 +34,5 @@ class Maas(Plugin, UbuntuPlugin):
+         self.add_cmd_output("apt-cache policy maas-*")
+         self.add_cmd_output("apt-cache policy python-django-*")
+         self.add_cmd_output("maas dumpdata")
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/md.py b/sos/plugins/md.py
+index ecba0f7..2f9e8ef 100644
+--- a/sos/plugins/md.py
++++ b/sos/plugins/md.py
+@@ -29,3 +29,5 @@ class Md(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
+             "/dev/md/md-device-map"
+         ])
+         
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/memory.py b/sos/plugins/memory.py
+index 0b26a84..f2ec27c 100644
+--- a/sos/plugins/memory.py
++++ b/sos/plugins/memory.py
+@@ -32,3 +32,5 @@ class Memory(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
+                             suggest_filename="dmesg.e820-map")
+         self.add_cmd_output("free", root_symlink = "free")
+         self.add_cmd_output("free -m")
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/mrggrid.py b/sos/plugins/mrggrid.py
+index a8e7e35..05fde9b 100644
+--- a/sos/plugins/mrggrid.py
++++ b/sos/plugins/mrggrid.py
+@@ -23,3 +23,5 @@ class MrgGrid(Plugin, RedHatPlugin):
+     def setup(self):
+         self.add_copy_spec("/etc/condor/condor_config")
+         self.add_copy_spec("condor_status")
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/mrgmessg.py b/sos/plugins/mrgmessg.py
+index 4e85db6..f29ce74 100644
+--- a/sos/plugins/mrgmessg.py
++++ b/sos/plugins/mrgmessg.py
+@@ -25,3 +25,5 @@ class MrgMessg(Plugin, RedHatPlugin):
+             "/etc/qpidd.conf",
+             "/etc/sasl2/qpidd.conf",
+             "/var/rhm"])
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/multipath.py b/sos/plugins/multipath.py
+index 7917352..0eceadf 100644
+--- a/sos/plugins/multipath.py
++++ b/sos/plugins/multipath.py
+@@ -30,3 +30,5 @@ class Multipath(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
+         self.add_cmd_output("multipath -v4 -ll")
+ 
+ 
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/mysql.py b/sos/plugins/mysql.py
+index e3c971f..b168e13 100644
+--- a/sos/plugins/mysql.py
++++ b/sos/plugins/mysql.py
+@@ -50,3 +50,5 @@ class DebianMysql(Mysql, DebianPlugin, UbuntuPlugin):
+         self.mysql_cnf = "/etc/mysql/my.cnf"
+         super(DebianMysql, self).setup()
+         self.add_copy_spec("/etc/mysql/conf.d/mysql*")
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/named.py b/sos/plugins/named.py
+index e73bf42..6c68091 100644
+--- a/sos/plugins/named.py
++++ b/sos/plugins/named.py
+@@ -84,3 +84,5 @@ class DebianNamed(Named, DebianPlugin, UbuntuPlugin):
+         self.add_copy_spec("/etc/bind/")
+         return
+ 
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/networking.py b/sos/plugins/networking.py
+index 598d375..ce5b3aa 100644
+--- a/sos/plugins/networking.py
++++ b/sos/plugins/networking.py
+@@ -153,3 +153,5 @@ class UbuntuNetworking(Networking, UbuntuPlugin):
+         if self.get_option("traceroute"):
+             self.add_cmd_output("/usr/sbin/traceroute -n %s" % self.trace_host)
+ 
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/neutron.py b/sos/plugins/neutron.py
+index 2317433..2200606 100644
+--- a/sos/plugins/neutron.py
++++ b/sos/plugins/neutron.py
+@@ -176,3 +176,5 @@ class RedHatNeutron(Neutron, RedHatPlugin):
+         super(RedHatNeutron, self).setup()
+         self.packages = self.gen_pkg_tuple(self.package_list_template)
+         self.add_copy_specs(["/etc/sudoers.d/%s-rootwrap" % self.component_name])
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/nfs.py b/sos/plugins/nfs.py
+index 2e00333..5b6ffa0 100644
+--- a/sos/plugins/nfs.py
++++ b/sos/plugins/nfs.py
+@@ -29,3 +29,5 @@ class Nfs(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
+         ])
+         return
+ 
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/nfsserver.py b/sos/plugins/nfsserver.py
+index 7ae704e..5ba8c4b 100644
+--- a/sos/plugins/nfsserver.py
++++ b/sos/plugins/nfsserver.py
+@@ -49,3 +49,5 @@ class NfsServer(Plugin, RedHatPlugin):
+         self.add_cmd_output("rpcinfo -p localhost")
+         self.add_cmd_output("nfsstat -o all")
+ 
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/nis.py b/sos/plugins/nis.py
+index baa71e8..cec8aaa 100644
+--- a/sos/plugins/nis.py
++++ b/sos/plugins/nis.py
+@@ -30,3 +30,5 @@ class Nis(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
+         self.add_copy_spec("/etc/yp*.conf")
+         self.add_copy_spec("/var/yp/*")
+         self.add_cmd_output("domainname")
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/nscd.py b/sos/plugins/nscd.py
+index 91a31ef..339f52e 100644
+--- a/sos/plugins/nscd.py
++++ b/sos/plugins/nscd.py
+@@ -37,3 +37,5 @@ class Nscd(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
+                 f = o.split()
+                 self.add_copy_spec_limit(f[1],
+                     sizelimit = self.option_enabled("nscdlogsize"))
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/ntp.py b/sos/plugins/ntp.py
+index 639b292..0fba6f2 100644
+--- a/sos/plugins/ntp.py
++++ b/sos/plugins/ntp.py
+@@ -49,3 +49,5 @@ class DebianNtp(Ntp, DebianPlugin, UbuntuPlugin):
+         super(DebianNtp, self).setup()
+         self.add_copy_spec('/etc/default/ntp')
+ 
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/oddjob.py b/sos/plugins/oddjob.py
+index 473a691..ea168eb 100644
+--- a/sos/plugins/oddjob.py
++++ b/sos/plugins/oddjob.py
+@@ -29,3 +29,5 @@ class Oddjob(Plugin, RedHatPlugin):
+         self.add_copy_spec("/etc/oddjobd.conf")
+         self.add_copy_spec("/etc/oddjobd.conf.d")
+         self.add_copy_spec("/etc/dbus-1/system.d/oddjob.conf")
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/openhpi.py b/sos/plugins/openhpi.py
+index dbe004d..80053ed 100644
+--- a/sos/plugins/openhpi.py
++++ b/sos/plugins/openhpi.py
+@@ -31,3 +31,5 @@ class OpenHPI(Plugin, RedHatPlugin):
+         self.do_file_sub("/etc/openhpi/openhpi.conf",
+                         r'(\s*[Pp]ass.*\s*=\s*).*', r'\1********')
+ 
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/openshift.py b/sos/plugins/openshift.py
+index 459e75e..4eaf236 100644
+--- a/sos/plugins/openshift.py
++++ b/sos/plugins/openshift.py
+@@ -70,3 +70,5 @@ class Openshift(Plugin, RedHatPlugin):
+ 	    self.do_file_sub('/etc/openshift/htpasswd',
+ 			    r"(.*:)(.*)",
+ 			    r"\1********")
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/openssl.py b/sos/plugins/openssl.py
+index c73181b..261ad07 100644
+--- a/sos/plugins/openssl.py
++++ b/sos/plugins/openssl.py
+@@ -53,3 +53,5 @@ class DebianOpenSSL(OpenSSL, DebianPlugin, UbuntuPlugin):
+     def setup(self):
+         super(DebianOpenSSL, self).setup()
+         self.add_copy_spec("/etc/ssl/openssl.cnf")
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/openstack_ceilometer.py b/sos/plugins/openstack_ceilometer.py
+index 524b68b..4b877d6 100644
+--- a/sos/plugins/openstack_ceilometer.py
++++ b/sos/plugins/openstack_ceilometer.py
+@@ -51,3 +51,5 @@ class RedHatOpenStackCeilometer(OpenStackCeilometer, plugins.RedHatPlugin):
+                 'openstack-ceilometer-common',
+                 'openstack-ceilometer-compute',
+                 'python-ceilometerclient')
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/openstack_cinder.py b/sos/plugins/openstack_cinder.py
+index 97eb8fb..41f99c4 100644
+--- a/sos/plugins/openstack_cinder.py
++++ b/sos/plugins/openstack_cinder.py
+@@ -79,3 +79,5 @@ class RedHatOpenStackCinder(OpenStackCinder, RedHatPlugin):
+         super(RedHatOpenStackCinder, self).setup()
+         self.add_copy_specs(["/etc/sudoers.d/cinder"])
+ 
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/openstack_glance.py b/sos/plugins/openstack_glance.py
+index 134d23f..ae8851e 100644
+--- a/sos/plugins/openstack_glance.py
++++ b/sos/plugins/openstack_glance.py
+@@ -52,3 +52,5 @@ class RedHatOpenStackGlance(OpenStackGlance, plugins.RedHatPlugin):
+ 
+     packages = ('openstack-glance',
+                 'python-glanceclient')
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/openstack_heat.py b/sos/plugins/openstack_heat.py
+index 15c26c9..68989bb 100644
+--- a/sos/plugins/openstack_heat.py
++++ b/sos/plugins/openstack_heat.py
+@@ -57,3 +57,5 @@ class RedHatOpenStack(OpenStackHeat, plugins.RedHatPlugin):
+                 'openstack-heat-common',
+                 'openstack-heat-engine',
+                 'python-heatclient')
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/openstack_horizon.py b/sos/plugins/openstack_horizon.py
+index 31ee561..c814b01 100644
+--- a/sos/plugins/openstack_horizon.py
++++ b/sos/plugins/openstack_horizon.py
+@@ -72,3 +72,5 @@ class RedHatOpenStackHorizon(OpenStackHorizon, RedHatPlugin):
+         self.add_copy_specs(["/etc/httpd/conf.d/openstack-dashboard.conf"])
+         if self.option_enabled("log"):
+             self.add_copy_specs(["/var/log/httpd/"])
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/openstack_keystone.py b/sos/plugins/openstack_keystone.py
+index 0f3b654..6e94558 100644
+--- a/sos/plugins/openstack_keystone.py
++++ b/sos/plugins/openstack_keystone.py
+@@ -71,3 +71,5 @@ class RedHatOpenStackKeystone(OpenStackKeystone, RedHatPlugin):
+                 'python-keystone',
+                 'python-django-openstack-auth',
+                 'python-keystoneclient')
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/openstack_neutron.py b/sos/plugins/openstack_neutron.py
+index d063a7c..bda9c5e 100644
+--- a/sos/plugins/openstack_neutron.py
++++ b/sos/plugins/openstack_neutron.py
+@@ -88,3 +88,5 @@ class RedHatOpenStackNeutron(OpenStackNeutron, RedHatPlugin):
+ 
+     def setup(self):
+         super(RedHatOpenStackNeutron, self).setup()
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/openstack_nova.py b/sos/plugins/openstack_nova.py
+index 2e7c956..d294d16 100644
+--- a/sos/plugins/openstack_nova.py
++++ b/sos/plugins/openstack_nova.py
+@@ -142,3 +142,5 @@ class RedHatOpenStackNova(OpenStackNova, RedHatPlugin):
+                 "/etc/sudoers.d/nova",
+                 "/etc/security/limits.d/91-nova.conf",
+                 "/etc/sysconfig/openstack-nova-novncproxy"])
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/openstack_swift.py b/sos/plugins/openstack_swift.py
+index 1b67484..2514323 100644
+--- a/sos/plugins/openstack_swift.py
++++ b/sos/plugins/openstack_swift.py
+@@ -52,3 +52,5 @@ class RedHatOpenStackSwift(OpenStackSwift, plugins.RedHatPlugin):
+                 'openstack-swift-proxy',
+                 'swift',
+                 'python-swiftclient')
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/openswan.py b/sos/plugins/openswan.py
+index c99968c..0712c76 100644
+--- a/sos/plugins/openswan.py
++++ b/sos/plugins/openswan.py
+@@ -35,3 +35,5 @@ class Openswan(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
+         self.add_cmd_output("ipsec verify")
+         if self.get_option("ipsec-barf"):
+             self.add_cmd_output("ipsec barf")
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/pam.py b/sos/plugins/pam.py
+index 307a405..c78d4f9 100644
+--- a/sos/plugins/pam.py
++++ b/sos/plugins/pam.py
+@@ -43,3 +43,5 @@ class DebianPam(Pam, DebianPlugin, UbuntuPlugin):
+     def setup(self):
+         super(DebianPam, self).setup()
+ 
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/pci.py b/sos/plugins/pci.py
+index 390776f..e15b978 100644
+--- a/sos/plugins/pci.py
++++ b/sos/plugins/pci.py
+@@ -34,3 +34,5 @@ class Pci(Plugin, RedHatPlugin, UbuntuPlugin, DebianPlugin):
+         self.add_cmd_output("lspci -tv")
+ 
+ 
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/postfix.py b/sos/plugins/postfix.py
+index 6f0f9b4..0300a5b 100644
+--- a/sos/plugins/postfix.py
++++ b/sos/plugins/postfix.py
+@@ -48,3 +48,5 @@ class DebianPostfix(Postfix, DebianPlugin, UbuntuPlugin):
+     def setup(self):
+         super(DebianPostfix, self).setup()
+         self.add_copy_spec("/etc/postfix/dynamicmaps.cf")
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/postgresql.py b/sos/plugins/postgresql.py
+index cc51195..69084af 100644
+--- a/sos/plugins/postgresql.py
++++ b/sos/plugins/postgresql.py
+@@ -148,4 +148,5 @@ class DebianPostgreSQL(PostgreSQL, DebianPlugin, UbuntuPlugin):
+         self.add_copy_spec("/var/lib/postgresql/*/main/PG_VERSION")
+         self.add_copy_spec("/var/lib/postgresql/*/main/postmaster.opts")
+ 
+-# vim: expandtab tabstop=4 shiftwidth=4
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/powerpc.py b/sos/plugins/powerpc.py
+index 9681094..11ce56d 100644
+--- a/sos/plugins/powerpc.py
++++ b/sos/plugins/powerpc.py
+@@ -76,3 +76,5 @@ class PowerPC(Plugin, RedHatPlugin, UbuntuPlugin, DebianPlugin):
+             if os.path.isdir("/var/log/dump"):
+                 self.add_cmd_output("ls -l /var/log/dump")
+ 
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/ppp.py b/sos/plugins/ppp.py
+index edb3eb4..a0446a5 100644
+--- a/sos/plugins/ppp.py
++++ b/sos/plugins/ppp.py
+@@ -30,3 +30,5 @@ class Ppp(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
+             "/etc/ppp",
+             "/var/log/ppp"])
+         self.add_cmd_output("adsl-status")
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/procenv.py b/sos/plugins/procenv.py
+index d413cd1..e776e14 100644
+--- a/sos/plugins/procenv.py
++++ b/sos/plugins/procenv.py
+@@ -23,3 +23,5 @@ class Procenv(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
+ 
+     def setup(self):
+         self.add_cmd_output('procenv')
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/process.py b/sos/plugins/process.py
+index 02eaa58..6d8f640 100644
+--- a/sos/plugins/process.py
++++ b/sos/plugins/process.py
+@@ -27,3 +27,5 @@ class Process(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
+         self.add_cmd_output("ps alxwww")
+         self.add_cmd_output("pstree", root_symlink = "pstree")
+         self.add_cmd_output("lsof -b +M -n -l", root_symlink = "lsof")
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/processor.py b/sos/plugins/processor.py
+index 3b21894..391c64f 100644
+--- a/sos/plugins/processor.py
++++ b/sos/plugins/processor.py
+@@ -45,3 +45,5 @@ class Processor(Plugin, RedHatPlugin, UbuntuPlugin, DebianPlugin):
+         self.add_cmd_output("lscpu")
+ 
+ 
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/psacct.py b/sos/plugins/psacct.py
+index 74bd9f0..dadd62a 100644
+--- a/sos/plugins/psacct.py
++++ b/sos/plugins/psacct.py
+@@ -49,3 +49,5 @@ class DebianPsacct(Psacct, DebianPlugin, UbuntuPlugin):
+         self.add_copy_specs(["/var/log/account/pacct", "/etc/default/acct"])
+         if self.get_option("all"):
+             self.add_copy_spec("/var/log/account/pacct*.gz")
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/pxe.py b/sos/plugins/pxe.py
+index fcb1a4b..7a552e8 100644
+--- a/sos/plugins/pxe.py
++++ b/sos/plugins/pxe.py
+@@ -51,3 +51,5 @@ class DebianPxe(Pxe, DebianPlugin, UbuntuPlugin):
+         self.add_copy_spec("/etc/default/tftpd-hpa")
+         if self.get_option("tftpboot"):
+             self.add_copy_spec("/var/lib/tftpboot")
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/qpid.py b/sos/plugins/qpid.py
+index cee8443..2fda9a4 100644
+--- a/sos/plugins/qpid.py
++++ b/sos/plugins/qpid.py
+@@ -50,3 +50,5 @@ class Qpid(Plugin, RedHatPlugin):
+             "/var/log/sesame",
+             "/var/log/cumin",
+             "/var/log/cluster"])
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/quagga.py b/sos/plugins/quagga.py
+index 909f9d4..88a41a7 100644
+--- a/sos/plugins/quagga.py
++++ b/sos/plugins/quagga.py
+@@ -27,3 +27,5 @@ class Quagga(Plugin, RedHatPlugin):
+ 
+     def setup(self):
+         self.add_copy_spec("/etc/quagga/")
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/radius.py b/sos/plugins/radius.py
+index 427fd25..a64ea35 100644
+--- a/sos/plugins/radius.py
++++ b/sos/plugins/radius.py
+@@ -48,3 +48,5 @@ class DebianRadius(Radius, DebianPlugin, UbuntuPlugin):
+                            "/etc/pam.d/radiusd",
+                            "/etc/default/freeradius",
+                            "/var/log/freeradius"])
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/rhui.py b/sos/plugins/rhui.py
+index f0413b4..a0ef512 100644
+--- a/sos/plugins/rhui.py
++++ b/sos/plugins/rhui.py
+@@ -37,3 +37,5 @@ class Rhui(Plugin, RedHatPlugin):
+                 % (self.rhui_debug_path, cds, rhui_debug_dst_path),
+                 suggest_filename="rhui-debug")
+         return
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/rpm.py b/sos/plugins/rpm.py
+index 55c8019..6c1529c 100644
+--- a/sos/plugins/rpm.py
++++ b/sos/plugins/rpm.py
+@@ -53,3 +53,5 @@ class Rpm(Plugin, RedHatPlugin):
+                     or pkg.endswith('-debuginfo-common'):
+                         continue
+                     self.add_cmd_output("rpm -V %s" % pkg)
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/s390.py b/sos/plugins/s390.py
+index ed9546b..7645b1b 100644
+--- a/sos/plugins/s390.py
++++ b/sos/plugins/s390.py
+@@ -65,3 +65,5 @@ class S390(Plugin, RedHatPlugin):
+             self.add_cmd_output("dasdview -x -i -j -l -f %s" % (x,))
+             self.add_cmd_output("fdasd -p %s" % (x,))
+ 
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/samba.py b/sos/plugins/samba.py
+index f3dc862..6efab2f 100644
+--- a/sos/plugins/samba.py
++++ b/sos/plugins/samba.py
+@@ -28,3 +28,5 @@ class Samba(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
+         self.add_cmd_output("wbinfo --domain='.' -u")
+         self.add_cmd_output("testparm -s -v")
+ 
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/sanlock.py b/sos/plugins/sanlock.py
+index 232dd00..4386f3f 100644
+--- a/sos/plugins/sanlock.py
++++ b/sos/plugins/sanlock.py
+@@ -34,3 +34,5 @@ class RedHatSANLock(SANLock, RedHatPlugin):
+     def setup(self):
+         super(RedHatSANLock, self).setup()
+         self.add_copy_spec("/etc/sysconfig/sanlock")
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/sar.py b/sos/plugins/sar.py
+index 470d82f..56cc637 100644
+--- a/sos/plugins/sar.py
++++ b/sos/plugins/sar.py
+@@ -66,3 +66,5 @@ class DebianSar(Sar, DebianPlugin, UbuntuPlugin):
+     """
+     
+     sa_path = '/var/log/sysstat'
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/satellite.py b/sos/plugins/satellite.py
+index 28c8bca..936f3c5 100644
+--- a/sos/plugins/satellite.py
++++ b/sos/plugins/satellite.py
+@@ -81,3 +81,5 @@ class Satellite(Plugin, RedHatPlugin):
+ 
+         if self.proxy:
+             self.add_copy_specs(["/etc/squid", "/var/log/squid"])
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/scsi.py b/sos/plugins/scsi.py
+index a3f8175..84570b6 100644
+--- a/sos/plugins/scsi.py
++++ b/sos/plugins/scsi.py
+@@ -35,3 +35,5 @@ class Scsi(Plugin, RedHatPlugin, UbuntuPlugin, DebianPlugin):
+         
+         self.add_cmd_output("lsscsi")
+         self.add_cmd_output("sg_map")
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/selinux.py b/sos/plugins/selinux.py
+index 4b403ea..14d3679 100644
+--- a/sos/plugins/selinux.py
++++ b/sos/plugins/selinux.py
+@@ -43,3 +43,5 @@ class SELinux(Plugin, RedHatPlugin):
+             self.add_cmd_output("semanage login -l")
+             self.add_cmd_output("semanage port -l")
+ 
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/sendmail.py b/sos/plugins/sendmail.py
+index 4efbf95..1e25e32 100644
+--- a/sos/plugins/sendmail.py
++++ b/sos/plugins/sendmail.py
+@@ -47,3 +47,5 @@ class DebianSendmail(Sendmail, DebianPlugin, UbuntuPlugin):
+     def setup(self):
+         super(DebianSendmail, self).setup()
+         self.add_copy_specs(["/etc/mail/*", "/var/log/mail.*"])
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/smartcard.py b/sos/plugins/smartcard.py
+index 207f07a..65d4a11 100644
+--- a/sos/plugins/smartcard.py
++++ b/sos/plugins/smartcard.py
+@@ -33,3 +33,5 @@ class Smartcard(Plugin, RedHatPlugin):
+         self.add_cmd_output("pkcs11_inspect debug")
+         self.add_cmd_output("pklogin_finder debug")
+         self.add_cmd_output("ls -nl /usr/lib*/pam_pkcs11/")
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/snmp.py b/sos/plugins/snmp.py
+index 177c0e2..a9026d1 100644
+--- a/sos/plugins/snmp.py
++++ b/sos/plugins/snmp.py
+@@ -44,3 +44,5 @@ class DebianSnmp(Snmp, DebianPlugin, UbuntuPlugin):
+ 
+     def setup(self):
+         super(DebianSnmp, self).setup()
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/soundcard.py b/sos/plugins/soundcard.py
+index b92b4c5..6b13a2d 100644
+--- a/sos/plugins/soundcard.py
++++ b/sos/plugins/soundcard.py
+@@ -52,3 +52,5 @@ class DebianSoundcard(Soundcard, DebianPlugin, UbuntuPlugin):
+         super(DebianSoundcard, self).setup()
+ 
+         self.add_copy_spec("/etc/pulse/*")
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/squid.py b/sos/plugins/squid.py
+index bf6579b..7ef96f2 100644
+--- a/sos/plugins/squid.py
++++ b/sos/plugins/squid.py
+@@ -45,3 +45,5 @@ class DebianSquid(Squid, DebianPlugin, UbuntuPlugin):
+     def setup(self):
+         self.add_copy_spec_limit("/etc/squid3/squid.conf",
+                         sizelimit=self.get_option('logsize'))
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/ssh.py b/sos/plugins/ssh.py
+index 1abfc2a..0900818 100644
+--- a/sos/plugins/ssh.py
++++ b/sos/plugins/ssh.py
+@@ -24,3 +24,5 @@ class Ssh(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
+ 
+     def setup(self):
+         self.add_copy_specs(["/etc/ssh/ssh_config", "/etc/ssh/sshd_config"])
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/sssd.py b/sos/plugins/sssd.py
+index 0d201f4..40d88db 100644
+--- a/sos/plugins/sssd.py
++++ b/sos/plugins/sssd.py
+@@ -48,3 +48,5 @@ class DebianSssd(Sssd, DebianPlugin, UbuntuPlugin):
+     def setup(self):
+         super(DebianSssd, self).setup()
+         self.add_copy_specs(["/etc/default/sssd"])
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/startup.py b/sos/plugins/startup.py
+index 76d85ef..60d4086 100644
+--- a/sos/plugins/startup.py
++++ b/sos/plugins/startup.py
+@@ -46,3 +46,5 @@ class DebianStartup(Startup, DebianPlugin, UbuntuPlugin):
+         self.add_cmd_output("/sbin/initctl show-config", root_symlink = "initctl")
+         if self.get_option('servicestatus'):
+             self.add_cmd_output("/sbin/initctl list")
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/sunrpc.py b/sos/plugins/sunrpc.py
+index 3dab2ce..124f2fa 100644
+--- a/sos/plugins/sunrpc.py
++++ b/sos/plugins/sunrpc.py
+@@ -52,3 +52,5 @@ class RedHatSunRPC(SunRPC, RedHatPlugin):
+ #        return
+ 
+ 
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/system.py b/sos/plugins/system.py
+index a7e3eda..a819224 100644
+--- a/sos/plugins/system.py
++++ b/sos/plugins/system.py
+@@ -27,3 +27,5 @@ class System(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
+         self.add_forbidden_path(
+                 "/proc/sys/net/ipv6/neigh/*/base_reachable_time")
+ 
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/systemd.py b/sos/plugins/systemd.py
+index 38be63e..acb2bf9 100644
+--- a/sos/plugins/systemd.py
++++ b/sos/plugins/systemd.py
+@@ -47,3 +47,5 @@ class Systemd(Plugin, RedHatPlugin):
+                            "/etc/vconsole.conf",
+                            "/etc/yum/protected.d/systemd.conf"])
+ 
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/systemtap.py b/sos/plugins/systemtap.py
+index 213dcdb..e58537b 100644
+--- a/sos/plugins/systemtap.py
++++ b/sos/plugins/systemtap.py
+@@ -28,3 +28,5 @@ class SystemTap(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
+     def setup(self):
+         self.add_cmd_output("stap -V 2")
+         self.add_cmd_output("uname -r")
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/sysvipc.py b/sos/plugins/sysvipc.py
+index d8b68fe..1d4260c 100644
+--- a/sos/plugins/sysvipc.py
++++ b/sos/plugins/sysvipc.py
+@@ -27,3 +27,5 @@ class SysVIPC(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
+                 "/proc/sysvipc/sem",
+                 "/proc/sysvipc/shm"])
+         self.add_cmd_output("ipcs")
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/tftpserver.py b/sos/plugins/tftpserver.py
+index c6089ed..49c69b5 100644
+--- a/sos/plugins/tftpserver.py
++++ b/sos/plugins/tftpserver.py
+@@ -27,3 +27,5 @@ class TftpServer(Plugin, RedHatPlugin):
+ 
+     def setup(self):
+         self.add_cmd_output("ls -lanR /tftpboot")
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/tomcat.py b/sos/plugins/tomcat.py
+index d4e1ac6..60b4180 100644
+--- a/sos/plugins/tomcat.py
++++ b/sos/plugins/tomcat.py
+@@ -24,3 +24,5 @@ class Tomcat(Plugin, RedHatPlugin):
+ 
+     def setup(self):
+         self.add_copy_specs(["/etc/tomcat5", "/var/log/tomcat5"])
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/tuned.py b/sos/plugins/tuned.py
+index 60c22bc..196a41c 100644
+--- a/sos/plugins/tuned.py
++++ b/sos/plugins/tuned.py
+@@ -28,3 +28,5 @@ class Tuned(Plugin, RedHatPlugin):
+         self.add_cmd_output("tuned-adm recommend")
+         self.add_copy_spec("/var/log/tuned/tuned.log")
+ 
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/udev.py b/sos/plugins/udev.py
+index 47f2d26..e554a88 100644
+--- a/sos/plugins/udev.py
++++ b/sos/plugins/udev.py
+@@ -26,3 +26,5 @@ class Udev(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
+             "/lib/udev/rules.d",
+             "/etc/udev/rules.d/*"
+         ])
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/upstart.py b/sos/plugins/upstart.py
+index 5aa0e1d..1d088a6 100644
+--- a/sos/plugins/upstart.py
++++ b/sos/plugins/upstart.py
+@@ -39,3 +39,5 @@ class Upstart(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
+         # Session Jobs (running Upstart as a Session Init)
+         self.add_copy_spec('/usr/share/upstart/')
+ 
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/usb.py b/sos/plugins/usb.py
+index 8e58317..49ffadb 100644
+--- a/sos/plugins/usb.py
++++ b/sos/plugins/usb.py
+@@ -30,3 +30,5 @@ class Usb(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
+         self.add_cmd_output("lsusb -t")
+ 
+ 
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/veritas.py b/sos/plugins/veritas.py
+index 4a2ce57..38824df 100644
+--- a/sos/plugins/veritas.py
++++ b/sos/plugins/veritas.py
+@@ -40,3 +40,5 @@ class Veritas(Plugin, RedHatPlugin):
+                 self.add_copy_spec(tarfile[0])
+         except AttributeError as e:
+             self.add_alert(e)
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/vmware.py b/sos/plugins/vmware.py
+index 3a23dd3..b583d5c 100644
+--- a/sos/plugins/vmware.py
++++ b/sos/plugins/vmware.py
+@@ -27,3 +27,5 @@ class VMWare(Plugin, RedHatPlugin):
+         self.add_copy_specs(["/etc/vmware/locations",
+                            "/etc/vmware/config",
+                            "/proc/vmmemctl"])
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/vsftpd.py b/sos/plugins/vsftpd.py
+index 4cf58cf..787f99e 100644
+--- a/sos/plugins/vsftpd.py
++++ b/sos/plugins/vsftpd.py
+@@ -26,3 +26,5 @@ class Vsftpd(Plugin, RedHatPlugin):
+     def setup(self):
+         self.add_copy_spec("/etc/ftp*")
+         self.add_copy_spec("/etc/vsftpd")
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/x11.py b/sos/plugins/x11.py
+index 15730c6..7a548f4 100644
+--- a/sos/plugins/x11.py
++++ b/sos/plugins/x11.py
+@@ -30,3 +30,5 @@ class X11(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
+         ])
+         self.add_forbidden_path("/etc/X11/X")
+         self.add_forbidden_path("/etc/X11/fontpath.d")
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/xen.py b/sos/plugins/xen.py
+index 1bbeaf5..fef356b 100644
+--- a/sos/plugins/xen.py
++++ b/sos/plugins/xen.py
+@@ -98,3 +98,5 @@ class Xen(Plugin, RedHatPlugin):
+             return #USEFUL
+ 
+         self.add_custom_text("Xen hostType: "+host_type)
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/xfs.py b/sos/plugins/xfs.py
+index 1f4dd50..3bef675 100644
+--- a/sos/plugins/xfs.py
++++ b/sos/plugins/xfs.py
+@@ -38,3 +38,5 @@ class Xfs(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
+                 for e in dev:
+                     parts = e.split(' ')
+                     self.add_cmd_output("xfs_logprint -c %s" % (parts[0]))
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/xinetd.py b/sos/plugins/xinetd.py
+index e561044..d07c435 100644
+--- a/sos/plugins/xinetd.py
++++ b/sos/plugins/xinetd.py
+@@ -28,3 +28,5 @@ class Xinetd(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
+     def setup(self):
+         self.add_copy_spec("/etc/xinetd.conf")
+         self.add_copy_spec("/etc/xinetd.d")
++
++# vim: et ts=4 sw=4
+diff --git a/sos/plugins/yum.py b/sos/plugins/yum.py
+index b05c0fe..9aa6131 100644
+--- a/sos/plugins/yum.py
++++ b/sos/plugins/yum.py
+@@ -63,3 +63,5 @@ class Yum(Plugin, RedHatPlugin):
+                 self.add_cmd_output("zcat %s" % (output.split()[-1],))
+             except IndexError:
+                 pass
++
++# vim: et ts=4 sw=4
+diff --git a/sos/policies/__init__.py b/sos/policies/__init__.py
+index 08ce8b4..3ae3979 100644
+--- a/sos/policies/__init__.py
++++ b/sos/policies/__init__.py
+@@ -419,3 +419,5 @@ class LinuxPolicy(Policy):
+         
+         return
+ 
++
++# vim: et ts=4 sw=4
+diff --git a/sos/policies/debian.py b/sos/policies/debian.py
+index ffa4a26..80bbc88 100644
+--- a/sos/policies/debian.py
++++ b/sos/policies/debian.py
+@@ -36,3 +36,5 @@ class DebianPolicy(LinuxPolicy):
+         except:
+             pass
+         return False
++
++# vim: et ts=4 sw=4
+diff --git a/sos/policies/osx.py b/sos/policies/osx.py
+index 767b608..2e3c5ac 100644
+--- a/sos/policies/osx.py
++++ b/sos/policies/osx.py
+@@ -11,3 +11,5 @@ class OSXPolicy(Policy):
+             return "Mac OS X" in shell_out("sw_vers")
+         except Exception as e:
+             return False
++
++# vim: et ts=4 sw=4
+diff --git a/sos/policies/redhat.py b/sos/policies/redhat.py
+index 4e5b363..2eade3a 100644
+--- a/sos/policies/redhat.py
++++ b/sos/policies/redhat.py
+@@ -155,4 +155,5 @@ class FedoraPolicy(RedHatPolicy):
+         self.all_pkgs_by_name_regex("fedora-release-.*")[-1]
+         return int(pkg["version"])
+ 
+-# vim: ts=4 sw=4 et
++
++# vim: et ts=4 sw=4
+diff --git a/sos/policies/ubuntu.py b/sos/policies/ubuntu.py
+index 3039f43..cc83f92 100644
+--- a/sos/policies/ubuntu.py
++++ b/sos/policies/ubuntu.py
+@@ -23,3 +23,5 @@ class UbuntuPolicy(DebianPolicy):
+                 return "Ubuntu" in fp.read()
+         except:
+             return False
++
++# vim: et ts=4 sw=4
+diff --git a/sos/policies/windows.py b/sos/policies/windows.py
+index f2ce48c..f3bbc7e 100644
+--- a/sos/policies/windows.py
++++ b/sos/policies/windows.py
+@@ -44,3 +44,5 @@ class WindowsPolicy(Policy):
+     def preferred_archive_name(self):
+         from sos.archive import ZipFileArchive
+         return ZipFileArchive
++
++# vim: et ts=4 sw=4
+diff --git a/sos/reporting.py b/sos/reporting.py
+index 1671919..039a75f 100644
+--- a/sos/reporting.py
++++ b/sos/reporting.py
+@@ -131,3 +131,5 @@ class PlainTextReport(object):
+             self.buf.append(header)
+             for item in section.get(key):
+                 self.buf.append(format_ % item)
++
++# vim: et ts=4 sw=4
+diff --git a/sos/sosreport.py b/sos/sosreport.py
+index afa5371..8483d10 100644
+--- a/sos/sosreport.py
++++ b/sos/sosreport.py
+@@ -1151,3 +1151,5 @@ def main(args):
+     """The main entry point"""
+     sos = SoSReport(args)
+     sos.execute()
++
++# vim: et ts=4 sw=4
+diff --git a/sos/utilities.py b/sos/utilities.py
+index 1a56f9f..e5d7d87 100644
+--- a/sos/utilities.py
++++ b/sos/utilities.py
+@@ -247,3 +247,5 @@ class ImporterHelper(object):
+                 plugins.extend(self._find_plugins_in_zipfile(path))
+ 
+         return plugins
++
++# vim: et ts=4 sw=4
+diff --git a/tests/archive_tests.py b/tests/archive_tests.py
+index 9cd7bd1..d26af1d 100644
+--- a/tests/archive_tests.py
++++ b/tests/archive_tests.py
+@@ -172,3 +172,5 @@ class TarFileArchiveTest(unittest.TestCase):
+ 
+ if __name__ == "__main__":
+     unittest.main()
++
++# vim: et ts=4 sw=4
+diff --git a/tests/importer_tests.py b/tests/importer_tests.py
+index 91f82cc..e7e20a2 100644
+--- a/tests/importer_tests.py
++++ b/tests/importer_tests.py
+@@ -11,3 +11,5 @@ class ImporterHelperTests(unittest.TestCase):
+ 
+ if __name__ == "__main__":
+     unittest.main()
++
++# vim: et ts=4 sw=4
+diff --git a/tests/option_tests.py b/tests/option_tests.py
+index d221b96..3185bce 100644
+--- a/tests/option_tests.py
++++ b/tests/option_tests.py
+@@ -32,3 +32,5 @@ class GlobalOptionTest(unittest.TestCase):
+ 
+ if __name__ == "__main__":
+     unittest.main()
++
++# vim: et ts=4 sw=4
+diff --git a/tests/plugin_tests.py b/tests/plugin_tests.py
+index 5eb1304..9a21b61 100644
+--- a/tests/plugin_tests.py
++++ b/tests/plugin_tests.py
+@@ -304,3 +304,5 @@ class RegexSubTests(unittest.TestCase):
+ 
+ if __name__ == "__main__":
+     unittest.main()
++
++# vim: et ts=4 sw=4
+diff --git a/tests/policy_tests.py b/tests/policy_tests.py
+index 764af83..fe208fc 100644
+--- a/tests/policy_tests.py
++++ b/tests/policy_tests.py
+@@ -67,3 +67,5 @@ class PackageManagerTests(unittest.TestCase):
+ 
+ if __name__ == "__main__":
+     unittest.main()
++
++# vim: et ts=4 sw=4
+diff --git a/tests/report_tests.py b/tests/report_tests.py
+index a08f0ae..5bb1d83 100644
+--- a/tests/report_tests.py
++++ b/tests/report_tests.py
+@@ -116,3 +116,5 @@ class TestPlainReport(unittest.TestCase):
+ 
+ if __name__ == "__main__":
+     unittest.main()
++
++# vim: et ts=4 sw=4
+diff --git a/tests/sosreport_pexpect.py b/tests/sosreport_pexpect.py
+index 164fa9c..4b80723 100644
+--- a/tests/sosreport_pexpect.py
++++ b/tests/sosreport_pexpect.py
+@@ -26,3 +26,5 @@ class PexpectTest(unittest.TestCase):
+ 
+ if __name__ == '__main__':
+     unittest.main()
++
++# vim: et ts=4 sw=4
+diff --git a/tests/test_exe.py b/tests/test_exe.py
+index 09b2813..ee493b7 100755
+--- a/tests/test_exe.py
++++ b/tests/test_exe.py
+@@ -1,2 +1,4 @@
+ #!/usr/bin/python
+ print "executed"
++
++# vim: et ts=4 sw=4
+diff --git a/tests/utilities_tests.py b/tests/utilities_tests.py
+index 395fde1..f3b1629 100644
+--- a/tests/utilities_tests.py
++++ b/tests/utilities_tests.py
+@@ -86,3 +86,5 @@ class FindTest(unittest.TestCase):
+     def test_not_in_pattern(self):
+         leaves = find("leaf", TEST_DIR, path_pattern="tests/path")
+         self.assertFalse(any(name.endswith("leaf") for name in leaves))
++
++# vim: et ts=4 sw=4
+-- 
+1.7.11.7
+
diff --git a/0044-Dead-code-removal-sos.plugins.common_prefix.patch b/0044-Dead-code-removal-sos.plugins.common_prefix.patch
new file mode 100644
index 0000000..676eefc
--- /dev/null
+++ b/0044-Dead-code-removal-sos.plugins.common_prefix.patch
@@ -0,0 +1,39 @@
+From e39258bacc722ea9e7446c93b6443b8e1923e3a4 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr at redhat.com>
+Date: Wed, 26 Mar 2014 17:38:26 +0000
+Subject: [PATCH 44/61] Dead code removal: sos.plugins.common_prefix()
+
+Unused. Delete.
+
+Signed-off-by: Bryn M. Reeves <bmr at redhat.com>
+---
+ sos/plugins/__init__.py | 13 -------------
+ 1 file changed, 13 deletions(-)
+
+diff --git a/sos/plugins/__init__.py b/sos/plugins/__init__.py
+index 9ee0b61..4de8c0d 100644
+--- a/sos/plugins/__init__.py
++++ b/sos/plugins/__init__.py
+@@ -45,19 +45,6 @@ try:
+ except ImportError:
+     import simplejson as json
+ 
+-def common_prefix(l1, l2, common = None):
+-    """Returns a tuple like the following:
+-        ([common, elements, from l1, and l2], [[tails, from, l1], [tails, from, l2]])
+-
+-    >>> common_prefix(['usr','share','foo'], ['usr','share','bar'])
+-    (['usr','share'], [['foo'], ['bar']])
+-    """
+-    if common is None:
+-        common = []
+-    if len(l1) < 1 or len(l2) < 1 or  l1[0] != l2[0]:
+-        return (common, [l1, l2])
+-    return common_prefix(l1[1:], l2[1:], common+[l1[0]])
+-
+ def regex_findall(regex, fname):
+     '''Return a list of all non overlapping matches in the string(s)'''
+     try:
+-- 
+1.7.11.7
+
diff --git a/0045-Dead-code-removal-PluginException.patch b/0045-Dead-code-removal-PluginException.patch
new file mode 100644
index 0000000..e7dac27
--- /dev/null
+++ b/0045-Dead-code-removal-PluginException.patch
@@ -0,0 +1,31 @@
+From 6182367ec0672721d1381e40aaa97c3d2f504a95 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr at redhat.com>
+Date: Wed, 26 Mar 2014 17:39:43 +0000
+Subject: [PATCH 45/61] Dead code removal: PluginException
+
+Defined but never used. Delete.
+
+Signed-off-by: Bryn M. Reeves <bmr at redhat.com>
+---
+ sos/plugins/__init__.py | 5 -----
+ 1 file changed, 5 deletions(-)
+
+diff --git a/sos/plugins/__init__.py b/sos/plugins/__init__.py
+index 4de8c0d..0c4b9b4 100644
+--- a/sos/plugins/__init__.py
++++ b/sos/plugins/__init__.py
+@@ -60,11 +60,6 @@ def mangle_command(command):
+     mangledname = re.sub(r"/", ".", mangledname).strip(" ._-")[0:64]
+     return mangledname
+ 
+-
+-class PluginException(Exception):
+-    pass
+-
+-
+ class Plugin(object):
+     """ This is the base class for sosreport plugins. Plugins should subclass
+     this and set the class variables where applicable.
+-- 
+1.7.11.7
+
diff --git a/0046-Convert-infiniband-to-package-list.patch b/0046-Convert-infiniband-to-package-list.patch
new file mode 100644
index 0000000..0bd3381
--- /dev/null
+++ b/0046-Convert-infiniband-to-package-list.patch
@@ -0,0 +1,33 @@
+From 3f742644ebbf27b7b024a2f7061c347196312308 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr at redhat.com>
+Date: Thu, 27 Mar 2014 11:39:30 +0000
+Subject: [PATCH 46/61] Convert infiniband to package list
+
+Remove infiniband's open-coded check_enabled() and use a package
+list to control plugin activation.
+
+Signed-off-by: Bryn M. Reeves <bmr at redhat.com>
+---
+ sos/plugins/infiniband.py | 6 +-----
+ 1 file changed, 1 insertion(+), 5 deletions(-)
+
+diff --git a/sos/plugins/infiniband.py b/sos/plugins/infiniband.py
+index 2c890a5..d3ec982 100644
+--- a/sos/plugins/infiniband.py
++++ b/sos/plugins/infiniband.py
+@@ -21,11 +21,7 @@ class Infiniband(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
+     """
+ 
+     plugin_name = 'infiniband'
+-
+-    def check_enabled(self):
+-         if self.commons["policy"].pkg_by_name("libibverbs-utils"):
+-             return True
+-         return False
++    packages = ('libibverbs-utils',)
+ 
+     def setup(self):
+         self.add_copy_specs([
+-- 
+1.7.11.7
+
diff --git a/0047-Replace-self.policy-.pkg_by_name-us-in-Logs-plugin.patch b/0047-Replace-self.policy-.pkg_by_name-us-in-Logs-plugin.patch
new file mode 100644
index 0000000..d39650a
--- /dev/null
+++ b/0047-Replace-self.policy-.pkg_by_name-us-in-Logs-plugin.patch
@@ -0,0 +1,28 @@
+From 1bd31b763a11f15c89b1e2ae16788867ff62a84e Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr at redhat.com>
+Date: Thu, 27 Mar 2014 11:40:40 +0000
+Subject: [PATCH 47/61] Replace self.policy().pkg_by_name() us in Logs plugin
+
+Use self.is_installed() for simple package presence tests.
+
+Signed-off-by: Bryn M. Reeves <bmr at redhat.com>
+---
+ sos/plugins/logs.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/sos/plugins/logs.py b/sos/plugins/logs.py
+index 1cd767c..318377d 100644
+--- a/sos/plugins/logs.py
++++ b/sos/plugins/logs.py
+@@ -40,7 +40,7 @@ class Logs(Plugin):
+         if self.get_option('all_logs'):
+             logs = self.do_regex_find_all("^\S+\s+(-?\/.*$)\s+",
+                                 "/etc/syslog.conf")
+-            if self.policy().pkg_by_name("rsyslog") \
++            if self.is_installed("rsyslog") \
+               or os.path.exists("/etc/rsyslog.conf"):
+                 logs += self.do_regex_find_all("^\S+\s+(-?\/.*$)\s+", "/etc/rsyslog.conf")
+             for i in logs:
+-- 
+1.7.11.7
+
diff --git a/0048-Clean-up-package-checks-in-processor-plugin.patch b/0048-Clean-up-package-checks-in-processor-plugin.patch
new file mode 100644
index 0000000..297602f
--- /dev/null
+++ b/0048-Clean-up-package-checks-in-processor-plugin.patch
@@ -0,0 +1,52 @@
+From 426549369f818091935712936514382786502094 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr at redhat.com>
+Date: Thu, 27 Mar 2014 11:50:33 +0000
+Subject: [PATCH 48/61] Clean up package checks in processor plugin
+
+Signed-off-by: Bryn M. Reeves <bmr at redhat.com>
+---
+ sos/plugins/processor.py | 18 ++++++------------
+ 1 file changed, 6 insertions(+), 12 deletions(-)
+
+diff --git a/sos/plugins/processor.py b/sos/plugins/processor.py
+index 391c64f..0b236f8 100644
+--- a/sos/plugins/processor.py
++++ b/sos/plugins/processor.py
+@@ -21,6 +21,8 @@ class Processor(Plugin, RedHatPlugin, UbuntuPlugin, DebianPlugin):
+     """
+ 
+     plugin_name = 'processor'
++    files = ('/proc/cpuinfo',)
++    packages = ('cpufreq-utils')
+ 
+     def setup(self):
+         self.add_copy_specs([
+@@ -29,21 +31,13 @@ class Processor(Plugin, RedHatPlugin, UbuntuPlugin, DebianPlugin):
+             "/sys/devices/system/cpu"
+         ])
+         
+-        if self.policy().pkg_by_name("cpufreq-utils"):
+-            self.add_cmd_output("cpufreq-info")
+-            self.add_cmd_output("cpupower info")
+-            self.add_cmd_output("cpupower frequency-info")
+-
+-        if self.policy().pkg_by_name("kernel-tools"):
+-            self.add_cmd_output("cpupower info")
+-            self.add_cmd_output("cpupower frequency-info")
+-            self.add_cmd_output("cpupower idle-info")
++        self.add_cmd_output("lscpu")
++        self.add_cmd_output("cpupower info")
++        self.add_cmd_output("cpupower idle-info")
++        self.add_cmd_output("cpupower frequency-info")
+ 
+         if self.policy().get_arch().endswith("386"):
+             self.add_cmd_output("x86info -a")
+ 
+-        self.add_cmd_output("lscpu")
+-
+-
+ 
+ # vim: et ts=4 sw=4
+-- 
+1.7.11.7
+
diff --git a/0049-Pythonify-Plugin._path_in_pathlist.patch b/0049-Pythonify-Plugin._path_in_pathlist.patch
new file mode 100644
index 0000000..09015d7
--- /dev/null
+++ b/0049-Pythonify-Plugin._path_in_pathlist.patch
@@ -0,0 +1,29 @@
+From 691e1811a2c6557c062a76e754a3b5228ce40fbf Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr at redhat.com>
+Date: Thu, 27 Mar 2014 13:05:41 +0000
+Subject: [PATCH 49/61] Pythonify Plugin._path_in_pathlist()
+
+Signed-off-by: Bryn M. Reeves <bmr at redhat.com>
+---
+ sos/plugins/__init__.py | 5 +----
+ 1 file changed, 1 insertion(+), 4 deletions(-)
+
+diff --git a/sos/plugins/__init__.py b/sos/plugins/__init__.py
+index 0c4b9b4..55c2d48 100644
+--- a/sos/plugins/__init__.py
++++ b/sos/plugins/__init__.py
+@@ -195,10 +195,7 @@ class Plugin(object):
+         return regex_findall(regex, fname)
+ 
+     def _path_in_path_list(self, path, path_list):
+-        for p in path_list:
+-            if p in path:
+-                return True
+-        return False
++        return any(p in path for p in path_list)
+ 
+     def copy_symlink(self, srcpath, sub=None):
+         # the target stored in the original symlink
+-- 
+1.7.11.7
+
diff --git a/0050-Fix-x86-arch-detection-in-processor-plugin.patch b/0050-Fix-x86-arch-detection-in-processor-plugin.patch
new file mode 100644
index 0000000..bfbb90d
--- /dev/null
+++ b/0050-Fix-x86-arch-detection-in-processor-plugin.patch
@@ -0,0 +1,26 @@
+From 36055d3d069a1176787e4dfb722fc5ca9a804ac5 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr at redhat.com>
+Date: Thu, 27 Mar 2014 13:46:40 +0000
+Subject: [PATCH 50/61] Fix x86 arch detection in processor plugin
+
+Signed-off-by: Bryn M. Reeves <bmr at redhat.com>
+---
+ sos/plugins/processor.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/sos/plugins/processor.py b/sos/plugins/processor.py
+index 0b236f8..14d800e 100644
+--- a/sos/plugins/processor.py
++++ b/sos/plugins/processor.py
+@@ -36,7 +36,7 @@ class Processor(Plugin, RedHatPlugin, UbuntuPlugin, DebianPlugin):
+         self.add_cmd_output("cpupower idle-info")
+         self.add_cmd_output("cpupower frequency-info")
+ 
+-        if self.policy().get_arch().endswith("386"):
++        if '86' in self.policy().get_arch():
+             self.add_cmd_output("x86info -a")
+ 
+ 
+-- 
+1.7.11.7
+
diff --git a/0051-Refactor-Plugin.collect-pathway.patch b/0051-Refactor-Plugin.collect-pathway.patch
new file mode 100644
index 0000000..0478db0
--- /dev/null
+++ b/0051-Refactor-Plugin.collect-pathway.patch
@@ -0,0 +1,152 @@
+From f98ae415bbff3f633641633a1c99c13021d4b352 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr at 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 at 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
+
diff --git a/0052-Remove-obsolete-checksum-reference-from-utilities_te.patch b/0052-Remove-obsolete-checksum-reference-from-utilities_te.patch
new file mode 100644
index 0000000..a150a8f
--- /dev/null
+++ b/0052-Remove-obsolete-checksum-reference-from-utilities_te.patch
@@ -0,0 +1,27 @@
+From 01ef1eaed6f1228fcb8f3d6bc1746396d638282d Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr at redhat.com>
+Date: Thu, 27 Mar 2014 13:59:14 +0000
+Subject: [PATCH 52/61] Remove obsolete checksum reference from
+ utilities_tests.py
+
+Signed-off-by: Bryn M. Reeves <bmr at redhat.com>
+---
+ tests/utilities_tests.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/tests/utilities_tests.py b/tests/utilities_tests.py
+index f3b1629..22b2bbe 100644
+--- a/tests/utilities_tests.py
++++ b/tests/utilities_tests.py
+@@ -5,7 +5,7 @@ import unittest
+ import six
+ from six import StringIO
+ 
+-from sos.utilities import grep, checksum, get_hash_name, is_executable, sos_get_command_output, find, tail, shell_out
++from sos.utilities import grep, get_hash_name, is_executable, sos_get_command_output, find, tail, shell_out
+ import sos
+ 
+ TEST_DIR = os.path.dirname(__file__)
+-- 
+1.7.11.7
+
diff --git a/0053-Update-plugin_tests.py-to-match-new-method-names.patch b/0053-Update-plugin_tests.py-to-match-new-method-names.patch
new file mode 100644
index 0000000..17519c5
--- /dev/null
+++ b/0053-Update-plugin_tests.py-to-match-new-method-names.patch
@@ -0,0 +1,54 @@
+From fbd60e01cfce143757b6de13aaf2209319f3eee9 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr at redhat.com>
+Date: Thu, 27 Mar 2014 14:15:28 +0000
+Subject: [PATCH 53/61] Update plugin_tests.py to match new method names
+
+Signed-off-by: Bryn M. Reeves <bmr at redhat.com>
+---
+ tests/plugin_tests.py | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+diff --git a/tests/plugin_tests.py b/tests/plugin_tests.py
+index 9a21b61..4ba5968 100644
+--- a/tests/plugin_tests.py
++++ b/tests/plugin_tests.py
+@@ -194,15 +194,15 @@ class PluginTests(unittest.TestCase):
+         self.assertEquals(p.get_option_as_list("opt"), ['testing'])
+ 
+     def test_copy_dir(self):
+-        self.mp.do_copy_file_or_dir("tests")
++        self.mp.do_copy_path("tests")
+         self.assertEquals(self.mp.archive.m["tests/plugin_tests.py"], 'tests/plugin_tests.py')
+ 
+     def test_copy_dir_sub(self):
+-        self.mp.do_copy_file_or_dir("tests", sub=("tests/", "foobar/"))
++        self.mp.do_copy_path("tests", sub=("tests/", "foobar/"))
+         self.assertEquals(self.mp.archive.m["tests/plugin_tests.py"], 'foobar/plugin_tests.py')
+ 
+     def test_copy_dir_bad_path(self):
+-        self.mp.do_copy_file_or_dir("not_here_tests")
++        self.mp.do_copy_path("not_here_tests")
+         self.assertEquals(self.mp.archive.m, {})
+ 
+     def test_copy_dir_forbidden_path(self):
+@@ -211,7 +211,7 @@ class PluginTests(unittest.TestCase):
+         })
+         p.archive = MockArchive()
+         p.setup()
+-        p.do_copy_file_or_dir("tests")
++        p.do_copy_path("tests")
+         self.assertEquals(p.archive.m, {})
+ 
+ 
+@@ -225,7 +225,7 @@ class AddCopySpecLimitTests(unittest.TestCase):
+ 
+     def test_single_file_under_limit(self):
+         self.mp.add_copy_spec_limit("tests/tail_test.txt", 1)
+-        self.assertEquals(self.mp.copy_paths, [('tests/tail_test.txt', None)])
++        self.assertEquals(self.mp.copy_specs, [('tests/tail_test.txt', None)])
+ 
+     def test_single_file_over_limit(self):
+         fn = create_file(2) # create 2MB file, consider a context manager
+-- 
+1.7.11.7
+
diff --git a/0054-Drop-RedHatPlugin-from-procenv.patch b/0054-Drop-RedHatPlugin-from-procenv.patch
new file mode 100644
index 0000000..0bfb664
--- /dev/null
+++ b/0054-Drop-RedHatPlugin-from-procenv.patch
@@ -0,0 +1,32 @@
+From 2f7baff1e206831945c83894fbc0ba5250178b5b Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr at redhat.com>
+Date: Thu, 27 Mar 2014 14:45:53 +0000
+Subject: [PATCH 54/61] Drop RedHatPlugin from procenv
+
+The procenv package is not shipped in Red Hat distributions so
+remove the RedHatPlugin tagging class from it.
+
+Signed-off-by: Bryn M. Reeves <bmr at redhat.com>
+---
+ sos/plugins/procenv.py | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/sos/plugins/procenv.py b/sos/plugins/procenv.py
+index e776e14..4367555 100644
+--- a/sos/plugins/procenv.py
++++ b/sos/plugins/procenv.py
+@@ -13,9 +13,9 @@
+ ## along with this program; if not, write to the Free Software
+ ## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ 
+-from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin
++from sos.plugins import Plugin, DebianPlugin, UbuntuPlugin
+ 
+-class Procenv(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
++class Procenv(Plugin, DebianPlugin, UbuntuPlugin):
+     """Process environment.
+     """
+ 
+-- 
+1.7.11.7
+
diff --git a/0055-Remove-sub-parameter-from-Plugin.add_copy_spec.patch b/0055-Remove-sub-parameter-from-Plugin.add_copy_spec.patch
new file mode 100644
index 0000000..b38535c
--- /dev/null
+++ b/0055-Remove-sub-parameter-from-Plugin.add_copy_spec.patch
@@ -0,0 +1,164 @@
+From a09090ab98b10e2eca363a4919397545d64f1c85 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr at redhat.com>
+Date: Thu, 27 Mar 2014 16:09:35 +0000
+Subject: [PATCH 55/61] Remove 'sub' parameter from Plugin.add_copy_spec*()
+
+The 'sub' parameter to these functions allowed substituting part
+of the path in the generated archive. E.g. transforming 'etc/'
+into 'configs/'. This has never been used and seems to serve no
+real purpose today. Simplify the parameter passing and copy_spec
+lists by removing this support.
+
+Signed-off-by: Bryn M. Reeves <bmr at redhat.com>
+---
+ sos/plugins/__init__.py | 49 +++++++++++++++++--------------------------------
+ 1 file changed, 17 insertions(+), 32 deletions(-)
+
+diff --git a/sos/plugins/__init__.py b/sos/plugins/__init__.py
+index 807bd3f..de278d0 100644
+--- a/sos/plugins/__init__.py
++++ b/sos/plugins/__init__.py
+@@ -197,7 +197,7 @@ class Plugin(object):
+     def _path_in_path_list(self, path, path_list):
+         return any(p in path for p in path_list)
+ 
+-    def copy_symlink(self, srcpath, sub=None):
++    def copy_symlink(self, srcpath):
+         # the target stored in the original symlink
+         linkdest = os.readlink(srcpath)
+         # absolute path to the link target
+@@ -213,18 +213,14 @@ class Plugin(object):
+                 reldest = linkdest
+ 
+         self.soslog.debug(
+-                "copying link %s pointing to %s with sub=%s, isdir=%s"
+-                % (srcpath, linkdest, sub, os.path.isdir(absdest)))
++                "copying link %s pointing to %s with isdir=%s"
++                % (srcpath, linkdest, os.path.isdir(absdest)))
+ 
+         if os.path.isdir(absdest):
+             self.soslog.debug("link %s is a directory, skipping..."
+                             % linkdest)
+             return
+ 
+-        if sub:
+-            old, new = sub
+-            reldest = srcpath.replace(old, new)
+-
+         # use the relative target path in the tarball
+         self.archive.add_link(reldest,srcpath)
+ 
+@@ -240,9 +236,9 @@ class Plugin(object):
+             'symlink':"yes",
+             'pointsto':linkdest})
+ 
+-    def copy_dir(self, srcpath, sub=None):
++    def copy_dir(self, srcpath):
+         for afile in os.listdir(srcpath):
+-            self.do_copy_path(os.path.join(srcpath, afile), dest=None, sub=sub)
++            self.do_copy_path(os.path.join(srcpath, afile), dest=None)
+ 
+     def _get_dest_for_srcpath(self, srcpath):
+         for copied in self.copied_files:
+@@ -251,16 +247,12 @@ class Plugin(object):
+         return None
+ 
+     # Methods for copying files and shelling out
+-    def do_copy_path(self, srcpath, dest=None, sub=None):
++    def do_copy_path(self, srcpath, dest=None):
+         # pylint: disable-msg = R0912
+         # pylint: disable-msg = R0915
+         '''Copy file or directory to the destination tree. If a directory, then
+         everything below it is recursively copied. A list of copied files are
+-        saved for use later in preparing a report.  sub can be used to rename
+-        the destination of the file, sub should be a two-tuple of (old,new).
+-        For example if you passed in ("etc","configurations") for use against
+-        /etc/my_file.conf the file would end up at
+-        /configurations/my_file.conf.
++        saved for use later in preparing a report.
+         '''
+         if self._path_in_path_list(srcpath, self.forbidden_paths):
+             self.soslog.debug("%s is in the forbidden path list" % srcpath)
+@@ -273,16 +265,12 @@ class Plugin(object):
+         if not dest:
+             dest = srcpath
+ 
+-        if sub:
+-            old, new = sub
+-            dest = srcpath.replace(old, new)
+-
+         if os.path.islink(srcpath):
+-            self.copy_symlink(srcpath, sub=sub)
++            self.copy_symlink(srcpath)
+             return
+         else:
+             if os.path.isdir(srcpath):
+-                self.copy_dir(srcpath, sub=sub)
++                self.copy_dir(srcpath)
+                 return
+ 
+         # if we get here, it's definitely a regular file (not a symlink or dir)
+@@ -370,7 +358,7 @@ class Plugin(object):
+         except Exception:
+             return default
+ 
+-    def add_copy_spec_limit(self, copyspec, sizelimit=None, sub=None):
++    def add_copy_spec_limit(self, copyspec, sizelimit=None):
+         """Add a file or glob but limit it to sizelimit megabytes. If fname is
+         a single file the file will be tailed to meet sizelimit. If the first
+         file in a glob is too large it will be tailed to meet the sizelimit.
+@@ -392,14 +380,11 @@ class Plugin(object):
+             if sizelimit and current_size > sizelimit:
+                 limit_reached = True
+                 break
+-            self.add_copy_spec(_file, sub)
++            self.add_copy_spec(_file)
+ 
+         if limit_reached:
+             file_name = _file
+ 
+-            if sub:
+-                old, new = sub
+-                file_name = _file.replace(old, new)
+             if file_name[0] == os.sep:
+                 file_name = file_name.lstrip(os.sep)
+             strfile = file_name.replace(os.path.sep, ".") + ".tailed"
+@@ -408,11 +393,11 @@ class Plugin(object):
+                 os.path.relpath('/', os.path.dirname(_file)), 'sos_strings',
+                 self.name(), strfile), _file)
+ 
+-    def add_copy_specs(self, copyspecs, sub=None):
++    def add_copy_specs(self, copyspecs):
+         for copyspec in copyspecs:
+-            self.add_copy_spec(copyspec, sub)
++            self.add_copy_spec(copyspec)
+ 
+-    def add_copy_spec(self, copyspec, sub=None):
++    def add_copy_spec(self, copyspec):
+         """Add a file specification (can be file, dir,or shell glob) to be
+         copied into the sosreport by this module.
+         """
+@@ -421,7 +406,7 @@ class Plugin(object):
+                                  % self.name())
+             return False
+         if copyspec not in self.copy_specs:
+-            self.copy_specs.append((copyspec, sub))
++            self.copy_specs.append(copyspec)
+ 
+     def get_command_output(self, prog, timeout=300):
+         (status, output, runtime) = sos_get_command_output(prog, timeout)
+@@ -539,9 +524,9 @@ class Plugin(object):
+ 
+     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 spec in self.copy_specs:
+             for path in self.expand_copy_spec(spec):
+-                self.do_copy_path(path, sub=sub)
++                self.do_copy_path(path)
+ 
+     def collect_cmd_output(self):
+         for progs in zip(self.collect_cmds):
+-- 
+1.7.11.7
+
diff --git a/0056-Remove-references-to-sub-parameter-from-plugin-tests.patch b/0056-Remove-references-to-sub-parameter-from-plugin-tests.patch
new file mode 100644
index 0000000..c7fa642
--- /dev/null
+++ b/0056-Remove-references-to-sub-parameter-from-plugin-tests.patch
@@ -0,0 +1,46 @@
+From f5be64704096d5bdf9f75cc78dc571c6d9325fcb Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr at redhat.com>
+Date: Thu, 27 Mar 2014 16:38:29 +0000
+Subject: [PATCH 56/61] Remove references to 'sub' parameter from plugin tests
+
+Signed-off-by: Bryn M. Reeves <bmr at redhat.com>
+---
+ tests/plugin_tests.py | 10 +++-------
+ 1 file changed, 3 insertions(+), 7 deletions(-)
+
+diff --git a/tests/plugin_tests.py b/tests/plugin_tests.py
+index 4ba5968..cf874f1 100644
+--- a/tests/plugin_tests.py
++++ b/tests/plugin_tests.py
+@@ -197,10 +197,6 @@ class PluginTests(unittest.TestCase):
+         self.mp.do_copy_path("tests")
+         self.assertEquals(self.mp.archive.m["tests/plugin_tests.py"], 'tests/plugin_tests.py')
+ 
+-    def test_copy_dir_sub(self):
+-        self.mp.do_copy_path("tests", sub=("tests/", "foobar/"))
+-        self.assertEquals(self.mp.archive.m["tests/plugin_tests.py"], 'foobar/plugin_tests.py')
+-
+     def test_copy_dir_bad_path(self):
+         self.mp.do_copy_path("not_here_tests")
+         self.assertEquals(self.mp.archive.m, {})
+@@ -225,14 +221,14 @@ class AddCopySpecLimitTests(unittest.TestCase):
+ 
+     def test_single_file_under_limit(self):
+         self.mp.add_copy_spec_limit("tests/tail_test.txt", 1)
+-        self.assertEquals(self.mp.copy_specs, [('tests/tail_test.txt', None)])
++        self.assertEquals(self.mp.copy_specs, ['tests/tail_test.txt'])
+ 
+     def test_single_file_over_limit(self):
+         fn = create_file(2) # create 2MB file, consider a context manager
+-        self.mp.add_copy_spec_limit(fn, 1, sub=('tmp', 'awesome'))
++        self.mp.add_copy_spec_limit(fn, 1)
+         content, fname = self.mp.copy_strings[0]
+         self.assertTrue("tailed" in fname)
+-        self.assertTrue("awesome" in fname)
++        self.assertTrue("tmp" in fname)
+         self.assertTrue("/" not in fname)
+         self.assertEquals(1024 * 1024, len(content))
+         os.unlink(fn)
+-- 
+1.7.11.7
+
diff --git a/0057-Use-a-set-for-Plugin.copy_paths.patch b/0057-Use-a-set-for-Plugin.copy_paths.patch
new file mode 100644
index 0000000..83eba4b
--- /dev/null
+++ b/0057-Use-a-set-for-Plugin.copy_paths.patch
@@ -0,0 +1,58 @@
+From 81b06ca7406aee6ecb47f7afe33fc56caafee570 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr at redhat.com>
+Date: Thu, 27 Mar 2014 20:33:40 +0000
+Subject: [PATCH 57/61] Use a set for Plugin.copy_paths
+
+We want to remove any duplicates from the list of paths to
+collect. Use a set and update it with the expansion of each copy
+spec as we add it. This avoids having to explictly test for
+duplicates when we come to iterate over the set.
+
+Signed-off-by: Bryn M. Reeves <bmr at redhat.com>
+---
+ sos/plugins/__init__.py | 14 ++++++--------
+ 1 file changed, 6 insertions(+), 8 deletions(-)
+
+diff --git a/sos/plugins/__init__.py b/sos/plugins/__init__.py
+index de278d0..7b6180c 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_specs = []
++        self.copy_paths = set()
+         self.copy_strings = []
+         self.collect_cmds = []
+ 
+@@ -402,11 +402,11 @@ class Plugin(object):
+         copied into the sosreport by this module.
+         """
+         if not (copyspec and len(copyspec)):
+-            self.soslog.warning("%s added null or empty file path"
+-                                 % self.name())
++            self.soslog.warning("plugin %s %s"
++                % ("added null or empty copy spec", self.name()))
+             return False
+-        if copyspec not in self.copy_specs:
+-            self.copy_specs.append(copyspec)
++        copy_paths = self.expand_copy_spec(copyspec)
++        self.copy_paths.update(copy_paths)
+ 
+     def get_command_output(self, prog, timeout=300):
+         (status, output, runtime) = sos_get_command_output(prog, timeout)
+@@ -523,9 +523,7 @@ class Plugin(object):
+         return glob.glob(copyspec)
+ 
+     def collect_copy_specs(self):
+-        # Glob case handling is such that a valid non-glob is a reduced glob
+-        for spec in self.copy_specs:
+-            for path in self.expand_copy_spec(spec):
++        for path in self.copy_paths:
+                 self.do_copy_path(path)
+ 
+     def collect_cmd_output(self):
+-- 
+1.7.11.7
+
diff --git a/0058-Update-Plugin-tests-to-treat-copy_paths-as-a-set.patch b/0058-Update-Plugin-tests-to-treat-copy_paths-as-a-set.patch
new file mode 100644
index 0000000..292a122
--- /dev/null
+++ b/0058-Update-Plugin-tests-to-treat-copy_paths-as-a-set.patch
@@ -0,0 +1,26 @@
+From cfefd80c828c309745cc40d8498223b4fbc7b5ca Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr at redhat.com>
+Date: Thu, 27 Mar 2014 20:52:49 +0000
+Subject: [PATCH 58/61] Update Plugin tests to treat copy_paths as a set
+
+Signed-off-by: Bryn M. Reeves <bmr at redhat.com>
+---
+ tests/plugin_tests.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/tests/plugin_tests.py b/tests/plugin_tests.py
+index cf874f1..5074cbf 100644
+--- a/tests/plugin_tests.py
++++ b/tests/plugin_tests.py
+@@ -221,7 +221,7 @@ class AddCopySpecLimitTests(unittest.TestCase):
+ 
+     def test_single_file_under_limit(self):
+         self.mp.add_copy_spec_limit("tests/tail_test.txt", 1)
+-        self.assertEquals(self.mp.copy_specs, ['tests/tail_test.txt'])
++        self.assertEquals(self.mp.copy_paths, set(['tests/tail_test.txt']))
+ 
+     def test_single_file_over_limit(self):
+         fn = create_file(2) # create 2MB file, consider a context manager
+-- 
+1.7.11.7
+
diff --git a/0059-Add-tests-for-Plugin.add_copy_spec-add_copy_specs.patch b/0059-Add-tests-for-Plugin.add_copy_spec-add_copy_specs.patch
new file mode 100644
index 0000000..6dc90e9
--- /dev/null
+++ b/0059-Add-tests-for-Plugin.add_copy_spec-add_copy_specs.patch
@@ -0,0 +1,61 @@
+From c613b172a44c98f40919c763eb4bf088476cbefa Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr at redhat.com>
+Date: Thu, 27 Mar 2014 21:04:42 +0000
+Subject: [PATCH 59/61] Add tests for Plugin.add_copy_spec()/add_copy_specs()
+
+Give add_copy_spec() and add_copy_specs() their own test cases.
+
+Signed-off-by: Bryn M. Reeves <bmr at redhat.com>
+---
+ tests/plugin_tests.py | 26 ++++++++++++++++++++++++--
+ 1 file changed, 24 insertions(+), 2 deletions(-)
+
+diff --git a/tests/plugin_tests.py b/tests/plugin_tests.py
+index 5074cbf..a4905cf 100644
+--- a/tests/plugin_tests.py
++++ b/tests/plugin_tests.py
+@@ -211,7 +211,9 @@ class PluginTests(unittest.TestCase):
+         self.assertEquals(p.archive.m, {})
+ 
+ 
+-class AddCopySpecLimitTests(unittest.TestCase):
++class AddCopySpecTests(unittest.TestCase):
++
++    expect_paths = set(['tests/tail_test.txt'])
+ 
+     def setUp(self):
+         self.mp = MockPlugin({
+@@ -219,9 +221,29 @@ class AddCopySpecLimitTests(unittest.TestCase):
+         })
+         self.mp.archive = MockArchive()
+ 
++    def assert_expect_paths(self):
++        self.assertEquals(self.mp.copy_paths, self.expect_paths)
++        
++    # add_copy_spec()
++
++    def test_single_file(self):
++        self.mp.add_copy_spec('tests/tail_test.txt')
++        self.assert_expect_paths()
++    def test_glob_file(self):
++        self.mp.add_copy_spec('tests/tail_test.*')
++        self.assert_expect_paths()
++
+     def test_single_file_under_limit(self):
+         self.mp.add_copy_spec_limit("tests/tail_test.txt", 1)
+-        self.assertEquals(self.mp.copy_paths, set(['tests/tail_test.txt']))
++        self.assert_expect_paths()
++
++    # add_copy_specs()
++
++    def test_add_copy_specs(self):
++        self.mp.add_copy_specs(["tests/tail_test.txt"])
++        self.assert_expect_paths()
++
++    # add_copy_spec_limit()
+ 
+     def test_single_file_over_limit(self):
+         fn = create_file(2) # create 2MB file, consider a context manager
+-- 
+1.7.11.7
+
diff --git a/0060-Raise-a-TypeError-if-add_copy_specs-is-called-with-a.patch b/0060-Raise-a-TypeError-if-add_copy_specs-is-called-with-a.patch
new file mode 100644
index 0000000..92511d5
--- /dev/null
+++ b/0060-Raise-a-TypeError-if-add_copy_specs-is-called-with-a.patch
@@ -0,0 +1,48 @@
+From 0bedab23f3eb86878d894419614e1728c395a84e Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr at redhat.com>
+Date: Thu, 27 Mar 2014 21:06:24 +0000
+Subject: [PATCH 60/61] Raise a TypeError if add_copy_specs() is called with a
+ string
+
+Since strings are iterable a plugin attempting to call
+add_copy_specs("/something") results in a plugin calling
+add_copy_spec("/"). Raise a TypeError if this happens.
+
+Fixes Issue #141.
+
+Signed-off-by: Bryn M. Reeves <bmr at redhat.com>
+---
+ sos/plugins/__init__.py | 2 ++
+ tests/plugin_tests.py   | 3 +++
+ 2 files changed, 5 insertions(+)
+
+diff --git a/sos/plugins/__init__.py b/sos/plugins/__init__.py
+index 7b6180c..7e865cd 100644
+--- a/sos/plugins/__init__.py
++++ b/sos/plugins/__init__.py
+@@ -394,6 +394,8 @@ class Plugin(object):
+                 self.name(), strfile), _file)
+ 
+     def add_copy_specs(self, copyspecs):
++        if isinstance(copyspecs, six.string_types):
++            raise TypeError("Plugin.add_copy_specs called with string argument")
+         for copyspec in copyspecs:
+             self.add_copy_spec(copyspec)
+ 
+diff --git a/tests/plugin_tests.py b/tests/plugin_tests.py
+index a4905cf..c44c162 100644
+--- a/tests/plugin_tests.py
++++ b/tests/plugin_tests.py
+@@ -243,6 +243,9 @@ class AddCopySpecTests(unittest.TestCase):
+         self.mp.add_copy_specs(["tests/tail_test.txt"])
+         self.assert_expect_paths()
+ 
++    def test_add_copy_spec_nostrings(self):
++        self.assertRaises(TypeError, self.mp.add_copy_specs,"stringsarebadmkay?")
++
+     # add_copy_spec_limit()
+ 
+     def test_single_file_over_limit(self):
+-- 
+1.7.11.7
+
diff --git a/0061-Add-collection-of-grub-configuration-for-UEFI-system.patch b/0061-Add-collection-of-grub-configuration-for-UEFI-system.patch
new file mode 100644
index 0000000..bfe18bc
--- /dev/null
+++ b/0061-Add-collection-of-grub-configuration-for-UEFI-system.patch
@@ -0,0 +1,61 @@
+From efc3b09c2b41c166e54593f0956b9f0eaf374925 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr at redhat.com>
+Date: Fri, 28 Mar 2014 16:29:38 +0000
+Subject: [PATCH 61/61] Add collection of grub configuration for UEFI systems
+
+UEFI systems store the grub configuration at:
+
+  /boot/efi/EFI/*/grub.conf [grub 1.x]
+  /boot/efi/EFI/*/grub.cfg [grub 2.x]
+
+Add these paths to the respective modules.
+
+Signed-off-by: Bryn M. Reeves <bmr at redhat.com>
+---
+ sos/plugins/grub.py  |  2 +-
+ sos/plugins/grub2.py | 11 ++++++-----
+ 2 files changed, 7 insertions(+), 6 deletions(-)
+
+diff --git a/sos/plugins/grub.py b/sos/plugins/grub.py
+index cc4d593..3911041 100644
+--- a/sos/plugins/grub.py
++++ b/sos/plugins/grub.py
+@@ -23,11 +23,11 @@ class Grub(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
+ 
+     def setup(self):
+         self.add_copy_specs([
++            "/boot/efi/EFI/*/grub.conf",
+             "/boot/grub/grub.conf",
+             "/boot/grub/device.map",
+             "/etc/grub.conf",
+             "/etc/grub.d"
+         ])
+ 
+-
+ # vim: et ts=4 sw=4
+diff --git a/sos/plugins/grub2.py b/sos/plugins/grub2.py
+index c9f64b0..95c1218 100644
+--- a/sos/plugins/grub2.py
++++ b/sos/plugins/grub2.py
+@@ -23,12 +23,13 @@ class Grub2(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
+ 
+     def setup(self):
+         self.add_copy_specs([
+-            "/etc/grub.d",
+-            "/etc/grub2.cfg",
+-            "/etc/default/grub",
+-            "/boot/grub/grub.cfg",
++            "/boot/efi/EFI/*/grub.cfg",
+             "/boot/grub2/grub.cfg",
+-            "/boot/grub2/grubenv"
++            "/boot/grub2/grubenv",
++            "/boot/grub/grub.cfg",
++            "/etc/default/grub",
++            "/etc/grub2.cfg",
++            "/etc/grub.d"
+         ])
+         self.add_cmd_output("ls -lanR /boot")
+         self.add_cmd_output("grub2-mkconfig")
+-- 
+1.7.11.7
+
diff --git a/sos.spec b/sos.spec
index b343629..f8cad31 100644
--- a/sos.spec
+++ b/sos.spec
@@ -2,10 +2,10 @@
 
 Summary: A set of tools to gather troubleshooting information from a system
 Name: sos
-Version: 3.0
-Release: 3%{?dist}
+Version: 3.1
+Release: 1%{?dist}
 Group: Applications/System
-Source0: https://people.redhat.com/breeves/sos/releases/sos-3.0.tar.gz
+Source0: https://github.com/sosreport/sosreport/archive/sos-3.1.tar.gz
 License: GPLv2+
 BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-buildroot
 BuildArch: noarch
@@ -17,7 +17,67 @@ Requires: rpm-python
 Requires: tar
 Requires: bzip2
 Requires: xz
-Patch0: sos-silence-could-not-run.patch
+Patch0: 0001-Fix-cluster-module-crm_report-support.patch
+Patch1: 0002-Remove-obsolete-diagnostics-code-from-ldap-plugin.patch
+Patch2: 0003-Ensure-superclass-postproc-method-is-called-in-ldap-.patch
+Patch3: 0004-Fix-cluster-postproc-regression.patch
+Patch4: 0005-Fix-get_option-use-in-cluster-plugin.patch
+Patch5: 0006-Fix-verbose-file-logging.patch
+Patch6: 0007-Always-treat-rhevm-vdsmlogs-option-as-string.patch
+Patch7: 0008-Add-rhsm-debug-collection-to-yum-plugin.patch
+Patch8: 0009-Make-get_cmd_output_now-behaviour-match-2.2.patch
+Patch9: 0010-Include-geo-replication-status-in-gluster-plugin.patch
+Patch10: 0011-postgresql-minor-fixes.patch
+Patch11: 0012-postgresql-add-logs-about-errors-warnings.patch
+Patch12: 0013-postgresql-added-license-and-copyright.patch
+Patch13: 0014-postgresql-allow-use-TCP-socket.patch
+Patch14: 0015-Pass-no-archive-to-rhsm-debug-script.patch
+Patch15: 0016-Ensure-unused-fds-are-closed-when-calling-subprocess.patch
+Patch16: 0017-Fix-gluster-volume-name-extraction.patch
+Patch17: 0018-Add-distupgrade-plugin.patch
+Patch18: 0019-Fix-command-output-substitution-exception.patch
+Patch19: 0020-Improve-error-message-when-cluster.crm_from-is-inval.patch
+Patch20: 0021-Remove-useless-check_enabled-from-sar-plugin.patch
+Patch21: 0022-Eliminate-hard-coded-var-log-sa-paths-in-sar-plugin.patch
+Patch22: 0023-Scrub-ldap_default_authtok-password-in-sssd-plugin.patch
+Patch23: 0024-Replace-package-check-with-file-check-in-anacron.patch
+Patch24: 0025-Remove-the-rhevm-plugin.patch
+Patch25: 0026-powerpc-Move-VPD-related-tool-under-common-code.patch
+Patch26: 0027-Add-PowerNV-specific-debug-data.patch
+Patch27: 0028-Fix-remaining-use-of-obsolete-get_cmd_dir-in-plugins.patch
+Patch28: 0029-Update-systemd-support.patch
+Patch29: 0030-Add-tuned-plugin.patch
+Patch30: 0031-Clean-up-get_cmd_path-make_cmd_path-make_cmd_dirs-me.patch
+Patch31: 0032-Fix-broken-binary-detection-in-satellite-plugin.patch
+Patch32: 0033-Rename-validatePlugin-to-validate_plugin.patch
+Patch33: 0034-Update-policy_tests.py-for-validate_plugin-change.patch
+Patch34: 0035-Match-plugins-against-policies.patch
+Patch35: 0036-Do-not-collect-isos-in-cobbler-plugin.patch
+Patch36: 0037-Call-rhsm-debug-with-the-sos-switch.patch
+Patch37: 0038-Fix-plugin_test-exception-on-six.PY2.patch
+Patch38: 0039-Remove-profile-support.patch
+Patch39: 0040-Dead-code-removal-sos_relative_path.patch
+Patch40: 0041-Dead-code-removal-DirTree.patch
+Patch41: 0042-Dead-code-removal-utilities.checksum.patch
+Patch42: 0043-Add-vim-tags-to-all-python-source-files.patch
+Patch43: 0044-Dead-code-removal-sos.plugins.common_prefix.patch
+Patch44: 0045-Dead-code-removal-PluginException.patch
+Patch45: 0046-Convert-infiniband-to-package-list.patch
+Patch46: 0047-Replace-self.policy-.pkg_by_name-us-in-Logs-plugin.patch
+Patch47: 0048-Clean-up-package-checks-in-processor-plugin.patch
+Patch48: 0049-Pythonify-Plugin._path_in_pathlist.patch
+Patch49: 0050-Fix-x86-arch-detection-in-processor-plugin.patch
+Patch50: 0051-Refactor-Plugin.collect-pathway.patch
+Patch51: 0052-Remove-obsolete-checksum-reference-from-utilities_te.patch
+Patch52: 0053-Update-plugin_tests.py-to-match-new-method-names.patch
+Patch53: 0054-Drop-RedHatPlugin-from-procenv.patch
+Patch54: 0055-Remove-sub-parameter-from-Plugin.add_copy_spec.patch
+Patch55: 0056-Remove-references-to-sub-parameter-from-plugin-tests.patch
+Patch56: 0057-Use-a-set-for-Plugin.copy_paths.patch
+Patch57: 0058-Update-Plugin-tests-to-treat-copy_paths-as-a-set.patch
+Patch58: 0059-Add-tests-for-Plugin.add_copy_spec-add_copy_specs.patch
+Patch59: 0060-Raise-a-TypeError-if-add_copy_specs-is-called-with-a.patch
+Patch60: 0061-Add-collection-of-grub-configuration-for-UEFI-system.patch
 
 %description
 Sos is a set of tools that gathers information about system
@@ -26,8 +86,69 @@ diagnostic purposes and debugging. Sos is commonly used to help
 support technicians and developers.
 
 %prep
-%setup -q
+# deal with github tarball naming scheme
+%setup -q -n sosreport-sos-%{version}
 %patch0 -p1
+%patch1 -p1
+%patch2 -p1
+%patch3 -p1
+%patch4 -p1
+%patch5 -p1
+%patch6 -p1
+%patch7 -p1
+%patch8 -p1
+%patch9 -p1
+%patch10 -p1
+%patch11 -p1
+%patch12 -p1
+%patch13 -p1
+%patch14 -p1
+%patch15 -p1
+%patch16 -p1
+%patch17 -p1
+%patch18 -p1
+%patch19 -p1
+%patch20 -p1
+%patch21 -p1
+%patch22 -p1
+%patch23 -p1
+%patch24 -p1
+%patch25 -p1
+%patch26 -p1
+%patch27 -p1
+%patch28 -p1
+%patch29 -p1
+%patch30 -p1
+%patch31 -p1
+%patch32 -p1
+%patch33 -p1
+%patch34 -p1
+%patch35 -p1
+%patch36 -p1
+%patch37 -p1
+%patch38 -p1
+%patch39 -p1
+%patch40 -p1
+%patch41 -p1
+%patch42 -p1
+%patch43 -p1
+%patch44 -p1
+%patch45 -p1
+%patch46 -p1
+%patch47 -p1
+%patch48 -p1
+%patch49 -p1
+%patch50 -p1
+%patch51 -p1
+%patch52 -p1
+%patch53 -p1
+%patch54 -p1
+%patch55 -p1
+%patch56 -p1
+%patch57 -p1
+%patch58 -p1
+%patch59 -p1
+%patch60 -p1
 %build
 make
 
@@ -50,6 +171,164 @@ rm -rf ${RPM_BUILD_ROOT}
 %config(noreplace) %{_sysconfdir}/sos.conf
 
 %changelog
+* Tue Apr 01 2014 Bryn M. Reeves <bmr at redhat.com> = 3.1-1
+- Update to new upstream release sos-3.1
+- Add collection of grub configuration for UEFI systems
+- Raise a TypeError if add_copy_specs() is called with a string
+- Add tests for Plugin.add_copy_spec()/add_copy_specs()
+- Update Plugin tests to treat copy_paths as a set
+- Use a set for Plugin.copy_paths
+- Remove references to 'sub' parameter from plugin tests
+- Remove 'sub' parameter from Plugin.add_copy_spec*()
+- Drop RedHatPlugin from procenv
+- Update plugin_tests.py to match new method names
+- Remove obsolete checksum reference from utilities_tests.py
+- Refactor Plugin.collect() pathway
+- Fix x86 arch detection in processor plugin
+- Pythonify Plugin._path_in_pathlist()
+- Clean up package checks in processor plugin
+- Replace self.policy().pkg_by_name() us in Logs plugin
+- Convert infiniband to package list
+- Dead code removal: PluginException
+- Dead code removal: sos.plugins.common_prefix()
+- Add vim tags to all python source files
+- Dead code removal: utilities.checksum()
+- Dead code removal: DirTree
+- Dead code removal: sos_relative_path()
+- Remove --profile support
+- Fix plugin_test exception on six.PY2
+- Call rhsm-debug with the --sos switch
+- Do not collect isos in cobbler plugin
+- Match plugins against policies
+- Update policy_tests.py for validate_plugin change
+- Rename validatePlugin to validate_plugin
+- Fix broken binary detection in satellite plugin
+- Clean up get_cmd_path/make_cmd_path/make_cmd_dirs mess
+- Add tuned plugin
+- Update systemd support
+- Fix remaining use of obsolete 'get_cmd_dir()' in plugins
+- Add PowerNV specific debug data
+- powerpc: Move VPD related tool under common code
+- Remove the rhevm plugin.
+- Replace package check with file check in anacron
+- Scrub ldap_default_authtok password in sssd plugin
+- Eliminate hard-coded /var/log/sa paths in sar plugin
+- Remove useless check_enabled() from sar plugin
+- Improve error message when cluster.crm_from is invalid
+- Fix command output substitution exception
+- Add distupgrade plugin
+- Fix gluster volume name extraction
+- Ensure unused fds are closed when calling subprocesses via Popen
+- Pass --no-archive to rhsm-debug script
+- postgresql: allow use TCP socket
+- postgresql: added license and copyright
+- postgresql: add logs about errors / warnings
+- postgresql: minor fixes
+- Include geo-replication status in gluster plugin
+- Make get_cmd_output_now() behaviour match 2.2
+- Add rhsm-debug collection to yum plugin
+- Always treat rhevm vdsmlogs option as string
+- Fix verbose file logging
+- Fix get_option() use in cluster plugin
+- Fix cluster postproc regression
+- Ensure superclass postproc method is called in ldap plugin
+- Remove obsolete diagnostics code from ldap plugin
+- Fix cluster module crm_report support
+
+* Thu Mar 20 2014 Bryn M. Reeves <bmr at redhat.com> = 3.0-23
+- Call rhsm-debug with the --sos switch
+
+* Mon Mar 03 2014 Bryn M. Reeves <bmr at redhat.com> = 3.0-22
+- Fix package check in anacron plugin
+
+* Wed Feb 12 2014 Bryn M. Reeves <bmr at redhat.com> = 3.0-21
+- Remove obsolete rhel_version() usage from yum plugin
+
+* Tue Feb 11 2014 Bryn M. Reeves <bmr at redhat.com> = 3.0-20
+- Prevent unhandled exception during command output substitution
+
+* Mon Feb 10 2014 Bryn M. Reeves <bmr at redhat.com> = 3.0-19
+- Fix generation of volume names in gluster plugin
+- Add distupgrade plugin
+
+* Tue Feb 04 2014 Bryn M. Reeves <bmr at redhat.com> = 3.0-18
+- Prevent file descriptor leaks when using Popen
+- Disable zip archive creation when running rhsm-debug
+- Include volume geo-replication status in gluster plugin
+
+* Mon Feb 03 2014 Bryn M. Reeves <bmr at redhat.com> = 3.0-17
+- Fix get_option use in cluster plugin
+- Fix debug logging to file when given '-v'
+- Always treat rhevm plugin's vdsmlogs option as a string
+- Run the rhsm-debug script from yum plugin
+
+* Fri Jan 31 2014 Bryn M. Reeves <bmr at redhat.com> = 3.0-16
+- Add new plugin to collect OpenHPI configuration
+- Fix cluster plugin crm_report support
+- Fix file postprocessing in ldap plugin
+- Remove collection of anaconda-ks.cfg from general plugin
+
+* Fri Jan 24 2014 Bryn M. Reeves <bmr at redhat.com> = 3.0-15
+- Remove debug statements from logs plugin
+- Make ethernet interface detection more robust
+- Fix specifying multiple plugin options on the command line
+- Make log and message levels match previous versions
+- Log a warning message when external commands time out
+- Remove --upload command line option
+- Update sos UI text to match upstream
+
+* Fri Dec 27 2013 Daniel Mach <dmach at redhat.com> = 3.0-14
+- Mass rebuild 2013-12-27
+
+* Thu Nov 14 2013 Bryn M. Reeves <bmr at redhat.com> = 3.0-13
+- Fix regressions introduced with --build option
+
+* Tue Nov 12 2013 Bryn M. Reeves <bmr at redhat.com> = 3.0-12
+- Fix typo in yum plug-in add_forbidden_paths
+- Add krb5 plug-in and drop collection of krb5.keytab
+
+* Fri Nov  8 2013 Bryn M. Reeves <bmr at redhat.com> = 3.0-10
+- Add nfs client plug-in
+- Fix traceback when sar module force-enabled
+
+* Thu Nov  7 2013 Bryn M. Reeves <bmr at redhat.com> = 3.0-9
+- Restore --build command line option
+- Collect saved vmcore-dmesg.txt files
+- Normalize temporary directory paths
+
+* Tue Nov  5 2013 Bryn M. Reeves <bmr at redhat.com> = 3.0-7
+- Add domainname output to NIS plug-in
+- Collect /var/log/squid in squid plug-in
+- Collect mountstats and mountinfo in filesys plug-in
+- Add PowerPC plug-in from upstream
+
+* Thu Oct 31 2013 Bryn M. Reeves <bmr at redhat.com> = 3.0-6
+- Remove version checks in gluster plug-in
+- Check for usable temporary directory
+- Fix --alloptions command line option
+- Fix configuration fail regression
+
+* Wed Oct 30 2013 Bryn M. Reeves <bmr at redhat.com> = 3.0-5
+- Include /etc/yaboot.conf in boot plug-in
+- Fix collection of brctl output in networking plug-in
+- Verify limited set of RPM packages by default
+- Do not strip newlines from command output
+- Limit default sar data collection
+
+* Thu Oct 3 2013 Bryn M. Reeves <bmr at redhat.com> = 3.0-4
+- Do not attempt to read RPC pseudo files in networking plug-in
+- Restrict wbinfo collection to the current domain
+- Add obfuscation of luci secrets to cluster plug-in
+- Add XFS plug-in
+- Fix policy class handling of --tmp-dir
+- Do not set batch mode if stdin is not a TTY
+- Attempt to continue when reading bad input in interactive mode
+
+* Wed Aug 14 2013 Bryn M. Reeves <bmr at redhat.com> = 3.0-3
+- Add crm_report support to cluster plug-in
+- Fix rhel_version() usage in cluster and s390 plug-ins
+- Strip trailing newline from command output
+
 * Sun Aug 04 2013 Fedora Release Engineering <rel-eng at lists.fedoraproject.org> - 3.0-3
 - Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild
 
diff --git a/sources b/sources
index 2df3930..080d2c4 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-9963fc9934596ffd0adb585f8858a68c  sos-3.0.tar.gz
+4c05e494f80e8e2d7c272098462e5fb8  sos-3.1.tar.gz


More information about the scm-commits mailing list