[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