| 1 | import re |
|---|
| 2 | from django.http import HttpResponseRedirect, HttpResponse, Http404 |
|---|
| 3 | from django.shortcuts import render_to_response, get_object_or_404 |
|---|
| 4 | from django.core.servers.basehttp import FileWrapper |
|---|
| 5 | from forms import UploadFileForm |
|---|
| 6 | from pxe.common import * |
|---|
| 7 | from tester.models import * |
|---|
| 8 | |
|---|
| 9 | def upload_file(request, logid): |
|---|
| 10 | print 'upload_file', logid |
|---|
| 11 | if request.method == 'POST': |
|---|
| 12 | form = UploadFileForm(request.POST, request.FILES) |
|---|
| 13 | mac = get_mac(request) |
|---|
| 14 | s = get_object_or_404(System, macaddress__mac=simplify_mac(mac)) |
|---|
| 15 | log = get_object_or_404(TestLog, id=logid) |
|---|
| 16 | if form.is_valid(): |
|---|
| 17 | log.status = 'D' |
|---|
| 18 | log.save() |
|---|
| 19 | print 'valid', log.status |
|---|
| 20 | handle_uploaded_file(request.FILES['file'], log.id) |
|---|
| 21 | process_file(log) |
|---|
| 22 | return HttpResponse("uploaded", mimetype="text/plain") |
|---|
| 23 | else: |
|---|
| 24 | log.status = 'E' |
|---|
| 25 | log.save() |
|---|
| 26 | print 'invalid form', log.status |
|---|
| 27 | else: |
|---|
| 28 | form = UploadFileForm() |
|---|
| 29 | return render_to_response('upload.html', {'form': form}) |
|---|
| 30 | |
|---|
| 31 | def get_filename(id): |
|---|
| 32 | return '%s/%d.log' % (settings.TEST_UPLOAD_DIR, id) |
|---|
| 33 | |
|---|
| 34 | def handle_uploaded_file(f, id): |
|---|
| 35 | destination = open(get_filename(id), 'wb+') |
|---|
| 36 | for chunk in f.chunks(): |
|---|
| 37 | destination.write(chunk) |
|---|
| 38 | destination.close() |
|---|
| 39 | |
|---|
| 40 | info_regexp = re.compile('^([IEWSVT]): (.*)') |
|---|
| 41 | |
|---|
| 42 | def add_info_line(type, text, log): |
|---|
| 43 | i = InfoLine(type=type, text=text, log=log) |
|---|
| 44 | i.save() |
|---|
| 45 | return i |
|---|
| 46 | |
|---|
| 47 | def process_file(log): |
|---|
| 48 | info = 0 |
|---|
| 49 | error = 0 |
|---|
| 50 | warning = 0 |
|---|
| 51 | for line in open(get_filename(log.id)).readlines(): |
|---|
| 52 | res = info_regexp.search(line) |
|---|
| 53 | if res: |
|---|
| 54 | if res.group(1) == 'I': |
|---|
| 55 | info = info + 1 |
|---|
| 56 | add_info_line(res.group(1), res.group(2), log) |
|---|
| 57 | elif res.group(1) == 'E': |
|---|
| 58 | error = error + 1 |
|---|
| 59 | add_info_line(res.group(1), res.group(2), log) |
|---|
| 60 | elif res.group(1) == 'W': |
|---|
| 61 | warning = warning + 1 |
|---|
| 62 | add_info_line(res.group(1), res.group(2), log) |
|---|
| 63 | elif res.group(1) == 'V': |
|---|
| 64 | version = res.group(2) |
|---|
| 65 | try: |
|---|
| 66 | v = SystemVersion.objects.get(name=version) |
|---|
| 67 | except SystemVersion.DoesNotExist: |
|---|
| 68 | v = SystemVersion(name=version) |
|---|
| 69 | v.save() |
|---|
| 70 | log.version = v |
|---|
| 71 | log.warnings = warning |
|---|
| 72 | log.infos = info |
|---|
| 73 | log.errors = error |
|---|
| 74 | log.save() |
|---|
| 75 | |
|---|
| 76 | def next_test1(request): |
|---|
| 77 | mac = get_mac(request) |
|---|
| 78 | return next_test(request, mac) |
|---|
| 79 | |
|---|
| 80 | def next_test(request, mac): |
|---|
| 81 | smac = simplify_mac(mac) |
|---|
| 82 | s = get_object_or_404(System, macaddress__mac=smac) |
|---|
| 83 | name = 'wait' |
|---|
| 84 | logs = TestLog.objects.filter(system=s, status='R').order_by('date') |
|---|
| 85 | if logs and len(logs) > 0: |
|---|
| 86 | log = logs[0] |
|---|
| 87 | name = log.test_name.name |
|---|
| 88 | log.status = 'S' |
|---|
| 89 | log.save() |
|---|
| 90 | else: |
|---|
| 91 | log = None |
|---|
| 92 | print "%s (%s) -> %s (%s)" % (s.name, mac, name, str(log)) |
|---|
| 93 | return render_to_response(name + settings.TEST_SUFFIX, {'testname': name, 'system': s.name, 'log': log}) |
|---|
| 94 | |
|---|
| 95 | def logs(request, verid): |
|---|
| 96 | version = get_object_or_404(SystemVersion, id=verid) |
|---|
| 97 | logs = TestLog.objects.filter(version=version).order_by('-date') |
|---|
| 98 | return render_to_response('logs.html', {'logs': logs, 'version': version}) |
|---|
| 99 | |
|---|
| 100 | def log(request, logid): |
|---|
| 101 | log = get_object_or_404(TestLog, id=logid) |
|---|
| 102 | infos = InfoLine.objects.filter(log=log).order_by('id') |
|---|
| 103 | return render_to_response('log.html', {'log': log, 'infos': infos}) |
|---|
| 104 | |
|---|
| 105 | def content(request, logid): |
|---|
| 106 | log = get_object_or_404(TestLog, id=logid) |
|---|
| 107 | filename = get_filename(log.id) |
|---|
| 108 | wrapper = FileWrapper(file(filename)) |
|---|
| 109 | response = HttpResponse(wrapper, content_type='text/plain') |
|---|
| 110 | response['Content-Length'] = os.path.getsize(filename) |
|---|
| 111 | return response |
|---|
| 112 | |
|---|
| 113 | def index(request): |
|---|
| 114 | versions = SystemVersion.objects.all().order_by('-id') |
|---|
| 115 | systems = System.objects.all().order_by('name') |
|---|
| 116 | testnames = TestName.objects.filter(available=True).order_by('name') |
|---|
| 117 | return render_to_response('index.html', {'versions': versions, |
|---|
| 118 | 'systems': systems, |
|---|
| 119 | 'testnames': testnames}) |
|---|
| 120 | |
|---|
| 121 | def script(request, name): |
|---|
| 122 | return render_to_response(name + settings.TEST_SUFFIX, {'testname': name, 'system': 'system', 'log': None}) |
|---|
| 123 | |
|---|
| 124 | def system(request, sysid): |
|---|
| 125 | s = get_object_or_404(System, id=sysid) |
|---|
| 126 | testlogs = TestLog.objects.filter(system=s).order_by('-date') |
|---|
| 127 | logs = Log.objects.filter(system=s).order_by('-date')[0:10] |
|---|
| 128 | return render_to_response('system.html', {'system': s, 'logs': testlogs, 'boots': logs}) |
|---|
| 129 | |
|---|
| 130 | def testname(request, tstid): |
|---|
| 131 | name = get_object_or_404(TestName, id=tstid) |
|---|
| 132 | logs = TestLog.objects.filter(test_name=name).order_by('-date') |
|---|
| 133 | return render_to_response('tests.html', {'logs': logs, 'testname': name}) |
|---|
| 134 | |
|---|
| 135 | # views.py ends here |
|---|