diff --git a/SOURCES/sos-bz1083656-cluster-data-ownership.patch b/SOURCES/sos-bz1083656-cluster-data-ownership.patch new file mode 100644 index 0000000..0ccabaa --- /dev/null +++ b/SOURCES/sos-bz1083656-cluster-data-ownership.patch @@ -0,0 +1,188 @@ +From bb1e81e0d3d738f2f333175fc32987ed473edd8d Mon Sep 17 00:00:00 2001 +From: Shane Bradley +Date: Fri, 6 Feb 2015 11:24:26 -0500 +Subject: [PATCH] [cluster] remove some files and commands that are no longer + needed + +Removed some of the files and commands that are no longer needed on +RHEL6+. In addition, the gfs_lockdump option did not capture gfs2 lock +dumps. The option is now called gfs2_lockdump and will mount the +/sys/kernel/debug directory and the gfs2 lockdumps will be copied from +that mount point. + +In addition added a couple files that are needed for pacemaker/dlm. + +Resolves: rhbz#1083656 + +Signed-off-by: Shane Bradley +Signed-off-by: Bryn M. Reeves +--- + sos/plugins/cluster.py | 66 +++++++++++++++++++++++++++++--------------------- + 1 file changed, 39 insertions(+), 27 deletions(-) + +diff --git a/sos/plugins/cluster.py b/sos/plugins/cluster.py +index 9b5eb22..a84d3e2 100644 +--- a/sos/plugins/cluster.py ++++ b/sos/plugins/cluster.py +@@ -14,18 +14,19 @@ + + from sos.plugins import Plugin, RedHatPlugin + import re ++import os.path + from glob import glob + from datetime import datetime, timedelta + + + class Cluster(Plugin, RedHatPlugin): +- """Red Hat Cluster Suite and GFS ++ """Red Hat Cluster High Availability and GFS2 + """ + + plugin_name = 'cluster' + profiles = ('cluster',) + option_list = [ +- ("gfslockdump", 'gather output of gfs lockdumps', 'slow', False), ++ ("gfs2lockdump", 'gather output of gfs2 lockdumps', 'slow', False), + ("crm_from", 'specify the start time for crm_report', 'fast', False), + ('lockdump', 'gather dlm lockdumps', 'slow', False) + ] +@@ -42,12 +43,16 @@ class Cluster(Plugin, RedHatPlugin): + + files = ["/etc/cluster/cluster.conf"] + ++ debugfs_path = "/sys/kernel/debug" ++ _debugfs_cleanup = False ++ + def setup(self): + + self.add_copy_spec([ + "/etc/cluster.conf", +- "/etc/cluster.xml", + "/etc/cluster", ++ "/etc/sysconfig/dlm", ++ "/etc/sysconfig/pacemaker", + "/etc/sysconfig/cluster", + "/etc/sysconfig/cman", + "/etc/fence_virt.conf", +@@ -56,12 +61,12 @@ class Cluster(Plugin, RedHatPlugin): + "/var/lib/luci/etc", + "/var/log/cluster", + "/var/log/luci", +- "/etc/fence_virt.conf", + "/sys/fs/gfs2/*/withdraw" + ]) + +- if self.get_option('gfslockdump'): +- self.do_gfslockdump() ++ if self.get_option('gfs2lockdump'): ++ if self._mount_debug(): ++ self.add_copy_spec(["/sys/kernel/debug/gfs2/*"]) + + if self.get_option('lockdump'): + self.do_lockdump() +@@ -81,7 +86,6 @@ class Cluster(Plugin, RedHatPlugin): + "corosync-quorumtool -s", + "corosync-cpgtool", + "corosync-objctl", +- "group_tool ls -g1", + "gfs_control ls -n", + "gfs_control dump", + "fence_tool dump", +@@ -108,26 +112,29 @@ class Cluster(Plugin, RedHatPlugin): + % (crm_dest, crm_from)) + + def do_lockdump(self): +- dlm_tool = "dlm_tool ls" +- result = self.call_ext_prog(dlm_tool) +- if result['status'] != 0: +- return +- +- lock_exp = r'^name\s+([^\s]+)$' +- lock_re = re.compile(lock_exp, re.MULTILINE) +- for lockspace in lock_re.findall(result['output']): +- self.add_cmd_output( +- "dlm_tool lockdebug -svw '%s'" % lockspace, +- suggest_filename="dlm_locks_%s" % lockspace +- ) +- +- def do_gfslockdump(self): +- mnt_exp = r'^\S+\s+([^\s]+)\s+gfs\s+.*$' +- for mnt in self.do_regex_find_all(mnt_exp, "/proc/mounts"): +- self.add_cmd_output( +- "gfs_tool lockdump %s" % mnt, +- suggest_filename="gfs_lockdump_" + self.mangle_command(mnt) +- ) ++ if self._mount_debug(): ++ dlm_tool = "dlm_tool ls" ++ result = self.call_ext_prog(dlm_tool) ++ if result['status'] != 0: ++ return ++ ++ lock_exp = r'^name\s+([^\s]+)$' ++ lock_re = re.compile(lock_exp, re.MULTILINE) ++ for lockspace in lock_re.findall(result['output']): ++ self.add_cmd_output( ++ "dlm_tool lockdebug -svw '%s'" % lockspace, ++ suggest_filename="dlm_locks_%s" % lockspace ++ ) ++ ++ def _mount_debug(self): ++ if not os.path.ismount(self.debugfs_path): ++ self._debugfs_cleanup = True ++ r = self.call_ext_prog("mount -t debugfs debugfs %s" ++ % self.debugfs_path) ++ if r['status'] != 0: ++ self._log_error("debugfs not mounted and mount attempt failed") ++ self._debugfs_cleanup = False ++ return os.path.ismount(self.debugfs_path) + + def postproc(self): + for cluster_conf in glob("/etc/cluster/cluster.conf*"): +@@ -148,6 +155,11 @@ class Cluster(Plugin, RedHatPlugin): + r"(.*fence.*\.passwd=)(.*)", + r"\1******" + ) ++ if self._debugfs_cleanup and os.path.ismount(self.debugfs_path): ++ r = self.call_ext_prog("umount %s" % self.debugfs_path) ++ if r['status'] != 0: ++ self._log_error("could not unmount %s" % self.debugfs_path) ++ + return + + # vim: et ts=4 sw=4 +-- +1.8.3.1 + +From 55aebeabb2d2c87c695041cff426afaa6bd2808a Mon Sep 17 00:00:00 2001 +From: Shane Bradley +Date: Tue, 17 Feb 2015 13:54:01 -0500 +Subject: [PATCH] [cluster] add a couple pcs commands to the cluster plugin + +There are 3 pcs commands added to cluster plugin to get +information about the status of pacemaker cluster. + +Signed-off-by: Shane Bradley +Signed-off-by: Bryn M. Reeves +--- + sos/plugins/cluster.py | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/sos/plugins/cluster.py b/sos/plugins/cluster.py +index 7aeed44..bd2cf8a 100644 +--- a/sos/plugins/cluster.py ++++ b/sos/plugins/cluster.py +@@ -92,7 +92,10 @@ class Cluster(Plugin, RedHatPlugin): + "fence_tool dump", + "dlm_tool dump", + "dlm_tool ls -n", +- "mkqdisk -L" ++ "mkqdisk -L", ++ "pcs config", ++ "pcs status", ++ "pcs property list --all" + ]) + + # crm_report needs to be given a --from "YYYY-MM-DD HH:MM:SS" start +-- +1.8.3.1 + diff --git a/SOURCES/sos-bz1135317-sat6-capsule-debug.patch b/SOURCES/sos-bz1135317-sat6-capsule-debug.patch new file mode 100644 index 0000000..470eb29 --- /dev/null +++ b/SOURCES/sos-bz1135317-sat6-capsule-debug.patch @@ -0,0 +1,92 @@ +From 5cc06136d68536b806ce09ce61f800d9a7938790 Mon Sep 17 00:00:00 2001 +From: Lukas Zapletal +Date: Tue, 3 Feb 2015 16:42:11 +0100 +Subject: [PATCH] [foreman] Skip collection of generic resources + +New option was added to foreman-debug (-g) to skip collecting of generic +resources (firewall, selinux, cpu, memory). This patch leverages that. + +https://github.com/theforeman/foreman/blob/develop/script/foreman-debug + +Since katello-debug is now part of foreman-debug (as a plugin), there is no +need of separate sosreport plugin. + +https://github.com/Katello/katello/blob/master/deploy/script/katello-debug.sh + +New subpackage called foreman-debug was introduced. It is present in both +upstream Foreman and Katello installations as well as on both Satellite 6 main +node and capsule instances. It can be used to detect if foreman-debug script is +present. + +Signed-off-by: Lukas Zapletal +--- + sos/plugins/foreman.py | 6 +++--- + sos/plugins/katello.py | 32 -------------------------------- + 2 files changed, 3 insertions(+), 35 deletions(-) + delete mode 100644 sos/plugins/katello.py + +diff --git a/sos/plugins/foreman.py b/sos/plugins/foreman.py +index 896add1..e50cbdf 100644 +--- a/sos/plugins/foreman.py ++++ b/sos/plugins/foreman.py +@@ -18,16 +18,16 @@ from sos.plugins import Plugin, RedHatPlugin + + + class Foreman(Plugin, RedHatPlugin): +- """Foreman systems management ++ """Foreman/Satellite 6 systems management + """ + + plugin_name = 'foreman' + profiles = ('sysmgmt',) +- packages = ('foreman') ++ packages = ('foreman-debug') + + 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 -g -q -a -d %s" % (cmd, path)) + + # vim: et ts=4 sw=4 +diff --git a/sos/plugins/katello.py b/sos/plugins/katello.py +deleted file mode 100644 +index 795c07e..0000000 +--- a/sos/plugins/katello.py ++++ /dev/null +@@ -1,32 +0,0 @@ +-# Copyright (C) 2013 Red Hat, Inc., Lukas Zapletal +- +-# 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 Katello(Plugin, RedHatPlugin): +- """Katello systems management +- """ +- +- plugin_name = 'katello' +- profiles = ('sysmgmt',) +- packages = ('katello', 'katello-common', 'katello-headpin') +- +- def setup(self): +- self.add_cmd_output("katello-debug --notar -d %s" +- % self.get_cmd_output_path(name="katello-debug")) +- +-# vim: et ts=4 sw=4 +-- +1.8.3.1 + diff --git a/SOURCES/sos-bz1164864-cluster-crm-report-password-sanitize.patch b/SOURCES/sos-bz1164864-cluster-crm-report-password-sanitize.patch new file mode 100644 index 0000000..a860393 --- /dev/null +++ b/SOURCES/sos-bz1164864-cluster-crm-report-password-sanitize.patch @@ -0,0 +1,62 @@ +From 0d2dd0d9ccc3242dd2dd4513924c8f308000242e Mon Sep 17 00:00:00 2001 +From: Shane Bradley +Date: Wed, 6 May 2015 15:47:07 -0400 +Subject: [PATCH] [cluster] enable crm_report password scrubbing + +Default to specifying a password pattern of 'passw.*' when calling +the crm_report script. This causes matching strings to be elided +from the report data. + +Since this scrubbing can affect the use of pacemaker state machine +snapshots for debugging the behaviour is controlled by a new option +that defaults to enabled: cluster.crm_scrub + +This can be used to obtain an sosreport containing virgin crm_report +data with no password scrubbing: + + # sosreport -k cluster.crm_scrub=False + +Signed-off-by: Shane Bradley +Signed-off-by: Bryn M. Reeves +--- + sos/plugins/cluster.py | 14 +++++++++++--- + 1 file changed, 11 insertions(+), 3 deletions(-) + +diff --git a/sos/plugins/cluster.py b/sos/plugins/cluster.py +index 8dd9a4d..084c030 100644 +--- a/sos/plugins/cluster.py ++++ b/sos/plugins/cluster.py +@@ -25,10 +25,12 @@ class Cluster(Plugin, RedHatPlugin): + + plugin_name = 'cluster' + profiles = ('cluster',) ++ + option_list = [ + ("gfs2lockdump", 'gather output of gfs2 lockdumps', 'slow', False), + ("crm_from", 'specify the start time for crm_report', 'fast', False), +- ('lockdump', 'gather dlm lockdumps', 'slow', False) ++ ('lockdump', 'gather dlm lockdumps', 'slow', False), ++ ('crm_scrub', 'enable password scrubbing for crm_report', '', True), + ] + + packages = [ +@@ -112,8 +114,14 @@ class Cluster(Plugin, RedHatPlugin): + "default" % self.get_option('crm_from')) + + crm_dest = self.get_cmd_output_path(name='crm_report', make=False) +- self.add_cmd_output('crm_report -S -d --dest %s --from "%s"' +- % (crm_dest, crm_from)) ++ crm_scrub = '-p "passw.*"' ++ if not self.get_option("crm_scrub"): ++ crm_scrub = '' ++ self._log_warn("scrubbing of crm passwords has been disabled:") ++ self._log_warn("data collected by crm_report may contain" ++ " sensitive values.") ++ self.add_cmd_output('crm_report %s -S -d --dest %s --from "%s"' ++ % (crm_scrub, crm_dest, crm_from)) + + def do_lockdump(self): + if self._mount_debug(): +-- +1.8.3.1 + diff --git a/SOURCES/sos-bz1165418-chrony-new-plugin.patch b/SOURCES/sos-bz1165418-chrony-new-plugin.patch new file mode 100644 index 0000000..53e40df --- /dev/null +++ b/SOURCES/sos-bz1165418-chrony-new-plugin.patch @@ -0,0 +1,64 @@ +From b6e6a4d1ce4beae74cb0123bd7c48d0828d120ec Mon Sep 17 00:00:00 2001 +From: Justin Stephenson +Date: Sun, 29 Mar 2015 22:58:42 +0200 +Subject: [PATCH] [chrony] add chrony plugin + +Resolves #539 + +Signed-off-by: Justin Stephenson +Signed-off-by: Pavel Moravec +Signed-off-by: Bryn M. Reeves +--- + sos/plugins/chrony.py | 40 ++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 40 insertions(+) + create mode 100644 sos/plugins/chrony.py + +diff --git a/sos/plugins/chrony.py b/sos/plugins/chrony.py +new file mode 100644 +index 0000000..d2404d4 +--- /dev/null ++++ b/sos/plugins/chrony.py +@@ -0,0 +1,40 @@ ++# 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 Chrony(Plugin, RedHatPlugin): ++ """Chrony clock (for Network time protocol) ++ """ ++ ++ plugin_name = "chrony" ++ profiles = ('system', 'services') ++ ++ packages = ('chrony',) ++ ++ def setup(self): ++ self.add_copy_spec([ ++ "/etc/chrony.conf", ++ "/var/lib/chrony/drift" ++ ]) ++ self.add_cmd_output([ ++ "chronyc tracking", ++ "chronyc sources", ++ "chronyc sourcestats", ++ "chronyc clients", ++ "journalctl -u chronyd" ++ ]) ++ ++# vim: et ts=4 sw=4 +-- +1.8.3.1 + diff --git a/SOURCES/sos-bz1183265-httpd-collect-conf-modules.patch b/SOURCES/sos-bz1183265-httpd-collect-conf-modules.patch new file mode 100644 index 0000000..7f8801f --- /dev/null +++ b/SOURCES/sos-bz1183265-httpd-collect-conf-modules.patch @@ -0,0 +1,28 @@ +From b43460ecaeb7e332a993fb6ea19f4808d759711f Mon Sep 17 00:00:00 2001 +From: Coty Sutherland +Date: Thu, 28 May 2015 10:22:39 -0400 +Subject: [PATCH] [apache] Added collection of conf.modules.d dir for httpd 2.4 + +Signed-off-by: Coty Sutherland +Signed-off-by: Adam Stokes +--- + sos/plugins/apache.py | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/sos/plugins/apache.py b/sos/plugins/apache.py +index dc700cb..551b062 100644 +--- a/sos/plugins/apache.py ++++ b/sos/plugins/apache.py +@@ -34,7 +34,8 @@ class RedHatApache(Apache, RedHatPlugin): + + self.add_copy_spec([ + "/etc/httpd/conf/httpd.conf", +- "/etc/httpd/conf.d/*.conf" ++ "/etc/httpd/conf.d/*.conf", ++ "/etc/httpd/conf.modules.d/*.conf" + ]) + + self.add_forbidden_path("/etc/httpd/conf/password.conf") +-- +1.8.3.1 + diff --git a/SOURCES/sos-bz1183297-pcp-collect-config.patch b/SOURCES/sos-bz1183297-pcp-collect-config.patch new file mode 100644 index 0000000..009c234 --- /dev/null +++ b/SOURCES/sos-bz1183297-pcp-collect-config.patch @@ -0,0 +1,31 @@ +From 9cf393ac27728287927d2c1400e046a8c16679e7 Mon Sep 17 00:00:00 2001 +From: "Bryn M. Reeves" +Date: Wed, 11 Feb 2015 21:17:11 +0000 +Subject: [PATCH] [pcp] collect /etc/pcp.conf + +The file /etc/pcp.conf is added to list of lists that will be collected. + +Signed-off-by: Shane Bradley + +Fixes #465. + +Signed-off-by: Bryn M. Reeves +--- + sos/plugins/pcp.py | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/sos/plugins/pcp.py b/sos/plugins/pcp.py +index a696908..69872a3 100644 +--- a/sos/plugins/pcp.py ++++ b/sos/plugins/pcp.py +@@ -89,6 +89,7 @@ class Pcp(Plugin, RedHatPlugin, DebianPlugin): + var_conf_dir = os.path.join(self.pcp_var_dir, 'config') + self.add_copy_spec([ + self.pcp_sysconf_dir, ++ self.pcp_conffile, + var_conf_dir + ]) + +-- +1.8.3.1 + diff --git a/SOURCES/sos-bz1183768-puppet-collect-config.patch b/SOURCES/sos-bz1183768-puppet-collect-config.patch new file mode 100644 index 0000000..6677894 --- /dev/null +++ b/SOURCES/sos-bz1183768-puppet-collect-config.patch @@ -0,0 +1,68 @@ +From c5f969e8a79a2bc7e0280e11e4a02599552b326f Mon Sep 17 00:00:00 2001 +From: Shane Bradley +Date: Tue, 20 Jan 2015 11:33:31 -0500 +Subject: [PATCH] [puppet] adding new plugin for puppet + +Added a new plugin to collect files for puppet. + +Fixes: #473. + +Signed-off-by: Shane Bradley +Signed-off-by: Bryn M. Reeves +--- + sos/plugins/puppet.py | 43 +++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 43 insertions(+) + create mode 100644 sos/plugins/puppet.py + +diff --git a/sos/plugins/puppet.py b/sos/plugins/puppet.py +new file mode 100644 +index 0000000..4da95a2 +--- /dev/null ++++ b/sos/plugins/puppet.py +@@ -0,0 +1,43 @@ ++# 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 ++from glob import glob ++ ++ ++class Puppet(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): ++ """Puppet service ++ """ ++ ++ plugin_name = 'puppet' ++ profiles = ('services',) ++ ++ def setup(self): ++ self.add_copy_spec([ ++ "/etc/puppet/*.conf", ++ "/etc/puppet/rack/*", ++ "/etc/puppet/manifests/*", ++ "/var/log/puppet/*.log", ++ ]) ++ ++ def postproc(self): ++ for device_conf in glob("/etc/puppet/device.conf*"): ++ self.do_file_sub( ++ device_conf, ++ r"(.*url*.ssh://.*:).*(@.*)", ++ r"\1%s\2" % ('***') ++ ) ++ ++ return ++# vim: et ts=4 sw=4 +-- +1.8.3.1 + diff --git a/SOURCES/sos-bz1183770-parted-no-human-readable.patch b/SOURCES/sos-bz1183770-parted-no-human-readable.patch new file mode 100644 index 0000000..6ae4b3e --- /dev/null +++ b/SOURCES/sos-bz1183770-parted-no-human-readable.patch @@ -0,0 +1,32 @@ +From c77c14ecd3e7e35a331cef169b08ffcb318952c2 Mon Sep 17 00:00:00 2001 +From: Shane Bradley +Date: Tue, 20 Jan 2015 11:08:59 -0500 +Subject: [PATCH] [block] don't use parted human readable output + +Changed the parted command to return data in sectors units +instead of human readable form. + +Fixes #471. + +Signed-off-by: Shane Bradley +Signed-off-by: Bryn M. Reeves +--- + sos/plugins/block.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/sos/plugins/block.py b/sos/plugins/block.py +index 7984f0d..e02304c 100644 +--- a/sos/plugins/block.py ++++ b/sos/plugins/block.py +@@ -46,7 +46,7 @@ class Block(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): + disk_path = os.path.join('/dev/', disk) + self.add_cmd_output([ + "udevadm info -ap /sys/block/%s" % (disk), +- "parted -s %s print" % (disk_path), ++ "parted -s %s unit s print" % (disk_path), + "fdisk -l %s" % disk_path + ]) + +-- +1.8.3.1 + diff --git a/SOURCES/sos-bz1184602-sos-verify-profile-for-valid-plugins-only.patch b/SOURCES/sos-bz1184602-sos-verify-profile-for-valid-plugins-only.patch new file mode 100644 index 0000000..fbd5109 --- /dev/null +++ b/SOURCES/sos-bz1184602-sos-verify-profile-for-valid-plugins-only.patch @@ -0,0 +1,63 @@ +From df219b43b5edab9868cb7d7511f7da1c1f5e225a Mon Sep 17 00:00:00 2001 +From: "Bryn M. Reeves" +Date: Wed, 1 Jul 2015 14:18:50 +0100 +Subject: [PATCH] [general] verify --profile contains valid plugins only + +If --profile contains an invalid profile name, stop, and +print the list of available profiles as well as the offending +profile name (helpful when multiple profiles have been specified). + +E.g.: + +sosreport (version 3.2) + +Unknown or inactive profile(s) provided: virtuous +The following profiles are available: + + boot boot, startup, systemd, udev + cluster +[...] + +Based on a patch from Pavel Moravec. + +Fixes #505. + +Signed-off-by: Bryn M. Reeves +--- + sos/sosreport.py | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +diff --git a/sos/sosreport.py.orig b/sos/sosreport.py +index 7ea7b33..2af9de5 100644 +--- a/sos/sosreport.py.orig ++++ b/sos/sosreport.py +@@ -844,6 +844,7 @@ class SoSReport(object): + self.plugin_names = deque() + self.profiles = set() + using_profiles = len(self.opts.profiles) ++ remaining_profiles = list(self.opts.profiles) + # validate and load plugins + for plug in plugins: + plugbase, ext = os.path.splitext(plug) +@@ -896,12 +897,21 @@ class SoSReport(object): + self._skip(plugin_class, _("not specified")) + continue + ++ for i in plugin_class.profiles: ++ if i in remaining_profiles: ++ remaining_profiles.remove(i) ++ + self._load(plugin_class) + except Exception as e: + self.soslog.warning(_("plugin %s does not install, " + "skipping: %s") % (plug, e)) + if self.raise_plugins: + raise ++ if len(remaining_profiles) > 0: ++ self.soslog.error(_("Unknown or inactive profile(s) provided:" ++ " %s") % ", ".join(remaining_profiles)) ++ self.list_profiles() ++ self._exit(1) + + def _set_all_options(self): + if self.opts.usealloptions: diff --git a/SOURCES/sos-bz1185093-sos-ticket-number-name-params.patch b/SOURCES/sos-bz1185093-sos-ticket-number-name-params.patch new file mode 100644 index 0000000..ed6c475 --- /dev/null +++ b/SOURCES/sos-bz1185093-sos-ticket-number-name-params.patch @@ -0,0 +1,62 @@ +From 75901ef7906690aadaabc8925ac9a2e8523ed1a3 Mon Sep 17 00:00:00 2001 +From: Pavel Moravec +Date: Sun, 1 Feb 2015 13:40:18 +0100 +Subject: [PATCH] [general] Better handling --name and --ticket-number in + interactive mode + +Carry forward values from the CLI options into the interactive mode, +resolves #485 + +Signed-off-by: Pavel Moravec +--- + sos/policies/__init__.py | 19 +++++++++++-------- + 1 file changed, 11 insertions(+), 8 deletions(-) + +diff --git a/sos/policies/__init__.py b/sos/policies/__init__.py +index 34a2f6a..4c42d02 100644 +--- a/sos/policies/__init__.py ++++ b/sos/policies/__init__.py +@@ -402,17 +402,20 @@ class LinuxPolicy(Policy): + def pre_work(self): + # this method will be called before the gathering begins + +- localname = self.get_local_name() ++ cmdline_opts = self.commons['cmdlineopts'] ++ customer_name = cmdline_opts.customer_name ++ localname = customer_name if customer_name else self.get_local_name() ++ caseid = cmdline_opts.case_id if cmdline_opts.case_id else "" + +- if not self.commons['cmdlineopts'].batch and not \ +- self.commons['cmdlineopts'].quiet: ++ if not cmdline_opts.batch and not \ ++ cmdline_opts.quiet: + try: + self.report_name = input(_("Please enter your first initial " + "and last name [%s]: ") % localname) + + self.case_id = input(_("Please enter the case id " + "that you are generating this " +- "report for: ")) ++ "report for [%s]: ") % caseid) + self._print() + except: + self._print() +@@ -421,11 +424,11 @@ class LinuxPolicy(Policy): + if len(self.report_name) == 0: + self.report_name = localname + +- if self.commons['cmdlineopts'].customer_name: +- self.report_name = self.commons['cmdlineopts'].customer_name ++ if customer_name: ++ self.report_name = customer_name + +- if self.commons['cmdlineopts'].case_id: +- self.case_id = self.commons['cmdlineopts'].case_id ++ if cmdline_opts.case_id: ++ self.case_id = cmdline_opts.case_id + + self.report_name = self.sanitize_report_name(self.report_name) + if self.case_id: +-- +1.8.3.1 + diff --git a/SOURCES/sos-bz1185990-sos-inside-container.patch b/SOURCES/sos-bz1185990-sos-inside-container.patch new file mode 100644 index 0000000..213a75b --- /dev/null +++ b/SOURCES/sos-bz1185990-sos-inside-container.patch @@ -0,0 +1,2458 @@ +From cb3d265849771f7e53b0587196930328005414e0 Mon Sep 17 00:00:00 2001 +From: "Bryn M. Reeves" +Date: Mon, 19 Jan 2015 18:54:09 +0000 +Subject: [PATCH 01/38] [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 | 16 +++++++++++++++- + 1 file changed, 15 insertions(+), 1 deletion(-) + +diff --git a/sos/sosreport.py b/sos/sosreport.py +index 9a0cf6c..47eddc9 100644 +--- a/sos/sosreport.py ++++ b/sos/sosreport.py +@@ -529,6 +529,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 +@@ -615,6 +626,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.8.3.1 + + +From 3eed62e132f67930bb1cf5c9eaa5927083011043 Mon Sep 17 00:00:00 2001 +From: "Bryn M. Reeves" +Date: Fri, 23 Jan 2015 15:24:00 +0000 +Subject: [PATCH 02/38] [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 47eddc9..580b5bd 100644 +--- a/sos/sosreport.py ++++ b/sos/sosreport.py +@@ -651,6 +651,7 @@ class SoSReport(object): + self.archive = None + self.tempfile_util = None + self._args = args ++ self.sysroot = "/" + + try: + import signal +@@ -681,6 +682,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__,))) +@@ -693,6 +698,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.8.3.1 + + +From b1f3b3373e8ef3e94238760a3e7e78d95c564260 Mon Sep 17 00:00:00 2001 +From: "Bryn M. Reeves" +Date: Fri, 23 Jan 2015 23:17:34 +0000 +Subject: [PATCH 03/38] [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 | 50 +++++++++++++++++++++++++++++++++++-------- + tests/option_tests.py | 3 ++- + tests/plugin_tests.py | 57 ++++++++++++++++++++++++++++++++----------------- + 3 files changed, 81 insertions(+), 29 deletions(-) + +diff --git a/sos/plugins/__init__.py b/sos/plugins/__init__.py +index 413ee73..790338b 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) +@@ -277,7 +294,7 @@ class Plugin(object): + self._do_copy_path(absdest) + + self.copied_files.append({'srcpath': srcpath, +- 'dstpath': srcpath, ++ 'dstpath': dstpath, + 'symlink': "yes", + 'pointsto': linkdest}) + +@@ -288,6 +305,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"] +@@ -315,6 +334,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): +@@ -333,7 +355,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 + +@@ -347,9 +369,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[] +@@ -416,6 +440,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 +@@ -424,10 +451,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 +@@ -438,7 +468,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 +@@ -459,12 +489,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, stderr=True): + result = sos_get_command_output(prog, timeout=timeout, runat=runat, +diff --git a/tests/option_tests.py b/tests/option_tests.py +index fe37ccf..e8a26e2 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 e30ded5..14d3b49 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.8.3.1 + + +From c4957d8aa4ea35f879639726267043f6bb46cc7c Mon Sep 17 00:00:00 2001 +From: "Bryn M. Reeves" +Date: Sat, 24 Jan 2015 00:35:09 +0000 +Subject: [PATCH 04/38] [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 c2b60d8..b0a86f2 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 +@@ -72,6 +73,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.8.3.1 + + +From 4a0a3f9607006d402713320fc31780fb54556e6a Mon Sep 17 00:00:00 2001 +From: "Bryn M. Reeves" +Date: Sun, 25 Jan 2015 14:20:10 +0000 +Subject: [PATCH 05/38] [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 | 27 ++++++++++++++++----------- + tests/utilities_tests.py | 5 +++++ + 3 files changed, 22 insertions(+), 12 deletions(-) + +diff --git a/sos/plugins/__init__.py b/sos/plugins/__init__.py +index 790338b..137e1a1 100644 +--- a/sos/plugins/__init__.py ++++ b/sos/plugins/__init__.py +@@ -499,7 +499,7 @@ class Plugin(object): + self._log_info("added copyspec '%s'" % copy_paths) + + def get_command_output(self, prog, timeout=300, runat=None, stderr=True): +- result = sos_get_command_output(prog, timeout=timeout, runat=runat, ++ result = sos_get_command_output(prog, timeout=timeout, chdir=runat, + stderr=stderr) + if result['status'] == 124: + self._log_warn("command '%s' timed out after %ds" +diff --git a/sos/utilities.py b/sos/utilities.py +index dfe6128..a82ac7c 100644 +--- a/sos/utilities.py ++++ b/sos/utilities.py +@@ -120,15 +120,20 @@ 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, stderr=True): +- """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, stderr=False, ++ 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 +@@ -145,7 +150,7 @@ def sos_get_command_output(command, timeout=300, runat=None, stderr=True): + p = Popen(args, shell=False, stdout=PIPE, + stderr=STDOUT if stderr else PIPE, + 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': ""} +@@ -185,7 +190,7 @@ def shell_out(cmd, timeout=30, 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, timeout=timeout, runat=runat)['output'] ++ return sos_get_command_output(cmd, timeout=timeout, chdir=runat)['output'] + + + class ImporterHelper(object): +diff --git a/tests/utilities_tests.py b/tests/utilities_tests.py +index 607056e..9327b1f 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.8.3.1 + + +From 9a87cb3415a7a9587828ee40d689439949def1be Mon Sep 17 00:00:00 2001 +From: "Bryn M. Reeves" +Date: Sun, 25 Jan 2015 14:30:13 +0000 +Subject: [PATCH 06/38] [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 | 19 +++++++++++++++++++ + tests/utilities_tests.py | 4 +++- + 2 files changed, 22 insertions(+), 1 deletion(-) + +diff --git a/sos/sosreport.py b/sos/sosreport.py +index 580b5bd..d9abcb8 100644 +--- a/sos/sosreport.py ++++ b/sos/sosreport.py +@@ -540,6 +540,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 +@@ -630,6 +645,10 @@ 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 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)", +diff --git a/tests/utilities_tests.py b/tests/utilities_tests.py +index 9327b1f..c464692 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.8.3.1 + + +From 0d060dc3aa5e90373e7bb55f9310b4cf9db0dad4 Mon Sep 17 00:00:00 2001 +From: "Bryn M. Reeves" +Date: Sun, 25 Jan 2015 15:04:29 +0000 +Subject: [PATCH 07/38] [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 | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +diff --git a/sos/plugins/__init__.py b/sos/plugins/__init__.py +index 137e1a1..10fdae5 100644 +--- a/sos/plugins/__init__.py ++++ b/sos/plugins/__init__.py +@@ -499,8 +499,12 @@ class Plugin(object): + self._log_info("added copyspec '%s'" % copy_paths) + + def get_command_output(self, prog, timeout=300, runat=None, stderr=True): +- result = sos_get_command_output(prog, timeout=timeout, chdir=runat, +- stderr=stderr) ++ if self.commons['cmdlineopts'].chroot == 'always': ++ root = self.sysroot ++ else: ++ root = None ++ result = sos_get_command_output(prog, timeout=timeout, stderr=stderr ++ chroot=root, chdir=runat) + if result['status'] == 124: + self._log_warn("command '%s' timed out after %ds" + % (prog, timeout)) +-- +1.8.3.1 + + +From f6f7934c7d3e7f6cb41879fc0625b06d0468af4e Mon Sep 17 00:00:00 2001 +From: "Bryn M. Reeves" +Date: Sun, 25 Jan 2015 19:32:04 +0000 +Subject: [PATCH 08/38] [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 10fdae5..9d04939 100644 +--- a/sos/plugins/__init__.py ++++ b/sos/plugins/__init__.py +@@ -294,7 +294,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(absdest) ++ self._do_copy_path(self.strip_sysroot(absdest)) + + self.copied_files.append({'srcpath': srcpath, + 'dstpath': dstpath, +-- +1.8.3.1 + + +From b16fbf3911c6256674e072cff6fa706050861993 Mon Sep 17 00:00:00 2001 +From: "Bryn M. Reeves" +Date: Sun, 25 Jan 2015 21:54:19 +0000 +Subject: [PATCH 09/38] [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 d9abcb8..a0b89e7 100644 +--- a/sos/sosreport.py ++++ b/sos/sosreport.py +@@ -225,6 +225,10 @@ class XmlReport(object): + outf.close() + + ++# valid modes for --chroot ++chroot_modes = ["auto", "always", "never"] ++ ++ + class SoSOptions(object): + _list_plugins = False + _noplugins = [] +@@ -548,7 +552,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) +@@ -705,6 +709,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__,))) +@@ -1205,7 +1217,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") +@@ -1455,7 +1466,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.8.3.1 + + +From f06efd6fa7bbb0c81ce0461d4eaeed225d6f04a2 Mon Sep 17 00:00:00 2001 +From: "Bryn M. Reeves" +Date: Sun, 25 Jan 2015 23:03:08 +0000 +Subject: [PATCH 10/38] [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 | 50 ++++++++++++++++++++++++++++--------------------- + 1 file changed, 29 insertions(+), 21 deletions(-) + +diff --git a/sos/plugins/__init__.py b/sos/plugins/__init__.py +index 9d04939..c1b659d 100644 +--- a/sos/plugins/__init__.py ++++ b/sos/plugins/__init__.py +@@ -498,12 +498,13 @@ 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, stderr=True): +- if self.commons['cmdlineopts'].chroot == 'always': ++ def get_command_output(self, prog, timeout=300, stderr=True, ++ chroot=True, runat=None): ++ if chroot or self.commons['cmdlineopts'].chroot == 'always': + root = self.sysroot + else: + root = None +- result = sos_get_command_output(prog, timeout=timeout, stderr=stderr ++ result = sos_get_command_output(prog, timeout=timeout, stderr=stderr, + chroot=root, chdir=runat) + if result['status'] == 124: + self._log_warn("command '%s' timed out after %ds" +@@ -513,12 +514,13 @@ 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, stderr=True): ++ def call_ext_prog(self, prog, timeout=300, stderr=True, ++ 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, +- stderr=True) ++ return self.get_command_output(prog, timeout=timeout, stderr=stderr, ++ chroot=chroot, runat=runat) + + def check_ext_prog(self, prog): + """Execute a command independently of the output gathering part of +@@ -528,8 +530,8 @@ 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, +- stderr=True): ++ root_symlink=None, timeout=300, stderr=True, ++ chroot=True, runat=None): + """Run a program or a list of programs and collect the output""" + if isinstance(cmds, six.string_types): + cmds = [cmds] +@@ -537,9 +539,10 @@ class Plugin(object): + self._log_warn("ambiguous filename or symlink for command list") + for cmd in cmds: + cmdt = ( +- cmd, suggest_filename, root_symlink, timeout, runat, stderr ++ cmd, suggest_filename, root_symlink, timeout, stderr, ++ chroot, runat + ) +- _tuplefmt = "('%s', '%s', '%s', %s, '%s', '%s')" ++ _tuplefmt = "('%s', '%s', '%s', %s, '%s', '%s', '%s')" + _logstr = "packed command tuple: " + _tuplefmt + self._log_debug(_logstr % cmdt) + self.collect_cmds.append(cmdt) +@@ -594,14 +597,14 @@ class Plugin(object): + self._log_debug("added string '%s' as '%s'" % (content, filename)) + + def get_cmd_output_now(self, exe, suggest_filename=None, +- root_symlink=False, timeout=300, +- runat=None, stderr=True): ++ root_symlink=False, timeout=300, stderr=True, ++ 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, +- stderr=stderr) ++ result = self.get_command_output(exe, timeout=timeout, stderr=stderr, ++ chroot=chroot, runat=runat) + # 126 means 'found but not executable' + if result['status'] == 126 or result['status'] == 127: + return None +@@ -650,15 +653,20 @@ class Plugin(object): + + def _collect_cmd_output(self): + for progs in zip(self.collect_cmds): +- (prog, suggest_filename, root_symlink, timeout, runat, stderr +- ) = progs[0] +- self._log_debug("unpacked command tuple: " +- + "('%s', '%s', '%s', %s, '%s', %s)" % progs[0]) ++ ( ++ prog, ++ suggest_filename, root_symlink, ++ timeout, ++ stderr, ++ chroot, runat ++ ) = progs[0] ++ self._log_debug("unpacked command tuple: " + ++ "('%s', '%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, +- stderr=stderr) ++ root_symlink=root_symlink, timeout=timeout, ++ chroot=chroot, runat=runat) + + def _collect_strings(self): + for string, file_name in self.copy_strings: +-- +1.8.3.1 + + +From 3390d070b2945715a15f74462c511df2b2941ef5 Mon Sep 17 00:00:00 2001 +From: "Bryn M. Reeves" +Date: Sun, 25 Jan 2015 23:08:37 +0000 +Subject: [PATCH 11/38] [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 c1b659d..49f62bf 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.8.3.1 + + +From 5ae1b392d1f081bcb43e91a572342d6f02e4728d Mon Sep 17 00:00:00 2001 +From: "Bryn M. Reeves" +Date: Sun, 25 Jan 2015 23:27:51 +0000 +Subject: [PATCH 12/38] [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 49f62bf..fd1acb5 100644 +--- a/sos/plugins/__init__.py ++++ b/sos/plugins/__init__.py +@@ -317,6 +317,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): +@@ -379,13 +381,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.8.3.1 + + +From e18d25a0e0c10a2702893f7bae2530dc2a41a394 Mon Sep 17 00:00:00 2001 +From: "Bryn M. Reeves" +Date: Mon, 26 Jan 2015 00:00:08 +0000 +Subject: [PATCH 13/38] [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 ea5dbae..f52f154 100644 +--- a/sos/plugins/cluster.py ++++ b/sos/plugins/cluster.py +@@ -120,8 +120,9 @@ class Cluster(Plugin, RedHatPlugin): + self._log_warn("scrubbing of crm passwords has been disabled:") + self._log_warn("data collected by crm_report may contain" + " sensitive values.") +- self.add_cmd_output('crm_report %s -S -d --dest %s --from "%s"' +- % (crm_scrub, crm_dest, crm_from)) ++ self.add_cmd_output('crm_report %s -S -d --dest %s --from "%s"' % ++ (crm_scrub, crm_dest, crm_from), ++ chroot=self.tmp_in_sysroot()) + + def do_lockdump(self): + if self._mount_debug(): +-- +1.8.3.1 + + +From 2ca9c74454699ba6ecad21d6b0c0809333d729aa Mon Sep 17 00:00:00 2001 +From: "Bryn M. Reeves" +Date: Mon, 26 Jan 2015 00:02:35 +0000 +Subject: [PATCH 14/38] [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 b7c0b42..87381a0 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.8.3.1 + + +From 4ae09ee0ed25d771cc6cc8a013837ed4c647b3ed Mon Sep 17 00:00:00 2001 +From: "Bryn M. Reeves" +Date: Mon, 26 Jan 2015 00:04:15 +0000 +Subject: [PATCH 15/38] [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 9d1cbad..363b9d6 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 -g -q -a -d %s" % (cmd, path)) ++ self.add_cmd_output("%s -g -q -a -d %s" % (cmd, path), ++ chroot=self.tmp_in_sysroot()) + + # vim: et ts=4 sw=4 +-- +1.8.3.1 + + +From 78761114ea9cc1b33233db2186a5ff762e1ac2f2 Mon Sep 17 00:00:00 2001 +From: "Bryn M. Reeves" +Date: Mon, 26 Jan 2015 00:07:12 +0000 +Subject: [PATCH 16/38] [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 aaf862b..295c8eb 100644 +--- a/sos/plugins/libvirt.py ++++ b/sos/plugins/libvirt.py +@@ -56,7 +56,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) + + self.add_cmd_output("ls -lR /var/lib/libvirt/qemu") +-- +1.8.3.1 + + +From b34ea0c6ea5449bbd2f4f9624e1644dc01b07e9d Mon Sep 17 00:00:00 2001 +From: "Bryn M. Reeves" +Date: Mon, 26 Jan 2015 00:09:11 +0000 +Subject: [PATCH 17/38] [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 2f86acc..7957898 100644 +--- a/sos/plugins/logs.py ++++ b/sos/plugins/logs.py +@@ -38,12 +38,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:] +@@ -74,7 +74,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.8.3.1 + + +From 534eb7fe732ec366292ec582ec2891ef0648ffcb Mon Sep 17 00:00:00 2001 +From: "Bryn M. Reeves" +Date: Mon, 26 Jan 2015 00:11:15 +0000 +Subject: [PATCH 18/38] [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 dd10fa7..c626231 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.8.3.1 + + +From f4218ff5bab93908ca3d0804c9d837bdfa57f654 Mon Sep 17 00:00:00 2001 +From: "Bryn M. Reeves" +Date: Mon, 26 Jan 2015 00:37:32 +0000 +Subject: [PATCH 19/38] [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 b0a86f2..f36f845 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 +@@ -77,6 +78,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.8.3.1 + + +From fb1b4a8b6793611ed91f43f6d3553351c704f50f Mon Sep 17 00:00:00 2001 +From: "Bryn M. Reeves" +Date: Mon, 26 Jan 2015 14:57:01 +0000 +Subject: [PATCH 20/38] [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 fd1acb5..b206470 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 +@@ -303,10 +304,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.8.3.1 + + +From 2c1af0457b668acb99129ed1f6dedcf7cdaa0eea Mon Sep 17 00:00:00 2001 +From: Neependra Khare +Date: Mon, 26 Jan 2015 15:04:07 +0000 +Subject: [PATCH 21/38] [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.8.3.1 + + +From 550dda69c6c5d527498ad928a29c466fad4e250e Mon Sep 17 00:00:00 2001 +From: "Bryn M. Reeves" +Date: Mon, 26 Jan 2015 17:32:35 +0000 +Subject: [PATCH 22/38] [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 f36f845..eac9047 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.8.3.1 + + +From d7cf8535a3403fe6050e0905bef2b4429e595664 Mon Sep 17 00:00:00 2001 +From: "Bryn M. Reeves" +Date: Mon, 26 Jan 2015 15:32:03 -0500 +Subject: [PATCH 23/38] [utilities] add chroot support to shell_out() + +Signed-off-by: Bryn M. Reeves +--- + sos/utilities.py | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/sos/utilities.py b/sos/utilities.py +index a82ac7c..6475619 100644 +--- a/sos/utilities.py ++++ b/sos/utilities.py +@@ -186,11 +186,12 @@ def import_module(module_fqname, superclasses=None): + return modules + + +-def shell_out(cmd, timeout=30, runat=None): ++def shell_out(cmd, timeout=30, 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, timeout=timeout, chdir=runat)['output'] ++ return sos_get_command_output(cmd, timeout=timeout, ++ chroot=chroot, chdir=runat)['output'] + + + class ImporterHelper(object): +-- +1.8.3.1 + + +From a1a1fd6cfcdb62d7af7744bb5710a2c7d5b4262a Mon Sep 17 00:00:00 2001 +From: "Bryn M. Reeves" +Date: Mon, 26 Jan 2015 15:33:18 -0500 +Subject: [PATCH 24/38] [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 | 22 ++++++++++++++++++++-- + 1 file changed, 20 insertions(+), 2 deletions(-) + +diff --git a/sos/policies/__init__.py b/sos/policies/__init__.py +index 4657614..cea4c09 100644 +--- a/sos/policies/__init__.py ++++ b/sos/policies/__init__.py +@@ -57,11 +57,14 @@ class PackageManager(object): + + query_command = None + timeout = 30 ++ 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): + """ +@@ -93,7 +96,11 @@ class PackageManager(object): + version': 'major.minor.version'}} + """ + if self.query_command: +- pkg_list = shell_out(self.query_command, self.timeout).splitlines() ++ cmd = self.query_command ++ pkg_list = shell_out( ++ cmd, timeout=self.timeout, chroot=self.chroot ++ ).splitlines() ++ + for pkg in pkg_list: + if '|' not in pkg: + continue +@@ -145,6 +152,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. +@@ -180,6 +190,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.8.3.1 + + +From 63805ed15d63ddfebb06cd03f96f310bbf60d3b2 Mon Sep 17 00:00:00 2001 +From: "Bryn M. Reeves" +Date: Mon, 26 Jan 2015 15:36:40 -0500 +Subject: [PATCH 25/38] [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 d2f8db0..f1db8ac 100644 +--- a/sos/policies/redhat.py ++++ b/sos/policies/redhat.py +@@ -38,13 +38,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] + + pkgs = self.package_manager.all_pkgs() +@@ -70,6 +74,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 = [] +@@ -100,6 +115,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.8.3.1 + + +From f8a1746a871e560e548d21f1fc68067d452140a0 Mon Sep 17 00:00:00 2001 +From: "Bryn M. Reeves" +Date: Mon, 26 Jan 2015 15:39:16 -0500 +Subject: [PATCH 26/38] [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 a0b89e7..835d828 100644 +--- a/sos/sosreport.py ++++ b/sos/sosreport.py +@@ -648,7 +648,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)", +@@ -705,11 +705,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.8.3.1 + + +From fac57721ae10dafec909c4fac408f42ebe23d4ac Mon Sep 17 00:00:00 2001 +From: "Bryn M. Reeves" +Date: Mon, 26 Jan 2015 16:14:01 -0500 +Subject: [PATCH 27/38] [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 98d011b..8eeb2b6 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.8.3.1 + + +From 6a239ddeb5de9a04e7e7081ea6425d89dddda3f5 Mon Sep 17 00:00:00 2001 +From: "Bryn M. Reeves" +Date: Mon, 26 Jan 2015 17:13:24 -0500 +Subject: [PATCH 28/38] [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 cea4c09..a403bb9 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() +@@ -155,7 +155,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 +@@ -167,6 +167,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 +@@ -372,8 +373,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 acb5b85..e56e546 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 f1db8ac..f20359d 100644 +--- a/sos/policies/redhat.py ++++ b/sos/policies/redhat.py +@@ -42,12 +42,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] + +@@ -145,8 +149,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): +@@ -192,8 +196,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 0dd2ea2..f236421 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 835d828..ad13a2d 100644 +--- a/sos/sosreport.py ++++ b/sos/sosreport.py +@@ -687,7 +687,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.8.3.1 + + +From d34bf4982f8a627901f6538be3b9e52cc30fe91b Mon Sep 17 00:00:00 2001 +From: "Bryn M. Reeves" +Date: Tue, 27 Jan 2015 11:40:06 +0000 +Subject: [PATCH 29/38] [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 ad13a2d..27c756f 100644 +--- a/sos/sosreport.py ++++ b/sos/sosreport.py +@@ -251,6 +251,8 @@ class SoSOptions(object): + _config_file = "" + _tmp_dir = "" + _report = True ++ _sysroot = None ++ _chroot = 'auto' + _compression_type = 'auto' + + _options = None +-- +1.8.3.1 + + +From c0858c2c87f246283f6c59b7bf7f64f7dea73a82 Mon Sep 17 00:00:00 2001 +From: Neependra Khare +Date: Tue, 27 Jan 2015 15:54:23 +0000 +Subject: [PATCH 30/38] [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.8.3.1 + + +From 2ddc706c7219d0b891304fcb066dea865f8516b5 Mon Sep 17 00:00:00 2001 +From: Neependra Khare +Date: Tue, 27 Jan 2015 15:58:32 +0000 +Subject: [PATCH 31/38] [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.8.3.1 + + +From 259897b60b0e4ee00585a8d73521fa4e291eb8da Mon Sep 17 00:00:00 2001 +From: "Bryn M. Reeves" +Date: Tue, 27 Jan 2015 12:54:31 -0500 +Subject: [PATCH 32/38] [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 f20359d..3cf40b3 100644 +--- a/sos/policies/redhat.py ++++ b/sos/policies/redhat.py +@@ -79,14 +79,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.8.3.1 + + +From b880c6cb4668815b97841e6532450144a5f825f1 Mon Sep 17 00:00:00 2001 +From: "Bryn M. Reeves" +Date: Tue, 27 Jan 2015 13:53:34 -0500 +Subject: [PATCH 33/38] [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 3cf40b3..9decd0a 100644 +--- a/sos/policies/redhat.py ++++ b/sos/policies/redhat.py +@@ -37,6 +37,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 +@@ -159,7 +160,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): +@@ -193,6 +194,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.8.3.1 + + +From cd0d5c1f06a69c115e674f87254cc7e056c9891a Mon Sep 17 00:00:00 2001 +From: Jeremy Eder +Date: Wed, 28 Jan 2015 12:54:14 +0000 +Subject: [PATCH 34/38] [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 3e5bd4a..c5ea8a0 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.8.3.1 + + +From d4ae63afbf211a7234b7605bef037d827263bf70 Mon Sep 17 00:00:00 2001 +From: "Bryn M. Reeves" +Date: Wed, 28 Jan 2015 22:54:48 +0000 +Subject: [PATCH 35/38] [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 b206470..7fa7ac6 100644 +--- a/sos/plugins/__init__.py ++++ b/sos/plugins/__init__.py +@@ -520,13 +520,23 @@ class Plugin(object): + root = self.sysroot + else: + root = None ++ + result = sos_get_command_output(prog, timeout=timeout, stderr=stderr, + 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 6475619..d3a1048 100644 +--- a/sos/utilities.py ++++ b/sos/utilities.py +@@ -151,16 +151,13 @@ def sos_get_command_output(command, timeout=300, stderr=False, + stderr=STDOUT if stderr else PIPE, + 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.8.3.1 + + +From 6fe240a31c01d63957ce548f4415ca55859dc071 Mon Sep 17 00:00:00 2001 +From: Neependra Khare +Date: Thu, 29 Jan 2015 18:23:53 +0000 +Subject: [PATCH 36/38] [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.8.3.1 + + +From 8d69d74a5be6dac29fad2ab5d7206a0485969924 Mon Sep 17 00:00:00 2001 +From: "Bryn M. Reeves" +Date: Thu, 29 Jan 2015 20:30:31 +0000 +Subject: [PATCH 37/38] [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 | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/sos/plugins/__init__.py b/sos/plugins/__init__.py +index 7fa7ac6..a7c0146 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): +-- +1.8.3.1 + + +From 76c04a773f1927359d264f59e4fbcc9363424882 Mon Sep 17 00:00:00 2001 +From: "Bryn M. Reeves" +Date: Thu, 29 Jan 2015 22:00:10 +0000 +Subject: [PATCH 38/38] [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 +++ + sos/sosreport.py | 1 + + 2 files changed, 4 insertions(+) + +diff --git a/sos/plugins/__init__.py b/sos/plugins/__init__.py +index a7c0146..a06c0b1 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: +diff --git a/sos/sosreport.py b/sos/sosreport.py +index 27c756f..567e3df 100644 +--- a/sos/sosreport.py ++++ b/sos/sosreport.py +@@ -1226,6 +1226,7 @@ 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") +-- +1.8.3.1 + +From bb6f546603d8e3199bda0bfe0f9b23f1da1cb8c9 Mon Sep 17 00:00:00 2001 +From: Pavel Moravec +Date: Mon, 13 Jul 2015 15:03:37 +0200 +Subject: [PATCH] [plugin] pass stderr through _collect_cmd_output + +Commit f06efd6 removed passing stderr in _collect_cmd_output to +get_cmd_output_now. That prevents passing stderr=False in several +scenarios. + +This fix adds the argument to be passed back. + +Resolves: #600 + +Signed-off-by: Pavel Moravec +--- + 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 a06c0b1..aed7496 100644 +--- a/sos/plugins/__init__.py ++++ b/sos/plugins/__init__.py +@@ -696,7 +696,7 @@ class Plugin(object): + self._log_info("collecting output of '%s'" % prog) + self.get_cmd_output_now(prog, suggest_filename=suggest_filename, + root_symlink=root_symlink, timeout=timeout, +- chroot=chroot, runat=runat) ++ stderr=stderr, chroot=chroot, runat=runat) + + def _collect_strings(self): + for string, file_name in self.copy_strings: +-- +1.8.3.1 + diff --git a/SOURCES/sos-bz1194159-kernel-additional-diagnostic.patch b/SOURCES/sos-bz1194159-kernel-additional-diagnostic.patch new file mode 100644 index 0000000..1acf175 --- /dev/null +++ b/SOURCES/sos-bz1194159-kernel-additional-diagnostic.patch @@ -0,0 +1,276 @@ +From 9c1e646da727817de23c0b46a16885c03c7d4af1 Mon Sep 17 00:00:00 2001 +From: "Bryn M. Reeves" +Date: Tue, 10 Feb 2015 19:34:50 +0000 +Subject: [PATCH] [kernel] collect /sys/firmware/acpi/* + +Collect ACPI firmware tables and state from /sys. + +Related: #490. + +Signed-off-by: Bryn M. Reeves +--- + sos/plugins/kernel.py | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/sos/plugins/kernel.py b/sos/plugins/kernel.py +index 877b2bb..6b93ab7 100644 +--- a/sos/plugins/kernel.py ++++ b/sos/plugins/kernel.py +@@ -49,6 +49,7 @@ class Kernel(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): + "/sys/module/*/initstate", + "/sys/module/*/refcnt", + "/sys/module/*/taint", ++ "/sys/firmware/acpi/*", + "/proc/kallsyms", + "/proc/buddyinfo", + "/proc/slabinfo", +-- +1.8.3.1 + +From 14686f55bd5bc7169eb06a871ada7bc3461b306b Mon Sep 17 00:00:00 2001 +From: "Bryn M. Reeves" +Date: Tue, 10 Feb 2015 19:43:08 +0000 +Subject: [PATCH] [memory] add ksm, swap and vmallocinfo data to plugin + +Related: #490. + +Signed-off-by: Bryn M. Reeves +--- + sos/plugins/memory.py | 11 +++++++++-- + 1 file changed, 9 insertions(+), 2 deletions(-) + +diff --git a/sos/plugins/memory.py b/sos/plugins/memory.py +index 0f20e99..1b27eba 100644 +--- a/sos/plugins/memory.py ++++ b/sos/plugins/memory.py +@@ -27,9 +27,16 @@ class Memory(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): + "/proc/pci", + "/proc/meminfo", + "/proc/vmstat", ++ "/proc/swaps", + "/proc/slabinfo", +- "/proc/pagetypeinfo"]) ++ "/proc/pagetypeinfo", ++ "/proc/vmallocinfo", ++ "/sys/kernel/mm/ksm" ++ ]) + self.add_cmd_output("free", root_symlink="free") +- self.add_cmd_output("free -m") ++ self.add_cmd_output([ ++ "free -m", ++ "swapon --show" ++ ]) + + # vim: et ts=4 sw=4 +-- +1.8.3.1 + +From 58a6d777d7b5fc4ef72e185ccd916110a73f48d2 Mon Sep 17 00:00:00 2001 +From: "Bryn M. Reeves" +Date: Tue, 10 Feb 2015 19:47:14 +0000 +Subject: [PATCH] [block] collect /proc/diskstats + +Related: #490. + +Signed-off-by: Bryn M. Reeves +--- + sos/plugins/block.py | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/sos/plugins/block.py b/sos/plugins/block.py +index 8c73ef6..7984f0d 100644 +--- a/sos/plugins/block.py ++++ b/sos/plugins/block.py +@@ -24,8 +24,6 @@ class Block(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): + profiles = ('storage', 'hardware') + + def setup(self): +- self.add_copy_spec("/proc/partitions") +- + self.add_cmd_output([ + "lsblk", + "blkid -c /dev/null", +@@ -36,7 +34,9 @@ class Block(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): + # legacy location for non-/run distributions + self.add_copy_spec([ + "/etc/blkid.tab", +- "/run/blkid/blkid.tab" ++ "/run/blkid/blkid.tab", ++ "/proc/partitions", ++ "/proc/diskstats" + ]) + + if os.path.isdir("/sys/block"): +-- +1.8.3.1 + +From 4cc076409f65792c071e4cf027a78c847f7b5ff8 Mon Sep 17 00:00:00 2001 +From: "Bryn M. Reeves" +Date: Tue, 10 Feb 2015 19:48:59 +0000 +Subject: [PATCH] [process] collect /proc/sched_debug + +Related: #490. + +Signed-off-by: Bryn M. Reeves +--- + sos/plugins/process.py | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/sos/plugins/process.py b/sos/plugins/process.py +index ab66322..cae8443 100644 +--- a/sos/plugins/process.py ++++ b/sos/plugins/process.py +@@ -23,6 +23,7 @@ class Process(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): + profiles = ('system',) + + def setup(self): ++ self.add_copy_spec("/proc/sched_debug") + self.add_cmd_output("ps auxwww", root_symlink="ps") + self.add_cmd_output("pstree", root_symlink="pstree") + self.add_cmd_output("lsof -b +M -n -l", root_symlink="lsof") +-- +1.8.3.1 + +From f3ec78df7060c4ac3cead99775f162a9b5d604f7 Mon Sep 17 00:00:00 2001 +From: "Bryn M. Reeves" +Date: Wed, 11 Feb 2015 20:06:59 +0000 +Subject: [PATCH] [kernel] collect directory listings for module updates + +Related #490. + +Signed-off-by: Bryn M. Reeves +--- + sos/plugins/kernel.py | 14 +++++++++++++- + 1 file changed, 13 insertions(+), 1 deletion(-) + +diff --git a/sos/plugins/kernel.py b/sos/plugins/kernel.py +index 6b93ab7..97300e2 100644 +--- a/sos/plugins/kernel.py ++++ b/sos/plugins/kernel.py +@@ -14,6 +14,7 @@ + + from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin + import os ++import glob + + + class Kernel(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): +@@ -36,10 +37,21 @@ class Kernel(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): + except OSError: + self._log_warn("could not list %s" % self.sys_module) + ++ # find /lib/modules/*/{extras,updates,weak-updates} -ls ++ extra_mod_patterns = [ ++ "/lib/modules/*/extra", ++ "/lib/modules/*/updates", ++ "/lib/modules/*/weak-updates", ++ ] ++ extra_mod_paths = [] ++ for pattern in extra_mod_patterns: ++ extra_mod_paths.extend(glob.glob(pattern)) ++ + self.add_cmd_output([ + "dmesg", + "sysctl -a", +- "dkms status" ++ "dkms status", ++ "find %s -ls" % " ".join(extra_mod_paths) + ]) + + self.add_copy_spec([ +-- +1.8.3.1 + +From 895803a4c7d014b231cfe9804bd1c04fe37b5f5e Mon Sep 17 00:00:00 2001 +From: "Bryn M. Reeves" +Date: Wed, 11 Feb 2015 20:15:37 +0000 +Subject: [PATCH] [mpt] add plugin + +Add a plugin to collect LSI Message Passing Technology driver +status from /proc. + +Related: #490. + +Signed-off-by: Bryn M. Reeves +--- + sos/plugins/mpt.py | 30 ++++++++++++++++++++++++++++++ + 1 file changed, 30 insertions(+) + create mode 100644 sos/plugins/mpt.py + +diff --git a/sos/plugins/mpt.py b/sos/plugins/mpt.py +new file mode 100644 +index 0000000..bb158cc +--- /dev/null ++++ b/sos/plugins/mpt.py +@@ -0,0 +1,30 @@ ++# 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, DebianPlugin, UbuntuPlugin ++ ++ ++class Mpt(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): ++ """ LSI Message Passing Technology ++ """ ++ files = ('/proc/mpt',) ++ profiles = ('storage', ) ++ plugin_name = 'mpt' ++ ++ def setup(self): ++ self.add_copy_spec("/proc/mpt") ++ ++# vim: et ts=4 sw=4 +-- +1.8.3.1 + +From fc4e2be53eeeaa9ab0d4d089335bbeb007c1817e Mon Sep 17 00:00:00 2001 +From: "Bryn M. Reeves" +Date: Thu, 27 Aug 2015 18:07:46 +0100 +Subject: [PATCH] [memory] collect swapon --show output in bytes + +Default is human readable: + +$ swapon --show +NAME TYPE SIZE USED PRIO +/dev/dm-0 partition 1.5G 0B -1 + +Should be: + +$ swapon --show --bytes +NAME TYPE SIZE USED PRIO +/dev/dm-0 partition 1610608640 0 -1 + +Signed-off-by: Bryn M. Reeves +--- + sos/plugins/memory.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/sos/plugins/memory.py b/sos/plugins/memory.py +index 4c41896..710f73f 100644 +--- a/sos/plugins/memory.py ++++ b/sos/plugins/memory.py +@@ -36,7 +36,7 @@ class Memory(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): + self.add_cmd_output("free", root_symlink="free") + self.add_cmd_output([ + "free -m", +- "swapon --show" ++ "swapon --bytes --show" + ]) + + # vim: et ts=4 sw=4 +-- +1.8.3.1 + diff --git a/SOURCES/sos-bz1194554-network-more-diagnostic.patch b/SOURCES/sos-bz1194554-network-more-diagnostic.patch new file mode 100644 index 0000000..80b9754 --- /dev/null +++ b/SOURCES/sos-bz1194554-network-more-diagnostic.patch @@ -0,0 +1,57 @@ +From b61a927bade2f183e7cf9404b11a93570fe8895b Mon Sep 17 00:00:00 2001 +From: "Bryn M. Reeves" +Date: Tue, 10 Feb 2015 19:30:05 +0000 +Subject: [PATCH] [networking] additional ip, firewall and traffic shaping + commands + +Collect tc qdisc output, ipv4/6 routing policy, NOARP arp cache, +iptables with --exact counters, and iproute2 configuration. + +Signed-off-by: Bryn M. Reeves +--- + sos/plugins/networking.py | 10 ++++++++-- + 1 file changed, 8 insertions(+), 2 deletions(-) + +diff --git a/sos/plugins/networking.py b/sos/plugins/networking.py +index 8dfc0e6..9f6ece0 100644 +--- a/sos/plugins/networking.py ++++ b/sos/plugins/networking.py +@@ -82,7 +82,8 @@ class Networking(Plugin): + "/etc/NetworkManager/NetworkManager.conf", + "/etc/NetworkManager/system-connections", + "/etc/dnsmasq*", +- "/sys/class/net/*/flags" ++ "/sys/class/net/*/flags", ++ "/etc/iproute2" + ]) + self.add_forbidden_path("/proc/net/rpc/use-gss-proxy") + self.add_forbidden_path("/proc/net/rpc/*/channel") +@@ -98,19 +99,24 @@ class Networking(Plugin): + "netstat -agn", + "ip route show table all", + "ip -6 route show table all", ++ "ip -4 rule", ++ "ip -6 rule", + "ip link", + "ip address", + "ifenslave -a", + "ip mroute show", + "ip maddr show", + "ip neigh show", ++ "ip neigh show nud noarp", + "ip netns", + "nmcli general status", + "nmcli connection show", + "nmcli connection show active", + "nmcli device status", + "nmcli device show", +- "biosdevname -d" ++ "biosdevname -d", ++ "tc -s qdisc show", ++ "iptables -vnxL" + ]) + ip_link_result = self.call_ext_prog("ip -o link") + if ip_link_result['status'] == 0: +-- +1.8.3.1 + diff --git a/SOURCES/sos-bz1194556-infiniband-more-diagnostic.patch b/SOURCES/sos-bz1194556-infiniband-more-diagnostic.patch new file mode 100644 index 0000000..7371e67 --- /dev/null +++ b/SOURCES/sos-bz1194556-infiniband-more-diagnostic.patch @@ -0,0 +1,53 @@ +From 8eed8e33d1de2cd56a26fc7cc8a3ee25e8921319 Mon Sep 17 00:00:00 2001 +From: "Bryn M. Reeves" +Date: Tue, 10 Feb 2015 19:24:39 +0000 +Subject: [PATCH] [infiniband] add opensm and infiniband-diags support + +Collect opensm and rdma configuration and logs and output from +the infiniband-diags commands. + +Fixes #492. + +Signed-off-by: Bryn M. Reeves +--- + sos/plugins/infiniband.py | 13 ++++++++++--- + 1 file changed, 10 insertions(+), 3 deletions(-) + +diff --git a/sos/plugins/infiniband.py b/sos/plugins/infiniband.py +index b0437d7..687b8d6 100644 +--- a/sos/plugins/infiniband.py ++++ b/sos/plugins/infiniband.py +@@ -23,20 +23,27 @@ class Infiniband(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): + + plugin_name = 'infiniband' + profiles = ('hardware',) +- packages = ('libibverbs-utils',) ++ packages = ('libibverbs-utils', 'opensm', 'rdma', 'infiniband-diags') + + def setup(self): + self.add_copy_spec([ + "/etc/ofed/openib.conf", +- "/etc/ofed/opensm.conf" ++ "/etc/ofed/opensm.conf", ++ "/etc/rdma" + ]) + ++ self.add_copy_spec_limit("/var/log/opensm*", ++ sizelimit=self.get_option("log_size")) ++ + self.add_cmd_output([ + "ibv_devices", + "ibv_devinfo", + "ibstat", + "ibstatus", +- "ibhosts" ++ "ibhosts", ++ "iblinkinfo", ++ "sminfo", ++ "perfquery" + ]) + + return +-- +1.8.3.1 + diff --git a/SOURCES/sos-bz1195086-virsh-plugin.patch b/SOURCES/sos-bz1195086-virsh-plugin.patch new file mode 100644 index 0000000..e8c4536 --- /dev/null +++ b/SOURCES/sos-bz1195086-virsh-plugin.patch @@ -0,0 +1,131 @@ +From 5280e3c73894805662c831d1f6cadda8233cf402 Mon Sep 17 00:00:00 2001 +From: Pavel Moravec +Date: Fri, 3 Apr 2015 09:53:46 +0200 +Subject: [PATCH 1/3] [virsh] add new plugin + +Move the virsh commands and virt-manager logs into new plugin +(corresponding to the 'libvirt-client' package on Red Hat distros). + +Resolves #544 + +Signed-off-by: Pavel Moravec +Signed-off-by: Bryn M. Reeves +--- + sos/plugins/virsh.py | 46 ++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 46 insertions(+) + create mode 100644 sos/plugins/virsh.py + +diff --git a/sos/plugins/virsh.py b/sos/plugins/virsh.py +new file mode 100644 +index 0000000..4b6bcc0 +--- /dev/null ++++ b/sos/plugins/virsh.py +@@ -0,0 +1,46 @@ ++# 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 ++import glob ++import os ++ ++ ++class LibvirtClient(Plugin, RedHatPlugin, UbuntuPlugin, DebianPlugin): ++ """client for libvirt virtualization API ++ """ ++ ++ plugin_name = 'virsh' ++ profiles = ('system', 'virt') ++ ++ packages = ('libvirt-client') ++ ++ def setup(self): ++ # virt-manager logs ++ if not self.get_option("all_logs"): ++ self.add_copy_spec_limit("/root/.virt-manager/*", sizelimit=5) ++ else: ++ self.add_copy_spec("/root/.virt-manager/*") ++ ++ # get lit of VMs/domains ++ domains_file = self.get_cmd_output_now('virsh list --all') ++ ++ # cycle through the VMs/domains list, ignore 2 header lines and latest ++ # empty line, and dumpxml domain name in 2nd column ++ if domains_file: ++ domains_lines = open(domains_file, "r").read().splitlines()[2:] ++ for domain in filter(lambda x: x, domains_lines): ++ self.add_cmd_output("virsh dumpxml %s" % domain.split()[1]) ++ ++# vim: et ts=4 sw=4 +-- +1.8.3.1 + + +From 60373759aaa9f0668f0200e000e6c1949334597b Mon Sep 17 00:00:00 2001 +From: "Bryn M. Reeves" +Date: Tue, 30 Jun 2015 13:10:51 +0100 +Subject: [PATCH 2/3] [libvirt] add listing of /var/lib/libvirt/qemu + +Signed-off-by: Bryn M. Reeves +--- + sos/plugins/libvirt.py | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/sos/plugins/libvirt.py b/sos/plugins/libvirt.py +index 8d5dcfc..0b31d31 100644 +--- a/sos/plugins/libvirt.py ++++ b/sos/plugins/libvirt.py +@@ -58,6 +58,8 @@ class Libvirt(Plugin, RedHatPlugin, UbuntuPlugin, DebianPlugin): + if os.path.exists(libvirt_keytab): + self.add_cmd_output("klist -ket %s" % libvirt_keytab) + ++ self.add_cmd_output("ls -lR /var/lib/libvirt/qemu") ++ + def postproc(self): + for xmlfile in glob.glob("/etc/libvirt/qemu/*.xml"): + self.do_file_sub( +-- +1.8.3.1 + + +From 26fa7d3ae5a6c31030ac045aeaa32452ad888df8 Mon Sep 17 00:00:00 2001 +From: Pavel Moravec +Date: Fri, 15 May 2015 16:10:41 +0200 +Subject: [PATCH 3/3] [virsh] make dumpxml calls read-only and set timeout=180 + +Call virsh dumpxml in read-only mode to bypass authentication +and extend the command timeout to 180s. + +Resolves #544 + +Signed-off-by: Pavel Moravec +--- + sos/plugins/virsh.py | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/sos/plugins/virsh.py b/sos/plugins/virsh.py +index 4b6bcc0..0381b39 100644 +--- a/sos/plugins/virsh.py ++++ b/sos/plugins/virsh.py +@@ -41,6 +41,7 @@ class LibvirtClient(Plugin, RedHatPlugin, UbuntuPlugin, DebianPlugin): + if domains_file: + domains_lines = open(domains_file, "r").read().splitlines()[2:] + for domain in filter(lambda x: x, domains_lines): +- self.add_cmd_output("virsh dumpxml %s" % domain.split()[1]) ++ self.add_cmd_output("virsh -r dumpxml %s" % domain.split()[1], ++ timeout=180) + + # vim: et ts=4 sw=4 +-- +1.8.3.1 + diff --git a/SOURCES/sos-bz1195087-services-add-more-diagnostics.patch b/SOURCES/sos-bz1195087-services-add-more-diagnostics.patch new file mode 100644 index 0000000..19d8166 --- /dev/null +++ b/SOURCES/sos-bz1195087-services-add-more-diagnostics.patch @@ -0,0 +1,479 @@ +From b502b9f51b4d314ed6fa76d66a6db8aea7d32c12 Mon Sep 17 00:00:00 2001 +From: Pavel Moravec +Date: Sun, 31 May 2015 16:00:16 +0200 +Subject: [PATCH 1/8] [startup] rename plugin to 'services' + +The plugin is supposed to collect information about services +rather than about their startup. + +Signed-off-by: Pavel Moravec +--- + sos/plugins/services.py | 56 +++++++++++++++++++++++++++++++++++++++++++++++++ + sos/plugins/startup.py | 56 ------------------------------------------------- + 2 files changed, 56 insertions(+), 56 deletions(-) + create mode 100644 sos/plugins/services.py + delete mode 100644 sos/plugins/startup.py + +diff --git a/sos/plugins/services.py b/sos/plugins/services.py +new file mode 100644 +index 0000000..606a135 +--- /dev/null ++++ b/sos/plugins/services.py +@@ -0,0 +1,56 @@ ++# 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 Services(Plugin): ++ """System services ++ """ ++ ++ plugin_name = "services" ++ profiles = ('system', 'boot') ++ ++ option_list = [("servicestatus", "get a status of all running services", ++ "slow", False)] ++ ++ def setup(self): ++ self.add_copy_spec([ ++ "/etc/inittab", ++ "/etc/rc.d" ++ ]) ++ if self.get_option('servicestatus'): ++ self.add_cmd_output("/sbin/service --status-all") ++ self.add_cmd_output("/sbin/runlevel") ++ ++ ++class RedHatServices(Services, RedHatPlugin): ++ ++ def setup(self): ++ super(RedHatServices, self).setup() ++ self.add_cmd_output("/sbin/chkconfig --list", root_symlink="chkconfig") ++ ++ ++class DebianServices(Services, DebianPlugin, UbuntuPlugin): ++ ++ def setup(self): ++ super(DebianServices, self).setup() ++ self.add_copy_spec("/etc/rc*.d") ++ ++ self.add_cmd_output("/sbin/initctl show-config", ++ root_symlink="initctl") ++ if self.get_option('servicestatus'): ++ self.add_cmd_output("/sbin/initctl list") ++ ++# vim: et ts=4 sw=4 +diff --git a/sos/plugins/startup.py b/sos/plugins/startup.py +deleted file mode 100644 +index 9d92370..0000000 +--- a/sos/plugins/startup.py ++++ /dev/null +@@ -1,56 +0,0 @@ +-# 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 Startup(Plugin): +- """System startup +- """ +- +- plugin_name = "startup" +- profiles = ('system', 'boot') +- +- option_list = [("servicestatus", "get a status of all running services", +- "slow", False)] +- +- def setup(self): +- self.add_copy_spec([ +- "/etc/inittab", +- "/etc/rc.d" +- ]) +- if self.get_option('servicestatus'): +- self.add_cmd_output("/sbin/service --status-all") +- self.add_cmd_output("/sbin/runlevel") +- +- +-class RedHatStartup(Startup, RedHatPlugin): +- +- def setup(self): +- super(RedHatStartup, self).setup() +- self.add_cmd_output("/sbin/chkconfig --list", root_symlink="chkconfig") +- +- +-class DebianStartup(Startup, DebianPlugin, UbuntuPlugin): +- +- def setup(self): +- super(DebianStartup, self).setup() +- self.add_copy_spec("/etc/rc*.d") +- +- self.add_cmd_output("/sbin/initctl show-config", +- root_symlink="initctl") +- if self.get_option('servicestatus'): +- self.add_cmd_output("/sbin/initctl list") +- +-# vim: et ts=4 sw=4 +-- +1.8.3.1 + + +From 5204d62fdb362fb5cc4a897c90faa9539715fc74 Mon Sep 17 00:00:00 2001 +From: Pavel Moravec +Date: Tue, 7 Jul 2015 13:03:14 +0200 +Subject: [PATCH 2/8] [services] add "ls /var/lock/subsys" + +Signed-off-by: Pavel Moravec +--- + sos/plugins/services.py | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/sos/plugins/services.py b/sos/plugins/services.py +index 606a135..ab9f8ce 100644 +--- a/sos/plugins/services.py ++++ b/sos/plugins/services.py +@@ -32,7 +32,10 @@ class Services(Plugin): + ]) + if self.get_option('servicestatus'): + self.add_cmd_output("/sbin/service --status-all") +- self.add_cmd_output("/sbin/runlevel") ++ self.add_cmd_output([ ++ "/sbin/runlevel", ++ "ls /var/lock/subsys" ++ ]) + + + class RedHatServices(Services, RedHatPlugin): +-- +1.8.3.1 + + +From e00447e7ee346aa3be685a91ebba7cf208c4f205 Mon Sep 17 00:00:00 2001 +From: Pavel Moravec +Date: Sun, 31 May 2015 16:04:19 +0200 +Subject: [PATCH 3/8] [ntp] Collect "ntpq -p" output + +Partially solves #570 + +Signed-off-by: Pavel Moravec +--- + sos/plugins/ntp.py | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/sos/plugins/ntp.py b/sos/plugins/ntp.py +index 0e39b9d..c0f731d 100644 +--- a/sos/plugins/ntp.py ++++ b/sos/plugins/ntp.py +@@ -30,7 +30,10 @@ class Ntp(Plugin): + "/etc/ntp/step-tickers", + "/etc/ntp/ntpservers" + ]) +- self.add_cmd_output("ntptime") ++ self.add_cmd_output([ ++ "ntptime", ++ "ntpq -p" ++ ]) + + + class RedHatNtp(Ntp, RedHatPlugin): +-- +1.8.3.1 + + +From 83ef3aff955a33bb58c578479ac6b63a615b4521 Mon Sep 17 00:00:00 2001 +From: Pavel Moravec +Date: Sun, 31 May 2015 16:07:06 +0200 +Subject: [PATCH 4/8] [networking] Collect "ethtool -T $NIC" + +Partially solves #570 + +Signed-off-by: Pavel Moravec +--- + sos/plugins/networking.py | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/sos/plugins/networking.py b/sos/plugins/networking.py +index f2b06a6..b2c74c1 100644 +--- a/sos/plugins/networking.py ++++ b/sos/plugins/networking.py +@@ -184,6 +184,7 @@ class Networking(Plugin): + "ethtool -i "+eth, + "ethtool -k "+eth, + "ethtool -S "+eth, ++ "ethtool -T "+eth, + "ethtool -a "+eth, + "ethtool -c "+eth, + "ethtool -g "+eth +-- +1.8.3.1 + + +From 002cef3eddc288352d0b92f6272fbd2e85280e6e Mon Sep 17 00:00:00 2001 +From: Pavel Moravec +Date: Sun, 31 May 2015 16:17:40 +0200 +Subject: [PATCH 5/8] [ptp] Add new plugin for Precision time protocol + +Partially resolves #570 + +Signed-off-by: Pavel Moravec +--- + sos/plugins/ptp.py | 36 ++++++++++++++++++++++++++++++++++++ + 1 file changed, 36 insertions(+) + create mode 100644 sos/plugins/ptp.py + +diff --git a/sos/plugins/ptp.py b/sos/plugins/ptp.py +new file mode 100644 +index 0000000..a6ac648 +--- /dev/null ++++ b/sos/plugins/ptp.py +@@ -0,0 +1,36 @@ ++# Copyright (C) 2015 Pavel Moravec ++ ++# 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 Ptp(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): ++ """Precision time protocol ++ """ ++ ++ plugin_name = "ptp" ++ profiles = ('system', 'services') ++ ++ packages = ('linuxptp',) ++ ++ def setup(self): ++ self.add_copy_spec([ ++ "/etc/ptp4l.conf", ++ "/etc/timemaster.conf", ++ "/sys/class/ptp" ++ ]) ++ ++# vim: et ts=4 sw=4 +-- +1.8.3.1 + + +From 72e2e32eaa97c6c76b61635dd0fafeb4dcc1aa7d Mon Sep 17 00:00:00 2001 +From: Pavel Moravec +Date: Sun, 31 May 2015 16:19:29 +0200 +Subject: [PATCH 6/8] [process] Collect few "ps" outputs + +Partially solves $570 + +Signed-off-by: Pavel Moravec +(edits for readability & line length) +Signed-off-by: Bryn M. Reeves +--- + sos/plugins/process.py | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +diff --git a/sos/plugins/process.py b/sos/plugins/process.py +index 6ae189b..a643844 100644 +--- a/sos/plugins/process.py ++++ b/sos/plugins/process.py +@@ -23,13 +23,20 @@ class Process(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): + profiles = ('system',) + + def setup(self): ++ ps_axo = "ps axo" ++ # process group and thread options ++ ps_group_opts = "pid,ppid,user,group,lwp,nlwp,start_time,comm,cgroup" ++ ps_sched_opts = "flags,state,uid,pid,ppid,pgid,sid,cls,pri,addr,sz," ++ ps_sched_opts += "wchan,stime,tty,time,cmd" + self.add_copy_spec("/proc/sched_debug") + self.add_cmd_output("ps auxwww", root_symlink="ps") + self.add_cmd_output("pstree", root_symlink="pstree") + self.add_cmd_output("lsof -b +M -n -l", root_symlink="lsof") + self.add_cmd_output([ + "ps auxwwwm", +- "ps alxwww" ++ "ps alxwww", ++ "%s %s" % (ps_axo, ps_group_opts), ++ "%s %s" % (ps_axo, ps_sched_opts) + ]) + + # vim: et ts=4 sw=4 +-- +1.8.3.1 + + +From 0b9a4c545582ed73f89ee4a7572ecb631633819e Mon Sep 17 00:00:00 2001 +From: Pavel Moravec +Date: Sun, 31 May 2015 16:21:28 +0200 +Subject: [PATCH 7/8] [sysvipc] Collect "ipcs -u" + +Partially solves #570 + +Signed-off-by: Pavel Moravec +--- + sos/plugins/sysvipc.py | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/sos/plugins/sysvipc.py b/sos/plugins/sysvipc.py +index a0732e7..a98abf9 100644 +--- a/sos/plugins/sysvipc.py ++++ b/sos/plugins/sysvipc.py +@@ -29,6 +29,9 @@ class SysVIPC(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): + "/proc/sysvipc/sem", + "/proc/sysvipc/shm" + ]) +- self.add_cmd_output("ipcs") ++ self.add_cmd_output([ ++ "ipcs", ++ "ipcs -u" ++ ]) + + # vim: et ts=4 sw=4 +-- +1.8.3.1 + + +From fb7bbcf9e60002d75db383fac08244a7fa06a1d6 Mon Sep 17 00:00:00 2001 +From: Pavel Moravec +Date: Sun, 31 May 2015 16:24:23 +0200 +Subject: [PATCH 8/8] [devices] New plugin to collect "udevadm info + --export-db" + +Partially resolves #570 + +Signed-off-by: Pavel Moravec +--- + sos/plugins/devices.py | 28 ++++++++++++++++++++++++++++ + 1 file changed, 28 insertions(+) + create mode 100644 sos/plugins/devices.py + +diff --git a/sos/plugins/devices.py b/sos/plugins/devices.py +new file mode 100644 +index 0000000..5e0283a +--- /dev/null ++++ b/sos/plugins/devices.py +@@ -0,0 +1,28 @@ ++# 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 Devices(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): ++ """ devices specific commands ++ """ ++ ++ plugin_name = 'devices' ++ profiles = ('system', 'hardware', 'boot') ++ ++ def setup(self): ++ self.add_cmd_output("udevadm info --export-db") ++ ++# vim: et ts=4 sw=4 +-- +1.8.3.1 + +From c05fa2947937a5adc3496c4e66b649633de054e9 Mon Sep 17 00:00:00 2001 +From: Alexandru Juncu +Date: Tue, 24 Feb 2015 18:28:04 +0100 +Subject: [PATCH] [last] information about login actions + +This is useful information to be correlated with shutdown/reboot +events in /var/log/messages to identify graceful shutdowns/reboots +and lower false positives about system crashes. + +Resolves #572. + +Signed-off-by: Alexandru Juncu +Signed-off-by: Bryn M. Reeves +--- + sos/plugins/last.py | 33 +++++++++++++++++++++++++++++++++ + 1 file changed, 33 insertions(+) + create mode 100644 sos/plugins/last.py + +diff --git a/sos/plugins/last.py b/sos/plugins/last.py +new file mode 100644 +index 0000000..d6b791d +--- /dev/null ++++ b/sos/plugins/last.py +@@ -0,0 +1,33 @@ ++# 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 Last(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): ++ """login information ++ """ ++ ++ plugin_name = 'last' ++ profiles = ('system',) ++ ++ def setup(self): ++ self.add_cmd_output("last", root_symlink="last") ++ self.add_cmd_output([ ++ "last reboot", ++ "last shutdown", ++ "lastlog" ++ ]) ++ ++# vim: et ts=4 sw=4 +-- +1.8.3.1 + diff --git a/SOURCES/sos-bz1195608-sap-hana-netweaver-vhostmd-plugins.patch b/SOURCES/sos-bz1195608-sap-hana-netweaver-vhostmd-plugins.patch new file mode 100644 index 0000000..52c78e3 --- /dev/null +++ b/SOURCES/sos-bz1195608-sap-hana-netweaver-vhostmd-plugins.patch @@ -0,0 +1,612 @@ +From e768bf71c96317bc64b643ab9262cb88f1d9058c Mon Sep 17 00:00:00 2001 +From: Luca Miccini +Date: Tue, 24 Feb 2015 18:38:20 +0100 +Subject: [PATCH 1/7] [saphana] add SAP HANA plugin + +Add a plugin for the SAP HANA component and add it to a new 'sap' +profile. + +Signed-off-by: Luca Miccini +Signed-off-by: Bryn M. Reeves +--- + sos/plugins/saphana.py | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 84 insertions(+) + create mode 100644 sos/plugins/saphana.py + +diff --git a/sos/plugins/saphana.py b/sos/plugins/saphana.py +new file mode 100644 +index 0000000..2ff26f5 +--- /dev/null ++++ b/sos/plugins/saphana.py +@@ -0,0 +1,84 @@ ++# This program is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 2 of the License, or ++# (at your option) any later version. ++ ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++ ++# You should have received a copy of the GNU General Public License ++# along with this program; if not, write to the Free Software ++# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ ++import os ++from sos.plugins import Plugin, RedHatPlugin ++ ++ ++class saphana(Plugin, RedHatPlugin): ++ """SAP HANA""" ++ ++ plugin_name = 'saphana' ++ profiles = ['sap'] ++ ++ files = ['/hana'] ++ ++ def setup(self): ++ ++ sids = [] ++ ++ if os.path.isdir("/hana/shared"): ++ s = os.listdir("/hana/shared") ++ for sid in s: ++ if len(sid) == 3: ++ sid = sid.strip() ++ sids.append(sid) ++ ++ for sid in sids: ++ sidadm = '%sadm' % sid.lower() ++ ++ prefix = 'su - %s -c' % sidadm ++ ++ self.add_cmd_output('%s "HDB info"' % prefix, ++ suggest_filename="%s_HDB_info" % sid) ++ ++ self.add_cmd_output('%s "hdbsrvutil -v"' % prefix, ++ suggest_filename="%s_version" % sid) ++ ++ self.add_cmd_output('%s \'hdbcons "mm l -s -S -p"\'' % prefix, ++ suggest_filename="%s_memusage" % sid) ++ ++ self.add_cmd_output('%s \'hdbcons -e hdbindexserver \ ++ "replication info"\'' % prefix, ++ suggest_filename="%s_replicainfo" % sid) ++ ++ if os.path.isdir("/hana/shared/%s/" % sid): ++ i = os.listdir("/hana/shared/%s/" % sid) ++ for inst in i: ++ if "HDB" in inst: ++ inst = inst.strip()[-2:] ++ ++ # get GREEN/RED status ++ self.add_cmd_output( ++ 'su - %s -c "sapcontrol -nr %s \ ++ -function GetProcessList"' ++ % (sidadm, inst), ++ suggest_filename="%s_%s_status" ++ % (sid, inst) ++ ) ++ ++ path = '/usr/sap/%s/HDB%s/exe/python_support' ++ path %= (sid, inst) ++ ++ if os.path.isdir("%s" % path): ++ # SCALE OUT - slow ++ self.add_cmd_output( ++ 'su - %s -c "python \ ++ %s/landscapeHostConfiguration.py"' ++ % (sidadm, path), ++ suggest_filename="%s_%s_landscapeConfig" ++ % (sid, inst) ++ ) ++ ++# vim: et ts=4 sw=4 +-- +1.8.3.1 + + +From 581b05584410e48be998c98efe25ab9783641d1b Mon Sep 17 00:00:00 2001 +From: Luca Miccini +Date: Fri, 13 Mar 2015 12:43:08 +0100 +Subject: [PATCH 2/7] [vhostmd] add new plugin + +Add a plugin for the Virtual Host Metrics Daemon (vhostmd) to +collect VM performance metrics from the system. + +Fixes #527. + +Signed-off-by: Luca Miccini +Signed-off-by: Bryn M. Reeves +--- + sos/plugins/vhostmd.py | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 52 insertions(+) + create mode 100644 sos/plugins/vhostmd.py + +diff --git a/sos/plugins/vhostmd.py b/sos/plugins/vhostmd.py +new file mode 100644 +index 0000000..6711945 +--- /dev/null ++++ b/sos/plugins/vhostmd.py +@@ -0,0 +1,52 @@ ++# 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 vhostmd(Plugin, RedHatPlugin): ++ """vhostmd virtualization metrics collection ++ """ ++ ++ plugin_name = 'vhostmd' ++ profiles = ['sap'] ++ ++ packages = ['virt-what'] ++ ++ def setup(self): ++ vw = self.get_command_output("virt-what")['output'].splitlines() ++ ++ if not vw: ++ return ++ ++ if "vmware" in vw or "kvm" in vw or "xen" in vw: ++ # if vm-dump-metrics is installed use it ++ if self.is_installed("vm-dump-metrics"): ++ self.add_cmd_output("vm-dump-metrics", ++ suggest_filename="virt_metrics") ++ else: ++ # otherwise use the raw vhostmd disk presented (256k size) ++ d = self.get_command_output("lsblk -d") ++ for disk in d['output'].splitlines(): ++ if "256K" in disk: ++ dev = disk.split()[0] ++ check = self.get_command_output( ++ "dd if=/dev/%s bs=25 count=1" % dev) ++ if 'metric' in check['output']: ++ self.add_cmd_output("dd if=/dev/%s bs=256k count=1" ++ % dev, ++ suggest_filename="virt_\ ++ metrics") ++ ++# vim: et ts=4 sw=4 +-- +1.8.3.1 + + +From 8a710151c792a5f8bddba33de29976bb218b6701 Mon Sep 17 00:00:00 2001 +From: "Bryn M. Reeves" +Date: Tue, 30 Jun 2015 17:55:58 +0100 +Subject: [PATCH 3/7] [vhostmd] add plugin to the system and virt profiles + +Signed-off-by: Bryn M. Reeves +--- + sos/plugins/vhostmd.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/sos/plugins/vhostmd.py b/sos/plugins/vhostmd.py +index 6711945..786a7c1 100644 +--- a/sos/plugins/vhostmd.py ++++ b/sos/plugins/vhostmd.py +@@ -20,7 +20,7 @@ class vhostmd(Plugin, RedHatPlugin): + """ + + plugin_name = 'vhostmd' +- profiles = ['sap'] ++ profiles = ['sap', 'virt', 'system'] + + packages = ['virt-what'] + +-- +1.8.3.1 + + +From a5824f209c000d1a69ef305dd69f105400de3f4a Mon Sep 17 00:00:00 2001 +From: "Bryn M. Reeves" +Date: Tue, 30 Jun 2015 18:00:28 +0100 +Subject: [PATCH 4/7] [vhostmd] enumerate disks via /sys/block instead of + "lsblk -d" + +Signed-off-by: Bryn M. Reeves +--- + sos/plugins/vhostmd.py | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +diff --git a/sos/plugins/vhostmd.py b/sos/plugins/vhostmd.py +index 786a7c1..0a86fb5 100644 +--- a/sos/plugins/vhostmd.py ++++ b/sos/plugins/vhostmd.py +@@ -13,6 +13,7 @@ + # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + from sos.plugins import Plugin, RedHatPlugin ++import os + + + class vhostmd(Plugin, RedHatPlugin): +@@ -31,14 +32,16 @@ class vhostmd(Plugin, RedHatPlugin): + return + + if "vmware" in vw or "kvm" in vw or "xen" in vw: +- # if vm-dump-metrics is installed use it + if self.is_installed("vm-dump-metrics"): ++ # if vm-dump-metrics is installed use it + self.add_cmd_output("vm-dump-metrics", + suggest_filename="virt_metrics") + else: + # otherwise use the raw vhostmd disk presented (256k size) +- d = self.get_command_output("lsblk -d") +- for disk in d['output'].splitlines(): ++ sysblock = "/sys/block" ++ if not os.path.isdir(sysblock): ++ return ++ for disk in os.listdir(sysblock): + if "256K" in disk: + dev = disk.split()[0] + check = self.get_command_output( +-- +1.8.3.1 + + +From a191fc379d2ee3b4b42014eec4c3f83a6e423761 Mon Sep 17 00:00:00 2001 +From: Luca Miccini +Date: Tue, 24 Feb 2015 18:40:07 +0100 +Subject: [PATCH 5/7] [sapnw] add SAP NetWeaver plugin + +Closes #516. + +Signed-off-by: Luca Miccini +Signed-off-by: Bryn M. Reeves +--- + sos/plugins/sapnw.py | 131 +++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 131 insertions(+) + create mode 100644 sos/plugins/sapnw.py + +diff --git a/sos/plugins/sapnw.py b/sos/plugins/sapnw.py +new file mode 100644 +index 0000000..d2be8dd +--- /dev/null ++++ b/sos/plugins/sapnw.py +@@ -0,0 +1,131 @@ ++# This program is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 2 of the License, or ++# (at your option) any later version. ++ ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++ ++# You should have received a copy of the GNU General Public License ++# along with this program; if not, write to the Free Software ++# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ ++import os ++from sets import Set ++from sos.plugins import Plugin, RedHatPlugin ++ ++ ++class sapnw(Plugin, RedHatPlugin): ++ """SAP NetWeaver""" ++ ++ files = ['/usr/sap'] ++ ++ def setup(self): ++ ++ # list installed instances ++ self.add_cmd_output("/usr/sap/hostctrl/exe/saphostctrl \ ++ -function ListInstances", ++ suggest_filename="SAPInstances_List") ++ # list installed sap dbs ++ self.add_cmd_output("/usr/sap/hostctrl/exe/saphostctrl \ ++ -function ListDatabases", ++ suggest_filename="SAPDatabases_List") ++ ++ # list defined instances and guess profiles out of them ++ # (good for HA setups with virtual hostnames) ++ # using sap host control agent ++ ++ p = self.get_command_output( ++ "/usr/sap/hostctrl/exe/saphostctrl -function ListInstances") ++ ++ sidsunique = Set([]) ++ ++ # Cycle through all the instances, get 'sid' 'instance_number' ++ # and 'vhost' to determine the proper profile ++ for line in p['output'].splitlines(): ++ if "DAA" not in line: ++ fields = line.strip().split() ++ sid = fields[3] ++ inst = fields[5] ++ vhost = fields[7] ++ sidsunique.add(sid) ++ p = os.listdir("/usr/sap/%s/SYS/profile/" % sid) ++ for line in p: ++ if sid in line and inst in line and vhost in line: ++ ldenv = 'LD_LIBRARY_PATH=/usr/sap/%s/SYS/exe/run' % sid ++ pt = '/usr/sap/%s/SYS/exe/uc/linuxx86_64' % sid ++ profile = line.strip() ++ self.add_cmd_output( ++ "env -i %s %s/sappfpar \ ++ all pf=/usr/sap/%s/SYS/profile/%s" ++ % (ldenv, pt, sid, profile), ++ suggest_filename="%s_parameters" % profile) ++ ++ # collect instance status ++ self.add_cmd_output( ++ "env -i %s %s/sapcontrol -nr %s \ ++ -function GetProcessList" % (ldenv, pt, inst), ++ suggest_filename="%s_%s_GetProcList" % (sid, inst)) ++ ++ # collect version info for the various components ++ self.add_cmd_output( ++ "env -i %s %s/sapcontrol -nr %s \ ++ -function GetVersionInfo" % (ldenv, pt, inst), ++ suggest_filename="%s_%s_GetVersInfo" % (sid, inst)) ++ ++ # collect adm user environment ++ lowsid = sid.lower() ++ self.add_cmd_output( ++ "su - %sadm -c \"sapcontrol -nr %s -function \ ++ GetEnvironment\"" % (lowsid, inst), ++ suggest_filename="%s_%sadm_%s_userenv" ++ % (sid, lowsid, inst)) ++ ++ # traverse the sids list, collecting info about dbclient ++ for sid in sidsunique: ++ c = self.get_command_output("ls /usr/sap/%s/" % sid) ++ for line in c['output'].splitlines(): ++ if 'DVEB' in line: ++ self.add_cmd_output( ++ "grep 'client driver' /usr/sap/%s/%s/work/dev_w0" ++ % (sid, line), suggest_filename="%s_dbclient" % sid) ++ ++ # get the installed db's ++ d = self.get_command_output( ++ '/usr/sap/hostctrl/exe/saphostctrl -function ListDatabases') ++ ++ for line in d['output'].splitlines(): ++ if "Instance name" in line: ++ fields = line.strip().split() ++ dbadm = fields[2][:-1] ++ dbtype = fields[8][:-1] ++ sid = dbadm[3:].upper() ++ ++ if dbtype == 'db6': ++ self.add_cmd_output( ++ "su - %s -c \"db2 get dbm cfg\"" ++ % dbadm, suggest_filename="%s_%s_db2_info" ++ % (sid, dbadm)) ++ ++ if dbtype == 'sap': ++ sid = fields[2][:-1] ++ self.add_cmd_output( ++ "cat /sapdb/%s/data/config/%s.pah" ++ % (sid, sid), ++ suggest_filename="%s_%s_maxdb_info" ++ % (sid, dbadm)) ++ ++ if dbtype == 'ora': ++ sid = fields[2][:-1] ++ self.add_cmd_output( ++ "cat /oracle/%s/*/dbs/init.ora" % sid, ++ suggest_filename="%s_oracle_init.ora" % sid) ++ ++ # if sapconf available run it in check mode ++ if os.path.isfile("/usr/bin/sapconf"): ++ self.add_cmd_output( ++ "/usr/bin/sapconf -n", suggest_filename="sapconf_checkmode") ++ ++# vim: et ts=4 sw=4 +-- +1.8.3.1 + + +From 1d4185aa916703370f605f87341aa74563f06aa5 Mon Sep 17 00:00:00 2001 +From: Luca Miccini +Date: Mon, 2 Mar 2015 12:01:23 +0100 +Subject: [PATCH 6/7] [sapnw] add 'sapnw' as member of the 'sap' profile + +Signed-off-by: Luca Miccini +Signed-off-by: Bryn M. Reeves +--- + sos/plugins/sapnw.py | 74 +++++++++++++++++++++++++++++----------------------- + 1 file changed, 41 insertions(+), 33 deletions(-) + +diff --git a/sos/plugins/sapnw.py b/sos/plugins/sapnw.py +index d2be8dd..521556b 100644 +--- a/sos/plugins/sapnw.py ++++ b/sos/plugins/sapnw.py +@@ -17,46 +17,54 @@ from sets import Set + from sos.plugins import Plugin, RedHatPlugin + + ++def get_directory_listing(path): ++ try: ++ dir_list = os.listdir(path) ++ except: ++ dir_list = [] ++ return dir_list ++ ++ + class sapnw(Plugin, RedHatPlugin): + """SAP NetWeaver""" + ++ plugin_name = 'sapnw' ++ profiles = ['sap'] ++ + files = ['/usr/sap'] + + def setup(self): + + # list installed instances +- self.add_cmd_output("/usr/sap/hostctrl/exe/saphostctrl \ +- -function ListInstances", +- suggest_filename="SAPInstances_List") ++ inst_out = self.get_cmd_output_now("/usr/sap/hostctrl/exe/saphostctrl \ ++ -function ListInstances", ++ suggest_filename="SAPInstances") + # list installed sap dbs +- self.add_cmd_output("/usr/sap/hostctrl/exe/saphostctrl \ +- -function ListDatabases", +- suggest_filename="SAPDatabases_List") +- +- # list defined instances and guess profiles out of them +- # (good for HA setups with virtual hostnames) +- # using sap host control agent +- +- p = self.get_command_output( +- "/usr/sap/hostctrl/exe/saphostctrl -function ListInstances") ++ db_out = self.get_cmd_output_now("/usr/sap/hostctrl/exe/saphostctrl \ ++ -function ListDatabases", ++ suggest_filename="SAPDatabases") + + sidsunique = Set([]) + + # Cycle through all the instances, get 'sid' 'instance_number' + # and 'vhost' to determine the proper profile +- for line in p['output'].splitlines(): ++ p = open(inst_out, "r").read().splitlines() ++ for line in p: + if "DAA" not in line: + fields = line.strip().split() + sid = fields[3] + inst = fields[5] + vhost = fields[7] + sidsunique.add(sid) +- p = os.listdir("/usr/sap/%s/SYS/profile/" % sid) +- for line in p: ++ for line in get_directory_listing("/usr/sap/%s/SYS/profile/" ++ % sid): + if sid in line and inst in line and vhost in line: + ldenv = 'LD_LIBRARY_PATH=/usr/sap/%s/SYS/exe/run' % sid ++ # TODO: I am assuming unicode here ++ # nuc should be accounted + pt = '/usr/sap/%s/SYS/exe/uc/linuxx86_64' % sid + profile = line.strip() ++ # collect profiles + self.add_cmd_output( + "env -i %s %s/sappfpar \ + all pf=/usr/sap/%s/SYS/profile/%s" +@@ -67,13 +75,15 @@ class sapnw(Plugin, RedHatPlugin): + self.add_cmd_output( + "env -i %s %s/sapcontrol -nr %s \ + -function GetProcessList" % (ldenv, pt, inst), +- suggest_filename="%s_%s_GetProcList" % (sid, inst)) ++ suggest_filename="%s_%s_GetProcList" ++ % (sid, inst)) + + # collect version info for the various components + self.add_cmd_output( + "env -i %s %s/sapcontrol -nr %s \ + -function GetVersionInfo" % (ldenv, pt, inst), +- suggest_filename="%s_%s_GetVersInfo" % (sid, inst)) ++ suggest_filename="%s_%s_GetVersInfo" ++ % (sid, inst)) + + # collect adm user environment + lowsid = sid.lower() +@@ -85,18 +95,18 @@ class sapnw(Plugin, RedHatPlugin): + + # traverse the sids list, collecting info about dbclient + for sid in sidsunique: +- c = self.get_command_output("ls /usr/sap/%s/" % sid) +- for line in c['output'].splitlines(): ++ for line in get_directory_listing("/usr/sap/%s/" % sid): + if 'DVEB' in line: + self.add_cmd_output( + "grep 'client driver' /usr/sap/%s/%s/work/dev_w0" +- % (sid, line), suggest_filename="%s_dbclient" % sid) ++ % (sid, line), suggest_filename="%s_dbclient" ++ % sid) + +- # get the installed db's +- d = self.get_command_output( +- '/usr/sap/hostctrl/exe/saphostctrl -function ListDatabases') ++ if not db_out: ++ return ++ dbl = open(db_out, "r").read().splitlines() + +- for line in d['output'].splitlines(): ++ for line in dbl: + if "Instance name" in line: + fields = line.strip().split() + dbadm = fields[2][:-1] +@@ -104,24 +114,22 @@ class sapnw(Plugin, RedHatPlugin): + sid = dbadm[3:].upper() + + if dbtype == 'db6': ++ # IBM DB2 + self.add_cmd_output( + "su - %s -c \"db2 get dbm cfg\"" + % dbadm, suggest_filename="%s_%s_db2_info" + % (sid, dbadm)) + + if dbtype == 'sap': ++ # SAP MAXDB + sid = fields[2][:-1] +- self.add_cmd_output( +- "cat /sapdb/%s/data/config/%s.pah" +- % (sid, sid), +- suggest_filename="%s_%s_maxdb_info" +- % (sid, dbadm)) ++ self.add_copy_spec( ++ "/sapdb/%s/data/config/%s.pah" % (sid, sid)) + + if dbtype == 'ora': ++ # Oracle + sid = fields[2][:-1] +- self.add_cmd_output( +- "cat /oracle/%s/*/dbs/init.ora" % sid, +- suggest_filename="%s_oracle_init.ora" % sid) ++ self.add_copy_spec("/oracle/%s/*/dbs/init.ora" % sid) + + # if sapconf available run it in check mode + if os.path.isfile("/usr/bin/sapconf"): +-- +1.8.3.1 + + +From 5ac02f4fbc38992f23aa1f44974f74f7c4e16ea5 Mon Sep 17 00:00:00 2001 +From: Luca Miccini +Date: Wed, 11 Mar 2015 15:19:49 +0100 +Subject: [PATCH 7/7] [sapnw] add sybase ASE collection + +Signed-off-by: Luca Miccini +Signed-off-by: Bryn M. Reeves +--- + sos/plugins/sapnw.py | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/sos/plugins/sapnw.py b/sos/plugins/sapnw.py +index 521556b..e18978f 100644 +--- a/sos/plugins/sapnw.py ++++ b/sos/plugins/sapnw.py +@@ -131,6 +131,11 @@ class sapnw(Plugin, RedHatPlugin): + sid = fields[2][:-1] + self.add_copy_spec("/oracle/%s/*/dbs/init.ora" % sid) + ++ if dbtype == 'syb': ++ # Sybase ++ sid = fields[2][:-1] ++ self.add_copy_spec("/sybase/%s/ASE*/%s.cfg" % (sid, sid)) ++ + # if sapconf available run it in check mode + if os.path.isfile("/usr/bin/sapconf"): + self.add_cmd_output( +-- +1.8.3.1 + diff --git a/SOURCES/sos-bz1195608-sapnw-cmd-output-check.patch b/SOURCES/sos-bz1195608-sapnw-cmd-output-check.patch new file mode 100644 index 0000000..7c90b77 --- /dev/null +++ b/SOURCES/sos-bz1195608-sapnw-cmd-output-check.patch @@ -0,0 +1,153 @@ +From 24fb011755e655127b7e09f4c02275539666b4b2 Mon Sep 17 00:00:00 2001 +From: Pavel Moravec +Date: Wed, 29 Jul 2015 14:47:19 +0200 +Subject: [PATCH] [sapnw] uses a deprecated Sets module + +Use built-in set class instead of deprecated Set for sidsunique + +Resolves: #608 + +Signed-off-by: Pavel Moravec +Signed-off-by: Adam Stokes +--- + sos/plugins/sapnw.py | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/sos/plugins/sapnw.py b/sos/plugins/sapnw.py +index e18978f..59beff2 100644 +--- a/sos/plugins/sapnw.py ++++ b/sos/plugins/sapnw.py +@@ -13,7 +13,6 @@ + # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + import os +-from sets import Set + from sos.plugins import Plugin, RedHatPlugin + + +@@ -44,7 +43,7 @@ class sapnw(Plugin, RedHatPlugin): + -function ListDatabases", + suggest_filename="SAPDatabases") + +- sidsunique = Set([]) ++ sidsunique = set() + + # Cycle through all the instances, get 'sid' 'instance_number' + # and 'vhost' to determine the proper profile +-- +1.8.3.1 + +From 10059897ceb0755bab844011f11ea6c6af8794ae Mon Sep 17 00:00:00 2001 +From: Pavel Moravec +Date: Tue, 28 Jul 2015 13:50:54 +0200 +Subject: [PATCH] [sapnw] Add check if saphostctrl is not present + +Split listing&collecting instances and dbs from lengthy setup(). + +Break execution when "inst_out = self.get_cmd_output_now" returns None. + +db_out is already checked this way. + +Resolves: #614 + +Signed-off-by: Pavel Moravec +--- + sos/plugins/sapnw.py | 30 +++++++++++++++++------------- + 1 file changed, 17 insertions(+), 13 deletions(-) + +diff --git a/sos/plugins/sapnw.py b/sos/plugins/sapnw.py +index 59beff2..d2c93ec 100644 +--- a/sos/plugins/sapnw.py ++++ b/sos/plugins/sapnw.py +@@ -32,20 +32,16 @@ class sapnw(Plugin, RedHatPlugin): + + files = ['/usr/sap'] + +- def setup(self): +- ++ def collect_list_instances(self): + # list installed instances + inst_out = self.get_cmd_output_now("/usr/sap/hostctrl/exe/saphostctrl \ + -function ListInstances", + suggest_filename="SAPInstances") +- # list installed sap dbs +- db_out = self.get_cmd_output_now("/usr/sap/hostctrl/exe/saphostctrl \ +- -function ListDatabases", +- suggest_filename="SAPDatabases") ++ if not inst_out: ++ return + + sidsunique = set() +- +- # Cycle through all the instances, get 'sid' 'instance_number' ++ # Cycle through all the instances, get 'sid', 'instance_number' + # and 'vhost' to determine the proper profile + p = open(inst_out, "r").read().splitlines() + for line in p: +@@ -101,10 +97,15 @@ class sapnw(Plugin, RedHatPlugin): + % (sid, line), suggest_filename="%s_dbclient" + % sid) + ++ def collect_list_dbs(self): ++ # list installed sap dbs ++ db_out = self.get_cmd_output_now("/usr/sap/hostctrl/exe/saphostctrl \ ++ -function ListDatabases", ++ suggest_filename="SAPDatabases") + if not db_out: + return +- dbl = open(db_out, "r").read().splitlines() + ++ dbl = open(db_out, "r").read().splitlines() + for line in dbl: + if "Instance name" in line: + fields = line.strip().split() +@@ -135,9 +136,12 @@ class sapnw(Plugin, RedHatPlugin): + sid = fields[2][:-1] + self.add_copy_spec("/sybase/%s/ASE*/%s.cfg" % (sid, sid)) + +- # if sapconf available run it in check mode +- if os.path.isfile("/usr/bin/sapconf"): +- self.add_cmd_output( +- "/usr/bin/sapconf -n", suggest_filename="sapconf_checkmode") ++ def setup(self): ++ collect_list_instances() ++ collect_list_dbs() ++ ++ # run sapconf in check mode ++ self.add_cmd_output("sapconf -n", ++ suggest_filename="sapconf_checkmode") + + # vim: et ts=4 sw=4 +-- +1.8.3.1 + +From 1f83971325629cb3f470dac74de1be49f095118e Mon Sep 17 00:00:00 2001 +From: Pavel Moravec +Date: Tue, 4 Aug 2015 10:44:37 +0200 +Subject: [PATCH] [sapnw] call self methods properly + +Call methods from the self class within "self." scope. + +Signed-off-by: Pavel Moravec +--- + sos/plugins/sapnw.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/sos/plugins/sapnw.py b/sos/plugins/sapnw.py +index d2c93ec..be8c4b9 100644 +--- a/sos/plugins/sapnw.py ++++ b/sos/plugins/sapnw.py +@@ -137,8 +137,8 @@ class sapnw(Plugin, RedHatPlugin): + self.add_copy_spec("/sybase/%s/ASE*/%s.cfg" % (sid, sid)) + + def setup(self): +- collect_list_instances() +- collect_list_dbs() ++ self.collect_list_instances() ++ self.collect_list_dbs() + + # run sapconf in check mode + self.add_cmd_output("sapconf -n", +-- +1.8.3.1 + diff --git a/SOURCES/sos-bz1197006-rabbitmq-cluster-status.patch b/SOURCES/sos-bz1197006-rabbitmq-cluster-status.patch new file mode 100644 index 0000000..a7d06d6 --- /dev/null +++ b/SOURCES/sos-bz1197006-rabbitmq-cluster-status.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] [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.8.3.1 + diff --git a/SOURCES/sos-bz1200526-cluster-crmreport-create-dir.patch b/SOURCES/sos-bz1200526-cluster-crmreport-create-dir.patch new file mode 100644 index 0000000..3453e19 --- /dev/null +++ b/SOURCES/sos-bz1200526-cluster-crmreport-create-dir.patch @@ -0,0 +1,31 @@ +From 147c496d5b2a33b7534ac66dbfb7705ae7ccb7bd Mon Sep 17 00:00:00 2001 +From: Shane Bradley +Date: Wed, 11 Mar 2015 09:55:06 -0400 +Subject: [PATCH] [cluster] crm_report fails to run because dir already exists + +Do not create directory for the destination path used by crm_report. + +Resolves: rhbz#1200526 + +Signed-off-by: Shane Bradley +Signed-off-by: Bryn M. Reeves +--- + sos/plugins/cluster.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/sos/plugins/cluster.py b/sos/plugins/cluster.py +index bd2cf8a..8dd9a4d 100644 +--- a/sos/plugins/cluster.py ++++ b/sos/plugins/cluster.py +@@ -111,7 +111,7 @@ class Cluster(Plugin, RedHatPlugin): + "crm_from parameter '%s' is not a valid date: using " + "default" % self.get_option('crm_from')) + +- crm_dest = self.get_cmd_output_path(name='crm_report') ++ crm_dest = self.get_cmd_output_path(name='crm_report', make=False) + self.add_cmd_output('crm_report -S -d --dest %s --from "%s"' + % (crm_dest, crm_from)) + +-- +1.8.3.1 + diff --git a/SOURCES/sos-bz1201843-cluster-crmreport-create-dir.patch b/SOURCES/sos-bz1201843-cluster-crmreport-create-dir.patch deleted file mode 100644 index 3453e19..0000000 --- a/SOURCES/sos-bz1201843-cluster-crmreport-create-dir.patch +++ /dev/null @@ -1,31 +0,0 @@ -From 147c496d5b2a33b7534ac66dbfb7705ae7ccb7bd Mon Sep 17 00:00:00 2001 -From: Shane Bradley -Date: Wed, 11 Mar 2015 09:55:06 -0400 -Subject: [PATCH] [cluster] crm_report fails to run because dir already exists - -Do not create directory for the destination path used by crm_report. - -Resolves: rhbz#1200526 - -Signed-off-by: Shane Bradley -Signed-off-by: Bryn M. Reeves ---- - sos/plugins/cluster.py | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/sos/plugins/cluster.py b/sos/plugins/cluster.py -index bd2cf8a..8dd9a4d 100644 ---- a/sos/plugins/cluster.py -+++ b/sos/plugins/cluster.py -@@ -111,7 +111,7 @@ class Cluster(Plugin, RedHatPlugin): - "crm_from parameter '%s' is not a valid date: using " - "default" % self.get_option('crm_from')) - -- crm_dest = self.get_cmd_output_path(name='crm_report') -+ crm_dest = self.get_cmd_output_path(name='crm_report', make=False) - self.add_cmd_output('crm_report -S -d --dest %s --from "%s"' - % (crm_dest, crm_from)) - --- -1.8.3.1 - diff --git a/SOURCES/sos-bz1209454-networking-ip-addr.patch b/SOURCES/sos-bz1209454-networking-ip-addr.patch new file mode 100644 index 0000000..c2cd2bf --- /dev/null +++ b/SOURCES/sos-bz1209454-networking-ip-addr.patch @@ -0,0 +1,28 @@ +From 79d90ff649f89f784bdf41769f2326faa11cb7b0 Mon Sep 17 00:00:00 2001 +From: "Bryn M. Reeves" +Date: Tue, 17 Mar 2015 13:50:37 +0000 +Subject: [PATCH] [networking] re-add 'ip addr' with a root symlink + +Commit e320ca8 accidentally deleted collection of "ip -o addr" +and the root "ip_addr" symlink: put it back. + +Signed-off-by: Bryn M. Reeves +--- + sos/plugins/networking.py | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/sos/plugins/networking.py b/sos/plugins/networking.py +index ae6cb1b..ae5ea71 100644 +--- a/sos/plugins/networking.py ++++ b/sos/plugins/networking.py +@@ -89,6 +89,7 @@ class Networking(Plugin): + self.add_forbidden_path("/proc/net/rpc/*/channel") + self.add_forbidden_path("/proc/net/rpc/*/flush") + ++ self.add_cmd_output("ip -o addr", root_symlink = "ip_addr") + self.add_cmd_output("route -n", root_symlink="route") + self.collect_iptable("filter") + self.collect_iptable("nat") +-- +1.8.3.1 + diff --git a/SOURCES/sos-bz1209840-kimchid-plugin.patch b/SOURCES/sos-bz1209840-kimchid-plugin.patch new file mode 100644 index 0000000..748e8f4 --- /dev/null +++ b/SOURCES/sos-bz1209840-kimchid-plugin.patch @@ -0,0 +1,99 @@ +From 3aabd18b2666dbbeb86871ac4b9f025e468d5818 Mon Sep 17 00:00:00 2001 +From: Christy Perez +Date: Tue, 16 Dec 2014 12:46:27 +0000 +Subject: [PATCH] [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.8.3.1 + +From cb9805d129827178df5b32fc681f629d4f40ac6e Mon Sep 17 00:00:00 2001 +From: "Bryn M. Reeves" +Date: Tue, 10 Feb 2015 19:09:26 +0000 +Subject: [PATCH] [kimchi] fix collection of /etc/kimchi + +Signed-off-by: Bryn M. Reeves +--- + sos/plugins/kimchi.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/sos/plugins/kimchi.py b/sos/plugins/kimchi.py +index 613b2c9..efb469e 100644 +--- a/sos/plugins/kimchi.py ++++ b/sos/plugins/kimchi.py +@@ -26,6 +26,7 @@ class Kimchi(Plugin, RedHatPlugin, UbuntuPlugin, DebianPlugin): + + def setup(self): + log_limit = self.get_option('log_size') ++ self.add_copy_spec('/etc/kimchi/') + if not self.get_option('all_logs'): + self.add_copy_spec_limit('/var/log/kimchi/*.log', + sizelimit=log_limit) +@@ -35,6 +36,5 @@ class Kimchi(Plugin, RedHatPlugin, UbuntuPlugin, DebianPlugin): + sizelimit=log_limit) + else: + self.add_copy_spec('/var/log/kimchi/') +- self.add_copy_spec('/etc/kimchi/') + + # vim: expandtab tabstop=4 shiftwidth=4 +-- +1.8.3.1 + diff --git a/SOURCES/sos-bz1210527-ceph-add-calamari-rados.patch b/SOURCES/sos-bz1210527-ceph-add-calamari-rados.patch new file mode 100644 index 0000000..ed9dfcb --- /dev/null +++ b/SOURCES/sos-bz1210527-ceph-add-calamari-rados.patch @@ -0,0 +1,93 @@ +From 24ecc933d109c0eba120b434d08aa560e9a56869 Mon Sep 17 00:00:00 2001 +From: Pavel Moravec +Date: Wed, 1 Jul 2015 12:15:41 +0200 +Subject: [PATCH 1/2] [ceph] add logs, report and calamari conf + +Update ceph commands and add log and configuration file +collection for calamari and radosgw. + +Resolves: #496 +Resolves: rhbz#1210527 + +Signed-off-by: Brad Hubbard +Signed-off-by: Pavel Moravec +Signed-off-by: Bryn M. Reeves +--- + sos/plugins/ceph.py | 11 ++++++++--- + 1 file changed, 8 insertions(+), 3 deletions(-) + +diff --git a/sos/plugins/ceph.py b/sos/plugins/ceph.py +index 52b8fff..0bfdbe0 100644 +--- a/sos/plugins/ceph.py ++++ b/sos/plugins/ceph.py +@@ -37,17 +37,22 @@ class Ceph(Plugin, RedHatPlugin, UbuntuPlugin): + def setup(self): + self.add_copy_spec([ + "/etc/ceph/", +- "/var/log/ceph/" ++ "/var/log/ceph/", ++ "/etc/calamari/", ++ "/var/log/calamari", ++ "/var/log/radosgw" + ]) + + self.add_cmd_output([ + "ceph status", +- "ceph health", ++ "ceph health detail", + "ceph osd tree", + "ceph osd stat", + "ceph osd dump", + "ceph mon stat", +- "ceph mon dump" ++ "ceph mon dump", ++ "ceph df", ++ "ceph report" + ]) + + self.add_forbidden_path("/etc/ceph/*keyring") +-- +1.8.3.1 + + +From 696f3c605c5d6b0cb8c0703635401991bc7af934 Mon Sep 17 00:00:00 2001 +From: Pavel Moravec +Date: Thu, 2 Jul 2015 13:10:31 +0200 +Subject: [PATCH 2/2] [ceph] add calamari-server and librados2 to the package + list + +Enable ceph plugin also by either calamari-server or librados2 +package. + +This ensures Calamari and Rados log collection is effective +regardless of which packages are installed on a given system. + +This is a temporary solution until rados is split from the ceph +package. + +Resolves: #496 + +Signed-off-by: Pavel Moravec +Signed-off-by: Bryn M. Reeves +--- + sos/plugins/ceph.py | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/sos/plugins/ceph.py b/sos/plugins/ceph.py +index 0bfdbe0..e9db4c6 100644 +--- a/sos/plugins/ceph.py ++++ b/sos/plugins/ceph.py +@@ -31,7 +31,9 @@ class Ceph(Plugin, RedHatPlugin, UbuntuPlugin): + 'ceph-mds', + 'ceph-common', + 'libcephfs1', +- 'ceph-fs-common' ++ 'ceph-fs-common', ++ 'calamari-server', ++ 'librados2' + ) + + def setup(self): +-- +1.8.3.1 + diff --git a/SOURCES/sos-bz1210906-mariadb-mysql-add-log.patch b/SOURCES/sos-bz1210906-mariadb-mysql-add-log.patch new file mode 100644 index 0000000..6d57ebe --- /dev/null +++ b/SOURCES/sos-bz1210906-mariadb-mysql-add-log.patch @@ -0,0 +1,37 @@ +From f8ab86cbd2302812cd9160bec4478cb4f84e1442 Mon Sep 17 00:00:00 2001 +From: Shane Bradley +Date: Mon, 27 Apr 2015 10:28:34 -0400 +Subject: [PATCH] [mysql] Collect log file + +When MariaDB is run under Pacemaker an OCF resource agent is used +to start and stop the database. This configuration also overrides +the log paths used for the database. In particular the mysqld.log +is present at '/var/log/mysqld.log'. + +Collect both paths as we do not currently detect whether we are +running with an OCF agent or stand-alone. + +Fixes: #554 + +Signed-off-by: Shane Bradley +Signed-off-by: Bryn M. Reeves +--- + sos/plugins/mysql.py | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/sos/plugins/mysql.py b/sos/plugins/mysql.py +index 8dba204..aa8e9b9 100644 +--- a/sos/plugins/mysql.py ++++ b/sos/plugins/mysql.py +@@ -37,6 +37,8 @@ class Mysql(Plugin): + + self.add_copy_spec([ + self.mysql_cnf, ++ # Required for MariaDB under pacemaker (MariaDB-Galera) ++ "/var/log/mysqld.log", + "/var/log/mysql/mysqld.log", + "/var/log/mariadb/mariadb.log", + ]) +-- +1.8.3.1 + diff --git a/SOURCES/sos-bz1211984-openstack-sahara-plugin.patch b/SOURCES/sos-bz1211984-openstack-sahara-plugin.patch new file mode 100644 index 0000000..23d0eb9 --- /dev/null +++ b/SOURCES/sos-bz1211984-openstack-sahara-plugin.patch @@ -0,0 +1,88 @@ +From f1a7aea0f45485cbe12e95f38c6b0dc6ad12dd58 Mon Sep 17 00:00:00 2001 +From: Poornima +Date: Thu, 9 Apr 2015 18:47:58 +0530 +Subject: [PATCH] [openstack_sahara] add new plugin + +Capture configuration and log data for the OpenStack Sahara project +(formerly Savanna). Sahara is a tool to simplify the deployment of +data-intensive applications in OpenStack environments. + +Signed-off-by: Poornima M. Kshirsagar pkshiras@redhat.com +Signed-off-by: Bryn M. Reeves bmr@redhat.com +--- + sos/plugins/openstack_sahara.py | 63 +++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 63 insertions(+) + create mode 100644 sos/plugins/openstack_sahara.py + +diff --git a/sos/plugins/openstack_sahara.py b/sos/plugins/openstack_sahara.py +new file mode 100644 +index 0000000..f0b95e4 +--- /dev/null ++++ b/sos/plugins/openstack_sahara.py +@@ -0,0 +1,63 @@ ++# Copyright (C) 2015 Red Hat, Inc.,Poornima M. Kshirsagar ++ ++# 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 OpenStackSahara(Plugin): ++ """OpenStack Sahara""" ++ plugin_name = 'openstack_sahara' ++ profiles = ('openstack',) ++ ++ option_list = [("log", "gathers openstack sahara logs", "slow", True)] ++ ++ def setup(self): ++ self.add_copy_spec("/etc/sahara/") ++ self.add_cmd_output("journalctl -u openstack-sahara-all") ++ ++ if self.get_option("log"): ++ self.add_copy_spec("/var/log/sahara/") ++ ++ ++class DebianOpenStackSahara(OpenStackSahara, DebianPlugin, UbuntuPlugin): ++ """OpenStackSahara related information for Debian based distributions.""" ++ ++ packages = ( ++ 'sahara-api', ++ 'sahara-common', ++ 'sahara-engine', ++ 'python-sahara', ++ 'python-saharaclient', ++ ) ++ ++ def setup(self): ++ super(DebianOpenStackSahara, self).setup() ++ ++ ++class RedHatOpenStackSahara(OpenStackSahara, RedHatPlugin): ++ """OpenStack sahara related information for Red Hat distributions.""" ++ ++ packages = ( ++ 'openstack-sahara', ++ 'python-saharaclient' ++ ) ++ ++ def setup(self): ++ super(RedHatOpenStackSahara, self).setup() ++ self.add_copy_spec("/etc/sudoers.d/sahara") ++ ++ ++# vim: et ts=4 sw=4 +-- +1.8.3.1 + diff --git a/SOURCES/sos-bz1211984-redact-secrets-from-sahara-config.patch b/SOURCES/sos-bz1211984-redact-secrets-from-sahara-config.patch new file mode 100644 index 0000000..a8cb062 --- /dev/null +++ b/SOURCES/sos-bz1211984-redact-secrets-from-sahara-config.patch @@ -0,0 +1,35 @@ +From 706e523d608b588cfd70b2dfa957feafe0645796 Mon Sep 17 00:00:00 2001 +From: Rohan Kanade +Date: Mon, 15 Jun 2015 20:24:10 +0530 +Subject: [PATCH] [openstack_sahara] redact secrets from sahara configuration + +Signed-off-by: Rohan Kanade +--- + sos/plugins/openstack_sahara.py | 11 +++++++++++ + 1 files changed, 11 insertions(+), 0 deletions(-) + +diff --git a/sos/plugins/openstack_sahara.py b/sos/plugins/openstack_sahara.py +index f0b95e4..9d971ba 100644 +--- a/sos/plugins/openstack_sahara.py ++++ b/sos/plugins/openstack_sahara.py +@@ -31,6 +31,17 @@ class OpenStackSahara(Plugin): + if self.get_option("log"): + self.add_copy_spec("/var/log/sahara/") + ++ def postproc(self): ++ protect_keys = [ ++ 'memcache_secret_key', 'qpid_password', 'rabbit_password', ++ 'admin_password', 'password', 'ssl_key_password', ++ 'admin_token', 'connection' ++ ] ++ ++ regexp = r"((?m)^\s*#*(%s)\s*=\s*)(.*)" % "|".join(protect_keys) ++ ++ self.do_file_sub('/etc/sahara/sahara.conf', regexp, r"\1*********") ++ + + class DebianOpenStackSahara(OpenStackSahara, DebianPlugin, UbuntuPlugin): + """OpenStackSahara related information for Debian based distributions.""" +-- +1.7.1 + diff --git a/SOURCES/sos-bz1214209-hpasm-no-data-timeout.patch b/SOURCES/sos-bz1214209-hpasm-no-data-timeout.patch new file mode 100644 index 0000000..731097d --- /dev/null +++ b/SOURCES/sos-bz1214209-hpasm-no-data-timeout.patch @@ -0,0 +1,35 @@ +From 61a5b47d4fe4fd47e759b9acc19483491ec17005 Mon Sep 17 00:00:00 2001 +From: Pavel Moravec +Date: Tue, 5 May 2015 13:50:55 +0200 +Subject: [PATCH] [hpasm] hpasmcli commands hang under timeout + +When hpasmcli is run in a python Popen or system pipeline via the +timeout command it hangs indefinitely. + +Work around this temporarily by disabling the use of the timeout +program (by passing a zero timeout value) when running this +command. + +Fixes: #559 + +Signed-off-by: Pavel Moravec +Signed-off-by: Bryn M. Reeves +--- + sos/plugins/hpasm.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/sos/plugins/hpasm.py b/sos/plugins/hpasm.py +index 4d5d158..4d70887 100644 +--- a/sos/plugins/hpasm.py ++++ b/sos/plugins/hpasm.py +@@ -30,6 +30,6 @@ class Hpasm(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): + self.add_cmd_output([ + "hpasmcli -s 'show asr'", + "hpasmcli -s 'show server'" +- ]) ++ ], timeout=0) + + # vim: et ts=4 sw=4 +-- +1.8.3.1 + diff --git a/SOURCES/sos-bz1219720-html-report-generate.patch b/SOURCES/sos-bz1219720-html-report-generate.patch new file mode 100644 index 0000000..a87f0ea --- /dev/null +++ b/SOURCES/sos-bz1219720-html-report-generate.patch @@ -0,0 +1,84 @@ +From c607cac7256ced5d1396ae61591f9eae4a9d385f Mon Sep 17 00:00:00 2001 +From: Pavel Moravec +Date: Fri, 18 Sep 2015 09:25:39 +0200 +Subject: [PATCH] [sosreport] fix command-line report defaults + +opts.report is True regardless of using --no-report option or not. That +means the test "if not self.opts.report:" to decide generation of +reports is evaluated to False every time and no report is generated any +time. + +This commit renames opts.report and SoSOptions._report to noreport (to +get rid of the variable name confusion) and updates default value +accordingly. + +Resolves #625 +Closes #644 + +Signed-off-by: Pavel Moravec +Signed-off-by: Adam Stokes +--- + sos/sosreport.py | 22 +++++++++++----------- + 1 file changed, 11 insertions(+), 11 deletions(-) + +diff --git a/sos/sosreport.py b/sos/sosreport.py +index 02d8a32..a1f1b96 100644 +--- a/sos/sosreport.py ++++ b/sos/sosreport.py +@@ -250,7 +250,7 @@ class SoSOptions(object): + _list_profiles = False + _config_file = "" + _tmp_dir = "" +- _report = True ++ _noreport = False + _sysroot = None + _chroot = 'auto' + _compression_type = 'auto' +@@ -522,17 +522,17 @@ class SoSOptions(object): + self._tmp_dir = value + + @property +- def report(self): ++ def noreport(self): + if self._options is not None: +- return self._options.report +- return self._report ++ return self._options.noreport ++ return self._noreport + +- @report.setter +- def report(self, value): ++ @noreport.setter ++ def noreport(self, value): + self._check_options_initialized() + if not isinstance(value, bool): +- raise TypeError("SoSOptions.report expects a boolean") +- self._report = value ++ raise TypeError("SoSOptions.noreport expects a boolean") ++ self._noreport = value + + @property + def sysroot(self): +@@ -646,8 +646,8 @@ class SoSOptions(object): + help="specify alternate temporary directory", + default=None) + parser.add_option("--no-report", action="store_true", +- dest="report", +- help="Disable HTML/XML reporting", default=False) ++ dest="noreport", ++ help="Disable HTML/XML reporting", default=False) + parser.add_option("-s", "--sysroot", action="store", dest="sysroot", + help="system root directory path (default='/')", + default=None) +@@ -1499,7 +1499,7 @@ class SoSReport(object): + self.prework() + self.setup() + self.collect() +- if not self.opts.report: ++ if not self.opts.noreport: + self.report() + self.html_report() + self.plain_report() +-- +1.8.3.1 + diff --git a/SOURCES/sos-bz1221932-iprconfig-plugin.patch b/SOURCES/sos-bz1221932-iprconfig-plugin.patch new file mode 100644 index 0000000..d294ebf --- /dev/null +++ b/SOURCES/sos-bz1221932-iprconfig-plugin.patch @@ -0,0 +1,135 @@ +From ad464fcc0882f8764e8bbb091a91eeeb4a804ff3 Mon Sep 17 00:00:00 2001 +From: "Bryn M. Reeves" +Date: Mon, 15 Dec 2014 17:30:24 +0000 +Subject: [PATCH] [iprconfig] add plugin for IBM Power RAID adapters + +Capture information which helps in better understanding of +IBM Power RAID storage adapter configuration. Since iprconfig +is specific to power adding the relevant commands in powerpc plugin. + +Signed-off-by: Aruna Balakrishnaiah +Signed-off-by: Bryn M. Reeves +--- + sos/plugins/iprconfig.py | 110 +++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 110 insertions(+) + create mode 100644 sos/plugins/iprconfig.py + +diff --git a/sos/plugins/iprconfig.py b/sos/plugins/iprconfig.py +new file mode 100644 +index 0000000..b77c192 +--- /dev/null ++++ b/sos/plugins/iprconfig.py +@@ -0,0 +1,110 @@ ++# 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. ++ ++# This plugin enables collection of logs for Power systems ++ ++import os ++import re ++from sos.plugins import Plugin, RedHatPlugin, UbuntuPlugin, DebianPlugin ++from sos.utilities import is_executable ++ ++ ++class IprConfig(Plugin, RedHatPlugin, UbuntuPlugin, DebianPlugin): ++ """IBM Power RAID storage adapter configuration information ++ """ ++ ++ plugin_name = 'iprconfig' ++ ++ def check_enabled(self): ++ arch = self.policy().get_arch() ++ return arch == "ppc64" and is_executable("iprconfig") ++ ++ def setup(self): ++ self.add_cmd_output([ ++ "iprconfig -c show-config", ++ "iprconfig -c show-alt-config", ++ "iprconfig -c show-arrays", ++ "iprconfig -c show-jbod-disks", ++ "iprconfig -c show-ioas", ++ ]) ++ ++ show_ioas = self.call_ext_prog("iprconfig -c show-ioas") ++ if not show_ioas['status'] == 0: ++ return ++ ++ devices = [] ++ if show_ioas['output']: ++ p = re.compile('sg') ++ for line in show_ioas['output'].splitlines(): ++ temp = line.split(' ') ++ # temp[0] holds the device name ++ if p.search(temp[0]): ++ devices.append(temp[0]) ++ ++ for device in devices: ++ self.add_cmd_output("iprconfig -c show-details %s" % (device,)) ++ ++ # Look for IBM Power RAID enclosures (iprconfig lists them) ++ show_config = self.call_ext_prog("iprconfig -c show-config") ++ if not show_config['status'] == 0: ++ return ++ ++ if not show_config['output']: ++ return ++ ++# iprconfig -c show-config ++# Name PCI/SCSI Location Description Status ++# ------ ------------------------- ------------------------- ----------------- ++# 0005:60:00.0/0: PCI-E SAS RAID Adapter Operational ++# sda 0005:60:00.0/0:0:0:0 Physical Disk Active ++# sdb 0005:60:00.0/0:1:0:0 Physical Disk Active ++# sdc 0005:60:00.0/0:2:0:0 Physical Disk Active ++# sdd 0005:60:00.0/0:3:0:0 Physical Disk Active ++# sde 0005:60:00.0/0:4:0:0 Physical Disk Active ++# sdf 0005:60:00.0/0:5:0:0 Physical Disk Active ++# 0005:60:00.0/0:8:0:0 Enclosure Active ++# 0005:60:00.0/0:8:1:0 Enclosure Active ++ ++ show_alt_config = "iprconfig -c show-alt-config" ++ altconfig = self.call_ext_prog(show_alt_config) ++ if not (altconfig['status'] == 0): ++ return ++ ++ if not altconfig['output']: ++ return ++ ++# iprconfig -c show-alt-config ++# Name Resource Path/Address Vendor Product ID Status ++# ------ -------------------------- -------- ---------------- ----------------- ++# sg9 0: IBM 57C7001SISIOA Operational ++# sg0 0:0:0:0 IBM MBF2300RC Active ++# sg1 0:1:0:0 IBM MBF2300RC Active ++# sg2 0:2:0:0 IBM HUC106030CSS600 Active ++# sg3 0:3:0:0 IBM HUC106030CSS600 Active ++# sg4 0:4:0:0 IBM HUC106030CSS600 Active ++# sg5 0:5:0:0 IBM HUC106030CSS600 Active ++# sg7 0:8:0:0 IBM VSBPD6E4A 3GSAS Active ++# sg8 0:8:1:0 IBM VSBPD6E4B 3GSAS Active ++ ++ for line in show_config['output'].splitlines(): ++ if "Enclosure" in line: ++ temp = re.split('\s+', line) ++ # temp[1] holds the PCI/SCSI location ++ pci, scsi = temp[1].split('/') ++ for line in altconfig['output'].splitlines(): ++ if scsi in line: ++ temp = line.split(' ') ++ # temp[0] holds device name ++ self.add_cmd_output("iprconfig -c " ++ "query-ses-mode %s" % (temp[0],)) +-- +1.8.3.1 + diff --git a/SOURCES/sos-bz1229746-openstack-sahara-plugin.patch b/SOURCES/sos-bz1229746-openstack-sahara-plugin.patch deleted file mode 100644 index 23d0eb9..0000000 --- a/SOURCES/sos-bz1229746-openstack-sahara-plugin.patch +++ /dev/null @@ -1,88 +0,0 @@ -From f1a7aea0f45485cbe12e95f38c6b0dc6ad12dd58 Mon Sep 17 00:00:00 2001 -From: Poornima -Date: Thu, 9 Apr 2015 18:47:58 +0530 -Subject: [PATCH] [openstack_sahara] add new plugin - -Capture configuration and log data for the OpenStack Sahara project -(formerly Savanna). Sahara is a tool to simplify the deployment of -data-intensive applications in OpenStack environments. - -Signed-off-by: Poornima M. Kshirsagar pkshiras@redhat.com -Signed-off-by: Bryn M. Reeves bmr@redhat.com ---- - sos/plugins/openstack_sahara.py | 63 +++++++++++++++++++++++++++++++++++++++++ - 1 file changed, 63 insertions(+) - create mode 100644 sos/plugins/openstack_sahara.py - -diff --git a/sos/plugins/openstack_sahara.py b/sos/plugins/openstack_sahara.py -new file mode 100644 -index 0000000..f0b95e4 ---- /dev/null -+++ b/sos/plugins/openstack_sahara.py -@@ -0,0 +1,63 @@ -+# Copyright (C) 2015 Red Hat, Inc.,Poornima M. Kshirsagar -+ -+# 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 OpenStackSahara(Plugin): -+ """OpenStack Sahara""" -+ plugin_name = 'openstack_sahara' -+ profiles = ('openstack',) -+ -+ option_list = [("log", "gathers openstack sahara logs", "slow", True)] -+ -+ def setup(self): -+ self.add_copy_spec("/etc/sahara/") -+ self.add_cmd_output("journalctl -u openstack-sahara-all") -+ -+ if self.get_option("log"): -+ self.add_copy_spec("/var/log/sahara/") -+ -+ -+class DebianOpenStackSahara(OpenStackSahara, DebianPlugin, UbuntuPlugin): -+ """OpenStackSahara related information for Debian based distributions.""" -+ -+ packages = ( -+ 'sahara-api', -+ 'sahara-common', -+ 'sahara-engine', -+ 'python-sahara', -+ 'python-saharaclient', -+ ) -+ -+ def setup(self): -+ super(DebianOpenStackSahara, self).setup() -+ -+ -+class RedHatOpenStackSahara(OpenStackSahara, RedHatPlugin): -+ """OpenStack sahara related information for Red Hat distributions.""" -+ -+ packages = ( -+ 'openstack-sahara', -+ 'python-saharaclient' -+ ) -+ -+ def setup(self): -+ super(RedHatOpenStackSahara, self).setup() -+ self.add_copy_spec("/etc/sudoers.d/sahara") -+ -+ -+# vim: et ts=4 sw=4 --- -1.8.3.1 - diff --git a/SOURCES/sos-bz1229746-redact-secrets-from-sahara-config.patch b/SOURCES/sos-bz1229746-redact-secrets-from-sahara-config.patch deleted file mode 100644 index a8cb062..0000000 --- a/SOURCES/sos-bz1229746-redact-secrets-from-sahara-config.patch +++ /dev/null @@ -1,35 +0,0 @@ -From 706e523d608b588cfd70b2dfa957feafe0645796 Mon Sep 17 00:00:00 2001 -From: Rohan Kanade -Date: Mon, 15 Jun 2015 20:24:10 +0530 -Subject: [PATCH] [openstack_sahara] redact secrets from sahara configuration - -Signed-off-by: Rohan Kanade ---- - sos/plugins/openstack_sahara.py | 11 +++++++++++ - 1 files changed, 11 insertions(+), 0 deletions(-) - -diff --git a/sos/plugins/openstack_sahara.py b/sos/plugins/openstack_sahara.py -index f0b95e4..9d971ba 100644 ---- a/sos/plugins/openstack_sahara.py -+++ b/sos/plugins/openstack_sahara.py -@@ -31,6 +31,17 @@ class OpenStackSahara(Plugin): - if self.get_option("log"): - self.add_copy_spec("/var/log/sahara/") - -+ def postproc(self): -+ protect_keys = [ -+ 'memcache_secret_key', 'qpid_password', 'rabbit_password', -+ 'admin_password', 'password', 'ssl_key_password', -+ 'admin_token', 'connection' -+ ] -+ -+ regexp = r"((?m)^\s*#*(%s)\s*=\s*)(.*)" % "|".join(protect_keys) -+ -+ self.do_file_sub('/etc/sahara/sahara.conf', regexp, r"\1*********") -+ - - class DebianOpenStackSahara(OpenStackSahara, DebianPlugin, UbuntuPlugin): - """OpenStackSahara related information for Debian based distributions.""" --- -1.7.1 - diff --git a/SOURCES/sos-bz1236101-ovirt-engine-config-domain-list.patch b/SOURCES/sos-bz1236101-ovirt-engine-config-domain-list.patch new file mode 100644 index 0000000..f329d6a --- /dev/null +++ b/SOURCES/sos-bz1236101-ovirt-engine-config-domain-list.patch @@ -0,0 +1,36 @@ +From ae98e1e119d2abfe771cfa6c286e2e4e177d86d7 Mon Sep 17 00:00:00 2001 +From: Jake Hunsaker +Date: Tue, 16 Dec 2014 11:26:50 -0500 +Subject: [PATCH] [ovirt] Collect engine tunables and domain information. + +Currently sos does not capture engine-config values or domain information. +We should capture both of these as the tunables can help in troubleshooting. + +Similarly the domain information can help track AD/IPA issues. + +These can currently be dug out from the DB dump, however having them in a plaintext +file makes checking these much faster and easier, and a DB is not always available. + +Signed-off-by: Jake Hunsaker +Signed-off-by: Adam Stokes +--- + sos/plugins/ovirt.py | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/sos/plugins/ovirt.py b/sos/plugins/ovirt.py +index b097d93..9436ac6 100644 +--- a/sos/plugins/ovirt.py ++++ b/sos/plugins/ovirt.py +@@ -83,6 +83,9 @@ class Ovirt(Plugin, RedHatPlugin): + + self.add_forbidden_path('/etc/ovirt-engine/.pgpass') + self.add_forbidden_path('/etc/rhevm/.pgpass') ++ # Copy all engine tunables and domain information ++ self.add_cmd_output("engine-config --all") ++ self.add_cmd_output("engine-manage-domains list") + # Copy engine config files. + self.add_copy_spec([ + "/etc/ovirt-engine", +-- +1.8.3.1 + diff --git a/SOURCES/sos-bz1236111-activemq-collect-logs-config.patch b/SOURCES/sos-bz1236111-activemq-collect-logs-config.patch new file mode 100644 index 0000000..e6f6490 --- /dev/null +++ b/SOURCES/sos-bz1236111-activemq-collect-logs-config.patch @@ -0,0 +1,77 @@ +From e2a94de2e574b61d1da071f961863d2490c90bc0 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Pep=20Turr=C3=B3=20Mauri?= +Date: Tue, 23 Dec 2014 19:36:29 +0100 +Subject: [PATCH] [activemq] Honour all_logs and get config on RHEL +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Get only current log file by default, allowing full dir +collection via the all_logs option. + +Add a Red Hat version of the plugin that collects the two +main configuration files for activemq. Also enable that plugin +in the OpenShift profile. + +Related: RHBZ#1165878 +Fixes: #457. + +Signed-off-by: Pep Turró Mauri +Signed-off-by: Bryn M. Reeves +--- + sos/plugins/activemq.py | 31 ++++++++++++++++++++++++++++--- + 1 file changed, 28 insertions(+), 3 deletions(-) + +diff --git a/sos/plugins/activemq.py b/sos/plugins/activemq.py +index 291fcd9..1594229 100644 +--- a/sos/plugins/activemq.py ++++ b/sos/plugins/activemq.py +@@ -16,17 +16,42 @@ + from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin + + +-class ActiveMq(Plugin, RedHatPlugin, DebianPlugin): ++class ActiveMq(Plugin, DebianPlugin): + """ActiveMQ message broker + """ + + plugin_name = 'activemq' +- profiles = () ++ profiles = ('openshift',) + packages = ('activemq', 'activemq-core') + files = ('/var/log/activemq',) + + def setup(self): +- self.add_copy_spec(list(self.files)) ++ if self.get_option("all_logs"): ++ self.add_copy_spec(list(self.files)) ++ else: ++ self.add_copy_spec([ ++ "/var/log/activemq/activemq.log", ++ "/var/log/activemq/wrapper.log" ++ ]) ++ ++ def postproc(self): ++ # activemq.xml contains credentials in this form: ++ # ++ self.do_file_sub( ++ '/etc/activemq/activemq.xml', ++ r'(\s*password=")[^"]*(".*)', ++ r"\1******\2" ++ ) ++ ++ ++class RedHatActiveMq(ActiveMq, RedHatPlugin): ++ ++ def setup(self): ++ super(RedHatActiveMq, self).setup() ++ self.add_copy_spec([ ++ '/etc/sysconfig/activemq', ++ '/etc/activemq/activemq.xml' ++ ]) + + + class UbuntuActiveMq(ActiveMq, UbuntuPlugin): +-- +1.8.3.1 + diff --git a/SOURCES/sos-bz1236124-cluster-enable-when-luci-only.patch b/SOURCES/sos-bz1236124-cluster-enable-when-luci-only.patch new file mode 100644 index 0000000..736c1dd --- /dev/null +++ b/SOURCES/sos-bz1236124-cluster-enable-when-luci-only.patch @@ -0,0 +1,33 @@ +From f5211fd8725629e23a3a0f802bd6e635290dab36 Mon Sep 17 00:00:00 2001 +From: Shane Bradley +Date: Tue, 10 Feb 2015 10:42:39 -0500 +Subject: [PATCH] [cluster] add luci to packages for standalone luci servers + +A host with only luci package installed would not collect luci logs +because the cluster plugin would not run since none of the packages +were found. This patch adds luci to the package set required for the +plugin to run. + +Resolves: rhbz#1171186 + +Signed-off-by: Shane Bradley +Signed-off-by: Bryn M. Reeves +--- + sos/plugins/cluster.py | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/sos/plugins/cluster.py b/sos/plugins/cluster.py +index a84d3e2..7aeed44 100644 +--- a/sos/plugins/cluster.py ++++ b/sos/plugins/cluster.py +@@ -32,6 +32,7 @@ class Cluster(Plugin, RedHatPlugin): + ] + + packages = [ ++ "luci", + "ricci", + "corosync", + "openais", +-- +1.8.3.1 + diff --git a/SOURCES/sos-bz1237029-hpasm-no-data-timeout.patch b/SOURCES/sos-bz1237029-hpasm-no-data-timeout.patch deleted file mode 100644 index 731097d..0000000 --- a/SOURCES/sos-bz1237029-hpasm-no-data-timeout.patch +++ /dev/null @@ -1,35 +0,0 @@ -From 61a5b47d4fe4fd47e759b9acc19483491ec17005 Mon Sep 17 00:00:00 2001 -From: Pavel Moravec -Date: Tue, 5 May 2015 13:50:55 +0200 -Subject: [PATCH] [hpasm] hpasmcli commands hang under timeout - -When hpasmcli is run in a python Popen or system pipeline via the -timeout command it hangs indefinitely. - -Work around this temporarily by disabling the use of the timeout -program (by passing a zero timeout value) when running this -command. - -Fixes: #559 - -Signed-off-by: Pavel Moravec -Signed-off-by: Bryn M. Reeves ---- - sos/plugins/hpasm.py | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/sos/plugins/hpasm.py b/sos/plugins/hpasm.py -index 4d5d158..4d70887 100644 ---- a/sos/plugins/hpasm.py -+++ b/sos/plugins/hpasm.py -@@ -30,6 +30,6 @@ class Hpasm(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin): - self.add_cmd_output([ - "hpasmcli -s 'show asr'", - "hpasmcli -s 'show server'" -- ]) -+ ], timeout=0) - - # vim: et ts=4 sw=4 --- -1.8.3.1 - diff --git a/SOURCES/sos-bz1238200-mariadb-mysql-add-log.patch b/SOURCES/sos-bz1238200-mariadb-mysql-add-log.patch deleted file mode 100644 index 6d57ebe..0000000 --- a/SOURCES/sos-bz1238200-mariadb-mysql-add-log.patch +++ /dev/null @@ -1,37 +0,0 @@ -From f8ab86cbd2302812cd9160bec4478cb4f84e1442 Mon Sep 17 00:00:00 2001 -From: Shane Bradley -Date: Mon, 27 Apr 2015 10:28:34 -0400 -Subject: [PATCH] [mysql] Collect log file - -When MariaDB is run under Pacemaker an OCF resource agent is used -to start and stop the database. This configuration also overrides -the log paths used for the database. In particular the mysqld.log -is present at '/var/log/mysqld.log'. - -Collect both paths as we do not currently detect whether we are -running with an OCF agent or stand-alone. - -Fixes: #554 - -Signed-off-by: Shane Bradley -Signed-off-by: Bryn M. Reeves ---- - sos/plugins/mysql.py | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/sos/plugins/mysql.py b/sos/plugins/mysql.py -index 8dba204..aa8e9b9 100644 ---- a/sos/plugins/mysql.py -+++ b/sos/plugins/mysql.py -@@ -37,6 +37,8 @@ class Mysql(Plugin): - - self.add_copy_spec([ - self.mysql_cnf, -+ # Required for MariaDB under pacemaker (MariaDB-Galera) -+ "/var/log/mysqld.log", - "/var/log/mysql/mysqld.log", - "/var/log/mariadb/mariadb.log", - ]) --- -1.8.3.1 - diff --git a/SOURCES/sos-bz1238349-openstack_trove-plugin.patch b/SOURCES/sos-bz1238349-openstack_trove-plugin.patch new file mode 100644 index 0000000..3d78c0a --- /dev/null +++ b/SOURCES/sos-bz1238349-openstack_trove-plugin.patch @@ -0,0 +1,97 @@ +From 85d6ea5cdd32cf1b90a10ff0d50a14dcf24902f8 Mon Sep 17 00:00:00 2001 +From: Lee Yarwood +Date: Tue, 7 Apr 2015 18:26:42 +0100 +Subject: [PATCH] [openstack] New Openstack Trove (DBaaS) plugin. + +https://wiki.openstack.org/wiki/Trove + +Signed-off-by: Lee Yarwood +Signed-off-by: Adam Stokes +--- + sos/plugins/openstack_trove.py | 74 ++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 74 insertions(+) + create mode 100644 sos/plugins/openstack_trove.py + +diff --git a/sos/plugins/openstack_trove.py b/sos/plugins/openstack_trove.py +new file mode 100644 +index 0000000..7c8b661 +--- /dev/null ++++ b/sos/plugins/openstack_trove.py +@@ -0,0 +1,74 @@ ++# Copyright (C) 2015 Red Hat, Inc., Lee Yarwood ++ ++# 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 OpenStackTrove(Plugin): ++ """OpenStack Trove ++ """ ++ ++ plugin_name = "openstack_trove" ++ profiles = ('openstack',) ++ option_list = [("log", "gathers openstack trove logs", "slow", True)] ++ ++ def setup(self): ++ self.add_copy_spec('/etc/trove/') ++ ++ if self.get_option('log'): ++ self.add_copy_spec('/var/log/trove') ++ ++ def postproc(self): ++ ++ protect_keys = [ ++ "dns_passkey", "nova_proxy_admin_pass", "rabbit_password", ++ "qpid_password", "connection", "sql_connection", "admin_password" ++ ] ++ ++ conf_list = [ ++ '/etc/trove/trove.conf', ++ '/etc/trove/trove-conductor.conf', ++ '/etc/trove/trove-guestmanager.conf', ++ '/etc/trove/trove-taskmanager.conf' ++ ] ++ ++ regexp = r"((?m)^\s*#*(%s)\s*=\s*)(.*)" % "|".join(protect_keys) ++ ++ for conf in conf_list: ++ self.do_file_sub(conf, regexp, r"\1*********") ++ ++ ++class DebianOpenStackTrove(OpenStackTrove, DebianPlugin, UbuntuPlugin): ++ ++ packages = [ ++ 'python-trove', ++ 'trove-common', ++ 'trove-api', ++ 'trove-taskmanager' ++ ] ++ ++ def setup(self): ++ super(DebianOpenStackTrove, self).setup() ++ ++ ++class RedHatOpenStackTrove(OpenStackTrove, RedHatPlugin): ++ ++ packages = ['openstack-trove'] ++ ++ def setup(self): ++ super(RedHatOpenStackTrove, self).setup() ++ ++# vim: et ts=4 sw=4 +-- +1.8.3.1 + diff --git a/SOURCES/sos-bz1238726-iprconfig-enable-on-ppc64le.patch b/SOURCES/sos-bz1238726-iprconfig-enable-on-ppc64le.patch new file mode 100644 index 0000000..89291fc --- /dev/null +++ b/SOURCES/sos-bz1238726-iprconfig-enable-on-ppc64le.patch @@ -0,0 +1,35 @@ +From f2d9cc519ac549b9e68e1301b67f1e9b789e2fd3 Mon Sep 17 00:00:00 2001 +From: Kamalesh Babulal +Date: Fri, 3 Jul 2015 12:16:25 +0100 +Subject: [PATCH] iprconfig collects information, only if the underlying + platform is 'ppc64'. Modify check_enabled() to regex match on arch(), instead + of exact match of string. + +This enables iprconfig to collect information on ppc64* +platforms. + +Signed-off-by: Kamalesh Babulal +Signed-off-by: Bryn M. Reeves +--- + sos/plugins/iprconfig.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) +--- + sos/plugins/iprconfig.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/sos/plugins/iprconfig.py b/sos/plugins/iprconfig.py +index b77c192..687d8d5 100644 +--- a/sos/plugins/iprconfig.py ++++ b/sos/plugins/iprconfig.py +@@ -28,7 +28,7 @@ class IprConfig(Plugin, RedHatPlugin, UbuntuPlugin, DebianPlugin): + + def check_enabled(self): + arch = self.policy().get_arch() +- return arch == "ppc64" and is_executable("iprconfig") ++ return "ppc64" in arch and is_executable("iprconfig") + + def setup(self): + self.add_cmd_output([ +-- +1.8.3.1 + diff --git a/SOURCES/sos-bz1240666-openstack_neutron-obfuscate-passwords.patch b/SOURCES/sos-bz1240666-openstack_neutron-obfuscate-passwords.patch new file mode 100644 index 0000000..add6bff --- /dev/null +++ b/SOURCES/sos-bz1240666-openstack_neutron-obfuscate-passwords.patch @@ -0,0 +1,72 @@ +From 5917dbd8f38bab29de9e40d1135b0e9e85cb91bc Mon Sep 17 00:00:00 2001 +From: Lee Yarwood +Date: Tue, 7 Jul 2015 14:54:49 +0100 +Subject: [PATCH] [openstack_neutron] Obscure passwords and secrets + +The following passwords and secrets are now obscured : + + - rabbit_password + - qpid_password + - nova_admin_password + - xenapi_connection_password + - password + - connection + - admin_password + - metadata_proxy_shared_secret + - qpid_password + - eapi_password + - crd_password + - primary_l3_host_password + - serverauth + - ucsm_password + - ha_vrrp_auth_password + - ssl_key_password + - vcenter_password + - edge_appliance_password + - tenant_admin_password + - apic_password + +Fixes #594 + +Signed-off-by: Lee Yarwood +--- + sos/plugins/openstack_neutron.py | 16 ++++++++++++++++ + 1 file changed, 16 insertions(+) + +diff --git a/sos/plugins/openstack_neutron.py b/sos/plugins/openstack_neutron.py +index 36de7cc..ab895c8 100644 +--- a/sos/plugins/openstack_neutron.py ++++ b/sos/plugins/openstack_neutron.py +@@ -14,6 +14,7 @@ + # along with this program; if not, write to the Free Software + # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + ++import glob + import os + import re + +@@ -50,6 +51,21 @@ class Neutron(Plugin): + + self.netns_dumps() + ++ def postproc(self): ++ protect_keys = [ ++ "rabbit_password", "qpid_password", "nova_admin_password", ++ "xenapi_connection_password", "password", "connection", ++ "admin_password", "metadata_proxy_shared_secret", "qpid_password", ++ "eapi_password", "crd_password", "primary_l3_host_password", ++ "serverauth", "ucsm_password", "ha_vrrp_auth_password", ++ "ssl_key_password", "nsx_password", "vcenter_password", ++ "edge_appliance_password", "tenant_admin_password", "apic_password" ++ ] ++ regexp = r"((?m)^\s*#*(%s)\s*=\s*)(.*)" % "|".join(protect_keys) ++ ++ for config_file in glob.glob("/etc/%s/*" % self.component_name): ++ self.do_file_sub(config_file, regexp, r"\1*********") ++ + def netns_dumps(self): + # It would've been beautiful if we could get parts of the networking + # plugin to run in different namespaces. There are a couple of options +-- +1.8.3.1 + diff --git a/SOURCES/sos-bz1242507-openvswitch-collect-logs-db-bridges.patch b/SOURCES/sos-bz1242507-openvswitch-collect-logs-db-bridges.patch new file mode 100644 index 0000000..a322add --- /dev/null +++ b/SOURCES/sos-bz1242507-openvswitch-collect-logs-db-bridges.patch @@ -0,0 +1,158 @@ +From 775b2bbfb28701ec2e687f0ece68a4558cef8740 Mon Sep 17 00:00:00 2001 +From: Lee Yarwood +Date: Tue, 17 Feb 2015 14:51:00 +0000 +Subject: [PATCH] [openvswitch] Capture additional output for OVS bridges. + +This includes `dump-flows` and `fdb/show` output useful for debugging +Openstack tenant and L3 networking issues. + +Signed-off-by: Lee Yarwood +--- + sos/plugins/openvswitch.py | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/sos/plugins/openvswitch.py b/sos/plugins/openvswitch.py +index 3611671..5200563 100644 +--- a/sos/plugins/openvswitch.py ++++ b/sos/plugins/openvswitch.py +@@ -32,6 +32,14 @@ class OpenVSwitch(Plugin): + # to the Open vSwitch server, avoiding hangs when running sosreport. + self.add_cmd_output("ovs-vsctl -t 5 show") + ++ # Gather additional output for each OVS bridge on the host. ++ br_list_result = self.call_ext_prog("ovs-vsctl list-br") ++ if br_list_result['status'] == 0: ++ for br in br_list_result['output'].splitlines(): ++ self.add_cmd_output("ovs-ofctl show %s" % br) ++ self.add_cmd_output("ovs-ofctl dump-flows %s" % br) ++ self.add_cmd_output("ovs-appctl fdb/show %s" % br) ++ + + class RedHatOpenVSwitch(OpenVSwitch, RedHatPlugin): + +-- +1.8.3.1 + +From 21aff64a58a3e0f3fc5065b2e18ca3d489e16a51 Mon Sep 17 00:00:00 2001 +From: Flavio Leitner +Date: Fri, 19 Jun 2015 21:55:56 -0300 +Subject: [PATCH] [openvswitch] capture the logs + +Both ovs-vswitchd.log and ovsdb-server.log are useful +for troubleshooting. + +Signed-off-by: Flavio Leitner +--- + sos/plugins/openvswitch.py | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/sos/plugins/openvswitch.py b/sos/plugins/openvswitch.py +index fbf3a90..1d75608 100644 +--- a/sos/plugins/openvswitch.py ++++ b/sos/plugins/openvswitch.py +@@ -24,6 +24,10 @@ class OpenVSwitch(Plugin): + profiles = ('network', 'virt') + + def setup(self): ++ self.add_copy_spec([ ++ "/var/log/openvswitch/ovs-vswitchd.log", ++ "/var/log/openvswitch/ovsdb-server.log" ++ ]) + # The '-s' option enables dumping of packet counters on the + # ports. + self.add_cmd_output("ovs-dpctl -s show") +-- +1.8.3.1 + +From f92205495113a8403066e911baeb4f5ee59c2101 Mon Sep 17 00:00:00 2001 +From: Flavio Leitner +Date: Fri, 19 Jun 2015 22:05:52 -0300 +Subject: [PATCH] [openvswitch] dump and capture the database + +The database contains all the vswitch configuration and +is essential to understand and replicate the environment. + +Signed-off-by: Flavio Leitner +--- + sos/plugins/openvswitch.py | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/sos/plugins/openvswitch.py b/sos/plugins/openvswitch.py +index 1d75608..4dd15b2 100644 +--- a/sos/plugins/openvswitch.py ++++ b/sos/plugins/openvswitch.py +@@ -44,6 +44,9 @@ class OpenVSwitch(Plugin): + self.add_cmd_output("ovs-ofctl dump-flows %s" % br) + self.add_cmd_output("ovs-appctl fdb/show %s" % br) + ++ # Gather the database. ++ self.add_cmd_output("ovsdb-client dump") ++ + + class RedHatOpenVSwitch(OpenVSwitch, RedHatPlugin): + +-- +1.8.3.1 + +From 4a57c54216242acb009fdb107d52712decfdfc1e Mon Sep 17 00:00:00 2001 +From: "Bryn M. Reeves" +Date: Mon, 6 Jul 2015 17:31:44 +0100 +Subject: [PATCH] [openvswitch] consolidate self.add_cmd_output() calls + +Signed-off-by: Bryn M. Reeves +--- + sos/plugins/openvswitch.py | 28 ++++++++++++++++------------ + 1 file changed, 16 insertions(+), 12 deletions(-) + +diff --git a/sos/plugins/openvswitch.py b/sos/plugins/openvswitch.py +index 4dd15b2..8d691dc 100644 +--- a/sos/plugins/openvswitch.py ++++ b/sos/plugins/openvswitch.py +@@ -24,28 +24,32 @@ class OpenVSwitch(Plugin): + profiles = ('network', 'virt') + + def setup(self): ++ + self.add_copy_spec([ + "/var/log/openvswitch/ovs-vswitchd.log", + "/var/log/openvswitch/ovsdb-server.log" + ]) +- # The '-s' option enables dumping of packet counters on the +- # ports. +- self.add_cmd_output("ovs-dpctl -s show") + +- # The '-t 5' adds an upper bound on how long to wait to connect +- # to the Open vSwitch server, avoiding hangs when running sosreport. +- self.add_cmd_output("ovs-vsctl -t 5 show") ++ self.add_cmd_output([ ++ # The '-s' option enables dumping of packet counters on the ++ # ports. ++ "ovs-dpctl -s show", ++ # The '-t 5' adds an upper bound on how long to wait to connect ++ # to the Open vSwitch server, avoiding hangs when running sos. ++ "ovs-vsctl -t 5 show", ++ # Gather the database. ++ "ovsdb-client dump" ++ ]) + + # Gather additional output for each OVS bridge on the host. + br_list_result = self.call_ext_prog("ovs-vsctl list-br") + if br_list_result['status'] == 0: + for br in br_list_result['output'].splitlines(): +- self.add_cmd_output("ovs-ofctl show %s" % br) +- self.add_cmd_output("ovs-ofctl dump-flows %s" % br) +- self.add_cmd_output("ovs-appctl fdb/show %s" % br) +- +- # Gather the database. +- self.add_cmd_output("ovsdb-client dump") ++ self.add_cmd_output([ ++ "ovs-ofctl show %s" % br, ++ "ovs-ofctl dump-flows %s" % br, ++ "ovs-appctl fdb/show %s" % br ++ ]) + + + class RedHatOpenVSwitch(OpenVSwitch, RedHatPlugin): +-- +1.8.3.1 + diff --git a/SOURCES/sos-bz1242871-openstack_neutron-obfuscate-passwords.patch b/SOURCES/sos-bz1242871-openstack_neutron-obfuscate-passwords.patch deleted file mode 100644 index add6bff..0000000 --- a/SOURCES/sos-bz1242871-openstack_neutron-obfuscate-passwords.patch +++ /dev/null @@ -1,72 +0,0 @@ -From 5917dbd8f38bab29de9e40d1135b0e9e85cb91bc Mon Sep 17 00:00:00 2001 -From: Lee Yarwood -Date: Tue, 7 Jul 2015 14:54:49 +0100 -Subject: [PATCH] [openstack_neutron] Obscure passwords and secrets - -The following passwords and secrets are now obscured : - - - rabbit_password - - qpid_password - - nova_admin_password - - xenapi_connection_password - - password - - connection - - admin_password - - metadata_proxy_shared_secret - - qpid_password - - eapi_password - - crd_password - - primary_l3_host_password - - serverauth - - ucsm_password - - ha_vrrp_auth_password - - ssl_key_password - - vcenter_password - - edge_appliance_password - - tenant_admin_password - - apic_password - -Fixes #594 - -Signed-off-by: Lee Yarwood ---- - sos/plugins/openstack_neutron.py | 16 ++++++++++++++++ - 1 file changed, 16 insertions(+) - -diff --git a/sos/plugins/openstack_neutron.py b/sos/plugins/openstack_neutron.py -index 36de7cc..ab895c8 100644 ---- a/sos/plugins/openstack_neutron.py -+++ b/sos/plugins/openstack_neutron.py -@@ -14,6 +14,7 @@ - # along with this program; if not, write to the Free Software - # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - -+import glob - import os - import re - -@@ -50,6 +51,21 @@ class Neutron(Plugin): - - self.netns_dumps() - -+ def postproc(self): -+ protect_keys = [ -+ "rabbit_password", "qpid_password", "nova_admin_password", -+ "xenapi_connection_password", "password", "connection", -+ "admin_password", "metadata_proxy_shared_secret", "qpid_password", -+ "eapi_password", "crd_password", "primary_l3_host_password", -+ "serverauth", "ucsm_password", "ha_vrrp_auth_password", -+ "ssl_key_password", "nsx_password", "vcenter_password", -+ "edge_appliance_password", "tenant_admin_password", "apic_password" -+ ] -+ regexp = r"((?m)^\s*#*(%s)\s*=\s*)(.*)" % "|".join(protect_keys) -+ -+ for config_file in glob.glob("/etc/%s/*" % self.component_name): -+ self.do_file_sub(config_file, regexp, r"\1*********") -+ - def netns_dumps(self): - # It would've been beautiful if we could get parts of the networking - # plugin to run in different namespaces. There are a couple of options --- -1.8.3.1 - diff --git a/SOURCES/sos-bz1243092-openstack-obfuscate-passwords-secrets.patch b/SOURCES/sos-bz1243092-openstack-obfuscate-passwords-secrets.patch new file mode 100644 index 0000000..46f171f --- /dev/null +++ b/SOURCES/sos-bz1243092-openstack-obfuscate-passwords-secrets.patch @@ -0,0 +1,357 @@ +From 02ef6e2ba8d1a8fe4468aaa8be0ae88f8c74646a Mon Sep 17 00:00:00 2001 +From: Lee Yarwood +Date: Wed, 15 Jul 2015 15:42:50 +0100 +Subject: [PATCH] [openstack] Ensure openstack passwords and secrets are + obfuscated. + +- Add a postproc method to ceilometer, cinder, glance, hoirzon and swift. +- Add missing keys to the remaining plugins. +- Modify the regular expression used by all plugins to ignore commented + out keys. +- Modify all plugins to use do_path_regex_sub() to apply regex to all + collected configuration files. + +Resolves: #574 + +Signed-off-by: Lee Yarwood +--- + sos/plugins/openstack_ceilometer.py | 12 ++++++++++++ + sos/plugins/openstack_cinder.py | 17 +++++++++++++++++ + sos/plugins/openstack_glance.py | 10 ++++++++++ + sos/plugins/openstack_heat.py | 9 +++++++++ + sos/plugins/openstack_horizon.py | 9 +++++++++ + sos/plugins/openstack_keystone.py | 23 ++++++++--------------- + sos/plugins/openstack_neutron.py | 17 ++++++++--------- + sos/plugins/openstack_nova.py | 10 +++++----- + sos/plugins/openstack_sahara.py | 11 +++++------ + sos/plugins/openstack_swift.py | 11 +++++++++++ + sos/plugins/openstack_trove.py | 19 ++++++------------- + 11 files changed, 100 insertions(+), 48 deletions(-) + +diff --git a/sos/plugins/openstack_ceilometer.py b/sos/plugins/openstack_ceilometer.py +index 7c11057..44a733b 100644 +--- a/sos/plugins/openstack_ceilometer.py ++++ b/sos/plugins/openstack_ceilometer.py +@@ -35,6 +35,18 @@ class OpenStackCeilometer(Plugin): + "/var/log/ceilometer" + ]) + ++ def postproc(self): ++ protect_keys = [ ++ "admin_password", "connection_password", "host_password", ++ "memcache_secret_key", "os_password", "password", "qpid_password", ++ "rabbit_password", "readonly_user_password", "secret_key", ++ "ssl_key_password", "telemetry_secret", "connection", ++ "metering_secret" ++ ] ++ ++ regexp = r"((?m)^\s*(%s)\s*=\s*)(.*)" % "|".join(protect_keys) ++ self.do_path_regex_sub("/etc/ceilometer/*", regexp, r"\1*********") ++ + + class DebianOpenStackCeilometer(OpenStackCeilometer, DebianPlugin, + UbuntuPlugin): +diff --git a/sos/plugins/openstack_cinder.py b/sos/plugins/openstack_cinder.py +index 8588f6c..2f22b5a 100644 +--- a/sos/plugins/openstack_cinder.py ++++ b/sos/plugins/openstack_cinder.py +@@ -42,6 +42,23 @@ class OpenStackCinder(Plugin): + if self.get_option("log"): + self.add_copy_spec(["/var/log/cinder/"]) + ++ def postproc(self): ++ protect_keys = [ ++ "admin_password", "backup_tsm_password", "chap_password", ++ "nas_password", "cisco_fc_fabric_password", "coraid_password", ++ "eqlx_chap_password", "fc_fabric_password", ++ "hitachi_auth_password", "hitachi_horcm_password", ++ "hp3par_password", "hplefthand_password", "memcache_secret_key", ++ "netapp_password", "netapp_sa_password", "nexenta_password", ++ "password", "qpid_password", "rabbit_password", "san_password", ++ "ssl_key_password", "vmware_host_password", "zadara_password", ++ "zfssa_initiator_password", "connection", "zfssa_target_password", ++ "os_privileged_user_password", "hmac_keys" ++ ] ++ ++ regexp = r"((?m)^\s*(%s)\s*=\s*)(.*)" % "|".join(protect_keys) ++ self.do_path_regex_sub("/etc/cinder/*", regexp, r"\1*********") ++ + + class DebianOpenStackCinder(OpenStackCinder, DebianPlugin, UbuntuPlugin): + +diff --git a/sos/plugins/openstack_glance.py b/sos/plugins/openstack_glance.py +index 35c406a..33e69a9 100644 +--- a/sos/plugins/openstack_glance.py ++++ b/sos/plugins/openstack_glance.py +@@ -38,6 +38,16 @@ class OpenStackGlance(plugins.Plugin): + "/var/log/glance/" + ]) + ++ def postproc(self): ++ protect_keys = [ ++ "admin_password", "password", "qpid_password", "rabbit_password", ++ "s3_store_secret_key", "ssl_key_password", "connection", ++ "vmware_server_password" ++ ] ++ ++ regexp = r"((?m)^\s*(%s)\s*=\s*)(.*)" % "|".join(protect_keys) ++ self.do_path_regex_sub("/etc/glance/*", regexp, r"\1*********") ++ + + class DebianOpenStackGlance(OpenStackGlance, + plugins.DebianPlugin, + +diff --git a/sos/plugins/openstack_heat.py b/sos/plugins/openstack_heat.py +index 70185db..b60285a 100644 +--- a/sos/plugins/openstack_heat.py ++++ b/sos/plugins/openstack_heat.py +@@ -36,6 +36,15 @@ class OpenStackHeat(Plugin): + "/var/log/heat/" + ]) + ++ def postproc(self): ++ protect_keys = [ ++ "admin_password", "memcache_secret_key", "password", "connection", ++ "qpid_password", "rabbit_password", "stack_domain_admin_password", ++ ] ++ ++ regexp = r"((?m)^\s*(%s)\s*=\s*)(.*)" % "|".join(protect_keys) ++ self.do_path_regex_sub("/etc/heat/*", regexp, r"\1*********") ++ + + class DebianOpenStack(OpenStackHeat, + plugins.DebianPlugin, + +diff --git a/sos/plugins/openstack_horizon.py b/sos/plugins/openstack_horizon.py +index 4c93cd9..5449ce9 100644 +--- a/sos/plugins/openstack_horizon.py ++++ b/sos/plugins/openstack_horizon.py +@@ -33,6 +33,15 @@ class OpenStackHorizon(Plugin): + if self.get_option("log"): + self.add_copy_spec("/var/log/horizon/") + ++ def postproc(self): ++ protect_keys = [ ++ "SECRET_KEY", "EMAIL_HOST_PASSWORD" ++ ] ++ ++ regexp = r"((?m)^\s*(%s)\s*=\s*)(.*)" % "|".join(protect_keys) ++ self.do_path_regex_sub("/etc/openstack-dashboard/*", ++ regexp, r"\1*********") ++ + + class DebianOpenStackHorizon(OpenStackHorizon, DebianPlugin): + +diff --git a/sos/plugins/openstack_keystone.py b/sos/plugins/openstack_keystone.py +index 7d93d88..bff9ef6 100644 +--- a/sos/plugins/openstack_keystone.py ++++ b/sos/plugins/openstack_keystone.py +@@ -38,21 +38,14 @@ class OpenStackKeystone(Plugin): + self.add_copy_spec("/var/log/keystone/") + + def postproc(self): +- self.do_file_sub('/etc/keystone/keystone.conf', +- r"(?m)^(admin_password.*=)(.*)", +- r"\1 ******") +- self.do_file_sub('/etc/keystone/keystone.conf', +- r"(?m)^(admin_token.*=)(.*)", +- r"\1 ******") +- self.do_file_sub('/etc/keystone/keystone.conf', +- r"(?m)^(connection.*=.*mysql://)(.*)(:)(.*)(@)(.*)", +- r"\1\2:******@\6") +- self.do_file_sub('/etc/keystone/keystone.conf', +- r"(?m)^(password.*=)(.*)", +- r"\1 ******") +- self.do_file_sub('/etc/keystone/keystone.conf', +- r"(?m)^(ca_password.*=)(.*)", +- r"\1 ******") ++ protect_keys = [ ++ "password", "qpid_password", "rabbit_password", "ssl_key_password", ++ "ldap_dns_password", "neutron_admin_password", "host_password", ++ "connection", "admin_password", "admin_token", "ca_password" ++ ] ++ ++ regexp = r"((?m)^\s*(%s)\s*=\s*)(.*)" % "|".join(protect_keys) ++ self.do_path_regex_sub("/etc/keystone/*", regexp, r"\1*********") + + + class DebianOpenStackKeystone(OpenStackKeystone, DebianPlugin, UbuntuPlugin): +diff --git a/sos/plugins/openstack_neutron.py b/sos/plugins/openstack_neutron.py +index ab895c8..91ee9f5 100644 +--- a/sos/plugins/openstack_neutron.py ++++ b/sos/plugins/openstack_neutron.py +@@ -14,7 +14,6 @@ + # along with this program; if not, write to the Free Software + # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +-import glob + import os + import re + +@@ -55,16 +54,16 @@ class Neutron(Plugin): + protect_keys = [ + "rabbit_password", "qpid_password", "nova_admin_password", + "xenapi_connection_password", "password", "connection", +- "admin_password", "metadata_proxy_shared_secret", "qpid_password", +- "eapi_password", "crd_password", "primary_l3_host_password", +- "serverauth", "ucsm_password", "ha_vrrp_auth_password", +- "ssl_key_password", "nsx_password", "vcenter_password", +- "edge_appliance_password", "tenant_admin_password", "apic_password" ++ "admin_password", "metadata_proxy_shared_secret", "eapi_password", ++ "crd_password", "primary_l3_host_password", "serverauth", ++ "ucsm_password", "ha_vrrp_auth_password", "ssl_key_password", ++ "nsx_password", "vcenter_password", "edge_appliance_password", ++ "tenant_admin_password", "apic_password" + ] +- regexp = r"((?m)^\s*#*(%s)\s*=\s*)(.*)" % "|".join(protect_keys) ++ regexp = r"((?m)^\s*(%s)\s*=\s*)(.*)" % "|".join(protect_keys) + +- for config_file in glob.glob("/etc/%s/*" % self.component_name): +- self.do_file_sub(config_file, regexp, r"\1*********") ++ self.do_path_regex_sub("/etc/%s/*" % self.component_name, ++ regexp, r"\1*********") + + def netns_dumps(self): + # It would've been beautiful if we could get parts of the networking +diff --git a/sos/plugins/openstack_nova.py b/sos/plugins/openstack_nova.py +index 20fb3a3..e226dac 100644 +--- a/sos/plugins/openstack_nova.py ++++ b/sos/plugins/openstack_nova.py +@@ -66,13 +66,13 @@ class OpenStackNova(Plugin): + "ldap_dns_password", "neutron_admin_password", "rabbit_password", + "qpid_password", "powervm_mgr_passwd", "virtual_power_host_pass", + "xenapi_connection_password", "password", "host_password", +- "vnc_password", "connection", "sql_connection", "admin_password" ++ "vnc_password", "connection", "sql_connection", "admin_password", ++ "connection_password", "memcache_secret_key", "s3_secret_key", ++ "metadata_proxy_shared_secret" + ] + +- regexp = r"((?m)^\s*#*(%s)\s*=\s*)(.*)" % "|".join(protect_keys) +- +- for conf_file in ["/etc/nova/nova.conf", "/etc/nova/api-paste.ini"]: +- self.do_file_sub(conf_file, regexp, r"\1*********") ++ regexp = r"((?m)^\s*(%s)\s*=\s*)(.*)" % "|".join(protect_keys) ++ self.do_path_regex_sub("/etc/nova/*", regexp, r"\1*********") + + + class DebianOpenStackNova(OpenStackNova, DebianPlugin, UbuntuPlugin): +diff --git a/sos/plugins/openstack_sahara.py b/sos/plugins/openstack_sahara.py +index 9d971ba..18e56d7 100644 +--- a/sos/plugins/openstack_sahara.py ++++ b/sos/plugins/openstack_sahara.py +@@ -33,14 +33,13 @@ class OpenStackSahara(Plugin): + + def postproc(self): + protect_keys = [ +- 'memcache_secret_key', 'qpid_password', 'rabbit_password', +- 'admin_password', 'password', 'ssl_key_password', +- 'admin_token', 'connection' ++ "admin_password", "memcache_secret_key", "password", ++ "qpid_password", "rabbit_password", "ssl_key_password", ++ "xenapi_connection_password", "connection" + ] + +- regexp = r"((?m)^\s*#*(%s)\s*=\s*)(.*)" % "|".join(protect_keys) +- +- self.do_file_sub('/etc/sahara/sahara.conf', regexp, r"\1*********") ++ regexp = r"((?m)^\s*(%s)\s*=\s*)(.*)" % "|".join(protect_keys) ++ self.do_path_regex_sub("/etc/sahara/*", regexp, r"\1*********") + + + class DebianOpenStackSahara(OpenStackSahara, DebianPlugin, UbuntuPlugin): +diff --git a/sos/plugins/openstack_swift.py b/sos/plugins/openstack_swift.py +index f0f94bb..f337331 100644 +--- a/sos/plugins/openstack_swift.py ++++ b/sos/plugins/openstack_swift.py +@@ -33,6 +33,17 @@ class OpenStackSwift(Plugin): + # Swift + self.add_copy_spec("/etc/swift/") + ++ def postproc(self): ++ protect_keys = [ ++ "ldap_dns_password", "neutron_admin_password", "rabbit_password", ++ "qpid_password", "powervm_mgr_passwd", "virtual_power_host_pass", ++ "xenapi_connection_password", "password", "host_password", ++ "vnc_password", "connection", "sql_connection", "admin_password" ++ ] ++ ++ regexp = r"((?m)^\s*(%s)\s*=\s*)(.*)" % "|".join(protect_keys) ++ self.do_path_regex_sub("/etc/swift/*.conf*", regexp, r"\1*********") ++ + + class DebianOpenStackSwift(OpenStackSwift, DebianPlugin, UbuntuPlugin): + +diff --git a/sos/plugins/openstack_trove.py b/sos/plugins/openstack_trove.py +index 3b87506..566ae42 100644 +--- a/sos/plugins/openstack_trove.py ++++ b/sos/plugins/openstack_trove.py +@@ -14,6 +14,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, DebianPlugin, UbuntuPlugin + + +@@ -34,21 +35,13 @@ class OpenStackTrove(Plugin): + def postproc(self): + + protect_keys = [ +- "dns_passkey", "nova_proxy_admin_pass", "rabbit_password", +- "qpid_password", "connection", "sql_connection", "admin_password" +- ] +- +- conf_list = [ +- '/etc/trove/trove.conf', +- '/etc/trove/trove-conductor.conf', +- '/etc/trove/trove-guestmanager.conf', +- '/etc/trove/trove-taskmanager.conf' ++ "default_password_length", "notifier_queue_password", ++ "rabbit_password", "replication_password", "connection", ++ "admin_password", "dns_passkey" + ] + +- regexp = r"((?m)^\s*#*(%s)\s*=\s*)(.*)" % "|".join(protect_keys) +- +- for conf in conf_list: +- self.do_file_sub(conf, regexp, r"\1*********") ++ regexp = r"((?m)^\s*(%s)\s*=\s*)(.*)" % "|".join(protect_keys) ++ self.do_path_regex_sub("/etc/trove/*", regexp, r"\1*********") + + + class DebianOpenStackTrove(OpenStackTrove, DebianPlugin, UbuntuPlugin): +-- +1.8.3.1 + +From 08ba22aebb066de389cffed414a725e61a6b86d7 Mon Sep 17 00:00:00 2001 +From: Pavel Moravec +Date: Mon, 7 Sep 2015 09:54:17 +0200 +Subject: [PATCH] [openstack_neutron] obfuscate server_auth in restproxy.ini + +server_auth secrets in /etc/neutron/plugins/ml2/restproxy.ini need to be +obfuscated. + +Resolves: #639 + +Signed-off-by: Pavel Moravec +--- + sos/plugins/openstack_neutron.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/sos/plugins/openstack_neutron.py b/sos/plugins/openstack_neutron.py +index 91ee9f5..fc494d2 100644 +--- a/sos/plugins/openstack_neutron.py ++++ b/sos/plugins/openstack_neutron.py +@@ -58,7 +58,7 @@ class Neutron(Plugin): + "crd_password", "primary_l3_host_password", "serverauth", + "ucsm_password", "ha_vrrp_auth_password", "ssl_key_password", + "nsx_password", "vcenter_password", "edge_appliance_password", +- "tenant_admin_password", "apic_password" ++ "tenant_admin_password", "apic_password", "server_auth" + ] + regexp = r"((?m)^\s*(%s)\s*=\s*)(.*)" % "|".join(protect_keys) + +-- +1.8.3.1 + diff --git a/SOURCES/sos-bz1244648-openstack-obfuscate-passwords-secrets.patch b/SOURCES/sos-bz1244648-openstack-obfuscate-passwords-secrets.patch deleted file mode 100644 index 1bcce57..0000000 --- a/SOURCES/sos-bz1244648-openstack-obfuscate-passwords-secrets.patch +++ /dev/null @@ -1,318 +0,0 @@ -From 02ef6e2ba8d1a8fe4468aaa8be0ae88f8c74646a Mon Sep 17 00:00:00 2001 -From: Lee Yarwood -Date: Wed, 15 Jul 2015 15:42:50 +0100 -Subject: [PATCH] [openstack] Ensure openstack passwords and secrets are - obfuscated. - -- Add a postproc method to ceilometer, cinder, glance, hoirzon and swift. -- Add missing keys to the remaining plugins. -- Modify the regular expression used by all plugins to ignore commented - out keys. -- Modify all plugins to use do_path_regex_sub() to apply regex to all - collected configuration files. - -Resolves: #574 - -Signed-off-by: Lee Yarwood ---- - sos/plugins/openstack_ceilometer.py | 12 ++++++++++++ - sos/plugins/openstack_cinder.py | 17 +++++++++++++++++ - sos/plugins/openstack_glance.py | 10 ++++++++++ - sos/plugins/openstack_heat.py | 9 +++++++++ - sos/plugins/openstack_horizon.py | 9 +++++++++ - sos/plugins/openstack_keystone.py | 23 ++++++++--------------- - sos/plugins/openstack_neutron.py | 17 ++++++++--------- - sos/plugins/openstack_nova.py | 10 +++++----- - sos/plugins/openstack_sahara.py | 11 +++++------ - sos/plugins/openstack_swift.py | 11 +++++++++++ - sos/plugins/openstack_trove.py | 19 ++++++------------- - 11 files changed, 100 insertions(+), 48 deletions(-) - -diff --git a/sos/plugins/openstack_ceilometer.py b/sos/plugins/openstack_ceilometer.py -index 7c11057..44a733b 100644 ---- a/sos/plugins/openstack_ceilometer.py -+++ b/sos/plugins/openstack_ceilometer.py -@@ -35,6 +35,18 @@ class OpenStackCeilometer(Plugin): - "/var/log/ceilometer" - ]) - -+ def postproc(self): -+ protect_keys = [ -+ "admin_password", "connection_password", "host_password", -+ "memcache_secret_key", "os_password", "password", "qpid_password", -+ "rabbit_password", "readonly_user_password", "secret_key", -+ "ssl_key_password", "telemetry_secret", "connection", -+ "metering_secret" -+ ] -+ -+ regexp = r"((?m)^\s*(%s)\s*=\s*)(.*)" % "|".join(protect_keys) -+ self.do_path_regex_sub("/etc/ceilometer/*", regexp, r"\1*********") -+ - - class DebianOpenStackCeilometer(OpenStackCeilometer, DebianPlugin, - UbuntuPlugin): -diff --git a/sos/plugins/openstack_cinder.py b/sos/plugins/openstack_cinder.py -index 8588f6c..2f22b5a 100644 ---- a/sos/plugins/openstack_cinder.py -+++ b/sos/plugins/openstack_cinder.py -@@ -42,6 +42,23 @@ class OpenStackCinder(Plugin): - if self.get_option("log"): - self.add_copy_spec(["/var/log/cinder/"]) - -+ def postproc(self): -+ protect_keys = [ -+ "admin_password", "backup_tsm_password", "chap_password", -+ "nas_password", "cisco_fc_fabric_password", "coraid_password", -+ "eqlx_chap_password", "fc_fabric_password", -+ "hitachi_auth_password", "hitachi_horcm_password", -+ "hp3par_password", "hplefthand_password", "memcache_secret_key", -+ "netapp_password", "netapp_sa_password", "nexenta_password", -+ "password", "qpid_password", "rabbit_password", "san_password", -+ "ssl_key_password", "vmware_host_password", "zadara_password", -+ "zfssa_initiator_password", "connection", "zfssa_target_password", -+ "os_privileged_user_password", "hmac_keys" -+ ] -+ -+ regexp = r"((?m)^\s*(%s)\s*=\s*)(.*)" % "|".join(protect_keys) -+ self.do_path_regex_sub("/etc/cinder/*", regexp, r"\1*********") -+ - - class DebianOpenStackCinder(OpenStackCinder, DebianPlugin, UbuntuPlugin): - -diff --git a/sos/plugins/openstack_glance.py b/sos/plugins/openstack_glance.py -index 35c406a..33e69a9 100644 ---- a/sos/plugins/openstack_glance.py -+++ b/sos/plugins/openstack_glance.py -@@ -38,6 +38,16 @@ class OpenStackGlance(plugins.Plugin): - "/var/log/glance/" - ]) - -+ def postproc(self): -+ protect_keys = [ -+ "admin_password", "password", "qpid_password", "rabbit_password", -+ "s3_store_secret_key", "ssl_key_password", "connection", -+ "vmware_server_password" -+ ] -+ -+ regexp = r"((?m)^\s*(%s)\s*=\s*)(.*)" % "|".join(protect_keys) -+ self.do_path_regex_sub("/etc/glance/*", regexp, r"\1*********") -+ - - class DebianOpenStackGlance(OpenStackGlance, - plugins.DebianPlugin, - -diff --git a/sos/plugins/openstack_heat.py b/sos/plugins/openstack_heat.py -index 70185db..b60285a 100644 ---- a/sos/plugins/openstack_heat.py -+++ b/sos/plugins/openstack_heat.py -@@ -36,6 +36,15 @@ class OpenStackHeat(Plugin): - "/var/log/heat/" - ]) - -+ def postproc(self): -+ protect_keys = [ -+ "admin_password", "memcache_secret_key", "password", "connection", -+ "qpid_password", "rabbit_password", "stack_domain_admin_password", -+ ] -+ -+ regexp = r"((?m)^\s*(%s)\s*=\s*)(.*)" % "|".join(protect_keys) -+ self.do_path_regex_sub("/etc/heat/*", regexp, r"\1*********") -+ - - class DebianOpenStack(OpenStackHeat, - plugins.DebianPlugin, - -diff --git a/sos/plugins/openstack_horizon.py b/sos/plugins/openstack_horizon.py -index 4c93cd9..5449ce9 100644 ---- a/sos/plugins/openstack_horizon.py -+++ b/sos/plugins/openstack_horizon.py -@@ -33,6 +33,15 @@ class OpenStackHorizon(Plugin): - if self.get_option("log"): - self.add_copy_spec("/var/log/horizon/") - -+ def postproc(self): -+ protect_keys = [ -+ "SECRET_KEY", "EMAIL_HOST_PASSWORD" -+ ] -+ -+ regexp = r"((?m)^\s*(%s)\s*=\s*)(.*)" % "|".join(protect_keys) -+ self.do_path_regex_sub("/etc/openstack-dashboard/*", -+ regexp, r"\1*********") -+ - - class DebianOpenStackHorizon(OpenStackHorizon, DebianPlugin): - -diff --git a/sos/plugins/openstack_keystone.py b/sos/plugins/openstack_keystone.py -index 7d93d88..bff9ef6 100644 ---- a/sos/plugins/openstack_keystone.py -+++ b/sos/plugins/openstack_keystone.py -@@ -38,21 +38,14 @@ class OpenStackKeystone(Plugin): - self.add_copy_spec("/var/log/keystone/") - - def postproc(self): -- self.do_file_sub('/etc/keystone/keystone.conf', -- r"(?m)^(admin_password.*=)(.*)", -- r"\1 ******") -- self.do_file_sub('/etc/keystone/keystone.conf', -- r"(?m)^(admin_token.*=)(.*)", -- r"\1 ******") -- self.do_file_sub('/etc/keystone/keystone.conf', -- r"(?m)^(connection.*=.*mysql://)(.*)(:)(.*)(@)(.*)", -- r"\1\2:******@\6") -- self.do_file_sub('/etc/keystone/keystone.conf', -- r"(?m)^(password.*=)(.*)", -- r"\1 ******") -- self.do_file_sub('/etc/keystone/keystone.conf', -- r"(?m)^(ca_password.*=)(.*)", -- r"\1 ******") -+ protect_keys = [ -+ "password", "qpid_password", "rabbit_password", "ssl_key_password", -+ "ldap_dns_password", "neutron_admin_password", "host_password", -+ "connection", "admin_password", "admin_token", "ca_password" -+ ] -+ -+ regexp = r"((?m)^\s*(%s)\s*=\s*)(.*)" % "|".join(protect_keys) -+ self.do_path_regex_sub("/etc/keystone/*", regexp, r"\1*********") - - - class DebianOpenStackKeystone(OpenStackKeystone, DebianPlugin, UbuntuPlugin): -diff --git a/sos/plugins/openstack_neutron.py b/sos/plugins/openstack_neutron.py -index ab895c8..91ee9f5 100644 ---- a/sos/plugins/openstack_neutron.py -+++ b/sos/plugins/openstack_neutron.py -@@ -14,7 +14,6 @@ - # along with this program; if not, write to the Free Software - # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - --import glob - import os - import re - -@@ -55,16 +54,16 @@ class Neutron(Plugin): - protect_keys = [ - "rabbit_password", "qpid_password", "nova_admin_password", - "xenapi_connection_password", "password", "connection", -- "admin_password", "metadata_proxy_shared_secret", "qpid_password", -- "eapi_password", "crd_password", "primary_l3_host_password", -- "serverauth", "ucsm_password", "ha_vrrp_auth_password", -- "ssl_key_password", "nsx_password", "vcenter_password", -- "edge_appliance_password", "tenant_admin_password", "apic_password" -+ "admin_password", "metadata_proxy_shared_secret", "eapi_password", -+ "crd_password", "primary_l3_host_password", "serverauth", -+ "ucsm_password", "ha_vrrp_auth_password", "ssl_key_password", -+ "nsx_password", "vcenter_password", "edge_appliance_password", -+ "tenant_admin_password", "apic_password" - ] -- regexp = r"((?m)^\s*#*(%s)\s*=\s*)(.*)" % "|".join(protect_keys) -+ regexp = r"((?m)^\s*(%s)\s*=\s*)(.*)" % "|".join(protect_keys) - -- for config_file in glob.glob("/etc/%s/*" % self.component_name): -- self.do_file_sub(config_file, regexp, r"\1*********") -+ self.do_path_regex_sub("/etc/%s/*" % self.component_name, -+ regexp, r"\1*********") - - def netns_dumps(self): - # It would've been beautiful if we could get parts of the networking -diff --git a/sos/plugins/openstack_nova.py b/sos/plugins/openstack_nova.py -index 20fb3a3..e226dac 100644 ---- a/sos/plugins/openstack_nova.py -+++ b/sos/plugins/openstack_nova.py -@@ -66,13 +66,13 @@ class OpenStackNova(Plugin): - "ldap_dns_password", "neutron_admin_password", "rabbit_password", - "qpid_password", "powervm_mgr_passwd", "virtual_power_host_pass", - "xenapi_connection_password", "password", "host_password", -- "vnc_password", "connection", "sql_connection", "admin_password" -+ "vnc_password", "connection", "sql_connection", "admin_password", -+ "connection_password", "memcache_secret_key", "s3_secret_key", -+ "metadata_proxy_shared_secret" - ] - -- regexp = r"((?m)^\s*#*(%s)\s*=\s*)(.*)" % "|".join(protect_keys) -- -- for conf_file in ["/etc/nova/nova.conf", "/etc/nova/api-paste.ini"]: -- self.do_file_sub(conf_file, regexp, r"\1*********") -+ regexp = r"((?m)^\s*(%s)\s*=\s*)(.*)" % "|".join(protect_keys) -+ self.do_path_regex_sub("/etc/nova/*", regexp, r"\1*********") - - - class DebianOpenStackNova(OpenStackNova, DebianPlugin, UbuntuPlugin): -diff --git a/sos/plugins/openstack_sahara.py b/sos/plugins/openstack_sahara.py -index 9d971ba..18e56d7 100644 ---- a/sos/plugins/openstack_sahara.py -+++ b/sos/plugins/openstack_sahara.py -@@ -33,14 +33,13 @@ class OpenStackSahara(Plugin): - - def postproc(self): - protect_keys = [ -- 'memcache_secret_key', 'qpid_password', 'rabbit_password', -- 'admin_password', 'password', 'ssl_key_password', -- 'admin_token', 'connection' -+ "admin_password", "memcache_secret_key", "password", -+ "qpid_password", "rabbit_password", "ssl_key_password", -+ "xenapi_connection_password", "connection" - ] - -- regexp = r"((?m)^\s*#*(%s)\s*=\s*)(.*)" % "|".join(protect_keys) -- -- self.do_file_sub('/etc/sahara/sahara.conf', regexp, r"\1*********") -+ regexp = r"((?m)^\s*(%s)\s*=\s*)(.*)" % "|".join(protect_keys) -+ self.do_path_regex_sub("/etc/sahara/*", regexp, r"\1*********") - - - class DebianOpenStackSahara(OpenStackSahara, DebianPlugin, UbuntuPlugin): -diff --git a/sos/plugins/openstack_swift.py b/sos/plugins/openstack_swift.py -index f0f94bb..f337331 100644 ---- a/sos/plugins/openstack_swift.py -+++ b/sos/plugins/openstack_swift.py -@@ -33,6 +33,17 @@ class OpenStackSwift(Plugin): - # Swift - self.add_copy_spec("/etc/swift/") - -+ def postproc(self): -+ protect_keys = [ -+ "ldap_dns_password", "neutron_admin_password", "rabbit_password", -+ "qpid_password", "powervm_mgr_passwd", "virtual_power_host_pass", -+ "xenapi_connection_password", "password", "host_password", -+ "vnc_password", "connection", "sql_connection", "admin_password" -+ ] -+ -+ regexp = r"((?m)^\s*(%s)\s*=\s*)(.*)" % "|".join(protect_keys) -+ self.do_path_regex_sub("/etc/swift/*.conf*", regexp, r"\1*********") -+ - - class DebianOpenStackSwift(OpenStackSwift, DebianPlugin, UbuntuPlugin): - --- -1.8.3.1 - -From 08ba22aebb066de389cffed414a725e61a6b86d7 Mon Sep 17 00:00:00 2001 -From: Pavel Moravec -Date: Mon, 7 Sep 2015 09:54:17 +0200 -Subject: [PATCH] [openstack_neutron] obfuscate server_auth in restproxy.ini - -server_auth secrets in /etc/neutron/plugins/ml2/restproxy.ini need to be -obfuscated. - -Resolves: #639 - -Signed-off-by: Pavel Moravec ---- - sos/plugins/openstack_neutron.py | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/sos/plugins/openstack_neutron.py b/sos/plugins/openstack_neutron.py -index 91ee9f5..fc494d2 100644 ---- a/sos/plugins/openstack_neutron.py -+++ b/sos/plugins/openstack_neutron.py -@@ -58,7 +58,7 @@ class Neutron(Plugin): - "crd_password", "primary_l3_host_password", "serverauth", - "ucsm_password", "ha_vrrp_auth_password", "ssl_key_password", - "nsx_password", "vcenter_password", "edge_appliance_password", -- "tenant_admin_password", "apic_password" -+ "tenant_admin_password", "apic_password", "server_auth" - ] - regexp = r"((?m)^\s*(%s)\s*=\s*)(.*)" % "|".join(protect_keys) - --- -1.8.3.1 - diff --git a/SOURCES/sos-bz1245770-collect-docker-daemon-logs.patch b/SOURCES/sos-bz1245770-collect-docker-daemon-logs.patch new file mode 100644 index 0000000..03450e1 --- /dev/null +++ b/SOURCES/sos-bz1245770-collect-docker-daemon-logs.patch @@ -0,0 +1,65 @@ +From 4edd40d584879ebd81bce88f04bc294789175eb0 Mon Sep 17 00:00:00 2001 +From: "Bryn M. Reeves" +Date: Wed, 7 Oct 2015 12:56:55 +0100 +Subject: [PATCH 1/2] [kubernetes] do not reverse-sort journald logs + +Drop the '-r' when obtaining logs from journald to be consistent +with other plugins: users can sort log entries in whatever order +they prefer on the analysis system. + +Signed-off-by: Bryn M. Reeves +--- + sos/plugins/kubernetes.py | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +diff --git a/sos/plugins/kubernetes.py b/sos/plugins/kubernetes.py +index 59b6b53..3399b2e 100644 +--- a/sos/plugins/kubernetes.py ++++ b/sos/plugins/kubernetes.py +@@ -35,11 +35,11 @@ class kubernetes(Plugin, RedHatPlugin): + 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") +- 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") ++ self.add_cmd_output("journalctl -u kubelet") ++ self.add_cmd_output("journalctl -u kube-apiserver") ++ self.add_cmd_output("journalctl -u kube-controller-manager") ++ self.add_cmd_output("journalctl -u kube-scheduler") ++ self.add_cmd_output("journalctl -u kube-proxy") + + if self.get_option('podslog'): + result = self.get_command_output("kubectl get pods") +-- +1.8.3.1 + +From 3ce984a7d220669eaf2e6c08d983679183fb55fe Mon Sep 17 00:00:00 2001 +From: "Bryn M. Reeves" +Date: Wed, 7 Oct 2015 13:03:45 +0100 +Subject: [PATCH 2/2] [docker] collect journald logs for docker unit + +Fixes: #609. + +Signed-off-by: Bryn M. Reeves +--- + sos/plugins/docker.py | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/sos/plugins/docker.py b/sos/plugins/docker.py +index c5ea8a0..aab558d 100644 +--- a/sos/plugins/docker.py ++++ b/sos/plugins/docker.py +@@ -34,6 +34,7 @@ class Docker(Plugin): + ]) + + self.add_cmd_output([ ++ "journalctl -u docker", + "{0} info".format(self.docker_bin), + "{0} ps".format(self.docker_bin), + "{0} images".format(self.docker_bin) +-- +1.8.3.1 + diff --git a/SOURCES/sos-bz1248672-pick-up-symlink-targets.patch b/SOURCES/sos-bz1248672-pick-up-symlink-targets.patch new file mode 100644 index 0000000..36dc409 --- /dev/null +++ b/SOURCES/sos-bz1248672-pick-up-symlink-targets.patch @@ -0,0 +1,26 @@ +From 4d8b5418b1cf218ef9746674ca5935a7f4f3983e Mon Sep 17 00:00:00 2001 +From: "Bryn M. Reeves" +Date: Fri, 31 Jul 2015 10:21:17 +0100 +Subject: [PATCH] [Plugin] fix handling of symlinks in non-sysroot environments + +Signed-off-by: Bryn M. Reeves +--- + sos/plugins/__init__.py | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/sos/plugins/__init__.py b/sos/plugins/__init__.py +index aed7496..6731b28 100644 +--- a/sos/plugins/__init__.py ++++ b/sos/plugins/__init__.py +@@ -163,6 +163,8 @@ class Plugin(object): + return os.path.join(self.sysroot, path) + + def strip_sysroot(self, path): ++ if not self.use_sysroot(): ++ return path + if path.startswith(self.sysroot): + return path[len(self.sysroot):] + return path +-- +1.8.3.1 + diff --git a/SOURCES/sos-bz1249705-logs-plugin-traceback.patch b/SOURCES/sos-bz1249705-logs-plugin-traceback.patch new file mode 100644 index 0000000..c6d2360 --- /dev/null +++ b/SOURCES/sos-bz1249705-logs-plugin-traceback.patch @@ -0,0 +1,25 @@ +From b3faad3f82ee1f735e2221bb2f39b8b8aeaf0e86 Mon Sep 17 00:00:00 2001 +From: "Bryn M. Reeves" +Date: Mon, 3 Aug 2015 16:39:53 +0100 +Subject: [PATCH] [logs] fix reference to missing 'rsyslog_conf' variable + +Signed-off-by: Bryn M. Reeves +--- + sos/plugins/logs.py | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/sos/plugins/logs.py b/sos/plugins/logs.py +index 7957898..70ef537 100644 +--- a/sos/plugins/logs.py ++++ b/sos/plugins/logs.py +@@ -42,6 +42,7 @@ class Logs(Plugin): + logs = self.do_regex_find_all("^\S+\s+(-?\/.*$)\s+", syslog_conf) + if self.is_installed("rsyslog") \ + or os.path.exists("/etc/rsyslog.conf"): ++ rsyslog_conf = self.join_sysroot("/etc/rsyslog.conf") + logs += self.do_regex_find_all("^\S+\s+(-?\/.*$)\s+", + rsyslog_conf) + for i in logs: +-- +1.8.3.1 + diff --git a/SOURCES/sos-centos-branding.patch b/SOURCES/sos-centos-branding.patch deleted file mode 100644 index 86ab010..0000000 --- a/SOURCES/sos-centos-branding.patch +++ /dev/null @@ -1,1288 +0,0 @@ -diff -uNrp sos-3.0.orig/po/af.po sos-3.0/po/af.po ---- sos-3.0.orig/po/af.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/af.po 2014-06-21 11:15:36.435724571 -0500 -@@ -168,7 +168,7 @@ msgid "Cannot upload to specified URL." - msgstr "" - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." -+msgid "There was a problem uploading your report to CentOS support." - msgstr "" - - #: ../sos/policyredhat.py:401 -diff -uNrp sos-3.0.orig/po/am.po sos-3.0/po/am.po ---- sos-3.0.orig/po/am.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/am.po 2014-06-21 11:15:36.436724563 -0500 -@@ -168,7 +168,7 @@ msgid "Cannot upload to specified URL." - msgstr "" - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." -+msgid "There was a problem uploading your report to CentOS support." - msgstr "" - - #: ../sos/policyredhat.py:401 -diff -uNrp sos-3.0.orig/po/ar.po sos-3.0/po/ar.po ---- sos-3.0.orig/po/ar.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/ar.po 2014-06-21 11:16:38.081245080 -0500 -@@ -179,8 +179,8 @@ msgid "Cannot upload to specified URL." - msgstr "لا يمكن الرفع للعنوان المحدّد" - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." --msgstr "صودفت مشكلة برفع تقريرك إلى دعم Red Hat. " -+msgid "There was a problem uploading your report to CentOS support." -+msgstr "صودفت مشكلة برفع تقريرك إلى دعم CentOS. " - - #: ../sos/policyredhat.py:401 - #, python-format -diff -uNrp sos-3.0.orig/po/as.po sos-3.0/po/as.po ---- sos-3.0.orig/po/as.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/as.po 2014-06-21 11:15:36.437724555 -0500 -@@ -85,11 +85,11 @@ msgid "" - "No changes will be made to your system.\n" - "\n" - msgstr "" --"এই সামগ্ৰীৰ সহায়ত যান্ত্ৰিক সামগ্ৰী আৰু Red Hat Enterprise Linux\n" -+"এই সামগ্ৰীৰ সহায়ত যান্ত্ৰিক সামগ্ৰী আৰু CentOS Enterprise Linux\n" - "প্ৰণালীৰ প্ৰতিষ্ঠা সম্পৰ্কে বিশদ তথ্য সংগ্ৰহ কৰা হ'ব ।\n" - "তথ্য সংগ্ৰহৰ পিছত /tmp পঞ্জিকাৰ অধীন এটা আৰ্কাইভ নিৰ্মিত হয় ।\n" - "এই আৰ্কাইভ আপুনি সহায়তা প্ৰতিনিধিৰ কাশত পঠায় দিব পাৰে ।\n" --"Red Hat দ্বাৰা এই তথ্য অকল সমস্যাৰ কাৰণ নিৰ্ণয় কৰাৰ বাবে ব্যৱহাৰ কৰা হ'ব\n" -+"CentOS দ্বাৰা এই তথ্য অকল সমস্যাৰ কাৰণ নিৰ্ণয় কৰাৰ বাবে ব্যৱহাৰ কৰা হ'ব\n" - "আৰু ইয়াৰ গোপনীয়তা বজায় ৰাখা হ'ব ।\n" - "\n" - "এই কাম সম্পন্ন হ'বলৈ কিছু সময় ব্যয় হ'ব পাৰে ।\n" -@@ -184,14 +184,14 @@ msgid "Cannot upload to specified URL." - msgstr "উল্লিখিত URL-এ আপলোড কৰিবলৈ ব্যৰ্থ ।" - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." --msgstr "আপোনাৰ ৰিপোৰ্টটি Red Hat সহায়তা ব্যৱস্থাত আপলোড কৰিবলৈ সমস্যা ।" -+msgid "There was a problem uploading your report to CentOS support." -+msgstr "আপোনাৰ ৰিপোৰ্টটি CentOS সহায়তা ব্যৱস্থাত আপলোড কৰিবলৈ সমস্যা ।" - - #: ../sos/policyredhat.py:401 - #, fuzzy, python-format - msgid "Your report was successfully uploaded to %s with name:" - msgstr "" --"আপোনাৰ প্ৰদত্ত ৰিপোৰ্ট সফলতাৰে সৈতে Red Hat-ৰ ftp সেৱকত নিম্নলিখিত নামত আপলোড " -+"আপোনাৰ প্ৰদত্ত ৰিপোৰ্ট সফলতাৰে সৈতে CentOS-ৰ ftp সেৱকত নিম্নলিখিত নামত আপলোড " - "কৰা হৈছে:" - - #: ../sos/policyredhat.py:404 -diff -uNrp sos-3.0.orig/po/ast.po sos-3.0/po/ast.po ---- sos-3.0.orig/po/ast.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/ast.po 2014-06-21 11:17:08.318010034 -0500 -@@ -86,10 +86,10 @@ msgid "" - "\n" - msgstr "" - "Esta utilidá recueyerá dalguna información detallada sobro'l\n" --"hardware y la configuración del to sistema Red Hat Enterprise Linux.\n" -+"hardware y la configuración del to sistema CentOS Enterprise Linux.\n" - "La información recuéyese y críase un ficheru baxo /tmp.\n" - "Ésti puede mandase al to representante de sofitu.\n" --"Red Hat usará esta información pa diagnosticar el sistema\n" -+"CentOS usará esta información pa diagnosticar el sistema\n" - "únicamente y considerará esta información como confidencial.\n" - "\n" - "Esti procesu va llevar un tiempu pa completase.\n" -@@ -184,14 +184,14 @@ msgid "Cannot upload to specified URL." - msgstr "Nun se puede cargar a la URL especificada." - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." -+msgid "There was a problem uploading your report to CentOS support." - msgstr "" --"Hebo un problema al cargar el to informe al equipu d'asistencia de Red Hat" -+"Hebo un problema al cargar el to informe al equipu d'asistencia de CentOS" - - #: ../sos/policyredhat.py:401 - #, fuzzy, python-format - msgid "Your report was successfully uploaded to %s with name:" --msgstr "El to informe cargóse bien a los sirvidores ftp e Red Hat col nome:" -+msgstr "El to informe cargóse bien a los sirvidores ftp e CentOS col nome:" - - #: ../sos/policyredhat.py:404 - msgid "Please communicate this name to your support representative." -diff -uNrp sos-3.0.orig/po/be.po sos-3.0/po/be.po ---- sos-3.0.orig/po/be.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/be.po 2014-06-21 11:15:36.438724547 -0500 -@@ -168,7 +168,7 @@ msgid "Cannot upload to specified URL." - msgstr "" - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." -+msgid "There was a problem uploading your report to CentOS support." - msgstr "" - - #: ../sos/policyredhat.py:401 -diff -uNrp sos-3.0.orig/po/bg.po sos-3.0/po/bg.po ---- sos-3.0.orig/po/bg.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/bg.po 2014-06-21 11:15:36.439724539 -0500 -@@ -172,9 +172,9 @@ msgid "Cannot upload to specified URL." - msgstr "Не може да се качи на посочения URL" - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." -+msgid "There was a problem uploading your report to CentOS support." - msgstr "" --"Възникна проблем при качването на вашия отчет на проддръжката на Red Hat." -+"Възникна проблем при качването на вашия отчет на проддръжката на CentOS." - - #: ../sos/policyredhat.py:401 - #, python-format -diff -uNrp sos-3.0.orig/po/bn_IN.po sos-3.0/po/bn_IN.po ---- sos-3.0.orig/po/bn_IN.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/bn_IN.po 2014-06-21 11:15:36.440724532 -0500 -@@ -184,8 +184,8 @@ msgid "Cannot upload to specified URL." - msgstr "উল্লিখিত URL-এ আপলোড করতে ব্যর্থ।" - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." --msgstr "আপনার রিপোর্টটি Red Hat সহায়তা ব্যবস্থায় আপলোড করতে সমস্যা।" -+msgid "There was a problem uploading your report to CentOS support." -+msgstr "আপনার রিপোর্টটি CentOS সহায়তা ব্যবস্থায় আপলোড করতে সমস্যা।" - - #: ../sos/policyredhat.py:401 - #, python-format -diff -uNrp sos-3.0.orig/po/bn.po sos-3.0/po/bn.po ---- sos-3.0.orig/po/bn.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/bn.po 2014-06-21 11:15:36.440724532 -0500 -@@ -168,7 +168,7 @@ msgid "Cannot upload to specified URL." - msgstr "" - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." -+msgid "There was a problem uploading your report to CentOS support." - msgstr "" - - #: ../sos/policyredhat.py:401 -diff -uNrp sos-3.0.orig/po/bs.po sos-3.0/po/bs.po ---- sos-3.0.orig/po/bs.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/bs.po 2014-06-21 11:15:36.441724524 -0500 -@@ -189,8 +189,8 @@ msgid "Cannot upload to specified URL." - msgstr "Nije se mogao postaviti specificirani URL," - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." --msgstr "Bilo je problema u postavljanju vaseg izvjestaja na Red Hat podrsku. " -+msgid "There was a problem uploading your report to CentOS support." -+msgstr "Bilo je problema u postavljanju vaseg izvjestaja na CentOS podrsku. " - - #: ../sos/policyredhat.py:401 - #, python-format -diff -uNrp sos-3.0.orig/po/ca.po sos-3.0/po/ca.po ---- sos-3.0.orig/po/ca.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/ca.po 2014-06-21 11:15:36.442724516 -0500 -@@ -194,8 +194,8 @@ msgid "Cannot upload to specified URL." - msgstr "No es pot pujar a la URL especificada." - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." --msgstr "Hi ha hagut un problema en pujar l'informe al manteniment de Red Hat." -+msgid "There was a problem uploading your report to CentOS support." -+msgstr "Hi ha hagut un problema en pujar l'informe al manteniment de CentOS." - - #: ../sos/policyredhat.py:401 - #, python-format -diff -uNrp sos-3.0.orig/po/cs.po sos-3.0/po/cs.po ---- sos-3.0.orig/po/cs.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/cs.po 2014-06-21 11:15:36.443724508 -0500 -@@ -183,8 +183,8 @@ msgid "Cannot upload to specified URL." - msgstr "Nelze uložit na uvedené URL." - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." --msgstr "Při odesílání zprávy do firmy Red Hat vznikla chyba." -+msgid "There was a problem uploading your report to CentOS support." -+msgstr "Při odesílání zprávy do firmy CentOS vznikla chyba." - - #: ../sos/policyredhat.py:401 - #, python-format -diff -uNrp sos-3.0.orig/po/cy.po sos-3.0/po/cy.po ---- sos-3.0.orig/po/cy.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/cy.po 2014-06-21 11:15:36.443724508 -0500 -@@ -168,7 +168,7 @@ msgid "Cannot upload to specified URL." - msgstr "" - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." -+msgid "There was a problem uploading your report to CentOS support." - msgstr "" - - #: ../sos/policyredhat.py:401 -diff -uNrp sos-3.0.orig/po/da.po sos-3.0/po/da.po ---- sos-3.0.orig/po/da.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/da.po 2014-06-21 11:15:36.444724501 -0500 -@@ -184,9 +184,9 @@ msgid "Cannot upload to specified URL." - msgstr "Kan ikke overføre til den angivne URL." - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." -+msgid "There was a problem uploading your report to CentOS support." - msgstr "" --"Der opstod et problem under overførsel af din rapport til Red Hat-support." -+"Der opstod et problem under overførsel af din rapport til CentOS-support." - - #: ../sos/policyredhat.py:401 - #, python-format -diff -uNrp sos-3.0.orig/po/de_CH.po sos-3.0/po/de_CH.po ---- sos-3.0.orig/po/de_CH.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/de_CH.po 2014-06-21 11:15:36.444724501 -0500 -@@ -87,10 +87,10 @@ msgid "" - "\n" - msgstr "" - "Dieses Dienstprogramm sammelt einige detaillierte Informationen\n" --"zur Hardware und Einrichtung Ihres Red Hat Enterprise Linux Systems.\n" -+"zur Hardware und Einrichtung Ihres CentOS Enterprise Linux Systems.\n" - "Die Informationen werden gesammelt und in einem Archiv unter /tmp\n" - "zusammengefasst, welches Sie an einen Support-Vertreter schicken\n" --"können. Red Hat verwendet diese Informationen AUSSCHLIESSLICH zu\n" -+"können. CentOS verwendet diese Informationen AUSSCHLIESSLICH zu\n" - "Diagnosezwecken und behandelt sie als vertrauliche Informationen.\n" - "\n" - "Die Fertigstellung dieses Prozesses kann eine Weile dauern.\n" -@@ -188,14 +188,14 @@ msgid "Cannot upload to specified URL." - msgstr "Hochladen zu speziellem URL scheiterte." - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." --msgstr "Beim Hochladen Ihres Berichts zum Red Hat Support trat ein Fehler auf." -+msgid "There was a problem uploading your report to CentOS support." -+msgstr "Beim Hochladen Ihres Berichts zum CentOS Support trat ein Fehler auf." - - #: ../sos/policyredhat.py:401 - #, fuzzy, python-format - msgid "Your report was successfully uploaded to %s with name:" - msgstr "" --"Ihr Bericht wurde erfolgreich auf den Red Hat FTP-Server hochgeladen, mit " -+"Ihr Bericht wurde erfolgreich auf den CentOS FTP-Server hochgeladen, mit " - "dem Namen:" - - #: ../sos/policyredhat.py:404 -diff -uNrp sos-3.0.orig/po/de.po sos-3.0/po/de.po ---- sos-3.0.orig/po/de.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/de.po 2014-06-21 11:15:36.445724493 -0500 -@@ -191,8 +191,8 @@ msgid "Cannot upload to specified URL." - msgstr "Hochladen zu spezieller URL scheiterte." - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." --msgstr "Beim Hochladen Ihres Berichts zum Red Hat Support trat ein Fehler auf." -+msgid "There was a problem uploading your report to CentOS support." -+msgstr "Beim Hochladen Ihres Berichts zum CentOS Support trat ein Fehler auf." - - #: ../sos/policyredhat.py:401 - #, python-format -diff -uNrp sos-3.0.orig/po/el.po sos-3.0/po/el.po ---- sos-3.0.orig/po/el.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/el.po 2014-06-21 11:15:36.445724493 -0500 -@@ -84,10 +84,10 @@ msgid "" - "\n" - msgstr "" - "Αυτό το εργαλείο θα συγκετρώσει ορισμένες πληροφορίες για τον υπολογιστή σας " --"και την εγκατάσταση του Red Hat Enterprise Linux συστήματος.\n" -+"και την εγκατάσταση του CentOS Enterprise Linux συστήματος.\n" - "Οι πληροφορίες συγκετρώνονται και το archive δημιουργήται στο\n" - "/tmp,το οποίο και μπορείτε να στείλετε σε έναν αντιπρόσωπο υποστήριξης.\n" --"Η Red Hat θα χρησιμοποιήσει αυτα τα δεδομένα ΜΟΝΟ για διαγνωστικούς σκοπούς\n" -+"Η CentOS θα χρησιμοποιήσει αυτα τα δεδομένα ΜΟΝΟ για διαγνωστικούς σκοπούς\n" - "και θα παραμείνουν εμπιστευτηκά.\n" - "\n" - -@@ -180,8 +180,8 @@ msgid "Cannot upload to specified URL." - msgstr "Δεν είναι δυνατό το upload στο καθορισμένο URL." - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." --msgstr "Υπήρξε ένα πρόβλημα κατα το upload της αναφοράς σας στην Red Hat." -+msgid "There was a problem uploading your report to CentOS support." -+msgstr "Υπήρξε ένα πρόβλημα κατα το upload της αναφοράς σας στην CentOS." - - #: ../sos/policyredhat.py:401 - #, python-format -diff -uNrp sos-3.0.orig/po/en_GB.po sos-3.0/po/en_GB.po ---- sos-3.0.orig/po/en_GB.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/en_GB.po 2014-06-21 11:15:36.446724485 -0500 -@@ -83,10 +83,10 @@ msgid "" - "\n" - msgstr "" - "This utility will collect some detailed information about the\n" --"hardware and setup of your Red Hat Enterprise Linux system.\n" -+"hardware and setup of your CentOS Enterprise Linux system.\n" - "The information is collected and an archive is packaged under\n" - "/tmp, which you can send to a support representative.\n" --"Red Hat will use this information for diagnostic purposes ONLY\n" -+"CentOS will use this information for diagnostic purposes ONLY\n" - "and it will be considered confidential information.\n" - "\n" - "This process may take a while to complete.\n" -@@ -181,14 +181,14 @@ msgid "Cannot upload to specified URL." - msgstr "Cannot upload to specified URL." - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." --msgstr "There was a problem uploading your report to Red Hat support." -+msgid "There was a problem uploading your report to CentOS support." -+msgstr "There was a problem uploading your report to CentOS support." - - #: ../sos/policyredhat.py:401 - #, fuzzy, python-format - msgid "Your report was successfully uploaded to %s with name:" - msgstr "" --"Your report was successfully uploaded to Red Hat's ftp server with name:" -+"Your report was successfully uploaded to CentOS's ftp server with name:" - - #: ../sos/policyredhat.py:404 - msgid "Please communicate this name to your support representative." -diff -uNrp sos-3.0.orig/po/en.po sos-3.0/po/en.po ---- sos-3.0.orig/po/en.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/en.po 2014-06-21 11:15:36.446724485 -0500 -@@ -168,7 +168,7 @@ msgid "Cannot upload to specified URL." - msgstr "" - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." -+msgid "There was a problem uploading your report to CentOS support." - msgstr "" - - #: ../sos/policyredhat.py:401 -diff -uNrp sos-3.0.orig/po/es.po sos-3.0/po/es.po ---- sos-3.0.orig/po/es.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/es.po 2014-06-21 11:17:24.153886936 -0500 -@@ -189,9 +189,9 @@ msgid "Cannot upload to specified URL." - msgstr "No se puede cargar a la URL especificada." - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." -+msgid "There was a problem uploading your report to CentOS support." - msgstr "" --"Hubo un problema al cargar su reporte al equipo de asistencia de Red Hat" -+"Hubo un problema al cargar su reporte al equipo de asistencia de CentOS" - - #: ../sos/policyredhat.py:401 - #, python-format -diff -uNrp sos-3.0.orig/po/et.po sos-3.0/po/et.po ---- sos-3.0.orig/po/et.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/et.po 2014-06-21 11:15:36.447724477 -0500 -@@ -169,7 +169,7 @@ msgid "Cannot upload to specified URL." - msgstr "" - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." -+msgid "There was a problem uploading your report to CentOS support." - msgstr "" - - #: ../sos/policyredhat.py:401 -diff -uNrp sos-3.0.orig/po/eu_ES.po sos-3.0/po/eu_ES.po ---- sos-3.0.orig/po/eu_ES.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/eu_ES.po 2014-06-21 11:15:36.448724469 -0500 -@@ -168,7 +168,7 @@ msgid "Cannot upload to specified URL." - msgstr "" - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." -+msgid "There was a problem uploading your report to CentOS support." - msgstr "" - - #: ../sos/policyredhat.py:401 -diff -uNrp sos-3.0.orig/po/fa.po sos-3.0/po/fa.po ---- sos-3.0.orig/po/fa.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/fa.po 2014-06-21 11:15:36.448724469 -0500 -@@ -168,7 +168,7 @@ msgid "Cannot upload to specified URL." - msgstr "" - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." -+msgid "There was a problem uploading your report to CentOS support." - msgstr "" - - #: ../sos/policyredhat.py:401 -diff -uNrp sos-3.0.orig/po/fi.po sos-3.0/po/fi.po ---- sos-3.0.orig/po/fi.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/fi.po 2014-06-21 11:17:38.280777198 -0500 -@@ -179,8 +179,8 @@ msgid "Cannot upload to specified URL." - msgstr "Annettuun osoitteeseen ei voida lähettää." - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." --msgstr "Raportin lähettämisessä Red Hatin käyttötukeen oli ongelmia." -+msgid "There was a problem uploading your report to CentOS support." -+msgstr "Raportin lähettämisessä CentOSin käyttötukeen oli ongelmia." - - #: ../sos/policyredhat.py:401 - #, python-format -diff -uNrp sos-3.0.orig/po/fr.po sos-3.0/po/fr.po ---- sos-3.0.orig/po/fr.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/fr.po 2014-06-21 11:15:36.449724462 -0500 -@@ -188,10 +188,10 @@ msgid "Cannot upload to specified URL." - msgstr "Impossible de le télécharger vers l'URL spécifié." - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." -+msgid "There was a problem uploading your report to CentOS support." - msgstr "" - "Une erreur s'est produite lors du téléchargement de votre rapport vers le " --"support Red Hat." -+"support CentOS." - - #: ../sos/policyredhat.py:401 - #, python-format -diff -uNrp sos-3.0.orig/po/gl.po sos-3.0/po/gl.po ---- sos-3.0.orig/po/gl.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/gl.po 2014-06-21 11:15:36.450724454 -0500 -@@ -168,7 +168,7 @@ msgid "Cannot upload to specified URL." - msgstr "" - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." -+msgid "There was a problem uploading your report to CentOS support." - msgstr "" - - #: ../sos/policyredhat.py:401 -diff -uNrp sos-3.0.orig/po/gu.po sos-3.0/po/gu.po ---- sos-3.0.orig/po/gu.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/gu.po 2014-06-21 11:15:36.450724454 -0500 -@@ -186,8 +186,8 @@ msgid "Cannot upload to specified URL." - msgstr "સ્પષ્ટ કરેલ URL અપલોડ કરી શકતા નથી." - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." --msgstr "તમારા અહેવાલને Red Hat આધારમાં અપલોડ કરવામાં સમસ્યા હતી." -+msgid "There was a problem uploading your report to CentOS support." -+msgstr "તમારા અહેવાલને CentOS આધારમાં અપલોડ કરવામાં સમસ્યા હતી." - - #: ../sos/policyredhat.py:401 - #, python-format -diff -uNrp sos-3.0.orig/po/he.po sos-3.0/po/he.po ---- sos-3.0.orig/po/he.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/he.po 2014-06-21 11:15:36.450724454 -0500 -@@ -169,7 +169,7 @@ msgid "Cannot upload to specified URL." - msgstr "" - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." -+msgid "There was a problem uploading your report to CentOS support." - msgstr "" - - #: ../sos/policyredhat.py:401 -diff -uNrp sos-3.0.orig/po/hi.po sos-3.0/po/hi.po ---- sos-3.0.orig/po/hi.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/hi.po 2014-06-21 11:15:36.451724446 -0500 -@@ -187,8 +187,8 @@ msgid "Cannot upload to specified URL." - msgstr "निर्दिष्ट URL अपलोड नहीं कर सकता है." - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." --msgstr "आपके रिपोर्ट को Red Hat समर्थन में अपलोड करने में समस्या थी." -+msgid "There was a problem uploading your report to CentOS support." -+msgstr "आपके रिपोर्ट को CentOS समर्थन में अपलोड करने में समस्या थी." - - #: ../sos/policyredhat.py:401 - #, python-format -diff -uNrp sos-3.0.orig/po/hr.po sos-3.0/po/hr.po ---- sos-3.0.orig/po/hr.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/hr.po 2014-06-21 11:15:36.451724446 -0500 -@@ -170,7 +170,7 @@ msgid "Cannot upload to specified URL." - msgstr "" - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." -+msgid "There was a problem uploading your report to CentOS support." - msgstr "" - - #: ../sos/policyredhat.py:401 -diff -uNrp sos-3.0.orig/po/hu.po sos-3.0/po/hu.po ---- sos-3.0.orig/po/hu.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/hu.po 2014-06-21 11:15:36.452724438 -0500 -@@ -180,8 +180,8 @@ msgid "Cannot upload to specified URL." - msgstr "Nem lehet az URL-re feltölteni." - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." --msgstr "A jelentést a Red Hat támogatáshoz feltöltvén baj történt." -+msgid "There was a problem uploading your report to CentOS support." -+msgstr "A jelentést a CentOS támogatáshoz feltöltvén baj történt." - - #: ../sos/policyredhat.py:401 - #, python-format -diff -uNrp sos-3.0.orig/po/hy.po sos-3.0/po/hy.po ---- sos-3.0.orig/po/hy.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/hy.po 2014-06-21 11:15:36.452724438 -0500 -@@ -168,7 +168,7 @@ msgid "Cannot upload to specified URL." - msgstr "" - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." -+msgid "There was a problem uploading your report to CentOS support." - msgstr "" - - #: ../sos/policyredhat.py:401 -diff -uNrp sos-3.0.orig/po/id.po sos-3.0/po/id.po ---- sos-3.0.orig/po/id.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/id.po 2014-06-21 11:15:36.453724430 -0500 -@@ -171,7 +171,7 @@ msgid "Cannot upload to specified URL." - msgstr "" - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." -+msgid "There was a problem uploading your report to CentOS support." - msgstr "" - - #: ../sos/policyredhat.py:401 -diff -uNrp sos-3.0.orig/po/ilo.po sos-3.0/po/ilo.po ---- sos-3.0.orig/po/ilo.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/ilo.po 2014-06-21 11:15:36.453724430 -0500 -@@ -168,7 +168,7 @@ msgid "Cannot upload to specified URL." - msgstr "" - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." -+msgid "There was a problem uploading your report to CentOS support." - msgstr "" - - #: ../sos/policyredhat.py:401 -diff -uNrp sos-3.0.orig/po/is.po sos-3.0/po/is.po ---- sos-3.0.orig/po/is.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/is.po 2014-06-21 11:15:36.453724430 -0500 -@@ -168,7 +168,7 @@ msgid "Cannot upload to specified URL." - msgstr "" - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." -+msgid "There was a problem uploading your report to CentOS support." - msgstr "" - - #: ../sos/policyredhat.py:401 -diff -uNrp sos-3.0.orig/po/it.po sos-3.0/po/it.po ---- sos-3.0.orig/po/it.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/it.po 2014-06-21 11:15:36.454724423 -0500 -@@ -181,7 +181,7 @@ msgid "Cannot upload to specified URL." - msgstr "Impossibile inviare all'URL specificato." - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." -+msgid "There was a problem uploading your report to CentOS support." - msgstr "" - "Si è verificato un problema nell'inviare il report al supporto tecnico Red " - "Hat." -diff -uNrp sos-3.0.orig/po/ja.po sos-3.0/po/ja.po ---- sos-3.0.orig/po/ja.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/ja.po 2014-06-21 11:15:36.454724423 -0500 -@@ -185,8 +185,8 @@ msgid "Cannot upload to specified URL." - msgstr "指定された URL にアップロードできません。" - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." --msgstr "レポートを Red Hat サポートにアップロードするのに問題がありました。" -+msgid "There was a problem uploading your report to CentOS support." -+msgstr "レポートを CentOS サポートにアップロードするのに問題がありました。" - - #: ../sos/policyredhat.py:401 - #, python-format -diff -uNrp sos-3.0.orig/po/ka.po sos-3.0/po/ka.po ---- sos-3.0.orig/po/ka.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/ka.po 2014-06-21 11:15:36.455724415 -0500 -@@ -168,7 +168,7 @@ msgid "Cannot upload to specified URL." - msgstr "" - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." -+msgid "There was a problem uploading your report to CentOS support." - msgstr "" - - #: ../sos/policyredhat.py:401 -diff -uNrp sos-3.0.orig/po/kn.po sos-3.0/po/kn.po ---- sos-3.0.orig/po/kn.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/kn.po 2014-06-21 11:15:36.455724415 -0500 -@@ -185,9 +185,9 @@ msgid "Cannot upload to specified URL." - msgstr "ಸೂಚಿಸಲಾದ URL ಅನ್ನು ಅಪ್‌ಲೋಡ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ." - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." -+msgid "There was a problem uploading your report to CentOS support." - msgstr "" --"ನಿಮ್ಮ ವರದಿಯನ್ನು Red Hat ಬೆಂಬಲದ ಸ್ಥಳಕ್ಕೆ ಅಪ್‌ಲೋಡ್ ಮಾಡುವಲ್ಲಿ ಒಂದು ತೊಂದರೆ ಉಂಟಾಗಿದೆ." -+"ನಿಮ್ಮ ವರದಿಯನ್ನು CentOS ಬೆಂಬಲದ ಸ್ಥಳಕ್ಕೆ ಅಪ್‌ಲೋಡ್ ಮಾಡುವಲ್ಲಿ ಒಂದು ತೊಂದರೆ ಉಂಟಾಗಿದೆ." - - #: ../sos/policyredhat.py:401 - #, python-format -diff -uNrp sos-3.0.orig/po/ko.po sos-3.0/po/ko.po ---- sos-3.0.orig/po/ko.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/ko.po 2014-06-21 11:17:58.331621414 -0500 -@@ -84,10 +84,10 @@ msgid "" - "No changes will be made to your system.\n" - "\n" - msgstr "" --"이 유틸리티는 Red Hat Enterprise Linux 시스템의 하드웨어와 \n" -+"이 유틸리티는 CentOS Enterprise Linux 시스템의 하드웨어와 \n" - "시스템 설정 사항에 대한 상세 정보를 수집하게 됩니다. 수집된 \n" - "정보는 지원 담당자에게 보낼 수 있도록 /tmp 디렉토리 안에 \n" --"아카이브로 저장됩니다. Red Hat은 이 정보를 문제 해결 목적으로만 사용하며 기" -+"아카이브로 저장됩니다. CentOS은 이 정보를 문제 해결 목적으로만 사용하며 기" - "밀 정보로 \n" - "취급할 것입니다. \n" - "\n" -@@ -183,8 +183,8 @@ msgid "Cannot upload to specified URL." - msgstr "지정된 URL에서 업로드할 수 없습니다." - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." --msgstr "리포트를 Red Hat 지원 센터로 업로드하는 데 문제가 발생했습니다." -+msgid "There was a problem uploading your report to CentOS support." -+msgstr "리포트를 CentOS 지원 센터로 업로드하는 데 문제가 발생했습니다." - - #: ../sos/policyredhat.py:401 - #, python-format -diff -uNrp sos-3.0.orig/po/ku.po sos-3.0/po/ku.po ---- sos-3.0.orig/po/ku.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/ku.po 2014-06-21 11:15:36.456724407 -0500 -@@ -168,7 +168,7 @@ msgid "Cannot upload to specified URL." - msgstr "" - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." -+msgid "There was a problem uploading your report to CentOS support." - msgstr "" - - #: ../sos/policyredhat.py:401 -diff -uNrp sos-3.0.orig/po/lo.po sos-3.0/po/lo.po ---- sos-3.0.orig/po/lo.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/lo.po 2014-06-21 11:15:36.457724399 -0500 -@@ -168,7 +168,7 @@ msgid "Cannot upload to specified URL." - msgstr "" - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." -+msgid "There was a problem uploading your report to CentOS support." - msgstr "" - - #: ../sos/policyredhat.py:401 -diff -uNrp sos-3.0.orig/po/lt.po sos-3.0/po/lt.po ---- sos-3.0.orig/po/lt.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/lt.po 2014-06-21 11:15:36.457724399 -0500 -@@ -170,7 +170,7 @@ msgid "Cannot upload to specified URL." - msgstr "" - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." -+msgid "There was a problem uploading your report to CentOS support." - msgstr "" - - #: ../sos/policyredhat.py:401 -diff -uNrp sos-3.0.orig/po/lv.po sos-3.0/po/lv.po ---- sos-3.0.orig/po/lv.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/lv.po 2014-06-21 11:15:36.458724392 -0500 -@@ -170,7 +170,7 @@ msgid "Cannot upload to specified URL." - msgstr "" - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." -+msgid "There was a problem uploading your report to CentOS support." - msgstr "" - - #: ../sos/policyredhat.py:401 -diff -uNrp sos-3.0.orig/po/mk.po sos-3.0/po/mk.po ---- sos-3.0.orig/po/mk.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/mk.po 2014-06-21 11:15:36.459724384 -0500 -@@ -168,7 +168,7 @@ msgid "Cannot upload to specified URL." - msgstr "" - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." -+msgid "There was a problem uploading your report to CentOS support." - msgstr "" - - #: ../sos/policyredhat.py:401 -diff -uNrp sos-3.0.orig/po/ml.po sos-3.0/po/ml.po ---- sos-3.0.orig/po/ml.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/ml.po 2014-06-21 11:15:36.459724384 -0500 -@@ -183,8 +183,8 @@ msgid "Cannot upload to specified URL." - msgstr "നല്‍കിയിരിക്കുന്ന URL-ലേക്ക് ഫയല്‍ അപ്ലോഡ് ചെയ്യുവാന്‍ സാധ്യമായില്ല " - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." --msgstr "Red Hat-ലേക്ക് നിങ്ങളുടെ റിപ്പോറ്‍ട്ട് അയയ്ക്കുന്നതില്‍ ഏതോ പ്റശ്നം ഉണ്ടായിരിക്കുന്നു." -+msgid "There was a problem uploading your report to CentOS support." -+msgstr "CentOS-ലേക്ക് നിങ്ങളുടെ റിപ്പോറ്‍ട്ട് അയയ്ക്കുന്നതില്‍ ഏതോ പ്റശ്നം ഉണ്ടായിരിക്കുന്നു." - - #: ../sos/policyredhat.py:401 - #, python-format -diff -uNrp sos-3.0.orig/po/mr.po sos-3.0/po/mr.po ---- sos-3.0.orig/po/mr.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/mr.po 2014-06-21 11:15:36.460724376 -0500 -@@ -184,8 +184,8 @@ msgid "Cannot upload to specified URL." - msgstr "निर्देशीत URL अपलोड करण्यास अशक्य." - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." --msgstr "तुमचा अहवाल Red Hat सपोर्टकडे पाठवतेवेळी अडचण आढळली." -+msgid "There was a problem uploading your report to CentOS support." -+msgstr "तुमचा अहवाल CentOS सपोर्टकडे पाठवतेवेळी अडचण आढळली." - - #: ../sos/policyredhat.py:401 - #, python-format -diff -uNrp sos-3.0.orig/po/ms.po sos-3.0/po/ms.po ---- sos-3.0.orig/po/ms.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/ms.po 2014-06-21 11:15:36.461724368 -0500 -@@ -168,7 +168,7 @@ msgid "Cannot upload to specified URL." - msgstr "" - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." -+msgid "There was a problem uploading your report to CentOS support." - msgstr "" - - #: ../sos/policyredhat.py:401 -diff -uNrp sos-3.0.orig/po/my.po sos-3.0/po/my.po ---- sos-3.0.orig/po/my.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/my.po 2014-06-21 11:15:36.461724368 -0500 -@@ -168,7 +168,7 @@ msgid "Cannot upload to specified URL." - msgstr "" - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." -+msgid "There was a problem uploading your report to CentOS support." - msgstr "" - - #: ../sos/policyredhat.py:401 -diff -uNrp sos-3.0.orig/po/nb.po sos-3.0/po/nb.po ---- sos-3.0.orig/po/nb.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/nb.po 2014-06-21 11:15:36.462724360 -0500 -@@ -170,7 +170,7 @@ msgid "Cannot upload to specified URL." - msgstr "Kan ikke laste opp til oppgitt URL." - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." -+msgid "There was a problem uploading your report to CentOS support." - msgstr "" - - #: ../sos/policyredhat.py:401 -diff -uNrp sos-3.0.orig/po/nds.po sos-3.0/po/nds.po ---- sos-3.0.orig/po/nds.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/nds.po 2014-06-21 11:15:36.462724360 -0500 -@@ -165,7 +165,7 @@ msgid "Cannot upload to specified URL." - msgstr "" - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." -+msgid "There was a problem uploading your report to CentOS support." - msgstr "" - - #: ../sos/policyredhat.py:401 -diff -uNrp sos-3.0.orig/po/nl.po sos-3.0/po/nl.po ---- sos-3.0.orig/po/nl.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/nl.po 2014-06-21 11:15:36.462724360 -0500 -@@ -183,9 +183,9 @@ msgid "Cannot upload to specified URL." - msgstr "Kan niet naar de opgegeven URL uploaden." - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." -+msgid "There was a problem uploading your report to CentOS support." - msgstr "" --"Er trad een probleem op bij het uploaden van jouw rapport naar Red Hat " -+"Er trad een probleem op bij het uploaden van jouw rapport naar CentOS " - "support." - - #: ../sos/policyredhat.py:401 -diff -uNrp sos-3.0.orig/po/nn.po sos-3.0/po/nn.po ---- sos-3.0.orig/po/nn.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/nn.po 2014-06-21 11:15:36.462724360 -0500 -@@ -169,7 +169,7 @@ msgid "Cannot upload to specified URL." - msgstr "" - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." -+msgid "There was a problem uploading your report to CentOS support." - msgstr "" - - #: ../sos/policyredhat.py:401 -diff -uNrp sos-3.0.orig/po/nso.po sos-3.0/po/nso.po ---- sos-3.0.orig/po/nso.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/nso.po 2014-06-21 11:15:36.463724353 -0500 -@@ -168,7 +168,7 @@ msgid "Cannot upload to specified URL." - msgstr "" - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." -+msgid "There was a problem uploading your report to CentOS support." - msgstr "" - - #: ../sos/policyredhat.py:401 -diff -uNrp sos-3.0.orig/po/or.po sos-3.0/po/or.po ---- sos-3.0.orig/po/or.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/or.po 2014-06-21 11:15:36.463724353 -0500 -@@ -188,8 +188,8 @@ msgid "Cannot upload to specified URL." - msgstr "ଉଲ୍ଲିଖିତ URL କୁ ଧାରଣ କରିପାରିବେ ନାହିଁ।" - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." --msgstr "Red Hat ସହାୟତାରେ ଆପଣଙ୍କର ବିବରଣୀକୁ ଧାରଣ କରିବାରେ ସମସ୍ୟା ଦୋଇଥିଲା।" -+msgid "There was a problem uploading your report to CentOS support." -+msgstr "CentOS ସହାୟତାରେ ଆପଣଙ୍କର ବିବରଣୀକୁ ଧାରଣ କରିବାରେ ସମସ୍ୟା ଦୋଇଥିଲା।" - - #: ../sos/policyredhat.py:401 - #, python-format -diff -uNrp sos-3.0.orig/po/pa.po sos-3.0/po/pa.po ---- sos-3.0.orig/po/pa.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/pa.po 2014-06-21 11:15:36.463724353 -0500 -@@ -184,8 +184,8 @@ msgid "Cannot upload to specified URL." - msgstr "ਦਿੱਤੇ URL ਤੇ ਅੱਪਲੋਡ ਨਹੀਂ ਕਰ ਸਕਦਾ।" - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." --msgstr "ਤੁਹਾਡੀ ਰਿਪੋਰਟ ਨੂੰ Red Hat ਸਹਿਯੋਗ ਤੇ ਅੱਪਲੋਡ ਕਰਨ ਵੇਲੇ ਗਲਤੀ ਆਈ ਹੈ।" -+msgid "There was a problem uploading your report to CentOS support." -+msgstr "ਤੁਹਾਡੀ ਰਿਪੋਰਟ ਨੂੰ CentOS ਸਹਿਯੋਗ ਤੇ ਅੱਪਲੋਡ ਕਰਨ ਵੇਲੇ ਗਲਤੀ ਆਈ ਹੈ।" - - #: ../sos/policyredhat.py:401 - #, python-format -diff -uNrp sos-3.0.orig/po/pl.po sos-3.0/po/pl.po ---- sos-3.0.orig/po/pl.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/pl.po 2014-06-21 11:15:36.463724353 -0500 -@@ -179,10 +179,10 @@ msgid "Cannot upload to specified URL." - msgstr "Nie można wysłać na podany adres URL." - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." -+msgid "There was a problem uploading your report to CentOS support." - msgstr "" - "Wystąpił problem podczas wysyłania raportu do wsparcia technicznego firmy " --"Red Hat." -+"CentOS." - - #: ../sos/policyredhat.py:401 - #, python-format -diff -uNrp sos-3.0.orig/po/pt_BR.po sos-3.0/po/pt_BR.po ---- sos-3.0.orig/po/pt_BR.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/pt_BR.po 2014-06-21 11:15:36.463724353 -0500 -@@ -182,8 +182,8 @@ msgid "Cannot upload to specified URL." - msgstr "Não foi possível enviar para a URL especificada." - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." --msgstr "Houve um problema ao enviar o seu relatório para o suporte da Red Hat." -+msgid "There was a problem uploading your report to CentOS support." -+msgstr "Houve um problema ao enviar o seu relatório para o suporte da CentOS." - - #: ../sos/policyredhat.py:401 - #, python-format -diff -uNrp sos-3.0.orig/po/pt.po sos-3.0/po/pt.po ---- sos-3.0.orig/po/pt.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/pt.po 2014-06-21 11:15:36.463724353 -0500 -@@ -185,8 +185,8 @@ msgid "Cannot upload to specified URL." - msgstr "Não foi possível submeter para o URL especificado." - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." --msgstr "Ocorreu um erro ao submeter o seu relatório para o suporte Red Hat." -+msgid "There was a problem uploading your report to CentOS support." -+msgstr "Ocorreu um erro ao submeter o seu relatório para o suporte CentOS." - - #: ../sos/policyredhat.py:401 - #, python-format -diff -uNrp sos-3.0.orig/po/ro.po sos-3.0/po/ro.po ---- sos-3.0.orig/po/ro.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/ro.po 2014-06-21 11:15:36.464724345 -0500 -@@ -168,7 +168,7 @@ msgid "Cannot upload to specified URL." - msgstr "" - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." -+msgid "There was a problem uploading your report to CentOS support." - msgstr "" - - #: ../sos/policyredhat.py:401 -diff -uNrp sos-3.0.orig/po/ru.po sos-3.0/po/ru.po ---- sos-3.0.orig/po/ru.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/ru.po 2014-06-21 11:15:36.464724345 -0500 -@@ -186,9 +186,9 @@ msgid "Cannot upload to specified URL." - msgstr "Не удалось отправить файл." - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." -+msgid "There was a problem uploading your report to CentOS support." - msgstr "" --"Произошла ошибка при попытке отправить отчёт в службу поддержки Red Hat." -+"Произошла ошибка при попытке отправить отчёт в службу поддержки CentOS." - - #: ../sos/policyredhat.py:401 - #, python-format -diff -uNrp sos-3.0.orig/po/si.po sos-3.0/po/si.po ---- sos-3.0.orig/po/si.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/si.po 2014-06-21 11:15:36.464724345 -0500 -@@ -85,11 +85,11 @@ msgid "" - "No changes will be made to your system.\n" - "\n" - msgstr "" --"මෙම උපයෝගි තාවය දෘඩාංග පිළිබදව සවිස්තරාත්මක තොරතුරු රැස්කරණ අතර ඔබගේ Red Hat " -+"මෙම උපයෝගි තාවය දෘඩාංග පිළිබදව සවිස්තරාත්මක තොරතුරු රැස්කරණ අතර ඔබගේ CentOS " - "Enterprise Linux පද්ධතිය පිහිටවනු ලැබේ.\n" - "රැස් කළ තොරතුරු සහ සංරක්‍ෂකය /tmp යටතේ ඇසුරුම් ගත කර ඇති අතර ඔබට එය සහායක නියෝජිත වෙත " - "යැවිය හැක.\n" --"Red Hat මෙම තොරතුරු භාවිතා කරන්නේ දෝෂ විනිශ්චය පමණක් වන අතර එම තොරතුරු රහසිගත තොරතුරු " -+"CentOS මෙම තොරතුරු භාවිතා කරන්නේ දෝෂ විනිශ්චය පමණක් වන අතර එම තොරතුරු රහසිගත තොරතුරු " - "ලෙස සළකණු ලබයි.\n" - "\n" - "මෙම ක්‍රියාව නිම වීමට වේලාවක් ගතවනු ඇත.\n" -@@ -184,13 +184,13 @@ msgid "Cannot upload to specified URL." - msgstr "දක්වන ලඳ URL වෙත ලබා දිය නොහැක." - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." --msgstr "ඔබගේ වාර්තාව Red Hat සහය වෙතට ලබා දිමේදි දෝෂයල් ඇති විය." -+msgid "There was a problem uploading your report to CentOS support." -+msgstr "ඔබගේ වාර්තාව CentOS සහය වෙතට ලබා දිමේදි දෝෂයල් ඇති විය." - - #: ../sos/policyredhat.py:401 - #, fuzzy, python-format - msgid "Your report was successfully uploaded to %s with name:" --msgstr "ඔබගේ වාර්තාව සාර්තකව Red Hat's ftp සේවාදායකයට ලබාදුන් අතර නම වූයේ:" -+msgstr "ඔබගේ වාර්තාව සාර්තකව CentOS's ftp සේවාදායකයට ලබාදුන් අතර නම වූයේ:" - - #: ../sos/policyredhat.py:404 - msgid "Please communicate this name to your support representative." -diff -uNrp sos-3.0.orig/po/sk.po sos-3.0/po/sk.po ---- sos-3.0.orig/po/sk.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/sk.po 2014-06-21 11:15:36.464724345 -0500 -@@ -182,8 +182,8 @@ msgid "Cannot upload to specified URL." - msgstr "Nie je možné odoslať na zadanú adresu URL." - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." --msgstr "Nastal problém pri odosielaní vašej správy na podporu Red Hat." -+msgid "There was a problem uploading your report to CentOS support." -+msgstr "Nastal problém pri odosielaní vašej správy na podporu CentOS." - - #: ../sos/policyredhat.py:401 - #, python-format -diff -uNrp sos-3.0.orig/po/sl.po sos-3.0/po/sl.po ---- sos-3.0.orig/po/sl.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/sl.po 2014-06-21 11:15:36.464724345 -0500 -@@ -170,7 +170,7 @@ msgid "Cannot upload to specified URL." - msgstr "" - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." -+msgid "There was a problem uploading your report to CentOS support." - msgstr "" - - #: ../sos/policyredhat.py:401 -diff -uNrp sos-3.0.orig/po/sos.pot sos-3.0/po/sos.pot ---- sos-3.0.orig/po/sos.pot 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/sos.pot 2014-06-21 11:15:36.464724345 -0500 -@@ -169,7 +169,7 @@ msgid "Cannot upload to specified URL." - msgstr "" - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." -+msgid "There was a problem uploading your report to CentOS support." - msgstr "" - - #: ../sos/policyredhat.py:401 -diff -uNrp sos-3.0.orig/po/sq.po sos-3.0/po/sq.po ---- sos-3.0.orig/po/sq.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/sq.po 2014-06-21 11:15:36.464724345 -0500 -@@ -168,7 +168,7 @@ msgid "Cannot upload to specified URL." - msgstr "" - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." -+msgid "There was a problem uploading your report to CentOS support." - msgstr "" - - #: ../sos/policyredhat.py:401 -diff -uNrp sos-3.0.orig/po/sr@latin.po sos-3.0/po/sr@latin.po ---- sos-3.0.orig/po/sr@latin.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/sr@latin.po 2014-06-21 11:15:36.465724337 -0500 -@@ -182,8 +182,8 @@ msgid "Cannot upload to specified URL." - msgstr "Ne mogu da pošaljem na navedeni URL." - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." --msgstr "Pojavio se problem pri slanju vašeg izveštaja Red Hat podršci." -+msgid "There was a problem uploading your report to CentOS support." -+msgstr "Pojavio se problem pri slanju vašeg izveštaja CentOS podršci." - - #: ../sos/policyredhat.py:401 - #, python-format -diff -uNrp sos-3.0.orig/po/sr.po sos-3.0/po/sr.po ---- sos-3.0.orig/po/sr.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/sr.po 2014-06-21 11:15:36.465724337 -0500 -@@ -182,8 +182,8 @@ msgid "Cannot upload to specified URL." - msgstr "Не могу да пошаљем на наведени УРЛ." - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." --msgstr "Појавио се проблем при слању вашег извештаја Red Hat подршци." -+msgid "There was a problem uploading your report to CentOS support." -+msgstr "Појавио се проблем при слању вашег извештаја CentOS подршци." - - #: ../sos/policyredhat.py:401 - #, python-format -diff -uNrp sos-3.0.orig/po/sv.po sos-3.0/po/sv.po ---- sos-3.0.orig/po/sv.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/sv.po 2014-06-21 11:15:36.465724337 -0500 -@@ -185,8 +185,8 @@ msgid "Cannot upload to specified URL." - msgstr "Kan inte skicka till angiven URL." - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." --msgstr "Ett problem uppstod när din rapport skickades till Red Hat support." -+msgid "There was a problem uploading your report to CentOS support." -+msgstr "Ett problem uppstod när din rapport skickades till CentOS support." - - #: ../sos/policyredhat.py:401 - #, python-format -diff -uNrp sos-3.0.orig/po/ta.po sos-3.0/po/ta.po ---- sos-3.0.orig/po/ta.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/ta.po 2014-06-21 11:15:36.465724337 -0500 -@@ -188,8 +188,8 @@ msgid "Cannot upload to specified URL." - msgstr "குறிப்பிட்ட இணைய முகவரியில் ஏற்ற முடியவில்லை." - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." --msgstr "உங்கள் அறிக்கையை Red Hat சேவைக்கு அனுப்புவதில் சிக்கல்." -+msgid "There was a problem uploading your report to CentOS support." -+msgstr "உங்கள் அறிக்கையை CentOS சேவைக்கு அனுப்புவதில் சிக்கல்." - - #: ../sos/policyredhat.py:401 - #, python-format -diff -uNrp sos-3.0.orig/po/te.po sos-3.0/po/te.po ---- sos-3.0.orig/po/te.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/te.po 2014-06-21 11:15:36.465724337 -0500 -@@ -185,8 +185,8 @@ msgid "Cannot upload to specified URL." - msgstr "తెలుపబడిన URLకు అప్‌లోడ్ చేయలేదు." - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." --msgstr "మీ సమస్యను Red Hat మద్దతునకు అప్‌లోడు చేయుటలో వొక సమస్యవుంది." -+msgid "There was a problem uploading your report to CentOS support." -+msgstr "మీ సమస్యను CentOS మద్దతునకు అప్‌లోడు చేయుటలో వొక సమస్యవుంది." - - #: ../sos/policyredhat.py:401 - #, python-format -diff -uNrp sos-3.0.orig/po/th.po sos-3.0/po/th.po ---- sos-3.0.orig/po/th.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/th.po 2014-06-21 11:18:12.876508348 -0500 -@@ -84,9 +84,9 @@ msgid "" - "\n" - msgstr "" - "เครื่องมือนี้จะเก็บข้อมูลโดยละเอียดเกี่ยวกับฮาร์ดแวร์และการตั้งค่า\n" --"ระบบ Red Hat Enterprise Linux ของคุณ ข้อมูลจะถูกเก็บและ\n" -+"ระบบ CentOS Enterprise Linux ของคุณ ข้อมูลจะถูกเก็บและ\n" - "สร้างเป็นไฟล์ที่ /tmp ซึ่งคุณสามารถส่งไปยังผู้สนับสนุนได้\n" --"Red Hat จะใช้ข้อมูลนี้ในการแก้ไขปัญหาเท่านั้น และจะถือว่าเป็น\n" -+"CentOS จะใช้ข้อมูลนี้ในการแก้ไขปัญหาเท่านั้น และจะถือว่าเป็น\n" - "ความลับ\n" - "\n" - "กระบวนการนี้อาจจะใช้เวลาสักครู่ในการทำงาน จะไม่มีการแก้ไข\n" -@@ -180,13 +180,13 @@ msgid "Cannot upload to specified URL." - msgstr "ไม่สามารถอัพโหลดไปยัง URL ที่ระบุ" - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." --msgstr "มีปัญหาในการอัพโหลดรายงานของคุณไปยังฝ่ายสนับสนุน Red Hat" -+msgid "There was a problem uploading your report to CentOS support." -+msgstr "มีปัญหาในการอัพโหลดรายงานของคุณไปยังฝ่ายสนับสนุน CentOS" - - #: ../sos/policyredhat.py:401 - #, fuzzy, python-format - msgid "Your report was successfully uploaded to %s with name:" --msgstr "รายงานของคุณได้ถูกส่งไปยังเซิร์ฟเวอร์ ftp ของ Red Hat ในชื่อ:" -+msgstr "รายงานของคุณได้ถูกส่งไปยังเซิร์ฟเวอร์ ftp ของ CentOS ในชื่อ:" - - #: ../sos/policyredhat.py:404 - msgid "Please communicate this name to your support representative." -diff -uNrp sos-3.0.orig/po/tr.po sos-3.0/po/tr.po ---- sos-3.0.orig/po/tr.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/tr.po 2014-06-21 11:15:36.466724329 -0500 -@@ -185,8 +185,8 @@ msgid "Cannot upload to specified URL." - msgstr "Belirtilen URL 'ye yükleme yapılamadı." - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." --msgstr "Raporunuz Red Hat desteğe yüklenirken bir sorunla karşılaşıldı." -+msgid "There was a problem uploading your report to CentOS support." -+msgstr "Raporunuz CentOS desteğe yüklenirken bir sorunla karşılaşıldı." - - #: ../sos/policyredhat.py:401 - #, python-format -diff -uNrp sos-3.0.orig/po/uk.po sos-3.0/po/uk.po ---- sos-3.0.orig/po/uk.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/uk.po 2014-06-21 11:15:36.466724329 -0500 -@@ -183,8 +183,8 @@ msgid "Cannot upload to specified URL." - msgstr "Не вдається надіслати файл." - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." --msgstr "Виникла помилка при спробі надіслати звіт до служби підтримки Red Hat." -+msgid "There was a problem uploading your report to CentOS support." -+msgstr "Виникла помилка при спробі надіслати звіт до служби підтримки CentOS." - - #: ../sos/policyredhat.py:401 - #, python-format -diff -uNrp sos-3.0.orig/po/ur.po sos-3.0/po/ur.po ---- sos-3.0.orig/po/ur.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/ur.po 2014-06-21 11:15:36.466724329 -0500 -@@ -168,7 +168,7 @@ msgid "Cannot upload to specified URL." - msgstr "" - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." -+msgid "There was a problem uploading your report to CentOS support." - msgstr "" - - #: ../sos/policyredhat.py:401 -diff -uNrp sos-3.0.orig/po/vi.po sos-3.0/po/vi.po ---- sos-3.0.orig/po/vi.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/vi.po 2014-06-21 11:15:36.466724329 -0500 -@@ -169,7 +169,7 @@ msgid "Cannot upload to specified URL." - msgstr "" - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." -+msgid "There was a problem uploading your report to CentOS support." - msgstr "" - - #: ../sos/policyredhat.py:401 -diff -uNrp sos-3.0.orig/po/zh_CN.po sos-3.0/po/zh_CN.po ---- sos-3.0.orig/po/zh_CN.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/zh_CN.po 2014-06-21 11:15:36.466724329 -0500 -@@ -184,7 +184,7 @@ msgid "Cannot upload to specified URL." - msgstr "无法上传到指定的网址。" - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." -+msgid "There was a problem uploading your report to CentOS support." - msgstr "在将您的报告上传到红帽支持时出错。" - - #: ../sos/policyredhat.py:401 -diff -uNrp sos-3.0.orig/po/zh_TW.po sos-3.0/po/zh_TW.po ---- sos-3.0.orig/po/zh_TW.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/zh_TW.po 2014-06-21 11:15:36.466724329 -0500 -@@ -180,8 +180,8 @@ msgid "Cannot upload to specified URL." - msgstr "無法上傳指定的網址。" - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." --msgstr "將報告上傳至 Red Hat 技術支援時,出現問題。" -+msgid "There was a problem uploading your report to CentOS support." -+msgstr "將報告上傳至 CentOS 技術支援時,出現問題。" - - #: ../sos/policyredhat.py:401 - #, python-format -diff -uNrp sos-3.0.orig/po/zu.po sos-3.0/po/zu.po ---- sos-3.0.orig/po/zu.po 2013-06-10 12:35:56.000000000 -0500 -+++ sos-3.0/po/zu.po 2014-06-21 11:15:36.467724321 -0500 -@@ -168,7 +168,7 @@ msgid "Cannot upload to specified URL." - msgstr "" - - #: ../sos/policyredhat.py:399 --msgid "There was a problem uploading your report to Red Hat support." -+msgid "There was a problem uploading your report to CentOS support." - msgstr "" - - #: ../sos/policyredhat.py:401 -diff -uNrp sos-3.2.orig/sos/plugins/cluster.py sos-3.2/sos/plugins/cluster.py ---- sos-3.2.orig/sos/plugins/cluster.py 2014-09-30 12:38:28.000000000 -0500 -+++ sos-3.2/sos/plugins/cluster.py 2015-03-09 14:58:02.982869116 -0500 -@@ -19,7 +19,7 @@ from datetime import datetime, timedelta - - - class Cluster(Plugin, RedHatPlugin): -- """Red Hat Cluster Suite and GFS -+ """Cluster Suite and GFS - """ - - plugin_name = 'cluster' -diff -uNrp sos-3.2.orig/sos/plugins/cs.py sos-3.2/sos/plugins/cs.py ---- sos-3.2.orig/sos/plugins/cs.py 2014-09-30 12:38:28.000000000 -0500 -+++ sos-3.2/sos/plugins/cs.py 2015-03-09 14:58:20.085778645 -0500 -@@ -54,7 +54,7 @@ class CertificateSystem(Plugin, RedHatPl - def setup(self): - csversion = self.checkversion() - if not csversion: -- self.add_alert("Red Hat Certificate System not found.") -+ self.add_alert("Certificate System not found.") - return - if csversion == 71: - self.add_copy_spec([ -diff -uNrp sos-3.2.orig/sos/plugins/hts.py sos-3.2/sos/plugins/hts.py ---- sos-3.2.orig/sos/plugins/hts.py 2014-09-30 12:38:28.000000000 -0500 -+++ sos-3.2/sos/plugins/hts.py 2015-03-09 14:58:36.973689309 -0500 -@@ -16,7 +16,7 @@ from sos.plugins import Plugin, RedHatPl - - - class HardwareTestSuite(Plugin, RedHatPlugin): -- """Red Hat Hardware Test Suite -+ """Hardware Test Suite - """ - - plugin_name = 'hardwaretestsuite' -diff -uNrp sos-3.2.orig/sos/plugins/__init__.py sos-3.2/sos/plugins/__init__.py ---- sos-3.2.orig/sos/plugins/__init__.py 2015-03-09 14:50:34.162237962 -0500 -+++ sos-3.2/sos/plugins/__init__.py 2015-03-09 14:58:56.861584108 -0500 -@@ -732,7 +732,7 @@ class Plugin(object): - - - class RedHatPlugin(object): -- """Tagging class to indicate that this plugin works with Red Hat Linux""" -+ """Tagging class to indicate that this plugin works with CentOS Linux""" - pass - - -diff -uNrp sos-3.2.orig/sos/plugins/rhui.py sos-3.2/sos/plugins/rhui.py ---- sos-3.2.orig/sos/plugins/rhui.py 2014-09-30 12:38:28.000000000 -0500 -+++ sos-3.2/sos/plugins/rhui.py 2015-03-09 14:59:16.909478057 -0500 -@@ -16,7 +16,7 @@ from sos.plugins import Plugin, RedHatPl - - - class Rhui(Plugin, RedHatPlugin): -- """Red Hat Update Infrastructure -+ """Update Infrastructure - """ - - plugin_name = 'rhui' -diff -uNrp sos-3.2.orig/sos/policies/redhat.py sos-3.2/sos/policies/redhat.py ---- sos-3.2.orig/sos/policies/redhat.py 2014-09-30 12:38:28.000000000 -0500 -+++ sos-3.2/sos/policies/redhat.py 2015-03-09 14:56:04.383496495 -0500 -@@ -33,9 +33,9 @@ except: - - - class RedHatPolicy(LinuxPolicy): -- distro = "Red Hat" -- vendor = "Red Hat" -- vendor_url = "http://www.redhat.com/" -+ distro = "CentOS" -+ vendor = "CentOS" -+ vendor_url = "http://www.centos.org/" - _tmp_dir = "/var/tmp" - - def __init__(self): -@@ -57,9 +57,9 @@ class RedHatPolicy(LinuxPolicy): - - @classmethod - def check(self): -- """This method checks to see if we are running on Red Hat. It must be -+ """This method checks to see if we are running on CentOS. It must be - overriden by concrete subclasses to return True when running on a -- Fedora, RHEL or other Red Hat distribution or False otherwise.""" -+ CentOS or False otherwise.""" - return False - - def runlevel_by_service(self, name): -@@ -94,9 +94,9 @@ class RedHatPolicy(LinuxPolicy): - - - class RHELPolicy(RedHatPolicy): -- distro = "Red Hat Enterprise Linux" -- vendor = "Red Hat" -- vendor_url = "https://access.redhat.com/support/" -+ distro = "CentOS Linux" -+ vendor = "CentOS" -+ vendor_url = "https://www.centos.org/" - msg = _("""\ - This command will collect diagnostic and configuration \ - information from this %(distro)s system and installed \ diff --git a/SOURCES/sos-plugins-allow-discard-stderr.patch b/SOURCES/sos-plugins-allow-discard-stderr.patch new file mode 100644 index 0000000..c9d32d9 --- /dev/null +++ b/SOURCES/sos-plugins-allow-discard-stderr.patch @@ -0,0 +1,137 @@ +From 7b2885740216f8e4076781e088d37cb7b4f96f63 Mon Sep 17 00:00:00 2001 +From: John Haxby +Date: Wed, 28 Jan 2015 19:30:29 +0000 +Subject: [PATCH] [plugins,utilities] Allow commands to discard stderr + +Just add "stderr=False" to add_cmd_output() if you don't want the +command's stderr in the sosreport. + +Signed-off-by: John Haxby + +Minor edits for pep8 conformance and to shorten the argument name. + +Signed-off-by: Bryn M. Reeves +--- + sos/plugins/__init__.py | 29 +++++++++++++++++------------ + sos/utilities.py | 5 +++-- + 2 files changed, 20 insertions(+), 14 deletions(-) +--- + sos/plugins/__init__.py | 33 +++++++++++++++++++++------------ + sos/utilities.py | 5 +++-- + 2 files changed, 24 insertions(+), 14 deletions(-) + +diff --git a/sos/plugins/__init__.py b/sos/plugins/__init__.py +index 4fd85be..9d126a5 100644 +--- a/sos/plugins/__init__.py ++++ b/sos/plugins/__init__.py +@@ -460,8 +460,9 @@ class Plugin(object): + self.copy_paths.update(copy_paths) + self._log_info("added copyspec '%s'" % copyspec) + +- def get_command_output(self, prog, timeout=300, runat=None): +- result = sos_get_command_output(prog, timeout=timeout, runat=runat) ++ def get_command_output(self, prog, timeout=300, runat=None, stderr=True): ++ result = sos_get_command_output(prog, timeout=timeout, runat=runat, ++ stderr=stderr) + if result['status'] == 124: + self._log_warn("command '%s' timed out after %ds" + % (prog, timeout)) +@@ -470,11 +471,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, runat=None, stderr=True): + """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, runat=runat, ++ stderr=True) + + def check_ext_prog(self, prog): + """Execute a command independently of the output gathering part of +@@ -484,15 +486,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, runat=None, ++ stderr=True): + """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, runat, stderr ++ ) ++ _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) +@@ -547,12 +553,13 @@ class Plugin(object): + + def get_cmd_output_now(self, exe, suggest_filename=None, + root_symlink=False, timeout=300, +- runat=None): ++ runat=None, stderr=True): + """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, runat=runat, ++ stderr=stderr) + # 126 means 'found but not executable' + if result['status'] == 126 or result['status'] == 127: + return None +@@ -601,13 +608,15 @@ 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, runat, stderr ++ ) = 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) ++ timeout=timeout, runat=runat, ++ stderr=stderr) + + def _collect_strings(self): + for string, file_name in self.copy_strings: +diff --git a/sos/utilities.py b/sos/utilities.py +index 2638ce4..db340f8 100644 +--- a/sos/utilities.py ++++ b/sos/utilities.py +@@ -120,7 +120,7 @@ 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): ++def sos_get_command_output(command, timeout=300, runat=None, stderr=True): + """Execute a command through the system shell. First checks to see if the + requested command is executable. Returns (returncode, stdout, 0)""" + def _child_chdir(): +@@ -142,7 +142,8 @@ def sos_get_command_output(command, timeout=300, runat=None): + command = command.encode('utf-8', 'ignore') + args = shlex.split(command) + try: +- p = Popen(args, shell=False, stdout=PIPE, stderr=STDOUT, ++ p = Popen(args, shell=False, stdout=PIPE, ++ stderr=STDOUT if stderr else PIPE, + bufsize=-1, env=cmd_env, close_fds=True, + preexec_fn=_child_chdir) + except OSError as e: +-- +1.8.3.1 + diff --git a/SOURCES/sos-policies-PackageManager-timeout.patch b/SOURCES/sos-policies-PackageManager-timeout.patch new file mode 100644 index 0000000..4fd3e8e --- /dev/null +++ b/SOURCES/sos-policies-PackageManager-timeout.patch @@ -0,0 +1,100 @@ +From 3a2ad99c71dae022cfb7fb02e11473001c50ae23 Mon Sep 17 00:00:00 2001 +From: "Bryn M. Reeves" +Date: Tue, 27 Jan 2015 13:07:52 +0000 +Subject: [PATCH] [policies] run PackageManager query_command under timeout + +PackageManager query commands may block due to file system locks +or problems with the package database. Run the query command with +a timeout of 30s and exit if the timeout expires. + +Signed-off-by: Aruna Balakrishnaiah +Signed-off-by: Bryn M. Reeves + +--- +Changes from v3: + Add default timeout instead of making it configurable + Add print function instead of error() + +Changes from v2: + Introduce timeout in shell_out wrapper + +Changes from v1: + Addressed issues of the maintainer + Introduce timeout instead of relying on yum. +--- + sos/policies/__init__.py | 3 ++- + sos/policies/redhat.py | 10 +++++++++- + sos/utilities.py | 4 ++-- + 3 files changed, 13 insertions(+), 4 deletions(-) + +diff --git a/sos/policies/__init__.py b/sos/policies/__init__.py +index 9fcbd55..34a2f6a 100644 +--- a/sos/policies/__init__.py ++++ b/sos/policies/__init__.py +@@ -56,6 +56,7 @@ class PackageManager(object): + """ + + query_command = None ++ timeout = 30 + + def __init__(self, query_command=None): + self.packages = {} +@@ -92,7 +93,7 @@ class PackageManager(object): + version': 'major.minor.version'}} + """ + if self.query_command: +- pkg_list = shell_out(self.query_command).splitlines() ++ pkg_list = shell_out(self.query_command, self.timeout).splitlines() + for pkg in pkg_list: + if '|' not in pkg: + continue +diff --git a/sos/policies/redhat.py b/sos/policies/redhat.py +index 2219246..38510d9 100644 +--- a/sos/policies/redhat.py ++++ b/sos/policies/redhat.py +@@ -15,6 +15,7 @@ + # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + # This enables the use of with syntax in python 2.5 (e.g. jython) ++from __future__ import print_function + import os + import sys + +@@ -46,8 +47,15 @@ class RedHatPolicy(LinuxPolicy): + 'rpm -qa --queryformat "%{NAME}|%{VERSION}\\n"') + self.valid_subclasses = [RedHatPlugin] + ++ pkgs = self.package_manager.all_pkgs() ++ ++ # If rpm query timed out after timeout duration exit ++ if not pkgs: ++ print("Could not obtain installed package list", file=sys.stderr) ++ sys.exit(1) ++ + # handle PATH for UsrMove +- if self.package_manager.all_pkgs()['filesystem']['version'][0] == '3': ++ if pkgs['filesystem']['version'][0] == '3': + self.PATH = "/usr/sbin:/usr/bin:/root/bin" + else: + self.PATH = "/sbin:/bin:/usr/sbin:/usr/bin:/root/bin" +diff --git a/sos/utilities.py b/sos/utilities.py +index 51909c6..2638ce4 100644 +--- a/sos/utilities.py ++++ b/sos/utilities.py +@@ -180,11 +180,11 @@ def import_module(module_fqname, superclasses=None): + return modules + + +-def shell_out(cmd, runat=None): ++def shell_out(cmd, timeout=30, 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, timeout=timeout, runat=runat)['output'] + + + class ImporterHelper(object): +-- +1.8.3.1 + diff --git a/SPECS/sos.spec b/SPECS/sos.spec index 0d0ad59..6658346 100644 --- a/SPECS/sos.spec +++ b/SPECS/sos.spec @@ -2,7 +2,7 @@ Summary: A set of tools to gather troubleshooting information from a system Name: sos Version: 3.2 -Release: 15%{?dist}.8 +Release: 35%{?dist} Group: Applications/System Source0: https://github.com/sosreport/sos/archive/%{version}/sos-%{version}.tar.gz License: GPLv2+ @@ -40,17 +40,51 @@ Patch20: sos-bz1026962-ctdb-fix-redhatplugin-tagging-use.patch Patch21: sos-bz1026962-sosreport-fix-silent-exception-handling.patch Patch22: sos-bz1180919-mysql-test-for-boolean-values.patch Patch23: sos-bz1176159-mysql-improve-dbuser-dbpass-handling.patch -Patch24: sos-bz1201843-cluster-crmreport-create-dir.patch +Patch24: sos-bz1200526-cluster-crmreport-create-dir.patch Patch25: sos-bz1213315-openstack-neutron-to-collect-neutron-folders.patch Patch26: sos-bz1162788-ovirt-engine-remove-password-leak.patch Patch27: sos-bz1206633-fix-exception-when-networkmanager-disabled.patch -Patch28: sos-bz1229746-openstack-sahara-plugin.patch -Patch29: sos-bz1229746-redact-secrets-from-sahara-config.patch -Patch30: sos-bz1237029-hpasm-no-data-timeout.patch -Patch31: sos-bz1238200-mariadb-mysql-add-log.patch -Patch32: sos-bz1242871-openstack_neutron-obfuscate-passwords.patch -Patch33: sos-bz1244648-openstack-obfuscate-passwords-secrets.patch -Patch34: sos-centos-branding.patch +Patch28: sos-bz1211984-openstack-sahara-plugin.patch +Patch29: sos-bz1211984-redact-secrets-from-sahara-config.patch +Patch30: sos-bz1083656-cluster-data-ownership.patch +Patch31: sos-bz1135317-sat6-capsule-debug.patch +Patch32: sos-bz1183265-httpd-collect-conf-modules.patch +Patch33: sos-bz1183297-pcp-collect-config.patch +Patch34: sos-bz1183768-puppet-collect-config.patch +Patch35: sos-bz1183770-parted-no-human-readable.patch +Patch36: sos-bz1185093-sos-ticket-number-name-params.patch +Patch37: sos-bz1194554-network-more-diagnostic.patch +Patch38: sos-bz1194556-infiniband-more-diagnostic.patch +Patch39: sos-bz1197006-rabbitmq-cluster-status.patch +Patch40: sos-bz1209454-networking-ip-addr.patch +Patch41: sos-bz1209840-kimchid-plugin.patch +Patch42: sos-bz1221932-iprconfig-plugin.patch +Patch43: sos-bz1236101-ovirt-engine-config-domain-list.patch +Patch44: sos-bz1236111-activemq-collect-logs-config.patch +Patch45: sos-bz1236124-cluster-enable-when-luci-only.patch +Patch46: sos-bz1214209-hpasm-no-data-timeout.patch +Patch47: sos-bz1210906-mariadb-mysql-add-log.patch +Patch48: sos-bz1165418-chrony-new-plugin.patch +Patch49: sos-bz1164864-cluster-crm-report-password-sanitize.patch +Patch50: sos-bz1195086-virsh-plugin.patch +Patch51: sos-bz1195608-sap-hana-netweaver-vhostmd-plugins.patch +Patch52: sos-bz1184602-sos-verify-profile-for-valid-plugins-only.patch +Patch53: sos-bz1194159-kernel-additional-diagnostic.patch +Patch54: sos-bz1210527-ceph-add-calamari-rados.patch +Patch55: sos-bz1238726-iprconfig-enable-on-ppc64le.patch +Patch56: sos-bz1238349-openstack_trove-plugin.patch +Patch57: sos-bz1195087-services-add-more-diagnostics.patch +Patch58: sos-bz1240666-openstack_neutron-obfuscate-passwords.patch +Patch59: sos-policies-PackageManager-timeout.patch +Patch60: sos-plugins-allow-discard-stderr.patch +Patch61: sos-bz1185990-sos-inside-container.patch +Patch62: sos-bz1243092-openstack-obfuscate-passwords-secrets.patch +Patch63: sos-bz1242507-openvswitch-collect-logs-db-bridges.patch +Patch64: sos-bz1195608-sapnw-cmd-output-check.patch +Patch65: sos-bz1249705-logs-plugin-traceback.patch +Patch66: sos-bz1248672-pick-up-symlink-targets.patch +Patch67: sos-bz1219720-html-report-generate.patch +Patch68: sos-bz1245770-collect-docker-daemon-logs.patch %description Sos is a set of tools that gathers information about system @@ -95,7 +129,40 @@ support technicians and developers. %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 %build make @@ -119,34 +186,132 @@ rm -rf ${RPM_BUILD_ROOT} %config(noreplace) %{_sysconfdir}/sos.conf %changelog -* Tue Sep 15 2015 CentOS Sources - 3.2-15.el7.centos.8 -- Roll in CentOS Branding +* Wed Oct 07 2015 Pavel Moravec = 3.2-35 +- [docker] collect journald logs for docker unit + Resolves: bz1245770 + +* Tue Oct 06 2015 Pavel Moravec = 3.2-34 +- [sosreport] fix command-line report defaults + Resolves: bz1219720 -* Mon Sep 07 2015 Pavel Moravec = 3.2-15.8 +* Thu Sep 10 2015 Pavel Moravec = 3.2-33 - [openstack_neutron] obfuscate server_auth in restproxy.ini - Resolves: bz1244648 + Resolves: bz1243092 -* Mon Jul 27 2015 Pavel Moravec = 3.2-15.7 -- [openstack] Ensure openstack passwords and secrets are obfuscated - Resolves: bz1244648 +* Fri Aug 28 2015 Pavel Moravec = 3.2-32 +- [memory] collect swapon --show output in bytes + Resolves: bz1194159 -* Wed Jul 15 2015 Pavel Moravec = 3.2-15.6 +* Mon Aug 24 2015 Pavel Moravec = 3.2-31 +- [sosreport] fix command-line report defaults (proper patch ordering) + Resolves: bz1219720 + +* Tue Aug 04 2015 Pavel Moravec = 3.2-30 +- [sapnw] call self methods properly + Resolves: bz1195608 + +* Tue Aug 04 2015 Pavel Moravec = 3.2-29 +- [openvswitch] capture the logs, db and OVS bridges details + Resolves: bz1242507 +- [logs] fix reference to missing 'rsyslog_conf' variable + Resolves: bz1249705 +- [sapnw] Add check if saphostctrl is not present, dont use Set + Resolves: bz1195608 +- [Plugin] fix handling of symlinks in non-sysroot environments + Resolves: bz1248672 + +* Sat Jul 18 2015 Pavel Moravec = 3.2-28 +- [openstack] Ensure openstack passwords and secrets are obfuscated + Resolves: bz1243092 + +* Wed Jul 15 2015 Pavel Moravec = 3.2-27 +- [plugin] pass stderr through _collect_cmd_output +- split dependencies of bz1185990 fix from bz1185990 patch + Resolves: bz1185990 + +* Thu Jul 09 2015 Pavel Moravec = 3.2-26 +- [kubernetes,plugin] Support running sos inside a container + Resolves: bz1185990 + +* Tue Jul 07 2015 Pavel Moravec = 3.2-25 +- [openstack] New Openstack Trove (DBaaS) plugin + Resolves: bz1238349 +- [services] Add more diagnostics to applications + Resolves: bz1195087 +- [openstack_neutron] Obscure passwords and secrets + Resolves: bz1240666 + +* Sat Jul 04 2015 Pavel Moravec = 3.2-23 +- [ceph] add calamari and ragos logs and configs + Resolves: bz1210527 +- [iprconfig] enable plugin for ppc64* architectures + Resolves: bz1238726 + +* Fri Jul 03 2015 Pavel Moravec = 3.2-22 +- [general] verify --profile contains valid plugins only + Resolves: bz1184602 +- [kernel,mpt,memory] additional kernel-related diagnostics + Resolves: bz1194159 + +* Wed Jul 01 2015 Pavel Moravec = 3.2-21 +- [cluster] enable crm_report password scrubbing + Resolves: bz1164864 +- [sosreport] fix command-line report defaults + Resolves: bz1219720 +- [virsh] add new plugin, add listing of qemu + Resolves: bz1195086 +- [sap*,vhostmd] new plugins for SAP + Resolves: bz1195608 + +* Tue Jun 30 2015 Pavel Moravec = 3.2-20 +- [cluster] crm_report fails to run because dir already exists + Resolves: bz1200526 +- [foreman] Skip collection of generic resources + Resolves: bz1135317 +- [apache] Added collection of conf.modules.d dir for httpd 2.4 + Resolves: bz1183265 +- [pcp] collect /etc/pcp.conf + Resolves: bz1183297 +- [puppet] adding new plugin for puppet + Resolves: bz1183768 +- [block] Don't use parted human readable output + Resolves: bz1183770 +- [general] Better handling --name and --ticket-number in + Resolves: bz1185093 +- [networking] additional ip, firewall and traffic shaping + Resolves: bz1194554 +- [infiniband] add opensm and infiniband-diags support + Resolves: bz1194556 +- [plugins/rabbitmq] Added cluster_status command output + Resolves: bz1197006 +- [networking] re-add 'ip addr' with a root symlink + Resolves: bz1209454 +- [kimchi] add new plugin + Resolves: bz1209840 +- [iprconfig] add plugin for IBM Power RAID adapters + Resolves: bz1221932 +- [ovirt] Collect engine tunables and domain information. + Resolves: bz1236101 +- [activemq] Honour all_logs and get config on RHEL + Resolves: bz1236111 +- [cluster] Add luci to packages for standalone luci servers + Resolves: bz1236124 - [hpasm] hpasmcli commands hang under timeout - Resolves: bz1237029 + Resolves: bz1214209 - [mysql] Collect log file - Resolves: bz1238200 -- [openstack_neutron] Obscure passwords and secrets - Resolves: bz1242871 + Resolves: bz1210906 +- [chrony] add chrony plugin + Resolves: bz1165418 -* Mon Jun 15 2015 Shane Bradley = 3.2-15.5 +* Mon Jun 15 2015 Shane Bradley = 3.2-19 - [openstack_sahara] redact secrets from sahara configuration - Resolves: bz1229746 + Resolves: bz1211984 -* Tue Jun 09 2015 Pavel Moravec = 3.2-15.4 +* Tue Jun 09 2015 Pavel Moravec = 3.2-18 - [openstack_sahara] add new openstack_sahara plugin - Resolves: bz1229746 + Resolves: bz1211984 -* Wed Apr 22 2015 Pavel Moravec = 3.2-15.3 +* Tue Apr 21 2015 Pavel Moravec = 3.2-17 - [openstack_neutron] neutron configuration and logs files not captured Resolves: bz1213315 - [ovirt] remove ovirt-engine setup answer file password leak @@ -154,9 +319,9 @@ rm -rf ${RPM_BUILD_ROOT} - [networking] network plugin fails if NetworkManager is disabled Resolves: bz1206633 -* Tue Mar 17 2015 Pavel Moravec = 3.2-15.1 +* Fri Mar 13 2015 Pavel Moravec = 3.2-16 - [cluster] crm_report fails to run because dir already exists - Resolves: bz1201843 + Resolves: bz1200526 * Thu Jan 22 2015 Bryn M. Reeves = 3.2-15 - [mysql] improve handling of dbuser, dbpass and MYSQL_PWD