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

Reply via email to