diff options
Diffstat (limited to 'bitbake/lib/toaster/bldcollector')
-rw-r--r-- | bitbake/lib/toaster/bldcollector/__init__.py | 0 | ||||
-rw-r--r-- | bitbake/lib/toaster/bldcollector/admin.py | 33 | ||||
-rw-r--r-- | bitbake/lib/toaster/bldcollector/urls.py | 26 | ||||
-rw-r--r-- | bitbake/lib/toaster/bldcollector/views.py | 62 |
4 files changed, 121 insertions, 0 deletions
diff --git a/bitbake/lib/toaster/bldcollector/__init__.py b/bitbake/lib/toaster/bldcollector/__init__.py new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/bitbake/lib/toaster/bldcollector/__init__.py | |||
diff --git a/bitbake/lib/toaster/bldcollector/admin.py b/bitbake/lib/toaster/bldcollector/admin.py new file mode 100644 index 0000000000..c1f85d73d5 --- /dev/null +++ b/bitbake/lib/toaster/bldcollector/admin.py | |||
@@ -0,0 +1,33 @@ | |||
1 | from django.contrib import admin | ||
2 | from django.contrib.admin.filters import RelatedFieldListFilter | ||
3 | from orm.models import BitbakeVersion, Release, LayerSource, ToasterSetting | ||
4 | from django.forms.widgets import Textarea | ||
5 | from django import forms | ||
6 | import django.db.models as models | ||
7 | |||
8 | from django.contrib.admin import widgets, helpers | ||
9 | |||
10 | class LayerSourceAdmin(admin.ModelAdmin): | ||
11 | pass | ||
12 | |||
13 | class BitbakeVersionAdmin(admin.ModelAdmin): | ||
14 | |||
15 | # we override the formfield for db URLField because of broken URL validation | ||
16 | |||
17 | def formfield_for_dbfield(self, db_field, **kwargs): | ||
18 | if isinstance(db_field, models.fields.URLField): | ||
19 | return forms.fields.CharField() | ||
20 | return super(BitbakeVersionAdmin, self).formfield_for_dbfield(db_field, **kwargs) | ||
21 | |||
22 | |||
23 | |||
24 | class ReleaseAdmin(admin.ModelAdmin): | ||
25 | pass | ||
26 | |||
27 | class ToasterSettingAdmin(admin.ModelAdmin): | ||
28 | pass | ||
29 | |||
30 | admin.site.register(LayerSource, LayerSourceAdmin) | ||
31 | admin.site.register(BitbakeVersion, BitbakeVersionAdmin) | ||
32 | admin.site.register(Release, ReleaseAdmin) | ||
33 | admin.site.register(ToasterSetting, ToasterSettingAdmin) | ||
diff --git a/bitbake/lib/toaster/bldcollector/urls.py b/bitbake/lib/toaster/bldcollector/urls.py new file mode 100644 index 0000000000..144387b56a --- /dev/null +++ b/bitbake/lib/toaster/bldcollector/urls.py | |||
@@ -0,0 +1,26 @@ | |||
1 | # | ||
2 | # BitBake Toaster Implementation | ||
3 | # | ||
4 | # Copyright (C) 2014 Intel Corporation | ||
5 | # | ||
6 | # This program is free software; you can redistribute it and/or modify | ||
7 | # it under the terms of the GNU General Public License version 2 as | ||
8 | # published by the Free Software Foundation. | ||
9 | # | ||
10 | # This program is distributed in the hope that it will be useful, | ||
11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | # GNU General Public License for more details. | ||
14 | # | ||
15 | # You should have received a copy of the GNU General Public License along | ||
16 | # with this program; if not, write to the Free Software Foundation, Inc., | ||
17 | # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||
18 | |||
19 | |||
20 | from django.conf.urls import patterns, include, url | ||
21 | from django.views.generic import RedirectView | ||
22 | |||
23 | urlpatterns = patterns('bldcollector.views', | ||
24 | # landing point for pushing a bitbake_eventlog.json file to this toaster instace | ||
25 | url(r'^eventfile$', 'eventfile', name='eventfile'), | ||
26 | ) | ||
diff --git a/bitbake/lib/toaster/bldcollector/views.py b/bitbake/lib/toaster/bldcollector/views.py new file mode 100644 index 0000000000..f32fa4d225 --- /dev/null +++ b/bitbake/lib/toaster/bldcollector/views.py | |||
@@ -0,0 +1,62 @@ | |||
1 | # | ||
2 | # BitBake Toaster Implementation | ||
3 | # | ||
4 | # Copyright (C) 2014 Intel Corporation | ||
5 | # | ||
6 | # This program is free software; you can redistribute it and/or modify | ||
7 | # it under the terms of the GNU General Public License version 2 as | ||
8 | # published by the Free Software Foundation. | ||
9 | # | ||
10 | # This program is distributed in the hope that it will be useful, | ||
11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | # GNU General Public License for more details. | ||
14 | # | ||
15 | # You should have received a copy of the GNU General Public License along | ||
16 | # with this program; if not, write to the Free Software Foundation, Inc., | ||
17 | # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||
18 | |||
19 | from django.views.decorators.cache import cache_control | ||
20 | from django.core.urlresolvers import reverse | ||
21 | from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger | ||
22 | from django.http import HttpResponseBadRequest, HttpResponse | ||
23 | from django.utils import timezone | ||
24 | from django.utils.html import escape | ||
25 | from datetime import timedelta | ||
26 | from django.utils import formats | ||
27 | from toastergui.templatetags.projecttags import json as jsonfilter | ||
28 | import json | ||
29 | import os | ||
30 | import tempfile | ||
31 | import subprocess | ||
32 | import toastermain | ||
33 | from django.views.decorators.csrf import csrf_exempt | ||
34 | |||
35 | |||
36 | @csrf_exempt | ||
37 | def eventfile(request): | ||
38 | """ Receives a file by POST, and runs toaster-eventreply on this file """ | ||
39 | if request.method != "POST": | ||
40 | return HttpResponseBadRequest("This API only accepts POST requests. Post a file with:\n\ncurl -F eventlog=@bitbake_eventlog.json %s\n" % request.build_absolute_uri(reverse('eventfile')), content_type="text/plain;utf8") | ||
41 | |||
42 | # write temporary file | ||
43 | (handle, abstemppath) = tempfile.mkstemp(dir="/tmp/") | ||
44 | with os.fdopen(handle, "w") as tmpfile: | ||
45 | for chunk in request.FILES['eventlog'].chunks(): | ||
46 | tmpfile.write(chunk) | ||
47 | tmpfile.close() | ||
48 | |||
49 | # compute the path to "bitbake/bin/toaster-eventreplay" | ||
50 | from os.path import dirname as DN | ||
51 | import_script = os.path.join(DN(DN(DN(DN(os.path.abspath(__file__))))), "bin/toaster-eventreplay") | ||
52 | if not os.path.exists(import_script): | ||
53 | raise Exception("script missing %s" % import_script) | ||
54 | scriptenv = os.environ.copy() | ||
55 | scriptenv["DATABASE_URL"] = toastermain.settings.getDATABASE_URL() | ||
56 | |||
57 | # run the data loading process and return the results | ||
58 | importer = subprocess.Popen([import_script, abstemppath], stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=scriptenv) | ||
59 | (out, err) = importer.communicate() | ||
60 | if importer.returncode == 0: | ||
61 | os.remove(abstemppath) | ||
62 | return HttpResponse("== Retval %d\n== STDOUT\n%s\n\n== STDERR\n%s" % (importer.returncode, out, err), content_type="text/plain;utf8") | ||