I am writing a HOW-TO for updating RedHat
multi CD packages and have run into a little
python problem . I began this on the Guiness list
but have moved here as I think some of the
scripting is beyond that lists bounds.
This script was originally posted to me by
ewt and I have poked at it a little but still
fails withe the following error
Traceback (innermost last):
File "../../update.script", line 77, in ?
hdlist = comps.HeaderListFromFile("/RedHat/base/hdlist", noscore =
1)
TypeError: unexpected keyword argument: noscore
line 77 is
hdlist = comps.HeaderListFromFile("/RedHat/base/hdlist", noscore = 1)
I am no python guru but it seems there is no 'def' for this.
If noscore doesn't appear in the argument list as given in the
method definition you can't pass it in the call to the method.
Can anyone recommend a fix, as I mentioned earlier, I am no python guru.
What I have so far is below.
Kind regards
Kevin Waterson
#!/usr/bin/python
import sys
import os
import os.path
import rpm
import string
# These dirs, along with RPMS, make up disc 2
disc2dirs = [ "RedHat/instimage", "preview" ]
# These files appear on both disc 1 and disc 2
jointfiles = [ "COPYING", "RPM-GPG-KEY", "README" ]
sys.path.append("/usr/lib/anaconda/")
rpmFD = None
fns = {}
import comps
def spaceUsed(dir):
return int(string.split(os.popen("du -s %s" %
dir).readlines()[0])[0])
def cmpHeaderByName(h1, h2):
n1 = h1['name']
n2 = h2['name']
if n1 < n2:
return -1
elif n1 == n2:
return 0;
return 1
def transCB(what, amount, total, h, intf):
if (what == rpm.RPMCALLBACK_INST_OPEN_FILE):
global rpmFD
global distDir
global pkgOrder
global fns
name = h[1000000]
# we need the real header for later
rpmFD = os.open(distDir + '/RedHat/RPMS/' + name,
os.O_RDONLY)
fd = os.open(distDir + '/RedHat/RPMS/' + name, os.O_RDONLY)
(newH, isSource) = rpm.headerFromPackage(fd)
os.close(fd)
pkgOrder.append(newH)
fns[newH] = name
return rpmFD
elif (what == rpm.RPMCALLBACK_INST_CLOSE_FILE):
global rpmFD
os.close (rpmFD)
if len(sys.argv) != 3:
print "splitdistro <toppath> <arch>"
sys.exit(1)
arch = sys.argv[2]
distDir = os.path.normpath(sys.argv[1] + "/" + arch)
srcDir = os.path.normpath(sys.argv[1] + "/SRPMS")
if not os.path.isdir(distDir):
print "error: %s is not a directory" % distDir
sys.exit(1)
if not os.path.isdir(srcDir):
print "error: %s is not a directory" % srcDir
sys.exit(1)
disc1Dir = distDir + "-disc1"
disc1SrcDir = distDir + "-srpms"
disc2Dir = distDir + "-disc2"
hdlist = comps.HeaderListFromFile("/RedHat/base/hdlist", noscore = 1)
comps = comps.ComponentSet(distDir + "/RedHat/base/comps", hdlist,
arch = arch, matchAllLang = 1)
for comp in comps:
if comp.name != 'Everything':
comp.select(1)
for package in hdlist.keys():
if len(package) >= 7 and package[:7] == "kernel-":
hdlist[package].selected = 1
# work out the order we'd like to install everything in
pkgOrder = []
list = []
for p in hdlist.selected():
list.append(p.h)
list.sort(cmpHeaderByName)
for item in list:
pkgOrder.append(item)
list = []
for p in hdlist.packages.values():
if not p.selected:
list.append(p.h)
list.sort(cmpHeaderByName)
for item in list:
pkgOrder.append(item)
testpath = '/tmp/splitdistro-' + str (os.getpid ())
os.system ("mkdir -p " + testpath + "/var/lib/rpm")
db = rpm.opendb(1, testpath)
print "Building transaction set..."
ts = rpm.TransactionSet(testpath, db)
for h in pkgOrder:
ts.add(h, h, 'i')
pkgOrder = []
print "Ordering transaction set..."
ts.order()
print "Running transaction..."
problems = ts.run(rpm.RPMTRANS_FLAG_TEST, ~0, transCB, None)
# this shouldn't happen
if problems:
for (msg, (sense, str, val)) in problems:
print "\t" + msg
os.system ("rm -rf " + testpath)
print "Splitting tree..."
totalsize = spaceUsed(distDir)
rpmsize = spaceUsed(distDir + "/RedHat/RPMS")
dirsize = 0
for dir in disc2dirs:
dirsize = dirsize + spaceUsed(distDir + "/" + dir)
targetSize = 626000 - (totalsize - rpmsize - dirsize)
targetSize = targetSize * 1024
totalsize = 0
disc2pkgs = []
for p in pkgOrder:
fn = fns[p]
size = os.path.getsize(distDir + "/RedHat/RPMS/" + fn)
if size + totalsize > targetSize:
disc2pkgs.append(p)
# force the remainder of packages to go on disc 2
totalsize = targetSize
else:
totalsize = totalsize + size
print "Creating disc1..."
os.system("rm -rf %s %s %s" % ( disc1Dir, disc2Dir, disc1SrcDir))
os.system("mkdir -p %s %s %s/RedHat/RPMS %s/SRPMS" %
(disc1Dir, disc1SrcDir, disc2Dir, disc2Dir))
os.system("cp -al %s/. %s" % (distDir, disc1Dir))
f = open("%s/.disc1-%s" % (disc1Dir, arch), "w")
f.close()
print "Creating source disc..."
os.system("cp -al %s/. %s" % (srcDir, disc1SrcDir))
print "Removing uneeded source RPMS..."
files = os.listdir(disc1SrcDir + "/SRPMS")
for file in files:
fn = disc1SrcDir + "/SRPMS/" + file
fd = os.open(fn, 0)
(hdr, issrc) = rpm.headerFromPackage(fd)
os.close(fd)
if ((hdr[rpm.RPMTAG_EXCLUSIVEARCH]
and not arch in hdr[rpm.RPMTAG_EXCLUSIVEARCH])
or
(hdr[rpm.RPMTAG_EXCLUDEARCH]
and arch in hdr[rpm.RPMTAG_EXCLUDEARCH])):
os.unlink(fn)
print "Creating disc2..."
f = open("%s/.disc2-%s" % (disc2Dir, arch), "w")
f.close()
for p in disc2pkgs:
fn = fns[p]
src = "%s/RedHat/RPMS/%s" % (disc1Dir, fn)
dest = "%s/RedHat/RPMS/%s" % (disc2Dir, fn)
os.rename(src, dest)
for dir in disc2dirs:
src = "%s/%s" % (disc1Dir, dir)
dest = "%s/%s" %(disc2Dir, dir)
try:
os.rename(src, dest)
except:
raise IOError, "error renaming %s to %s" % (src, dest)
for file in jointfiles:
src = "%s/%s" % (disc1Dir, file)
dest = "%s/%s" %(disc2Dir, file)
try:
os.link(src, dest)
except:
raise IOError, "error linking %s to %s" % (src, dest)
# Move sources from source disc to disc2 until source disc has
enough
# free space
sourceUsed = spaceUsed(disc1SrcDir)
disc2Used = spaceUsed(disc2Dir)
files = os.listdir(disc1SrcDir + "/SRPMS")
files.sort()
files.reverse()
while sourceUsed > 645000 and files:
f = files[0]
files = files[1:]
src = "%s/SRPMS/%s" % (disc1SrcDir, f)
size = os.path.getsize(src) / 1024
if (size + disc2Used) > 645000:
continue
disc2Used = disc2Used + size
if os.path.isfile(src):
dest = "%s/SRPMS/%s" % (disc2Dir, f)
os.rename(src, dest)
sourceUsed = sourceUsed - (os.path.getsize(dest) / 1024)
os.system("du -sh %s %s %s" % (disc1Dir, disc2Dir, disc1SrcDir))
_______________________________________________
Redhat-devel-list mailing list
[EMAIL PROTECTED]
https://listman.redhat.com/mailman/listinfo/redhat-devel-list