# Copyright (C) Steve Conklin # 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 from sos.policies import LinuxPolicy, PackageManager from sos import _sos as _ sys.path.insert(0, "/usr/share/rhn/") try: from up2date_client import up2dateAuth from up2date_client import config from rhn import rpclib except: # might fail if non-RHEL pass class RedHatPolicy(LinuxPolicy): distro = "Red Hat" vendor = "Red Hat" vendor_url = "http://www.redhat.com/" _tmp_dir = "/tmp" def __init__(self): super(RedHatPolicy, self).__init__() self.report_name = "" self.ticket_number = "" self.package_manager = PackageManager( 'rpm -qa --queryformat "%{NAME}|%{VERSION}|%{RELEASE}\\n"') self.valid_subclasses = [RedHatPlugin] pkgs = self.package_manager.all_pkgs() # If rpm query failed, exit if not pkgs: print("Could not obtain installed package list", file=sys.stderr) sys.exit(1) # handle PATH for UsrMove if 'filesystem' not in pkgs: print("Could not find 'filesystem' package: " "assuming PATH settings") usrmove = False else: filesys_version = pkgs['filesystem']['version'] usrmove = True if filesys_version[0] == '3' else False if usrmove: self.PATH = "/usr/sbin:/usr/bin:/root/bin" else: self.PATH = "/sbin:/bin:/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 Red Hat. It must be overriden by concrete subclasses to return True when running on a Fedora, RHEL or other CentOS distribution or 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 RHELPolicy(RedHatPolicy): distro = "CentOS Enterprise Linux" vendor = "Red Hat" vendor_url = "https://access.redhat.com/support/" 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. 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. No changes will be made to system configuration. %(vendor_text)s """) def __init__(self): super(RHELPolicy, self).__init__() @classmethod 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') and not os.path.isfile('/etc/fedora-release')) def dist_version(self): try: pkg = self.pkg_by_name("redhat-release") or \ self.all_pkgs_by_name_regex("redhat-release-.*")[-1] pkgname = pkg["version"] if pkgname[0] == "4": return 4 elif pkgname[0] in ["5Server", "5Client"]: return 5 elif pkgname[0] == "6": return 6 elif pkgname[0] == "7": return 7 except: pass return False def rhn_username(self): try: # cfg = config.initUp2dateConfig() return rpclib.xmlrpclib.loads( up2dateAuth.getSystemId())[0][0]['username'] except: # ignore any exception and return an empty username return "" def get_local_name(self): return self.rhn_username() or self.host_name() class FedoraPolicy(RedHatPolicy): distro = "Fedora" vendor = "the Fedora Project" vendor_url = "https://fedoraproject.org/" def __init__(self): super(FedoraPolicy, self).__init__() @classmethod def check(self): """This method checks to see if we are running on Fedora. It returns True or False.""" return os.path.isfile('/etc/fedora-release') def fedora_version(self): pkg = self.pkg_by_name("fedora-release") or \ self.all_pkgs_by_name_regex("fedora-release-.*")[-1] return int(pkg["version"]) # vim: et ts=4 sw=4