예제 #1
0
def getYUMRepoRPMSet(repoPath, primary_gz_rel, filelist_gz_rel):
    class FileListHandler(ContentHandler):
        package_stack = [u'package', u'filelists']
        file_stack = [u'file', u'package', u'filelists']

        def __init__(self, rpmset):
            self._elementstack = []
            self.rpmset = rpmset
            self._currentrpm = None
            self._currentitem = ""

        def startElement(self, name, attrs):
            self._elementstack.insert(0, name)
            if self._elementstack == FileListHandler.package_stack:
                self._currentrpm = self.rpmset[attrs['pkgid']]

        def endElement(self, name):
            if self._elementstack == FileListHandler.file_stack:
                self._currentrpm.files.append(self._currentitem)

            del self._elementstack[0]
            self._currentitem = ""

        def characters(self, content):
            if self._elementstack == FileListHandler.file_stack:
                self._currentitem += content

    class PrimaryHandler(ContentHandler):
        packagename_stack = [u'name', u'package', u'metadata']
        filename_stack = [u'file', u'format', u'package', u'metadata']
        provides_entry_stack = [
            u'rpm:entry', u'rpm:provides', u'format', u'package', u'metadata'
        ]
        requires_entry_stack = [
            u'rpm:entry', u'rpm:requires', u'format', u'package', u'metadata'
        ]
        file_stack = [u'file', u'format', u'package', u'metadata']
        checksum_stack = [u'checksum', u'package', u'metadata']
        arch_stack = [u'arch', u'package', u'metadata']

        interesting_archs = ['i386', 'i486', 'i586', 'i686', 'narch']

        def __init__(self, rpmset, root):
            self.root = root
            self.rpmset = rpmset
            self._cleartemps()
            self._elementstack = []

        def _cleartemps(self):
            self._package = ""
            self._rpmfile = ""
            self._pkgid = ""
            self._currentitem = ""
            self._provides = []
            self._depends = []
            self._files = []
            self._arch = ""

        def startElement(self, name, attrs):
            self._elementstack.insert(0, name)
            if name == "package":
                self._cleartemps()
            elif name == "location":
                self._rpmfile = attrs['href']
            elif self._elementstack == PrimaryHandler.provides_entry_stack:
                self._provides.append((attrs['name'], None))
            elif self._elementstack == PrimaryHandler.requires_entry_stack:
                self._depends.append((attrs['name'], None))

        def endElement(self, name):
            if name == "package":
                # add the completed package to the set:
                self._rpmfile = os.path.join(self.root, self._rpmfile)
                self.rpmset.addRPM(
                    RPM(self._provides, self._files, self._depends,
                        self._package, self._rpmfile, self._pkgid))
                self._cleartemps()

            if self._elementstack == PrimaryHandler.file_stack:
                self._files.append(self._currentitem)

            del self._elementstack[0]
            self._currentitem = ""

        def characters(self, content):
            if self._elementstack == PrimaryHandler.packagename_stack:
                self._package += content
            elif self._elementstack == PrimaryHandler.file_stack:
                self._currentitem += content
            elif self._elementstack == PrimaryHandler.checksum_stack:
                self._pkgid += content
            elif self._elementstack == PrimaryHandler.arch_stack:
                self._arch += content

    primary_gz = os.path.join(repoPath, primary_gz_rel)
    filelist_gz = os.path.join(repoPath, filelist_gz_rel)

    # check we can find the primary and filelist package metadata
    # XML files:
    if not os.path.isfile(primary_gz) or not os.path.isfile(filelist_gz):
        raise Exception("Not a YUM Repository!")

    rv = RPMSet()

    _log(1, "Reading YUM repodata...")

    _log(2, "Reading primary repository data...")
    primary_fobj = gzip.GzipFile(primary_gz, "r")
    primary_handler = PrimaryHandler(rv, repoPath)
    xml.sax.parse(primary_fobj, primary_handler)
    primary_fobj.close()

    _log(2, "Reading file list...")
    filelist_fobj = gzip.GzipFile(filelist_gz, "r")
    filelist_handler = FileListHandler(rv)
    xml.sax.parse(filelist_fobj, filelist_handler)
    filelist_fobj.close()

    return rv
예제 #2
0
파일: repo.py 프로젝트: johnmdilley/xenrt
def getYUMRepoRPMSet(repoPath, primary_gz_rel, filelist_gz_rel):
    class FileListHandler(ContentHandler):
        package_stack = [u'package', u'filelists']
        file_stack = [u'file', u'package', u'filelists']

        def __init__(self, rpmset):
            self._elementstack = []
            self.rpmset = rpmset
            self._currentrpm = None
            self._currentitem = ""

        def startElement(self, name, attrs):
            self._elementstack.insert(0, name)
            if self._elementstack == FileListHandler.package_stack:
                self._currentrpm = self.rpmset[attrs['pkgid']]

        def endElement(self, name):
            if self._elementstack == FileListHandler.file_stack:
                self._currentrpm.files.append(self._currentitem)
            
            del self._elementstack[0]
            self._currentitem = ""

        def characters(self, content):
            if self._elementstack == FileListHandler.file_stack:
                self._currentitem += content

    class PrimaryHandler(ContentHandler):
        packagename_stack = [u'name', u'package', u'metadata']
        filename_stack = [u'file', u'format', u'package', u'metadata']
        provides_entry_stack = [u'rpm:entry', u'rpm:provides', u'format', u'package', u'metadata']
        requires_entry_stack = [u'rpm:entry', u'rpm:requires', u'format', u'package', u'metadata']
        file_stack = [u'file', u'format', u'package', u'metadata']
        checksum_stack = [u'checksum', u'package', u'metadata']
        arch_stack = [u'arch', u'package', u'metadata']

        interesting_archs = ['i386', 'i486', 'i586', 'i686', 'narch']

        def __init__(self, rpmset, root):
            self.root = root
            self.rpmset = rpmset
	    self._cleartemps()
            self._elementstack = []

        def _cleartemps(self):
            self._package = ""
            self._rpmfile = ""
            self._pkgid = ""
            self._currentitem = ""
            self._provides = []
            self._depends = []
            self._files = []
            self._arch = ""

        def startElement(self, name, attrs):
            self._elementstack.insert(0, name)
            if name == "package":
                self._cleartemps()
            elif name == "location":
                self._rpmfile = attrs['href']
            elif self._elementstack == PrimaryHandler.provides_entry_stack:
                self._provides.append((attrs['name'], None))
            elif self._elementstack == PrimaryHandler.requires_entry_stack:
                self._depends.append((attrs['name'], None))

        def endElement(self, name):
	    if name == "package":
                # add the completed package to the set:
                self._rpmfile = os.path.join(self.root, self._rpmfile)
                self.rpmset.addRPM(RPM(self._provides, self._files, self._depends, self._package, self._rpmfile, self._pkgid))
                self._cleartemps()

            if self._elementstack == PrimaryHandler.file_stack:
                self._files.append(self._currentitem)

            del self._elementstack[0]
            self._currentitem = ""

        def characters(self, content):
            if self._elementstack == PrimaryHandler.packagename_stack:
                self._package += content
            elif self._elementstack == PrimaryHandler.file_stack:
                self._currentitem += content
            elif self._elementstack == PrimaryHandler.checksum_stack:
                self._pkgid += content
            elif self._elementstack == PrimaryHandler.arch_stack:
                self._arch += content

    primary_gz = os.path.join(repoPath, primary_gz_rel)
    filelist_gz = os.path.join(repoPath, filelist_gz_rel)

    # check we can find the primary and filelist package metadata
    # XML files:
    if not os.path.isfile(primary_gz) or not os.path.isfile(filelist_gz):
        raise Exception("Not a YUM Repository!")

    rv = RPMSet()

    _log(1, "Reading YUM repodata...")

    _log(2, "Reading primary repository data...")
    primary_fobj = gzip.GzipFile(primary_gz, "r")
    primary_handler = PrimaryHandler(rv, repoPath)
    xml.sax.parse(primary_fobj, primary_handler)
    primary_fobj.close()

    _log(2, "Reading file list...")
    filelist_fobj = gzip.GzipFile(filelist_gz, "r")
    filelist_handler = FileListHandler(rv)
    xml.sax.parse(filelist_fobj, filelist_handler)
    filelist_fobj.close()

    return rv
예제 #3
0
def getSuseRPMSet(repoPath):
    _log(1, "Parsing SUSE repository package data...")

    packages_path = os.path.join(repoPath, "suse/setup/descr/packages")
    extra_prov_path = os.path.join(repoPath, "suse/setup/descr/EXTRA_PROV")

    package_fobj = open(packages_path, "r")

    rpmdb = RPMSet()

    # check the version of the file; we currently know how to read
    # version 2:
    next = package_fobj.readline().strip("\n").strip()
    if next[:5] == "=Ver:":
        version = next[len(next) - 3:]
        if version != "2.0":
            raise Exception(
                "Unable to deal with this version of repository: %s" % version)

    # now read the rest of the file:
    currentPackage = None
    inDeps = False
    inProvs = False
    for line in package_fobj:
        line = line.strip("\n")
        if line[:5] == "=Pkg:":
            if currentPackage:
                # we have a package ready to save:
                rpm = RPM(currentProvides, [], currentDepends,
                          currentPackageName, currentLocation)
                rpmdb.addRPM(rpm)

            # we have a new package - re-initialise the variables:
            currentPackage = None
            currentPackageName = ""
            currentArch = ""
            currentLocation = ""
            currentProvides = []
            currentDepends = []

            currentPackage = line[5:].strip().split(" ")
            currentPackageName = currentPackage[0]
            currentArch = currentPackage[3]

        if line[:5] == "=Loc:":
            values = line[5:].strip().split(" ")
            # we're not interested in src RPMs:
            if not (len(values) == 3 and values[2] == "src"):
                (disc, location) = values[:2]
                currentLocation = os.path.join(
                    os.path.join(repoPath, "suse/" + currentArch), location)

        if line[:5] == "-Req:" or line[:5] == "-Prq:":
            inDeps = False

        if line[:5] == "-Prv:":
            inProvs = False

        if inDeps: currentDepends.append(RPM.depFromString(line))

        if inProvs: currentProvides.append(RPM.provideFromString(line))

        if line[:5] == "+Req:" or line[:5] == "+Prq:":
            inDeps = True

        if line[:5] == "+Prv:":
            inProvs = True

    package_fobj.close()

    # Now read the EXTRA_PROV file if it exists... (ugh)
    if os.path.exists(extra_prov_path):
        extraprov_fobj = open(extra_prov_path, "r")

        for line in extraprov_fobj:
            line = line.strip("\n")
            (package, extraprov) = line.split(":\t")
            extraprov = extraprov.split(" ")

            rpms = rpmdb.whoProvides(RPM.provideFromString(package))
            for rpm in rpms:
                for prov in extraprov:
                    rpm.addProvides(RPM.provideFromString(prov))

        extraprov_fobj.close()

    # XXX SLES9 has a couple of extra files that aren't listed in its meta-data
    # We should abstract out classes for dealing with repos but for now we'll
    # hack this in here:
    extra_files = ['suse/i586/sles-release-9-82.11.i586.rpm']
    for f in extra_files:
        f = os.path.join(repoPath, f)
        if os.path.isfile(f):
            rpmdb.addRPM(RPM.fromFile(f))

    return rpmdb
예제 #4
0
파일: repo.py 프로젝트: johnmdilley/xenrt
def getSuseRPMSet(repoPath):
    _log(1, "Parsing SUSE repository package data...")

    packages_path = os.path.join(repoPath, "suse/setup/descr/packages")
    extra_prov_path = os.path.join(repoPath, "suse/setup/descr/EXTRA_PROV")

    package_fobj = open(packages_path, "r")

    rpmdb = RPMSet()

    # check the version of the file; we currently know how to read
    # version 2:
    next = package_fobj.readline().strip("\n").strip()
    if next[:5] == "=Ver:":
        version = next[len(next)-3:]
        if version != "2.0":
            raise Exception("Unable to deal with this version of repository: %s" % version)

    # now read the rest of the file:
    currentPackage = None
    inDeps = False
    inProvs = False
    for line in package_fobj:
        line = line.strip("\n")
        if line[:5] == "=Pkg:":
            if currentPackage:
                # we have a package ready to save:
                rpm = RPM(currentProvides, [], currentDepends,
                          currentPackageName, currentLocation)
                rpmdb.addRPM(rpm)

            # we have a new package - re-initialise the variables:
            currentPackage = None
            currentPackageName = ""
            currentArch = ""
            currentLocation = ""
            currentProvides = []
            currentDepends = []
            
            currentPackage = line[5:].strip().split(" ")
            currentPackageName = currentPackage[0]
            currentArch = currentPackage[3]

        if line[:5] == "=Loc:":
            values = line[5:].strip().split(" ")
            # we're not interested in src RPMs:
            if not (len(values) == 3 and values[2] == "src"):
                (disc, location) = values[:2]
                currentLocation = os.path.join(os.path.join(repoPath, "suse/" + currentArch), location)

        if line[:5] == "-Req:" or line[:5] == "-Prq:":
            inDeps = False

        if line[:5] == "-Prv:":
            inProvs = False

        if inDeps: currentDepends.append(RPM.depFromString(line))

        if inProvs: currentProvides.append(RPM.provideFromString(line))

        if line[:5] == "+Req:" or line[:5] == "+Prq:":
            inDeps = True

        if line[:5] == "+Prv:":
            inProvs = True

    package_fobj.close()

    # Now read the EXTRA_PROV file if it exists... (ugh)
    if os.path.exists(extra_prov_path):
        extraprov_fobj = open(extra_prov_path, "r")

        for line in extraprov_fobj:
            line = line.strip("\n")
            (package, extraprov) = line.split(":\t")
            extraprov = extraprov.split(" ")

            rpms = rpmdb.whoProvides(RPM.provideFromString(package))
            for rpm in rpms:
                for prov in extraprov:
                    rpm.addProvides(RPM.provideFromString(prov))

        extraprov_fobj.close()

    # XXX SLES9 has a couple of extra files that aren't listed in its meta-data
    # We should abstract out classes for dealing with repos but for now we'll
    # hack this in here:
    extra_files = ['suse/i586/sles-release-9-82.11.i586.rpm']
    for f in extra_files:
        f = os.path.join(repoPath, f)
        if os.path.isfile(f):
            rpmdb.addRPM(RPM.fromFile(f))

    return rpmdb