aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBryn M. Reeves <bmr@redhat.com>2015-03-03 14:39:03 +0000
committerBryn M. Reeves <bmr@redhat.com>2016-02-05 19:14:40 +0000
commita2ab04dde386c900daac130273c6677b6bbac5c8 (patch)
tree9a28e5774b6945b1c3fc7845040394d731f85d32
parentc341583b85181bfdce9b24b767dcf2f469c6929f (diff)
downloadsos-a2ab04dde386c900daac130273c6677b6bbac5c8.tar.gz
[policies] add SuSE policy
Add a basic policy class for SuSE distributions and implement a simple OpenSuSE policy (currently this will work with any SuSE release). A new SuSEPlugin tagging class is introduced for SuSE-specific plugin cases. The policy currently also allows the RedHatPlugin tagging class to run: this quickly enables a large number of plugins for the distribution but will require manual testing to identify cases where a dedicated SuSEPlugin must be created. Fixes #523. Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
-rw-r--r--sos/plugins/__init__.py5
-rw-r--r--sos/policies/suse.py114
2 files changed, 119 insertions, 0 deletions
diff --git a/sos/plugins/__init__.py b/sos/plugins/__init__.py
index b34c3bbc..7bc17103 100644
--- a/sos/plugins/__init__.py
+++ b/sos/plugins/__init__.py
@@ -854,6 +854,11 @@ class DebianPlugin(object):
pass
+class SuSEPlugin(object):
+ """Tagging class for SuSE Linux distributions"""
+ pass
+
+
class IndependentPlugin(object):
"""Tagging class for plugins that can run on any platform"""
pass
diff --git a/sos/policies/suse.py b/sos/policies/suse.py
new file mode 100644
index 00000000..9dda6e77
--- /dev/null
+++ b/sos/policies/suse.py
@@ -0,0 +1,114 @@
+# Copyright (C) 2015 Red Hat, Inc. Bryn M. Reeves <bmr@redhat.com>
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+# This enables the use of with syntax in python 2.5 (e.g. jython)
+from __future__ import print_function
+import os
+import sys
+
+from sos.plugins import RedHatPlugin, SuSEPlugin
+from sos.policies import LinuxPolicy, PackageManager
+from sos import _sos as _
+
+
+class SuSEPolicy(LinuxPolicy):
+ distro = "SuSE"
+ vendor = "SuSE"
+ vendor_url = "https://www.suse.com/"
+ _tmp_dir = "/var/tmp"
+
+ def __init__(self):
+ super(SuSEPolicy, self).__init__()
+ self.report_name = ""
+ self.ticket_number = ""
+ self.package_manager = PackageManager(
+ 'rpm -qa --queryformat "%{NAME}|%{VERSION}\\n"')
+ self.valid_subclasses = [SuSEPlugin, 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)
+
+ self.PATH = "/usr/sbin:/usr/bin:/root/bin"
+ self.PATH += os.pathsep + "/usr/local/bin"
+ self.PATH += os.pathsep + "/usr/local/sbin"
+ self.set_exec_path()
+
+ @classmethod
+ def check(self):
+ """This method checks to see if we are running on SuSE. It must be
+ overriden by concrete subclasses to return True when running on an
+ OpenSuSE, SLES or other Suse distribution and False otherwise."""
+ return False
+
+ def runlevel_by_service(self, name):
+ from subprocess import Popen, PIPE
+ ret = []
+ p = Popen("LC_ALL=C /sbin/chkconfig --list %s" % name,
+ shell=True,
+ stdout=PIPE,
+ stderr=PIPE,
+ bufsize=-1,
+ close_fds=True)
+ out, err = p.communicate()
+ if err:
+ return ret
+ for tabs in out.split()[1:]:
+ try:
+ (runlevel, onoff) = tabs.split(":", 1)
+ except:
+ pass
+ else:
+ if onoff == "on":
+ ret.append(int(runlevel))
+ return ret
+
+ def get_tmp_dir(self, opt_tmp_dir):
+ if not opt_tmp_dir:
+ return self._tmp_dir
+ return opt_tmp_dir
+
+ def get_local_name(self):
+ return self.host_name()
+
+
+class OpenSuSEPolicy(SuSEPolicy):
+ distro = "OpenSuSE"
+ vendor = "SuSE"
+ vendor_url = "https://www.opensuse.org/"
+ msg = _("""\
+This command will collect diagnostic and configuration \
+information from this %(distro)s system and installed \
+applications.
+
+An archive containing the collected information will be \
+generated in %(tmpdir)s and may be provided to a %(vendor)s \
+support representative.
+
+No changes will be made to system configuration.
+%(vendor_text)s
+""")
+
+ def __init__(self):
+ super(OpenSuSEPolicy, self).__init__()
+
+ @classmethod
+ def check(self):
+ """This method checks to see if we are running on SuSE.
+ """
+ return (os.path.isfile('/etc/SuSE-release'))