#! /usr/bin/python -t import rpm from yum import Errors import rpmUtils.transaction import sys import os def _getsysver(installroot, distroverpkg, old=True): ts = rpmUtils.transaction.initReadOnlyTransaction(root=installroot) ts.pushVSFlags(~(rpm._RPMVSF_NOSIGNATURES|rpm._RPMVSF_NODIGESTS)) try: idx = ts.dbMatch('provides', distroverpkg) except TypeError, e: # This is code for "cannot open rpmdb" # this is for pep 352 compliance on python 2.6 and above :( if sys.hexversion < 0x02050000: if hasattr(e,'message'): raise Errors.YumBaseError("Error: " + str(e.message)) else: raise Errors.YumBaseError("Error: " + str(e)) raise Errors.YumBaseError("Error: " + str(e)) except rpm.error, e: # This is the "new" code for "cannot open rpmdb", 4.8.0 ish raise Errors.YumBaseError("Error: " + str(e)) # we're going to take the first one - if there is more than one of these # then the user needs a beating if idx.count() == 0: releasever = '$releasever' else: try: hdr = idx.next() except StopIteration: raise Errors.YumBaseError("Error: rpmdb failed release provides. Try: rpm --rebuilddb") if not old: off = hdr[getattr(rpm, 'RPMTAG_PROVIDENAME')].index(distroverpkg) flag = hdr[getattr(rpm, 'RPMTAG_PROVIDEFLAGS')][off] flag = rpmUtils.miscutils.flagToString(flag) if flag != 'EQ': old = True else: releasever = hdr[getattr(rpm, 'RPMTAG_PROVIDEVERSION')][off] releasever = rpmUtils.miscutils.stringToVersion(releasever) releasever = releasever[1] # Just version if old: releasever = hdr['version'] del hdr del idx del ts return releasever distropkg = "redhat-release" if len(sys.argv) > 1: distropkg = sys.argv[1] if os.path.exists("/etc/yum/vars/releasever"): print "file:", open("/etc/yum/vars/releasever").read(), print print 'looking for provide:', distropkg print print 'prov:', _getsysver("/", distropkg, old=False) print ' pkg:', _getsysver("/", distropkg)