[yum-cvs] /yum-utils yumdownloader.py,1.17,1.18

Tim Lauridsen timlau at linux.duke.edu
Mon Feb 19 11:20:14 UTC 2007


Update of /home/groups/yum/cvs//yum-utils
In directory login1.linux.duke.edu:/tmp/cvs-serv31498

Modified Files:
	yumdownloader.py 
Log Message:
redesigned yumdownloader to use the new yum-utils base class introduced in yum-3.1.1.
This version inherit all command line options from the yum-cli and also command line option added by yum plugins.

Index: yumdownloader.py
===================================================================
RCS file: /home/groups/yum/cvs//yum-utils/yumdownloader.py,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -r1.17 -r1.18
--- yumdownloader.py	25 Jan 2007 18:31:15 -0000	1.17
+++ yumdownloader.py	19 Feb 2007 11:20:12 -0000	1.18
@@ -1,5 +1,4 @@
-#!/usr/bin/python
-
+#!/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
@@ -15,177 +14,163 @@
 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 
 import sys
-
-sys.path.insert(0, '/usr/share/yum-cli')
+sys.path.insert(0,'/usr/share/yum-cli')
 
 import yum
-import yum.Errors
-import os
-import shutil
-import output
-import rpmUtils.arch
-from urlgrabber.progress import TextMeter
-import logging
-from yum.packages import parsePackages
 from yum.misc import getCacheDir
-from optparse import OptionParser
+
+from cli import *
+from utils import YumUtilBase
+
 from urlparse import urljoin
 
-def initYum(yumconfigfile):
-    global logger
-    my = yum.YumBase()
-    my.doConfigSetup(fn=yumconfigfile,init_plugins=False) # init yum, without plugins
-    my.conf.uid = os.geteuid()
-    if my.conf.uid != 0:
-        cachedir = getCacheDir()
-        if cachedir is None:
-            logger.error("Error: Could not make cachedir, exiting")
-            sys.exit(50)
-        my.repos.setCacheDir(cachedir)
-    my.repos.setProgressBar(TextMeter(fo=sys.stdout))
-    my.repos.callback = output.CacheProgressCallback()
-
-    return my
-
-def parseArgs():
-    usage = "usage: %s [options] package1 [package2] [package..]" % sys.argv[0]
-    parser = OptionParser(usage=usage)
-    parser.add_option("-c", "--config", default='/etc/yum.conf',
-      help='config file to use (defaults to /etc/yum.conf)')
-    parser.add_option("--destdir", default=".", dest="destdir",
-      help='destination directory (defaults to current directory)')
-    parser.add_option("--urls", default=False, dest="urls", action="store_true",
-      help='just list the urls it would download instead of downloading')
-    parser.add_option("--resolve", default=False, dest="resolve", action="store_true",
-      help='resolve dependencies and download required packages')
-    parser.add_option("--source", default=False, dest="source", action="store_true",
-      help='operate on source packages')
-    parser.add_option("-e","--enablerepo", default=[], action="append", dest="repo",
-      help='enable repository')
-
-    (opts, args) = parser.parse_args()
-    if len(args) < 1: 
-        parser.print_help()
-        sys.exit(0)
-    return (opts, args)
-
-def main():
-    global logger
-    logger = logging.getLogger("yum.verbose.yumdownloader")
-    (opts, args) = parseArgs()
-    my = initYum(opts.config)
-
-    if len(opts.repo) > 0:
-        myrepos = []
-        
-        # find the ones we want
-        for glob in opts.repo:
-            myrepos.extend(my.repos.findRepos(glob))
-        
-        # disable them all
-        for repo in my.repos.repos.values():
-            repo.disable()
-        
-        # enable the ones we like
-        for repo in myrepos:
-            repo.enable()
-
-    my.doRpmDBSetup()
-    my.doRepoSetup()
-    archlist = None
-    if opts.source:
-        archlist = rpmUtils.arch.getArchList() + ['src']
-
-    my.doSackSetup(archlist=archlist)
-
-    avail = my.pkgSack.returnPackages()
-
-    toDownload = []
-
-    packages = args
-    for pkg in packages:
-        toActOn = []
-        exactmatch, matched, unmatched = parsePackages(avail, [pkg])
-        installable = yum.misc.unique(exactmatch + matched)
-        if len(unmatched) > 0: # if we get back anything in unmatched, it fails
-            logger.error('No Match for argument %s' % pkg)
-            continue
-
-        for newpkg in installable:
-            # This is to fix Bug 469
-            # If there are matches to the package argument given but there
-            # are no source packages, this can be caused because the
-            # source rpm this is built from has a different name
-            # for example: nscd is built from the glibc source rpm
-            # We find this name by parsing the sourcerpm filename
-            # (this is ugly but it appears to work)
-            # And finding a package with arch src and the same
-            # ver and rel as the binary package
-            # That should be the source package
-            # Note we do not use the epoch to search as the epoch for the
-            # source rpm might be different from the binary rpm (see
-            # for example mod_ssl)
-            if opts.source and newpkg.arch != 'src':
-                name = newpkg.returnSimple('sourcerpm').rsplit('-',2)[0]
-                src = my.pkgSack.searchNevra(name=name, arch = 'src',
-                  ver = newpkg.version,
-                  rel = newpkg.release
-                )
-                toActOn.extend(src)
-            else:
-                toActOn.append(newpkg)
-
-        if toActOn:
-            if opts.source:
-                toDownload.extend(my.bestPackagesFromList(toActOn, 'src'))
-            else:
-                toDownload.extend(my.bestPackagesFromList(toActOn))
-    
-    # If the user supplies to --resolve flag, resolve dependencies for
-    # all packages
-    # note this might require root access because the headers need to be
-    # downloaded into the cachedir (is there a way around this)
-    if opts.resolve:
-        my.doTsSetup()
-        my.localPackages = []
-        # Act as if we were to install the packages in toDownload
-        for po in toDownload:
-            my.tsInfo.addInstall(po)
-            my.localPackages.append(po)
-        # Resolve dependencies
-        my.resolveDeps()
-        # Add newly added packages to the toDownload list
-        for pkg in my.tsInfo.getMembers():
-            if not pkg in toDownload:
-                toDownload.append(pkg)
-        
-    for pkg in toDownload:
-        n,a,e,v,r = pkg.pkgtup
-        packages =  my.pkgSack.searchNevra(n,e,v,r,a)
-        for download in packages:
-            repo = my.repos.getRepo(download.repoid)
-            remote = download.returnSimple('relativepath')
-            if opts.urls:
-                url = urljoin(repo.urls[0],remote)
-                logger.info('%s' % url)
-                continue
-            local = os.path.basename(remote)
-            local = os.path.join(opts.destdir, local)
-            if (os.path.exists(local) and 
-                str(os.path.getsize(local)) == download.returnSimple('packagesize')):
-                logger.error("%s already exists and appears to be complete" % local)
+class YumDownloader(YumUtilBase):
+    NAME = 'yumdownloader'
+    VERSION = '1.0'
+    USAGE = '"usage: yumdownloader [options] package1 [package2] [package..]'
+    
+    def __init__(self):
+        YumUtilBase.__init__(self,
+                             YumDownloader.NAME,
+                             YumDownloader.VERSION,
+                             YumDownloader.USAGE)
+        self.logger = logging.getLogger("yum.verbose.cli.yumdownloader")                             
+        self.main()
+
+    def main(self):
+        # Add util commandline options to the yum-cli ones
+        parser = self.getOptionParser() 
+        # Add command line option specific to yumdownloader
+        self.addCmdOptions(parser)
+        # Parse the commandline option and setup the basics.
+        opts = self.doUtilConfigSetup()
+        # Check if there is anything to do.
+        if len(self.cmds) < 1: 
+            parser.print_help()
+            sys.exit(0)
+
+        # make yumdownloader work as non root user.
+        if self.conf.uid != 0:
+            cachedir = getCacheDir()
+            if cachedir is None:
+                self.logger.error("Error: Could not make cachedir, exiting")
+                sys.exit(50)
+            self.repos.setCacheDir(cachedir)
+        
+        # Setup yum (Ts, RPM db, Repo & Sack)
+        self.doUtilYumSetup()
+        # Do the real action
+        self.downloadPackages(opts)
+        
+    def downloadPackages(self,opts):
+        
+        archlist = None
+        if opts.source:
+            archlist = rpmUtils.arch.getArchList() + ['src']
+    
+        self.doSackSetup(archlist=archlist)
+    
+        avail = self.pkgSack.returnPackages()
+    
+        toDownload = []
+    
+        packages = self.cmds
+        for pkg in packages:
+            toActOn = []
+            exactmatch, matched, unmatched = parsePackages(avail, [pkg])
+            installable = yum.misc.unique(exactmatch + matched)
+            if len(unmatched) > 0: # if we get back anything in unmatched, it fails
+                self.logger.error('No Match for argument %s' % pkg)
                 continue
-            # Disable cache otherwise things won't download
-            repo.cache = 0
-            download.localpath = local # Hack: to set the localpath we want.
-            path = repo.getPackage(download)
-
-            if not os.path.exists(local) or not os.path.samefile(path, local):
-                progress = TextMeter()
-                progress.start(basename=os.path.basename(local),
-                               size=os.stat(path).st_size)
-                shutil.copy2(path, local)
-                progress.end(progress.size)
+    
+            for newpkg in installable:
+                # This is to fix Bug 469
+                # If there are matches to the package argument given but there
+                # are no source packages, this can be caused because the
+                # source rpm this is built from has a different name
+                # for example: nscd is built from the glibc source rpm
+                # We find this name by parsing the sourcerpm filename
+                # (this is ugly but it appears to work)
+                # And finding a package with arch src and the same
+                # ver and rel as the binary package
+                # That should be the source package
+                # Note we do not use the epoch to search as the epoch for the
+                # source rpm might be different from the binary rpm (see
+                # for example mod_ssl)
+                if opts.source and newpkg.arch != 'src':
+                    name = newpkg.returnSimple('sourcerpm').rsplit('-',2)[0]
+                    src = self.pkgSack.searchNevra(name=name, arch = 'src',
+                      ver = newpkg.version,
+                      rel = newpkg.release
+                    )
+                    toActOn.extend(src)
+                else:
+                    toActOn.append(newpkg)
+    
+            if toActOn:
+                if opts.source:
+                    toDownload.extend(self.bestPackagesFromList(toActOn, 'src'))
+                else:
+                    toDownload.extend(self.bestPackagesFromList(toActOn))
+        
+        # If the user supplies to --resolve flag, resolve dependencies for
+        # all packages
+        # note this might require root access because the headers need to be
+        # downloaded into the cachedir (is there a way around this)
+        if opts.resolve:
+            self.doTsSetup()
+            self.localPackages = []
+            # Act as if we were to install the packages in toDownload
+            for po in toDownload:
+                self.tsInfo.addInstall(po)
+                self.localPackages.append(po)
+            # Resolve dependencies
+            self.resolveDeps()
+            # Add newly added packages to the toDownload list
+            for pkg in self.tsInfo.getMembers():
+                if not pkg in toDownload:
+                    toDownload.append(pkg)
+            
+        for pkg in toDownload:
+            n,a,e,v,r = pkg.pkgtup
+            packages =  self.pkgSack.searchNevra(n,e,v,r,a)
+            for download in packages:
+                repo = self.repos.getRepo(download.repoid)
+                remote = download.returnSimple('relativepath')
+                if opts.urls:
+                    url = urljoin(repo.urls[0],remote)
+                    self.logger.info('%s' % url)
+                    continue
+                local = os.path.basename(remote)
+                local = os.path.join(opts.destdir, local)
+                if (os.path.exists(local) and 
+                    str(os.path.getsize(local)) == download.returnSimple('packagesize')):
+                    self.logger.error("%s already exists and appears to be complete" % local)
+                    continue
+                # Disable cache otherwise things won't download
+                repo.cache = 0
+                download.localpath = local # Hack: to set the localpath we want.
+                path = repo.getPackage(download)
+    
+                if not os.path.exists(local) or not os.path.samefile(path, local):
+                    progress = TextMeter()
+                    progress.start(basename=os.path.basename(local),
+                                   size=os.stat(path).st_size)
+                    shutil.copy2(path, local)
+                    progress.end(progress.size)
+        
 
+
+    def addCmdOptions(self,parser):
+        parser.add_option("--destdir", default=".", dest="destdir",
+          help='destination directory (defaults to current directory)')
+        parser.add_option("--urls", default=False, dest="urls", action="store_true",
+          help='just list the urls it would download instead of downloading')
+        parser.add_option("--resolve", default=False, dest="resolve", action="store_true",
+          help='resolve dependencies and download required packages')
+        parser.add_option("--source", default=False, dest="source", action="store_true",
+          help='operate on source packages')
+        
 if __name__ == '__main__':
-    main()
+    util = YumDownloader()
+        
\ No newline at end of file




More information about the Yum-cvs-commits mailing list