| # |
# |
| # Ported from PHP version Copyright (c) Tobias McNulty 2000-2003 |
# Ported from PHP version Copyright (c) Tobias McNulty 2000-2003 |
| |
|
| import sys, os, ConfigParser |
import sys, os, ConfigParser, popen2 |
| import xml.parsers.expat |
import xml.parsers.expat |
| import md5 |
import md5, string |
| from ftplib import FTP |
from ftplib import FTP |
| from commands import getoutput |
from commands import getoutput |
| from shutil import copy, move |
from shutil import copy, move |
| from urllib2 import urlopen |
from urllib2 import urlopen |
| from ClientForm import ParseResponse |
from ClientForm import ParseResponse |
| |
|
| |
|
| debug=0 |
debug=0 |
| clean=0 |
clean=1 |
| |
dont_build=0 |
| verbose=1 |
verbose=1 |
| |
|
| # parse host-specific configuration information from gkb.cfg |
# parse host-specific configuration information from gkb.cfg |
| mastertrees={} |
mastertrees={} |
| builds={} |
builds={} |
| |
|
| |
class Error(Exception): |
| |
"""Base class for exceptions in this module.""" |
| |
pass |
| |
|
| |
class BuildError(Error): |
| |
"""Exception raised for build-level errors. |
| |
|
| |
Attributes: |
| |
message -- explanation of the error |
| |
""" |
| |
|
| |
def __init__(self, message): |
| |
self.message = message |
| |
|
| |
class FatalError(Error): |
| |
"""Exception for fatal errors that prevent program continuation. |
| |
|
| |
Attributes: |
| |
message -- explanation of why the specific transition is not allowed |
| |
""" |
| |
|
| |
def __init__(self, message): |
| |
self.message = message |
| |
|
| def printverbose(myoutput): |
def printverbose(myoutput): |
| """Supporting method to output info to stdout if verbosity level is set""" |
"""Supporting method to output info to stdout if verbosity level is set""" |
| if verbose==1: |
if verbose==1: |
| print myoutput |
print myoutput |
| |
|
| |
def cleantext(text): |
| |
"""clean a string of passwords, etc. to make it suitable for logging""" |
| |
result = string.replace(text,passwd,"XXXXXXXX") |
| |
return result |
| |
|
| |
def linkpipes(input, output): |
| |
"""link two pipes together, writing all the data from input to output""" |
| |
data = input.read(2048) |
| |
while data: |
| |
output.write(data) |
| |
data = input.read(2048) |
| |
|
| |
def runcmd(cmd, kinfo=None, outfile=None, append=False, infile=None): |
| |
"""run the specified command, with the optional input and output documents""" |
| |
log(" \_ running " + cleantext(cmd), kinfo) |
| |
|
| |
p4obj = popen2.Popen4(cmd) |
| |
|
| |
pin = p4obj.tochild |
| |
pouterr = p4obj.fromchild |
| |
|
| |
if infile != None: |
| |
inobj = open(infile, "r") |
| |
linkpipes(inobj, pin) |
| |
inobj.close() |
| |
|
| |
if outfile != None: |
| |
if append: |
| |
mode = "a" |
| |
else: |
| |
mode = "w" |
| |
|
| |
outobj = open(outfile, mode) |
| |
linkpipes(pouterr,outobj) |
| |
outobj.close() |
| |
|
| |
err = p4obj.wait() |
| |
|
| |
if err == None: |
| |
err = 0 |
| |
|
| |
log(" \_ exit code: %i" % err, kinfo) |
| |
|
| |
return err |
| |
|
| def log(text,kinfo=0): |
def log(text,kinfo=0): |
| if kinfo: |
if kinfo: |
| printverbose(kinfo["name"] + " : " + text) |
printverbose(kinfo["name"] + " : " + text) |
| else: |
else: |
| printverbose("gkb : " + text) |
printverbose("gkb : " + text) |
| |
|
| def deathbyerror(mymsg): |
|
| """Supporting method to print error to stdout and return system error -1 on exit""" |
|
| print mymsg |
|
| sys.exit(-1) |
|
| |
|
| def verifydir(mydir,kinfo=0): |
def verifydir(mydir,kinfo=0): |
| """Supporting method to verify a given exists, if not it will create it""" |
"""Supporting method to verify a given exists, if not it will create it""" |
| log("verifying directory " + mydir,kinfo) |
log("verifying directory " + mydir,kinfo) |
| if not os.path.isdir(mydir): |
if not os.path.isdir(mydir): |
| log("%s doesn't exist, creating" % mydir,kinfo) |
log(" \_ %s doesn't exist, creating" % mydir,kinfo) |
| os.mkdir(mydir) |
os.mkdir(mydir) |
| return mydir |
return mydir |
| |
|
| def verifyfile(myfile,kinfo): |
def verifyfile(myfile,kinfo): |
| """Supporting method to verify file exists, if not it will exit with error""" |
"""Supporting method to verify file exists, if not it will exit with error""" |
| if not os.path.isfile(myfile): |
if not os.path.isfile(myfile): |
| deathbyerror("%s : cannot find file expected at %s, exiting" % (kinfo["name"],myfile)) |
raise BuildError("cannot find file expected at %s, exiting" % myfile) |
| return myfile |
return myfile |
| |
|
| def md5sum(fileobj): |
def md5sum(fileobj): |
| digest = md.hexdigest() |
digest = md.hexdigest() |
| return digest |
return digest |
| |
|
| def krn_querymgr(command,kinfo): |
def krn_querymgr(command,kinfo,extra=""): |
| """queries the build host manager with a variety of commands, such as checkout, checkin, etc.""" |
"""queries the build host manager with a variety of commands, such as checkout, checkin, etc.""" |
| version=krn_localversion(kinfo) |
version=krn_localversion(kinfo) |
| log("querying distribution site manager with command '%s' (kernel version=%s)" % (command,version),kinfo) |
log("querying distribution site manager with command '%s' (kernel version=%s)" % (command,version),kinfo) |
| result=getoutput("wget --quiet --output-document=- \"%s/manager.php?cmd=%s&host=%s&pass=%s&build=%s&version=%s\"" % (msite,command,host,passwd,kinfo["name"],version)) |
result=getoutput("wget --quiet --output-document=- \"%s/manager.php?cmd=%s&host=%s&pass=%s&build=%s&version=%s%s\"" % (msite,command,host,passwd,kinfo["name"],version,extra)) |
| log("result: '"+result+"'",kinfo) |
log(" \_ result: '"+result+"'",kinfo) |
| return result=="1" |
return result=="1" |
| |
|
| |
def krn_modulesenabled(kinfo): |
| |
"""Checks the source to see if modules are enabled""" |
| |
output=getoutput("""awk -F '=' '/^CONFIG_MODULES/{v=$2} END { printf("%s\\n", v) }' """ + kinfo["workdir"] + """/.config | sed "s/ //g" """) |
| |
if (output=='y'): |
| |
result=1 |
| |
else: |
| |
result=0 |
| |
|
| |
return result |
| |
|
| def krn_localversion(kinfo): |
def krn_localversion(kinfo): |
| """Checks the version of the local source tree specified in kinfo""" |
"""Checks the version of the local source tree specified in kinfo""" |
| version=getoutput("""awk -F '=' '/^VERSION/{v=$2} /^PATCHLEVEL/{p=$2} /^SUBLEVEL/{s=$2} /^EXTRAVERSION/{e=$2} END { printf("%s.%s.%s%s\\n", v, p, s, e) }' """ + kinfo["workdir"] + """/Makefile | sed "s/ //g" """) |
version=getoutput("""awk -F '=' '/^VERSION/{v=$2} /^PATCHLEVEL/{p=$2} /^SUBLEVEL/{s=$2} /^EXTRAVERSION/{e=$2} END { printf("%s.%s.%s%s\\n", v, p, s, e) }' """ + kinfo["workdir"] + """/Makefile | sed "s/ //g" """) |
| verifydir("%s/%s" % (patchdir, kinfo["name"]),kinfo) |
verifydir("%s/%s" % (patchdir, kinfo["name"]),kinfo) |
| |
|
| # sync the source to make sure we are up to date ... |
# sync the source to make sure we are up to date ... |
| log("calling gkb_getsource",kinfo) |
log("fetching latest source",kinfo) |
| gkb_getsource(kinfo) |
gkb_getsource(kinfo) |
| |
|
| # now we'll go into the work |
# go into the work directory |
| |
#chdir(workdir, kinfo) |
| |
|
| |
# archive the clean source for later uploading |
| |
#log("archiving source to " + kinfo["mastertree"] + ".tar.bz2", kinfo) |
| |
#runcmd("tar cjf " + kinfo["mastertree"] + ".tar.bz2 " + kinfo["mastertree"], kinfo) |
| |
|
| |
# now we'll go into the tree's work dir |
| chdir(kinfo["workdir"],kinfo) |
chdir(kinfo["workdir"],kinfo) |
| |
|
| # check for patches and apply if necessary |
# check for patches and apply if necessary |
| """build a kernel, version 2.4.x""" |
"""build a kernel, version 2.4.x""" |
| |
|
| if krn_querymgr("checkout",kinfo): |
if krn_querymgr("checkout",kinfo): |
| |
try: |
| myversion=krn_localversion(kinfo) |
myversion=krn_localversion(kinfo) |
| |
|
| # fetch and cp the config file to work/.config |
# fetch and cp the config file to work/.config |
| |
|
| # **Note** : we set the preprocessing command to premake inline instead |
# **Note** : we set the preprocessing command to premake inline instead |
| # of globally as it is only needed in this target |
# of globally as it is only needed in this target |
| |
if dont_build==0: |
| gkb_runmake("oldconfig",kinfo,premake+" /bin/cat %s/newlines | " % buildroot,makeopts) |
gkb_runmake("oldconfig",kinfo,premake+" /bin/cat %s/newlines | " % buildroot,makeopts) |
| |
|
| # give option to only repackage for testing purposes, comment out clean=1 at top of this file to use this feature |
# give option to only repackage for testing purposes, comment out clean=1 at top of this file to use this feature |
| if clean==1: |
if (clean==1 and dont_build==0): |
| gkb_runmake("clean", kinfo, premake, makeopts) |
gkb_runmake("clean", kinfo, premake, makeopts) |
| |
|
| |
if dont_build==0: |
| gkb_runmake("dep", kinfo, premake, makeopts) |
gkb_runmake("dep", kinfo, premake, makeopts) |
| |
|
| gkb_runmake(kinfo["binname"], kinfo, premake, makeopts) |
gkb_runmake(kinfo["binname"], kinfo, premake, makeopts) |
| |
|
| # We should check to see if binary built ok, if not bail out |
# We should check to see if binary built ok, if not bail out |
| if verifyfile(kbinloc,kinfo): |
if verifyfile(kbinloc,kinfo): |
| # the binary exists, so let's cp it to bin... |
# the binary exists, so let's cp it to bin... |
| copy(kbinloc,mybindir+"/boot/"+kinfo["binname"]+"-"+myversion) |
copy(kbinloc,mybindir+"/boot/"+kinfo["binname"]+"-"+myversion) |
| |
copy("%s/System.map" % kinfo["workdir"],mybindir+"/boot/System.map-"+myversion) |
| else: |
else: |
| # the binary is not there, inform user and bail out with error |
# the binary is not there, inform user and bail out with error |
| deathbyerror("%s : %s is not present, assuming build failure and exiting. See log for details." % (kinfo["name"], kbinloc)) |
raise BuildError("%s is not present, assuming build failure and exiting. See log for details." % kbinloc) |
| |
|
| |
if krn_modulesenabled(kinfo): |
| # now that we know he binary built, let's continue |
# now that we know he binary built, let's continue |
| |
if dont_build==0: |
| gkb_runmake("modules",kinfo, premake, makeopts) |
gkb_runmake("modules",kinfo, premake, makeopts) |
| |
|
| # **Note** : we prepend the INSTALL_MOD_PATH to the makeopts inline instead |
# **Note** : we prepend the INSTALL_MOD_PATH to the makeopts inline instead |
| # of globally as it is only needed in this target |
# of globally as it is only needed in this target |
| gkb_runmake("modules_install", kinfo, premake, "INSTALL_MOD_PATH=%s %s" % (mybindir, makeopts)) |
gkb_runmake("modules_install", kinfo, premake, "INSTALL_MOD_PATH=%s %s" % (mybindir, makeopts)) |
| |
else: |
| |
log("skipping make modules (disabled in .config)",kinfo) |
| |
|
| |
# compress and upload source archive |
| |
chdir(kinfo["workdir"]+"/..",kinfo) |
| |
archive_name = "src-%s.tar.bz2" % kinfo["mastertree"], |
| |
|
| |
# compress and upload kernel binary |
| chdir(bindir,kinfo) |
chdir(bindir,kinfo) |
| archive_name = "linux-%s-%s.tar.bz2" % (kinfo["name"], myversion) |
archive_name = "linux-%s-%s.tar.bz2" % (kinfo["name"], myversion) |
| |
|
| log("compressing binary archive "+archive_name,kinfo) |
log("compressing binary archive "+archive_name,kinfo) |
| |
|
| if os.system("tar cjf "+archive_name+" "+os.path.basename(mybindir)): |
if runcmd("tar cjf "+archive_name+" "+os.path.basename(mybindir), kinfo): |
| deathbyerror("%s : failed to `tar cjf %s`" % (kinfo["name"], archive_name)) |
raise BuildError("failed to `tar cjf %s`" % archive_name) |
| |
|
| os.system("rm -rf %s" % mybindir) |
runcmd("rm -rf %s" % mybindir, kinfo) |
| |
|
| krn_upload(archive_name,myversion,kinfo) |
|
| |
|
| |
krn_upload(archive_name,"kernel",myversion,kinfo) |
| krn_querymgr("checkin",kinfo) |
krn_querymgr("checkin",kinfo) |
| |
|
| |
if os.fork() == 0: |
| |
#in child |
| |
try: |
| |
# sync the source to make sure we are up to date ... |
| |
log("re-fetching latest source",kinfo) |
| |
gkb_getsource(kinfo) |
| |
|
| |
# go into the work directory |
| |
chdir(workdir, kinfo) |
| |
|
| |
# archive the clean source for later uploading |
| |
log("archiving source to " + kinfo["mastertree"] + ".tar.bz2", kinfo) |
| |
runcmd("tar cjf " + kinfo["mastertree"] + ".tar.bz2 " + kinfo["mastertree"], kinfo) |
| |
|
| |
krn_upload(workdir + "/" + kinfo["mastertree"] + ".tar.bz2", "source", myversion, kinfo) |
| |
finally: |
| |
sys.exit(0) |
| |
|
| |
except BuildError, e: |
| |
log(e.message, kinfo) |
| |
krn_querymgr("checkin",kinfo,"&failed=%s" % krn_localversion(kinfo)) |
| |
except: |
| |
krn_querymgr("checkin",kinfo,"&failed=%s" % krn_localversion(kinfo)) |
| |
raise |
| |
|
| def krn_build26(kinfo): |
def krn_build26(kinfo): |
| """build a kernel, version 2.6""" |
"""build a kernel, version 2.6""" |
| |
|
| |
|
| syncline=args+" "+kinfo["workdir"] |
syncline=args+" "+kinfo["workdir"] |
| |
|
| log("running rsync : %s %s" % (syncoptions, syncline),kinfo) |
#logging now in runcmd |
| if os.system("%s %s > %s/%s/rsync.log 2>&1" % (syncoptions, syncline, logdir, kinfo["name"])): |
#log("running rsync : %s %s" % (syncoptions, syncline),kinfo) |
| deathbyerror("%s : sync failed, tried %s. See log for details." % (kinfo["name"], syncline) ) |
if runcmd("%s %s" % (syncoptions, syncline), kinfo, "%s/%s/rsync.log" % (logdir, kinfo["name"])): |
| |
raise BuildError("sync failed, tried %s. See log for details." % syncline) |
| # Gerk comment: |
|
| # This above might cause problems ... it (I think) relies on anything coming from stderr to tell |
|
| # if it has in fact died... we should test this out. If this is the case me might need to make |
|
| # a stub of some sorts to handle the build/error return process... |
|
| |
|
| |
|
| def get_wget(kinfo): |
def get_wget(kinfo): |
| #needs work |
#needs work |
| log("fetching source archive " % args,kinfo) |
log("fetching source archive " % args,kinfo) |
| mysourcefile="%s/%s.tar.bz2" % (kinfo["workdir"],kinfo["name"]) |
mysourcefile="%s/%s.tar.bz2" % (kinfo["workdir"],kinfo["name"]) |
| |
|
| if os.system("wget --quiet --output-document=%s %s/configs/%s" % (myconfigfile,msite,kinfo["name"])): |
if runcmd("wget --quiet --output-document=%s %s/configs/%s" % (myconfigfile,msite,kinfo["name"]), kinfo): |
| deathbyerror("%s : unable to download configfile, aborting." % (kinfo["name"])) |
raise BuildError("unable to download configfile, aborting.") |
| |
|
| log("decompressing source file",kinfo) |
log("decompressing source file",kinfo) |
| if os.system("tar xjf " % (myconfigfile,msite,kinfo["name"])): |
if runcmd("tar xjf " % (myconfigfile,msite,kinfo["name"]), kinfo): |
| deathbyerror("%s : unable to decompress source file, aborting." % (kinfo["name"])) |
raise BuildError("unable to decompress source file, aborting.") |
| |
|
| def get_vanilla(kinfo): |
def get_vanilla(kinfo): |
| args=mastertrees[kinfo["mastertree"]]["args"] |
args=mastertrees[kinfo["mastertree"]]["args"] |
| log("fetching source archive %s" % args) |
log("fetching source archive %s" % args) |
| mysourcefile="%s/%s.tar.bz2" % (workdir,kinfo["name"]) |
mysourcefile="%s/%s.tar.bz2" % (workdir,kinfo["name"]) |
| |
|
| if os.system("wget -c --output-document=%s %s" % (mysourcefile,args)): |
if runcmd("wget -c --output-document=%s %s" % (mysourcefile,args), kinfo): |
| deathbyerror("%s : unable to download source file %s, aborting." % (kinfo["name"], args)) |
raise BuildError("unable to download source file %s, aborting." % args) |
| |
|
| log("decompressing source file %s" % mysourcefile,kinfo) |
log("decompressing source file %s" % mysourcefile,kinfo) |
| |
|
| trash=pfd.read(4096) |
trash=pfd.read(4096) |
| |
|
| if pfd.close(): |
if pfd.close(): |
| deathbyerror("%s : unable to decompress source file, aborting." % (kinfo["name"])) |
raise BuildError("unable to decompress source file, aborting.") |
| |
|
| fnames=split(data) |
fnames=split(data) |
| name=fnames[0] |
name=fnames[0] |
| |
|
| os.system("rm -rf %s" % kinfo["workdir"]) |
runcmd("rm -rf %s" % kinfo["workdir"], kinfo) |
| move(work + "/" + dirname, kinfo["workdir"]) |
move(work + "/" + dirname, kinfo["workdir"]) |
| |
|
| #restore the previous working ectory |
#restore the previous working ectory |
| mypatchfile="%s/%s/%s.patch" % (patchdir,kinfo["name"],patch) |
mypatchfile="%s/%s/%s.patch" % (patchdir,kinfo["name"],patch) |
| |
|
| # download pathfile or bail |
# download pathfile or bail |
| if os.system("wget --quiet --output-document=%s %s/patches/%s/%s" % (mypatchfile,msite,kinfo["name"],patch)): |
if runcmd("wget --quiet --output-document=%s %s/patches/%s/%s" % (mypatchfile,msite,kinfo["name"],patch), kinfo): |
| deathbyerror("%s : unable to download patchfile %s, aborting." % (kinfo["name"],patch)) |
raise BuildError("unable to download patchfile %s, aborting." % patch) |
| |
|
| # we have a patch file, apply it or bail |
# we have a patch file, apply it or bail |
| log("perfoming patch with %s" % patch,kinfo) |
log("perfoming patch with %s" % patch,kinfo) |
| patchcommand="patch -p1 < %s > %s/%s/patch-%s.log 2>&1" % (mypatchfile,logdir,kinfo["name"],patch) |
|
| log("using %s from %s" % (patchcommand,kinfo["workdir"]),kinfo) |
# former patchcommand was: |
| |
#patchcommand="patch -p1 < %s > %s/%s/patch-%s.log 2>&1" % (mypatchfile,logdir,kinfo["name"],patch) |
| |
#log("using %s from %s" % (patchcommand,kinfo["workdir"]),kinfo) |
| |
|
| chdir(kinfo["workdir"],kinfo) |
chdir(kinfo["workdir"],kinfo) |
| if os.system(patchcommand): |
if runcmd("patch -p1", kinfo, "%s/%s/patch-%s.log" % (logdir,kinfo["name"],patch), False, mypatchfile): |
| deathbyerror("%s : patchfile %s failed, aborting. See patch log for details." % (kinfo["name"],patch)) |
raise BuildError("patchfile %s failed, aborting. See patch log for details." % patch) |
| else: |
else: |
| log("no patchfiles, continuing",kinfo) |
log("no patchfiles, continuing",kinfo) |
| |
|
| def krn_config(kinfo): |
def krn_config(kinfo): |
| """method to fetch and place config file for running kernel build""" |
"""method to fetch and place config file for running kernel build""" |
| |
|
| if kinfo["config"]==1: |
if kinfo["configpath"]: |
| |
log("using config file %s" % kinfo["configpath"],kinfo) |
| |
myconfigfile="%s/%s" % (kinfo["workdir"],kinfo["configpath"]) |
| |
|
| |
log("copying config file to %s/.config" % kinfo["workdir"],kinfo) |
| |
copy(verifyfile(myconfigfile,kinfo),"%s/.config" % kinfo["workdir"]) |
| |
|
| |
elif kinfo["config"]==1: |
| log("fetching config file",kinfo) |
log("fetching config file",kinfo) |
| myconfigfile="%s/%s.config" % (configdir,kinfo["name"]) |
myconfigfile="%s/%s.config" % (configdir,kinfo["name"]) |
| |
|
| if os.system("wget --quiet --output-document=%s %s/configs/%s" % (myconfigfile,msite,kinfo["name"])): |
if runcmd("wget --quiet --output-document=%s %s/configs/%s" % (myconfigfile,msite,kinfo["name"]), kinfo): |
| deathbyerror("%s : unable to download configfile, aborting." % (kinfo["name"])) |
raise BuildError("unable to download configfile, aborting.") |
| |
|
| log("copying config file to %s/.config" % kinfo["workdir"],kinfo) |
log("copying config file to %s/.config" % kinfo["workdir"],kinfo) |
| copy(verifyfile(myconfigfile,kinfo),"%s/.config" % kinfo["workdir"]) |
copy(verifyfile(myconfigfile,kinfo),"%s/.config" % kinfo["workdir"]) |
| def gkb_runmake(command, kinfo, premake, makeopts): |
def gkb_runmake(command, kinfo, premake, makeopts): |
| """Supporting method for build() ... a stub to run a make target and auto log it, given make target (command) and name (kernel name)""" |
"""Supporting method for build() ... a stub to run a make target and auto log it, given make target (command) and name (kernel name)""" |
| log("running make %s" % command,kinfo) |
log("running make %s" % command,kinfo) |
| if os.system("%s make %s %s > %s/%s/make-%s.log 2>&1" % (premake, makeopts, command, logdir, kinfo["name"], command)): |
|
| deathbyerror("%s : unable to run make %s, aborting." % (kinfo["name"],command)) |
# check to see if we need to run a simple make |
| |
# for some reason 2.2 kernels can't handle premake, makeopts, etc. |
| |
localversion = krn_localversion(kinfo) |
| |
|
| |
if (string.find(localversion,"2.2") == 0): |
| |
if runcmd("%s make %s" % (premake,command), kinfo, "%s/%s/make-%s.log" % (logdir, kinfo["name"], command)): |
| |
raise BuildError("unable to run make %s, aborting." % command) |
| |
else: |
| |
if runcmd("%s make %s %s" % (premake, makeopts, command), kinfo, "%s/%s/make-%s.log" % (logdir, kinfo["name"], command)): |
| |
raise BuildError("unable to run make %s, aborting." % command) |
| |
|
| def gkb_parsexml(name): |
def gkb_parsexml(name): |
| """parse the xml build file into mastertrees and builds""" |
"""parse the xml build file into mastertrees and builds""" |
| p.StartElementHandler = start_element |
p.StartElementHandler = start_element |
| p.ParseFile(open(name)) |
p.ParseFile(open(name)) |
| |
|
| def krn_upload(file, version, kinfo): |
def krn_upload(file, type, version, kinfo): |
| """upload the indicated file to the distribution site (kernel archives)""" |
"""upload the indicated file to the distribution site (kernel archives)""" |
| forms = ParseResponse(urlopen(msite+"/fileupload.html")) |
|
| |
if type=="kernel": |
| |
log("uploading kernel version "+version+" to "+msite,kinfo) |
| |
elif type=="source": |
| |
log("uploading source "+kinfo["mastertree"]+" to "+msite,kinfo) |
| |
else: |
| |
raise BuildException, "invalid file upload type: " + type |
| |
|
| |
forms = ParseResponse(urlopen(msite+"/upload.html")) |
| form = forms[0] |
form = forms[0] |
| |
|
| form["host"] = host |
form["host"] = host |
| form["pass"] = passwd |
form["pass"] = passwd |
| |
form["type"] = type |
| |
form["tree"] = kinfo["mastertree"] |
| form["build"] = kinfo["name"] |
form["build"] = kinfo["name"] |
| form["version"] = version |
form["version"] = version |
| |
|
| form.add_file(open(file), None, os.path.basename(file)) |
form.add_file(open(file), "application/x-bzip2", os.path.basename(file)) |
| |
|
| log("uploading kernel version "+version+" to "+msite,kinfo) |
|
| # form.click() returns a urllib2.Request object |
# form.click() returns a urllib2.Request object |
| # (see HTMLForm.click.__doc__ if you don't have urllib2) |
# (see HTMLForm.click.__doc__ if you don't have urllib2) |
| response2 = urlopen(form.click("cmd")) |
response = urlopen(form.click("cmd")) |
| |
|
| |
if debug: |
| |
print response.geturl() |
| |
print response.info() # headers |
| |
print response.read() # body |
| |
|
| #print response2.geturl() |
log(" \_ response: " + response.read(),kinfo) |
| #print response2.info() # headers |
|
| #print response2.read() # body |
|
| log("response: " + response2.read(),kinfo) |
|
| |
|
| response2.close() |
response.close() |
| |
|
| def main(): |
def main(): |
| """ main program gets executed here """ |
""" main program gets executed here """ |
| today=getoutput("date +%D") |
today=getoutput("date +%D") |
| buildtime=getoutput("date +'%R:%S %Z'") |
buildtime=getoutput("date +'%R:%S %Z'") |
| |
|
| print "GKB started %s %s" % (today,buildtime) |
print "GNU Kernel Builder started %s %s" % (today,buildtime) |
| |
|
| # verify the existence important directories, and create if necessary |
# verify the existence important directories, and create if necessary |
| verifydir(logdir) |
verifydir(logdir) |
| verifydir("%s/work" % buildroot) # build dir, make sure it exists |
verifydir("%s/work" % buildroot) # build dir, make sure it exists |
| |
|
| # download the build jobs from the master site |
# download the build jobs from the master site |
| if os.system("wget --quiet --output-document=gkb.xml \"%s/manager.php?cmd=getjobs&host=%s&pass=%s\"" % (msite,host,passwd)): |
log("fetching build jobs from master site") |
| deathbyerror("Unable to download build config from master site %s, aborting." % msite) |
if runcmd("wget --quiet --output-document=gkb.xml \"%s/manager.php?cmd=getjobs&host=%s&pass=%s\"" % (msite,host,passwd)): |
| |
raise FatalError, "Unable to download build jobs from master site %s, aborting." % msite |
| |
|
| # sets up 'mastertrees' and 'builds' dicts |
# sets up 'mastertrees' and 'builds' dicts |
| gkb_parsexml('gkb.xml') |
gkb_parsexml('gkb.xml') |
| myworkdir="%s/%s" % (workdir,bdict["mastertree"]) |
myworkdir="%s/%s" % (workdir,bdict["mastertree"]) |
| bdict["workdir"]=myworkdir |
bdict["workdir"]=myworkdir |
| |
|
| |
try: |
| # for now just call the build |
# for now just call the build |
| gkb_build(root, bdict) |
gkb_build(root, bdict) |
| |
except BuildError, e: |
| |
log(e.message, bdict) |
| |
except KeyboardInterrupt, e: |
| |
log("Caught keyboard interrupt, exiting...") |
| |
break |
| |
|
| endtime=getoutput("date +'%R:%S %Z'") |
endtime=getoutput("date +'%R:%S %Z'") |
| |
|