HEX
Server: Apache
System: Linux whois01.turboservers.com.au 3.10.0-962.3.2.lve1.5.87.el7.x86_64 #1 SMP Tue Jan 28 09:38:56 UTC 2025 x86_64
User: ultimatemeditati (1528)
PHP: 5.6.40
Disabled: exec,passthru,shell_exec,system
Upload Files
File: //usr/lib/python2.7/site-packages/redhat_support_tool/plugins/get_kerneldebug.py
# -*- coding: utf-8 -*-

#
# Copyright (c) 2012 Red Hat, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#           http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
from optparse import Option
from redhat_support_tool.helpers.confighelper import EmptyValueError, _
from redhat_support_tool.plugins import Plugin
from redhat_support_tool.helpers.yumdownloadhelper import YumDownloadHelper, \
                                                          NoReposError
import logging
import redhat_support_tool.helpers.confighelper as confighelper
import os


__author__ = 'Nigel Jones <[email protected]>'
__author__ = 'Keith Robertson <[email protected]>'
logger = logging.getLogger("redhat_support_tool.plugins.getkerneldebug")


class GetKernelDebugPackages(Plugin):
    plugin_name = 'getkerneldebug'
    yumhelper = None
    pkgAry = []
    yumquery = None

    @classmethod
    def get_usage(cls):
        '''
        The usage statement that will be printed by OptionParser.

        Example:
            - %prog -c CASENUMBER [options] <comment text here>
        Important: %prog is a OptionParser built-in.  Use it!
        '''
        return _('%prog <package name>')

    @classmethod
    def get_desc(cls):
        '''
        The description statement that will be printed by OptionParser.

        Example:
            - 'Use the \'%s\' command to add a comment to a case.'\
             % cls.plugin_name
        '''
        return _('Use the \'%s\' command to download available debug '
                 'vmlinux images.  Wildcards are allowed.  (requires root user '
                 'privileges)') % cls.plugin_name

    @classmethod
    def get_epilog(cls):
        '''
        The epilog string that will be printed by OptionParser.  Usually
        used to print an example of how to use the program.

        Example:
         Examples:
          - %s -c 12345678 Lorem ipsum dolor sit amet, consectetur adipisicing
          - %s -c 12345678
        '''
        return _("""Examples:
  - %s 2.6.32-343.el6
  - %s 2.6.18-128.*
  - %s -t xen 2.6.18-348.el5""") \
  % (cls.plugin_name, cls.plugin_name, cls.plugin_name)

    @classmethod
    def get_options(cls):
        '''
        Subclasses that need command line options should override this method
        and return an array of optparse.Option(s) to be used by the
        OptionParser.

        Example:
         return [Option("-f", "--file", action="store",
                        dest="filename", help='Some file'),
                 Option("-c", "--case",
                        action="store", dest="casenumber",
                        help='A case')]

         Would produce the following:
         Command (? for help): help mycommand

         Usage: mycommand [options]

         Use the 'mycommand' command to find a knowledge base solution by ID
         Options:
           -h, --help  show this help message and exit
           -f, --file  Some file
           -c, --case  A case
         Example:
          - mycommand -c 12345 -f abc.txt

        '''
        return [Option("-n", "--noprompt", dest="noprompt",
                    action="store_true",
                    help=_('For multi-package installs do not '
                           'ask for confirmation.'),
                    default=False),
                Option("-t", "--variant", dest="variant",
                       help=_('Select an alternative kernel variant'),
                       metavar=_('VARIANT'))]

    def insert_obj(self, yumdict):
        '''
        Allow insertion of a package object by launchhelper (when selecting
        from the list generated by list_kerneldebugs.py)
        '''
        # Expand yumdict into our YumDownloadHelper and package
        self.yumhelper = yumdict['yumhelper']
        # Package is
        self.pkgAry = [yumdict['package']]

    def validate_args(self):
        # Launchhelper may have inserted a package object from earlier
        if not self._args:
            if (len(self.pkgAry) == 0 or self.yumhelper == None):
                msg = _('ERROR: %s requires a package name.') % \
                    GetKernelDebugPackages.plugin_name
                print msg
                raise Exception(msg)
        # Otherwise, build a search string:
        else:
            if self._options['variant']:
                self.yumquery = 'kernel-%s-debuginfo-%s' % \
                    (self._options['variant'], self._line)
            else:
                self.yumquery = 'kernel-debuginfo-%s' % (self._line)

    def postinit(self):
        try:
            if os.geteuid() != 0:
                raise Exception(_('This command requires root user '
                                  'privileges.'))
            if len(self.pkgAry) == 0:
                self.yumhelper = YumDownloadHelper()
                self.yumhelper.setup_repos()
                self.pkgAry = self.yumhelper.find_package(self.yumquery)
                if not self.pkgAry:
                    raise EmptyValueError(
                            _('%s was not available from any of the following'
                              ' yum repositories: %s') % (self.yumquery,
                                    ', '.join(self.yumhelper.get_repoids())))
        except NoReposError, nre:
            print nre
            raise
        except EmptyValueError, eve:
            print eve
            raise
        except Exception, e:
            msg = _("ERROR: Unable to get debug packages.  %s") % e
            print msg
            logger.log(logging.ERROR, msg)
            raise

    def non_interactive_action(self):
        try:
            if len(self.pkgAry) >= 1:
                print _('The vmlinux debug images from the following packages '
                        'will be extracted to: %s') % \
                        confighelper.get_config_helper().get(
                                            option='kern_debug_dir')
                for pkg in self.pkgAry:
                    print pkg
                if not self._options['noprompt']:
                    line = raw_input(_('Continue (y/n)? '))
                    if str(line).strip().lower() != 'y':
                        print _('Canceling')
                        return
                # Start installing'
                extpaths = self.yumhelper.extractKernelDebugs(self.pkgAry)
                for extractedpkg in extpaths:
                    print _('Kernel vmlinux file for %s was '
                            'extracted to %s') % (extractedpkg['package'],
                                                  extractedpkg['path'])
            else:
                print _('No packages to install.')
        # pylint: disable=W0703
        except Exception, e:
            logger.log(logging.WARNING, e)