#!/usr/bin/env python #***************************************************** # RPM Wizard -- script for creating databases # Copyright 2002 Magnus Bjorklof # License: GNU General Public License #***************************************************** import os import commands import string import sys import rpm class DBCreator: def listCreator(self,fileslist, Removable=0,cml=0): list=[] if cml==1: total=len(fileslist) amount=0 perclist=[] for file in fileslist: if cml==1: amount=amount+1 file=string.strip(file) depends=[] provides=[] dname=[] dflags=[] dversion=[] try: fd = os.open(file, os.O_RDONLY) header, isSource=rpm.headerFromPackage(fd) os.close(fd) if isSource==1: continue except: continue if header==None: continue pname=header[rpm.RPMTAG_PROVIDENAME] pversion=header[rpm.RPMTAG_PROVIDEVERSION] pflags=header[rpm.RPMTAG_PROVIDEFLAGS] dname=header[rpm.RPMTAG_REQUIRENAME] dflags=header[rpm.RPMTAG_REQUIREFLAGS] dversion=header[rpm.RPMTAG_REQUIREVERSION] t=0 try: for dn in dname: try: depends.append(makeRequireString(dn, dversion[t], dflags[t])) t=t+1 except: continue except: pass #continue t=0 try: for pn in pname: try: provides.append(makeRequireString(pn, pversion[t], pflags[t])) t=t+1 except: try: provides.append(makeRequireString(pn, pversion[t], pflags)) t=t+1 except: print "this is an error!!!!!!" continue except: pass #continue list.append((file, provides, depends)) if cml==1: perc=amount*100/total tal=perc/5 tal=int(tal) if cml==1 and (5*tal)==perc and perc!=0: try: perclist.index(perc) except ValueError: perclist.append(perc) print perc, '%' s='' if cml==1: print "Creating list. This may take a few minutes. Please wait..." amount=0 perclist=[] total=len(list) pfList='' depList='' for (filename, provides, depends) in list: if cml==1: amount=amount+1 perc=amount*100/total tal=perc/5 tal=int(tal) if cml==1 and (5*tal)==perc and perc!=0: try: perclist.index(perc) except ValueError: perclist.append(perc) print perc, '%' if Removable==0: s=s+'file:/'+filename+'\n' else: s=s+'removable:/'+filename+'\n' shortfilename=os.path.basename(filename) for p in provides: pfList=pfList+p+'@'+shortfilename+'\n' dstring='' for d in depends: if dstring=='': dstring=d else: dstring=dstring+'@'+d depList=depList+shortfilename+'@'+dstring+'\n' return s, depList, pfList # Note: the lists are not python lists # returns (list of files, depends, provides) def makeRequireString(reqname, reqversion, reqflags): require = reqname reqversionL=string.split(reqversion, ':') if len(reqversionL)==2: reqversion=reqversionL[1] if reqflags & (rpm.RPMSENSE_LESS | rpm.RPMSENSE_GREATER | rpm.RPMSENSE_EQUAL): require = require+ ' ' if reqflags & rpm.RPMSENSE_LESS: require = require + "<" if reqflags & rpm.RPMSENSE_GREATER: require = require + ">" if reqflags & rpm.RPMSENSE_EQUAL: require = require + "=" require = require + ' ' + reqversion return require class Cml: def cml(self): print """RPM Wizard Database Creator 0.0.4 Copyright (c) 2002 Magnus Bjorklof \n""" dir=raw_input("Please provide the path to the cdrom (eg. /mnt/cdrom):\n") if dir=='' or dir ==None or dir=='\n': dir='/mnt/cdrom' NAME=raw_input("Give a name for the media you are going to process (eg. Mandrake 8.2 CD 2) :\n") if os.path.isdir(dir)==0: print "\nWrong pathname. Please try again." sys.exit(1) print "Processing files. This may take a few minutes. Please wait..." s1,files1=commands.getstatusoutput('ls '+dir+'/*.rpm') s2,files2=commands.getstatusoutput('ls '+dir+'/*/*.rpm') s3,files3=commands.getstatusoutput('ls '+dir+'/*/*/*.rpm') s4,files4=commands.getstatusoutput('ls '+dir+'/*/*/*/*.rpm') fileslist=[] if s1==0: l=string.split(files1) fileslist=fileslist+l if s2==0: l=string.split(files2) fileslist=fileslist+l if s3==0: l=string.split(files3) fileslist=fileslist+l if s4==0: l=string.split(files4) fileslist=fileslist+l self.dbc=DBCreator() (s, depList, pfList)=self.dbc.listCreator(fileslist, 1, 1) HOME=os.environ['HOME'] fsk=open(HOME+'/list.'+NAME, 'w') fsk2=open(HOME+'/provides.'+NAME, 'w') fsk3=open(HOME+'/depends.'+NAME, 'w') print "Writing file:", HOME+'/list.' +NAME fsk.write(s) print "Writing file:", HOME+'/provides.' +NAME fsk2.write(pfList) print "Writing file:", HOME+'/depends.' +NAME fsk3.write(depList) print "Please send these files to " cml=Cml() cml.cml()