[OE-core] [WIP][PATCH] report-error: Allow to upload reports automatically
Martin Jansa
martin.jansa at gmail.com
Fri Mar 14 18:15:50 UTC 2014
* useful when distro wants to collect build statistics from
all users/developers without any manual interaction from them
Signed-off-by: Martin Jansa <Martin.Jansa at gmail.com>
---
meta/classes/report-error.bbclass | 85 +++++++++++++++++++++++++++++++++++-
meta/conf/local.conf.sample.extended | 20 +++++++++
2 files changed, 103 insertions(+), 2 deletions(-)
diff --git a/meta/classes/report-error.bbclass b/meta/classes/report-error.bbclass
index 479b38d..0a53a60 100644
--- a/meta/classes/report-error.bbclass
+++ b/meta/classes/report-error.bbclass
@@ -7,6 +7,12 @@
# Licensed under the MIT license, see COPYING.MIT for details
ERR_REPORT_DIR ?= "${LOG_DIR}/error-report"
+ERR_REPORT_PORT ?= "80"
+
+ERR_REPORT_UPLOAD_FAILURES[type] = "boolean"
+ERR_REPORT_UPLOAD_FAILURES ?= "0"
+ERR_REPORT_UPLOAD_ALL[type] = "boolean"
+ERR_REPORT_UPLOAD_ALL ?= "0"
def errorreport_getdata(e):
logpath = e.data.getVar('ERR_REPORT_DIR', True)
@@ -24,6 +30,77 @@ def errorreport_savedata(e, newdata, file):
json.dump(newdata, f, indent=4, sort_keys=True)
return datafile
+# from scripts/send-error-report to automate report submissions
+def errorreport_senddata(e, json_file):
+ import httplib, urllib, os, sys, json, subprocess
+
+ if os.path.isfile(json_file):
+ username = e.data.getVar('ERR_REPORT_USERNAME', True)
+ email = e.data.getVar('ERR_REPORT_EMAIL', True)
+ server = e.data.getVar('ERR_REPORT_SERVER', True)
+ port = e.data.getVar('ERR_REPORT_PORT', True)
+
+ if not username or email:
+ # try to read them from git config
+ username = subprocess.check_output(['git', 'config', '--get', 'user.name']).strip()
+ email = subprocess.check_output(['git', 'config', '--get', 'user.email']).strip()
+
+ if not username or not server:
+ 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): ")
+ server = raw_input("Server: ")
+ port = raw_input("Port: ")
+ if len(username) > 0 and len(username) < 50:
+ with open(userfile, "w") as g:
+ g.write(username + "\n")
+ g.write(email + "\n")
+ g.write(server + "\n")
+ g.write(port + "\n")
+ else:
+ print("Invalid inputs, try again.")
+ return
+
+ bb.note("Uploading the report to %s:%s" % (server, port))
+
+ 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")
+ return
+
+ try:
+ params = urllib.urlencode({'data': data})
+ headers = {"Content-type": "application/json"}
+ conn = httplib.HTTPConnection(server, port)
+ conn.request("POST", "/ClientPost/", params, headers)
+ 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")
+ conn.close()
+ except:
+ print("Server connection failed")
+
+ else:
+ print("No data file found.")
+
python errorreport_handler () {
import json
@@ -55,11 +132,15 @@ python errorreport_handler () {
elif isinstance(e, bb.event.BuildCompleted):
jsondata = json.loads(errorreport_getdata(e))
+ upload_failures = oe.data.typed_value('ERR_REPORT_UPLOAD_FAILURES', e.data)
+ upload_all = oe.data.typed_value('ERR_REPORT_UPLOAD_ALL', e.data)
failures = jsondata['failures']
- if(len(failures) > 0):
+ if len(failures) > 0 or upload_all:
filename = "error_report_" + e.data.getVar("BUILDNAME")+".txt"
datafile = errorreport_savedata(e, jsondata, filename)
- bb.note("The errors of this build are stored in: %s. You can send the errors to an upstream server by running: send-error-report %s [server]" % (datafile, datafile))
+ bb.note("The report of this build are stored in: %s." % (datafile))
+ if upload_all or (len(failures) > 0 and upload_failures):
+ errorreport_senddata(e, datafile)
}
addhandler errorreport_handler
diff --git a/meta/conf/local.conf.sample.extended b/meta/conf/local.conf.sample.extended
index 5f10886..14d39e2 100644
--- a/meta/conf/local.conf.sample.extended
+++ b/meta/conf/local.conf.sample.extended
@@ -304,3 +304,23 @@
#INITRAMFS_IMAGE = "core-image-minimal-initramfs"
#INITRAMFS_IMAGE_BUNDLE = "1"
+#
+# Uploading reports with report-error.bbclass
+#
+# Allow to automatically upload the reports without developer calling extra script to upload them.
+#
+# ERR_REPORT_SERVER = "caprica.palm.com"
+# ERR_REPORT_PORT = "8000"
+#
+# Username if you don't want to use "git config --get user.name"
+# ERR_REPORT_USERNAME = "Tester"
+# E-mail if you don't want to use "git config --get user.email"
+# ERR_REPORT_EMAIL = "tester at test.ltd"
+#
+# Upload reports from failed builds
+# ERR_REPORT_UPLOAD_FAILURES = "1"
+#
+# Upload reports from all builds, not only those with failures
+# ERR_REPORT_UPLOAD_ALL = "1"
+#
+# INHERIT += "report-error"
--
1.9.0
More information about the Openembedded-core
mailing list