classes/tinderclient.bbclass:
authorHolger Freyther <zecke@selfish.org>
Sun, 19 Feb 2006 17:28:55 +0000 (17:28 +0000)
committerOpenEmbedded Project <openembedded-devel@lists.openembedded.org>
Sun, 19 Feb 2006 17:28:55 +0000 (17:28 +0000)
    Begin of the rewrite to support the tbox3 protocol

classes/tinderclient.bbclass

index 290166b..a50cdda 100644 (file)
-def tinder_tz_offset(off):
-    # get the offset.n minutes Either it is a number like
-    # +200 or -300
-    try:
-        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
+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_send_http(d, log):
+    """
+    Send the log via HTTP...
+    """
+
+def tinder_time_string():
+    """
+    Return the time as GMT
+    """
+    return ""
+
+def tinder_format_http_post(d,log):
+    """
+    Format the Tinderbox HTTP post with the data needed
+    for the tinderbox to be happy.
+    """
+
     from bb import data
-    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)
+    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)
+    }
 
+    # the boundary we will need
+    boundary = "----------------------------------%d" % int(random.random()*1000000000000)
 
-    s = smtplib.SMTP()
-    s.connect()
-    s.sendmail(data.getVar('TINDER_FROM', da, True), [data.getVar('TINDER_MAILTO', da, True)], msg.as_string())
-    s.close()
+    # now format the body
+    body = tinder_form_data( boundary, variables, log )
 
-def tinder_send_http(da, header, 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.
+    """
     from bb import data
-    import httplib, urllib
-    cont = "\n%s\n%s" % ( header, log)
-    headers = {"Content-type": "multipart/form-data" }
+    import httplib
+
+    # get the body and type
+    content_type, body = tinder_format_http_post(d,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)
+
+    # 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()
 
-    conn = httplib.HTTPConnection(data.getVar('TINDER_HOST',da, True))
-    conn.request("POST", data.getVar('TINDER_URL',da,True), cont, headers)
-    conn.close() 
+    print body
+    print content_type
 
+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 )
+
+    # 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("== End Tinderbox Client Info" )
+
+    # now create the real output
+    return "\n".join(output) % vars()
 
-# Prepare tinderbox mail header
-def tinder_prepare_mail_header(da, status):
+
+def tinder_print_env():
+    """
+    Print the environment variables of this build
+    """
     from bb import data
+    import os
 
-    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()
+    time_end   = tinder_time_string()
 
-    return str
+    # build the environment
+    env = ""
+    for var in os.environ:
+        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
+    """
+
+    time_start = tinder_time_string()
+    config = tinder_print_info(d)
+    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( "<--- TINDERBOX FINISHED PRINTING CONFIGURATION %(time_end)s" )
+    return "\n".join(output) % vars()
 
 def tinder_do_tinder_report(event):
     """
@@ -77,28 +195,17 @@ def tinder_do_tinder_report(event):
     # variables
     name = getName(event)
     log  = ""
-    header = ""
-    verbose = data.getVar('TINDER_VERBOSE_REPORT', event.data, True) == "1"
+    logfile = None
 
     # Check what we need to do Build* shows we start or are done
     if name == "BuildStarted":
-        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 = ""
+        tinder_build_start(event.data)
+        log = tinder_tinder_start(event.data)
 
     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')
@@ -106,11 +213,9 @@ def tinder_do_tinder_report(event):
             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":
@@ -124,8 +229,6 @@ def tinder_do_tinder_report(event):
         if len(log_file) != 0:
             to_file  = data.getVar('TINDER_LOG', event.data, True)
             log_txt  = open(log_file[0], 'r').readlines()
-            to_file  = open(to_file, 'a')
-
             to_file.writelines(log_txt)
 
             # append to the log
@@ -134,17 +237,16 @@ def tinder_do_tinder_report(event):
                 for line in log_txt:
                     log += line
 
-    # now mail the log
-    if len(log) == 0 or len(header) == 0:
+    # now post the log
+    if len(log) == 0:
         return
 
-    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)
+    # 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, log)
 
 
+# we want to be an event handler
 addhandler tinderclient_eventhandler
 python tinderclient_eventhandler() {
     from bb import note, error, data