--def tinder_form_data(bound, dict, log):
-- """
-- Create the boundary for the HTTP Post
-- """
-- output = []
--
-- # for each key in the dictionary
-- for name in dict:
-- output.append( "--" + bound )
-- output.append( 'Content-Disposition: form-data; name="%s"' % name )
-- output.append( "" )
-- output.append( dict[name] )
-- if log:
-- output.append( "--" + bound )
-- output.append( 'Content-Disposition: form-data; name="log"; filename="log.txt"' )
-- output.append( '' )
-- output.append( log )
-- output.append( '--' + bound + '--' )
-- output.append( '' )
--
-- return "\r\n".join(output)
--
--def tinder_time_string():
-- """
-- Return the time as GMT
-- """
-- return ""
--
--def tinder_format_http_post(d,status,log):
-- """
-- Format the Tinderbox HTTP post with the data needed
-- for the tinderbox to be happy.
-- """
--
-- from bb import data
-- import os,random
--
-- # the variables we will need to send on this form post
-- variables = {
-- "tree" : data.getVar('TINDER_TREE', d, True),
-- "machine_name" : data.getVar('TINDER_MACHINE', d, True),
-- "os" : os.uname()[0],
-- "os_version" : os.uname()[2],
-- "compiler" : "gcc",
-- "clobber" : data.getVar('TINDER_CLOBBER', d, True)
-- }
--
-- # optionally add the status
-- if status:
-- variables["status"] = str(status)
--
-- # try to load the machine id
-- # we only need on build_status.pl but sending it
-- # always does not hurt
++def tinder_tz_offset(off):
++ # get the offset.n minutes Either it is a number like
++ # +200 or -300
try:
-- f = file(data.getVar('TMPDIR',d,True)+'/tinder-machine.id', 'r')
-- id = f.read()
-- variables['machine_id'] = id
-- except:
-- pass
--
-- # the boundary we will need
-- boundary = "----------------------------------%d" % int(random.random()*1000000000000)
--
-- # now format the body
-- body = tinder_form_data( boundary, variables, log )
--
-- return ("multipart/form-data; boundary=%s" % boundary),body
--
--
--def tinder_build_start(d):
-- """
-- Inform the tinderbox that a build is starting. We do this
-- by posting our name and tree to the build_start.pl script
-- on the server.
-- """
++ return int(off)
++ except ValueError:
++ if off == "Europe/Berlin":
++ return 120
++ else:
++ return 0
++
++def tinder_tinder_time(offset):
++ import datetime
++ td = datetime.timedelta(minutes=tinder_tz_offset(offset))
++ time = datetime.datetime.utcnow() + td
++ return time.strftime('%m/%d/%Y %H:%M:%S')
++
++def tinder_tinder_start(date,offset):
++ import datetime, time
++ td = datetime.timedelta(minutes=tinder_tz_offset(offset))
++ ti = time.strptime(date, "%m/%d/%Y %H:%M:%S")
++ time = datetime.datetime(*ti[0:7])+td
++ return time.strftime('%m/%d/%Y %H:%M:%S')
++
++def tinder_send_email(da, header, log):
++ import smtplib
from bb import data
-- import httplib
--
-- # get the body and type
-- content_type, body = tinder_format_http_post(d,None,None)
-- server = data.getVar('TINDER_HOST', d, True )
-- url = data.getVar('TINDER_URL', d, True )
--
-- selector = url + "/xml/build_start.pl"
--
- #print "selector %s and url %s" % (selector, url)
- print "selector %s and url %s" % (selector, url)
--
-- # now post it
-- h = httplib.HTTP(server)
-- h.putrequest('POST', selector)
-- h.putheader('content-type', content_type)
-- h.putheader('content-length', str(len(body)))
-- h.endheaders()
-- h.send(body)
-- errcode, errmsg, headers = h.getreply()
- #print errcode, errmsg, headers
- print errcode, errmsg, headers
-- report = h.file.read()
--
-- # now let us find the machine id that was assigned to us
-- search = "<machine id='"
-- report = report[report.find(search)+len(search):]
-- report = report[0:report.find("'")]
--
-- import bb
-- bb.note("Machine ID assigned by tinderbox: %s" % report )
++ from email.MIMEText import MIMEText
++ msg = MIMEText(header +'\n' + log)
++ msg['Subject'] = data.getVar('TINDER_SUBJECT',da, True) or "Tinder-Client build log"
++ msg['To'] = data.getVar('TINDER_MAILTO' ,da, True)
++ msg['From'] = data.getVar('TINDER_FROM', da, True)
-- # now we will need to save the machine number
-- # we will override any previous numbers
-- f = file(data.getVar('TMPDIR', d, True)+"/tinder-machine.id", 'w')
-- f.write(report)
++ s = smtplib.SMTP()
++ s.connect()
++ s.sendmail(data.getVar('TINDER_FROM', da, True), [data.getVar('TINDER_MAILTO', da, True)], msg.as_string())
++ s.close()
--def tinder_send_http(d, status, log):
-- """
-- Send this log as build status
-- """
++def tinder_send_http(da, header, log):
from bb import data
-- import httplib
--
--
-- # get the body and type
-- content_type, body = tinder_format_http_post(d,status,log)
-- server = data.getVar('TINDER_HOST', d, True )
-- url = data.getVar('TINDER_URL', d, True )
--
-- selector = url + "/xml/build_status.pl"
--
-- # now post it
-- h = httplib.HTTP(server)
-- h.putrequest('POST', selector)
-- h.putheader('content-type', content_type)
-- h.putheader('content-length', str(len(body)))
-- h.endheaders()
-- h.send(body)
-- errcode, errmsg, headers = h.getreply()
-- print errcode, errmsg, headers
- print h.file.read()
--
++ import httplib, urllib
++ cont = "\n%s\n%s" % ( header, log)
++ headers = {"Content-type": "multipart/form-data" }
--def tinder_print_info(d):
-- """
-- Print the TinderBox Info
-- Including informations of the BaseSystem and the Tree
-- we use.
-- """
--
-- from bb import data
-- import os
-- # get the local vars
--
-- time = tinder_time_string()
-- ops = os.uname()[0]
-- version = os.uname()[2]
-- url = data.getVar( 'TINDER_URL' , d, True )
-- tree = data.getVar( 'TINDER_TREE', d, True )
-- branch = data.getVar( 'TINDER_BRANCH', d, True )
-- srcdate = data.getVar( 'SRCDATE', d, True )
-- machine = data.getVar( 'MACHINE', d, True )
-- distro = data.getVar( 'DISTRO', d, True )
-- bbfiles = data.getVar( 'BBFILES', d, True )
-- tarch = data.getVar( 'TARGET_ARCH', d, True )
-- fpu = data.getVar( 'TARGET_FPU', d, True )
- oerev = data.getVar( 'OE_REVISION', d, True ) or "unknown"
++ conn = httplib.HTTPConnection(data.getVar('TINDER_HOST',da, True))
++ conn.request("POST", data.getVar('TINDER_URL',da,True), cont, headers)
++ conn.close()
-- # there is a bug with tipple quoted strings
-- # i will work around but will fix the original
-- # bug as well
-- output = []
-- output.append("== Tinderbox Info" )
-- output.append("Time: %(time)s" )
-- output.append("OS: %(ops)s" )
-- output.append("%(version)s" )
-- output.append("Compiler: gcc" )
-- output.append("Tinderbox Client: 0.1" )
-- output.append("Tinderbox Client Last Modified: yesterday" )
-- output.append("Tinderbox Protocol: 0.1" )
-- output.append("URL: %(url)s" )
-- output.append("Tree: %(tree)s" )
-- output.append("Config:" )
-- output.append("branch = '%(branch)s'" )
-- output.append("TARGET_ARCH = '%(tarch)s'" )
-- output.append("TARGET_FPU = '%(fpu)s'" )
-- output.append("SRCDATE = '%(srcdate)s'" )
-- output.append("MACHINE = '%(machine)s'" )
-- output.append("DISTRO = '%(distro)s'" )
-- output.append("BBFILES = '%(bbfiles)s'" )
- output.append("OE_REVISION = '%(oerev)s'" )
-- output.append("== End Tinderbox Client Info" )
-- # now create the real output
-- return "\n".join(output) % vars()
--
--
--def tinder_print_env():
-- """
-- Print the environment variables of this build
-- """
++# Prepare tinderbox mail header
++def tinder_prepare_mail_header(da, status):
from bb import data
-- import os
--
-- time_start = tinder_time_string()
-- time_end = tinder_time_string()
--
-- # build the environment
-- env = ""
-- for var in os.environ:
- print var, os.environ[var]
- env += "%s=%s\n" % (var, os.environ[var] or "")
- env += "%s=%s\n" % (var, os.environ[var])
--
-- output = []
-- output.append( "---> TINDERBOX RUNNING env %(time_start)s" )
-- output.append( env )
-- output.append( "<--- TINDERBOX FINISHED (SUCCESS) %(time_end)s" )
-- return "\n".join(output) % vars()
--
--def tinder_tinder_start(d):
-- """
-- PRINT the configuration of this build
-- """
++ str = "tinderbox: administrator: %s\n" % data.getVar('TINDER_ADMIN', da, True)
++ str += "tinderbox: starttime: %s\n" % tinder_tinder_start(data.getVar('TINDER_START', da, True) or data.getVar('BUILDSTART', da, True), data.getVar('TINDER_TZ', da, True))
++ str += "tinderbox: buildname: %s\n" % data.getVar('TINDER_BUILD', da, True)
++ str += "tinderbox: errorparser: %s\n" % data.getVar('TINDER_ERROR', da, True)
++ str += "tinderbox: status: %s\n" % status
++ str += "tinderbox: timenow: %s\n" % tinder_tinder_time(data.getVar('TINDER_TZ', da, True))
++ str += "tinderbox: tree: %s\n" % data.getVar('TINDER_TREE', da, True)
++ str += "tinderbox: buildfamily: %s\n" % "unix"
++ str += "tinderbox: END"
-- time_start = tinder_time_string()
-- config = tinder_print_info(d)
- #env = tinder_print_env()
- env = tinder_print_env()
-- time_end = tinder_time_string()
--
-- output = []
-- output.append( "---> TINDERBOX PRINTING CONFIGURATION %(time_start)s" )
-- output.append( config )
- #output.append( env )
- output.append( env )
-- output.append( "<--- TINDERBOX FINISHED PRINTING CONFIGURATION %(time_end)s" )
- output.append( "" )
-- return "\n".join(output) % vars()
++ return str
def tinder_do_tinder_report(event):
"""
-- Report to the tinderbox:
-- On the BuildStart we will inform the box directly
-- On the other events we will write to the TINDER_LOG and
-- when the Task is finished we will send the report.
--
-- The above is not yet fully implemented. Currently we send
-- information immediately. The caching/queuing needs to be
-- implemented. Also sending more or less information is not
-- implemented yet.
++ Report to the tinderbox. Either we will report every step
++ (depending on TINDER_VERBOSE_REPORT) at the end we will send the
++ tinderclient.log
"""
from bb.event import getName
from bb import data, mkdirhier
# variables
name = getName(event)
log = ""
-- status = 1
++ header = ""
++ verbose = data.getVar('TINDER_VERBOSE_REPORT', event.data, True) == "1"
# Check what we need to do Build* shows we start or are done
if name == "BuildStarted":
-- tinder_build_start(event.data)
-- log = tinder_tinder_start(event.data)
--
-- try:
-- # truncate the tinder log file
-- f = file(data.getVar('TINDER_LOG', event.data, True), 'rw+')
-- f.truncate(0)
-- f.close()
-- except IOError:
-- pass
--
-- # Append the Task-Log (compile,configure...) to the log file
-- # we will send to the server
++ header = tinder_prepare_mail_header(event.data, 'building')
++ # generate
++ for var in os.environ:
++ log += "%s=%s\n" % (var, os.environ[var])
++
++ mkdirhier(data.getVar('TMPDIR', event.data, True))
++ file = open(data.getVar('TINDER_LOG', event.data, True), 'w')
++ file.write(log)
++
++ if not verbose:
++ header = ""
++
++ if name == "PkgFailed" or name == "BuildCompleted":
++ status = 'build_failed'
++ if name == "BuildCompleted":
++ status = "success"
++ header = tinder_prepare_mail_header(event.data, status)
++ # append the log
++ log_file = data.getVar('TINDER_LOG', event.data, True)
++ file = open(log_file, 'r')
++ for line in file.readlines():
++ log += line
++
++ if verbose and name == "TaskStarted":
++ header = tinder_prepare_mail_header(event.data, 'building')
++ log = "Task %s started" % event.task
++
++ if verbose and name == "PkgStarted":
++ header = tinder_prepare_mail_header(event.data, 'building')
++ log = "Package %s started" % data.getVar('P', event.data, True)
++
++ if verbose and name == "PkgSucceeded":
++ header = tinder_prepare_mail_header(event.data, 'building')
++ log = "Package %s done" % data.getVar('P', event.data, True)
++
++ # Append the Task Log
if name == "TaskSucceeded" or name == "TaskFailed":
log_file = glob.glob("%s/log.%s.*" % (data.getVar('T', event.data, True), event.task))
if len(log_file) != 0:
- log = "\n".join( open(log_file[0], 'r').readlines() )
+ to_file = data.getVar('TINDER_LOG', event.data, True)
- log = open(log_file[0], 'r').readlines()
++ log_txt = open(log_file[0], 'r').readlines()
++ to_file = open(to_file, 'a')
++
++ to_file.writelines(log_txt)
-- # set the right 'HEADER'/Summary for the TinderBox
-- if name == "TaskStarted":
- log += "---> TINDERBOX Task %s started\n" % event.task
- log += "--> TINDERBOX Task %s started" % event.task
-- elif name == "TaskSucceeded":
- log += "<--- TINDERBOX Task %s done (SUCCESS)\n" % event.task
- log += "<-- TINDERBOX Task %s done (SUCCESS)" % event.task
-- elif name == "TaskFailed":
- log += "<--- TINDERBOX Task %s failed (FAILURE)\n" % event.task
- log += "<-- TINDERBOX Task %s failed (FAILURE)" % event.task
-- elif name == "PkgStarted":
- log += "---> TINDERBOX Package %s started\n" % data.getVar('P', event.data, True)
- log += "--> TINDERBOX Package %s started" % data.getVar('P', event.data, True)
-- elif name == "PkgSucceeded":
- log += "<--- TINDERBOX Package %s done (SUCCESS)\n" % data.getVar('P', event.data, True)
- log += "<-- TINDERBOX Package %s done (SUCCESS)" % data.getVar('P', event.data, True)
-- elif name == "PkgFailed":
- log += "<--- TINDERBOX Package %s failed (FAILURE)\n" % data.getVar('P', event.data, True)
- log += "<-- TINDERBOX Package %s failed (FAILURE)" % data.getVar('P', event.data, True)
-- status = 200
-- elif name == "BuildCompleted":
-- status = 100
++ # append to the log
++ if verbose:
++ header = tinder_prepare_mail_header(event.data, 'building')
++ for line in log_txt:
++ log += line
-- # now post the log
-- if len(log) == 0:
++ # now mail the log
++ if len(log) == 0 or len(header) == 0:
return
-- # for now we will use the http post method as it is the only one
-- log_post_method = tinder_send_http
-- log_post_method(event.data, status, log)
++ log_post_method = tinder_send_email
++ if data.getVar('TINDER_SENDLOG', event.data, True) == "http":
++ log_post_method = tinder_send_http
++
++ log_post_method(event.data, header, log)
--# we want to be an event handler
addhandler tinderclient_eventhandler
python tinderclient_eventhandler() {
from bb import note, error, data