Archive:Useful Documentation Scripts/PackageList

import rpm import os import sys import getopt

def Usage: print "Usage: " + os.path.basename(sys.argv[0] ) + "[options] dir1 dir2" print "Options:" print " --set1 pathname                         add pathname to set1" print " --set2 pathname                         add pathname to set2" print " --show [same|only1|only2|newer1|newer2]  what info to show" print " --debug                                 print debugging goop" print "                                         (default is all but same)" sys.exit(255)

def debugmsg(msg): if debuggingflag: sys.stderr.write(msg)

def getevr(package): if package['epoch'] ==None: return ("0", package['version'], package['release'] , package['buildhost'] ) else: return (str(package['epoch'] ), package['version'], package['release'] , package['buildhost'] )

def rpmcompare(package1,package2): return rpm.labelCompare((str(package1['epoch'] ), package1['version'], package1['release'] ), (str(package2['epoch'] ), package2['version'] , package2['release'] ))

def readrpminfo(dirnames,setindicator="#"): dirrpms={}

for dirname in dirnames:

dirlist=os.listdir(dirname) dirlist.sort

for file in dirlist: if not file.endswith(".rpm"): continue

debugmsg(setindicator)

fdno = os.open(dirname + "/" + file, os.O_RDONLY) hdr = ts.hdrFromFdno(fdno) os.close(fdno)

if hdr['name'] in dirrpms: if rpmcompare(hdr,dirrpms[hdr['name'] ) == 1: dirrpms[hdr['name'] =hdr else: pass else: dirrpms[hdr['name'] =hdr debugmsg("\n")

return dirrpms

def printprettyrpmlist(rpmlist,altlist=):

packagelist=rpmlist.keys packagelist.sort

olist=[] elist=[] vlist=[] rlist=[] blist=[]

print for p in packagelist: if p not in altlist: olist.append(p) elif rpmlist[p] [0]  != altlist[p] [0] : elist.append(p) elif rpmlist[p] [1] != altlist[p] [1] : vlist.append(p) elif rpmlist[p] [2] != altlist[p] [2] : if rpmlist[p] [3] .endswith(".bu.edu"): blist.append(p) else: rlist.append(p) else: olist.append(p)

for p in elist: pkgvers = "%16s -> %-16s" % (altlist[p] [0] + ":" + altlist[p] [1]  + "-" + altlist[p] [2], rpmlist[p] [0]  + ":" + rpmlist[p] [1]  + "-" + rpmlist[p] [2] ) print "E: %-30s %s" % (p,pkgvers)

for p in vlist: pkgvers = "%16s -> %-16s" % (altlist[p] [1] + "-" + altlist[p] [2], rpmlist[p] [1]  + "-" + rpmlist[p] [2] ) print "V: %-30s %s" % (p,pkgvers)

for p in rlist: pkgvers = "%16s -> %-16s" % (altlist[p] [1] + "-" + altlist[p] [2], rpmlist[p] [1]  + "-" + rpmlist[p] [2] ) print "R: %-30s %s" % (p,pkgvers)

for p in blist: pkgvers = "%16s -> %-16s" % (altlist[p] [1] + "-" + altlist[p] [2], rpmlist[p] [1]  + "-" + rpmlist[p] [2] ) print "B: %-30s %s" % (p,pkgvers)

for p in olist: print "O: %-30s" % (p) if len(olist)>0: print

print

try: optlist, args = getopt.gnu_getopt(sys.argv[1:] ,"1:2:s:d",["set1=","set2=","show=","debug"] ) except getopt.GetoptError, msg: print "Error: " + str(msg) sys.exit(255)

set1dirs=[] set2dirs=[]

if len(args) == 2: set1dirs.append(args[0] ) set2dirs.append(args[1] ) elif len(args) > 0: Usage

validreports=( "same","only1","only2","newer1","newer2" ) reportstoshow={} for r in validreports: reportstoshow[r] =False debuggingflag=False showflagfound=False

for opt, optarg in optlist: if opt=="--set1" or opt=="-1": if optarg not in set1dirs: set1dirs.append(optarg) elif opt=="--set2" or opt=="-2": if optarg not in set2dirs: set2dirs.append(optarg) elif opt=="--show" or opt=="-s": if optarg in validreports: reportstoshow[optarg] =True showflagfound=True else: Usage elif opt=="--debug" or opt=="-d": debuggingflag=True

if not showflagfound: for r in validreports: reportstoshow[r] =True reportstoshow["same"] =False

if len(set1dirs)<1 or len(set2dirs)<1: Usage

for dir in set1dirs + set2dirs: flag=False if not os.path.isdir(dir): print "Directory " + dir + " doesn't exist." flag=True if flag: sys.exit(254)

ts = rpm.TransactionSet ts.setVSFlags(~(rpm._RPMVSF_NOSIGNATURES|rpm._RPMVSF_NODIGESTS))

set1dirsrpms=readrpminfo(set1dirs,"1") set2dirsrpms=readrpminfo(set2dirs,"2")

set1dirsonly={} set2dirsonly={} set1dirsnewer={} set2dirsolder={} set2dirsnewer={} set1dirsolder={} bothsame={}

for package in set1dirsrpms: if not set2dirsrpms.has_key(package): set1dirsonly[package] =getevr(set1dirsrpms[package] ) debugmsg("+") else: rc=rpmcompare(set1dirsrpms[package] ,set2dirsrpms[package] ) if rc==0: bothsame[package] =getevr(set1dirsrpms[package] ) debugmsg("=") elif rc>0: set1dirsnewer[package] =getevr(set1dirsrpms[package] ) set2dirsolder[package] =getevr(set2dirsrpms[package] ) debugmsg(">") elif rc<0: set2dirsnewer[package] =getevr(set2dirsrpms[package] ) set1dirsolder[package] =getevr(set1dirsrpms[package] ) debugmsg("<")

for package in set2dirsrpms: if not set1dirsrpms.has_key(package): debugmsg("-") set2dirsonly[package] =getevr(set2dirsrpms[package] ) else: pass

debugmsg("\n")

returncode=1

if reportstoshow["same"] and len(bothsame)>0: print print "--" print "In both " + str(set1dirs) + " and " + str(set2dirs) + ":" printprettyrpmlist(bothsame) returncode=0

if reportstoshow["only1"] and len(set1dirsonly)>0: print print "--" print "In " + str(set1dirs) + " only:" printprettyrpmlist(set1dirsonly) returncode=0

if reportstoshow["only2"] and len(set2dirsonly)>0: print print "--" print "In " + str(set2dirs) + " only:" printprettyrpmlist(set2dirsonly) returncode=0

if reportstoshow["newer1"] and len(set1dirsnewer)>0: print print "--" print "Newer in " + str(set1dirs) + ":" printprettyrpmlist(set1dirsnewer,set2dirsolder) returncode=0

if reportstoshow["newer2"] and len(set2dirsnewer)>0: print "--" print "Newer in " + str(set2dirs) + ":" printprettyrpmlist(set2dirsnewer,set1dirsolder) returncode=0

sys.exit(returncode)