poky/scripts/send-error-report
Richard Purdie e2cffc00e1 scripts/send-error-report: Set exit code if error occurs
If an error occurs, set an error exit code so the world knows about it. This fixes
issues where the autobuilder doesn't notice these failures.

[YOCTO #7265]

(From OE-Core rev: b219377defc9517af360986352bd7da1a7906f10)

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
2015-01-29 15:36:52 +00:00

4.1 KiB
Executable File

#!/usr/bin/env python

Sends an error report (if the report-error class was enabled) to a remote server.

Copyright (C) 2013 Intel Corporation

Author: Andreea Proca andreea.b.proca@intel.com

import httplib, urllib, os, sys, json, base64 from urllib2 import _parse_proxy as parseproxy

def handle_connection(server, data): params = urllib.urlencode({'data': data}) headers = {"Content-type": "application/json"} proxyrequired = False if os.environ.get("http_proxy") or os.environ.get("HTTP_PROXY"): proxyrequired = True # we need to check that the server isn't a local one, as in no_proxy try: temp = httplib.HTTPConnection(server, strict=True, timeout=5) temp.request("GET", "/Errors/") tempres = temp.getresponse() if tempres.status == 200: proxyrequired = False temp.close() except: pass

if proxyrequired:
    proxy = parseproxy(os.environ.get("http_proxy") or os.environ.get("HTTP_PROXY"))
    if proxy[1] and proxy[2]:
        auth = base64.encodestring("%s:%s" % (proxy[1], proxy[2]))
        headers["Authorization"] = "Basic %s" % auth
    conn = httplib.HTTPConnection(proxy[3])
    conn.request("POST", "http://%s/ClientPost/" % server, params, headers)
else:
    conn = httplib.HTTPConnection(server)
    conn.request("POST", "/ClientPost/", params, headers)

return conn

def sendData(json_file, server):

if os.path.isfile(json_file):

    home = os.path.expanduser("~")
    userfile = os.path.join(home, ".oe-send-error")
    if os.path.isfile(userfile):
        with open(userfile) as g:
            username = g.readline()
            email = g.readline()
    else:
        print("Please enter your name and your email (optionally), they'll be saved in the file you send.")
        username = raw_input("Name: ")
        email = raw_input("E-mail (not required): ")
        if len(username) > 0 and len(username) < 50:
            with open(userfile, "w") as g:
                g.write(username + "\n")
                g.write(email + "\n")
        else:
            print("Invalid inputs, try again.")
            sys.exit(1)
            return

    with open(json_file) as f:
        data = f.read()

    try:
        jsondata = json.loads(data)
        jsondata['username'] = username.strip()
        jsondata['email'] = email.strip()
        data = json.dumps(jsondata, indent=4, sort_keys=True)
    except:
        print("Invalid json data")
        sys.exit(1)
        return

    try:
        conn = handle_connection(server, data)
        response = conn.getresponse()
        print response.status, response.reason
        res = response.read()
        if response.status == 200:
            print(res)
        else:
            print("There was a problem submiting your data, response written in %s.response.html" % json_file)
            with open("%s.response.html" % json_file, "w") as f:
                f.write(res)
            sys.exit(1)
        conn.close()
    except Exception as e:
            print("Server connection failed: %s" % e)
            sys.exit(1)
else:
    print("No data file found.")
    sys.exit(1)

if name == 'main': print ("\nSends an error report (if the report-error class was enabled) to a remote server.") print("\nThis scripts sends the contents of the error to a public upstream server.") print("\nPlease remove any identifying information before sending.") if len(sys.argv) < 2: print("\nUsage: send-error-report <error_fileName> [server]") print("\nIf this is the first when sending a report you'll be asked for your name and optionally your email address.") print("They will be associated with your report.\n")

elif len(sys.argv) == 3:
    sendData(sys.argv[1], sys.argv[2])
else:
    sendData(sys.argv[1], "errors.yoctoproject.org")