[yum-cvs] yum/yum update_md.py,NONE,1.1

Seth Vidal skvidal at linux.duke.edu
Thu Dec 22 16:07:45 UTC 2005


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

Added Files:
	update_md.py 
Log Message:

- first checkin of update_md.py for update notice parsing
- note - this is not used anywhere, yet



--- NEW FILE update_md.py ---
#!/usr/bin/python -t

# 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 2005 Duke University 


import sys
from cElementTree import iterparse
import exceptions



class UpdateNoticeException(exceptions.Exception):
    pass
    
    
class UpdateNotice(object):
    def __init__(self, elem=None):
        self.cves = []
        self.urls = []
        self.packages = []
        self.description = ''
        self.update_id = None
        self.distribution = None
        self.release_date = None
        self.status = None
        self.classification = None
        self.title = ''
        
        if elem:
            self.parse(elem)
    
    def __str__(self):
        cveinfo = pkglist = related = ''
        
        head = """
Class: %s
Status: %s
Distribution: %s
ID: %s
Release date: %s
Description: 
%s
        """ % (self.classification, self.status, self.distribution, 
               self.update_id, self.release_date, self.description)

        if self.urls:
            related = '\nRelated URLS:\n'
            for url in self.urls:
                related = related + '  %s\n' % url
        
        if self.cves:
            cveinfo = '\nResolves CVES:\n'
            for cve in self.cves:
                cveinfo = cveinfo + '  %s\n' % cve
        
        if self.packages:
            pkglist = '\nPackages: \n'
            for pkg in self.packages:
                pkgstring = '%s-%s-%s.%s\t\t%s\n' % (pkg['name'], pkg['ver'],
                                                    pkg['rel'], pkg['arch'],
                                                    pkg['pkgid'])
                pkglist = pkglist + pkgstring
        
        msg = head + related + cveinfo + pkglist
        
        return msg

    def parse(self, elem):
        if elem.tag == 'update':
            id = elem.attrib.get('id')
            if not id:
                raise UpdateNoticeException
            self.update_id = id
            
            self.release_date = elem.attrib.get('release_date')
            self.status = elem.attrib.get('status')
            c = elem.attrib.get('class')
            if not c:
                self.classification = 'update'
            else:
                self.classification = c

        for child in elem:

            if child.tag == 'cve':
                self.cves.append(child.text)

            elif child.tag == 'url':
                self.urls.append(child.text)
            
            elif child.tag == 'description':
                self.description = child.text
            
            elif child.tag == 'distribution':
                self.distribution = child.text
            
            elif child.tag == 'title':
                self.title = child.text

            elif child.tag == 'package':
                self.parse_package(child)
        
    def parse_package(self, elem):
        
        pkg = {}
        pkg['pkgid'] = elem.attrib.get('pkgid')
        pkg['name']  = elem.attrib.get('name')
        pkg['arch'] = elem.attrib.get('arch')
        for child in elem:
            if child.tag == 'version':
                pkg['ver'] = child.attrib.get('ver')
                pkg['rel'] = child.attrib.get('rel')
                pkg['epoch'] = child.attrib.get('epoch')
        
        self.packages.append(pkg)




class UpdateMetadata(object):
    def __init__(self):
        self._notices = {}
        
    def get_notices(self):
        return self._notices.values()

    notices = property(get_notices)
    
    def add(self, srcfile):
        if not srcfile:
            raise UpdateNoticeException
            
        if type(srcfile) == type('str'):
            infile = open(srcfile, 'rt')
        else:   # srcfile is a file object
            infile = srcfile
        
        parser = iterparse(infile)

        for event, elem in parser:
            if elem.tag == 'update':
                un = UpdateNotice(elem)
                if not self._notices.has_key(un.update_id):
                    self._notices[un.update_id] = un
                
            
        del parser
    
    def dump(self):
        for notice in self.notices:
            print notice


def main():

    try:
        print sys.argv[1]
        um = UpdateMetadata()
        for srcfile in sys.argv[1:]:
            um.add(srcfile)

        um.dump()
        
    except IOError:
        print >> sys.stderr, "update_md.py: No such file:\'%s\'" % sys.argv[1:]
        sys.exit(1)
        
if __name__ == '__main__':
    main()




More information about the Yum-cvs-commits mailing list