[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
- Previous message: [yum-cvs] /yum-utils yum-utils.spec, 1.28.2.9, 1.28.2.10 Makefile, 1.10.2.1, 1.10.2.2
- Next message: [yum-cvs] /yum-utils repoclosure.py, 1.15, 1.16 repoquery.py, 1.41, 1.42 repo-rss.py, 1.6, 1.7
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
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
- Previous message: [yum-cvs] /yum-utils yum-utils.spec, 1.28.2.9, 1.28.2.10 Makefile, 1.10.2.1, 1.10.2.2
- Next message: [yum-cvs] /yum-utils repoclosure.py, 1.15, 1.16 repoquery.py, 1.41, 1.42 repo-rss.py, 1.6, 1.7
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
More information about the Yum-cvs-commits
mailing list