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
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
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
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