[yum-commits] repo-check.py

Tim Lauridsen timlau at osuosl.org
Wed Apr 29 08:53:40 UTC 2009


 repo-check.py |  242 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 242 insertions(+)

New commits:
commit 7d6f4ff763fbd18bbebeeab40fcb1ba3487cda1b
Author: Tim Lauridsen <timlau at fedoraproject.org>
Date:   Wed Apr 29 10:49:40 2009 +0200

    added a repo-check util command template, it contains the basic stuff for making an easy extentable yum-util, without the need for 100's of almost identical tools

diff --git a/repo-check.py b/repo-check.py
new file mode 100755
index 0000000..7c4ae77
--- /dev/null
+++ b/repo-check.py
@@ -0,0 +1,242 @@
+#!/usr/bin/python 
+# 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 Library 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+import sys
+sys.path.insert(0,'/usr/share/yum-cli')
+
+import logging
+from utils import YumUtilBase
+from yum.misc import getCacheDir, setup_locale
+
+import yum.Errors
+
+
+class UtilCheckBase:
+    
+    def __init__(self):
+        pass
+
+    def getNames(self):
+        '''
+        @return the names of the check used at the command line
+        '''
+        return []
+
+    def getUsage(self):
+        """
+        @return: A usage string for the command, including arguments.
+        """
+        raise NotImplementedError
+
+    def getSummary(self):
+        """
+        @return: A one line summary of what the command does.
+        """
+        raise NotImplementedError
+    
+    def doSetupParser(self, parser):
+        '''
+        Setup the check's parser options
+        @param parser: a OptionParser instance
+        '''
+        pass
+
+    def doPreSetup(self, base, args, opts):
+        '''
+        Setup the check before yum is setup
+        @param base: yum base class
+        @param args: command line args
+        @param opts: command line options
+        '''
+        pass
+
+    def runCheck(self, base,args, opts):
+        '''
+        Run the check
+        @param base: yum base class
+        @param args: command line args
+        @param opts: command line options
+        '''
+        raise NotImplementedError
+    
+    
+class TestCheck(UtilCheckBase):
+    
+    def __init__(self):
+        pass
+
+    def getNames(self):
+        '''
+        @return the names of the check used at the command line
+        '''
+        return ['test']
+
+    def getUsage(self):
+        '''
+        @return: A usage string for the command, including arguments.
+        '''
+        
+        return 'test <package> [-all]'
+
+    def getSummary(self):
+        '''
+        @return: A one line summary of what the command does.
+        '''
+        return 'Just a test check'
+    
+    def doSetupParser(self,  parser):
+        '''
+        Setup the tool and add tool cmd options
+        @param parser: OptionParser instance so the tool can add options
+        '''
+        parser.add_option("--test", default="", dest="test",
+          help='test option')
+
+    def doPreSetup(self, base, args, opts):
+        '''
+        Setup the check before yum is setup
+        @param base: yum base class
+        @param args: command line args
+        @param opts: command line options
+        '''
+        for repo in base.repos.findRepos('*-source'):
+            base.logger.info("Sourcerepo : %s" % repo.id)
+
+    def runCheck(self, base, args, opts):
+        '''
+        Run the check
+        @param args: command line args
+        @param opts: command line options
+        '''
+        if opts.test:
+            base.logger.info('OPTION: --test=%s is used' % opts.test)
+        for pkg in base.pkgSack:
+            if pkg.name.startswith('yum'):
+                print pkg
+
+
+class RepoCheck(YumUtilBase):
+    NAME = 'repo-check'
+    VERSION = '1.0'
+    
+    def __init__(self):
+        self._checks = {}
+        
+        # Register checks
+        self.registerCheck(TestCheck())
+        
+        # setup the base
+        YumUtilBase.__init__(self,
+                             RepoCheck.NAME,
+                             RepoCheck.VERSION,
+                             self._makeUsage())
+        
+
+        self.logger = logging.getLogger("yum.verbose.cli.repo-check")  
+        
+        
+        # get the parser
+        self.optparser = self.getOptionParser()
+        self.main()
+        
+    def do_parser_setup(self):    
+        if hasattr(self,'getOptionGroup'): # check if the group option API is available
+            parser = self.getOptionGroup()
+        else:
+            parser = self.optparser
+            
+        # Call the checks parser setup methods 
+        for check in self._checks.values():
+            check.doSetupParser(parser)
+            
+        
+    def main(self):
+        self.do_parser_setup()
+        try:
+            opts = self.doUtilConfigSetup()
+        except yum.Errors.RepoError, e:
+            self.logger.error(str(e))
+            sys.exit(50)
+
+        # Check if there is anything to do.
+        if len(self.cmds) < 1: 
+            print self.optparser.format_help()
+            sys.exit(0)
+
+        if not self.cmds[0] in self._checks:
+            print "\nUnknown Command : %s \n" % self.cmds[0]
+            print self.optparser.format_help()
+            sys.exit(0)
+                
+        # Make it work as non root
+        if self.conf.uid != 0:
+            cachedir = getCacheDir()
+            self.logger.debug('Running as non-root, using %s as cachedir' % cachedir)
+            if cachedir is None:
+                self.logger.error("Error: Could not make cachedir, exiting")
+                sys.exit(50)
+            self.repos.setCacheDir(cachedir)
+
+            # Turn off cache
+            self.conf.cache = 0
+            # make sure the repos know about it, too
+            self.repos.setCache(0)
+
+        # Run the checks preSetup methods
+        if self.cmds[0] in self._checks:
+            check = self._checks[self.cmds[0]]
+            args = self.cmds[1:]
+            check.doPreSetup(self,args,opts)
+            
+        # Setup yum (Ts, RPM db, Repo & Sack)
+        self.doUtilYumSetup()
+        
+        # Run the check
+        if self.cmds[0] in self._checks:
+            check = self._checks[self.cmds[0]]
+            args = self.cmds[1:]
+            self.logger.info("Running the %s check" % self.cmds[0])
+            check.runCheck(self,args,opts)
+            
+    def registerCheck(self, command):
+        names = command.getNames()
+        for name in names:
+            if name in self._checks:
+                self.logger.error('Command "%s" already defined' % name)
+            self._checks[name] = command
+
+    def _makeUsage(self):
+        """
+        Format an attractive usage string for yum, listing subcommand
+        names and summary usages.
+        """
+        usage = 'repo-check [options] COMMAND\n\nList of Commands:\n\n'
+        commands = yum.misc.unique(self._checks.values())
+        commands.sort(cmp=lambda x,y : cmp(x.getNames()[0], y.getNames()[0]))
+        for command in commands:
+            # XXX Remove this when getSummary is common in plugins
+            try:
+                summary = command.getSummary()
+                usage += "%-14s %s\n" % (command.getNames()[0], summary)
+            except (AttributeError, NotImplementedError):
+                usage += "%s\n" % command.getNames()[0]
+
+        return usage
+
+
+if __name__ == '__main__':
+    setup_locale()
+    util = RepoCheck()
+    
\ No newline at end of file


More information about the Yum-commits mailing list