Tryag File Manager
Home
-
Turbo Force
Current Path :
/
usr
/
lib
/
python2.4
/
site-packages
/
yum
/
Upload File :
New :
File
Dir
//usr/lib/python2.4/site-packages/yum/repos.py
#!/usr/bin/python -tt # 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. # Copyright 2004 Duke University import re import fnmatch import types import logging import misc import Errors from packageSack import MetaSack from weakref import proxy as weakref class _wrap_ayum_getKeyForRepo: """ This is a wrapper for calling YumBase.getKeyForRepo() because otherwise we take a real reference through the bound method and that is d00m (this applies to YumBase and RepoStorage, hence why we have a seperate class). A "better" fix might be to explicitly pass the YumBase instance to the callback ... API change! """ def __init__(self, ayum): self.ayum = weakref(ayum) def __call__(self, repo, callback=None): return self.ayum.getKeyForRepo(repo, callback) class RepoStorage: """This class contains multiple repositories and core configuration data about them.""" def __init__(self, ayum): self.repos = {} # list of repos by repoid pointing a repo object # of repo options/misc data self.callback = None # progress callback used for populateSack() for importing the xml files self.cache = 0 self.pkgSack = MetaSack() self.logger = logging.getLogger("yum.RepoStorage") self._setup = False self.ayum = weakref(ayum) # callbacks for handling gpg key imports for repomd.xml sig checks # need to be set from outside of the repos object to do anything # even quasi-useful # defaults to what is probably sane-ish self.gpg_import_func = _wrap_ayum_getKeyForRepo(ayum) self.confirm_func = None def doSetup(self, thisrepo = None): self.ayum.plugins.run('prereposetup') if thisrepo is None: repos = self.listEnabled() else: repos = self.findRepos(thisrepo) if len(repos) < 1: self.logger.debug('No Repositories Available to Set Up') for repo in repos: repo.setup(self.ayum.conf.cache, self.ayum.mediagrabber, gpg_import_func = self.gpg_import_func, confirm_func=self.confirm_func) self._setup = True self.ayum.plugins.run('postreposetup') def __str__(self): return str(self.repos.keys()) def __del__(self): self.close() def close(self): for repo in self.repos.values(): repo.close() def add(self, repoobj): if self.repos.has_key(repoobj.id): raise Errors.DuplicateRepoError, 'Repository %s is listed more than once in the configuration' % (repoobj.id) self.repos[repoobj.id] = repoobj def delete(self, repoid): if self.repos.has_key(repoid): thisrepo = self.repos[repoid] thisrepo.close() del self.repos[repoid] def sort(self): repolist = self.repos.values() repolist.sort() return repolist def getRepo(self, repoid): try: return self.repos[repoid] except KeyError, e: raise Errors.RepoError, \ 'Error getting repository data for %s, repository not found' % (repoid) def findRepos(self,pattern): """find all repositories matching fnmatch `pattern`""" result = [] for item in pattern.split(','): item = item.strip() match = re.compile(fnmatch.translate(item)).match for name,repo in self.repos.items(): if match(name): result.append(repo) return result def disableRepo(self, repoid): """disable a repository from use fnmatch wildcards may be used to disable a group of repositories. returns repoid of disabled repos as list """ repos = [] if misc.re_glob(repoid) or repoid.find(',') != -1: for repo in self.findRepos(repoid): repos.append(repo.id) repo.disable() else: thisrepo = self.getRepo(repoid) repos.append(thisrepo.id) thisrepo.disable() return repos def enableRepo(self, repoid): """enable a repository for use fnmatch wildcards may be used to enable a group of repositories. returns repoid of enables repos as list """ repos = [] if misc.re_glob(repoid) or repoid.find(',') != -1: for repo in self.findRepos(repoid): repos.append(repo.id) repo.enable() else: thisrepo = self.getRepo(repoid) repos.append(thisrepo.id) thisrepo.enable() return repos def listEnabled(self): """return list of enabled repo objects""" returnlist = [] for repo in self.repos.values(): if repo.isEnabled(): returnlist.append(repo) returnlist.sort() return returnlist def listGroupsEnabled(self): """return a list of repo objects that have groups enabled""" returnlist = [] for repo in self.listEnabled(): if repo.enablegroups: returnlist.append(repo) return returnlist def setCache(self, cacheval): """sets cache value in all repos""" self.cache = cacheval for repo in self.repos.values(): repo.cache = cacheval def setCacheDir(self, cachedir): """sets the cachedir value in all repos""" for repo in self.repos.values(): repo.old_base_cache_dir = repo.basecachedir repo.basecachedir = cachedir def setProgressBar(self, obj): """sets the progress bar for downloading files from repos""" for repo in self.repos.values(): repo.setCallback(obj) def setFailureCallback(self, obj): """sets the failure callback for all repos""" for repo in self.repos.values(): repo.setFailureObj(obj) def setMirrorFailureCallback(self, obj): """sets the failure callback for all mirrors""" for repo in self.repos.values(): repo.setMirrorFailureObj(obj) def setInterruptCallback(self, callback): for repo in self.repos.values(): repo.setInterruptCallback(callback) def getPackageSack(self): return self.pkgSack def populateSack(self, which='enabled', mdtype='metadata', callback=None, cacheonly=0): """ This populates the package sack from the repositories, two optional arguments: - which='repoid, enabled, all' - mdtype='metadata, filelists, otherdata, all' """ if not self._setup: self.doSetup() if not callback: callback = self.callback myrepos = [] if which == 'enabled': myrepos = self.listEnabled() elif which == 'all': myrepos = self.repos.values() else: if type(which) == types.ListType: for repo in which: if isinstance(repo, Repository): myrepos.append(repo) else: repobj = self.getRepo(repo) myrepos.append(repobj) elif type(which) == types.StringType: repobj = self.getRepo(which) myrepos.append(repobj) if mdtype == 'all': data = ['metadata', 'filelists', 'otherdata'] else: data = [ mdtype ] for repo in myrepos: sack = repo.getPackageSack() sack.populate(repo, mdtype, callback, cacheonly) self.pkgSack.addSack(repo.id, sack) class Repository: """this is an actual repository object""" def __init__(self, repoid): self.id = repoid self.disable() def __cmp__(self, other): """ Sort base class repos. by alphanumeric on their id, also see __cmp__ in YumRepository(). """ if self.id > other.id: return 1 elif self.id < other.id: return -1 else: return 0 def __str__(self): return self.id def __hash__(self): return hash(self.id) def __del__(self): self.close() def close(self): pass def setAttribute(self, key, value): """sets a generic attribute of this repository""" setattr(self, key, value) def getAttribute(self, key): return getattr(self, key, None) def isEnabled(self): enabled = self.getAttribute('enabled') return enabled is not None and enabled def enable(self): self.setAttribute('enabled', 1) def disable(self): self.setAttribute('enabled', 0) def getExcludePkgList(self): excludeList = self.getAttribute('exclude') return excludeList or [] def getIncludePkgList(self): includeList = self.getAttribute('includepkgs') return includeList or [] # Abstract interface def ready(self): raise NotImplementedError() def getGroupLocation(self): raise NotImplementedError() def getPackageSack(self): raise NotImplementedError() def setup(self, cache): raise NotImplementedError() def setCallback(self, callback): raise NotImplementedError() def setFailureObj(self, obj): raise NotImplementedError() def setMirrorFailureObj(self, obj): raise NotImplementedError() def getPackage(self, package, checkfunc = None, text = None, cache = True): raise NotImplementedError() def getHeader(self, package, checkfunc = None, reget = 'simple', cache = True): raise NotImplementedError()