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" +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 +--- + 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" +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 +--- + 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" +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 +--- + 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" +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 +--- + 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 +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 +Signed-off-by: Adam Stokes +--- + 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 +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 +--- + 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 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 +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 +--- + 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 +Date: Mon, 13 Oct 2014 11:45:19 +0200 +Subject: [PATCH 08/93] [debian/changelog] Fix tab spacing + +Signed-off-by: Louis Bouchard +--- + 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 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" +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 +--- + 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" +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 +--- + 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" +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 +--- + 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" +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 +--- + 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" +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 +--- + 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" +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 +--- + 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" +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 +--- + 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" +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 +--- + 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 +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 +Signed-off-by: Adam Stokes +--- + 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 +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 +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. +--- + 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 +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 +Signed-off-by: Adam Stokes +--- + 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" +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 +--- + 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" +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 +--- + 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" +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 +--- + 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" +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 +--- + 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 +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 +Signed-off-by: Bryn M. Reeves +--- + 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 +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 +--- + 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 +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 +Signed-off-by: Bryn M. Reeves +--- + 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 +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 +Signed-off-by: Bryn M. Reeves +--- + 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 +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 +Signed-off-by: Bryn M. Reeves +--- + 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 +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 +Signed-off-by: Bryn M. Reeves +--- + 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 ++ ++# 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" +Date: Tue, 16 Dec 2014 15:28:33 +0000 +Subject: [PATCH 31/93] [selinux] capture process SELinux domains + +Signed-off-by: Bryn M. Reeves +--- + 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 +Date: Wed, 17 Dec 2014 11:41:07 +0000 +Subject: [PATCH 32/93] [ovirt] remove duplicate code + +Signed-off-by: Sandro Bonazzola +Signed-off-by: Bryn M. Reeves +--- + 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" +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 + 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 +--- + 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" +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 +--- + 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" +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 +--- + 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" +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 +--- + 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" +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 + 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 +--- + 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" +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 +--- + 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" +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 +--- + 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" +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 +--- + 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" +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 +--- + 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" +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 +--- + 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" +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 +--- + 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" +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 +--- + 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" +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 +--- + 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" +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 +--- + 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 +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 +Signed-off-by: Adam Stokes +--- + 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 + Louis Bouchard + Lukas Zapletal + Marc Sauton ++Michael Kerrin + Michele Baldessari + Navid Sheikhol-Eslami + Pierre Amadio +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 +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 +Signed-off-by: Adam Stokes +--- + 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" +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 + 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 +--- + 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" +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 +--- + 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" +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 +--- + 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" +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 +--- + 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" +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 +--- + 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(), "") + + 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" +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 +--- + 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" +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 = 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 = 3.2-15 ++- [mysql] improve handling of dbuser, dbpass and MYSQL_PWD ++ ++* Tue Jan 20 2015 Bryn M. Reeves = 3.2-14 ++- [mysql] test for boolean values in dbuser and dbpass ++ ++* Mon Jan 19 2015 Bryn M. Reeves = 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 = 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 = 3.2-10 ++- [mysql] fix handling of mysql.dbpass option ++ ++* Wed Dec 17 2014 Bryn M. Reeves = 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 = 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 = 3.2-7 ++- [sosreport] fix archive permissions regression ++ ++* Mon Oct 20 2014 Bryn M. Reeves = 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 = 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 = 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 = 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 = 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" +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 +--- + 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" +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 +--- + 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" +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 +--- + 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" +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 +--- + 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 = 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 = 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" +Date: Sun, 25 Jan 2015 19:31:13 +0000 +Subject: [PATCH 60/93] [sosreport] improve --chroot help text + +Signed-off-by: Bryn M. Reeves +--- + 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" +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 +--- + 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" +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 +--- + 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" +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 +--- + 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" +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 +--- + 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" +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 +--- + 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" +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 +--- + 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" +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 +--- + 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" +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 +--- + 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" +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 +--- + 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" +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 +--- + 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" +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 +--- + 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" +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 +--- + 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" +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 +--- + 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 = 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 = 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" +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 "", line 1, in + 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 +--- + 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 +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 +Signed-off-by: Bryn M. Reeves +--- + 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 ++# Copyright (C) 2014 Red Hat, Inc. Bryn M. Reeves ++# 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" +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 +--- + 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" +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 +--- + 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" +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 +--- + 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" +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 +--- + 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" +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 +--- + 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" +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 +--- + 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" +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 +--- + 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 = 3.2-18 ++* Mon Jan 26 2015 Bryn M. Reeves = 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" +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 +--- + 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" +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 + 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 +--- + 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 +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 +Signed-off-by: Bryn M. Reeves +--- + 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 ++# Copyright (C) 2015 Red Hat, Inc. Bryn M. Reeves ++# 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 +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 +Signed-off-by: Bryn M. Reeves +--- + 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" +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 +--- + 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 = 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 = 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" +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 +--- + 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" +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 +--- + 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" +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 +--- + 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 = 3.2-21 ++* Mon Jan 26 2015 Bryn M. Reeves = 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 +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 +Signed-off-by: Bryn M. Reeves +--- + 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" +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 +--- + 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 = 3.2-22 ++* Wed Jan 28 2015 Bryn M. Reeves = 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 = 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" +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 +--- + 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 +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 +Signed-off-by: Bryn M. Reeves +--- + 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" +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 +--- + 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" +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 +--- + 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 = 3.2-26 +- [plugins] trim leading '../' from links when sysroot is set + +* Thu Jan 29 2015 Bryn M. Reeves = 3.2-25 +- [plugins] do not strip SYSROOT when copying link targets + +* Thu Jan 29 2015 Bryn M. Reeves = 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 = 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 = 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 = 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 = 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 = 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 = 3.2-15 +- [mysql] improve handling of dbuser, dbpass and MYSQL_PWD + +* Tue Jan 20 2015 Bryn M. Reeves = 3.2-14 +- [mysql] test for boolean values in dbuser and dbpass + +* Mon Jan 19 2015 Bryn M. Reeves = 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 = 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 = 3.2-10 +- [mysql] fix handling of mysql.dbpass option + +* Wed Dec 17 2014 Bryn M. Reeves = 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 = 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 = 3.2-7 +- [sosreport] fix archive permissions regression + +* Mon Oct 20 2014 Bryn M. Reeves = 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 = 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 = 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 = 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 = 3.0-24 +- [foreman] add new plugin + Resolves: bz1130273 + +* Thu Mar 20 2014 Bryn M. Reeves = 3.0-23 +- Call rhsm-debug with the --sos switch + Resolves: bz1039036 + +* Mon Mar 03 2014 Bryn M. Reeves = 3.0-22 +- Fix package check in anacron plugin + Resolves: bz1067769 + +* Wed Feb 12 2014 Bryn M. Reeves = 3.0-21 +- Remove obsolete rhel_version() usage from yum plugin + Resolves: bz916705 + +* Tue Feb 11 2014 Bryn M. Reeves = 3.0-20 +- Prevent unhandled exception during command output substitution + Resolves: bz1030553 + +* Mon Feb 10 2014 Bryn M. Reeves = 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 = 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 = 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 = 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 = 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 = 3.0-14 +- Mass rebuild 2013-12-27 + +* Thu Nov 14 2013 Bryn M. Reeves = 3.0-13 +- Fix regressions introduced with --build option + Resolves: bz1015599 + +* Tue Nov 12 2013 Bryn M. Reeves = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 3.0-2 +- Silence 'could not run' messages at default verbosity +- New upstream release + +* Thu May 23 2013 Bryn M. Reeves = 2.2-39 +- Always invoke tar with '-f-' option + +* Mon Jan 21 2013 Bryn M. Reeves = 2.2-38 +- Fix interactive mode regression when --ticket unspecified + +* Fri Jan 18 2013 Bryn M. Reeves = 2.2-37 +- Fix propagation of --ticket parameter in interactive mode + +* Thu Jan 17 2013 Bryn M. Reeves = 2.2-36 +- Revert OpenStack patch + +* Wed Jan 9 2013 Bryn M. Reeves = 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 = 2.2-34 +- Add support for content delivery hosts to RHUI module + +* Thu Oct 18 2012 Bryn M. Reeves = 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 = 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 = 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 = 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 = 2.2-28 +- Collect mcelog files in the hardware module + +* Wed May 02 2012 Bryn M. Reeves = 2.2-27 +- Add nfs statedump collection to gluster module + +* Tue May 01 2012 Bryn M. Reeves = 2.2-26 +- Use wildcard to match possible libvirt log paths + +* Mon Apr 23 2012 Bryn M. Reeves = 2.2-25 +- Add forbidden paths for new location of gluster private keys + +* Fri Mar 9 2012 Bryn M. Reeves = 2.2-24 +- Fix katello and aeolus command string syntax +- Remove stray hunk from gluster module patch + +* Thu Mar 8 2012 Bryn M. Reeves = 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 = 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 = 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 = 2.2-17 +- Do not collect subscription manager keys in general plugin + +* Fri Sep 23 2011 Bryn M. Reeves = 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 = 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 = 2.2-14 +- Collect brctl show and showstp output +- Collect nslcd.conf in ldap plugin + +* Sun Aug 14 2011 Bryn M. Reeves = 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 = 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 = 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 = 2.2-8 +- Use sha256 for report digest when operating in FIPS mode + +* Tue Apr 05 2011 Bryn M. Reeves = 2.2-7 +- Fix parted and dumpe2fs output on s390 + +* Fri Feb 25 2011 Bryn M. Reeves = 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 = 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 = 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 = 2.2-2 + +* Thu Jun 10 2010 Adam Stokes = 2.2-0 + +* Wed Apr 28 2010 Adam Stokes = 2.1-0 + +* Mon Apr 12 2010 Adam Stokes = 2.0-0 + +* Tue Mar 30 2010 Adam Stokes = 1.9-3 +- fix setup.py to autocompile translations and man pages +- rebase 1.9 + +* Fri Mar 19 2010 Adam Stokes = 1.9-2 +- updated translations + +* Thu Mar 04 2010 Adam Stokes = 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 = 1.8-21 +- more sanitizing options for log files +- rhbz fixes from RHEL version merged into trunk +- progressbar update +