[yum-commits] Branch 'yum-3_2_X' - yum/constants.py yum/yumRepo.py
skvidal at osuosl.org
skvidal at osuosl.org
Wed Jul 1 20:53:59 UTC 2009
yum/constants.py | 8 +++++
yum/yumRepo.py | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 89 insertions(+)
New commits:
commit 3ddcd37dbc00e0e3b75f34d7700bbb0b0502f817
Author: Seth Vidal <skvidal at fedoraproject.org>
Date: Wed Jul 1 16:51:48 2009 -0400
simple yumrepo verify method - similar to the package.verify() method - more tricks to add here
diff --git a/yum/constants.py b/yum/constants.py
index 3711fc0..06d5a6b 100644
--- a/yum/constants.py
+++ b/yum/constants.py
@@ -111,3 +111,11 @@ PATTERNS_INDEXED_MAX = 128
RPM_CHECKSUM_TYPES = { 1:'md5', 2:'sha1', 8:'sha256', 9:'sha384', 10:'sha512',
11:'sha224' } # from RFC 4880
+
+
+# for repo verification/checks
+REPO_PROBLEM_REPOMD=1
+REPO_PROBLEM_METADATA=2
+REPO_PROBLEM_COMPS=3
+REPO_PROBLEM_OTHER=4
+REPO_PROBLEM_PACKAGE=5
diff --git a/yum/yumRepo.py b/yum/yumRepo.py
index 028d821..12c7d35 100644
--- a/yum/yumRepo.py
+++ b/yum/yumRepo.py
@@ -19,6 +19,7 @@ import time
import types
import urlparse
urlparse.uses_fragment.append("media")
+import gzip
import Errors
from urlgrabber.grabber import URLGrabber
@@ -33,6 +34,7 @@ import sqlitecachec
import sqlitesack
from yum import config
from yum import misc
+from yum import comps
from constants import *
import metalink
@@ -624,6 +626,9 @@ class YumRepository(Repository, config.RepoConf):
goodurls = []
skipped = None
for url in url_list:
+ # obvious bogons get ignored b/c, we could get more interesting checks but <shrug>
+ if url in ['', None]:
+ continue
url = parser.varReplace(url, self.yumvar)
if url[-1] != '/':
url= url + '/'
@@ -1687,6 +1692,74 @@ class YumRepository(Repository, config.RepoConf):
return True
return False
+ def _verify_md(self):
+ problems = []
+ print 'verifying md'
+ try:
+ md_types = self.repoXML.fileTypes()
+ except Errors.RepoError, e:
+ prb = RepoVerifyProblem(1, "failed to load repomd.xml", str(e))
+ problems.append(prb)
+ return problems
+
+ for md_type in md_types:
+ print 'verifying %s' % md_type
+ try:
+ self.retrieveMD(md_type)
+ except Errors.RepoError, e:
+ msg = "%s metadata missing or does not match checksum" % md_type
+ prb = RepoVerifyProblem(2, msg, str(e))
+ problems.append(prb)
+
+ return problems
+
+ def _verify_comps(self):
+ print 'verifying comps'
+ problems = []
+ # grab the comps for this repo
+ # run the xmllint on it
+ # chuck it into a comps object
+ # make sure it parses
+
+ grpfile = self.getGroups()
+
+ # open it up as a file object so iterparse can cope with our gz file
+ if grpfile is not None and grpfile.endswith('.gz'):
+ grpfile = gzip.open(grpfile)
+ try:
+ c = comps.Comps()
+ c.add(grpfile)
+ except (Errors.GroupsError, Errors.CompsException), e:
+ msg = "comps file failed to add"
+ prb = RepoVerifyProblem(REPO_PROBLEM_COMPS, msg, str(e))
+ problems.add(prb)
+ else:
+ if c.compscount == 0:
+ msg = "no groups in comps"
+ prb = RepoVerifyProblem(REPO_PROBLEM_COMPS, msg, "")
+ problems.add(prb)
+
+ return problems
+
+ def _verify_packages(self):
+ return []
+
+ def verify(self, items=['repodata', 'comps']):
+ """download/verify the specified items
+ @items = ['repodata', 'comps'] can include: repodata, comps, packages
+ """
+ problems = []
+ if 'repodata' in items:
+ problems.extend(self._verify_md())
+ if 'comps' in items:
+ if self.enablegroups:
+ problems.extend(self._verify_comps())
+ if 'packages' in items:
+ problems.extend(self._verify_packages())
+ # what else can we verify?
+
+ return problems
+
def getMirrorList(mirrorlist, pdict = None):
warnings.warn('getMirrorList() will go away in a future version of Yum.\n',
@@ -1725,3 +1798,11 @@ def getMirrorList(mirrorlist, pdict = None):
return returnlist
+class RepoVerifyProblem:
+ """ Holder for each "problem" we find with a repo.verify(). """
+
+ def __init__(self, type, msg, details, fake=False):
+ self.type = type
+ self.message = msg
+ self.details = details
+ self.fake = fake
More information about the Yum-commits
mailing list