diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..1b546cb
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+SOURCES/sos-3.2.tar.gz
diff --git a/.sos.metadata b/.sos.metadata
new file mode 100644
index 0000000..43e2b07
--- /dev/null
+++ b/.sos.metadata
@@ -0,0 +1 @@
+305adf65f683708e42114bea2d01ad8c795e2503 SOURCES/sos-3.2.tar.gz
diff --git a/README.md b/README.md
deleted file mode 100644
index 0e7897f..0000000
--- a/README.md
+++ /dev/null
@@ -1,5 +0,0 @@
-The master branch has no content
- 
-Look at the c7 branch if you are working with CentOS-7, or the c4/c5/c6 branch for CentOS-4, 5 or 6
- 
-If you find this file in a distro specific branch, it means that no content has been checked in yet
diff --git a/SOURCES/0001-utilities-invert-sense-of-six.PY2-test.patch b/SOURCES/0001-utilities-invert-sense-of-six.PY2-test.patch
new file mode 100644
index 0000000..08bd51c
--- /dev/null
+++ b/SOURCES/0001-utilities-invert-sense-of-six.PY2-test.patch
@@ -0,0 +1,31 @@
+From b61a193b98b896164a8caefa088bb09297f1e3ca Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Wed, 1 Oct 2014 17:08:50 +0100
+Subject: [PATCH 01/93] [utilities] invert sense of six.PY2 test
+
+Old versions of six do not include a 'PY2' attribute leading to
+an exception in sos_get_command_output(). Invert the sense of the
+test and check that six.PY3 is false instead as all versions of
+the module include this attribute.
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/utilities.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/sos/utilities.py b/sos/utilities.py
+index 7c06781..7e8cd7e 100644
+--- a/sos/utilities.py
++++ b/sos/utilities.py
+@@ -139,7 +139,7 @@ def sos_get_command_output(command, timeout=300, runat=None):
+         command = "timeout %ds %s" % (timeout, command)
+ 
+     # shlex.split() reacts badly to unicode on older python runtimes.
+-    if six.PY2:
++    if not six.PY3:
+         command = command.encode('utf-8')
+     args = shlex.split(command)
+     try:
+-- 
+1.9.3
+
diff --git a/SOURCES/0002-archive-invert-sense-of-six.PY2-test.patch b/SOURCES/0002-archive-invert-sense-of-six.PY2-test.patch
new file mode 100644
index 0000000..0d890d1
--- /dev/null
+++ b/SOURCES/0002-archive-invert-sense-of-six.PY2-test.patch
@@ -0,0 +1,31 @@
+From f9c811abc07f1e3044b1dbf29fdd5cd1f68812bc Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Wed, 1 Oct 2014 17:34:56 +0100
+Subject: [PATCH 02/93] [archive] invert sense of six.PY2 test
+
+Old versions of six do not include a 'PY2' attribute leading to
+an exception in sos_get_command_output(). Invert the sense of the
+test and check that six.PY3 is false instead as all versions of
+the module include this attribute.
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/archive.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/sos/archive.py b/sos/archive.py
+index 245f904..2e42bbd 100644
+--- a/sos/archive.py
++++ b/sos/archive.py
+@@ -357,7 +357,7 @@ class TarFileArchive(FileCacheArchive):
+ 
+     def _build_archive(self):
+         # python2.6 TarFile lacks the filter parameter
+-        if six.PY2 and sys.version_info[1] < 7:
++        if not six.PY3 and sys.version_info[1] < 7:
+             tar = _TarFile.open(self._archive_name, mode="w")
+         else:
+             tar = tarfile.open(self._archive_name, mode="w")
+-- 
+1.9.3
+
diff --git a/SOURCES/0003-yum-call-rhsm-debug-with-no-subscriptions.patch b/SOURCES/0003-yum-call-rhsm-debug-with-no-subscriptions.patch
new file mode 100644
index 0000000..4656953
--- /dev/null
+++ b/SOURCES/0003-yum-call-rhsm-debug-with-no-subscriptions.patch
@@ -0,0 +1,26 @@
+From e8428d458cfd65bdc34d69f32db0bf4f5aca7540 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Thu, 2 Oct 2014 17:16:55 +0100
+Subject: [PATCH 03/93] [yum] call rhsm-debug with --no-subscriptions
+
+Signed-off-by: Bryn M. Reeves <bmr@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 7dac5e4..816e2b0 100644
+--- a/sos/plugins/yum.py
++++ b/sos/plugins/yum.py
+@@ -54,7 +54,7 @@ class Yum(Plugin, RedHatPlugin):
+             "subscription-manager list --consumed"
+         ])
+         self.add_cmd_output("rhsm-debug system --sos --no-archive "
+-                            "--destination %s"
++                            "--no-subscriptions --destination %s"
+                             % self.get_cmd_output_path())
+ 
+         if self.get_option("yumlist"):
+-- 
+1.9.3
+
diff --git a/SOURCES/0004-powerpc-allow-PowerPC-plugin-to-run-on-ppc64le.patch b/SOURCES/0004-powerpc-allow-PowerPC-plugin-to-run-on-ppc64le.patch
new file mode 100644
index 0000000..33b9477
--- /dev/null
+++ b/SOURCES/0004-powerpc-allow-PowerPC-plugin-to-run-on-ppc64le.patch
@@ -0,0 +1,31 @@
+From 988fee7e6d0c2c91cf1f2c9363d4e3cea7244163 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Thu, 2 Oct 2014 17:25:17 +0100
+Subject: [PATCH 04/93] [powerpc] allow PowerPC plugin to run on ppc64le
+
+The plugin currently tests whether policy().get_arch() is equal
+to "ppc64". On little endian PowerPC machines this method returns
+"ppc64le". Change the check_enabled() method to test whether the
+returned string contains "ppc64".
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/plugins/powerpc.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/sos/plugins/powerpc.py b/sos/plugins/powerpc.py
+index 896d1d4..39b52f6 100644
+--- a/sos/plugins/powerpc.py
++++ b/sos/plugins/powerpc.py
+@@ -27,7 +27,7 @@ class PowerPC(Plugin, RedHatPlugin, UbuntuPlugin, DebianPlugin):
+     profiles = ('system', 'hardware')
+ 
+     def check_enabled(self):
+-        return (self.policy().get_arch() == "ppc64")
++        return "ppc64" in self.policy().get_arch()
+ 
+     def setup(self):
+         try:
+-- 
+1.9.3
+
diff --git a/SOURCES/0005-Makefile-Add-debian-pkg-tarball-build.patch b/SOURCES/0005-Makefile-Add-debian-pkg-tarball-build.patch
new file mode 100644
index 0000000..fa87091
--- /dev/null
+++ b/SOURCES/0005-Makefile-Add-debian-pkg-tarball-build.patch
@@ -0,0 +1,49 @@
+From eb45b46bf810e231fa272b05960435998b2af8a2 Mon Sep 17 00:00:00 2001
+From: Louis Bouchard <louis.bouchard@canonical.com>
+Date: Wed, 1 Oct 2014 11:51:39 +0200
+Subject: [PATCH 05/93] [Makefile] Add debian pkg tarball build
+
+Fixes #418
+
+Signed-off-by: Louis Bouchard <louis.bouchard@canonical.com>
+Signed-off-by: Adam Stokes <adam.stokes@ubuntu.com>
+---
+ Makefile | 13 ++++++++++++-
+ 1 file changed, 12 insertions(+), 1 deletion(-)
+
+diff --git a/Makefile b/Makefile
+index 52df559..df26453 100644
+--- a/Makefile
++++ b/Makefile
+@@ -25,6 +25,7 @@ RPM_DEFINES = --define "_topdir %(pwd)/$(DIST_BUILD_DIR)" \
+ RPM = rpmbuild
+ RPM_WITH_DIRS = $(RPM) $(RPM_DEFINES)
+ ARCHIVE_DIR = $(DIST_BUILD_DIR)/$(NAME)-$(VERSION)
++DEB_ARCHIVE_DIR = $(DIST_BUILD_DIR)/$(NAME)report-$(VERSION)
+ 
+ SRC_BUILD = $(DIST_BUILD_DIR)/sdist
+ PO_DIR = $(SRC_BUILD)/sos/po
+@@ -52,9 +53,19 @@ updateversion:
+ 
+ $(NAME)-$(VERSION).tar.gz: clean
+ 	@mkdir -p $(ARCHIVE_DIR)
+-	@tar -cv sosreport sos doc man po sos.conf AUTHORS LICENSE README.md sos.spec Makefile | tar -x -C $(ARCHIVE_DIR)
++	@tar -cv sosreport sos docs man po sos.conf AUTHORS LICENSE README.md sos.spec Makefile | tar -x -C $(ARCHIVE_DIR)
+ 	@tar Ccvzf $(DIST_BUILD_DIR) $(DIST_BUILD_DIR)/$(NAME)-$(VERSION).tar.gz $(NAME)-$(VERSION) --exclude-vcs
+ 
++$(NAME)report_$(VERSION).orig.tar.gz: clean
++	@mkdir -p $(DEB_ARCHIVE_DIR)
++	@tar --exclude-vcs \
++             --exclude=.travis.yml \
++             --exclude=debian \
++             --exclude=$(DIST_BUILD_DIR) -cv . | tar -x -C $(DEB_ARCHIVE_DIR)
++	@tar Ccvzf $(DIST_BUILD_DIR) $(DIST_BUILD_DIR)/$(NAME)report_$(VERSION).orig.tar.gz $(NAME)report-$(VERSION)
++	@mv $(DIST_BUILD_DIR)/$(NAME)report_$(VERSION).orig.tar.gz .
++	@rm -Rf $(DIST_BUILD_DIR)
++
+ clean:
+ 	@rm -fv *~ .*~ changenew ChangeLog.old $(NAME)-$(VERSION).tar.gz sosreport.1.gz sos.conf.5.gz
+ 	@rm -rf rpm-build
+-- 
+1.9.3
+
diff --git a/SOURCES/0006-debian-changelog-update-changelog-to-new-release.patch b/SOURCES/0006-debian-changelog-update-changelog-to-new-release.patch
new file mode 100644
index 0000000..886dbde
--- /dev/null
+++ b/SOURCES/0006-debian-changelog-update-changelog-to-new-release.patch
@@ -0,0 +1,41 @@
+From 82f1ae00d5c6f5b293c818a38eccf633452a8b96 Mon Sep 17 00:00:00 2001
+From: Adam Stokes <adam.stokes@ubuntu.com>
+Date: Sun, 12 Oct 2014 12:48:25 -0400
+Subject: [PATCH 06/93] [debian/changelog] update changelog to new release
+
+Syncs up the version within the changelog to the latest
+release.
+
+Signed-off-by: Adam Stokes <adam.stokes@ubuntu.com>
+---
+ debian/changelog | 17 +++++++++++++++++
+ 1 file changed, 17 insertions(+)
+
+diff --git a/debian/changelog b/debian/changelog
+index a4426d2..e328527 100644
+--- a/debian/changelog
++++ b/debian/changelog
+@@ -1,3 +1,20 @@
++sosreport (3.2-1) unstable; urgency=medium
++
++  * Profiles for plugin selection
++  * Improved log size limiting
++  * File archiving enhancements and robustness improvements
++  * Global plugin options:
++        --verify, --log-size, --all-logs
++  * Better plugin descriptions
++  * Improved journalctl log capture
++  * PEP8 compliant code base
++  * oVirt support improvements
++  * New plugins: hpasm, ctdb, dbus, oVirt engine hosted,
++	MongoDB, ActiveMQ, OpenShift 2.0, MegaCLI, FCoE,
++	python, Ubuntu, NUMA, Team network driver
++
++ -- Adam Stokes <adam.stokes@ubuntu.com>  Sun, 12 Oct 2014 12:47:23 -0400
++
+ sosreport (3.1-1) unstable; urgency=low
+ 
+   * New upstream release v3.1
+-- 
+1.9.3
+
diff --git a/SOURCES/0007-apt-Fix-failing-apt-cache-policy-details.patch b/SOURCES/0007-apt-Fix-failing-apt-cache-policy-details.patch
new file mode 100644
index 0000000..49802d3
--- /dev/null
+++ b/SOURCES/0007-apt-Fix-failing-apt-cache-policy-details.patch
@@ -0,0 +1,51 @@
+From b0938e14eedd33c5c82d9d745310792d4a249c72 Mon Sep 17 00:00:00 2001
+From: Louis Bouchard <louis.bouchard@canonical.com>
+Date: Thu, 2 Oct 2014 17:41:48 +0200
+Subject: [PATCH 07/93] [apt] Fix failing apt-cache policy details
+
+Split add_cmd_output to use suggest_filename since the
+output of apt-cache policy for each installed package
+would create an incredibly long filename.
+
+Fixes #415.
+
+Signed-off-by: Louis Bouchard <louis.bouchard@canonical.com>
+---
+ sos/plugins/apt.py | 17 ++++++++++-------
+ 1 file changed, 10 insertions(+), 7 deletions(-)
+
+diff --git a/sos/plugins/apt.py b/sos/plugins/apt.py
+index 091d30f..bd0b336 100644
+--- a/sos/plugins/apt.py
++++ b/sos/plugins/apt.py
+@@ -29,17 +29,20 @@ class Apt(Plugin, DebianPlugin, UbuntuPlugin):
+             "/etc/apt", "/var/log/apt"
+         ])
+ 
+-        dpkg_result = self.call_ext_prog(
+-            "dpkg-query -W -f='${binary:Package}\t${status}\n'")
+-        dpkg_output = dpkg_result['output'].splitlines()
+-        pkg_list = ' '.join(
+-            [v.split('\t')[0] for v in dpkg_output if 'ok installed' in v])
+         self.add_cmd_output([
+             "apt-get check",
+             "apt-config dump",
+             "apt-cache stats",
+-            "apt-cache policy",
+-            "apt-cache policy {}".format(pkg_list)
++            "apt-cache policy"
+         ])
++        dpkg_result = self.call_ext_prog(
++            "dpkg-query -W -f='${binary:Package}\t${status}\n'")
++        dpkg_output = dpkg_result['output'].splitlines()
++        pkg_list = ' '.join(
++            [v.split('\t')[0] for v in dpkg_output if 'ok installed' in v])
++        self.add_cmd_output(
++            "apt-cache policy {}".format(pkg_list),
++            suggest_filename="apt-cache_policy_details"
++        )
+ 
+ # vim: et ts=4 sw=4
+-- 
+1.9.3
+
diff --git a/SOURCES/0008-debian-changelog-Fix-tab-spacing.patch b/SOURCES/0008-debian-changelog-Fix-tab-spacing.patch
new file mode 100644
index 0000000..881638c
--- /dev/null
+++ b/SOURCES/0008-debian-changelog-Fix-tab-spacing.patch
@@ -0,0 +1,28 @@
+From bed60dbd576089714d8136b946a46e829bf42971 Mon Sep 17 00:00:00 2001
+From: Louis Bouchard <louis.bouchard@canonical.com>
+Date: Mon, 13 Oct 2014 11:45:19 +0200
+Subject: [PATCH 08/93] [debian/changelog] Fix tab spacing
+
+Signed-off-by: Louis Bouchard <louis.bouchard@canonical.com>
+---
+ debian/changelog | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/debian/changelog b/debian/changelog
+index e328527..231eb5c 100644
+--- a/debian/changelog
++++ b/debian/changelog
+@@ -10,8 +10,8 @@ sosreport (3.2-1) unstable; urgency=medium
+   * PEP8 compliant code base
+   * oVirt support improvements
+   * New plugins: hpasm, ctdb, dbus, oVirt engine hosted,
+-	MongoDB, ActiveMQ, OpenShift 2.0, MegaCLI, FCoE,
+-	python, Ubuntu, NUMA, Team network driver
++        MongoDB, ActiveMQ, OpenShift 2.0, MegaCLI, FCoE,
++        python, Ubuntu, NUMA, Team network driver
+ 
+  -- Adam Stokes <adam.stokes@ubuntu.com>  Sun, 12 Oct 2014 12:47:23 -0400
+ 
+-- 
+1.9.3
+
diff --git a/SOURCES/0009-kpatch-do-not-try-to-read-kpatch-data-if-it-could-no.patch b/SOURCES/0009-kpatch-do-not-try-to-read-kpatch-data-if-it-could-no.patch
new file mode 100644
index 0000000..14f7713
--- /dev/null
+++ b/SOURCES/0009-kpatch-do-not-try-to-read-kpatch-data-if-it-could-no.patch
@@ -0,0 +1,33 @@
+From 6b43c42078604b0551923c2801108848e97ba3b9 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Tue, 14 Oct 2014 15:43:20 +0100
+Subject: [PATCH 09/93] [kpatch] do not try to read kpatch data if it could not
+ be run
+
+Everything the kpatch plugin does requires the list of available
+kpatch patches obtained from 'kpatch list'. If this fails return
+immediately from the setup method.
+
+Fixes #417.
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/plugins/kpatch.py | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/sos/plugins/kpatch.py b/sos/plugins/kpatch.py
+index 7909926..6ef557e 100644
+--- a/sos/plugins/kpatch.py
++++ b/sos/plugins/kpatch.py
+@@ -27,6 +27,8 @@ class Kpatch(Plugin, RedHatPlugin):
+ 
+     def setup(self):
+         kpatch_list = self.get_cmd_output_now("kpatch list")
++        if not kpatch_list:
++            return
+         kpatches = open(kpatch_list, "r").read().splitlines()
+         for patch in kpatches:
+             if not re.match("^kpatch-.*\(.*\)", patch):
+-- 
+1.9.3
+
diff --git a/SOURCES/0010-ovirt_hosted_engine-fix-exception-when-force-enabled.patch b/SOURCES/0010-ovirt_hosted_engine-fix-exception-when-force-enabled.patch
new file mode 100644
index 0000000..156b930
--- /dev/null
+++ b/SOURCES/0010-ovirt_hosted_engine-fix-exception-when-force-enabled.patch
@@ -0,0 +1,31 @@
+From f9aefde0d7f74867031a00b52f72d0ad1ff9463b Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Wed, 15 Oct 2014 15:51:13 +0100
+Subject: [PATCH 10/93] [ovirt_hosted_engine] fix exception when force-enabled
+
+Fixes #416.
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/plugins/ovirt_hosted_engine.py | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/sos/plugins/ovirt_hosted_engine.py b/sos/plugins/ovirt_hosted_engine.py
+index aee8bc0..02cb2b6 100644
+--- a/sos/plugins/ovirt_hosted_engine.py
++++ b/sos/plugins/ovirt_hosted_engine.py
+@@ -56,8 +56,9 @@ class OvirtHostedEngine(Plugin, RedHatPlugin):
+ 
+         all_setup_logs = glob.glob(self.SETUP_LOG_GLOB)
+         all_setup_logs.sort(reverse=True)
+-        # Add latest ovirt-hosted-engine-setup log file
+-        self.add_copy_spec(all_setup_logs[0])
++        if len(all_setup_logs):
++            # Add latest ovirt-hosted-engine-setup log file
++            self.add_copy_spec(all_setup_logs[0])
+         # Add older ovirt-hosted-engine-setup log files only if requested
+         if self.get_option('all_logs'):
+             self.add_copy_spec_limit(
+-- 
+1.9.3
+
diff --git a/SOURCES/0011-corosync-add-postprocessing-for-corosync-objctl-outp.patch b/SOURCES/0011-corosync-add-postprocessing-for-corosync-objctl-outp.patch
new file mode 100644
index 0000000..4a2d126
--- /dev/null
+++ b/SOURCES/0011-corosync-add-postprocessing-for-corosync-objctl-outp.patch
@@ -0,0 +1,36 @@
+From 77ea53cf7c13c59c2a1f4608d59e1b9e8f4da835 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Wed, 15 Oct 2014 15:57:47 +0100
+Subject: [PATCH 11/93] [corosync] add postprocessing for corosync-objctl
+ output
+
+The corosync-objctl command may include fence device passwords in
+its output. Remove them with the same postprocessing regex as the
+cluster plugin uses.
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/plugins/corosync.py | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+diff --git a/sos/plugins/corosync.py b/sos/plugins/corosync.py
+index 2cd22c3..db9b547 100644
+--- a/sos/plugins/corosync.py
++++ b/sos/plugins/corosync.py
+@@ -40,6 +40,13 @@ class Corosync(Plugin):
+         ])
+         self.call_ext_prog("killall -USR2 corosync")
+ 
++    def postproc(self):
++        self.do_cmd_output_sub(
++            "corosync-objctl",
++            r"(.*fence.*\.passwd=)(.*)",
++            r"\1******"
++        )
++
+ 
+ class RedHatCorosync(Corosync, RedHatPlugin):
+ 
+-- 
+1.9.3
+
diff --git a/SOURCES/0012-tomcat-add-support-for-tomcat7-and-log-size-limits.patch b/SOURCES/0012-tomcat-add-support-for-tomcat7-and-log-size-limits.patch
new file mode 100644
index 0000000..aa93a07
--- /dev/null
+++ b/SOURCES/0012-tomcat-add-support-for-tomcat7-and-log-size-limits.patch
@@ -0,0 +1,48 @@
+From 874cc7d0889adf32b8c36bb218212d3304d43d5b Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Mon, 20 Oct 2014 09:13:07 +0100
+Subject: [PATCH 12/93] [tomcat] add support for tomcat7 and log size limits
+
+Based on a patch from Pavel Moravec in Issue #412.
+
+Fixes #412.
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/plugins/tomcat.py | 14 +++++++++-----
+ 1 file changed, 9 insertions(+), 5 deletions(-)
+
+diff --git a/sos/plugins/tomcat.py b/sos/plugins/tomcat.py
+index b7aea2c..4f78c1d 100644
+--- a/sos/plugins/tomcat.py
++++ b/sos/plugins/tomcat.py
+@@ -22,17 +22,21 @@ class Tomcat(Plugin, RedHatPlugin):
+     plugin_name = 'tomcat'
+     profiles = ('webserver', 'java', 'services')
+ 
+-    packages = ('tomcat6',)
++    packages = ('tomcat6', 'tomcat')
+ 
+     def setup(self):
+         self.add_copy_spec([
+-            "/etc/tomcat6",
+-            "/var/log/tomcat6/catalina.out"
++            "/etc/tomcat",
++            "/etc/tomcat6"
+         ])
+ 
++        limit = self.get_option("log_size")
++        log_glob = "/var/log/tomcat*/catalina.out"
++        self.add_copy_spec_limit(log_glob, sizelimit=limit)
++
+     def postproc(self):
+-        self.do_file_sub(
+-            "/etc/tomcat6/tomcat-users.xml",
++        self.do_path_regex_sub(
++            r"\/etc\/tomcat.*\/tomcat-users.xml",
+             r"password=(\S*)",
+             r'password="********"'
+         )
+-- 
+1.9.3
+
diff --git a/SOURCES/0013-mysql-obtain-dbpass-from-the-environment.patch b/SOURCES/0013-mysql-obtain-dbpass-from-the-environment.patch
new file mode 100644
index 0000000..e0ea6f7
--- /dev/null
+++ b/SOURCES/0013-mysql-obtain-dbpass-from-the-environment.patch
@@ -0,0 +1,51 @@
+From 3d4cf0365d520be81abfe3435fa9a8a56a933961 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Mon, 20 Oct 2014 09:31:32 +0100
+Subject: [PATCH 13/93] [mysql] obtain dbpass from the environment
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/plugins/mysql.py | 13 ++++++++++---
+ 1 file changed, 10 insertions(+), 3 deletions(-)
+
+diff --git a/sos/plugins/mysql.py b/sos/plugins/mysql.py
+index 8bc6e72..1203f5c 100644
+--- a/sos/plugins/mysql.py
++++ b/sos/plugins/mysql.py
+@@ -13,7 +13,7 @@
+ # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ 
+ from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin
+-
++import os
+ 
+ class Mysql(Plugin):
+     """MySQL and MariaDB RDBMS
+@@ -25,7 +25,7 @@ class Mysql(Plugin):
+ 
+     option_list = [
+         ("dbuser", "username for database dumps", "", "mysql"),
+-        ("dbpass", "password for database dumps", "", ""),
++        ("dbpass", "password for database dumps", "", False),
+         ("dbdump", "collect a database dump", "", False)
+     ]
+ 
+@@ -44,7 +44,14 @@ class Mysql(Plugin):
+         if self.get_option("dbdump"):
+             dbuser = self.get_option("dbuser")
+             dbpass = self.get_option("dbpass")
+-            opts = "--user=%s --password=%s --all-databases" % (dbuser, dbpass)
++            if dbpass == False and 'MYSQL_PWD' in os.environ:
++                dbpass = os.environ['MYSQL_PWD']
++            else:
++                # no MySQL password
++                return
++            os.environ['MYSQL_PWD'] = dbpass
++
++            opts = "--user=%s --all-databases" % dbuser
+             name = "mysqldump_--all-databases"
+             self.add_cmd_output("mysqldump %s" % opts, suggest_filename=name)
+ 
+-- 
+1.9.3
+
diff --git a/SOURCES/0014-mysql-fix-pep8-violations.patch b/SOURCES/0014-mysql-fix-pep8-violations.patch
new file mode 100644
index 0000000..cc45ae0
--- /dev/null
+++ b/SOURCES/0014-mysql-fix-pep8-violations.patch
@@ -0,0 +1,37 @@
+From 6ce502113f550c027424fa477edc091283c32e50 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Mon, 20 Oct 2014 14:33:57 +0100
+Subject: [PATCH 14/93] [mysql] fix pep8 violations
+
+The previous commit had a couple of pep8 errors that were fixed
+in the working tree but not added to the commit; fix them.
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/plugins/mysql.py | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/sos/plugins/mysql.py b/sos/plugins/mysql.py
+index 1203f5c..d148472 100644
+--- a/sos/plugins/mysql.py
++++ b/sos/plugins/mysql.py
+@@ -15,6 +15,7 @@
+ from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin
+ import os
+ 
++
+ class Mysql(Plugin):
+     """MySQL and MariaDB RDBMS
+     """
+@@ -44,7 +45,7 @@ class Mysql(Plugin):
+         if self.get_option("dbdump"):
+             dbuser = self.get_option("dbuser")
+             dbpass = self.get_option("dbpass")
+-            if dbpass == False and 'MYSQL_PWD' in os.environ:
++            if dbpass is False and 'MYSQL_PWD' in os.environ:
+                 dbpass = os.environ['MYSQL_PWD']
+             else:
+                 # no MySQL password
+-- 
+1.9.3
+
diff --git a/SOURCES/0015-plugin-limit-names-to-PC_NAME_MAX.patch b/SOURCES/0015-plugin-limit-names-to-PC_NAME_MAX.patch
new file mode 100644
index 0000000..a8f60c6
--- /dev/null
+++ b/SOURCES/0015-plugin-limit-names-to-PC_NAME_MAX.patch
@@ -0,0 +1,118 @@
+From 48a99c95078bab306cb56bb1a05420d88bf15a64 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Mon, 20 Oct 2014 16:12:01 +0100
+Subject: [PATCH 15/93] [plugin] limit names to PC_NAME_MAX
+
+Commit 8bf7b0c removed the truncation of mangled command names to
+64 chars. This causes problems for some plugins (e.g. Issue #415)
+that generate long enough command lines to hit system name length
+limits.
+
+Instead of arbitrarily limiting to 64 characters limit to the
+lesser of the archive format limit (if present) or the value of
+PC_NAME_MAX for any intermediate FileCacheArchive path.
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/archive.py          | 18 ++++++++++++++++++
+ sos/plugins/__init__.py |  7 ++++---
+ tests/plugin_tests.py   | 12 ++++++++----
+ 3 files changed, 30 insertions(+), 7 deletions(-)
+
+diff --git a/sos/archive.py b/sos/archive.py
+index 2e42bbd..6063625 100644
+--- a/sos/archive.py
++++ b/sos/archive.py
+@@ -98,6 +98,12 @@ class Archive(object):
+         to be included in the generated archive."""
+         raise NotImplementedError
+ 
++    def name_max(self):
++        """Return the maximum file name length this archive can support.
++        This is the lesser of the name length limit of the archive
++        format and any temporary file system based cache."""
++        raise NotImplementedError
++
+     def get_archive_path(self):
+         """Return a string representing the path to the temporary
+         archive. For archive classes that implement in-line handling
+@@ -206,6 +212,13 @@ class FileCacheArchive(Archive):
+     def _makedirs(self, path, mode=0o700):
+         os.makedirs(path, mode)
+ 
++    def name_max(self):
++        if 'PC_NAME_MAX' in os.pathconf_names:
++            pc_name_max = os.pathconf_names['PC_NAME_MAX']
++            return os.pathconf(self._archive_root, pc_name_max)
++        else:
++            return 255
++
+     def get_tmp_dir(self):
+         return self._archive_root
+ 
+@@ -355,6 +368,11 @@ class TarFileArchive(FileCacheArchive):
+     def name(self):
+         return "%s.%s" % (self._name, self._suffix)
+ 
++    def name_max(self):
++        # GNU Tar format supports unlimited file name length. Just return
++        # the limit of the underlying FileCacheArchive.
++        return super(TarFileArchive, self).name_max()
++
+     def _build_archive(self):
+         # python2.6 TarFile lacks the filter parameter
+         if not six.PY3 and sys.version_info[1] < 7:
+diff --git a/sos/plugins/__init__.py b/sos/plugins/__init__.py
+index 3e39100..b289144 100644
+--- a/sos/plugins/__init__.py
++++ b/sos/plugins/__init__.py
+@@ -42,11 +42,11 @@ def regex_findall(regex, fname):
+         return []
+ 
+ 
+-def _mangle_command(command):
+-    # FIXME: this can be improved
++def _mangle_command(command, name_max):
+     mangledname = re.sub(r"^/(usr/|)(bin|sbin)/", "", command)
+     mangledname = re.sub(r"[^\w\-\.\/]+", "_", mangledname)
+     mangledname = re.sub(r"/", ".", mangledname).strip(" ._-")
++    mangledname = mangledname[0:name_max]
+     return mangledname
+ 
+ 
+@@ -518,7 +518,8 @@ class Plugin(object):
+         return grep(regexp, *fnames)
+ 
+     def _mangle_command(self, exe):
+-        return _mangle_command(exe)
++        name_max = self.archive.name_max()
++        return _mangle_command(exe, name_max)
+ 
+     def _make_command_filename(self, exe):
+         """The internal function to build up a filename based on a command."""
+diff --git a/tests/plugin_tests.py b/tests/plugin_tests.py
+index 817e4f2..f73a003 100644
+--- a/tests/plugin_tests.py
++++ b/tests/plugin_tests.py
+@@ -115,10 +115,14 @@ class PluginToolTests(unittest.TestCase):
+         self.assertEquals(matches, [])
+ 
+     def test_mangle_command(self):
+-        self.assertEquals("foo", _mangle_command("/usr/bin/foo"))
+-        self.assertEquals("foo_-x", _mangle_command("/usr/bin/foo -x"))
+-        self.assertEquals("foo_--verbose", _mangle_command("/usr/bin/foo --verbose"))
+-        self.assertEquals("foo_.path.to.stuff", _mangle_command("/usr/bin/foo /path/to/stuff"))
++        name_max = 255
++        self.assertEquals("foo", _mangle_command("/usr/bin/foo", name_max))
++        self.assertEquals("foo_-x", _mangle_command("/usr/bin/foo -x", name_max))
++        self.assertEquals("foo_--verbose", _mangle_command("/usr/bin/foo --verbose", name_max))
++        self.assertEquals("foo_.path.to.stuff", _mangle_command("/usr/bin/foo /path/to/stuff", name_max))
++        longcmd ="foo is " + "a" * 256 + " long_command"
++        expected = longcmd[0:name_max].replace(' ', '_')
++        self.assertEquals(expected, _mangle_command(longcmd, name_max))
+ 
+ 
+ class PluginTests(unittest.TestCase):
+-- 
+1.9.3
+
diff --git a/SOURCES/0016-sosreport-fix-archive-permissions-regression.patch b/SOURCES/0016-sosreport-fix-archive-permissions-regression.patch
new file mode 100644
index 0000000..95e8e1a
--- /dev/null
+++ b/SOURCES/0016-sosreport-fix-archive-permissions-regression.patch
@@ -0,0 +1,39 @@
+From d7759d3ddae5fe99a340c88a1d370d65cfa73fd6 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Thu, 30 Oct 2014 16:46:01 +0000
+Subject: [PATCH 16/93] [sosreport] fix archive permissions regression
+
+Restore the umask save/restore around archive creation and ensure
+the effective umask is 077 at the time of archive creation.
+
+Fixes #425.
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/sosreport.py | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/sos/sosreport.py b/sos/sosreport.py
+index 664414f..99b5f47 100644
+--- a/sos/sosreport.py
++++ b/sos/sosreport.py
+@@ -1327,6 +1327,7 @@ class SoSReport(object):
+         self._finish_logging()
+         # package up the results for the support organization
+         if not self.opts.build:
++            old_umask = os.umask(0o077)
+             if not self.opts.quiet:
+                 print(_("Creating compressed archive..."))
+             # compression could fail for a number of reasons
+@@ -1345,6 +1346,8 @@ class SoSReport(object):
+                     raise
+                 else:
+                     return False
++            finally:
++                os.umask(old_umask)
+         else:
+             final_filename = self.archive.get_archive_path()
+         self.policy.display_results(final_filename, build=self.opts.build)
+-- 
+1.9.3
+
diff --git a/SOURCES/0017-maas-Fix-maas-dumpdata-command-not-found-Fixes-423.patch b/SOURCES/0017-maas-Fix-maas-dumpdata-command-not-found-Fixes-423.patch
new file mode 100644
index 0000000..f198c84
--- /dev/null
+++ b/SOURCES/0017-maas-Fix-maas-dumpdata-command-not-found-Fixes-423.patch
@@ -0,0 +1,55 @@
+From 7739c76eaa8b02ba41f23aaceac0b064619321ed Mon Sep 17 00:00:00 2001
+From: Chris Johnston <chrisjohnston@ubuntu.com>
+Date: Tue, 28 Oct 2014 10:37:08 -0400
+Subject: [PATCH 17/93] [maas] Fix maas dumpdata command not found Fixes: #423
+
+The maas dumpdata command issued by the MAAS plugin causes a command
+not found error. The command is now issued to maas-region-admin.
+
+Also corrected capitalizations around the MAAS name.
+Fixes: 423
+
+Signed-off-by: Chris Johnston <chrisjohnston@ubuntu.com>
+Signed-off-by: Adam Stokes <adam.stokes@ubuntu.com>
+---
+ sos/plugins/maas.py | 10 +++++++---
+ 1 file changed, 7 insertions(+), 3 deletions(-)
+
+diff --git a/sos/plugins/maas.py b/sos/plugins/maas.py
+index edcea5e..051f411 100644
+--- a/sos/plugins/maas.py
++++ b/sos/plugins/maas.py
+@@ -18,7 +18,7 @@ from sos.plugins import Plugin, UbuntuPlugin
+ 
+ 
+ class Maas(Plugin, UbuntuPlugin):
+-    """Ubuntu Metal-as-a-Service
++    """Ubuntu Metal-As-A-Service
+     """
+ 
+     plugin_name = 'maas'
+@@ -56,15 +56,19 @@ class Maas(Plugin, UbuntuPlugin):
+         self.add_cmd_output([
+             "apt-cache policy maas-*",
+             "apt-cache policy python-django-*",
+-            "maas dumpdata"
+         ])
+ 
++        if self.is_installed("maas-region-controller"):
++            self.add_cmd_output([
++                "maas-region-admin dumpdata",
++            ])
++
+         if self._has_login_options():
+             if self._remote_api_login():
+                 self.add_cmd_output("maas %s commissioning-results list" %
+                                     self.get_option("profile-name"))
+             else:
+                 self._log_error(
+-                    "Cannot login into Maas remote API with provided creds.")
++                    "Cannot login into MAAS remote API with provided creds.")
+ 
+ # vim: et ts=4 sw=4
+-- 
+1.9.3
+
diff --git a/SOURCES/0018-docs-Add-prominent-link-to-user-focused-docs.patch b/SOURCES/0018-docs-Add-prominent-link-to-user-focused-docs.patch
new file mode 100644
index 0000000..46db347
--- /dev/null
+++ b/SOURCES/0018-docs-Add-prominent-link-to-user-focused-docs.patch
@@ -0,0 +1,29 @@
+From 8a56b5c6679c0e4ff8679e7cf466fc4d644c8c42 Mon Sep 17 00:00:00 2001
+From: ncoghlan <ncoghlan@gmail.com>
+Date: Mon, 10 Nov 2014 10:19:58 +1000
+Subject: [PATCH 18/93] [docs] Add prominent link to user focused docs
+
+It wasn't immediately clear to me from the developer docs what SoS
+actually *does*, but the user docs made it clear.
+---
+ docs/index.rst | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/docs/index.rst b/docs/index.rst
+index cd3bf19..a3ff20a 100644
+--- a/docs/index.rst
++++ b/docs/index.rst
+@@ -3,6 +3,10 @@ SoS
+ 
+ Sos is an extensible, portable, support data collection tool primarily aimed at Linux distributions and other UNIX-like operating systems.
+ 
++This is the SoS developer documentation, for user documentation refer to:
++
++https://github.com/sosreport/sos/wiki
++
+ This project is hosted at:
+ 
+ http://github.com/sosreport/sos
+-- 
+1.9.3
+
diff --git a/SOURCES/0019-plugins-rabbitmq-Added-cluster_status-command-output.patch b/SOURCES/0019-plugins-rabbitmq-Added-cluster_status-command-output.patch
new file mode 100644
index 0000000..db5e3b6
--- /dev/null
+++ b/SOURCES/0019-plugins-rabbitmq-Added-cluster_status-command-output.patch
@@ -0,0 +1,28 @@
+From 786f74a79f6baec716be8c8a05da90b5c63848d0 Mon Sep 17 00:00:00 2001
+From: Jorge Niedbalski <niedbalski@gmail.com>
+Date: Fri, 14 Nov 2014 11:43:31 -0300
+Subject: [PATCH 19/93] [plugins/rabbitmq] Added cluster_status command output
+
+* Added the 'rabbitmqctl cluster_status' output command
+
+Signed-off-by: Jorge Niedbalski R. <niedbalski@gmail.com>
+---
+ sos/plugins/rabbitmq.py | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/sos/plugins/rabbitmq.py b/sos/plugins/rabbitmq.py
+index ee09fa3..3e81d66 100644
+--- a/sos/plugins/rabbitmq.py
++++ b/sos/plugins/rabbitmq.py
+@@ -25,6 +25,8 @@ class RabbitMQ(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
+ 
+     def setup(self):
+         self.add_cmd_output("rabbitmqctl report")
++        self.add_cmd_output("rabbitmqctl cluster_status")
++
+         self.add_copy_spec("/etc/rabbitmq/*")
+         self.add_copy_spec_limit("/var/log/rabbitmq/*",
+                                  sizelimit=self.get_option('log_size'))
+-- 
+1.9.3
+
diff --git a/SOURCES/0020-corosync-pacemaker-Collect-corosync-cfgtool-s-output.patch b/SOURCES/0020-corosync-pacemaker-Collect-corosync-cfgtool-s-output.patch
new file mode 100644
index 0000000..b82fd5f
--- /dev/null
+++ b/SOURCES/0020-corosync-pacemaker-Collect-corosync-cfgtool-s-output.patch
@@ -0,0 +1,70 @@
+From a85f58cb566883532ba0df93ecf0dba5bc190fc3 Mon Sep 17 00:00:00 2001
+From: Felipe Reyes <felipe.reyes@canonical.com>
+Date: Tue, 18 Nov 2014 14:32:20 -0300
+Subject: [PATCH 20/93] [corosync/pacemaker] Collect corosync-cfgtool -s output
+ / add Pacemaker support
+
+This patch improves HA clustering information gathering adding a new a
+new plugin for Pacemaker.
+
+Signed-off-by: Felipe Reyes <felipe.reyes@canonical.com>
+Signed-off-by: Adam Stokes <adam.stokes@ubuntu.com>
+---
+ sos/plugins/corosync.py  |  1 +
+ sos/plugins/pacemaker.py | 32 ++++++++++++++++++++++++++++++++
+ 2 files changed, 33 insertions(+)
+ create mode 100644 sos/plugins/pacemaker.py
+
+diff --git a/sos/plugins/corosync.py b/sos/plugins/corosync.py
+index db9b547..27642a0 100644
+--- a/sos/plugins/corosync.py
++++ b/sos/plugins/corosync.py
+@@ -34,6 +34,7 @@ class Corosync(Plugin):
+             "corosync-quorumtool -s",
+             "corosync-cpgtool",
+             "corosync-objctl -a",
++            "corosync-cfgtool -s",
+             "corosync-fplay",
+             "corosync-objctl -w runtime.blackbox.dump_state=$(date +\%s)",
+             "corosync-objctl -w runtime.blackbox.dump_flight_data=$(date +\%s)"
+diff --git a/sos/plugins/pacemaker.py b/sos/plugins/pacemaker.py
+new file mode 100644
+index 0000000..802b40f
+--- /dev/null
++++ b/sos/plugins/pacemaker.py
+@@ -0,0 +1,32 @@
++# 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, DebianPlugin, UbuntuPlugin
++
++
++class Pacemaker(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
++    "HA Cluster resource manager"
++
++    plugin_name = "pacemaker"
++    profiles = ("cluster", )
++    packages = ("pacemaker", )
++
++    def setup(self):
++        self.add_copy_spec([
++            "/var/lib/pacemaker/cib/cib.xml"
++        ])
++        self.add_cmd_output([
++            "crm status",
++            "crm configure show",
++        ])
+-- 
+1.9.3
+
diff --git a/SOURCES/0021-global-make-all-utf-8-handling-use-errors-ignore.patch b/SOURCES/0021-global-make-all-utf-8-handling-use-errors-ignore.patch
new file mode 100644
index 0000000..1ae6589
--- /dev/null
+++ b/SOURCES/0021-global-make-all-utf-8-handling-use-errors-ignore.patch
@@ -0,0 +1,85 @@
+From 348ed379209aacfe6c1f870a3a68e06b39a51f06 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Tue, 9 Dec 2014 17:30:06 +0000
+Subject: [PATCH 21/93] [global] make all utf-8 handling use errors='ignore'
+
+Stop playing whack-a-mole with unicode handling and ignore all
+invalid characters. It's not really possible to ensure that we
+always get strict utf-8 data from the system - e.g. dmesg on
+systems with broken BIOS strings will often spit undecodable
+byte sequences.
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/archive.py          | 4 ++--
+ sos/plugins/__init__.py | 5 +++--
+ sos/utilities.py        | 7 +++++--
+ 3 files changed, 10 insertions(+), 6 deletions(-)
+
+diff --git a/sos/archive.py b/sos/archive.py
+index 6063625..0e019bf 100644
+--- a/sos/archive.py
++++ b/sos/archive.py
+@@ -406,9 +406,9 @@ class TarFileArchive(FileCacheArchive):
+                           close_fds=True)
+                 stdout, stderr = p.communicate()
+                 if stdout:
+-                    self.log_info(stdout.decode('utf-8'))
++                    self.log_info(stdout.decode('utf-8', 'ignore'))
+                 if stderr:
+-                    self.log_error(stderr.decode('utf-8'))
++                    self.log_error(stderr.decode('utf-8', 'ignore'))
+                 self._suffix += suffix
+                 return self.name()
+             except Exception as e:
+diff --git a/sos/plugins/__init__.py b/sos/plugins/__init__.py
+index b289144..4fd85be 100644
+--- a/sos/plugins/__init__.py
++++ b/sos/plugins/__init__.py
+@@ -542,7 +542,7 @@ class Plugin(object):
+     def add_string_as_file(self, content, filename):
+         """Add a string to the archive as a file named `filename`"""
+         self.copy_strings.append((content, filename))
+-        content = "..." + (content.splitlines()[0]).decode('utf8')
++        content = "..." + (content.splitlines()[0]).decode('utf8', 'ignore')
+         self._log_debug("added string '%s' as '%s'" % (content, filename))
+ 
+     def get_cmd_output_now(self, exe, suggest_filename=None,
+@@ -611,7 +611,8 @@ class Plugin(object):
+ 
+     def _collect_strings(self):
+         for string, file_name in self.copy_strings:
+-            content = "..." + (string.splitlines()[0]).decode('utf8')
++            content = "..."
++            content += (string.splitlines()[0]).decode('utf8', 'ignore')
+             self._log_info("collecting string '%s' as '%s'"
+                            % (content, file_name))
+             try:
+diff --git a/sos/utilities.py b/sos/utilities.py
+index 7e8cd7e..8cb4ed6 100644
+--- a/sos/utilities.py
++++ b/sos/utilities.py
+@@ -140,7 +140,7 @@ def sos_get_command_output(command, timeout=300, runat=None):
+ 
+     # shlex.split() reacts badly to unicode on older python runtimes.
+     if not six.PY3:
+-        command = command.encode('utf-8')
++        command = command.encode('utf-8', 'ignore')
+     args = shlex.split(command)
+     try:
+         p = Popen(args, shell=False, stdout=PIPE, stderr=STDOUT,
+@@ -159,7 +159,10 @@ def sos_get_command_output(command, timeout=300, runat=None):
+     if p.returncode == 126 or p.returncode == 127:
+         stdout = six.binary_type(b"")
+ 
+-    return {'status': p.returncode, 'output': stdout.decode('utf-8')}
++    return {
++        'status': p.returncode,
++        'output': stdout.decode('utf-8', 'ignore')
++    }
+ 
+ 
+ def import_module(module_fqname, superclasses=None):
+-- 
+1.9.3
+
diff --git a/SOURCES/0022-sosreport-disable-the-zip-compression-type.patch b/SOURCES/0022-sosreport-disable-the-zip-compression-type.patch
new file mode 100644
index 0000000..95ae582
--- /dev/null
+++ b/SOURCES/0022-sosreport-disable-the-zip-compression-type.patch
@@ -0,0 +1,60 @@
+From 081e1ce9f9ad7570d057babd81b474fd407149d7 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Tue, 9 Dec 2014 17:32:45 +0000
+Subject: [PATCH 22/93] [sosreport] disable the 'zip' compression type
+
+The Zip archive format is little used and has been broken for
+some time:
+
+   Unexpected exception setting up archive:
+  Traceback (most recent call last):
+    File "/usr/lib/python2.7/site-packages/sos/sosreport.py", line 1092, in prework
+      self._set_archive()
+    File "/usr/lib/python2.7/site-packages/sos/sosreport.py", line 679, in _set_archive
+      self.archive = ZipFileArchive(archive_name, self.tmpdir)
+  TypeError: __init__() takes exactly 2 arguments (3 given)
+  __init__() takes exactly 2 arguments (3 given)
+
+Remove it from the allowed options list for --compression-type.
+
+The supporting Archive classes can be removed in a separate commit.
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/sosreport.py | 6 ++----
+ 1 file changed, 2 insertions(+), 4 deletions(-)
+
+diff --git a/sos/sosreport.py b/sos/sosreport.py
+index 99b5f47..a697380 100644
+--- a/sos/sosreport.py
++++ b/sos/sosreport.py
+@@ -599,7 +599,7 @@ class SoSOptions(object):
+                           dest="report",
+                           help="Disable HTML/XML reporting", default=False)
+         parser.add_option("-z", "--compression-type", dest="compression_type",
+-                          help="compression technology to use [auto, zip, "
++                          help="compression technology to use [auto, "
+                                "gzip, bzip2, xz] (default=auto)",
+                           default="auto")
+ 
+@@ -675,8 +675,6 @@ class SoSReport(object):
+         if self.opts.compression_type == 'auto':
+             auto_archive = self.policy.get_preferred_archive()
+             self.archive = auto_archive(archive_name, self.tmpdir)
+-        elif self.opts.compression_type == 'zip':
+-            self.archive = ZipFileArchive(archive_name, self.tmpdir)
+         else:
+             self.archive = TarFileArchive(archive_name, self.tmpdir)
+         self.archive.set_debug(True if self.opts.debug else False)
+@@ -1080,7 +1078,7 @@ class SoSReport(object):
+         self.policy.pre_work()
+         try:
+             self.ui_log.info(_(" Setting up archive ..."))
+-            compression_methods = ('auto', 'zip', 'bzip2', 'gzip', 'xz')
++            compression_methods = ('auto', 'bzip2', 'gzip', 'xz')
+             method = self.opts.compression_type
+             if method not in compression_methods:
+                 compression_list = ', '.join(compression_methods)
+-- 
+1.9.3
+
diff --git a/SOURCES/0023-archive-remove-ZipArchive.patch b/SOURCES/0023-archive-remove-ZipArchive.patch
new file mode 100644
index 0000000..68d5057
--- /dev/null
+++ b/SOURCES/0023-archive-remove-ZipArchive.patch
@@ -0,0 +1,205 @@
+From f342d39e714c0d9bf7567028766410a9a71b7ea5 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Tue, 9 Dec 2014 17:46:32 +0000
+Subject: [PATCH 23/93] [archive] remove ZipArchive
+
+Remove the ZipArchive class and associated test code.
+
+Fixes #322.
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/archive.py         | 66 ---------------------------------------
+ tests/archive_tests.py | 83 +-------------------------------------------------
+ tests/plugin_tests.py  |  2 +-
+ 3 files changed, 2 insertions(+), 149 deletions(-)
+
+diff --git a/sos/archive.py b/sos/archive.py
+index 0e019bf..1963898 100644
+--- a/sos/archive.py
++++ b/sos/archive.py
+@@ -415,70 +415,4 @@ class TarFileArchive(FileCacheArchive):
+                 last_error = e
+         raise last_error
+ 
+-
+-class ZipFileArchive(Archive):
+-    """ archive class using python ZipFile to create zip archives """
+-
+-    def __init__(self, name):
+-        self._name = name
+-        try:
+-            import zlib
+-            assert zlib
+-            self.compression = zipfile.ZIP_DEFLATED
+-        except:
+-            self.compression = zipfile.ZIP_STORED
+-
+-        self.zipfile = zipfile.ZipFile(self.name(), mode="w",
+-                                       compression=self.compression)
+-
+-    def name(self):
+-        return "%s.zip" % self._name
+-
+-    def finalize(self, method):
+-        super(ZipFileArchive, self).finalize(method)
+-        return self.name()
+-
+-    def add_file(self, src, dest=None):
+-        src = str(src)
+-        if dest:
+-            dest = str(dest)
+-
+-        if os.path.isdir(src):
+-            # We may not need, this, but if we do I only want to do it
+-            # one time
+-            regex = re.compile(r"^" + src)
+-            for path, dirnames, filenames in os.walk(src):
+-                for filename in filenames:
+-                    filename = "/".join((path, filename))
+-                    if dest:
+-                        self.zipfile.write(filename, re.sub(regex, dest,
+-                                                            filename))
+-                    else:
+-                        self.zipfile.write(filename)
+-        else:
+-            if dest:
+-                self.zipfile.write(src, dest)
+-            else:
+-                self.zipfile.write(src)
+-
+-    def add_string(self, content, dest):
+-        info = zipfile.ZipInfo(dest,
+-                               date_time=time.localtime(time.time()))
+-        info.compress_type = self.compression
+-        info.external_attr = 0o400 << long(16)
+-        self.zipfile.writestr(info, content)
+-
+-    def open_file(self, name):
+-        try:
+-            self.zipfile.close()
+-            self.zipfile = zipfile.ZipFile(self.name(), mode="r")
+-            file_obj = self.zipfile.open(name)
+-            return file_obj
+-        finally:
+-            self.zipfile.close()
+-            self.zipfile = zipfile.ZipFile(self.name(), mode="a")
+-
+-    def close(self):
+-        self.zipfile.close()
+-
+ # vim: et ts=4 sw=4
+diff --git a/tests/archive_tests.py b/tests/archive_tests.py
+index de4e241..c778e4e 100644
+--- a/tests/archive_tests.py
++++ b/tests/archive_tests.py
+@@ -7,92 +7,11 @@ import zipfile
+ import tempfile
+ import shutil
+ 
+-from sos.archive import TarFileArchive, ZipFileArchive
++from sos.archive import TarFileArchive
+ 
+ # PYCOMPAT
+ import six
+ 
+-class ZipFileArchiveTest(unittest.TestCase):
+-
+-    def setUp(self):
+-        self.zf = ZipFileArchive('test')
+-
+-    def tearDown(self):
+-        os.unlink('test.zip')
+-
+-    def check_for_file(self, filename):
+-        zf = zipfile.ZipFile('test.zip', 'r')
+-        zf.getinfo(filename)
+-        zf.close()
+-
+-    def test_create(self):
+-        self.zf.close()
+-
+-    def test_add_file(self):
+-        self.zf.add_file('tests/ziptest')
+-        self.zf.close()
+-
+-        self.check_for_file('tests/ziptest')
+-
+-    def test_add_unicode_file(self):
+-        self.zf.add_file(six.u('tests/'))
+-        self.zf.close()
+-
+-        self.check_for_file('tests/ziptest')
+-
+-    def test_add_dir(self):
+-        self.zf.add_file('tests/')
+-        self.zf.close()
+-
+-        self.check_for_file('tests/ziptest')
+-
+-    def test_add_renamed(self):
+-        self.zf.add_file('tests/ziptest', dest='tests/ziptest_renamed')
+-        self.zf.close()
+-
+-        self.check_for_file('tests/ziptest_renamed')
+-
+-    def test_add_renamed_dir(self):
+-        self.zf.add_file('tests/', 'tests_renamed/')
+-        self.zf.close()
+-
+-        self.check_for_file('tests_renamed/ziptest')
+-
+-    def test_add_string(self):
+-        self.zf.add_string('this is content', 'tests/string_test.txt')
+-        self.zf.close()
+-
+-        self.check_for_file('tests/string_test.txt')
+-
+-    def test_get_file(self):
+-        self.zf.add_string('this is my content', 'tests/string_test.txt')
+-
+-        afp = self.zf.open_file('tests/string_test.txt')
+-        self.assertEquals(six.b('this is my content'), afp.read())
+-
+-    def test_overwrite_file(self):
+-        self.zf.add_string('this is my content', 'tests/string_test.txt')
+-        self.zf.add_string('this is my new content', 'tests/string_test.txt')
+-
+-        afp = self.zf.open_file('tests/string_test.txt')
+-        self.assertEquals(six.b('this is my new content'), afp.read())
+-
+-# Disabled as new api doesnt provide a add_link routine
+-#    def test_make_link(self):
+-#        self.zf.add_file('tests/ziptest')
+-#        self.zf.add_link('tests/ziptest', 'link_name')
+-#
+-#        self.zf.close()
+-#        try:
+-#            self.check_for_file('test/link_name')
+-#            self.fail("link should not exist")
+-#        except KeyError:
+-#            pass
+-
+-# Disabled as new api doesnt provide a compress routine
+-#    def test_compress(self):
+-#        self.assertEquals(self.zf.compress("zip"), self.zf.name())
+-
+ 
+ class TarFileArchiveTest(unittest.TestCase):
+ 
+diff --git a/tests/plugin_tests.py b/tests/plugin_tests.py
+index f73a003..7364eff 100644
+--- a/tests/plugin_tests.py
++++ b/tests/plugin_tests.py
+@@ -10,7 +10,7 @@ except:
+     from io import StringIO
+ 
+ from sos.plugins import Plugin, regex_findall, _mangle_command
+-from sos.archive import TarFileArchive, ZipFileArchive
++from sos.archive import TarFileArchive
+ import sos.policies
+ 
+ PATH = os.path.dirname(__file__)
+-- 
+1.9.3
+
diff --git a/SOURCES/0024-archive-remove-all-references-to-ZipFileArchive.patch b/SOURCES/0024-archive-remove-all-references-to-ZipFileArchive.patch
new file mode 100644
index 0000000..33b5011
--- /dev/null
+++ b/SOURCES/0024-archive-remove-all-references-to-ZipFileArchive.patch
@@ -0,0 +1,117 @@
+From f0ad2e331ce0524d36f59f3dee5cf85e6b22b089 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Thu, 11 Dec 2014 19:08:29 +0000
+Subject: [PATCH 24/93] [archive] remove all references to ZipFileArchive
+
+Commit f342d39 removed ZipFileArchive and the test suite references
+but left several imports in other files. Remove them and attendant
+support functions.
+
+Fixes #449.
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/archive.py   |  1 -
+ sos/sosreport.py |  2 +-
+ sos/utilities.py | 39 ++-------------------------------------
+ 3 files changed, 3 insertions(+), 39 deletions(-)
+
+diff --git a/sos/archive.py b/sos/archive.py
+index 1963898..6ef46a9 100644
+--- a/sos/archive.py
++++ b/sos/archive.py
+@@ -18,7 +18,6 @@
+ import os
+ import time
+ import tarfile
+-import zipfile
+ import shutil
+ import logging
+ import shlex
+diff --git a/sos/sosreport.py b/sos/sosreport.py
+index a697380..0dd26ad 100644
+--- a/sos/sosreport.py
++++ b/sos/sosreport.py
+@@ -37,7 +37,7 @@ import tempfile
+ from sos import _sos as _
+ from sos import __version__
+ import sos.policies
+-from sos.archive import TarFileArchive, ZipFileArchive
++from sos.archive import TarFileArchive
+ from sos.reporting import (Report, Section, Command, CopiedFile, CreatedFile,
+                            Alert, Note, PlainTextReport)
+ 
+diff --git a/sos/utilities.py b/sos/utilities.py
+index 8cb4ed6..51909c6 100644
+--- a/sos/utilities.py
++++ b/sos/utilities.py
+@@ -18,7 +18,6 @@ import os
+ import re
+ import inspect
+ from subprocess import Popen, PIPE, STDOUT
+-import zipfile
+ import hashlib
+ import logging
+ import fnmatch
+@@ -191,8 +190,8 @@ def shell_out(cmd, runat=None):
+ 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
+-    are files that end in .py. This class will read from PKZip archives as well
+-    for listing out jar and egg contents."""
++    are files that end in .py.
++    """
+ 
+     def __init__(self, package):
+         """package is a package module
+@@ -223,38 +222,6 @@ class ImporterHelper(object):
+             else:
+                 return []
+ 
+-    def _get_path_to_zip(self, path, tail_list=None):
+-        if not tail_list:
+-            tail_list = ['']
+-
+-        if path.endswith(('.jar', '.zip', '.egg')):
+-            return path, os.path.join(*tail_list)
+-
+-        head, tail = os.path.split(path)
+-        tail_list.insert(0, tail)
+-
+-        if head == path:
+-            raise Exception("not a zip file")
+-        else:
+-            return self._get_path_to_zip(head, tail_list)
+-
+-    def _find_plugins_in_zipfile(self, path):
+-        try:
+-            path_to_zip, tail = self._get_path_to_zip(path)
+-            zf = zipfile.ZipFile(path_to_zip)
+-            # the path will have os separators, but the zipfile will
+-            # always have '/'
+-            tail = tail.replace(os.path.sep, "/")
+-            root_names = [name for name in zf.namelist() if tail in name]
+-            candidates = self._get_plugins_from_list(root_names)
+-            zf.close()
+-            if candidates:
+-                return candidates
+-            else:
+-                return []
+-        except (IOError, Exception):
+-            return []
+-
+     def get_modules(self):
+         """Returns the list of importable modules in the configured python
+         package. """
+@@ -262,8 +229,6 @@ class ImporterHelper(object):
+         for path in self.package.__path__:
+             if os.path.isdir(path) or path == '':
+                 plugins.extend(self._find_plugins_in_dir(path))
+-            else:
+-                plugins.extend(self._find_plugins_in_zipfile(path))
+ 
+         return plugins
+ 
+-- 
+1.9.3
+
diff --git a/SOURCES/0025-postgresql-avoid-to-crash-with-numerical-passwords.patch b/SOURCES/0025-postgresql-avoid-to-crash-with-numerical-passwords.patch
new file mode 100644
index 0000000..d4402fd
--- /dev/null
+++ b/SOURCES/0025-postgresql-avoid-to-crash-with-numerical-passwords.patch
@@ -0,0 +1,27 @@
+From 067508239b7e1237f696fbe4a2b1484e6f720ebd Mon Sep 17 00:00:00 2001
+From: Sandro Bonazzola <sbonazzo redhat com>
+Date: Mon, 15 Dec 2014 17:53:57 +0000
+Subject: [PATCH 25/93] [postgresql] avoid to crash with numerical passwords
+
+Signed-off-by: Sandro Bonazzola <sbonazzo redhat com>
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/plugins/postgresql.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/sos/plugins/postgresql.py b/sos/plugins/postgresql.py
+index 350131f..0a51074 100644
+--- a/sos/plugins/postgresql.py
++++ b/sos/plugins/postgresql.py
+@@ -51,7 +51,7 @@ class PostgreSQL(Plugin):
+         # is no need to save and restore environment variables if the user
+         # decided to pass the password on the command line.
+         if self.get_option("password") is not False:
+-            os.environ["PGPASSWORD"] = self.get_option("password")
++            os.environ["PGPASSWORD"] = str(self.get_option("password"))
+ 
+         if self.get_option("dbhost"):
+             cmd = "pg_dump -U %s -h %s -p %s -w -f %s -F t %s" % (
+-- 
+1.9.3
+
diff --git a/SOURCES/0026-yum-add-subscription-manager-identity-output.patch b/SOURCES/0026-yum-add-subscription-manager-identity-output.patch
new file mode 100644
index 0000000..3a8c249
--- /dev/null
+++ b/SOURCES/0026-yum-add-subscription-manager-identity-output.patch
@@ -0,0 +1,31 @@
+From 7df415ede418ef582f9e6d45ff3acb1503195e1f Mon Sep 17 00:00:00 2001
+From: spandey <spandey@redhat.com>
+Date: Wed, 12 Nov 2014 16:28:44 +0530
+Subject: [PATCH 26/93] [yum] add subscription-manager identity output
+
+The "subscription-manager identity" command displays consumer
+registered uuid and registered org uuid/name , which is useful to
+track rhn related issues
+
+Signed-off-by: spandey <spandey@redhat.com>
+---
+ sos/plugins/yum.py | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/sos/plugins/yum.py b/sos/plugins/yum.py
+index 816e2b0..697a6b5 100644
+--- a/sos/plugins/yum.py
++++ b/sos/plugins/yum.py
+@@ -51,7 +51,8 @@ class Yum(Plugin, RedHatPlugin):
+             "/var/log/rhsm/rhsmcertd.log"])
+         self.add_cmd_output([
+             "subscription-manager list --installed",
+-            "subscription-manager list --consumed"
++            "subscription-manager list --consumed",
++            "subscription-manager identity"
+         ])
+         self.add_cmd_output("rhsm-debug system --sos --no-archive "
+                             "--no-subscriptions --destination %s"
+-- 
+1.9.3
+
diff --git a/SOURCES/0027-ovirt-remove-ovirt-engine-setup-answer-file-password.patch b/SOURCES/0027-ovirt-remove-ovirt-engine-setup-answer-file-password.patch
new file mode 100644
index 0000000..f606f6d
--- /dev/null
+++ b/SOURCES/0027-ovirt-remove-ovirt-engine-setup-answer-file-password.patch
@@ -0,0 +1,39 @@
+From 0aec209ec6870c6ec3cbb6e2209d35adb2b62009 Mon Sep 17 00:00:00 2001
+From: Sandro Bonazzola <sbonazzo redhat com>
+Date: Tue, 16 Dec 2014 12:29:57 +0000
+Subject: [PATCH 27/93] [ovirt] remove ovirt-engine setup answer file password
+ leak
+
+Signed-off-by: Sandro Bonazzola <sbonazzo@redhat.com>
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/plugins/ovirt.py | 15 +++++++++++++++
+ 1 file changed, 15 insertions(+)
+
+diff --git a/sos/plugins/ovirt.py b/sos/plugins/ovirt.py
+index b169b90..407c918 100644
+--- a/sos/plugins/ovirt.py
++++ b/sos/plugins/ovirt.py
+@@ -171,4 +171,19 @@ class Ovirt(Plugin, RedHatPlugin):
+                 r'{key}=********'.format(key=key)
+             )
+ 
++        # Answer files contain passwords
++        for key in (
++            'OVESETUP_CONFIG/adminPassword',
++            'OVESETUP_CONFIG/remoteEngineHostRootPassword',
++            'OVESETUP_DWH_DB/password',
++            'OVESETUP_DB/password',
++            'OVESETUP_REPORTS_CONFIG/adminPassword',
++            'OVESETUP_REPORTS_DB/password',
++        ):
++            self.do_path_regex_sub(
++                r'/var/lib/ovirt-engine/setup/answers/.*',
++                r'{key}=(.*)'.format(key=key),
++                r'{key}=********'.format(key=key)
++            )
++
+ # vim: expandtab tabstop=4 shiftwidth=4
+-- 
+1.9.3
+
diff --git a/SOURCES/0028-ovirt-remove-password-leak-from-ovirt-engine-setup-a.patch b/SOURCES/0028-ovirt-remove-password-leak-from-ovirt-engine-setup-a.patch
new file mode 100644
index 0000000..d767a2a
--- /dev/null
+++ b/SOURCES/0028-ovirt-remove-password-leak-from-ovirt-engine-setup-a.patch
@@ -0,0 +1,36 @@
+From 0a63fff9037848c8c240134fb8fff7e97e958a9d Mon Sep 17 00:00:00 2001
+From: Sandro Bonazzola <sbonazzo redhat com>
+Date: Tue, 16 Dec 2014 12:32:49 +0000
+Subject: [PATCH 28/93] [ovirt] remove password leak from ovirt-engine setup
+ answer file
+
+Signed-off-by: Sandro Bonazzola <sbonazzo@redhat.com>
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/plugins/ovirt.py | 12 ++++++++++++
+ 1 file changed, 12 insertions(+)
+
+diff --git a/sos/plugins/ovirt.py b/sos/plugins/ovirt.py
+index 407c918..6e3a092 100644
+--- a/sos/plugins/ovirt.py
++++ b/sos/plugins/ovirt.py
+@@ -186,4 +186,16 @@ class Ovirt(Plugin, RedHatPlugin):
+                 r'{key}=********'.format(key=key)
+             )
+ 
++        # Answer files contain passwords
++        for key in (
++            'OVESETUP_CONFIG/adminPassword',
++            'OVESETUP_CONFIG/remoteEngineHostRootPassword',
++        ):
++            self.do_path_regex_sub(
++                r'/var/lib/ovirt-engine/setup/answers/.*',
++                r'{key}=(.*)'.format(key=key),
++                r'{key}=********'.format(key=key)
++            )
++
++
+ # vim: expandtab tabstop=4 shiftwidth=4
+-- 
+1.9.3
+
diff --git a/SOURCES/0029-ovirt-remove-password-leak-from-engine-setup-answer-.patch b/SOURCES/0029-ovirt-remove-password-leak-from-engine-setup-answer-.patch
new file mode 100644
index 0000000..0c1d927
--- /dev/null
+++ b/SOURCES/0029-ovirt-remove-password-leak-from-engine-setup-answer-.patch
@@ -0,0 +1,40 @@
+From 6cf993a6e5da252525d55374b984fe76e688ff51 Mon Sep 17 00:00:00 2001
+From: Sandro Bonazzola <sbonazzo redhat com>
+Date: Tue, 16 Dec 2014 12:34:24 +0000
+Subject: [PATCH 29/93] [ovirt] remove password leak from engine setup answer
+ file
+
+Signed-off-by: Sandro Bonazzola <sbonazzo@redhat.com>
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/plugins/ovirt.py | 15 +++++++++++++++
+ 1 file changed, 15 insertions(+)
+
+diff --git a/sos/plugins/ovirt.py b/sos/plugins/ovirt.py
+index 6e3a092..638a07b 100644
+--- a/sos/plugins/ovirt.py
++++ b/sos/plugins/ovirt.py
+@@ -197,5 +197,20 @@ class Ovirt(Plugin, RedHatPlugin):
+                 r'{key}=********'.format(key=key)
+             )
+ 
++        # Answer files contain passwords
++        for key in (
++            'OVESETUP_CONFIG/adminPassword',
++            'OVESETUP_CONFIG/remoteEngineHostRootPassword',
++            'OVESETUP_DWH_DB/password',
++            'OVESETUP_DB/password',
++            'OVESETUP_REPORTS_CONFIG/adminPassword',
++            'OVESETUP_REPORTS_DB/password',
++        ):
++            self.do_path_regex_sub(
++                r'/var/lib/ovirt-engine/setup/answers/.*',
++                r'{key}=(.*)'.format(key=key),
++                r'{key}=********'.format(key=key)
++            )
++
+ 
+ # vim: expandtab tabstop=4 shiftwidth=4
+-- 
+1.9.3
+
diff --git a/SOURCES/0030-kimchi-add-new-plugin.patch b/SOURCES/0030-kimchi-add-new-plugin.patch
new file mode 100644
index 0000000..10f423b
--- /dev/null
+++ b/SOURCES/0030-kimchi-add-new-plugin.patch
@@ -0,0 +1,67 @@
+From 3aabd18b2666dbbeb86871ac4b9f025e468d5818 Mon Sep 17 00:00:00 2001
+From: Christy Perez <christy@linux.vnet.ibm.com>
+Date: Tue, 16 Dec 2014 12:46:27 +0000
+Subject: [PATCH 30/93] [kimchi] add new plugin
+
+This plugin gathers kimchi logs and configuration files.
+
+Kimchi is an HTML5-based virtualization-management platform
+For more information, please visit:
+https://github.com/kimchi-project/kimchi/wiki
+
+Signed-off-by: Christy Perez <christy@linux.vnet.ibm.com>
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/plugins/kimchi.py | 40 ++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 40 insertions(+)
+ create mode 100644 sos/plugins/kimchi.py
+
+diff --git a/sos/plugins/kimchi.py b/sos/plugins/kimchi.py
+new file mode 100644
+index 0000000..613b2c9
+--- /dev/null
++++ b/sos/plugins/kimchi.py
+@@ -0,0 +1,40 @@
++# Copyright IBM, Corp. 2014, Christy Perez <christy@linux.vnet.ibm.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, UbuntuPlugin, DebianPlugin
++
++
++class Kimchi(Plugin, RedHatPlugin, UbuntuPlugin, DebianPlugin):
++    """kimchi-related information
++    """
++
++    plugin_name = 'kimchi'
++    packages = ('kimchi',)
++
++    def setup(self):
++        log_limit = self.get_option('log_size')
++        if not self.get_option('all_logs'):
++            self.add_copy_spec_limit('/var/log/kimchi/*.log',
++                                     sizelimit=log_limit)
++            self.add_copy_spec_limit('/etc/kimchi/kimchi*',
++                                     sizelimit=log_limit)
++            self.add_copy_spec_limit('/etc/kimchi/distros.d/*.json',
++                                     sizelimit=log_limit)
++        else:
++            self.add_copy_spec('/var/log/kimchi/')
++            self.add_copy_spec('/etc/kimchi/')
++
++# vim: expandtab tabstop=4 shiftwidth=4
+-- 
+1.9.3
+
diff --git a/SOURCES/0031-selinux-capture-process-SELinux-domains.patch b/SOURCES/0031-selinux-capture-process-SELinux-domains.patch
new file mode 100644
index 0000000..53e2ecb
--- /dev/null
+++ b/SOURCES/0031-selinux-capture-process-SELinux-domains.patch
@@ -0,0 +1,35 @@
+From ccbf333aebd4c0586347de5991b62a50928858b7 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Tue, 16 Dec 2014 15:28:33 +0000
+Subject: [PATCH 31/93] [selinux] capture process SELinux domains
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/plugins/selinux.py | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/sos/plugins/selinux.py b/sos/plugins/selinux.py
+index c46e91a..c914a9b 100644
+--- a/sos/plugins/selinux.py
++++ b/sos/plugins/selinux.py
+@@ -28,7 +28,6 @@ class SELinux(Plugin, RedHatPlugin):
+     packages = ('libselinux',)
+ 
+     def setup(self):
+-        # sestatus is always collected in check_enabled()
+         self.add_copy_spec("/etc/selinux")
+         self.add_cmd_output([
+             "sestatus -b",
+@@ -36,7 +35,8 @@ class SELinux(Plugin, RedHatPlugin):
+             "selinuxdefcon root",
+             "selinuxconlist root",
+             "selinuxexeccon /bin/passwd",
+-            "semanage -o -"
++            "semanage -o -",
++            "ps axuZww"
+         ])
+         if self.get_option('fixfiles'):
+             self.add_cmd_output("fixfiles -v check")
+-- 
+1.9.3
+
diff --git a/SOURCES/0032-ovirt-remove-duplicate-code.patch b/SOURCES/0032-ovirt-remove-duplicate-code.patch
new file mode 100644
index 0000000..3d571ce
--- /dev/null
+++ b/SOURCES/0032-ovirt-remove-duplicate-code.patch
@@ -0,0 +1,50 @@
+From 08ffb581c93456f0c6e408677a6099aea90379b1 Mon Sep 17 00:00:00 2001
+From: Sandro Bonazzola <sbonazzo redhat com>
+Date: Wed, 17 Dec 2014 11:41:07 +0000
+Subject: [PATCH 32/93] [ovirt] remove duplicate code
+
+Signed-off-by: Sandro Bonazzola <sbonazzo@redhat.com>
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/plugins/ovirt.py | 26 --------------------------
+ 1 file changed, 26 deletions(-)
+
+diff --git a/sos/plugins/ovirt.py b/sos/plugins/ovirt.py
+index 638a07b..b097d93 100644
+--- a/sos/plugins/ovirt.py
++++ b/sos/plugins/ovirt.py
+@@ -186,31 +186,5 @@ class Ovirt(Plugin, RedHatPlugin):
+                 r'{key}=********'.format(key=key)
+             )
+ 
+-        # Answer files contain passwords
+-        for key in (
+-            'OVESETUP_CONFIG/adminPassword',
+-            'OVESETUP_CONFIG/remoteEngineHostRootPassword',
+-        ):
+-            self.do_path_regex_sub(
+-                r'/var/lib/ovirt-engine/setup/answers/.*',
+-                r'{key}=(.*)'.format(key=key),
+-                r'{key}=********'.format(key=key)
+-            )
+-
+-        # Answer files contain passwords
+-        for key in (
+-            'OVESETUP_CONFIG/adminPassword',
+-            'OVESETUP_CONFIG/remoteEngineHostRootPassword',
+-            'OVESETUP_DWH_DB/password',
+-            'OVESETUP_DB/password',
+-            'OVESETUP_REPORTS_CONFIG/adminPassword',
+-            'OVESETUP_REPORTS_DB/password',
+-        ):
+-            self.do_path_regex_sub(
+-                r'/var/lib/ovirt-engine/setup/answers/.*',
+-                r'{key}=(.*)'.format(key=key),
+-                r'{key}=********'.format(key=key)
+-            )
+-
+ 
+ # vim: expandtab tabstop=4 shiftwidth=4
+-- 
+1.9.3
+
diff --git a/SOURCES/0033-navicli-catch-exception-if-input-is-unreadable.patch b/SOURCES/0033-navicli-catch-exception-if-input-is-unreadable.patch
new file mode 100644
index 0000000..774eab8
--- /dev/null
+++ b/SOURCES/0033-navicli-catch-exception-if-input-is-unreadable.patch
@@ -0,0 +1,42 @@
+From 465746d768ce69684eee57eaa3509d9ae898fee2 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Wed, 17 Dec 2014 12:39:05 +0000
+Subject: [PATCH 33/93] [navicli] catch exception if input is unreadable
+
+CLARiiON SP IP Address or [Enter] to exit: Traceback (most recent call last):
+  File "/usr/sbin/sosreport", line 25, in <module>
+    main(sys.argv[1:])
+  File "/usr/lib/python2.7/site-packages/sos/sosreport.py", line 1408, in main
+    sos.execute()
+  File "/usr/lib/python2.7/site-packages/sos/sosreport.py", line 1387, in execute
+    self.setup()
+  File "/usr/lib/python2.7/site-packages/sos/sosreport.py", line 1117, in setup
+    plug.setup()
+  File "/usr/lib/python2.7/site-packages/sos/plugins/navicli.py", line 72, in setup
+    ans = input("CLARiiON SP IP Address or [Enter] to exit: ")
+EOFError: EOF when reading a line
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/plugins/navicli.py | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/sos/plugins/navicli.py b/sos/plugins/navicli.py
+index 5175f89..3ee7d50 100644
+--- a/sos/plugins/navicli.py
++++ b/sos/plugins/navicli.py
+@@ -69,7 +69,10 @@ class Navicli(Plugin, RedHatPlugin):
+         CLARiiON_IP_address_list = []
+         CLARiiON_IP_loop = "stay_in"
+         while CLARiiON_IP_loop == "stay_in":
+-            ans = input("CLARiiON SP IP Address or [Enter] to exit: ")
++            try:
++                ans = input("CLARiiON SP IP Address or [Enter] to exit: ")
++            except:
++                return
+             if self.check_ext_prog("navicli -h %s getsptime" % (ans,)):
+                 CLARiiON_IP_address_list.append(ans)
+             else:
+-- 
+1.9.3
+
diff --git a/SOURCES/0034-docs-update-man-page-for-new-options.patch b/SOURCES/0034-docs-update-man-page-for-new-options.patch
new file mode 100644
index 0000000..92cb8d1
--- /dev/null
+++ b/SOURCES/0034-docs-update-man-page-for-new-options.patch
@@ -0,0 +1,91 @@
+From 0be76caf77b53ce2726cb419262ceb8f52081c9e Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Wed, 17 Dec 2014 13:01:03 +0000
+Subject: [PATCH 34/93] [docs] update man page for new options
+
+The man page was missing:
+
+  --verify
+  --all-logs
+  --log-size
+  --plugin-option
+
+And listed the old '--ticket' (now --ticket-number).
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ man/en/sosreport.1 | 29 +++++++++++++++++++++++++----
+ 1 file changed, 25 insertions(+), 4 deletions(-)
+
+diff --git a/man/en/sosreport.1 b/man/en/sosreport.1
+index 88589cf..1066b1d 100644
+--- a/man/en/sosreport.1
++++ b/man/en/sosreport.1
+@@ -8,14 +8,19 @@ sosreport \- Collect and package diagnostic and support data
+           [-e|--enable-plugins plugin-names]\fR
+           [-o|--only-plugins plugin-names]\fR
+           [-a|--alloptions] [-v|--verbose]\fR
++          [-k plug.opt|--plugin-option plug.opt]\fR
+           [--no-report] [--config-file conf]\fR
+           [--batch] [--build] [--debug]\fR
+           [--name name] [--case-id id] [--ticket-number nr]
+           [--tmp-dir directory]\fR
+           [-p|--profile profile-name]\fR
+           [--list-profiles]\fR
++          [--verify]\fR
++          [--log-size]\fR
++          [--all-logs]\fR
+           [-z|--compression-type method]\fR
+-          [--help]\fR
++          [-h|--help]\fR
++
+ .SH DESCRIPTION
+ \fBsosreport\fR generates an archive of configuration and diagnostic
+ information from the running system. The archive may be stored locally
+@@ -46,7 +51,7 @@ Enable the specified plugin(s) only (all other plugins should be
+ disabled). Multiple plugins may be specified by repeating the option
+ or as a comma-separated list.
+ .TP
+-.B \-k PLUGNAME.PLUGOPT[=VALUE]
++.B \-k PLUGNAME.PLUGOPT[=VALUE], \--plugin-option=PLUGNAME.PLUGOPT[=VALUE]
+ Specify plug-in options. The option PLUGOPT is enabled, or set to the
+ specified value in the plug-in PLUGNAME.
+ .TP
+@@ -81,6 +86,22 @@ profiles include: boot, cluster, desktop, debug, hardware, identity,
+ network, openstack, packagemanager, security, services, storage,
+ sysmgmt, system, performance, virt, and webserver.
+ .TP
++.B \--verify
++Instructs plugins to perform plugin-specific verification during data
++collection. This may include package manager verification, log integrity
++testing or other plugin defined behaviour. Use of \--verify may cause
++the time taken to generate a report to be considerably longer.
++.TP
++.B \--log-size
++Places a global limit on the size of any collected set of logs. The
++limit is applied separately for each set of logs collected by any
++plugin.
++.TP
++.B \--all-logs
++Tell plugins to collect all possible log data ignoring any size limits
++and including logs in non-default locations. This option may significantly
++increase the size of reports.
++.TP
+ .B \-z, \--compression-type METHOD
+ Override the default compression type specified by the active policy.
+ .TP
+@@ -94,9 +115,9 @@ Specify a name to be used for the archive.
+ .B \--case-id NUMBER
+ Specify a case identifier to associate with the archive.
+ Identifiers may include alphanumeric characters, commas and periods ('.').
+-Synonymous with \--ticket, \--ticket-number.
++Synonymous with \--ticket-number.
+ .TP
+-.B \--ticket, \--ticket-number NUMBER
++.B \--ticket-number NUMBER
+ Specify a ticket number or other identifier to associate with the archive.
+ Identifiers may include alphanumeric characters, commas and periods ('.').
+ Synonymous with \--case-id.
+-- 
+1.9.3
+
diff --git a/SOURCES/0035-mysql-fix-command-line-dbpass-handling.patch b/SOURCES/0035-mysql-fix-command-line-dbpass-handling.patch
new file mode 100644
index 0000000..6c5c35c
--- /dev/null
+++ b/SOURCES/0035-mysql-fix-command-line-dbpass-handling.patch
@@ -0,0 +1,39 @@
+From db9ac3fb615b731be87b4116a8939105bf5ced56 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Tue, 23 Dec 2014 14:40:50 +0000
+Subject: [PATCH 35/93] [mysql] fix command-line dbpass handling
+
+The logic for chosing between a command-line and environment
+variable passed password in the MySQL plugin was incorrect. This
+prevents a database dump from being collected when a password is
+given on the command line.
+
+Altough use of the command line to pass authentication tokens
+is discouraged we should ensure the case works.
+
+Fixes #456.
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/plugins/mysql.py | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/sos/plugins/mysql.py b/sos/plugins/mysql.py
+index d148472..edab6d0 100644
+--- a/sos/plugins/mysql.py
++++ b/sos/plugins/mysql.py
+@@ -45,9 +45,9 @@ class Mysql(Plugin):
+         if self.get_option("dbdump"):
+             dbuser = self.get_option("dbuser")
+             dbpass = self.get_option("dbpass")
+-            if dbpass is False and 'MYSQL_PWD' in os.environ:
++            if 'MYSQL_PWD' in os.environ:
+                 dbpass = os.environ['MYSQL_PWD']
+-            else:
++            if not dbpass or dbpass is False:
+                 # no MySQL password
+                 return
+             os.environ['MYSQL_PWD'] = dbpass
+-- 
+1.9.3
+
diff --git a/SOURCES/0036-anaconda-make-useradd-password-regex-tolerant-of-whi.patch b/SOURCES/0036-anaconda-make-useradd-password-regex-tolerant-of-whi.patch
new file mode 100644
index 0000000..d0aaf1a
--- /dev/null
+++ b/SOURCES/0036-anaconda-make-useradd-password-regex-tolerant-of-whi.patch
@@ -0,0 +1,27 @@
+From 5a97e0e2571b948f1f7bc602e6f190976de99eee Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Tue, 13 Jan 2015 16:31:58 +0000
+Subject: [PATCH 36/93] [anaconda] make useradd password regex tolerant of
+ whitespace
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/plugins/anaconda.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/sos/plugins/anaconda.py b/sos/plugins/anaconda.py
+index 08d300b..aea3300 100644
+--- a/sos/plugins/anaconda.py
++++ b/sos/plugins/anaconda.py
+@@ -54,7 +54,7 @@ class Anaconda(Plugin, RedHatPlugin):
+         )
+         self.do_file_sub(
+             "/root/anaconda-ks.cfg",
+-            r"(user.*--password=*)(\S*)",
++            r"(user.*--password=*\s*)\s*(\S*)",
+             r"\1********"
+         )
+ 
+-- 
+1.9.3
+
diff --git a/SOURCES/0037-sosreport-catch-OSError-exceptions-in-SoSReport.exec.patch b/SOURCES/0037-sosreport-catch-OSError-exceptions-in-SoSReport.exec.patch
new file mode 100644
index 0000000..d240b4e
--- /dev/null
+++ b/SOURCES/0037-sosreport-catch-OSError-exceptions-in-SoSReport.exec.patch
@@ -0,0 +1,72 @@
+From 95bb5df9eda253afed15fa81340d31e03c40fe94 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Tue, 13 Jan 2015 17:10:06 +0000
+Subject: [PATCH 37/93] [sosreport] catch OSError exceptions in
+ SoSReport.execute()
+
+OSError exceptions during logging setup and tear down are not
+currently handled:
+
+  Traceback (most recent call last):
+    File "/usr/sbin/sosreport", line 25, in <module>
+      main(sys.argv[1:])
+    File "/usr/lib/python2.7/site-packages/sos/sosreport.py", line 1409, in main
+      sos.execute()
+    File "/usr/lib/python2.7/site-packages/sos/sosreport.py", line 1366, in execute
+      self._setup_logging()
+    File "/usr/lib/python2.7/site-packages/sos/sosreport.py", line 739, in _setup_logging
+      self.sos_log_file = self.get_temp_file()
+    File "/usr/lib/python2.7/site-packages/sos/sosreport.py", line 670, in get_temp_file
+      return self.tempfile_util.new()
+    File "/usr/lib/python2.7/site-packages/sos/sosreport.py", line 82, in new
+      fd, fname = tempfile.mkstemp(dir=self.tmp_dir)
+    File "/usr/lib64/python2.7/tempfile.py", line 304, in mkstemp
+      return _mkstemp_inner(dir, prefix, suffix, flags)
+    File "/usr/lib64/python2.7/tempfile.py", line 239, in _mkstemp_inner
+      fd = _os.open(file, flags, 0600)
+  OSError: [Errno 28] No space left on device: '/tmp/tmp.4ejNitjwcr/nospace_tmp/tmpBjPTOm'
+
+Address this by adding OSError to the list of caught exceptions
+in the main SoSReport.execute() method. Wrap the exception branch
+clean up in a try/except block to catch additional exceptions
+while attempting to clean up (e.g. unlink failures following an
+EROFS on the temporary archive path).
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/sosreport.py | 19 +++++++++++++------
+ 1 file changed, 13 insertions(+), 6 deletions(-)
+
+diff --git a/sos/sosreport.py b/sos/sosreport.py
+index 0dd26ad..2a16555 100644
+--- a/sos/sosreport.py
++++ b/sos/sosreport.py
+@@ -1395,12 +1395,19 @@ class SoSReport(object):
+             self.version()
+ 
+             return self.final_work()
+-        except (SystemExit, KeyboardInterrupt):
+-            if self.archive:
+-                self.archive.cleanup()
+-            if self.tempfile_util:
+-                self.tempfile_util.clean()
+-            return False
++
++        except (OSError, SystemExit, KeyboardInterrupt):
++            try:
++                # archive and tempfile cleanup may fail due to a fatal
++                # OSError exception (ENOSPC, EROFS etc.).
++                if self.archive:
++                    self.archive.cleanup()
++                if self.tempfile_util:
++                    self.tempfile_util.clean()
++            except:
++                pass
++
++        return False
+ 
+ 
+ def main(args):
+-- 
+1.9.3
+
diff --git a/SOURCES/0038-sosreport-do-not-make-logging-calls-after-OSError.patch b/SOURCES/0038-sosreport-do-not-make-logging-calls-after-OSError.patch
new file mode 100644
index 0000000..44ca185
--- /dev/null
+++ b/SOURCES/0038-sosreport-do-not-make-logging-calls-after-OSError.patch
@@ -0,0 +1,41 @@
+From ed44939d5988098feb3f3ddededd68a0a4b9a9df Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Tue, 13 Jan 2015 17:26:33 +0000
+Subject: [PATCH 38/93] [sosreport] do not make logging calls after OSError
+
+Following an OSError during archive setup the logging subsystem
+is potentially in an inconsistent or unusable state (e.g. due to
+a readonly file system error).
+
+Use the print function directly since we just need to report the
+error and exit.
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/sosreport.py | 9 ++++++---
+ 1 file changed, 6 insertions(+), 3 deletions(-)
+
+diff --git a/sos/sosreport.py b/sos/sosreport.py
+index 2a16555..3c0397c 100644
+--- a/sos/sosreport.py
++++ b/sos/sosreport.py
+@@ -1091,10 +1091,13 @@ class SoSReport(object):
+             self._make_archive_paths()
+             return
+         except (OSError, IOError) as e:
++            # we must not use the logging subsystem here as it is potentially
++            # in an inconsistent or unreliable state (e.g. an EROFS for the
++            # file system containing our temporary log files).
+             if e.errno in fatal_fs_errors:
+-                self.ui_log.error("")
+-                self.ui_log.error(" %s while setting up archive" % e.strerror)
+-                self.ui_log.error("")
++                print("")
++                print(" %s while setting up archive" % e.strerror)
++                print("")
+             else:
+                 raise e
+         except Exception as e:
+-- 
+1.9.3
+
diff --git a/SOURCES/0039-openstack_neutron-fix-legacy-component-detection-tes.patch b/SOURCES/0039-openstack_neutron-fix-legacy-component-detection-tes.patch
new file mode 100644
index 0000000..6c92cfe
--- /dev/null
+++ b/SOURCES/0039-openstack_neutron-fix-legacy-component-detection-tes.patch
@@ -0,0 +1,40 @@
+From 3f8c4b658c5d702bde59bdd98cb114ea0064eae9 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Thu, 9 Oct 2014 17:07:38 +0100
+Subject: [PATCH 39/93] [openstack_neutron] fix legacy component detection test
+
+Currently the Neutron plugin will assume it's running on a Neutron
+(rather than a legacy Quantum) installation if:
+
+  - '/etc/neutron' exists AND the user specifies quantum=True
+
+Otherwise it's assumed to be a Quantum install. This is clearly
+broken; the sense of the 'openstack_neutron.quantum' part of the
+test should be inverted.
+
+Fixes #420.
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/plugins/openstack_neutron.py | 5 +----
+ 1 file changed, 1 insertion(+), 4 deletions(-)
+
+diff --git a/sos/plugins/openstack_neutron.py b/sos/plugins/openstack_neutron.py
+index dba192e..d37430e 100644
+--- a/sos/plugins/openstack_neutron.py
++++ b/sos/plugins/openstack_neutron.py
+@@ -40,10 +40,7 @@ class Neutron(Plugin):
+     component_name = "neutron"
+ 
+     def setup(self):
+-        if os.path.exists("/etc/neutron/") and \
+-                self.get_option("quantum", False):
+-            self.component_name = self.plugin_name
+-        else:
++        if not os.path.exists("/etc/neutron/") or self.get_option("quantum"):
+             self.component_name = "quantum"
+ 
+         self.add_copy_spec([
+-- 
+1.9.3
+
diff --git a/SOURCES/0040-squid-collect-logs-from-var-log-squid.patch b/SOURCES/0040-squid-collect-logs-from-var-log-squid.patch
new file mode 100644
index 0000000..b05a83c
--- /dev/null
+++ b/SOURCES/0040-squid-collect-logs-from-var-log-squid.patch
@@ -0,0 +1,32 @@
+From d0408ac43e1ec3b114e69b2950202f87f2fcd250 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Mon, 19 Jan 2015 18:12:15 +0000
+Subject: [PATCH 40/93] [squid] collect logs from /var/log/squid
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/plugins/squid.py | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+diff --git a/sos/plugins/squid.py b/sos/plugins/squid.py
+index 0d596e5..f1aea73 100644
+--- a/sos/plugins/squid.py
++++ b/sos/plugins/squid.py
+@@ -29,8 +29,12 @@ class RedHatSquid(Squid, RedHatPlugin):
+     packages = ('squid',)
+ 
+     def setup(self):
+-        self.add_copy_spec_limit("/etc/squid/squid.conf",
+-                                 sizelimit=self.get_option('log_size'))
++        log_size = self.get_option('log_size')
++        log_path = "/var/log/squid/"
++        self.add_copy_spec_limit("/etc/squid/squid.conf", sizelimit=log_size)
++        self.add_copy_spec_limit(log_path + "access.log", sizelimit=log_size)
++        self.add_copy_spec_limit(log_path + "cache.log", sizelimit=log_size)
++        self.add_copy_spec_limit(log_path + "squid.out", sizelimit=log_size)
+ 
+ 
+ class DebianSquid(Squid, DebianPlugin, UbuntuPlugin):
+-- 
+1.9.3
+
diff --git a/SOURCES/0041-squid-don-t-use-add_copy_spec_limt-for-conf-files.patch b/SOURCES/0041-squid-don-t-use-add_copy_spec_limt-for-conf-files.patch
new file mode 100644
index 0000000..5ade9e2
--- /dev/null
+++ b/SOURCES/0041-squid-don-t-use-add_copy_spec_limt-for-conf-files.patch
@@ -0,0 +1,26 @@
+From c9f1588bb69dff6cc322b05436793ed9cc39568c Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Mon, 19 Jan 2015 18:33:31 +0000
+Subject: [PATCH 41/93] [squid] don't use add_copy_spec_limt() for conf files
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/plugins/squid.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/sos/plugins/squid.py b/sos/plugins/squid.py
+index f1aea73..a995158 100644
+--- a/sos/plugins/squid.py
++++ b/sos/plugins/squid.py
+@@ -31,7 +31,7 @@ class RedHatSquid(Squid, RedHatPlugin):
+     def setup(self):
+         log_size = self.get_option('log_size')
+         log_path = "/var/log/squid/"
+-        self.add_copy_spec_limit("/etc/squid/squid.conf", sizelimit=log_size)
++        self.add_copy_spec("/etc/squid/squid.conf")
+         self.add_copy_spec_limit(log_path + "access.log", sizelimit=log_size)
+         self.add_copy_spec_limit(log_path + "cache.log", sizelimit=log_size)
+         self.add_copy_spec_limit(log_path + "squid.out", sizelimit=log_size)
+-- 
+1.9.3
+
diff --git a/SOURCES/0042-ctdb-fix-RedHatPlugin-tagging-use.patch b/SOURCES/0042-ctdb-fix-RedHatPlugin-tagging-use.patch
new file mode 100644
index 0000000..e461f84
--- /dev/null
+++ b/SOURCES/0042-ctdb-fix-RedHatPlugin-tagging-use.patch
@@ -0,0 +1,42 @@
+From 12ec2a4643c844a7a9bf46f3d9557e38f0ae7403 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Mon, 19 Jan 2015 18:47:03 +0000
+Subject: [PATCH 42/93] [ctdb] fix RedHatPlugin tagging use
+
+The generic Ctdb class is tagged with RedHatPlugin. This causes
+the RedHatCtdb to not execute (since only the first matching class
+is instantiated).
+
+Remove the RedHatPlugin tag from the Ctdb class and fix the
+former's call to Ctdb.setup().
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/plugins/ctdb.py | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/sos/plugins/ctdb.py b/sos/plugins/ctdb.py
+index 443181c..e1bd78e 100644
+--- a/sos/plugins/ctdb.py
++++ b/sos/plugins/ctdb.py
+@@ -16,7 +16,7 @@
+ from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin
+ 
+ 
+-class Ctdb(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
++class Ctdb(Plugin, DebianPlugin, UbuntuPlugin):
+     """Samba Clustered TDB
+     """
+     packages = ('ctdb',)
+@@ -45,7 +45,7 @@ class Ctdb(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
+ 
+ class RedHatCtdb(Ctdb, RedHatPlugin):
+     def setup(self):
+-        super(RedHatCtdb, self).super()
++        super(RedHatCtdb, self).setup()
+         self.add_copy_spec("/etc/sysconfig/ctdb")
+ 
+ # vim: et ts=4 sw=4
+-- 
+1.9.3
+
diff --git a/SOURCES/0043-sosreport-log-plugin-exceptions-to-a-file.patch b/SOURCES/0043-sosreport-log-plugin-exceptions-to-a-file.patch
new file mode 100644
index 0000000..770668a
--- /dev/null
+++ b/SOURCES/0043-sosreport-log-plugin-exceptions-to-a-file.patch
@@ -0,0 +1,67 @@
+From 8b49485153cc7dc03cd974dbc3a100c81ef04720 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Mon, 19 Jan 2015 19:40:06 +0000
+Subject: [PATCH 43/93] [sosreport] log plugin exceptions to a file
+
+Add exception logging for the Plugin.postproc() method and move
+plugin exceptions into a separate per-plugin log file. This is
+less cluttered than pushing a multi-line traceback through the
+soslog.error logger and matches the behaviour of older releases.
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/sosreport.py | 17 +++++++++++++----
+ 1 file changed, 13 insertions(+), 4 deletions(-)
+
+diff --git a/sos/sosreport.py b/sos/sosreport.py
+index 3c0397c..f17194a 100644
+--- a/sos/sosreport.py
++++ b/sos/sosreport.py
+@@ -1071,8 +1071,14 @@ class SoSReport(object):
+                 self.ui_log.info("")
+                 self._exit()
+ 
+-    def _log_plugin_exception(self, plugin_name):
+-        self.soslog.error("%s\n%s" % (plugin_name, traceback.format_exc()))
++    def _log_plugin_exception(self, plugin, method):
++        trace = traceback.format_exc()
++        msg = "caught exception in plugin method"
++        plugin_err_log = "%s-plugin-errors.txt" % plugin
++        logpath = os.path.join(self.logdir, plugin_err_log)
++        self.soslog.error('%s "%s.%s()"' % (msg, plugin, method))
++        self.soslog.error('writing traceback to %s' % logpath)
++        self.archive.add_string("%s\n" % trace, logpath)
+ 
+     def prework(self):
+         self.policy.pre_work()
+@@ -1129,7 +1135,7 @@ class SoSReport(object):
+                 if self.raise_plugins:
+                     raise
+                 else:
+-                    self._log_plugin_exception(plugname)
++                    self._log_plugin_exception(plugname, "setup")
+ 
+     def version(self):
+         """Fetch version information from all plugins and store in the report
+@@ -1175,7 +1181,7 @@ class SoSReport(object):
+                 if self.raise_plugins:
+                     raise
+                 else:
+-                    self._log_plugin_exception(plugname)
++                    self._log_plugin_exception(plugname, "collect")
+         self.ui_log.info("")
+ 
+     def report(self):
+@@ -1321,6 +1327,9 @@ class SoSReport(object):
+             except:
+                 if self.raise_plugins:
+                     raise
++                else:
++                    self._log_plugin_exception(plugname, "postproc")
++
+ 
+     def final_work(self):
+         # this must come before archive creation to ensure that log
+-- 
+1.9.3
+
diff --git a/SOURCES/0044-sosreport-fix-stray-whitespace-fix-from-previous-com.patch b/SOURCES/0044-sosreport-fix-stray-whitespace-fix-from-previous-com.patch
new file mode 100644
index 0000000..b872ddf
--- /dev/null
+++ b/SOURCES/0044-sosreport-fix-stray-whitespace-fix-from-previous-com.patch
@@ -0,0 +1,28 @@
+From 263e4183822c70b37019879308e77c91272e2895 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Mon, 19 Jan 2015 19:52:13 +0000
+Subject: [PATCH 44/93] [sosreport] fix stray whitespace fix from previous
+ commit
+
+Fixed in tree but not added to commit.
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/sosreport.py | 1 -
+ 1 file changed, 1 deletion(-)
+
+diff --git a/sos/sosreport.py b/sos/sosreport.py
+index f17194a..83ea30d 100644
+--- a/sos/sosreport.py
++++ b/sos/sosreport.py
+@@ -1330,7 +1330,6 @@ class SoSReport(object):
+                 else:
+                     self._log_plugin_exception(plugname, "postproc")
+ 
+-
+     def final_work(self):
+         # this must come before archive creation to ensure that log
+         # files are closed and cleaned up at exit.
+-- 
+1.9.3
+
diff --git a/SOURCES/0045-sosreport-fix-silent-exception-handling-in-sosreport.patch b/SOURCES/0045-sosreport-fix-silent-exception-handling-in-sosreport.patch
new file mode 100644
index 0000000..0a0ac46
--- /dev/null
+++ b/SOURCES/0045-sosreport-fix-silent-exception-handling-in-sosreport.patch
@@ -0,0 +1,73 @@
+From 370f58d3e9ec141ab4b0c49521c79cc90fab6c00 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Mon, 19 Jan 2015 20:49:47 +0000
+Subject: [PATCH 45/93] [sosreport] fix silent exception handling in sosreport
+
+The OSError and IOError exception branches for the setup, collect,
+and postproc methods silently ignore plugin exceptions that are
+not on the list of fatal fs errors (that will cause sos to halt
+immediately).
+
+Fix this and either raise the exception (if --debug is given) or
+log it to a file via _log_plugin_exception().
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/sosreport.py | 18 ++++++++++++------
+ 1 file changed, 12 insertions(+), 6 deletions(-)
+
+diff --git a/sos/sosreport.py b/sos/sosreport.py
+index 83ea30d..e83e718 100644
+--- a/sos/sosreport.py
++++ b/sos/sosreport.py
+@@ -1131,11 +1131,13 @@ class SoSReport(object):
+                                       % e.strerror)
+                     self.ui_log.error("")
+                     self._exit(1)
++                if self.raise_plugins:
++                    raise
++                self._log_plugin_exception(plugname, "setup")
+             except:
+                 if self.raise_plugins:
+                     raise
+-                else:
+-                    self._log_plugin_exception(plugname, "setup")
++                self._log_plugin_exception(plugname, "setup")
+ 
+     def version(self):
+         """Fetch version information from all plugins and store in the report
+@@ -1177,11 +1179,13 @@ class SoSReport(object):
+                                       % e.strerror)
+                     self.ui_log.error("")
+                     self._exit(1)
++                if self.raise_plugins:
++                    raise
++                self._log_plugin_exception(plugname, "collect")
+             except:
+                 if self.raise_plugins:
+                     raise
+-                else:
+-                    self._log_plugin_exception(plugname, "collect")
++                self._log_plugin_exception(plugname, "collect")
+         self.ui_log.info("")
+ 
+     def report(self):
+@@ -1324,11 +1328,13 @@ class SoSReport(object):
+                                       % e.strerror)
+                     self.ui_log.error("")
+                     self._exit(1)
++                if self.raise_plugins:
++                    raise
++                self._log_plugin_exception(plugname, "postproc")
+             except:
+                 if self.raise_plugins:
+                     raise
+-                else:
+-                    self._log_plugin_exception(plugname, "postproc")
++                self._log_plugin_exception(plugname, "postproc")
+ 
+     def final_work(self):
+         # this must come before archive creation to ensure that log
+-- 
+1.9.3
+
diff --git a/SOURCES/0046-docker-use-splitelines-for-command-output.patch b/SOURCES/0046-docker-use-splitelines-for-command-output.patch
new file mode 100644
index 0000000..81a1850
--- /dev/null
+++ b/SOURCES/0046-docker-use-splitelines-for-command-output.patch
@@ -0,0 +1,34 @@
+From ce6cd3ae9dc89dd1de5122add016ce2df60b6cee Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Mon, 19 Jan 2015 21:40:27 +0000
+Subject: [PATCH 46/93] [docker] use splitelines() for command output
+
+Let's not reinvent splitlines(); the handrolled version docker
+was using fails to ignore the last newline:
+
+[plugin:docker] collecting output of 'docker logs 9b8f61c09dba'
+[plugin:docker] collecting output of 'docker logs 6f46267c91d6'
+[plugin:docker] collecting output of 'docker logs '
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/plugins/docker.py | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+diff --git a/sos/plugins/docker.py b/sos/plugins/docker.py
+index d8851a0..ef4ede0 100644
+--- a/sos/plugins/docker.py
++++ b/sos/plugins/docker.py
+@@ -45,8 +45,7 @@ class Docker(Plugin):
+ 
+         result = self.get_command_output(ps_cmd)
+         if result['status'] == 0:
+-            result['output'] = result['output'].split("\n")
+-            for line in result['output'][1:]:
++            for line in result['output'].splitlines()[1:]:
+                 container_id = line.split(" ")[0]
+                 self.add_cmd_output([
+                     "{0} logs {1}".format(self.docker_bin, container_id)
+-- 
+1.9.3
+
diff --git a/SOURCES/0047-networking-Enable-the-networking-on-debian-based-sys.patch b/SOURCES/0047-networking-Enable-the-networking-on-debian-based-sys.patch
new file mode 100644
index 0000000..676bc4f
--- /dev/null
+++ b/SOURCES/0047-networking-Enable-the-networking-on-debian-based-sys.patch
@@ -0,0 +1,52 @@
+From 029448ae10e687e51896710065fd862c0fa66fa4 Mon Sep 17 00:00:00 2001
+From: Michael Kerrin <michael.kerrin@hp.com>
+Date: Thu, 15 Jan 2015 16:55:55 +0000
+Subject: [PATCH 47/93] [networking] Enable the networking on debian based
+ systems
+
+Fixes #463
+
+Signed-off-by: Michael Kerrin <michael.kerrin@hp.com>
+Signed-off-by: Adam Stokes <adam.stokes@ubuntu.com>
+---
+ AUTHORS                   | 1 +
+ sos/plugins/networking.py | 4 ++--
+ 2 files changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/AUTHORS b/AUTHORS
+index 706f187..aead80d 100644
+--- a/AUTHORS
++++ b/AUTHORS
+@@ -26,6 +26,7 @@ Kent Lamb <klamb@redhat.com>
+ Louis Bouchard <louis.bouchard@canonical.com>
+ Lukas Zapletal <lzap@redhat.com>
+ Marc Sauton <msauton@redhat.com>
++Michael Kerrin <michael.kerrin@hp.com>
+ Michele Baldessari <michele@acksyn.org>
+ Navid Sheikhol-Eslami <navid@redhat.com>
+ Pierre Amadio  <pamadio@redhat.com>
+diff --git a/sos/plugins/networking.py b/sos/plugins/networking.py
+index efefc45..c46a685 100644
+--- a/sos/plugins/networking.py
++++ b/sos/plugins/networking.py
+@@ -12,7 +12,7 @@
+ # 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, UbuntuPlugin
++from sos.plugins import Plugin, RedHatPlugin, UbuntuPlugin, DebianPlugin
+ import os
+ import re
+ 
+@@ -166,7 +166,7 @@ class RedHatNetworking(Networking, RedHatPlugin):
+         super(RedHatNetworking, self).setup()
+ 
+ 
+-class UbuntuNetworking(Networking, UbuntuPlugin):
++class UbuntuNetworking(Networking, UbuntuPlugin, DebianPlugin):
+     trace_host = "archive.ubuntu.com"
+ 
+     def setup(self):
+-- 
+1.9.3
+
diff --git a/SOURCES/0048-apport-Add-information-on-specific-crashes.patch b/SOURCES/0048-apport-Add-information-on-specific-crashes.patch
new file mode 100644
index 0000000..45e5d30
--- /dev/null
+++ b/SOURCES/0048-apport-Add-information-on-specific-crashes.patch
@@ -0,0 +1,37 @@
+From 70d026420fe4eacfddb4abb544ded60c2a055dae Mon Sep 17 00:00:00 2001
+From: Bryan Quigley <Bryan.Quigley@Canonical.com>
+Date: Mon, 24 Nov 2014 09:47:10 -0500
+Subject: [PATCH 48/93] [apport] Add information on specific crashes
+
+The whoopsie ID let's us look the machine up
+on errors.ubuntu.com for crash reports.
+Partial output from /var/crash let's us
+better know what crashdumps the user has without
+uploading all of them.
+
+Signed-off-by: Bryan Quigley <Bryan.Quigley@Canonical.com>
+Signed-off-by: Adam Stokes <adam.stokes@ubuntu.com>
+---
+ sos/plugins/apport.py | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+diff --git a/sos/plugins/apport.py b/sos/plugins/apport.py
+index 6756c78..c942c2d 100644
+--- a/sos/plugins/apport.py
++++ b/sos/plugins/apport.py
+@@ -25,5 +25,12 @@ class Apport(Plugin, DebianPlugin, UbuntuPlugin):
+ 
+     def setup(self):
+         self.add_copy_spec("/etc/apport/*")
++        self.add_copy_spec("/var/lib/whoopsie/whoopsie-id")
++        self.add_cmd_output(
++            "gdbus call -y -d com.ubuntu.WhoopsiePreferences \
++            -o /com/ubuntu/WhoopsiePreferences \
++            -m com.ubuntu.WhoopsiePreferences.GetIdentifier")
++        self.add_cmd_output("ls -alh /var/crash/")
++        self.add_cmd_output("bash -c 'grep -B 50 -m 1 ProcMaps /var/crash/*'")
+ 
+ # vim: et ts=4 sw=4
+-- 
+1.9.3
+
diff --git a/SOURCES/0049-mysql-test-for-boolean-values-in-user-and-password-o.patch b/SOURCES/0049-mysql-test-for-boolean-values-in-user-and-password-o.patch
new file mode 100644
index 0000000..4a340eb
--- /dev/null
+++ b/SOURCES/0049-mysql-test-for-boolean-values-in-user-and-password-o.patch
@@ -0,0 +1,45 @@
+From 05466cd6d9d70321fc7a0097334ef36af8dfeb43 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Tue, 20 Jan 2015 16:16:17 +0000
+Subject: [PATCH 49/93] [mysql] test for boolean values in user and password
+ options
+
+If sosreport is run with '-a' all options will be set to boolean
+True. This causes an exception if an attempt is made to set an
+environment variable to the option value:
+
+  Traceback (most recent call last):
+    File "/usr/sbin/sosreport", line 25, in <module>
+      main(sys.argv[1:])
+    File "/usr/lib/python2.7/site-packages/sos/sosreport.py", line 1435, in main
+      sos.execute()
+  TypeError: must be string, not bool
+
+  > /usr/lib64/python2.7/os.py(471)__setitem__()
+  -> putenv(key, item)
+
+Test both values with isinstance(val, bool) and do not attempt to
+collect a database dump if either is a boolean.
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/plugins/mysql.py | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/sos/plugins/mysql.py b/sos/plugins/mysql.py
+index edab6d0..dd899a3 100644
+--- a/sos/plugins/mysql.py
++++ b/sos/plugins/mysql.py
+@@ -45,6 +45,9 @@ class Mysql(Plugin):
+         if self.get_option("dbdump"):
+             dbuser = self.get_option("dbuser")
+             dbpass = self.get_option("dbpass")
++            if isinstance(dbuser, bool) or isinstance(dbpass, bool):
++                # sosreport -a
++                return
+             if 'MYSQL_PWD' in os.environ:
+                 dbpass = os.environ['MYSQL_PWD']
+             if not dbpass or dbpass is False:
+-- 
+1.9.3
+
diff --git a/SOURCES/0050-mysql-improve-handling-of-dbuser-dbpass-and-MYSQL_PW.patch b/SOURCES/0050-mysql-improve-handling-of-dbuser-dbpass-and-MYSQL_PW.patch
new file mode 100644
index 0000000..124275f
--- /dev/null
+++ b/SOURCES/0050-mysql-improve-handling-of-dbuser-dbpass-and-MYSQL_PW.patch
@@ -0,0 +1,81 @@
+From 7c12e6c994b3320ef57a13e06f5c445b6bca7935 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Thu, 22 Jan 2015 15:37:15 +0000
+Subject: [PATCH 50/93] [mysql] improve handling of dbuser, dbpass and
+ MYSQL_PWD
+
+Make sure that the mysql plugin behaves correctly when given
+different combinations of values for dbuser, dbpass and MYSQL_PWD.
+
+* If dbdump is set then either dbpass or MYSQL_PWD must be set
+* Warn if dbdump is set and dbuser or dbpass is True/False/null
+  (indicates either 'sosreport -a' or '-k mysql.dbpass')
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/plugins/mysql.py | 24 ++++++++++++++++++++----
+ 1 file changed, 20 insertions(+), 4 deletions(-)
+
+diff --git a/sos/plugins/mysql.py b/sos/plugins/mysql.py
+index dd899a3..8dba204 100644
+--- a/sos/plugins/mysql.py
++++ b/sos/plugins/mysql.py
+@@ -24,35 +24,51 @@ class Mysql(Plugin):
+     profiles = ('services',)
+     mysql_cnf = "/etc/my.cnf"
+ 
++    pw_warn_text = " (password visible in process listings)"
++
+     option_list = [
+         ("dbuser", "username for database dumps", "", "mysql"),
+-        ("dbpass", "password for database dumps", "", False),
++        ("dbpass", "password for database dumps" + pw_warn_text, "", False),
+         ("dbdump", "collect a database dump", "", False)
+     ]
+ 
+     def setup(self):
+         super(Mysql, self).setup()
++
+         self.add_copy_spec([
+             self.mysql_cnf,
+             "/var/log/mysql/mysqld.log",
+             "/var/log/mariadb/mariadb.log",
+         ])
++
+         if self.get_option("all_logs"):
+             self.add_copy_spec([
+                 "/var/log/mysql*",
+                 "/var/log/mariadb*"
+             ])
++
+         if self.get_option("dbdump"):
++            msg = "database user name and password must be supplied"
++            dbdump_err = "mysql.dbdump: %s" % msg
++
+             dbuser = self.get_option("dbuser")
+             dbpass = self.get_option("dbpass")
+-            if isinstance(dbuser, bool) or isinstance(dbpass, bool):
+-                # sosreport -a
+-                return
++
+             if 'MYSQL_PWD' in os.environ:
+                 dbpass = os.environ['MYSQL_PWD']
++
++            if dbuser is True or dbpass is True:
++                # sosreport -a or -k mysql.{dbuser,dbpass}
++                self.soslog.warning(dbdump_err)
++                return
++
+             if not dbpass or dbpass is False:
+                 # no MySQL password
++                self.soslog.warning(dbdump_err)
+                 return
++
++            # no need to save/restore as this variable is private to
++            # the mysql plugin.
+             os.environ['MYSQL_PWD'] = dbpass
+ 
+             opts = "--user=%s --all-databases" % dbuser
+-- 
+1.9.3
+
diff --git a/SOURCES/0051-sosreport-add-sysroot-option.patch b/SOURCES/0051-sosreport-add-sysroot-option.patch
new file mode 100644
index 0000000..7cfa110
--- /dev/null
+++ b/SOURCES/0051-sosreport-add-sysroot-option.patch
@@ -0,0 +1,64 @@
+From 5c5fde328585732923f3f0a8e966c4daaec3c7ed Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Mon, 19 Jan 2015 18:54:09 +0000
+Subject: [PATCH 51/93] [sosreport] add --sysroot option
+
+Add a --sysroot=SYSROOT option to specify that the root file system to
+be inspected is mounted at SYSROOT.
+
+This allows basic support for container environments where sos is
+running in a container and inspecting the containing host and its
+environment ('superspection').
+
+For this to work currently the following conditions must be met:
+
+- sos is sufficiently privileged to read and search relevant file
+  system paths within SYSROOT
+
+- sos must share the PID and network namespace of the target host
+
+- binaries called by sos must be present and executable in the
+  SYSROOT inherited by sos. If PATH includes paths inside SYSROOT
+  appropriate values must be set for LD_LIBRARY_PATH to allow
+  shared executables to be linked.
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/sosreport.py | 14 ++++++++++++++
+ 1 file changed, 14 insertions(+)
+
+diff --git a/sos/sosreport.py b/sos/sosreport.py
+index e83e718..edc9cba 100644
+--- a/sos/sosreport.py
++++ b/sos/sosreport.py
+@@ -514,6 +514,17 @@ class SoSOptions(object):
+         self._report = value
+ 
+     @property
++    def sysroot(self):
++        if self._options is not None:
++            return self._options.sysroot
++        return self._sysroot
++
++    @sysroot.setter
++    def sysroot(self, value):
++        self._check_options_initialized()
++        self._sysroot = value
++
++    @property
+     def compression_type(self):
+         if self._options is not None:
+             return self._options.compression_type
+@@ -598,6 +609,9 @@ class SoSOptions(object):
+         parser.add_option("--no-report", action="store_true",
+                           dest="report",
+                           help="Disable HTML/XML reporting", default=False)
++        parser.add_option("-s", "--sysroot", action="store", dest="sysroot",
++                          help="system root directory path (default='/')",
++                          default="/")
+         parser.add_option("-z", "--compression-type", dest="compression_type",
+                           help="compression technology to use [auto, "
+                                "gzip, bzip2, xz] (default=auto)",
+-- 
+1.9.3
+
diff --git a/SOURCES/0052-plugins-propagate-sysroot-to-Plugin-via-commons.patch b/SOURCES/0052-plugins-propagate-sysroot-to-Plugin-via-commons.patch
new file mode 100644
index 0000000..33672a2
--- /dev/null
+++ b/SOURCES/0052-plugins-propagate-sysroot-to-Plugin-via-commons.patch
@@ -0,0 +1,50 @@
+From d381fc6d15b8bc39a76aafdf853f73d887745473 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Fri, 23 Jan 2015 15:24:00 +0000
+Subject: [PATCH 52/93] [plugins] propagate sysroot to Plugin via commons
+
+Although plugins should generally be unaware that they are being
+run with an alternate sysroot the generic plugin IO code must
+peform the appropriate path prefixing when sysroot is not '/'.
+
+Propagate sysroot to plugin classes via the commons dictionary.
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/sosreport.py | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+diff --git a/sos/sosreport.py b/sos/sosreport.py
+index edc9cba..21c12ad 100644
+--- a/sos/sosreport.py
++++ b/sos/sosreport.py
+@@ -632,6 +632,7 @@ class SoSReport(object):
+         self.archive = None
+         self.tempfile_util = None
+         self._args = args
++        self.sysroot = "/"
+ 
+         try:
+             import signal
+@@ -661,6 +662,10 @@ class SoSReport(object):
+         self.tempfile_util = TempFileUtil(self.tmpdir)
+         self._set_directories()
+ 
++        # set alternate system root directory
++        if self.opts.sysroot:
++            self.sysroot = self.opts.sysroot
++
+     def print_header(self):
+         self.ui_log.info("\n%s\n" % _("sosreport (version %s)" %
+                          (__version__,)))
+@@ -673,6 +678,7 @@ class SoSReport(object):
+             'tmpdir': self.tmpdir,
+             'soslog': self.soslog,
+             'policy': self.policy,
++            'sysroot': self.sysroot,
+             'verbosity': self.opts.verbosity,
+             'xmlreport': self.xml_report,
+             'cmdlineopts': self.opts,
+-- 
+1.9.3
+
diff --git a/SOURCES/0053-plugins-prefix-target-paths-with-self.sysroot.patch b/SOURCES/0053-plugins-prefix-target-paths-with-self.sysroot.patch
new file mode 100644
index 0000000..42394e7
--- /dev/null
+++ b/SOURCES/0053-plugins-prefix-target-paths-with-self.sysroot.patch
@@ -0,0 +1,379 @@
+From c1557088c243d848b395e33b3becf61614c11bf1 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Fri, 23 Jan 2015 23:17:34 +0000
+Subject: [PATCH 53/93] [plugins] prefix target paths with self.sysroot
+
+Prefix copyspecs with self.sysroot when using an alternate root
+path. Prefixes are applied before expanding copyspecs and the
+prefixed paths are stored as the 'srcpath' attribute in the
+archive. Destination paths in the report archive do not include
+the prefix.
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/plugins/__init__.py | 52 +++++++++++++++++++++++++++++++++++---------
+ tests/option_tests.py   |  3 ++-
+ tests/plugin_tests.py   | 57 ++++++++++++++++++++++++++++++++-----------------
+ 3 files changed, 82 insertions(+), 30 deletions(-)
+
+diff --git a/sos/plugins/__init__.py b/sos/plugins/__init__.py
+index 4fd85be..14136b4 100644
+--- a/sos/plugins/__init__.py
++++ b/sos/plugins/__init__.py
+@@ -101,6 +101,7 @@ class Plugin(object):
+     files = ()
+     archive = None
+     profiles = ()
++    sysroot = '/'
+ 
+     def __init__(self, commons):
+         if not getattr(self, "option_list", False):
+@@ -117,6 +118,7 @@ class Plugin(object):
+         self.copy_paths = set()
+         self.copy_strings = []
+         self.collect_cmds = []
++        self.sysroot = commons['sysroot']
+ 
+         self.soslog = self.commons['soslog'] if 'soslog' in self.commons \
+             else logging.getLogger('sos')
+@@ -154,6 +156,19 @@ class Plugin(object):
+     def policy(self):
+         return self.commons["policy"]
+ 
++    def join_sysroot(self, path):
++        if path[0] == os.sep:
++            path = path[1:]
++        return os.path.join(self.sysroot, path)
++
++    def strip_sysroot(self, path):
++        if path.startswith(self.sysroot):
++            return path[len(self.sysroot):]
++        return path
++
++    def use_sysroot(self):
++        return self.sysroot != os.path.abspath(os.sep)
++
+     def is_installed(self, package_name):
+         '''Is the package $package_name installed?'''
+         return self.policy().pkg_by_name(package_name) is not None
+@@ -207,6 +222,7 @@ class Plugin(object):
+         '''
+         try:
+             path = self._get_dest_for_srcpath(srcpath)
++            self._log_debug("substituting scrpath '%s'" % srcpath)
+             self._log_debug("substituting '%s' for '%s' in '%s'"
+                             % (subst, regexp, path))
+             if not path:
+@@ -257,8 +273,9 @@ class Plugin(object):
+         self._log_debug("copying link '%s' pointing to '%s' with isdir=%s"
+                         % (srcpath, linkdest, os.path.isdir(absdest)))
+ 
++        dstpath = self.strip_sysroot(srcpath)
+         # use the relative target path in the tarball
+-        self.archive.add_link(reldest, srcpath)
++        self.archive.add_link(reldest, dstpath)
+ 
+         if os.path.isdir(absdest):
+             self._log_debug("link '%s' is a directory, skipping..." % linkdest)
+@@ -268,10 +285,10 @@ class Plugin(object):
+         # to absolute paths to pass to _do_copy_path.
+         self._log_debug("normalized link target '%s' as '%s'"
+                         % (linkdest, absdest))
+-        self._do_copy_path(absdest)
++        self._do_copy_path(self.join_sysroot(absdest))
+ 
+         self.copied_files.append({'srcpath': srcpath,
+-                                  'dstpath': srcpath,
++                                  'dstpath': dstpath,
+                                   'symlink': "yes",
+                                   'pointsto': linkdest})
+ 
+@@ -282,6 +299,8 @@ class Plugin(object):
+             self._do_copy_path(os.path.join(srcpath, afile), dest=None)
+ 
+     def _get_dest_for_srcpath(self, srcpath):
++        if self.use_sysroot():
++            srcpath = self.join_sysroot(srcpath)
+         for copied in self.copied_files:
+             if srcpath == copied["srcpath"]:
+                 return copied["dstpath"]
+@@ -309,6 +328,9 @@ class Plugin(object):
+         if not dest:
+             dest = srcpath
+ 
++        if self.use_sysroot():
++            dest = self.strip_sysroot(dest)
++
+         try:
+             st = os.lstat(srcpath)
+         except (OSError, IOError):
+@@ -327,7 +349,7 @@ class Plugin(object):
+         if not (stat.S_ISREG(st.st_mode) or stat.S_ISDIR(st.st_mode)):
+             ntype = _node_type(st)
+             self._log_debug("creating %s node at archive:'%s'"
+-                            % (ntype, srcpath))
++                            % (ntype, dest))
+             self._copy_node(srcpath, st)
+             return
+ 
+@@ -341,9 +363,11 @@ class Plugin(object):
+         else:
+             self.archive.add_file(srcpath, dest)
+ 
+-        self.copied_files.append({'srcpath': srcpath,
+-                                  'dstpath': dest,
+-                                  'symlink': "no"})
++        self.copied_files.append({
++            'srcpath': srcpath,
++            'dstpath': dest,
++            'symlink': "no"
++        })
+ 
+     def add_forbidden_path(self, forbiddenPath):
+         """Specify a path to not copy, even if it's part of a copy_specs[]
+@@ -410,6 +434,9 @@ class Plugin(object):
+         except Exception:
+             return default
+ 
++    def _add_copy_paths(self, copy_paths):
++        self.copy_paths.update(copy_paths)
++
+     def add_copy_spec_limit(self, copyspec, sizelimit=None, tailit=True):
+         """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
+@@ -418,10 +445,13 @@ class Plugin(object):
+         if not (copyspec and len(copyspec)):
+             return False
+ 
++        if self.use_sysroot():
++            copyspec = self.join_sysroot(copyspec)
+         files = glob.glob(copyspec)
+         files.sort()
+         if len(files) == 0:
+             return
++
+         current_size = 0
+         limit_reached = False
+         sizelimit *= 1024 * 1024  # in MB
+@@ -432,7 +462,7 @@ class Plugin(object):
+             if sizelimit and current_size > sizelimit:
+                 limit_reached = True
+                 break
+-            self.add_copy_spec(_file)
++            self._add_copy_paths([_file])
+ 
+         if limit_reached and tailit:
+             file_name = _file
+@@ -453,12 +483,14 @@ class Plugin(object):
+         if isinstance(copyspecs, six.string_types):
+             copyspecs = [copyspecs]
+         for copyspec in copyspecs:
++            if self.use_sysroot():
++                copyspec = self.join_sysroot(copyspec)
+             if not (copyspec and len(copyspec)):
+                 self._log_warn("added null or empty copy spec")
+                 return False
+             copy_paths = self._expand_copy_spec(copyspec)
+-            self.copy_paths.update(copy_paths)
+-            self._log_info("added copyspec '%s'" % copyspec)
++            self._add_copy_paths(copy_paths)
++            self._log_info("added copyspec '%s'" % copy_paths)
+ 
+     def get_command_output(self, prog, timeout=300, runat=None):
+         result = sos_get_command_output(prog, timeout=timeout, runat=runat)
+diff --git a/tests/option_tests.py b/tests/option_tests.py
+index 3185bce..32f8e03 100644
+--- a/tests/option_tests.py
++++ b/tests/option_tests.py
+@@ -8,10 +8,11 @@ class GlobalOptionTest(unittest.TestCase):
+ 
+     def setUp(self):
+         self.commons = {
++            'sysroot': '/',
+             'global_plugin_options': {
+                 'test_option': 'foobar',
+                 'baz': None,
+-                'empty_global': True,
++                'empty_global': True
+             },
+         }
+         self.plugin = Plugin(self.commons)
+diff --git a/tests/plugin_tests.py b/tests/plugin_tests.py
+index 7364eff..2fd0fff 100644
+--- a/tests/plugin_tests.py
++++ b/tests/plugin_tests.py
+@@ -127,50 +127,53 @@ class PluginToolTests(unittest.TestCase):
+ 
+ class PluginTests(unittest.TestCase):
+ 
++    sysroot = os.getcwd()
++
+     def setUp(self):
+         self.mp = MockPlugin({
+-            'cmdlineopts': MockOptions()
++            'cmdlineopts': MockOptions(),
++            'sysroot': self.sysroot
+         })
+         self.mp.archive = MockArchive()
+ 
+     def test_plugin_default_name(self):
+-        p = MockPlugin({})
++        p = MockPlugin({'sysroot': self.sysroot})
+         self.assertEquals(p.name(), "mockplugin")
+ 
+     def test_plugin_set_name(self):
+-        p = NamedMockPlugin({})
++        p = NamedMockPlugin({'sysroot': self.sysroot})
+         self.assertEquals(p.name(), "testing")
+ 
+     def test_plugin_no_descrip(self):
+-        p = MockPlugin({})
++        p = MockPlugin({'sysroot': self.sysroot})
+         self.assertEquals(p.get_description(), "<no description available>")
+ 
+     def test_plugin_no_descrip(self):
+-        p = NamedMockPlugin({})
++        p = NamedMockPlugin({'sysroot': self.sysroot})
+         self.assertEquals(p.get_description(), "This plugin has a description.")
+ 
+     def test_set_plugin_option(self):
+-        p = MockPlugin({})
++        p = MockPlugin({'sysroot': self.sysroot})
+         p.set_option("opt", "testing")
+         self.assertEquals(p.get_option("opt"), "testing")
+ 
+     def test_set_nonexistant_plugin_option(self):
+-        p = MockPlugin({})
++        p = MockPlugin({'sysroot': self.sysroot})
+         self.assertFalse(p.set_option("badopt", "testing"))
+ 
+     def test_get_nonexistant_plugin_option(self):
+-        p = MockPlugin({})
++        p = MockPlugin({'sysroot': self.sysroot})
+         self.assertEquals(p.get_option("badopt"), 0)
+ 
+     def test_get_unset_plugin_option(self):
+-        p = MockPlugin({})
++        p = MockPlugin({'sysroot': self.sysroot})
+         self.assertEquals(p.get_option("opt"), 0)
+ 
+     def test_get_unset_plugin_option_with_default(self):
+         # this shows that even when we pass in a default to get,
+         # we'll get the option's default as set in the plugin
+         # this might not be what we really want
+-        p = MockPlugin({})
++        p = MockPlugin({'sysroot': self.sysroot})
+         self.assertEquals(p.get_option("opt", True), True)
+ 
+     def test_get_unset_plugin_option_with_default_not_none(self):
+@@ -178,20 +181,20 @@ class PluginTests(unittest.TestCase):
+         # if the plugin default is not None
+         # we'll get the option's default as set in the plugin
+         # this might not be what we really want
+-        p = MockPlugin({})
++        p = MockPlugin({'sysroot': self.sysroot})
+         self.assertEquals(p.get_option("opt2", True), False)
+ 
+     def test_get_option_as_list_plugin_option(self):
+-        p = MockPlugin({})
++        p = MockPlugin({'sysroot': self.sysroot})
+         p.set_option("opt", "one,two,three")
+         self.assertEquals(p.get_option_as_list("opt"), ['one', 'two', 'three'])
+ 
+     def test_get_option_as_list_plugin_option_default(self):
+-        p = MockPlugin({})
++        p = MockPlugin({'sysroot': self.sysroot})
+         self.assertEquals(p.get_option_as_list("opt", default=[]), [])
+ 
+     def test_get_option_as_list_plugin_option_not_list(self):
+-        p = MockPlugin({})
++        p = MockPlugin({'sysroot': self.sysroot})
+         p.set_option("opt", "testing")
+         self.assertEquals(p.get_option_as_list("opt"), ['testing'])
+ 
+@@ -205,7 +208,8 @@ class PluginTests(unittest.TestCase):
+ 
+     def test_copy_dir_forbidden_path(self):
+         p = ForbiddenMockPlugin({
+-            'cmdlineopts': MockOptions()
++            'cmdlineopts': MockOptions(),
++            'sysroot': self.sysroot
+         })
+         p.archive = MockArchive()
+         p.setup()
+@@ -219,12 +223,18 @@ class AddCopySpecTests(unittest.TestCase):
+ 
+     def setUp(self):
+         self.mp = MockPlugin({
+-            'cmdlineopts': MockOptions()
++            'cmdlineopts': MockOptions(),
++            'sysroot': os.getcwd()
+         })
+         self.mp.archive = MockArchive()
+ 
+     def assert_expect_paths(self):
+-        self.assertEquals(self.mp.copy_paths, self.expect_paths)
++        def pathmunge(path):
++            if path[0] == '/':
++                path = path[1:]
++            return os.path.join(self.mp.sysroot, path)
++        expected_paths = set(map(pathmunge, self.expect_paths))
++        self.assertEquals(self.mp.copy_paths, expected_paths)
+         
+     # add_copy_spec()
+ 
+@@ -242,6 +252,7 @@ class AddCopySpecTests(unittest.TestCase):
+     # add_copy_spec_limit()
+ 
+     def test_single_file_over_limit(self):
++        self.mp.sysroot = '/'
+         fn = create_file(2) # create 2MB file, consider a context manager
+         self.mp.add_copy_spec_limit(fn, 1)
+         content, fname = self.mp.copy_strings[0]
+@@ -252,10 +263,12 @@ class AddCopySpecTests(unittest.TestCase):
+         os.unlink(fn)
+ 
+     def test_bad_filename(self):
++        self.mp.sysroot = '/'
+         self.assertFalse(self.mp.add_copy_spec_limit('', 1))
+         self.assertFalse(self.mp.add_copy_spec_limit(None, 1))
+ 
+     def test_glob_file_over_limit(self):
++        self.mp.sysroot = '/'
+         # assume these are in /tmp
+         fn = create_file(2)
+         fn2 = create_file(2)
+@@ -271,7 +284,10 @@ class AddCopySpecTests(unittest.TestCase):
+ class CheckEnabledTests(unittest.TestCase):
+ 
+     def setUp(self):
+-        self.mp = EnablerPlugin({'policy': sos.policies.load()})
++        self.mp = EnablerPlugin({
++            'policy': sos.policies.load(),
++            'sysroot': os.getcwd()
++        })
+ 
+     def test_checks_for_file(self):
+         f = j("tail_test.txt")
+@@ -296,7 +312,8 @@ class RegexSubTests(unittest.TestCase):
+ 
+     def setUp(self):
+         self.mp = MockPlugin({
+-            'cmdlineopts': MockOptions()
++            'cmdlineopts': MockOptions(),
++            'sysroot': os.getcwd()
+         })
+         self.mp.archive = MockArchive()
+ 
+@@ -310,6 +327,8 @@ class RegexSubTests(unittest.TestCase):
+         self.assertEquals(0, replacements)
+ 
+     def test_replacements(self):
++        # test uses absolute paths
++        self.mp.sysroot = '/'
+         self.mp.add_copy_spec(j("tail_test.txt"))
+         self.mp.collect()
+         replacements = self.mp.do_file_sub(j("tail_test.txt"), r"(tail)", "foobar")
+-- 
+1.9.3
+
diff --git a/SOURCES/0054-docs-add-s-sysroot-to-sosreport.1.patch b/SOURCES/0054-docs-add-s-sysroot-to-sosreport.1.patch
new file mode 100644
index 0000000..41d86ab
--- /dev/null
+++ b/SOURCES/0054-docs-add-s-sysroot-to-sosreport.1.patch
@@ -0,0 +1,36 @@
+From b7522cd1d074e07f14a297681fec75585b0c7b86 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Sat, 24 Jan 2015 00:35:09 +0000
+Subject: [PATCH 54/93] [docs] add -s/--sysroot to sosreport.1
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ man/en/sosreport.1 | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+diff --git a/man/en/sosreport.1 b/man/en/sosreport.1
+index 1066b1d..2d7fbd8 100644
+--- a/man/en/sosreport.1
++++ b/man/en/sosreport.1
+@@ -12,6 +12,7 @@ sosreport \- Collect and package diagnostic and support data
+           [--no-report] [--config-file conf]\fR
+           [--batch] [--build] [--debug]\fR
+           [--name name] [--case-id id] [--ticket-number nr]
++          [-s|--sysroot]\fR
+           [--tmp-dir directory]\fR
+           [-p|--profile profile-name]\fR
+           [--list-profiles]\fR
+@@ -71,6 +72,10 @@ Disable HTML/XML report writing.
+ .B \--config-file CONFIG
+ Specify alternate configuration file.
+ .TP
++.B \-s, \--sysroot SYSROOT
++Specify an alternate root file system path. Useful for collecting
++reports from containers and images.
++.TP
+ .B \--tmp-dir DIRECTORY
+ Specify alternate temporary directory to copy data as well as the
+ compressed report.
+-- 
+1.9.3
+
diff --git a/SOURCES/0055-packaging-bump-release-for-build.patch b/SOURCES/0055-packaging-bump-release-for-build.patch
new file mode 100644
index 0000000..124c1d7
--- /dev/null
+++ b/SOURCES/0055-packaging-bump-release-for-build.patch
@@ -0,0 +1,109 @@
+From 91cc6bb911829b20f353e4ccdffb2efcd653bbe8 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Sat, 24 Jan 2015 01:30:04 +0000
+Subject: [PATCH 55/93] [packaging] bump release for build
+
+---
+ sos.spec | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
+ 1 file changed, 78 insertions(+), 1 deletion(-)
+
+diff --git a/sos.spec b/sos.spec
+index 4b54db4..883b4d5 100644
+--- a/sos.spec
++++ b/sos.spec
+@@ -3,7 +3,7 @@
+ Summary: A set of tools to gather troubleshooting information from a system
+ Name: sos
+ Version: 3.2
+-Release: 1%{?dist}
++Release: 16%{?dist}.atomic
+ Group: Applications/System
+ Source0: http://people.redhat.com/breeves/sos/releases/sos-%{version}.tar.gz
+ License: GPLv2+
+@@ -51,6 +51,83 @@ rm -rf ${RPM_BUILD_ROOT}
+ %config(noreplace) %{_sysconfdir}/sos.conf
+ 
+ %changelog
++* Fri Jan 23 2015 Bryn M. Reeves <bmr@redhat.com> = 3.2-16
++- [docs] add -s/--sysroot to sosreport.1
++- [plugins] prefix target paths with self.sysroot
++- [plugins] propagate sysroot to Plugin via commons
++- [sosreport] add --sysroot option
++
++* Thu Jan 22 2015 Bryn M. Reeves <bmr@redhat.com> = 3.2-15
++- [mysql] improve handling of dbuser, dbpass and MYSQL_PWD
++
++* Tue Jan 20 2015 Bryn M. Reeves <bmr@redhat.com> = 3.2-14
++- [mysql] test for boolean values in dbuser and dbpass
++
++* Mon Jan 19 2015 Bryn M. Reeves <bmr@redhat.com> = 3.2-12
++- [plugin] limit path names to PC_NAME_MAX
++- [squid] collect files from /var/log/squid
++- [sosreport] log plugin exceptions to a file
++- [ctdb] fix collection of /etc/sysconfig/ctdb
++- [sosreport] fix silent exception handling
++
++* Tue Jan 13 2015 Bryn M. Reeves <bmr@redhat.com> = 3.2-11
++- [sosreport] do not make logging calls after OSError
++- [sosreport] catch OSError exceptions in SoSReport.execute()
++- [anaconda] make useradd password regex tolerant of whitespace
++
++* Tue Dec 23 2014 Bryn M. Reeves <bmr@redhat.com> = 3.2-10
++- [mysql] fix handling of mysql.dbpass option
++
++* Wed Dec 17 2014 Bryn M. Reeves <bmr@redhat.com> = 3.2-9
++- [navicli] catch exceptions if stdin is unreadable
++- [docs] update man page for new options
++- [sosreport] make all utf-8 handling user errors=ignore
++
++* Tue Dec 09 2014 Bryn M. Reeves <bmr@redhat.com> = 3.2-8
++- [kpatch] do not attempt to collect data if kpatch is not installed
++- [archive] drop support for Zip archives
++
++* Thu Oct 30 2014 Bryn M. Reeves <bmr@redhat.com> = 3.2-7
++- [sosreport] fix archive permissions regression
++
++* Mon Oct 20 2014 Bryn M. Reeves <bmr@redhat.com> = 3.2-6
++- [tomcat] add support for tomcat7 and default log size limits
++- [mysql] obtain database password from the environment
++
++* Wed Oct 15 2014 Bryn M. Reeves <bmr@redhat.com> = 3.2-5
++- [corosync] add postprocessing for corosync-objctl output
++- [ovirt_hosted_engine] fix exception when force-enabled
++
++* Thu Oct 02 2014 Bryn M. Reeves <bmr@redhat.com> = 3.2-4
++- [yum] call rhsm-debug with --no-subscriptions
++- [powerpc] allow PowerPC plugin to run on ppc64le
++- [package] add Obsoletes for sos-plugins-openstack
++
++* Wed Oct 01 2014 Bryn M. Reeves <bmr@redhat.com> = 3.2-3
++- [pam] add pam_tally2 and faillock support
++- [postgresql] obtain db password from the environment
++- [pcp] add Performance Co-Pilot plugin
++- [nfsserver] collect /etc/exports.d
++- [sosreport] handle --compression-type correctly
++- [anaconda] redact passwords in kickstart configurations
++- [haproxy] add new plugin
++- [keepalived] add new plugin
++- [lvm2] set locking_type=0 when calling lvm commands
++- [tuned] add new plugin
++- [cgroups] collect /etc/sysconfig/cgred
++- [plugins] ensure doc text is always displayed for plugins
++- [sosreport] fix the distribution version API call
++- [docker] add new plugin
++- [openstack_*] include broken-out openstack plugins
++- [mysql] support MariaDB
++- [openstack] do not collect /var/lib/nova
++- [grub2] collect grub.cfg on UEFI systems
++- [sosreport] handle out-of-space errors gracefully
++- [firewalld] new plugin
++- [networking] collect NetworkManager status
++- [kpatch] new plugin
++- [global] update to upstream 3.2 release
++
+ * Tue Sep 30 2014 Bryn M. Reeves <bmr@redhat.com> = 3.2
+ - New upstream release
+ 
+-- 
+1.9.3
+
diff --git a/SOURCES/0056-utilities-add-chroot-support-to-sos_get_command_outp.patch b/SOURCES/0056-utilities-add-chroot-support-to-sos_get_command_outp.patch
new file mode 100644
index 0000000..a413582
--- /dev/null
+++ b/SOURCES/0056-utilities-add-chroot-support-to-sos_get_command_outp.patch
@@ -0,0 +1,99 @@
+From 3b215e5c7a79c588776ba1fe439a6cfa9faa3e0f Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Sun, 25 Jan 2015 14:20:10 +0000
+Subject: [PATCH 56/93] [utilities] add chroot support to
+ sos_get_command_output()
+
+Allow callers of sos_get_command_output() to specify a path to
+chroot into before executing command.
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/plugins/__init__.py  |  2 +-
+ sos/utilities.py         | 26 +++++++++++++++-----------
+ tests/utilities_tests.py |  5 +++++
+ 3 files changed, 21 insertions(+), 12 deletions(-)
+
+diff --git a/sos/plugins/__init__.py b/sos/plugins/__init__.py
+index 14136b4..3f8f628 100644
+--- a/sos/plugins/__init__.py
++++ b/sos/plugins/__init__.py
+@@ -493,7 +493,7 @@ class Plugin(object):
+             self._log_info("added copyspec '%s'" % copy_paths)
+ 
+     def get_command_output(self, prog, timeout=300, runat=None):
+-        result = sos_get_command_output(prog, timeout=timeout, runat=runat)
++        result = sos_get_command_output(prog, timeout=timeout, chdir=runat)
+         if result['status'] == 124:
+             self._log_warn("command '%s' timed out after %ds"
+                            % (prog, timeout))
+diff --git a/sos/utilities.py b/sos/utilities.py
+index 51909c6..cc25a8f 100644
+--- a/sos/utilities.py
++++ b/sos/utilities.py
+@@ -120,15 +120,19 @@ def is_executable(command):
+     return any(os.access(path, os.X_OK) for path in candidates)
+ 
+ 
+-def sos_get_command_output(command, timeout=300, runat=None):
+-    """Execute a command through the system shell. First checks to see if the
+-    requested command is executable. Returns (returncode, stdout, 0)"""
+-    def _child_chdir():
+-        if(runat):
+-            try:
+-                os.chdir(runat)
+-            except:
+-                self.log_error("failed to chdir to '%s'" % runat)
++def sos_get_command_output(command, timeout=300, chroot=None, chdir=None):
++    """Execute a command and return a dictionary of status and output,
++    optionally changing root or current working directory before
++    executing command.
++    """
++    # Change root or cwd for child only. Exceptions in the prexec_fn
++    # closure are caught in the parent (chroot and chdir are bound from
++    # the enclosing scope).
++    def _child_prep_fn():
++        if (chroot):
++                os.chroot(chroot)
++        if (chdir):
++                os.chdir(chdir)
+ 
+     cmd_env = os.environ
+     # ensure consistent locale for collected command output
+@@ -144,7 +148,7 @@ def sos_get_command_output(command, timeout=300, runat=None):
+     try:
+         p = Popen(args, shell=False, stdout=PIPE, stderr=STDOUT,
+                   bufsize=-1, env=cmd_env, close_fds=True,
+-                  preexec_fn=_child_chdir)
++                  preexec_fn=_child_prep_fn)
+     except OSError as e:
+         if e.errno == errno.ENOENT:
+             return {'status': 127, 'output': ""}
+@@ -184,7 +188,7 @@ def shell_out(cmd, runat=None):
+     """Shell out to an external command and return the output or the empty
+     string in case of error.
+     """
+-    return sos_get_command_output(cmd, runat=runat)['output']
++    return sos_get_command_output(cmd, chdir=runat)['output']
+ 
+ 
+ class ImporterHelper(object):
+diff --git a/tests/utilities_tests.py b/tests/utilities_tests.py
+index 60087c1..def3aed 100644
+--- a/tests/utilities_tests.py
++++ b/tests/utilities_tests.py
+@@ -68,6 +68,11 @@ class ExecutableTest(unittest.TestCase):
+         self.assertEquals(result['status'], 127)
+         self.assertEquals(result['output'], "")
+ 
++    def test_output_chdir(self):
++        result = sos_get_command_output("/usr/bin/pwd", chdir=TEST_DIR)
++        self.assertEquals(result['status'], 0)
++        self.assertEquals(result['output'].strip(), TEST_DIR)
++
+     def test_shell_out(self):
+         path = os.path.join(TEST_DIR, 'test_exe.py')
+         self.assertEquals("executed\n", shell_out(path))
+-- 
+1.9.3
+
diff --git a/SOURCES/0057-sosreport-add-chroot-option.patch b/SOURCES/0057-sosreport-add-chroot-option.patch
new file mode 100644
index 0000000..071e660
--- /dev/null
+++ b/SOURCES/0057-sosreport-add-chroot-option.patch
@@ -0,0 +1,77 @@
+From becaf70c0a5eb29982b7f7f559fc04b60ca77e99 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Sun, 25 Jan 2015 14:30:13 +0000
+Subject: [PATCH 57/93] [sosreport] add --chroot option
+
+Add a --chroot option to sosreport to control command chrooting.
+
+The option takes one of three values:
+
+  * auto   - Allow callers of the API to control chroot behaviour
+  * always - Always chroot external commands to --sysroot
+  * never  - Never chroot external commands
+
+This is a fairly low-level option and may not be exposed to the
+user in a final release; for now it will allow tests in container
+environments to control the chrooting behaviour used for a run.
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/sosreport.py         | 18 ++++++++++++++++++
+ tests/utilities_tests.py |  4 +++-
+ 2 files changed, 21 insertions(+), 1 deletion(-)
+
+diff --git a/sos/sosreport.py b/sos/sosreport.py
+index 21c12ad..0bcc026 100644
+--- a/sos/sosreport.py
++++ b/sos/sosreport.py
+@@ -525,6 +525,21 @@ class SoSOptions(object):
+         self._sysroot = value
+ 
+     @property
++    def chroot(self):
++        if self._options is not None:
++            return self._options.chroot
++        return self._chroot
++
++    @chroot.setter
++    def chroot(self, value):
++        self._check_options_initialized()
++        if value not in ["auto", "always", "never"]:
++            msg = "SoSOptions.chroot '%s' is not a valid chroot mode: "
++            msg += "('auto', 'always', 'never')"
++            raise ValueError(msg % value)
++        self._chroot = value
++
++    @property
+     def compression_type(self):
+         if self._options is not None:
+             return self._options.compression_type
+@@ -612,6 +627,9 @@ class SoSOptions(object):
+         parser.add_option("-s", "--sysroot", action="store", dest="sysroot",
+                           help="system root directory path (default='/')",
+                           default="/")
++        parser.add_option("-c", "--chroot", action="store", dest="chroot",
++                          help="chroot executed commands (default=auto)",
++                          default="auto")
+         parser.add_option("-z", "--compression-type", dest="compression_type",
+                           help="compression technology to use [auto, "
+                                "gzip, bzip2, xz] (default=auto)",
+diff --git a/tests/utilities_tests.py b/tests/utilities_tests.py
+index def3aed..ecb252a 100644
+--- a/tests/utilities_tests.py
++++ b/tests/utilities_tests.py
+@@ -69,7 +69,9 @@ class ExecutableTest(unittest.TestCase):
+         self.assertEquals(result['output'], "")
+ 
+     def test_output_chdir(self):
+-        result = sos_get_command_output("/usr/bin/pwd", chdir=TEST_DIR)
++        cmd = "/bin/bash -c 'echo $PWD'"
++        result = sos_get_command_output(cmd, chdir=TEST_DIR)
++        print(result)
+         self.assertEquals(result['status'], 0)
+         self.assertEquals(result['output'].strip(), TEST_DIR)
+ 
+-- 
+1.9.3
+
diff --git a/SOURCES/0058-plugins-implement-chroot-for-command-callouts.patch b/SOURCES/0058-plugins-implement-chroot-for-command-callouts.patch
new file mode 100644
index 0000000..4636536
--- /dev/null
+++ b/SOURCES/0058-plugins-implement-chroot-for-command-callouts.patch
@@ -0,0 +1,33 @@
+From cc4aad6e9574fcc236b485a25618c87c5b95a28e Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Sun, 25 Jan 2015 15:04:29 +0000
+Subject: [PATCH 58/93] [plugins] implement --chroot for command callouts
+
+When --chroot=always is given chroot all commands to SYSROOT.
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/plugins/__init__.py | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+diff --git a/sos/plugins/__init__.py b/sos/plugins/__init__.py
+index 3f8f628..9fa2802 100644
+--- a/sos/plugins/__init__.py
++++ b/sos/plugins/__init__.py
+@@ -493,7 +493,12 @@ class Plugin(object):
+             self._log_info("added copyspec '%s'" % copy_paths)
+ 
+     def get_command_output(self, prog, timeout=300, runat=None):
+-        result = sos_get_command_output(prog, timeout=timeout, chdir=runat)
++        if self.commons['cmdlineopts'].chroot == 'always':
++            root = self.sysroot
++        else:
++            root = None
++        result = sos_get_command_output(prog, timeout=timeout,
++                                        chroot=root, chdir=runat)
+         if result['status'] == 124:
+             self._log_warn("command '%s' timed out after %ds"
+                            % (prog, timeout))
+-- 
+1.9.3
+
diff --git a/SOURCES/0059-packaging-bump-release-for-build-sos-3.2-17.el7.atom.patch b/SOURCES/0059-packaging-bump-release-for-build-sos-3.2-17.el7.atom.patch
new file mode 100644
index 0000000..68d94cb
--- /dev/null
+++ b/SOURCES/0059-packaging-bump-release-for-build-sos-3.2-17.el7.atom.patch
@@ -0,0 +1,40 @@
+From 6fb6cb8504a595ca46d84ad4c84afcf399633e3b Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Sun, 25 Jan 2015 15:05:55 +0000
+Subject: [PATCH 59/93] [packaging] bump release for build
+ sos-3.2-17.el7.atomic
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos.spec | 8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
+
+diff --git a/sos.spec b/sos.spec
+index 883b4d5..72875fb 100644
+--- a/sos.spec
++++ b/sos.spec
+@@ -3,7 +3,7 @@
+ Summary: A set of tools to gather troubleshooting information from a system
+ Name: sos
+ Version: 3.2
+-Release: 16%{?dist}.atomic
++Release: 17%{?dist}.atomic
+ Group: Applications/System
+ Source0: http://people.redhat.com/breeves/sos/releases/sos-%{version}.tar.gz
+ License: GPLv2+
+@@ -51,6 +51,12 @@ rm -rf ${RPM_BUILD_ROOT}
+ %config(noreplace) %{_sysconfdir}/sos.conf
+ 
+ %changelog
++* Sun Jan 25 2015 Bryn M. Reeves <bmr@redhat.com> = 3.2-17
++- [plugins] implement --chroot for command callouts
++- [tests] disable test_output_chdir
++- [sosreport] add --chroot={auto,always,never} option
++- [utilities] add chroot support to sos_get_command_output
++
+ * Fri Jan 23 2015 Bryn M. Reeves <bmr@redhat.com> = 3.2-16
+ - [docs] add -s/--sysroot to sosreport.1
+ - [plugins] prefix target paths with self.sysroot
+-- 
+1.9.3
+
diff --git a/SOURCES/0060-sosreport-improve-chroot-help-text.patch b/SOURCES/0060-sosreport-improve-chroot-help-text.patch
new file mode 100644
index 0000000..664b1cc
--- /dev/null
+++ b/SOURCES/0060-sosreport-improve-chroot-help-text.patch
@@ -0,0 +1,29 @@
+From f64156966c8598ba8febdc612785e9de36ad76b7 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Sun, 25 Jan 2015 19:31:13 +0000
+Subject: [PATCH 60/93] [sosreport] improve --chroot help text
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/sosreport.py | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/sos/sosreport.py b/sos/sosreport.py
+index 0bcc026..adfddb2 100644
+--- a/sos/sosreport.py
++++ b/sos/sosreport.py
+@@ -628,8 +628,9 @@ class SoSOptions(object):
+                           help="system root directory path (default='/')",
+                           default="/")
+         parser.add_option("-c", "--chroot", action="store", dest="chroot",
+-                          help="chroot executed commands (default=auto)",
+-                          default="auto")
++                          help="chroot executed commands to SYSROOT "
++                               "[auto, always, never] (default=auto)",
++                               default="auto")
+         parser.add_option("-z", "--compression-type", dest="compression_type",
+                           help="compression technology to use [auto, "
+                                "gzip, bzip2, xz] (default=auto)",
+-- 
+1.9.3
+
diff --git a/SOURCES/0061-plugin-fix-chrooted-symlink-handling.patch b/SOURCES/0061-plugin-fix-chrooted-symlink-handling.patch
new file mode 100644
index 0000000..efa3067
--- /dev/null
+++ b/SOURCES/0061-plugin-fix-chrooted-symlink-handling.patch
@@ -0,0 +1,29 @@
+From 2a4e21f52fccea92880fc8af15fb03ec59c905b3 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Sun, 25 Jan 2015 19:32:04 +0000
+Subject: [PATCH 61/93] [plugin] fix chrooted symlink handling
+
+_copy_symlink() needs to strip_sysroot(), not join_sysroot(), on
+a link target before handing it to _do_copy_path().
+
+Signed-off-by: Bryn M. Reeves <bmr@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 9fa2802..3263eaa 100644
+--- a/sos/plugins/__init__.py
++++ b/sos/plugins/__init__.py
+@@ -285,7 +285,7 @@ class Plugin(object):
+         # to absolute paths to pass to _do_copy_path.
+         self._log_debug("normalized link target '%s' as '%s'"
+                         % (linkdest, absdest))
+-        self._do_copy_path(self.join_sysroot(absdest))
++        self._do_copy_path(self.strip_sysroot(absdest))
+ 
+         self.copied_files.append({'srcpath': srcpath,
+                                   'dstpath': dstpath,
+-- 
+1.9.3
+
diff --git a/SOURCES/0062-sosreport-check-for-valid-CHROOT-values.patch b/SOURCES/0062-sosreport-check-for-valid-CHROOT-values.patch
new file mode 100644
index 0000000..20596e1
--- /dev/null
+++ b/SOURCES/0062-sosreport-check-for-valid-CHROOT-values.patch
@@ -0,0 +1,68 @@
+From bce8614030c14c1bd39e935877374e083c360a09 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Sun, 25 Jan 2015 21:54:19 +0000
+Subject: [PATCH 62/93] [sosreport] check for valid CHROOT values
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/sosreport.py | 16 +++++++++++++---
+ 1 file changed, 13 insertions(+), 3 deletions(-)
+
+diff --git a/sos/sosreport.py b/sos/sosreport.py
+index adfddb2..1dce5f9 100644
+--- a/sos/sosreport.py
++++ b/sos/sosreport.py
+@@ -220,6 +220,10 @@ class XmlReport(object):
+         outf.close()
+ 
+ 
++# valid modes for --chroot
++chroot_modes = ["auto", "always", "never"]
++
++
+ class SoSOptions(object):
+     _list_plugins = False
+     _noplugins = []
+@@ -533,7 +537,7 @@ class SoSOptions(object):
+     @chroot.setter
+     def chroot(self, value):
+         self._check_options_initialized()
+-        if value not in ["auto", "always", "never"]:
++        if value not in chroot_modes:
+             msg = "SoSOptions.chroot '%s' is not a valid chroot mode: "
+             msg += "('auto', 'always', 'never')"
+             raise ValueError(msg % value)
+@@ -685,6 +689,14 @@ class SoSReport(object):
+         if self.opts.sysroot:
+             self.sysroot = self.opts.sysroot
+ 
++        self._setup_logging()
++
++        if self.opts.chroot not in chroot_modes:
++            self.soslog.error("invalid chroot mode: %s" % self.opts.chroot)
++            logging.shutdown()
++            self.tempfile_util.clean()
++            self._exit(1)
++
+     def print_header(self):
+         self.ui_log.info("\n%s\n" % _("sosreport (version %s)" %
+                          (__version__,)))
+@@ -1169,7 +1181,6 @@ class SoSReport(object):
+                     self.ui_log.error(" %s while setting up plugins"
+                                       % e.strerror)
+                     self.ui_log.error("")
+-                    self._exit(1)
+                 if self.raise_plugins:
+                     raise
+                 self._log_plugin_exception(plugname, "setup")
+@@ -1419,7 +1430,6 @@ class SoSReport(object):
+ 
+     def execute(self):
+         try:
+-            self._setup_logging()
+             self.policy.set_commons(self.get_commons())
+             self.print_header()
+             self.load_plugins()
+-- 
+1.9.3
+
diff --git a/SOURCES/0063-plugins-add-chroot-parameter-to-callout-APIs.patch b/SOURCES/0063-plugins-add-chroot-parameter-to-callout-APIs.patch
new file mode 100644
index 0000000..6e5020a
--- /dev/null
+++ b/SOURCES/0063-plugins-add-chroot-parameter-to-callout-APIs.patch
@@ -0,0 +1,110 @@
+From 027ad7291801301c63cd462fb54b0d999063c1b1 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Sun, 25 Jan 2015 23:03:08 +0000
+Subject: [PATCH 63/93] [plugins] add chroot parameter to callout APIs
+
+Expose sos_get_command_output()'s chroot support to plugins via
+add_cmd_output(), get_command_output(), call_ext_prog() and
+related Plugin methods.
+
+'chroot' is a boolean indicating whether the command should run
+in the chroot (True) or in the host namespace (False).
+
+Has no effect when Plugin.use_sysroot() is False.
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/plugins/__init__.py | 33 ++++++++++++++++++++-------------
+ 1 file changed, 20 insertions(+), 13 deletions(-)
+
+diff --git a/sos/plugins/__init__.py b/sos/plugins/__init__.py
+index 3263eaa..bff11be 100644
+--- a/sos/plugins/__init__.py
++++ b/sos/plugins/__init__.py
+@@ -492,8 +492,8 @@ class Plugin(object):
+             self._add_copy_paths(copy_paths)
+             self._log_info("added copyspec '%s'" % copy_paths)
+ 
+-    def get_command_output(self, prog, timeout=300, runat=None):
+-        if self.commons['cmdlineopts'].chroot == 'always':
++    def get_command_output(self, prog, timeout=300, chroot=True, runat=None):
++        if chroot or self.commons['cmdlineopts'].chroot == 'always':
+             root = self.sysroot
+         else:
+             root = None
+@@ -507,11 +507,12 @@ class Plugin(object):
+             self._log_debug("could not run '%s': command not found" % prog)
+         return result
+ 
+-    def call_ext_prog(self, prog, timeout=300, runat=None):
++    def call_ext_prog(self, prog, timeout=300, chroot=True, runat=None):
+         """Execute a command independantly of the output gathering part of
+         sosreport.
+         """
+-        return self.get_command_output(prog, timeout=timeout, runat=runat)
++        return self.get_command_output(prog, timeout=timeout,
++                                       chroot=chroot, runat=runat)
+ 
+     def check_ext_prog(self, prog):
+         """Execute a command independently of the output gathering part of
+@@ -521,15 +522,19 @@ class Plugin(object):
+         return self.call_ext_prog(prog)['status'] == 0
+ 
+     def add_cmd_output(self, cmds, suggest_filename=None,
+-                       root_symlink=None, timeout=300, runat=None):
++                       root_symlink=None, timeout=300,
++                       chroot=True, runat=None):
+         """Run a program or a list of programs and collect the output"""
+         if isinstance(cmds, six.string_types):
+             cmds = [cmds]
+         if len(cmds) > 1 and (suggest_filename or root_symlink):
+             self._log_warn("ambiguous filename or symlink for command list")
+         for cmd in cmds:
+-            cmdt = (cmd, suggest_filename, root_symlink, timeout, runat)
+-            _logstr = "packed command tuple: ('%s', '%s', '%s', %s, '%s')"
++            cmdt = (
++                cmd, suggest_filename, root_symlink, timeout, chroot, runat
++            )
++            _tuplefmt = "('%s', '%s', '%s', %s, '%s', '%s')"
++            _logstr = "packed command tuple: " + _tuplefmt
+             self._log_debug(_logstr % cmdt)
+             self.collect_cmds.append(cmdt)
+             self._log_info("added cmd output '%s'" % cmd)
+@@ -584,12 +589,13 @@ class Plugin(object):
+ 
+     def get_cmd_output_now(self, exe, suggest_filename=None,
+                            root_symlink=False, timeout=300,
+-                           runat=None):
++                           chroot=True, runat=None):
+         """Execute a command and save the output to a file for inclusion in the
+         report.
+         """
+         start = time()
+-        result = self.get_command_output(exe, timeout=timeout, runat=runat)
++        result = self.get_command_output(exe, timeout=timeout,
++                                         chroot=chroot, runat=runat)
+         # 126 means 'found but not executable'
+         if result['status'] == 126 or result['status'] == 127:
+             return None
+@@ -638,13 +644,14 @@ class Plugin(object):
+ 
+     def _collect_cmd_output(self):
+         for progs in zip(self.collect_cmds):
+-            prog, suggest_filename, root_symlink, timeout, runat = progs[0]
++            (prog, suggest_filename, root_symlink, timeout, chroot, runat
++             ) = progs[0]
+             self._log_debug("unpacked command tuple: "
+-                            + "('%s', '%s', '%s', %s, '%s')" % progs[0])
++                            + "('%s', '%s', '%s', %s, '%s', '%s')" % progs[0])
+             self._log_info("collecting output of '%s'" % prog)
+             self.get_cmd_output_now(prog, suggest_filename=suggest_filename,
+-                                    root_symlink=root_symlink,
+-                                    timeout=timeout, runat=runat)
++                                    root_symlink=root_symlink, timeout=timeout,
++                                    chroot=chroot, runat=runat)
+ 
+     def _collect_strings(self):
+         for string, file_name in self.copy_strings:
+-- 
+1.9.3
+
diff --git a/SOURCES/0064-plugin-add-tmp_in_sysroot-method.patch b/SOURCES/0064-plugin-add-tmp_in_sysroot-method.patch
new file mode 100644
index 0000000..69a6ad3
--- /dev/null
+++ b/SOURCES/0064-plugin-add-tmp_in_sysroot-method.patch
@@ -0,0 +1,35 @@
+From 307b1d6253079689102a9d92fd1af2482ee52435 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Sun, 25 Jan 2015 23:08:37 +0000
+Subject: [PATCH 64/93] [plugin] add tmp_in_sysroot() method
+
+Add a method that plugins can test to determine whether the
+archive's temporary directory is inside sysroot. This is always
+true when sysroot is '/'. When sysroot is a subdirectory of root
+the temporary directory may be inaccessible from the chroot
+namespace. Plugins can test this method to determine where to
+write output.
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/plugins/__init__.py | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/sos/plugins/__init__.py b/sos/plugins/__init__.py
+index bff11be..5df40ff 100644
+--- a/sos/plugins/__init__.py
++++ b/sos/plugins/__init__.py
+@@ -169,6 +169,10 @@ class Plugin(object):
+     def use_sysroot(self):
+         return self.sysroot != os.path.abspath(os.sep)
+ 
++    def tmp_in_sysroot(self):
++        paths = [self.sysroot, self.archive.get_tmp_dir()]
++        return os.path.commonprefix(paths) == self.sysroot
++
+     def is_installed(self, package_name):
+         '''Is the package $package_name installed?'''
+         return self.policy().pkg_by_name(package_name) is not None
+-- 
+1.9.3
+
diff --git a/SOURCES/0065-plugin-enforce-forbidden-paths-when-sysroot-is-set.patch b/SOURCES/0065-plugin-enforce-forbidden-paths-when-sysroot-is-set.patch
new file mode 100644
index 0000000..08a9d67
--- /dev/null
+++ b/SOURCES/0065-plugin-enforce-forbidden-paths-when-sysroot-is-set.patch
@@ -0,0 +1,45 @@
+From 05939f9b27de1b057573495d737f88eef4797011 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Sun, 25 Jan 2015 23:27:51 +0000
+Subject: [PATCH 65/93] [plugin] enforce forbidden paths when --sysroot is set
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/plugins/__init__.py | 10 +++++++---
+ 1 file changed, 7 insertions(+), 3 deletions(-)
+
+diff --git a/sos/plugins/__init__.py b/sos/plugins/__init__.py
+index 5df40ff..394973d 100644
+--- a/sos/plugins/__init__.py
++++ b/sos/plugins/__init__.py
+@@ -311,6 +311,8 @@ class Plugin(object):
+         return None
+ 
+     def _is_forbidden_path(self, path):
++        if self.use_sysroot():
++            path = self.join_sysroot(path)
+         return _path_in_path_list(path, self.forbidden_paths)
+ 
+     def _copy_node(self, path, st):
+@@ -373,13 +375,15 @@ class Plugin(object):
+             'symlink': "no"
+         })
+ 
+-    def add_forbidden_path(self, forbiddenPath):
++    def add_forbidden_path(self, forbidden):
+         """Specify a path to not copy, even if it's part of a copy_specs[]
+         entry.
+         """
++        if self.use_sysroot():
++            forbidden = self.join_sysroot(forbidden)
+         # Glob case handling is such that a valid non-glob is a reduced glob
+-        for filespec in glob.glob(forbiddenPath):
+-            self.forbidden_paths.append(filespec)
++        for path in glob.glob(forbidden):
++            self.forbidden_paths.append(path)
+ 
+     def get_all_options(self):
+         """return a list of all options selected"""
+-- 
+1.9.3
+
diff --git a/SOURCES/0066-cluster-handle-crm_report-with-sysroot.patch b/SOURCES/0066-cluster-handle-crm_report-with-sysroot.patch
new file mode 100644
index 0000000..6d43d11
--- /dev/null
+++ b/SOURCES/0066-cluster-handle-crm_report-with-sysroot.patch
@@ -0,0 +1,32 @@
+From 740b989dff68c8c7bbe58d685a2d925e359606ce Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Mon, 26 Jan 2015 00:00:08 +0000
+Subject: [PATCH 66/93] [cluster] handle crm_report with --sysroot
+
+Don't attempt to run crm_report in the chroot if tmp is not a
+subdirectory of sysroot.
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/plugins/cluster.py | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/sos/plugins/cluster.py b/sos/plugins/cluster.py
+index ecfaa7b..2e4ed0e 100644
+--- a/sos/plugins/cluster.py
++++ b/sos/plugins/cluster.py
+@@ -104,8 +104,9 @@ class Cluster(Plugin, RedHatPlugin):
+                     "default" % self.get_option('crm_from'))
+ 
+         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))
++        crm_cmd = 'crm_report -S -d --dest %s --from "%s"'
++        self.add_cmd_output(crm_cmd % (crm_dest, crm_from),
++                            chroot=self.tmp_in_sysroot())
+ 
+     def do_lockdump(self):
+         dlm_tool = "dlm_tool ls"
+-- 
+1.9.3
+
diff --git a/SOURCES/0067-dmraid-don-t-chroot-if-tmp-is-not-inside-sysroot.patch b/SOURCES/0067-dmraid-don-t-chroot-if-tmp-is-not-inside-sysroot.patch
new file mode 100644
index 0000000..b78cf15
--- /dev/null
+++ b/SOURCES/0067-dmraid-don-t-chroot-if-tmp-is-not-inside-sysroot.patch
@@ -0,0 +1,30 @@
+From 29cc867b49dd3cc9ec365580ae9b127e837460b6 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Mon, 26 Jan 2015 00:02:35 +0000
+Subject: [PATCH 67/93] [dmraid] don't chroot if tmp is not inside sysroot
+
+To dump metadata dmraid needs to chdir to the temporary archive
+directory. Don't attempt to chroot into sysroot if the temporary
+directory is not a subdirectory of it.
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/plugins/dmraid.py | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/sos/plugins/dmraid.py b/sos/plugins/dmraid.py
+index b7e2d0d..73cd7a1 100644
+--- a/sos/plugins/dmraid.py
++++ b/sos/plugins/dmraid.py
+@@ -39,6 +39,7 @@ class Dmraid(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
+             self.add_cmd_output("dmraid -%s" % (opt,))
+         if self.get_option("metadata"):
+             metadata_path = self.get_cmd_output_path("metadata")
+-            self.add_cmd_output("dmraid -rD", runat=metadata_path)
++            self.add_cmd_output("dmraid -rD", runat=metadata_path,
++                                chroot=self.tmp_in_sysroot())
+ 
+ # vim: et ts=4 sw=4
+-- 
+1.9.3
+
diff --git a/SOURCES/0068-foreman-don-t-chroot-if-tmp-is-not-inside-sysroot.patch b/SOURCES/0068-foreman-don-t-chroot-if-tmp-is-not-inside-sysroot.patch
new file mode 100644
index 0000000..40d3ff4
--- /dev/null
+++ b/SOURCES/0068-foreman-don-t-chroot-if-tmp-is-not-inside-sysroot.patch
@@ -0,0 +1,28 @@
+From 75936281f6b9d3ca1bdc024f8a68b3e0dc57778e Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Mon, 26 Jan 2015 00:04:15 +0000
+Subject: [PATCH 68/93] [foreman] don't chroot if tmp is not inside sysroot
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/plugins/foreman.py | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/sos/plugins/foreman.py b/sos/plugins/foreman.py
+index 896add1..dfc97e1 100644
+--- a/sos/plugins/foreman.py
++++ b/sos/plugins/foreman.py
+@@ -27,7 +27,9 @@ class Foreman(Plugin, RedHatPlugin):
+ 
+     def setup(self):
+         cmd = "foreman-debug"
++
+         path = self.get_cmd_output_path(name="foreman-debug")
+-        self.add_cmd_output("%s -q -a -d %s" % (cmd, path))
++        self.add_cmd_output("%s -q -a -d %s" % (cmd, path),
++                            chroot=self.tmp_in_sysroot())
+ 
+ # vim: et ts=4 sw=4
+-- 
+1.9.3
+
diff --git a/SOURCES/0069-libvirt-use-join_sysroot-before-calling-os.path.exis.patch b/SOURCES/0069-libvirt-use-join_sysroot-before-calling-os.path.exis.patch
new file mode 100644
index 0000000..c7a1628
--- /dev/null
+++ b/SOURCES/0069-libvirt-use-join_sysroot-before-calling-os.path.exis.patch
@@ -0,0 +1,30 @@
+From 6aefb575156919be36650c3231abf185dacf6aa8 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Mon, 26 Jan 2015 00:07:12 +0000
+Subject: [PATCH 69/93] [libvirt] use join_sysroot() before calling
+ os.path.exists
+
+The libvirt plugin tests for the presence of files. Use
+join_sysroot() to ensure the correct path is tested.
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/plugins/libvirt.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/sos/plugins/libvirt.py b/sos/plugins/libvirt.py
+index 9ff8a56..ee3d4c6 100644
+--- a/sos/plugins/libvirt.py
++++ b/sos/plugins/libvirt.py
+@@ -55,7 +55,7 @@ class Libvirt(Plugin, RedHatPlugin, UbuntuPlugin, DebianPlugin):
+         else:
+             self.add_copy_spec("/var/log/libvirt")
+ 
+-        if os.path.exists(libvirt_keytab):
++        if os.path.exists(self.join_sysroot(libvirt_keytab)):
+             self.add_cmd_output("klist -ket %s" % libvirt_keytab)
+ 
+     def postproc(self):
+-- 
+1.9.3
+
diff --git a/SOURCES/0070-logs-fix-do_regex_find_all-use-for-sysroot.patch b/SOURCES/0070-logs-fix-do_regex_find_all-use-for-sysroot.patch
new file mode 100644
index 0000000..0cb3764
--- /dev/null
+++ b/SOURCES/0070-logs-fix-do_regex_find_all-use-for-sysroot.patch
@@ -0,0 +1,46 @@
+From d9e1c2a6dafd50146958c143ff0f39237788d10a Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Mon, 26 Jan 2015 00:09:11 +0000
+Subject: [PATCH 70/93] [logs] fix do_regex_find_all() use for --sysroot
+
+The logs plugin searches syslog configuration files. When using
+--sysroot the plugin needs to use join_sysroot() to open the
+correct path.
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/plugins/logs.py | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/sos/plugins/logs.py b/sos/plugins/logs.py
+index 15ae26a..55468cb 100644
+--- a/sos/plugins/logs.py
++++ b/sos/plugins/logs.py
+@@ -37,12 +37,12 @@ class Logs(Plugin):
+         ])
+ 
+         if self.get_option('all_logs'):
+-            logs = self.do_regex_find_all("^\S+\s+(-?\/.*$)\s+",
+-                                          "/etc/syslog.conf")
++            syslog_conf = self.join_sysroot("/etc/syslog.conf")
++            logs = self.do_regex_find_all("^\S+\s+(-?\/.*$)\s+", syslog_conf)
+             if self.is_installed("rsyslog") \
+                     or os.path.exists("/etc/rsyslog.conf"):
+                 logs += self.do_regex_find_all("^\S+\s+(-?\/.*$)\s+",
+-                                               "/etc/rsyslog.conf")
++                                               rsyslog_conf)
+             for i in logs:
+                 if i.startswith("-"):
+                     i = i[1:]
+@@ -61,7 +61,7 @@ class RedHatLogs(Logs, RedHatPlugin):
+         messages = "/var/log/messages"
+         self.add_copy_spec_limit("/var/log/secure*", sizelimit=self.limit)
+         self.add_copy_spec_limit(messages + "*", sizelimit=self.limit)
+-        # collect five days worth of logs by default if the system is
++        # collect three days worth of logs by default if the system is
+         # configured to use the journal and not /var/log/messages
+         if not os.path.exists(messages) and self.is_installed("systemd"):
+             try:
+-- 
+1.9.3
+
diff --git a/SOURCES/0071-lvm2-don-t-chroot-if-tmp-is-not-inside-sysroot.patch b/SOURCES/0071-lvm2-don-t-chroot-if-tmp-is-not-inside-sysroot.patch
new file mode 100644
index 0000000..fb780fe
--- /dev/null
+++ b/SOURCES/0071-lvm2-don-t-chroot-if-tmp-is-not-inside-sysroot.patch
@@ -0,0 +1,26 @@
+From 583036ad48e5eb025fe0712eb5db31042b35e7a6 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Mon, 26 Jan 2015 00:11:15 +0000
+Subject: [PATCH 71/93] [lvm2] don't chroot if tmp is not inside sysroot
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/plugins/lvm2.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/sos/plugins/lvm2.py b/sos/plugins/lvm2.py
+index f215cfb..62ac9db 100644
+--- a/sos/plugins/lvm2.py
++++ b/sos/plugins/lvm2.py
+@@ -37,7 +37,7 @@ class Lvm2(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
+             lvmdump_opts = "-a -m"
+         cmd = lvmdump_cmd % (lvmdump_opts,
+                              self.get_cmd_output_path(name="lvmdump"))
+-        self.add_cmd_output(cmd)
++        self.add_cmd_output(cmd, chroot=self.tmp_in_sysroot())
+ 
+     def setup(self):
+         # use locking_type 0 (no locks) when running LVM2 commands,
+-- 
+1.9.3
+
diff --git a/SOURCES/0072-docs-add-chroot-to-sosreport.1.patch b/SOURCES/0072-docs-add-chroot-to-sosreport.1.patch
new file mode 100644
index 0000000..14f4919
--- /dev/null
+++ b/SOURCES/0072-docs-add-chroot-to-sosreport.1.patch
@@ -0,0 +1,39 @@
+From b376eaa4db129dbaeb75d94f4c51ca0eb075cec8 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Mon, 26 Jan 2015 00:37:32 +0000
+Subject: [PATCH 72/93] [docs] add --chroot to sosreport.1
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ man/en/sosreport.1 | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+diff --git a/man/en/sosreport.1 b/man/en/sosreport.1
+index 2d7fbd8..c2f6c1d 100644
+--- a/man/en/sosreport.1
++++ b/man/en/sosreport.1
+@@ -13,6 +13,7 @@ sosreport \- Collect and package diagnostic and support data
+           [--batch] [--build] [--debug]\fR
+           [--name name] [--case-id id] [--ticket-number nr]
+           [-s|--sysroot]\fR
++          [-c|--chroot {auto|always|never}\fR
+           [--tmp-dir directory]\fR
+           [-p|--profile profile-name]\fR
+           [--list-profiles]\fR
+@@ -76,6 +77,13 @@ Specify alternate configuration file.
+ Specify an alternate root file system path. Useful for collecting
+ reports from containers and images.
+ .TP
++.B \-c, \--chroot {auto|always|never}
++Set the chroot mode. When \--sysroot is used commands default to
++executing with SYSROOT as the root directory (unless disabled by
++a specific plugin). This can be overriden by setting \--chroot to
++"always" (alwyas chroot) or "never" (always run in the host
++namespace).
++.TP
+ .B \--tmp-dir DIRECTORY
+ Specify alternate temporary directory to copy data as well as the
+ compressed report.
+-- 
+1.9.3
+
diff --git a/SOURCES/0073-packaging-bump-release-for-build-sos-3.2-18.el7.atom.patch b/SOURCES/0073-packaging-bump-release-for-build-sos-3.2-18.el7.atom.patch
new file mode 100644
index 0000000..8da38b2
--- /dev/null
+++ b/SOURCES/0073-packaging-bump-release-for-build-sos-3.2-18.el7.atom.patch
@@ -0,0 +1,64 @@
+From 7d0ad58c772c2924d95a792f21b0cca3fa622a42 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Mon, 26 Jan 2015 10:40:51 +0000
+Subject: [PATCH 73/93] [packaging] bump release for build
+ sos-3.2-18.el7.atomic
+
+- [lvm2] don't chroot if tmp is not inside sysroot
+- [logs] fix do_regex_find_all() use for --sysroot
+- [libvirt] use join_sysroot() before calling os.path.exists
+- [foreman] don't chroot if tmp is not inside sysroot
+- [dmraid] don't chroot if tmp is not inside sysroot
+- [cluster] handle crm_report with --sysroot
+- [plugin] enforce forbidden paths when --sysroot is set
+- [plugin] add tmp_in_sysroot() method
+- [plugins] add chroot parameter to callout APIs
+- [sosreport] check for valid CHROOT values
+- [plugin] fix chrooted symlink handling
+- [sosreport] improve --chroot help text
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos.spec | 17 +++++++++++++++--
+ 1 file changed, 15 insertions(+), 2 deletions(-)
+
+diff --git a/sos.spec b/sos.spec
+index 72875fb..1a8f471 100644
+--- a/sos.spec
++++ b/sos.spec
+@@ -3,7 +3,7 @@
+ Summary: A set of tools to gather troubleshooting information from a system
+ Name: sos
+ Version: 3.2
+-Release: 17%{?dist}.atomic
++Release: 18%{?dist}.atomic
+ Group: Applications/System
+ Source0: http://people.redhat.com/breeves/sos/releases/sos-%{version}.tar.gz
+ License: GPLv2+
+@@ -51,9 +51,22 @@ rm -rf ${RPM_BUILD_ROOT}
+ %config(noreplace) %{_sysconfdir}/sos.conf
+ 
+ %changelog
++* Mon Jan 26 2015 Bryn M. Reeves <bmr@redhat.com> = 3.2-18
++- [lvm2] don't chroot if tmp is not inside sysroot
++- [logs] fix do_regex_find_all() use for --sysroot
++- [libvirt] use join_sysroot() before calling os.path.exists
++- [foreman] don't chroot if tmp is not inside sysroot
++- [dmraid] don't chroot if tmp is not inside sysroot
++- [cluster] handle crm_report with --sysroot
++- [plugin] enforce forbidden paths when --sysroot is set
++- [plugin] add tmp_in_sysroot() method
++- [plugins] add chroot parameter to callout APIs
++- [sosreport] check for valid CHROOT values
++- [plugin] fix chrooted symlink handling
++- [sosreport] improve --chroot help text
++
+ * Sun Jan 25 2015 Bryn M. Reeves <bmr@redhat.com> = 3.2-17
+ - [plugins] implement --chroot for command callouts
+-- [tests] disable test_output_chdir
+ - [sosreport] add --chroot={auto,always,never} option
+ - [utilities] add chroot support to sos_get_command_output
+ 
+-- 
+1.9.3
+
diff --git a/SOURCES/0074-plugin-handle-ELOOP-in-_copy_dir.patch b/SOURCES/0074-plugin-handle-ELOOP-in-_copy_dir.patch
new file mode 100644
index 0000000..ff0839a
--- /dev/null
+++ b/SOURCES/0074-plugin-handle-ELOOP-in-_copy_dir.patch
@@ -0,0 +1,64 @@
+From 7776566e8325a55712adc16f76e5497ae41a3df6 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Mon, 26 Jan 2015 14:57:01 +0000
+Subject: [PATCH 74/93] [plugin] handle ELOOP in _copy_dir()
+
+A problem with systemd's management of the binfmt_misc automount
+point in Atomic environments causes attempts to access this path to
+fail with ELOOP:
+
+  >>> import os
+  >>> os.listdir("/host/proc/sys/fs/binfmt_misc/")
+  Traceback (most recent call last):
+    File "<stdin>", line 1, in <module>
+  OSError: [Errno 2] No such file or directory: '/host/proc/sys/fs/binfmt_misc/'
+
+For reasons that are not yet clear this causes the entire sos
+process to immediately terminate.
+
+For now avoid the problem by enclosing the problem os.listdir in
+a try/except block that explicitly handles the one errno value
+implicated here.
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/plugins/__init__.py | 16 ++++++++++++----
+ 1 file changed, 12 insertions(+), 4 deletions(-)
+
+diff --git a/sos/plugins/__init__.py b/sos/plugins/__init__.py
+index 394973d..456bae0 100644
+--- a/sos/plugins/__init__.py
++++ b/sos/plugins/__init__.py
+@@ -27,6 +27,7 @@ import stat
+ from time import time
+ import logging
+ import fnmatch
++import errno
+ 
+ # PYCOMPAT
+ import six
+@@ -297,10 +298,17 @@ class Plugin(object):
+                                   'pointsto': linkdest})
+ 
+     def _copy_dir(self, srcpath):
+-        for afile in os.listdir(srcpath):
+-            self._log_debug("recursively adding '%s' from '%s'"
+-                            % (afile, srcpath))
+-            self._do_copy_path(os.path.join(srcpath, afile), dest=None)
++        try:
++            for afile in os.listdir(srcpath):
++                self._log_debug("recursively adding '%s' from '%s'"
++                                % (afile, srcpath))
++                self._do_copy_path(os.path.join(srcpath, afile), dest=None)
++        except OSError as e:
++            if e.errno == errno.ELOOP:
++                msg = "Too many levels of symbolic links copying"
++                self._log_error("_copy_dir: %s '%s'" % (msg, srcpath))
++                return
++            raise e
+ 
+     def _get_dest_for_srcpath(self, srcpath):
+         if self.use_sysroot():
+-- 
+1.9.3
+
diff --git a/SOURCES/0075-kubernetes-new-plugin.patch b/SOURCES/0075-kubernetes-new-plugin.patch
new file mode 100644
index 0000000..851fc9a
--- /dev/null
+++ b/SOURCES/0075-kubernetes-new-plugin.patch
@@ -0,0 +1,69 @@
+From 5cee9ce0170ce3d039a17dac935583b9ad3e42ef Mon Sep 17 00:00:00 2001
+From: Neependra Khare <nkhare@redhat.com>
+Date: Mon, 26 Jan 2015 15:04:07 +0000
+Subject: [PATCH 75/93] [kubernetes] new plugin
+
+Add a plugin for Kubernetes support.
+
+Signed-off-by: Neependra Khare <nkhare@redhat.com>
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/plugins/kubernetes.py | 46 ++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 46 insertions(+)
+ create mode 100644 sos/plugins/kubernetes.py
+
+diff --git a/sos/plugins/kubernetes.py b/sos/plugins/kubernetes.py
+new file mode 100644
+index 0000000..af3f3a6
+--- /dev/null
++++ b/sos/plugins/kubernetes.py
+@@ -0,0 +1,46 @@
++# Copyright (C) 2014 Red Hat, Inc. Neependra Khare <nkhare@redhat.com>
++# Copyright (C) 2014 Red Hat, Inc. Bryn M. Reeves <bmr@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 kubernetes(Plugin, RedHatPlugin):
++
++    """Kubernetes plugin
++    """
++
++    def setup(self):
++        self.add_copy_spec("/etc/kubernetes")
++        self.add_copy_spec("/etc/etcd")
++        self.add_copy_spec("/var/run/flannel")
++
++        # Kubernetes master info
++        self.add_cmd_output("kubectl version")
++        self.add_cmd_output("kubectl get -o json pods")
++        self.add_cmd_output("kubectl get -o json minions")
++        self.add_cmd_output("kubectl get -o json replicationController")
++        self.add_cmd_output("kubectl get -o json events")
++        self.add_cmd_output("journalctl -r -u kubelet")
++
++        # etcd
++        self.add_cmd_output("curl http://127.0.0.1:4001/version")
++        self.add_cmd_output("curl http://127.0.0.1:4001/v2/members")
++        self.add_cmd_output("curl http://127.0.0.1:4001/v2/stats/leader")
++        self.add_cmd_output("curl http://127.0.0.1:4001/v2/stats/self")
++        self.add_cmd_output("curl http://127.0.0.1:4001/v2/stats/store")
++
++
++# vim: et ts=5 sw=4
+-- 
+1.9.3
+
diff --git a/SOURCES/0076-docs-fix-documentation-of-sysroot-parameter.patch b/SOURCES/0076-docs-fix-documentation-of-sysroot-parameter.patch
new file mode 100644
index 0000000..836c92a
--- /dev/null
+++ b/SOURCES/0076-docs-fix-documentation-of-sysroot-parameter.patch
@@ -0,0 +1,26 @@
+From 0e0710c7665a06229061c8616112786b41be80ae Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Mon, 26 Jan 2015 17:32:35 +0000
+Subject: [PATCH 76/93] [docs] fix documentation of --sysroot parameter
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ man/en/sosreport.1 | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/man/en/sosreport.1 b/man/en/sosreport.1
+index c2f6c1d..ec6c4ec 100644
+--- a/man/en/sosreport.1
++++ b/man/en/sosreport.1
+@@ -12,7 +12,7 @@ sosreport \- Collect and package diagnostic and support data
+           [--no-report] [--config-file conf]\fR
+           [--batch] [--build] [--debug]\fR
+           [--name name] [--case-id id] [--ticket-number nr]
+-          [-s|--sysroot]\fR
++          [-s|--sysroot SYSROOT]\fR
+           [-c|--chroot {auto|always|never}\fR
+           [--tmp-dir directory]\fR
+           [-p|--profile profile-name]\fR
+-- 
+1.9.3
+
diff --git a/SOURCES/0077-utilities-add-chroot-support-to-shell_out.patch b/SOURCES/0077-utilities-add-chroot-support-to-shell_out.patch
new file mode 100644
index 0000000..650613d
--- /dev/null
+++ b/SOURCES/0077-utilities-add-chroot-support-to-shell_out.patch
@@ -0,0 +1,31 @@
+From 530a8004fcbc8e04ebf54897e323419ca579e727 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Mon, 26 Jan 2015 15:32:03 -0500
+Subject: [PATCH 77/93] [utilities] add chroot support to shell_out()
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/utilities.py | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/sos/utilities.py b/sos/utilities.py
+index cc25a8f..ef3e115 100644
+--- a/sos/utilities.py
++++ b/sos/utilities.py
+@@ -184,11 +184,11 @@ def import_module(module_fqname, superclasses=None):
+     return modules
+ 
+ 
+-def shell_out(cmd, runat=None):
++def shell_out(cmd, chroot=None, runat=None):
+     """Shell out to an external command and return the output or the empty
+     string in case of error.
+     """
+-    return sos_get_command_output(cmd, chdir=runat)['output']
++    return sos_get_command_output(cmd, chroot=chroot, chdir=runat)['output']
+ 
+ 
+ class ImporterHelper(object):
+-- 
+1.9.3
+
diff --git a/SOURCES/0078-policies-make-PackageManager-and-Policy-sysroot-awar.patch b/SOURCES/0078-policies-make-PackageManager-and-Policy-sysroot-awar.patch
new file mode 100644
index 0000000..c1bf727
--- /dev/null
+++ b/SOURCES/0078-policies-make-PackageManager-and-Policy-sysroot-awar.patch
@@ -0,0 +1,73 @@
+From d35b081d38fad259b1da8eae36b3baeb04c0b0ff Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Mon, 26 Jan 2015 15:33:18 -0500
+Subject: [PATCH 78/93] [policies] make PackageManager and Policy sysroot-aware
+
+Add methods to Policy to get the host root file system path and
+to test if sos is running in a container and allow Policy classes
+to pass a chroot path into the PackageManager constructor in order
+to obtain package data from the chroot.
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/policies/__init__.py | 19 +++++++++++++++++--
+ 1 file changed, 17 insertions(+), 2 deletions(-)
+
+diff --git a/sos/policies/__init__.py b/sos/policies/__init__.py
+index 9fcbd55..287fe55 100644
+--- a/sos/policies/__init__.py
++++ b/sos/policies/__init__.py
+@@ -56,11 +56,14 @@ class PackageManager(object):
+     """
+ 
+     query_command = None
++    chroot = None
+ 
+-    def __init__(self, query_command=None):
++    def __init__(self, query_command=None, chroot=None):
+         self.packages = {}
+         if query_command:
+             self.query_command = query_command
++        if chroot:
++            self.chroot = chroot
+ 
+     def all_pkgs_by_name(self, name):
+         """
+@@ -92,7 +95,8 @@ class PackageManager(object):
+                           version': 'major.minor.version'}}
+         """
+         if self.query_command:
+-            pkg_list = shell_out(self.query_command).splitlines()
++            cmd = self.query_command
++            pkg_list = shell_out(cmd, chroot=self.chroot).splitlines()
+             for pkg in pkg_list:
+                 if '|' not in pkg:
+                     continue
+@@ -144,6 +148,9 @@ No changes will be made to system configuration.
+     vendor_text = ""
+     PATH = ""
+ 
++    _in_container = False
++    _host_sysroot = '/'
++
+     def __init__(self):
+         """Subclasses that choose to override this initializer should call
+         super() to ensure that they get the required platform bits attached.
+@@ -179,6 +186,14 @@ No changes will be made to system configuration.
+         """
+         return False
+ 
++    def in_container(self):
++        """ Returns True if sos is running inside a container environment.
++        """
++        return self._in_container
++
++    def host_sysroot(self):
++        return self._host_sysroot
++
+     def dist_version(self):
+         """
+         Return the OS version
+-- 
+1.9.3
+
diff --git a/SOURCES/0079-policies-add-container-support-to-Red-Hat-policy.patch b/SOURCES/0079-policies-add-container-support-to-Red-Hat-policy.patch
new file mode 100644
index 0000000..265b18b
--- /dev/null
+++ b/SOURCES/0079-policies-add-container-support-to-Red-Hat-policy.patch
@@ -0,0 +1,75 @@
+From 127db5bea3e9409bee9bdbce30af88a42c4e1e60 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Mon, 26 Jan 2015 15:36:40 -0500
+Subject: [PATCH 79/93] [policies] add container support to Red Hat policy
+
+Check for the presence of container-specific environment variables
+and set _host_sysroot if present:
+
+  container_uuid=UUID
+  HOST=/path
+
+If both a container environment variable and HOST are present run
+the PackageManager query command in a chroot.
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/policies/redhat.py | 23 +++++++++++++++++++++--
+ 1 file changed, 21 insertions(+), 2 deletions(-)
+
+diff --git a/sos/policies/redhat.py b/sos/policies/redhat.py
+index 2219246..e85b166 100644
+--- a/sos/policies/redhat.py
++++ b/sos/policies/redhat.py
+@@ -37,13 +37,17 @@ class RedHatPolicy(LinuxPolicy):
+     vendor = "Red Hat"
+     vendor_url = "http://www.redhat.com/"
+     _tmp_dir = "/var/tmp"
++    _rpmq_cmd = 'rpm -qa --queryformat "%{NAME}|%{VERSION}\\n"'
++    _in_container = False
++    _host_sysroot = '/'
+ 
+     def __init__(self):
+         super(RedHatPolicy, self).__init__()
+         self.report_name = ""
+         self.ticket_number = ""
+-        self.package_manager = PackageManager(
+-            'rpm -qa --queryformat "%{NAME}|%{VERSION}\\n"')
++        # need to set _host_sysroot before PackageManager()
++        sysroot = self._container_init()
++        self.package_manager = PackageManager(self._rpmq_cmd, chroot=sysroot)
+         self.valid_subclasses = [RedHatPlugin]
+ 
+         # handle PATH for UsrMove
+@@ -62,6 +66,17 @@ class RedHatPolicy(LinuxPolicy):
+         Fedora, RHEL or other Red Hat distribution or False otherwise."""
+         return False
+ 
++    def _container_init(self):
++        """Check if sos is running in a container and if a host sysroot
++        has been passed in the environment.
++        """
++        if ENV_CONTAINER_UUID in os.environ:
++            self._in_container = True
++        if ENV_HOST_SYSROOT in os.environ:
++            self._host_sysroot = os.environ[ENV_HOST_SYSROOT]
++        use_sysroot = self._in_container and self._host_sysroot != '/'
++        return self._host_sysroot if use_sysroot else None
++
+     def runlevel_by_service(self, name):
+         from subprocess import Popen, PIPE
+         ret = []
+@@ -92,6 +107,10 @@ class RedHatPolicy(LinuxPolicy):
+     def get_local_name(self):
+         return self.host_name()
+ 
++# Container environment variables on Red Hat systems.
++ENV_CONTAINER_UUID = 'container_uuid'
++ENV_HOST_SYSROOT = 'HOST'
++
+ 
+ class RHELPolicy(RedHatPolicy):
+     distro = "Red Hat Enterprise Linux"
+-- 
+1.9.3
+
diff --git a/SOURCES/0080-sosreport-set-SYSROOT-by-policy.patch b/SOURCES/0080-sosreport-set-SYSROOT-by-policy.patch
new file mode 100644
index 0000000..bd1a8a6
--- /dev/null
+++ b/SOURCES/0080-sosreport-set-SYSROOT-by-policy.patch
@@ -0,0 +1,51 @@
+From bd32d57c8a946b2dc1acbdfa4ded62d6840f8e73 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Mon, 26 Jan 2015 15:39:16 -0500
+Subject: [PATCH 80/93] [sosreport] set SYSROOT by policy
+
+If --sysroot is not given on the command line and
+Policy.in_container() is True set sysroot automatically if
+Policy.get_host_sysroot() is not '/'.
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/sosreport.py | 13 ++++++++++---
+ 1 file changed, 10 insertions(+), 3 deletions(-)
+
+diff --git a/sos/sosreport.py b/sos/sosreport.py
+index 1dce5f9..90be4ca 100644
+--- a/sos/sosreport.py
++++ b/sos/sosreport.py
+@@ -630,7 +630,7 @@ class SoSOptions(object):
+                           help="Disable HTML/XML reporting", default=False)
+         parser.add_option("-s", "--sysroot", action="store", dest="sysroot",
+                           help="system root directory path (default='/')",
+-                          default="/")
++                          default=None)
+         parser.add_option("-c", "--chroot", action="store", dest="chroot",
+                           help="chroot executed commands to SYSROOT "
+                                "[auto, always, never] (default=auto)",
+@@ -685,11 +685,18 @@ class SoSReport(object):
+         self.tempfile_util = TempFileUtil(self.tmpdir)
+         self._set_directories()
+ 
++        self._setup_logging()
++
++        msg = "default"
++        host_sysroot = self.policy.host_sysroot()
+         # set alternate system root directory
+         if self.opts.sysroot:
++            msg = "cmdline"
+             self.sysroot = self.opts.sysroot
+-
+-        self._setup_logging()
++        elif self.policy.in_container() and host_sysroot != os.sep:
++            msg = "policy"
++            self.sysroot = host_sysroot
++        self.soslog.debug("set sysroot to '%s' (%s)" % (self.sysroot, msg))
+ 
+         if self.opts.chroot not in chroot_modes:
+             self.soslog.error("invalid chroot mode: %s" % self.opts.chroot)
+-- 
+1.9.3
+
diff --git a/SOURCES/0081-firewalld-work-around-command-hangs-in-container-env.patch b/SOURCES/0081-firewalld-work-around-command-hangs-in-container-env.patch
new file mode 100644
index 0000000..cf2324f
--- /dev/null
+++ b/SOURCES/0081-firewalld-work-around-command-hangs-in-container-env.patch
@@ -0,0 +1,34 @@
+From 5e5957cd3d61eb6e869b6294b2d64a5c37f19803 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Mon, 26 Jan 2015 16:14:01 -0500
+Subject: [PATCH 81/93] [firewalld] work around command hangs in container
+ environments
+
+Add a 10s timeout to firewalld-cmd execution to avoid long dbus
+timeouts in docker containers.
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/plugins/firewalld.py | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/sos/plugins/firewalld.py b/sos/plugins/firewalld.py
+index 31e8337..63fe058 100644
+--- a/sos/plugins/firewalld.py
++++ b/sos/plugins/firewalld.py
+@@ -35,9 +35,11 @@ class FirewallD(Plugin, RedHatPlugin):
+             "/etc/sysconfig/firewalld"
+         ])
+ 
++        # use a 10s timeout to workaround dbus problems in
++        # docker containers.
+         self.add_cmd_output([
+             "firewall-cmd --list-all-zones",
+             "firewall-cmd --permanent --list-all-zones"
+-        ])
++        ], timeout=10)
+ 
+ # vim: et ts=4 sw=4
+-- 
+1.9.3
+
diff --git a/SOURCES/0082-packaging-bump-release-for-build-sos-3.2-20.el7.atom.patch b/SOURCES/0082-packaging-bump-release-for-build-sos-3.2-20.el7.atom.patch
new file mode 100644
index 0000000..53d4830
--- /dev/null
+++ b/SOURCES/0082-packaging-bump-release-for-build-sos-3.2-20.el7.atom.patch
@@ -0,0 +1,48 @@
+From cfcd78208248db8f334940cd53f96a23989946ea Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Mon, 26 Jan 2015 16:16:07 -0500
+Subject: [PATCH 82/93] [packaging] bump release for build
+ sos-3.2-20.el7.atomic
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos.spec | 16 ++++++++++++++--
+ 1 file changed, 14 insertions(+), 2 deletions(-)
+
+diff --git a/sos.spec b/sos.spec
+index 1a8f471..ee73e15 100644
+--- a/sos.spec
++++ b/sos.spec
+@@ -3,7 +3,7 @@
+ Summary: A set of tools to gather troubleshooting information from a system
+ Name: sos
+ Version: 3.2
+-Release: 18%{?dist}.atomic
++Release: 20%{?dist}.atomic
+ Group: Applications/System
+ Source0: http://people.redhat.com/breeves/sos/releases/sos-%{version}.tar.gz
+ License: GPLv2+
+@@ -51,7 +51,19 @@ rm -rf ${RPM_BUILD_ROOT}
+ %config(noreplace) %{_sysconfdir}/sos.conf
+ 
+ %changelog
+-* Mon Jan 26 2015 Bryn M. Reeves <bmr@redhat.com> = 3.2-18
++* Mon Jan 26 2015 Bryn M. Reeves <bmr@redhat.com> = 3.2-20
++- [packaging] bump release for build sos-3.2-20.el7.atomic
++- [firewalld] work around command hangs in container environments
++- [sosreport] set SYSROOT by policy
++- [policies] add container support to Red Hat policy
++- [policies] make PackageManager and Policy sysroot-aware
++- [utilities] add chroot support to shell_out()
++- [packaging] bump release for build sos-3.2-19.el7.atomic
++- [docs] fix documentation of --sysroot parameter
++- [kubernetes] new plugin
++- [plugin] handle ELOOP in _copy_dir()
++- [packaging] bump release for build sos-3.2-18.el7.atomic
++- [docs] add --chroot to sosreport.1
+ - [lvm2] don't chroot if tmp is not inside sysroot
+ - [logs] fix do_regex_find_all() use for --sysroot
+ - [libvirt] use join_sysroot() before calling os.path.exists
+-- 
+1.9.3
+
diff --git a/SOURCES/0083-policies-pass-sysroot-down-to-policy-classes.patch b/SOURCES/0083-policies-pass-sysroot-down-to-policy-classes.patch
new file mode 100644
index 0000000..14325a1
--- /dev/null
+++ b/SOURCES/0083-policies-pass-sysroot-down-to-policy-classes.patch
@@ -0,0 +1,161 @@
+From d005366b2af1cc41e1db8beba25ecda953f9ad62 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Mon, 26 Jan 2015 17:13:24 -0500
+Subject: [PATCH 83/93] [policies] pass --sysroot down to policy classes
+
+Policies that don't auto-detect a container environment with a
+host file system need to pass the value of --sysroot down to the
+PackageManager class in order to obtain package details from the
+chroot environment.
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/policies/__init__.py | 11 ++++++-----
+ sos/policies/debian.py   |  4 ++--
+ sos/policies/redhat.py   | 18 +++++++++++-------
+ sos/policies/ubuntu.py   |  4 ++--
+ sos/sosreport.py         |  2 +-
+ 5 files changed, 22 insertions(+), 17 deletions(-)
+
+diff --git a/sos/policies/__init__.py b/sos/policies/__init__.py
+index 287fe55..3dd00df 100644
+--- a/sos/policies/__init__.py
++++ b/sos/policies/__init__.py
+@@ -28,7 +28,7 @@ def import_policy(name):
+         return None
+ 
+ 
+-def load(cache={}):
++def load(cache={}, sysroot=None):
+     if 'policy' in cache:
+         return cache.get('policy')
+ 
+@@ -37,7 +37,7 @@ def load(cache={}):
+     for module in helper.get_modules():
+         for policy in import_policy(module):
+             if policy.check():
+-                cache['policy'] = policy()
++                cache['policy'] = policy(sysroot=sysroot)
+ 
+     if 'policy' not in cache:
+         cache['policy'] = GenericPolicy()
+@@ -151,7 +151,7 @@ No changes will be made to system configuration.
+     _in_container = False
+     _host_sysroot = '/'
+ 
+-    def __init__(self):
++    def __init__(self, sysroot=None):
+         """Subclasses that choose to override this initializer should call
+         super() to ensure that they get the required platform bits attached.
+         super(SubClass, self).__init__(). Policies that require runtime
+@@ -163,6 +163,7 @@ No changes will be made to system configuration.
+         self.package_manager = PackageManager()
+         self._valid_subclasses = []
+         self.set_exec_path()
++        self._host_sysroot = sysroot
+ 
+     def get_valid_subclasses(self):
+         return [IndependentPlugin] + self._valid_subclasses
+@@ -366,8 +367,8 @@ class LinuxPolicy(Policy):
+     vendor = "None"
+     PATH = "/bin:/sbin:/usr/bin:/usr/sbin"
+ 
+-    def __init__(self):
+-        super(LinuxPolicy, self).__init__()
++    def __init__(self, sysroot=None):
++        super(LinuxPolicy, self).__init__(sysroot=sysroot)
+ 
+     def get_preferred_hash_algorithm(self):
+         checksum = "md5"
+diff --git a/sos/policies/debian.py b/sos/policies/debian.py
+index 564f5c6..342c7a1 100644
+--- a/sos/policies/debian.py
++++ b/sos/policies/debian.py
+@@ -16,8 +16,8 @@ class DebianPolicy(LinuxPolicy):
+     PATH = "/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games" \
+            + ":/usr/local/sbin:/usr/local/bin"
+ 
+-    def __init__(self):
+-        super(DebianPolicy, self).__init__()
++    def __init__(self, sysroot=None):
++        super(DebianPolicy, self).__init__(sysroot=sysroot)
+         self.report_name = ""
+         self.ticket_number = ""
+         self.package_manager = PackageManager(
+diff --git a/sos/policies/redhat.py b/sos/policies/redhat.py
+index e85b166..81ed8ad 100644
+--- a/sos/policies/redhat.py
++++ b/sos/policies/redhat.py
+@@ -41,12 +41,16 @@ class RedHatPolicy(LinuxPolicy):
+     _in_container = False
+     _host_sysroot = '/'
+ 
+-    def __init__(self):
+-        super(RedHatPolicy, self).__init__()
++    def __init__(self, sysroot=None):
++        super(RedHatPolicy, self).__init__(sysroot=sysroot)
+         self.report_name = ""
+         self.ticket_number = ""
+         # need to set _host_sysroot before PackageManager()
+-        sysroot = self._container_init()
++        if sysroot:
++            self._container_init()
++            self._host_sysroot = sysroot
++        else:
++            sysroot = self._container_init()
+         self.package_manager = PackageManager(self._rpmq_cmd, chroot=sysroot)
+         self.valid_subclasses = [RedHatPlugin]
+ 
+@@ -137,8 +141,8 @@ No changes will be made to system configuration.
+ %(vendor_text)s
+ """)
+ 
+-    def __init__(self):
+-        super(RHELPolicy, self).__init__()
++    def __init__(self, sysroot=None):
++        super(RHELPolicy, self).__init__(sysroot=sysroot)
+ 
+     @classmethod
+     def check(self):
+@@ -184,8 +188,8 @@ class FedoraPolicy(RedHatPolicy):
+     vendor = "the Fedora Project"
+     vendor_url = "https://fedoraproject.org/"
+ 
+-    def __init__(self):
+-        super(FedoraPolicy, self).__init__()
++    def __init__(self, sysroot=None):
++        super(FedoraPolicy, self).__init__(sysroot=sysroot)
+ 
+     @classmethod
+     def check(self):
+diff --git a/sos/policies/ubuntu.py b/sos/policies/ubuntu.py
+index 4c87eca..a3105cf 100644
+--- a/sos/policies/ubuntu.py
++++ b/sos/policies/ubuntu.py
+@@ -9,8 +9,8 @@ class UbuntuPolicy(DebianPolicy):
+     vendor = "Ubuntu"
+     vendor_url = "http://www.ubuntu.com/"
+ 
+-    def __init__(self):
+-        super(UbuntuPolicy, self).__init__()
++    def __init__(self, sysroot=None):
++        super(UbuntuPolicy, self).__init__(sysroot=sysroot)
+         self.valid_subclasses = [UbuntuPlugin, DebianPlugin]
+ 
+     @classmethod
+diff --git a/sos/sosreport.py b/sos/sosreport.py
+index 90be4ca..f0542d9 100644
+--- a/sos/sosreport.py
++++ b/sos/sosreport.py
+@@ -668,7 +668,7 @@ class SoSReport(object):
+         self._read_config()
+ 
+         try:
+-            self.policy = sos.policies.load()
++            self.policy = sos.policies.load(sysroot=self.opts.sysroot)
+         except KeyboardInterrupt:
+             self._exit(0)
+ 
+-- 
+1.9.3
+
diff --git a/SOURCES/0084-sosoptions-ensure-_sysroot-and-_chroot-are-initialis.patch b/SOURCES/0084-sosoptions-ensure-_sysroot-and-_chroot-are-initialis.patch
new file mode 100644
index 0000000..c1f60de
--- /dev/null
+++ b/SOURCES/0084-sosoptions-ensure-_sysroot-and-_chroot-are-initialis.patch
@@ -0,0 +1,55 @@
+From 93a18e629c41604ba13709b42a3e3a23c7edd593 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Tue, 27 Jan 2015 11:40:06 +0000
+Subject: [PATCH 84/93] [sosoptions] ensure '_sysroot' and '_chroot' are
+ initialised
+
+Make sure the sysroot and chroot members of the SoSOptions object
+are initialised to prevent exceptions when these are not set on
+the command line:
+
+  sosreport
+  Traceback (most recent call last):
+    File "/usr/sbin/sosreport", line 25, in <module>
+      main(sys.argv[1:])
+    File "/usr/lib/python2.7/site-packages/sos/sosreport.py", line 1490, in main
+      sos = SoSReport(args)
+    File "/usr/lib/python2.7/site-packages/sos/sosreport.py", line 673, in __init__
+      self.policy = sos.policies.load(sysroot=self.opts.sysroot)
+    File "/usr/lib/python2.7/site-packages/sos/policies/__init__.py", line 40, in load
+      cache['policy'] = policy(sysroot=sysroot)
+    File "/usr/lib/python2.7/site-packages/sos/policies/redhat.py", line 192, in __init__
+      super(FedoraPolicy, self).__init__(sysroot=sysroot)
+    File "/usr/lib/python2.7/site-packages/sos/policies/redhat.py", line 58, in __init__
+      if self.package_manager.all_pkgs()['filesystem']['version'][0] == '3':
+    File "/usr/lib/python2.7/site-packages/sos/policies/__init__.py", line 116, in all_pkgs
+      self.packages = self.get_pkg_list()
+    File "/usr/lib/python2.7/site-packages/sos/policies/__init__.py", line 99, in get_pkg_list
+      pkg_list = shell_out(cmd, chroot=self.chroot).splitlines()
+    File "/usr/lib/python2.7/site-packages/sos/utilities.py", line 191, in shell_out
+      return sos_get_command_output(cmd, chroot=chroot, chdir=runat)['output']
+    File "/usr/lib/python2.7/site-packages/sos/utilities.py", line 156, in sos_get_command_output
+      raise e
+  OSError: [Errno 1] Operation not permitted: '/'
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/sosreport.py | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/sos/sosreport.py b/sos/sosreport.py
+index f0542d9..ea8426f 100644
+--- a/sos/sosreport.py
++++ b/sos/sosreport.py
+@@ -246,6 +246,8 @@ class SoSOptions(object):
+     _config_file = ""
+     _tmp_dir = ""
+     _report = True
++    _sysroot = None
++    _chroot = 'auto'
+     _compression_type = 'auto'
+ 
+     _options = None
+-- 
+1.9.3
+
diff --git a/SOURCES/0085-etcd-split-etcd-functionality-from-kubernetes-into-n.patch b/SOURCES/0085-etcd-split-etcd-functionality-from-kubernetes-into-n.patch
new file mode 100644
index 0000000..feba433
--- /dev/null
+++ b/SOURCES/0085-etcd-split-etcd-functionality-from-kubernetes-into-n.patch
@@ -0,0 +1,84 @@
+From 1ddad7799d05346c5cf7689c0da2da6383b90d7c Mon Sep 17 00:00:00 2001
+From: Neependra Khare <nkhare@redhat.com>
+Date: Tue, 27 Jan 2015 15:54:23 +0000
+Subject: [PATCH 85/93] [etcd] split etcd functionality from kubernetes into
+ new plugin
+
+Signed-off-by: Neependra Khare <nkhare@redhat.com>
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/plugins/etcd.py       | 36 ++++++++++++++++++++++++++++++++++++
+ sos/plugins/kubernetes.py |  8 --------
+ 2 files changed, 36 insertions(+), 8 deletions(-)
+ create mode 100644 sos/plugins/etcd.py
+
+diff --git a/sos/plugins/etcd.py b/sos/plugins/etcd.py
+new file mode 100644
+index 0000000..69edca0
+--- /dev/null
++++ b/sos/plugins/etcd.py
+@@ -0,0 +1,36 @@
++# Copyright (C) 2015 Red Hat, Inc. Neependra Khare <nkhare@redhat.com>
++# Copyright (C) 2015 Red Hat, Inc. Bryn M. Reeves <bmr@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 etcd(Plugin, RedHatPlugin):
++
++    """etcd plugin
++    """
++
++    def setup(self):
++        self.add_copy_spec("/etc/etcd")
++
++        self.add_cmd_output("curl http://localhost:4001/version")
++        self.add_cmd_output("curl http://localhost:4001/v2/members")
++        self.add_cmd_output("curl http://localhost:4001/v2/stats/leader")
++        self.add_cmd_output("curl http://localhost:4001/v2/stats/self")
++        self.add_cmd_output("curl http://localhost:4001/v2/stats/store")
++        self.add_cmd_output("ls -lR /var/lib/etcd/")
++
++
++# vim: et ts=5 sw=4
+diff --git a/sos/plugins/kubernetes.py b/sos/plugins/kubernetes.py
+index af3f3a6..289d784 100644
+--- a/sos/plugins/kubernetes.py
++++ b/sos/plugins/kubernetes.py
+@@ -24,7 +24,6 @@ class kubernetes(Plugin, RedHatPlugin):
+ 
+     def setup(self):
+         self.add_copy_spec("/etc/kubernetes")
+-        self.add_copy_spec("/etc/etcd")
+         self.add_copy_spec("/var/run/flannel")
+ 
+         # Kubernetes master info
+@@ -35,12 +34,5 @@ class kubernetes(Plugin, RedHatPlugin):
+         self.add_cmd_output("kubectl get -o json events")
+         self.add_cmd_output("journalctl -r -u kubelet")
+ 
+-        # etcd
+-        self.add_cmd_output("curl http://127.0.0.1:4001/version")
+-        self.add_cmd_output("curl http://127.0.0.1:4001/v2/members")
+-        self.add_cmd_output("curl http://127.0.0.1:4001/v2/stats/leader")
+-        self.add_cmd_output("curl http://127.0.0.1:4001/v2/stats/self")
+-        self.add_cmd_output("curl http://127.0.0.1:4001/v2/stats/store")
+-
+ 
+ # vim: et ts=5 sw=4
+-- 
+1.9.3
+
diff --git a/SOURCES/0086-kubernetes-add-services-and-pod-logs-collection.patch b/SOURCES/0086-kubernetes-add-services-and-pod-logs-collection.patch
new file mode 100644
index 0000000..2644bbd
--- /dev/null
+++ b/SOURCES/0086-kubernetes-add-services-and-pod-logs-collection.patch
@@ -0,0 +1,47 @@
+From fd42f7d34c58aa66601eb9bd7aacc86556003918 Mon Sep 17 00:00:00 2001
+From: Neependra Khare <nkhare@redhat.com>
+Date: Tue, 27 Jan 2015 15:58:32 +0000
+Subject: [PATCH 86/93] [kubernetes] add services and pod logs collection
+
+Signed-off-by: Neependra Khare <nkhare@redhat.com>
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/plugins/kubernetes.py | 12 ++++++++++++
+ 1 file changed, 12 insertions(+)
+
+diff --git a/sos/plugins/kubernetes.py b/sos/plugins/kubernetes.py
+index 289d784..9c2df5e 100644
+--- a/sos/plugins/kubernetes.py
++++ b/sos/plugins/kubernetes.py
+@@ -22,6 +22,8 @@ class kubernetes(Plugin, RedHatPlugin):
+     """Kubernetes plugin
+     """
+ 
++    option_list = [("podslog", "capture logs for pods", 'slow', False)]
++
+     def setup(self):
+         self.add_copy_spec("/etc/kubernetes")
+         self.add_copy_spec("/var/run/flannel")
+@@ -30,9 +32,19 @@ class kubernetes(Plugin, RedHatPlugin):
+         self.add_cmd_output("kubectl version")
+         self.add_cmd_output("kubectl get -o json pods")
+         self.add_cmd_output("kubectl get -o json minions")
++        self.add_cmd_output("kubectl get -o json services")
+         self.add_cmd_output("kubectl get -o json replicationController")
+         self.add_cmd_output("kubectl get -o json events")
+         self.add_cmd_output("journalctl -r -u kubelet")
+ 
++        if self.get_option('podslog'):
++            result = self.get_command_output("kubectl get pods")
++            if result['status'] == 0:
++                for line in result['output'].splitlines()[1:]:
++                    pod_name = line.split(" ")[0]
++                    self.add_cmd_output([
++                        "{0} log {1}".format("kubectl", pod_name)
++                    ])
++
+ 
+ # vim: et ts=5 sw=4
+-- 
+1.9.3
+
diff --git a/SOURCES/0087-packaging-bump-release-for-build-sos-3.2-21.el7.atom.patch b/SOURCES/0087-packaging-bump-release-for-build-sos-3.2-21.el7.atom.patch
new file mode 100644
index 0000000..47e9567
--- /dev/null
+++ b/SOURCES/0087-packaging-bump-release-for-build-sos-3.2-21.el7.atom.patch
@@ -0,0 +1,40 @@
+From 2cbf558675d24a05f90bcca4c46dacf38710c110 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Tue, 27 Jan 2015 11:14:00 -0500
+Subject: [PATCH 87/93] [packaging] bump release for build
+ sos-3.2-21.el7.atomic
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos.spec | 8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
+
+diff --git a/sos.spec b/sos.spec
+index ee73e15..d037236 100644
+--- a/sos.spec
++++ b/sos.spec
+@@ -3,7 +3,7 @@
+ Summary: A set of tools to gather troubleshooting information from a system
+ Name: sos
+ Version: 3.2
+-Release: 20%{?dist}.atomic
++Release: 21%{?dist}.atomic
+ Group: Applications/System
+ Source0: http://people.redhat.com/breeves/sos/releases/sos-%{version}.tar.gz
+ License: GPLv2+
+@@ -51,6 +51,12 @@ rm -rf ${RPM_BUILD_ROOT}
+ %config(noreplace) %{_sysconfdir}/sos.conf
+ 
+ %changelog
++* Mon Jan 26 2015 Bryn M. Reeves <bmr@redhat.com> = 3.2-21
++- [kubernetes] add services and pod logs collection
++- [etcd] split etcd functionality from kubernetes into new plugin
++- [sosoptions] ensure '_sysroot' and '_chroot' are initialised
++- [policies] pass --sysroot down to policy classes
++
+ * Mon Jan 26 2015 Bryn M. Reeves <bmr@redhat.com> = 3.2-20
+ - [packaging] bump release for build sos-3.2-20.el7.atomic
+ - [firewalld] work around command hangs in container environments
+-- 
+1.9.3
+
diff --git a/SOURCES/0088-policies-redhat-automatically-set-tmp_dir-in-contain.patch b/SOURCES/0088-policies-redhat-automatically-set-tmp_dir-in-contain.patch
new file mode 100644
index 0000000..6bc8e77
--- /dev/null
+++ b/SOURCES/0088-policies-redhat-automatically-set-tmp_dir-in-contain.patch
@@ -0,0 +1,47 @@
+From 81cda098bae00968091d50596d14880a78b893fb Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Tue, 27 Jan 2015 12:54:31 -0500
+Subject: [PATCH 88/93] [policies/redhat] automatically set tmp_dir in
+ containers
+
+Now that policies have the infrastructure to detect that they
+are running in a container and to use the HOST environment
+variable if present enable automatic setting of self._tmp_dir in
+appriate container environments.
+
+This causes reports to be automatically written to $HOST/var/tmp
+when $HOST is set while still allowing users to override the tmp
+path manually by specificying --tmp-dir=PATH.
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/policies/redhat.py | 7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+diff --git a/sos/policies/redhat.py b/sos/policies/redhat.py
+index 81ed8ad..c057e6e 100644
+--- a/sos/policies/redhat.py
++++ b/sos/policies/redhat.py
+@@ -71,14 +71,17 @@ class RedHatPolicy(LinuxPolicy):
+         return False
+ 
+     def _container_init(self):
+-        """Check if sos is running in a container and if a host sysroot
+-        has been passed in the environment.
++        """Check if sos is running in a container and perform container
++        specific initialisation based on ENV_HOST_SYSROOT.
+         """
+         if ENV_CONTAINER_UUID in os.environ:
+             self._in_container = True
+         if ENV_HOST_SYSROOT in os.environ:
+             self._host_sysroot = os.environ[ENV_HOST_SYSROOT]
+         use_sysroot = self._in_container and self._host_sysroot != '/'
++        if use_sysroot:
++            host_tmp_dir = os.path.abspath(self._host_sysroot + self._tmp_dir)
++            self._tmp_dir = host_tmp_dir
+         return self._host_sysroot if use_sysroot else None
+ 
+     def runlevel_by_service(self, name):
+-- 
+1.9.3
+
diff --git a/SOURCES/0089-policies-redhat-add-Red-Hat-Atomic-Host-policy.patch b/SOURCES/0089-policies-redhat-add-Red-Hat-Atomic-Host-policy.patch
new file mode 100644
index 0000000..aee65b4
--- /dev/null
+++ b/SOURCES/0089-policies-redhat-add-Red-Hat-Atomic-Host-policy.patch
@@ -0,0 +1,79 @@
+From 99398ea80140bda152a397a3e6317eab9923751d Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Tue, 27 Jan 2015 13:53:34 -0500
+Subject: [PATCH 89/93] [policies/redhat] add Red Hat Atomic Host policy
+
+Add a new policy for the Red Hat Atomic Host.
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/policies/redhat.py | 39 ++++++++++++++++++++++++++++++++++++++-
+ 1 file changed, 38 insertions(+), 1 deletion(-)
+
+diff --git a/sos/policies/redhat.py b/sos/policies/redhat.py
+index c057e6e..b982431 100644
+--- a/sos/policies/redhat.py
++++ b/sos/policies/redhat.py
+@@ -36,6 +36,7 @@ class RedHatPolicy(LinuxPolicy):
+     distro = "Red Hat"
+     vendor = "Red Hat"
+     vendor_url = "http://www.redhat.com/"
++    _redhat_release = '/etc/redhat-release'
+     _tmp_dir = "/var/tmp"
+     _rpmq_cmd = 'rpm -qa --queryformat "%{NAME}|%{VERSION}\\n"'
+     _in_container = False
+@@ -151,7 +152,7 @@ No changes will be made to system configuration.
+     def check(self):
+         """This method checks to see if we are running on RHEL. It returns True
+         or False."""
+-        return (os.path.isfile('/etc/redhat-release')
++        return (os.path.isfile(self._redhat_release)
+                 and not os.path.isfile('/etc/fedora-release'))
+ 
+     def dist_version(self):
+@@ -185,6 +186,42 @@ No changes will be made to system configuration.
+         return self.rhn_username() or self.host_name()
+ 
+ 
++class RedHatAtomicPolicy(RHELPolicy):
++    distro = "Red Hat Atomic Host"
++    msg = _("""\
++This command will collect diagnostic and configuration \
++information from this %(distro)s system.
++
++An archive containing the collected information will be \
++generated in %(tmpdir)s and may be provided to a %(vendor)s \
++support representative.
++
++Any information provided to %(vendor)s will be treated in \
++accordance with the published support policies at:\n
++  %(vendor_url)s
++
++The generated archive may contain data considered sensitive \
++and its content should be reviewed by the originating \
++organization before being passed to any third party.
++%(vendor_text)s
++""")
++
++    @classmethod
++    def check(self):
++        atomic = False
++        if ENV_HOST_SYSROOT not in os.environ:
++            return atomic
++        host_release = os.environ[ENV_HOST_SYSROOT] + self._redhat_release
++        if not os.path.exists(host_release):
++            return False
++        try:
++            for line in open(host_release, "r").read().splitlines():
++                atomic |= 'Atomic' in line
++        except:
++            pass
++        return atomic
++
++
+ class FedoraPolicy(RedHatPolicy):
+ 
+     distro = "Fedora"
+-- 
+1.9.3
+
diff --git a/SOURCES/0090-packaging-bump-release-for-build-sos-3.2-22.el7.atom.patch b/SOURCES/0090-packaging-bump-release-for-build-sos-3.2-22.el7.atom.patch
new file mode 100644
index 0000000..2122465
--- /dev/null
+++ b/SOURCES/0090-packaging-bump-release-for-build-sos-3.2-22.el7.atom.patch
@@ -0,0 +1,40 @@
+From 917b8c884c1ba8d0c1e8c2244d771dfd64d40ca0 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Tue, 27 Jan 2015 13:56:01 -0500
+Subject: [PATCH 90/93] [packaging] bump release for build
+ sos-3.2-22.el7.atomic
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos.spec | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+diff --git a/sos.spec b/sos.spec
+index d037236..28b0836 100644
+--- a/sos.spec
++++ b/sos.spec
+@@ -3,7 +3,7 @@
+ Summary: A set of tools to gather troubleshooting information from a system
+ Name: sos
+ Version: 3.2
+-Release: 21%{?dist}.atomic
++Release: 22%{?dist}.atomic
+ Group: Applications/System
+ Source0: http://people.redhat.com/breeves/sos/releases/sos-%{version}.tar.gz
+ License: GPLv2+
+@@ -51,7 +51,11 @@ rm -rf ${RPM_BUILD_ROOT}
+ %config(noreplace) %{_sysconfdir}/sos.conf
+ 
+ %changelog
+-* Mon Jan 26 2015 Bryn M. Reeves <bmr@redhat.com> = 3.2-21
++* Mon Jan 26 2015 Bryn M. Reeves <bmr@redhat.com> = 3.2-22
++- [packaging] bump release for build sos-3.2-22.el7.atomic
++- [policies/redhat] add Red Hat Atomic Host policy
++- [policies/redhat] automatically set tmp_dir in containers
++- [packaging] bump release for build sos-3.2-21.el7.atomic
+ - [kubernetes] add services and pod logs collection
+ - [etcd] split etcd functionality from kubernetes into new plugin
+ - [sosoptions] ensure '_sysroot' and '_chroot' are initialised
+-- 
+1.9.3
+
diff --git a/SOURCES/0091-docker-add-docker-to-the-package-list-for-Red-Hat-di.patch b/SOURCES/0091-docker-add-docker-to-the-package-list-for-Red-Hat-di.patch
new file mode 100644
index 0000000..9afaf85
--- /dev/null
+++ b/SOURCES/0091-docker-add-docker-to-the-package-list-for-Red-Hat-di.patch
@@ -0,0 +1,32 @@
+From 5b4f19d344ea9da546ea2e58a3a33a188ad2c617 Mon Sep 17 00:00:00 2001
+From: Jeremy Eder <jeder@redhat.com>
+Date: Wed, 28 Jan 2015 12:54:14 +0000
+Subject: [PATCH 91/93] [docker] add 'docker' to the package list for Red Hat
+ distros
+
+The docker package is named 'docker-io' in Fedora and 'docker'
+in RHEL and other downstream products. Add the 'docker' name to
+the package list in RedHatDocker to ensure the plugin runs.
+
+Signed-off-by: Jeremy Eder <jeder@redhat.com>
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/plugins/docker.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/sos/plugins/docker.py b/sos/plugins/docker.py
+index ef4ede0..c9933b2 100644
+--- a/sos/plugins/docker.py
++++ b/sos/plugins/docker.py
+@@ -54,7 +54,7 @@ class Docker(Plugin):
+ 
+ class RedHatDocker(Docker, RedHatPlugin):
+ 
+-    packages = ('docker-io',)
++    packages = ('docker', 'docker-io')
+ 
+     def setup(self):
+         super(RedHatDocker, self).setup()
+-- 
+1.9.3
+
diff --git a/SOURCES/0092-packaging-bump-release-for-build-sos-3.2-23.el7.atom.patch b/SOURCES/0092-packaging-bump-release-for-build-sos-3.2-23.el7.atom.patch
new file mode 100644
index 0000000..2605cf8
--- /dev/null
+++ b/SOURCES/0092-packaging-bump-release-for-build-sos-3.2-23.el7.atom.patch
@@ -0,0 +1,40 @@
+From e89997aaa74e736e0ee05d6134273c0aa2582484 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Wed, 28 Jan 2015 08:29:30 -0500
+Subject: [PATCH 92/93] [packaging] bump release for build
+ sos-3.2-23.el7.atomic
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos.spec | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+diff --git a/sos.spec b/sos.spec
+index 28b0836..4559f44 100644
+--- a/sos.spec
++++ b/sos.spec
+@@ -3,7 +3,7 @@
+ Summary: A set of tools to gather troubleshooting information from a system
+ Name: sos
+ Version: 3.2
+-Release: 22%{?dist}.atomic
++Release: 23%{?dist}.atomic
+ Group: Applications/System
+ Source0: http://people.redhat.com/breeves/sos/releases/sos-%{version}.tar.gz
+ License: GPLv2+
+@@ -51,7 +51,11 @@ rm -rf ${RPM_BUILD_ROOT}
+ %config(noreplace) %{_sysconfdir}/sos.conf
+ 
+ %changelog
+-* Mon Jan 26 2015 Bryn M. Reeves <bmr@redhat.com> = 3.2-22
++* Wed Jan 28 2015 Bryn M. Reeves <bmr@redhat.com> = 3.2-23
++- [packaging] bump release for build sos-3.2-23.el7.atomic
++- [docker] add 'docker' to the package list for Red Hat distros
++
++* Tue Jan 27 2015 Bryn M. Reeves <bmr@redhat.com> = 3.2-22
+ - [packaging] bump release for build sos-3.2-22.el7.atomic
+ - [policies/redhat] add Red Hat Atomic Host policy
+ - [policies/redhat] automatically set tmp_dir in containers
+-- 
+1.9.3
+
diff --git a/SOURCES/0093-plugins-automatically-re-try-chroot-ed-commands-in-t.patch b/SOURCES/0093-plugins-automatically-re-try-chroot-ed-commands-in-t.patch
new file mode 100644
index 0000000..3d49ff8
--- /dev/null
+++ b/SOURCES/0093-plugins-automatically-re-try-chroot-ed-commands-in-t.patch
@@ -0,0 +1,66 @@
+From f9be32a0c55503a2b06bc42f5d0fd58d30a15d06 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Wed, 28 Jan 2015 22:54:48 +0000
+Subject: [PATCH 93/93] [plugins] automatically re-try chroot'ed commands in
+ the host
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/plugins/__init__.py | 12 +++++++++++-
+ sos/utilities.py        |  5 +----
+ 2 files changed, 12 insertions(+), 5 deletions(-)
+
+diff --git a/sos/plugins/__init__.py b/sos/plugins/__init__.py
+index 456bae0..29ce3b8 100644
+--- a/sos/plugins/__init__.py
++++ b/sos/plugins/__init__.py
+@@ -513,13 +513,23 @@ class Plugin(object):
+             root = self.sysroot
+         else:
+             root = None
++
+         result = sos_get_command_output(prog, timeout=timeout,
+                                         chroot=root, chdir=runat)
++
+         if result['status'] == 124:
+             self._log_warn("command '%s' timed out after %ds"
+                            % (prog, timeout))
+-        # 126 means 'found but not executable'
++
++        # command not found or not runnable
+         if result['status'] == 126 or result['status'] == 127:
++            # automatically retry chroot'ed commands in the host namespace
++            if chroot and self.commons['cmdlineopts'].chroot != 'always':
++                self._log_info("command '%s' not found in %s - "
++                               "re-trying in host root"
++                               % (prog.split()[0], root))
++                return self.get_command_output(prog, timeout=timeout,
++                                               chroot=False, runat=runat)
+             self._log_debug("could not run '%s': command not found" % prog)
+         return result
+ 
+diff --git a/sos/utilities.py b/sos/utilities.py
+index ef3e115..0781348 100644
+--- a/sos/utilities.py
++++ b/sos/utilities.py
+@@ -149,16 +149,13 @@ def sos_get_command_output(command, timeout=300, chroot=None, chdir=None):
+         p = Popen(args, shell=False, stdout=PIPE, stderr=STDOUT,
+                   bufsize=-1, env=cmd_env, close_fds=True,
+                   preexec_fn=_child_prep_fn)
++        stdout, stderr = p.communicate()
+     except OSError as e:
+         if e.errno == errno.ENOENT:
+             return {'status': 127, 'output': ""}
+         else:
+             raise e
+ 
+-    stdout, stderr = p.communicate()
+-
+-    # Required hack while we still pass shell=True to Popen; a Popen
+-    # call with shell=False for a non-existant binary will raise OSError.
+     if p.returncode == 126 or p.returncode == 127:
+         stdout = six.binary_type(b"")
+ 
+-- 
+1.9.3
+
diff --git a/SOURCES/0094-kubernetes-add-journal-output-for-kube-services.patch b/SOURCES/0094-kubernetes-add-journal-output-for-kube-services.patch
new file mode 100644
index 0000000..30ca6bc
--- /dev/null
+++ b/SOURCES/0094-kubernetes-add-journal-output-for-kube-services.patch
@@ -0,0 +1,36 @@
+From ba2e2e68ccd3381c6a79c70103577eaf54b8d88b Mon Sep 17 00:00:00 2001
+From: Neependra Khare <nkhare@redhat.com>
+Date: Thu, 29 Jan 2015 18:23:53 +0000
+Subject: [PATCH] [kubernetes] add journal output for kube services
+
+Add journalctl output for the following kubernetes units:
+
+  kube-apiserver
+  kube-controller-manager
+  kube-scheduler
+  kube-proxy
+
+Signed-off-by: Neependra Khare <nkhare@redhat.com>
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/plugins/kubernetes.py | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/sos/plugins/kubernetes.py b/sos/plugins/kubernetes.py
+index 9c2df5e..38faeb2 100644
+--- a/sos/plugins/kubernetes.py
++++ b/sos/plugins/kubernetes.py
+@@ -36,6 +36,10 @@ class kubernetes(Plugin, RedHatPlugin):
+         self.add_cmd_output("kubectl get -o json replicationController")
+         self.add_cmd_output("kubectl get -o json events")
+         self.add_cmd_output("journalctl -r -u kubelet")
++        self.add_cmd_output("journalctl -r -u kube-apiserver")
++        self.add_cmd_output("journalctl -r -u kube-controller-manager")
++        self.add_cmd_output("journalctl -r -u kube-scheduler")
++        self.add_cmd_output("journalctl -r -u kube-proxy")
+ 
+         if self.get_option('podslog'):
+             result = self.get_command_output("kubectl get pods")
+-- 
+1.9.3
+
diff --git a/SOURCES/0095-plugins-do-not-strip-sysroot-when-copying.patch b/SOURCES/0095-plugins-do-not-strip-sysroot-when-copying.patch
new file mode 100644
index 0000000..209322b
--- /dev/null
+++ b/SOURCES/0095-plugins-do-not-strip-sysroot-when-copying.patch
@@ -0,0 +1,41 @@
+From 9fb39f8a211cf3d4f528aa7875eeb599096ecf24 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Thu, 29 Jan 2015 20:30:31 +0000
+Subject: [PATCH] [plugins] do not strip SYSROOT when copying link targets
+
+The abspath() call in _copy_symlink returns a host-relative path
+(when SYSROOT is not '/'). Pass this directly to _do_copy_path()
+without stripping the SYSROOT path component.
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/plugins/__init__.py | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+diff --git a/sos/plugins/__init__.py b/sos/plugins/__init__.py
+index 29ce3b8..d8c6b69 100644
+--- a/sos/plugins/__init__.py
++++ b/sos/plugins/__init__.py
+@@ -265,7 +265,8 @@ class Plugin(object):
+         # the target stored in the original symlink
+         linkdest = os.readlink(srcpath)
+         dest = os.path.join(os.path.dirname(srcpath), linkdest)
+-        # absolute path to the link target
++        # Absolute path to the link target. If SYSROOT != '/' this path
++        # is relative to the host root file system.
+         absdest = os.path.normpath(dest)
+         # adjust the target used inside the report to always be relative
+         if os.path.isabs(linkdest):
+@@ -290,7 +291,8 @@ class Plugin(object):
+         # to absolute paths to pass to _do_copy_path.
+         self._log_debug("normalized link target '%s' as '%s'"
+                         % (linkdest, absdest))
+-        self._do_copy_path(self.strip_sysroot(absdest))
++
++        self._do_copy_path(absdest)
+ 
+         self.copied_files.append({'srcpath': srcpath,
+                                   'dstpath': dstpath,
+-- 
+1.9.3
+
diff --git a/SOURCES/0096-plugins-trim-leading-.-from-links-when-sysroot-is-se.patch b/SOURCES/0096-plugins-trim-leading-.-from-links-when-sysroot-is-se.patch
new file mode 100644
index 0000000..2fcf7c9
--- /dev/null
+++ b/SOURCES/0096-plugins-trim-leading-.-from-links-when-sysroot-is-se.patch
@@ -0,0 +1,31 @@
+From ad99dc5b2abab27a52f612c7567af5c058543622 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Thu, 29 Jan 2015 22:00:10 +0000
+Subject: [PATCH] [plugins] trim leading '../' from links when sysroot is set
+
+When SYSROOT is not '/' relative symlinks need to be trimmed to
+remove the extra leading '../' returned by
+abspath('/sysroot/...').
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/plugins/__init__.py | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/sos/plugins/__init__.py b/sos/plugins/__init__.py
+index d8c6b69..e8224e6 100644
+--- a/sos/plugins/__init__.py
++++ b/sos/plugins/__init__.py
+@@ -271,6 +271,9 @@ class Plugin(object):
+         # adjust the target used inside the report to always be relative
+         if os.path.isabs(linkdest):
+             reldest = os.path.relpath(linkdest, os.path.dirname(srcpath))
++            # trim leading /sysroot
++            if self.use_sysroot():
++                reldest = reldest[len(os.sep + os.pardir):]
+             self._log_debug("made link target '%s' relative as '%s'"
+                             % (linkdest, reldest))
+         else:
+-- 
+1.9.3
+
diff --git a/SPECS/sos.spec b/SPECS/sos.spec
new file mode 100644
index 0000000..5785ab8
--- /dev/null
+++ b/SPECS/sos.spec
@@ -0,0 +1,721 @@
+%{!?python_sitelib: %define python_sitelib %(%{__python} -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")}
+Summary: A set of tools to gather troubleshooting information from a system
+Name: sos
+Version: 3.2
+Release: 26%{?dist}atomic
+Group: Applications/System
+Source0: https://github.com/sosreport/sos/archive/%{version}/sos-%{version}.tar.gz
+License: GPLv2+
+BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-buildroot
+BuildArch: noarch
+Url: http://github.com/sosreport/sos
+BuildRequires: python-devel
+BuildRequires: gettext
+Requires: libxml2-python
+Requires: python-six
+Requires: bzip2
+Requires: xz
+Obsoletes: sos-plugins-openstack
+Patch0: 0001-utilities-invert-sense-of-six.PY2-test.patch
+Patch1: 0002-archive-invert-sense-of-six.PY2-test.patch
+Patch2: 0003-yum-call-rhsm-debug-with-no-subscriptions.patch
+Patch3: 0004-powerpc-allow-PowerPC-plugin-to-run-on-ppc64le.patch
+Patch4: 0005-Makefile-Add-debian-pkg-tarball-build.patch
+Patch5: 0006-debian-changelog-update-changelog-to-new-release.patch
+Patch6: 0007-apt-Fix-failing-apt-cache-policy-details.patch
+Patch7: 0008-debian-changelog-Fix-tab-spacing.patch
+Patch8: 0009-kpatch-do-not-try-to-read-kpatch-data-if-it-could-no.patch
+Patch9: 0010-ovirt_hosted_engine-fix-exception-when-force-enabled.patch
+Patch10: 0011-corosync-add-postprocessing-for-corosync-objctl-outp.patch
+Patch11: 0012-tomcat-add-support-for-tomcat7-and-log-size-limits.patch
+Patch12: 0013-mysql-obtain-dbpass-from-the-environment.patch
+Patch13: 0014-mysql-fix-pep8-violations.patch
+Patch14: 0015-plugin-limit-names-to-PC_NAME_MAX.patch
+Patch15: 0016-sosreport-fix-archive-permissions-regression.patch
+Patch16: 0017-maas-Fix-maas-dumpdata-command-not-found-Fixes-423.patch
+Patch17: 0018-docs-Add-prominent-link-to-user-focused-docs.patch
+Patch18: 0019-plugins-rabbitmq-Added-cluster_status-command-output.patch
+Patch19: 0020-corosync-pacemaker-Collect-corosync-cfgtool-s-output.patch
+Patch20: 0021-global-make-all-utf-8-handling-use-errors-ignore.patch
+Patch21: 0022-sosreport-disable-the-zip-compression-type.patch
+Patch22: 0023-archive-remove-ZipArchive.patch
+Patch23: 0024-archive-remove-all-references-to-ZipFileArchive.patch
+Patch24: 0025-postgresql-avoid-to-crash-with-numerical-passwords.patch
+Patch25: 0026-yum-add-subscription-manager-identity-output.patch
+Patch26: 0027-ovirt-remove-ovirt-engine-setup-answer-file-password.patch
+Patch27: 0028-ovirt-remove-password-leak-from-ovirt-engine-setup-a.patch
+Patch28: 0029-ovirt-remove-password-leak-from-engine-setup-answer-.patch
+Patch29: 0030-kimchi-add-new-plugin.patch
+Patch30: 0031-selinux-capture-process-SELinux-domains.patch
+Patch31: 0032-ovirt-remove-duplicate-code.patch
+Patch32: 0033-navicli-catch-exception-if-input-is-unreadable.patch
+Patch33: 0034-docs-update-man-page-for-new-options.patch
+Patch34: 0035-mysql-fix-command-line-dbpass-handling.patch
+Patch35: 0036-anaconda-make-useradd-password-regex-tolerant-of-whi.patch
+Patch36: 0037-sosreport-catch-OSError-exceptions-in-SoSReport.exec.patch
+Patch37: 0038-sosreport-do-not-make-logging-calls-after-OSError.patch
+Patch38: 0039-openstack_neutron-fix-legacy-component-detection-tes.patch
+Patch39: 0040-squid-collect-logs-from-var-log-squid.patch
+Patch40: 0041-squid-don-t-use-add_copy_spec_limt-for-conf-files.patch
+Patch41: 0042-ctdb-fix-RedHatPlugin-tagging-use.patch
+Patch42: 0043-sosreport-log-plugin-exceptions-to-a-file.patch
+Patch43: 0044-sosreport-fix-stray-whitespace-fix-from-previous-com.patch
+Patch44: 0045-sosreport-fix-silent-exception-handling-in-sosreport.patch
+Patch45: 0046-docker-use-splitelines-for-command-output.patch
+Patch46: 0047-networking-Enable-the-networking-on-debian-based-sys.patch
+Patch47: 0048-apport-Add-information-on-specific-crashes.patch
+Patch48: 0049-mysql-test-for-boolean-values-in-user-and-password-o.patch
+Patch49: 0050-mysql-improve-handling-of-dbuser-dbpass-and-MYSQL_PW.patch
+Patch50: 0051-sosreport-add-sysroot-option.patch
+Patch51: 0052-plugins-propagate-sysroot-to-Plugin-via-commons.patch
+Patch52: 0053-plugins-prefix-target-paths-with-self.sysroot.patch
+Patch53: 0054-docs-add-s-sysroot-to-sosreport.1.patch
+Patch54: 0055-packaging-bump-release-for-build.patch
+Patch55: 0056-utilities-add-chroot-support-to-sos_get_command_outp.patch
+Patch56: 0057-sosreport-add-chroot-option.patch
+Patch57: 0058-plugins-implement-chroot-for-command-callouts.patch
+Patch58: 0059-packaging-bump-release-for-build-sos-3.2-17.el7.atom.patch
+Patch59: 0060-sosreport-improve-chroot-help-text.patch
+Patch60: 0061-plugin-fix-chrooted-symlink-handling.patch
+Patch61: 0062-sosreport-check-for-valid-CHROOT-values.patch
+Patch62: 0063-plugins-add-chroot-parameter-to-callout-APIs.patch
+Patch63: 0064-plugin-add-tmp_in_sysroot-method.patch
+Patch64: 0065-plugin-enforce-forbidden-paths-when-sysroot-is-set.patch
+Patch65: 0066-cluster-handle-crm_report-with-sysroot.patch
+Patch66: 0067-dmraid-don-t-chroot-if-tmp-is-not-inside-sysroot.patch
+Patch67: 0068-foreman-don-t-chroot-if-tmp-is-not-inside-sysroot.patch
+Patch68: 0069-libvirt-use-join_sysroot-before-calling-os.path.exis.patch
+Patch69: 0070-logs-fix-do_regex_find_all-use-for-sysroot.patch
+Patch70: 0071-lvm2-don-t-chroot-if-tmp-is-not-inside-sysroot.patch
+Patch71: 0072-docs-add-chroot-to-sosreport.1.patch
+Patch72: 0073-packaging-bump-release-for-build-sos-3.2-18.el7.atom.patch
+Patch73: 0074-plugin-handle-ELOOP-in-_copy_dir.patch
+Patch74: 0075-kubernetes-new-plugin.patch
+Patch75: 0076-docs-fix-documentation-of-sysroot-parameter.patch
+Patch76: 0077-utilities-add-chroot-support-to-shell_out.patch
+Patch77: 0078-policies-make-PackageManager-and-Policy-sysroot-awar.patch
+Patch78: 0079-policies-add-container-support-to-Red-Hat-policy.patch
+Patch79: 0080-sosreport-set-SYSROOT-by-policy.patch
+Patch80: 0081-firewalld-work-around-command-hangs-in-container-env.patch
+Patch81: 0082-packaging-bump-release-for-build-sos-3.2-20.el7.atom.patch
+Patch82: 0083-policies-pass-sysroot-down-to-policy-classes.patch
+Patch83: 0084-sosoptions-ensure-_sysroot-and-_chroot-are-initialis.patch
+Patch84: 0085-etcd-split-etcd-functionality-from-kubernetes-into-n.patch
+Patch85: 0086-kubernetes-add-services-and-pod-logs-collection.patch
+Patch86: 0087-packaging-bump-release-for-build-sos-3.2-21.el7.atom.patch
+Patch87: 0088-policies-redhat-automatically-set-tmp_dir-in-contain.patch
+Patch88: 0089-policies-redhat-add-Red-Hat-Atomic-Host-policy.patch
+Patch89: 0090-packaging-bump-release-for-build-sos-3.2-22.el7.atom.patch
+Patch90: 0091-docker-add-docker-to-the-package-list-for-Red-Hat-di.patch
+Patch91: 0092-packaging-bump-release-for-build-sos-3.2-23.el7.atom.patch
+Patch92: 0093-plugins-automatically-re-try-chroot-ed-commands-in-t.patch
+Patch93: 0094-kubernetes-add-journal-output-for-kube-services.patch
+Patch94: 0095-plugins-do-not-strip-sysroot-when-copying.patch
+Patch95: 0096-plugins-trim-leading-.-from-links-when-sysroot-is-se.patch
+
+%description
+Sos is a set of tools that gathers information about system
+hardware and configuration. The information can then be used for
+diagnostic purposes and debugging. Sos is commonly used to help
+support technicians and developers.
+
+%prep
+%setup -qn %{name}-%{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
+%patch61 -p1
+%patch62 -p1
+%patch63 -p1
+%patch64 -p1
+%patch65 -p1
+%patch66 -p1
+%patch67 -p1
+%patch68 -p1
+%patch69 -p1
+%patch70 -p1
+%patch71 -p1
+%patch72 -p1
+%patch73 -p1
+%patch74 -p1
+%patch75 -p1
+%patch76 -p1
+%patch77 -p1
+%patch78 -p1
+%patch79 -p1
+%patch80 -p1
+%patch81 -p1
+%patch82 -p1
+%patch83 -p1
+%patch84 -p1
+%patch85 -p1
+%patch86 -p1
+%patch87 -p1
+%patch88 -p1
+%patch89 -p1
+%patch90 -p1
+%patch91 -p1
+%patch92 -p1
+%patch93 -p1
+%patch94 -p1
+%patch95 -p1
+
+%build
+make
+
+%install
+rm -rf ${RPM_BUILD_ROOT}
+make DESTDIR=${RPM_BUILD_ROOT} install
+%find_lang %{name} || echo 0
+
+%clean
+rm -rf ${RPM_BUILD_ROOT}
+
+%files -f %{name}.lang
+%defattr(-,root,root,-)
+%{_sbindir}/sosreport
+%{_datadir}/%{name}
+%{python_sitelib}/*
+%{_mandir}/man1/*
+%{_mandir}/man5/*
+%doc AUTHORS README.md LICENSE 
+%config(noreplace) %{_sysconfdir}/sos.conf
+
+%changelog
+* Thu Jan 29 2015 Bryn M. Reeves <bmr@redhat.com> = 3.2-26
+- [plugins] trim leading '../' from links when sysroot is set
+
+* Thu Jan 29 2015 Bryn M. Reeves <bmr@redhat.com> = 3.2-25
+- [plugins] do not strip SYSROOT when copying link targets
+
+* Thu Jan 29 2015 Bryn M. Reeves <bmr@redhat.com> = 3.2-24
+- [kubernetes] add journal output for kube services
+- [plugins] automatically re-try chroot'ed commands in the host
+
+* Wed Jan 28 2015 Bryn M. Reeves <bmr@redhat.com> = 3.2-23
+- [packaging] bump release for build sos-3.2-23.el7.atomic
+- [docker] add 'docker' to the package list for Red Hat distros
+
+* Tue Jan 27 2015 Bryn M. Reeves <bmr@redhat.com> = 3.2-22
+- [packaging] bump release for build sos-3.2-22.el7.atomic
+- [policies/redhat] add Red Hat Atomic Host policy
+- [policies/redhat] automatically set tmp_dir in containers
+- [packaging] bump release for build sos-3.2-21.el7.atomic
+- [kubernetes] add services and pod logs collection
+- [etcd] split etcd functionality from kubernetes into new plugin
+- [sosoptions] ensure '_sysroot' and '_chroot' are initialised
+- [policies] pass --sysroot down to policy classes
+
+* Mon Jan 26 2015 Bryn M. Reeves <bmr@redhat.com> = 3.2-20
+- [packaging] bump release for build sos-3.2-20.el7.atomic
+- [firewalld] work around command hangs in container environments
+- [sosreport] set SYSROOT by policy
+- [policies] add container support to Red Hat policy
+- [policies] make PackageManager and Policy sysroot-aware
+- [utilities] add chroot support to shell_out()
+- [packaging] bump release for build sos-3.2-19.el7.atomic
+- [docs] fix documentation of --sysroot parameter
+- [kubernetes] new plugin
+- [plugin] handle ELOOP in _copy_dir()
+- [packaging] bump release for build sos-3.2-18.el7.atomic
+- [docs] add --chroot to sosreport.1
+- [lvm2] don't chroot if tmp is not inside sysroot
+- [logs] fix do_regex_find_all() use for --sysroot
+- [libvirt] use join_sysroot() before calling os.path.exists
+- [foreman] don't chroot if tmp is not inside sysroot
+- [dmraid] don't chroot if tmp is not inside sysroot
+- [cluster] handle crm_report with --sysroot
+- [plugin] enforce forbidden paths when --sysroot is set
+- [plugin] add tmp_in_sysroot() method
+- [plugins] add chroot parameter to callout APIs
+- [sosreport] check for valid CHROOT values
+- [plugin] fix chrooted symlink handling
+- [sosreport] improve --chroot help text
+
+* Sun Jan 25 2015 Bryn M. Reeves <bmr@redhat.com> = 3.2-17
+- [plugins] implement --chroot for command callouts
+- [sosreport] add --chroot={auto,always,never} option
+- [utilities] add chroot support to sos_get_command_output
+
+* Fri Jan 23 2015 Bryn M. Reeves <bmr@redhat.com> = 3.2-16
+- [docs] add -s/--sysroot to sosreport.1
+- [plugins] prefix target paths with self.sysroot
+- [plugins] propagate sysroot to Plugin via commons
+- [sosreport] add --sysroot option
+
+* Thu Jan 22 2015 Bryn M. Reeves <bmr@redhat.com> = 3.2-15
+- [mysql] improve handling of dbuser, dbpass and MYSQL_PWD
+
+* Tue Jan 20 2015 Bryn M. Reeves <bmr@redhat.com> = 3.2-14
+- [mysql] test for boolean values in dbuser and dbpass
+
+* Mon Jan 19 2015 Bryn M. Reeves <bmr@redhat.com> = 3.2-12
+- [plugin] limit path names to PC_NAME_MAX
+- [squid] collect files from /var/log/squid
+- [sosreport] log plugin exceptions to a file
+- [ctdb] fix collection of /etc/sysconfig/ctdb
+- [sosreport] fix silent exception handling
+
+* Tue Jan 13 2015 Bryn M. Reeves <bmr@redhat.com> = 3.2-11
+- [sosreport] do not make logging calls after OSError
+- [sosreport] catch OSError exceptions in SoSReport.execute()
+- [anaconda] make useradd password regex tolerant of whitespace
+
+* Tue Dec 23 2014 Bryn M. Reeves <bmr@redhat.com> = 3.2-10
+- [mysql] fix handling of mysql.dbpass option
+
+* Wed Dec 17 2014 Bryn M. Reeves <bmr@redhat.com> = 3.2-9
+- [navicli] catch exceptions if stdin is unreadable
+- [docs] update man page for new options
+- [sosreport] make all utf-8 handling user errors=ignore
+
+* Tue Dec 09 2014 Bryn M. Reeves <bmr@redhat.com> = 3.2-8
+- [kpatch] do not attempt to collect data if kpatch is not installed
+- [archive] drop support for Zip archives
+
+* Thu Oct 30 2014 Bryn M. Reeves <bmr@redhat.com> = 3.2-7
+- [sosreport] fix archive permissions regression
+
+* Mon Oct 20 2014 Bryn M. Reeves <bmr@redhat.com> = 3.2-6
+- [tomcat] add support for tomcat7 and default log size limits
+- [mysql] obtain database password from the environment
+
+* Wed Oct 15 2014 Bryn M. Reeves <bmr@redhat.com> = 3.2-5
+- [corosync] add postprocessing for corosync-objctl output
+- [ovirt_hosted_engine] fix exception when force-enabled
+
+* Thu Oct 02 2014 Bryn M. Reeves <bmr@redhat.com> = 3.2-4
+- [yum] call rhsm-debug with --no-subscriptions
+- [powerpc] allow PowerPC plugin to run on ppc64le
+- [package] add Obsoletes for sos-plugins-openstack
+
+* Wed Oct 01 2014 Bryn M. Reeves <bmr@redhat.com> = 3.2-3
+- [pam] add pam_tally2 and faillock support
+- [postgresql] obtain db password from the environment
+- [pcp] add Performance Co-Pilot plugin
+- [nfsserver] collect /etc/exports.d
+- [sosreport] handle --compression-type correctly
+- [anaconda] redact passwords in kickstart configurations
+- [haproxy] add new plugin
+- [keepalived] add new plugin
+- [lvm2] set locking_type=0 when calling lvm commands
+- [tuned] add new plugin
+- [cgroups] collect /etc/sysconfig/cgred
+- [plugins] ensure doc text is always displayed for plugins
+- [sosreport] fix the distribution version API call
+- [docker] add new plugin
+- [openstack_*] include broken-out openstack plugins
+- [mysql] support MariaDB
+- [openstack] do not collect /var/lib/nova
+- [grub2] collect grub.cfg on UEFI systems
+- [sosreport] handle out-of-space errors gracefully
+- [firewalld] new plugin
+- [networking] collect NetworkManager status
+- [kpatch] new plugin
+- [global] update to upstream 3.2 release
+
+* Mon Sep 08 2014 Bryn M. Reeves <bmr@redhat.com> = 3.0-24
+- [foreman] add new plugin
+  Resolves: bz1130273
+
+* Thu Mar 20 2014 Bryn M. Reeves <bmr@redhat.com> = 3.0-23
+- Call rhsm-debug with the --sos switch
+  Resolves: bz1039036
+
+* Mon Mar 03 2014 Bryn M. Reeves <bmr@redhat.com> = 3.0-22
+- Fix package check in anacron plugin
+  Resolves: bz1067769
+
+* Wed Feb 12 2014 Bryn M. Reeves <bmr@redhat.com> = 3.0-21
+- Remove obsolete rhel_version() usage from yum plugin
+  Resolves: bz916705
+
+* Tue Feb 11 2014 Bryn M. Reeves <bmr@redhat.com> = 3.0-20
+- Prevent unhandled exception during command output substitution
+  Resolves: bz1030553
+
+* Mon Feb 10 2014 Bryn M. Reeves <bmr@redhat.com> = 3.0-19
+- Fix generation of volume names in gluster plugin
+  Resolves: bz1036752
+- Add distupgrade plugin
+  Resolves: bz1059760
+
+* Tue Feb 04 2014 Bryn M. Reeves <bmr@redhat.com> = 3.0-18
+- Prevent file descriptor leaks when using Popen
+  Resolves: bz1051009
+- Disable zip archive creation when running rhsm-debug
+  Resolves: bz1039036
+- Include volume geo-replication status in gluster plugin
+  Resolves: bz1036752
+
+* Mon Feb 03 2014 Bryn M. Reeves <bmr@redhat.com> = 3.0-17
+- Fix get_option use in cluster plugin
+  Resolves: bz1030553
+- Fix debug logging to file when given '-v'
+  Resolves: bz1031126
+- Always treat rhevm plugin's vdsmlogs option as a string
+  Resolves: bz1030617
+- Run the rhsm-debug script from yum plugin
+  Resolves: bz1039036
+
+* Fri Jan 31 2014 Bryn M. Reeves <bmr@redhat.com> = 3.0-16
+- Add new plugin to collect OpenHPI configuration
+  Resolves: bz1028121
+- Fix cluster plugin crm_report support
+  Resolves: bz1030553
+- Fix file postprocessing in ldap plugin
+  Resolves: bz1030602
+- Remove collection of anaconda-ks.cfg from general plugin
+  Resolves: bz1034865
+
+* Fri Jan 24 2014 Bryn M. Reeves <bmr@redhat.com> = 3.0-15
+- Remove debug statements from logs plugin
+  Resolves: bz1030042
+- Make ethernet interface detection more robust
+  Resolves: bz1030824
+- Fix specifying multiple plugin options on the command line
+  Resolves: bz1031124
+- Make log and message levels match previous versions
+  Resolves: bz1031126
+- Log a warning message when external commands time out
+  Resolves: bz1034956
+- Remove --upload command line option
+  Resolves: bz1028484
+- Update sos UI text to match upstream
+  Resolves: bz1034970
+
+* Fri Dec 27 2013 Daniel Mach <dmach@redhat.com> = 3.0-14
+- Mass rebuild 2013-12-27
+
+* Thu Nov 14 2013 Bryn M. Reeves <bmr@redhat.com> = 3.0-13
+- Fix regressions introduced with --build option
+  Resolves: bz1015599
+
+* Tue Nov 12 2013 Bryn M. Reeves <bmr@redhat.com> = 3.0-12
+- Fix typo in yum plug-in add_forbidden_paths
+  Resolves: bz829297
+- Add krb5 plug-in and drop collection of krb5.keytab
+  Resolves: bz1028150
+
+* Fri Nov  8 2013 Bryn M. Reeves <bmr@redhat.com> = 3.0-10
+- Add nfs client plug-in
+  Resolves: bz1028072
+- Fix traceback when sar module force-enabled
+  Resolves: bz1028125
+
+* Thu Nov  7 2013 Bryn M. Reeves <bmr@redhat.com> = 3.0-9
+- Restore --build command line option
+  Resolves: bz1015599
+- Collect saved vmcore-dmesg.txt files
+  Resolves: bz1026959
+- Normalize temporary directory paths
+  Resolves: bz829069
+
+* Tue Nov  5 2013 Bryn M. Reeves <bmr@redhat.com> = 3.0-7
+- Add domainname output to NIS plug-in
+  Resolves: bz1026906
+- Collect /var/log/squid in squid plug-in
+  Resolves: bz1026829
+- Collect mountstats and mountinfo in filesys plug-in
+  Resolves: bz1026869
+- Add PowerPC plug-in from upstream
+  Resolves: bz1025236
+
+* Thu Oct 31 2013 Bryn M. Reeves <bmr@redhat.com> = 3.0-6
+- Remove version checks in gluster plug-in
+  Resolves: bz1015606
+- Check for usable temporary directory
+  Resolves: bz1019517
+- Fix --alloptions command line option
+  Resolves: bz1019356
+- Fix configuration fail regression
+  Resolves: bz1019516
+
+* Wed Oct 30 2013 Bryn M. Reeves <bmr@redhat.com> = 3.0-5
+- Include /etc/yaboot.conf in boot plug-in
+  Resolves: bz1001966
+- Fix collection of brctl output in networking plug-in
+  Resolves: bz1019235
+- Verify limited set of RPM packages by default
+  Resolves: bz1019863
+- Do not strip newlines from command output
+  Resolves: bz1019338
+- Limit default sar data collection
+  Resolves: bz1001599
+
+* Thu Oct 3 2013 Bryn M. Reeves <bmr@redhat.com> = 3.0-4
+- Do not attempt to read RPC pseudo files in networking plug-in
+  Resolves: bz996992, bz996994
+- Restrict wbinfo collection to the current domain
+  Resolves: bz997101
+- Add obfuscation of luci secrets to cluster plug-in
+  Resolves: bz997090
+- Add XFS plug-in
+  Resolves: bz997094
+- Fix policy class handling of --tmp-dir
+  Resolves: bz997083
+- Do not set batch mode if stdin is not a TTY
+  Resolves: bz1002943
+- Attempt to continue when reading bad input in interactive mode
+  Resolves: bz1002943
+
+* Wed Aug 14 2013 Bryn M. Reeves <bmr@redhat.com> = 3.0-3
+- Add crm_report support to cluster plug-in
+  Resolves: bz839342
+- Fix rhel_version() usage in cluster and s390 plug-ins
+  Resolves: bz916705
+- Strip trailing newline from command output
+  Resolves: bz971420
+
+* Mon Jun 10 2013 Bryn M. Reeves <bmr@redhat.com> = 3.0-2
+- Silence 'could not run' messages at default verbosity
+- New upstream release
+
+* Thu May 23 2013 Bryn M. Reeves <bmr@redhat.com> = 2.2-39
+- Always invoke tar with '-f-' option
+
+* Mon Jan 21 2013 Bryn M. Reeves <bmr@redhat.com> = 2.2-38
+- Fix interactive mode regression when --ticket unspecified
+
+* Fri Jan 18 2013 Bryn M. Reeves <bmr@redhat.com> = 2.2-37
+- Fix propagation of --ticket parameter in interactive mode
+
+* Thu Jan 17 2013 Bryn M. Reeves <bmr@redhat.com> = 2.2-36
+- Revert OpenStack patch
+
+* Wed Jan  9 2013 Bryn M. Reeves <bmr@redhat.com> = 2.2-35
+- Report --name and --ticket values as defaults
+- Fix device-mapper command execution logging
+- Fix data collection and rename PostreSQL module to pgsql
+
+* Fri Oct 19 2012 Bryn M. Reeves <bmr@redhat.com> = 2.2-34
+- Add support for content delivery hosts to RHUI module
+
+* Thu Oct 18 2012 Bryn M. Reeves <bmr@redhat.com> = 2.2-33
+- Add Red Hat Update Infrastructure module
+- Collect /proc/iomem in hardware module
+- Collect subscription-manager output in general module
+- Collect rhsm log files in general module
+- Fix exception in gluster module on non-gluster systems
+- Fix exception in psql module when dbname is not given
+
+* Wed Oct 17 2012 Bryn M. Reeves <bmr@redhat.com> = 2.2-32
+- Collect /proc/pagetypeinfo in memory module
+- Strip trailing newline from command output
+- Add sanlock module
+- Do not collect archived accounting files in psacct module
+- Call spacewalk-debug from rhn module to collect satellite data
+
+* Mon Oct 15 2012 Bryn M. Reeves <bmr@redhat.com> = 2.2-31
+- Avoid calling volume status when collecting gluster statedumps
+- Use a default report name if --name is empty
+- Quote tilde characters passed to shell in RPM module
+- Collect KDC and named configuration in ipa module
+- Sanitize hostname characters before using as report path
+- Collect /etc/multipath in device-mapper module
+- New plug-in for PostgreSQL
+- Add OpenStack module
+- Avoid deprecated sysctls in /proc/sys/net
+- Fix error logging when calling external programs
+- Use ip instead of ifconfig to generate network interface lists
+
+* Wed May 23 2012 Bryn M. Reeves <bmr@redhat.com> = 2.2-29
+- Collect the swift configuration directory in gluster module
+- Update IPA module and related plug-ins
+
+* Fri May 18 2012 Bryn M. Reeves <bmr@redhat.com> = 2.2-28
+- Collect mcelog files in the hardware module
+
+* Wed May 02 2012 Bryn M. Reeves <bmr@redhat.com> = 2.2-27
+- Add nfs statedump collection to gluster module
+
+* Tue May 01 2012 Bryn M. Reeves <bmr@redhat.com> = 2.2-26
+- Use wildcard to match possible libvirt log paths
+
+* Mon Apr 23 2012 Bryn M. Reeves <bmr@redhat.com> = 2.2-25
+- Add forbidden paths for new location of gluster private keys
+
+* Fri Mar  9 2012 Bryn M. Reeves <bmr@redhat.com> = 2.2-24
+- Fix katello and aeolus command string syntax
+- Remove stray hunk from gluster module patch
+
+* Thu Mar  8 2012 Bryn M. Reeves <bmr@redhat.com> = 2.2-22
+- Correct aeolus debug invocation in CloudForms module
+- Update gluster module for gluster-3.3
+- Add additional command output to gluster module
+- Add support for collecting gluster configuration and logs
+
+* Wed Mar  7 2012 Bryn M. Reeves <bmr@redhat.com> = 2.2-19
+- Collect additional diagnostic information for realtime systems
+- Improve sanitization of RHN user and case number in report name
+- Fix verbose output and debug logging
+- Add basic support for CloudForms data collection
+- Add support for Subscription Asset Manager diagnostics
+
+* Tue Mar  6 2012 Bryn M. Reeves <bmr@redhat.com> = 2.2-18
+- Collect fence_virt.conf in cluster module
+- Fix collection of /proc/net directory tree
+- Gather output of cpufreq-info when present
+- Fix brctl showstp output when bridges contain multiple interfaces
+- Add /etc/modprobe.d to kernel module
+- Ensure relative symlink targets are correctly handled when copying
+- Fix satellite and proxy package detection in rhn plugin
+- Collect stderr output from external commands
+- Collect /proc/cgroups in the cgroups module
+  Resolve: bz784874
+- Collect /proc/irq in the kernel module
+- Fix installed-rpms formatting for long package names
+- Add symbolic links for truncated log files
+- Collect non-standard syslog and rsyslog log files
+- Use correct paths for tomcat6 in RHN module
+- Obscure root password if present in anacond-ks.cfg
+- Do not accept embedded forward slashes in RHN usernames
+- Add new sunrpc module to collect rpcinfo for gluster systems
+
+* Tue Nov  1 2011 Bryn M. Reeves <bmr@redhat.com> = 2.2-17
+- Do not collect subscription manager keys in general plugin
+ 
+* Fri Sep 23 2011 Bryn M. Reeves <bmr@redhat.com> = 2.2-16
+- Fix execution of RHN hardware.py from hardware plugin
+- Fix hardware plugin to support new lsusb path
+
+* Fri Sep 09 2011 Bryn M. Reeves <bmr@redhat.com> = 2.2-15
+- Fix brctl collection when a bridge contains no interfaces
+- Fix up2dateclient path in hardware plugin
+
+* Mon Aug 15 2011 Bryn M. Reeves <bmr@redhat.com> = 2.2-14
+- Collect brctl show and showstp output
+- Collect nslcd.conf in ldap plugin
+
+* Sun Aug 14 2011 Bryn M. Reeves <bmr@redhat.com> = 2.2-11
+- Truncate files that exceed specified size limit
+- Add support for collecting Red Hat Subscrition Manager configuration
+- Collect /etc/init on systems using upstart
+- Don't strip whitespace from output of external programs
+- Collect ipv6 neighbour table in network module
+- Collect basic cgroups configuration data
+
+* Sat Aug 13 2011 Bryn M. Reeves <bmr@redhat.com> = 2.2-10
+- Fix collection of data from LVM2 reporting tools in devicemapper plugin
+- Add /proc/vmmemctl collection to vmware plugin
+
+* Fri Aug 12 2011 Bryn M. Reeves <bmr@redhat.com> = 2.2-9
+- Collect yum repository list by default
+- Add basic Infiniband plugin
+- Add plugin for scsi-target-utils iSCSI target
+- Fix autofs plugin LC_ALL usage
+- Fix collection of lsusb and add collection of -t and -v outputs
+- Extend data collection by qpidd plugin
+- Add ethtool pause, coalesce and ring (-a, -c, -g) options to network plugin
+
+* Thu Apr 07 2011 Bryn M. Reeves <bmr@redhat.com> = 2.2-8
+- Use sha256 for report digest when operating in FIPS mode
+ 
+* Tue Apr 05 2011 Bryn M. Reeves <bmr@redhat.com> = 2.2-7
+- Fix parted and dumpe2fs output on s390
+
+* Fri Feb 25 2011 Bryn M. Reeves <bmr@redhat.com> = 2.2-6
+- Fix collection of chkconfig output in startup.py
+- Collect /etc/dhcp in dhcp.py plugin
+- Collect dmsetup ls --tree output in devicemapper.py
+- Collect lsblk output in filesys.py
+
+* Thu Feb 24 2011 Bryn M. Reeves <bmr@redhat.com> = 2.2-4
+- Fix collection of logs and config files in sssd.py
+- Add support for collecting entitlement certificates in rhn.py
+
+* Thu Feb 03 2011 Bryn M. Reeves <bmr@redhat.com> = 2.2-3
+- Fix cluster plugin dlm lockdump for el6
+- Add sssd plugin to collect configuration and logs
+- Collect /etc/anacrontab in system plugin
+- Correct handling of redhat-release for el6
+
+* Thu Jul 29 2010 Adam Stokes <ajs at redhat dot com> = 2.2-2
+
+* Thu Jun 10 2010 Adam Stokes <ajs at redhat dot com> = 2.2-0
+
+* Wed Apr 28 2010 Adam Stokes <ajs at redhat dot com> = 2.1-0
+
+* Mon Apr 12 2010 Adam Stokes <ajs at redhat dot com> = 2.0-0
+
+* Tue Mar 30 2010 Adam Stokes <ajs at redhat dot com> = 1.9-3
+- fix setup.py to autocompile translations and man pages
+- rebase 1.9
+
+* Fri Mar 19 2010 Adam Stokes <ajs at redhat dot com> = 1.9-2
+- updated translations
+
+* Thu Mar 04 2010 Adam Stokes <ajs at redhat dot com> = 1.9-1
+- version bump 1.9
+- replaced compression utility with xz
+- strip threading/multiprocessing
+- simplified progress indicator
+- pylint update
+- put global vars in class container
+- unittests
+- simple profiling
+- make use of xgettext as pygettext is deprecated
+
+* Mon Jan 18 2010 Adam Stokes <ajs at redhat dot com> = 1.8-21
+- more sanitizing options for log files
+- rhbz fixes from RHEL version merged into trunk
+- progressbar update
+