include sys/types.h in netfilter headers exported to userspace.
[vuplus_openembedded] / classes / oestats-client.bbclass
1 # Integration with the oestats build statistics server, see:
2 #
3 # http://opensource.bolloretelecom.eu/projects/oestats
4 #
5 # To make use of this class, add to your local.conf:
6 #
7 # INHERIT += "oestats-client"
8 # OESTATS_SERVER = "some.server.org"
9 # OESTATS_BUILDER = "some_nickname"
10
11 def oestats_setid(d, val):
12         import bb
13         f = file(bb.data.getVar('TMPDIR', d, True) + '/oestats.id', 'w')
14         f.write(val)
15
16 def oestats_getid(d):
17         import bb
18         f = file(bb.data.getVar('TMPDIR', d, True) + '/oestats.id', 'r')
19         return f.read()
20         
21 def oestats_send(server, action, vars = {}, files = {}):
22         import httplib
23
24         # build body
25         output = []
26         bound = '----------ThIs_Is_tHe_bouNdaRY_$'
27         for key in vars:
28                 assert vars[key]
29                 output.append('--' + bound)
30                 output.append('Content-Disposition: form-data; name="%s"' % key)
31                 output.append('')
32                 output.append(vars[key])
33         for key in files:
34                 assert files[key]
35                 output.append('--' + bound)
36                 output.append('Content-Disposition: form-data; name="%s"; filename="%s"' % (key, files[key]['filename']))
37                 output.append('Content-Type: %s' % files[key]['content-type'])
38                 
39                 output.append('')
40                 output.append(files[key]['content'])
41         output.append('--' + bound + '--')
42         output.append('')
43         body = "\r\n".join(output)
44
45         # build headers
46         headers = {
47                 "User-agent": "oestats-client/0.5",
48                 "Content-type": "multipart/form-data; boundary=%s" % bound,
49                 "Content-length": str(len(body))}
50
51         # send request
52         conn = httplib.HTTPConnection(server)
53         conn.request("POST", action, body, headers)
54         response = conn.getresponse()
55         data = response.read()
56         conn.close()
57         return data
58
59 def oestats_start(server, builder, d):
60         import bb
61         import os.path
62         import re
63
64         # send report
65         id = ""
66         try:
67                 data = oestats_send(server, "/builds/", {
68                         'builder': builder,
69                         'build_arch': bb.data.getVar('BUILD_ARCH', d, True),
70                         'metadata_branch': bb.data.getVar('METADATA_BRANCH', d, True),
71                         'metadata_revision': bb.data.getVar('METADATA_REVISION', d, True),
72                         'machine': bb.data.getVar('MACHINE', d, True),
73                         'distro': bb.data.getVar('DISTRO', d, True),
74                 })
75                 if re.match("^\d+$", data): id=data
76         except:
77                 pass
78
79         # save the build id
80         if id:
81                 bb.note("oestats: build %s" % id)
82         else:
83                 bb.note("oestats: error starting build, disabling stats")
84         oestats_setid(d, id)
85
86 def oestats_stop(server, d, failures):
87         import bb
88
89         # retrieve build id
90         id = oestats_getid(d)
91         if not id: return
92
93         # send report
94         if failures > 0:
95                 status = "Failed"
96         else:
97                 status = "Succeeded"                  
98
99         try:
100                 response = oestats_send(server, "/builds/%s/" % id, {
101                         'status': status,
102                 })
103         except:
104                 bb.note("oestats: error stopping build")
105
106 def oestats_task(server, d, task, status):
107         import bb
108         import glob
109         import time
110
111         # retrieve build id
112         id = oestats_getid(d)
113         if not id: return
114
115         # calculate build time
116         try:
117                 elapsed = time.time() - float(bb.data.getVar('OESTATS_STAMP', d, True))
118         except:
119                 elapsed = 0
120         
121         # prepare files
122         files = {}
123         if status == 'Failed':
124                 logs = glob.glob("%s/log.%s.*" % (bb.data.getVar('T', d, True), task))
125                 if len(logs) > 0:
126                         log = logs[0]
127                         bb.note("oestats: sending log file : %s" % log)
128                         files['log'] = {
129                                 'filename': 'log.txt',
130                                 'content': file(log).read(),
131                                 'content-type': 'text/plain'}
132         
133         # prepare report
134         vars = {
135                 'build': id,
136                 'package': bb.data.getVar('PN', d, True),
137                 'version': bb.data.getVar('PV', d, True),
138                 'revision': bb.data.getVar('PR', d, True),
139                 'depends': bb.data.getVar('DEPENDS', d, True),
140                 'task': task,
141                 'status': status,
142                 'time': str(elapsed)}
143         bug_number = bb.data.getVar('OESTATS_BUG_NUMBER', d, True)
144         bug_tracker = bb.data.getVar('OESTATS_BUG_TRACKER', d, True)
145         if bug_number and bug_tracker:
146                 vars['bug_number'] = bug_number
147                 vars['bug_tracker'] = bug_tracker
148
149         # send report
150         try:
151                 response = oestats_send(server, "/tasks/", vars, files)
152         except:
153                 bb.note("oestats: error sending task, disabling stats")
154                 oestats_setid(d, "")
155
156 addhandler oestats_eventhandler
157 python oestats_eventhandler () {
158         from bb.event import getName
159         import bb
160         import time
161
162         if e.data is None or getName(e) == "MsgNote":
163                 return NotHandled
164
165         server = bb.data.getVar('OESTATS_SERVER', e.data, True)
166         builder = bb.data.getVar('OESTATS_BUILDER', e.data, True)
167         if not server or not builder:
168                 return NotHandled
169
170         if getName(e) == 'BuildStarted':
171                 oestats_start(server, builder, e.data)
172         elif getName(e) == 'BuildCompleted':
173                 oestats_stop(server, e.data, e.getFailures())
174         elif getName(e) == 'TaskStarted':
175                 bb.data.setVar('OESTATS_STAMP', repr(time.time()), e.data)
176         elif getName(e) == 'TaskSucceeded':
177                 oestats_task(server, e.data, e.task, 'Succeeded')
178         elif getName(e) == 'TaskFailed':
179                 oestats_task(server, e.data, e.task, 'Failed')
180
181         return NotHandled
182 }