diff options
| -rw-r--r-- | bitbake/lib/toaster/toastergui/templates/unavailable_artifact.html | 13 | ||||
| -rwxr-xr-x | bitbake/lib/toaster/toastergui/views.py | 97 |
2 files changed, 47 insertions, 63 deletions
diff --git a/bitbake/lib/toaster/toastergui/templates/unavailable_artifact.html b/bitbake/lib/toaster/toastergui/templates/unavailable_artifact.html index 0301a6c608..2d3d02c2e1 100644 --- a/bitbake/lib/toaster/toastergui/templates/unavailable_artifact.html +++ b/bitbake/lib/toaster/toastergui/templates/unavailable_artifact.html | |||
| @@ -3,15 +3,14 @@ | |||
| 3 | {% load humanize %} | 3 | {% load humanize %} |
| 4 | {% load static %} | 4 | {% load static %} |
| 5 | 5 | ||
| 6 | {% block title %} Build artifact no longer exists - Toaster {% endblock %} | 6 | {% block title %} Build artifact does not exist - Toaster {% endblock %} |
| 7 | 7 | ||
| 8 | {% block pagecontent %} | 8 | {% block pagecontent %} |
| 9 | 9 | <div class="row-fluid air"> | |
| 10 | <div class="row-fluid air"> | 10 | <div class="alert alert-info span8 lead"> |
| 11 | <div class="alert alert-info span8 lead"> | 11 | <p>The build artifact you are trying to download does not exist.</p> |
| 12 | <p"> The build artifact you are trying to download no longer exists.</p> | 12 | <p><a href="javascript:window.history.back()">Back to previous page</a></p> |
| 13 | <p><a href="javascript:window.history.back()">Back to previous page</a></p> | 13 | </div> |
| 14 | </div> | 14 | </div> |
| 15 | </div> | ||
| 16 | {% endblock %} | 15 | {% endblock %} |
| 17 | 16 | ||
diff --git a/bitbake/lib/toaster/toastergui/views.py b/bitbake/lib/toaster/toastergui/views.py index 59e16b27b2..995937a077 100755 --- a/bitbake/lib/toaster/toastergui/views.py +++ b/bitbake/lib/toaster/toastergui/views.py | |||
| @@ -35,7 +35,7 @@ from orm.models import BitbakeVersion, CustomImageRecipe | |||
| 35 | from bldcontrol import bbcontroller | 35 | from bldcontrol import bbcontroller |
| 36 | from django.views.decorators.cache import cache_control | 36 | from django.views.decorators.cache import cache_control |
| 37 | from django.core.urlresolvers import reverse, resolve | 37 | from django.core.urlresolvers import reverse, resolve |
| 38 | from django.core.exceptions import MultipleObjectsReturned | 38 | from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist |
| 39 | from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger | 39 | from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger |
| 40 | from django.http import HttpResponseBadRequest, HttpResponseNotFound | 40 | from django.http import HttpResponseBadRequest, HttpResponseNotFound |
| 41 | from django.utils import timezone | 41 | from django.utils import timezone |
| @@ -2575,78 +2575,63 @@ if True: | |||
| 2575 | 2575 | ||
| 2576 | return context | 2576 | return context |
| 2577 | 2577 | ||
| 2578 | def _file_name_for_artifact(b, artifact_type, artifact_id): | 2578 | def _file_names_for_artifact(build, artifact_type, artifact_id): |
| 2579 | """ | ||
| 2580 | Return a tuple (file path, file name for the download response) for an | ||
| 2581 | artifact of type artifact_type with ID artifact_id for build; if | ||
| 2582 | artifact type is not supported, returns (None, None) | ||
| 2583 | """ | ||
| 2579 | file_name = None | 2584 | file_name = None |
| 2580 | # Target_Image_File file_name | 2585 | response_file_name = None |
| 2581 | if artifact_type == "imagefile": | 2586 | |
| 2582 | file_name = Target_Image_File.objects.get(target__build = b, pk = artifact_id).file_name | 2587 | if artifact_type == "cookerlog": |
| 2588 | file_name = build.cooker_log_path | ||
| 2589 | response_file_name = "cooker.log" | ||
| 2590 | |||
| 2591 | elif artifact_type == "imagefile": | ||
| 2592 | file_name = Target_Image_File.objects.get(target__build = build, pk = artifact_id).file_name | ||
| 2583 | 2593 | ||
| 2584 | elif artifact_type == "buildartifact": | 2594 | elif artifact_type == "buildartifact": |
| 2585 | file_name = BuildArtifact.objects.get(build = b, pk = artifact_id).file_name | 2595 | file_name = BuildArtifact.objects.get(build = build, pk = artifact_id).file_name |
| 2586 | 2596 | ||
| 2587 | elif artifact_type == "licensemanifest": | 2597 | elif artifact_type == "licensemanifest": |
| 2588 | file_name = Target.objects.get(build = b, pk = artifact_id).license_manifest_path | 2598 | file_name = Target.objects.get(build = build, pk = artifact_id).license_manifest_path |
| 2589 | 2599 | ||
| 2590 | elif artifact_type == "tasklogfile": | 2600 | elif artifact_type == "tasklogfile": |
| 2591 | file_name = Task.objects.get(build = b, pk = artifact_id).logfile | 2601 | file_name = Task.objects.get(build = build, pk = artifact_id).logfile |
| 2592 | 2602 | ||
| 2593 | elif artifact_type == "logmessagefile": | 2603 | elif artifact_type == "logmessagefile": |
| 2594 | file_name = LogMessage.objects.get(build = b, pk = artifact_id).pathname | 2604 | file_name = LogMessage.objects.get(build = build, pk = artifact_id).pathname |
| 2595 | else: | ||
| 2596 | raise Exception("FIXME: artifact type %s not implemented" % (artifact_type)) | ||
| 2597 | 2605 | ||
| 2598 | return file_name | 2606 | if file_name and not response_file_name: |
| 2607 | response_file_name = os.path.basename(file_name) | ||
| 2599 | 2608 | ||
| 2609 | return (file_name, response_file_name) | ||
| 2600 | 2610 | ||
| 2601 | def build_artifact(request, build_id, artifact_type, artifact_id): | 2611 | def build_artifact(request, build_id, artifact_type, artifact_id): |
| 2602 | if artifact_type in ["cookerlog"]: | 2612 | """ |
| 2603 | try: | 2613 | View which returns a build artifact file as a response |
| 2604 | build = Build.objects.get(pk = build_id) | 2614 | """ |
| 2605 | file_name = build.cooker_log_path | 2615 | file_name = None |
| 2616 | response_file_name = None | ||
| 2617 | |||
| 2618 | try: | ||
| 2619 | build = Build.objects.get(pk = build_id) | ||
| 2620 | file_name, response_file_name = _file_names_for_artifact( | ||
| 2621 | build, artifact_type, artifact_id | ||
| 2622 | ) | ||
| 2623 | |||
| 2624 | if file_name and response_file_name: | ||
| 2606 | fsock = open(file_name, "r") | 2625 | fsock = open(file_name, "r") |
| 2607 | content_type = MimeTypeFinder.get_mimetype(file_name) | 2626 | content_type = MimeTypeFinder.get_mimetype(file_name) |
| 2608 | 2627 | ||
| 2609 | response = HttpResponse(fsock, content_type = content_type) | 2628 | response = HttpResponse(fsock, content_type = content_type) |
| 2610 | 2629 | ||
| 2611 | disposition = 'attachment; filename=cooker.log' | 2630 | disposition = "attachment; filename=" + response_file_name |
| 2612 | response['Content-Disposition'] = disposition | 2631 | response["Content-Disposition"] = disposition |
| 2613 | 2632 | ||
| 2614 | return response | 2633 | return response |
| 2615 | except IOError: | ||
| 2616 | context = { | ||
| 2617 | 'build' : Build.objects.get(pk = build_id), | ||
| 2618 | } | ||
| 2619 | return render(request, "unavailable_artifact.html", context) | ||
| 2620 | |||
| 2621 | else: | ||
| 2622 | # retrieve the artifact directly from the build environment | ||
| 2623 | return _get_be_artifact(request, build_id, artifact_type, artifact_id) | ||
| 2624 | |||
| 2625 | |||
| 2626 | def _get_be_artifact(request, build_id, artifact_type, artifact_id): | ||
| 2627 | try: | ||
| 2628 | b = Build.objects.get(pk=build_id) | ||
| 2629 | if b.buildrequest is None or b.buildrequest.environment is None: | ||
| 2630 | raise Exception("Artifact not available for download (missing build request or build environment)") | ||
| 2631 | |||
| 2632 | file_name = _file_name_for_artifact(b, artifact_type, artifact_id) | ||
| 2633 | fsock = None | ||
| 2634 | content_type='application/force-download' | ||
| 2635 | |||
| 2636 | if file_name is None: | ||
| 2637 | raise Exception("Could not handle artifact %s id %s" % (artifact_type, artifact_id)) | ||
| 2638 | else: | 2634 | else: |
| 2639 | content_type = MimeTypeFinder.get_mimetype(file_name) | 2635 | return render(request, "unavailable_artifact.html") |
| 2640 | fsock = b.buildrequest.environment.get_artifact(file_name) | 2636 | except ObjectDoesNotExist, IOError: |
| 2641 | file_name = os.path.basename(file_name) # we assume that the build environment system has the same path conventions as host | 2637 | return render(request, "unavailable_artifact.html") |
| 2642 | |||
| 2643 | response = HttpResponse(fsock, content_type = content_type) | ||
| 2644 | |||
| 2645 | # returns a file from the environment | ||
| 2646 | response['Content-Disposition'] = 'attachment; filename=' + file_name | ||
| 2647 | return response | ||
| 2648 | except IOError: | ||
| 2649 | context = { | ||
| 2650 | 'build' : Build.objects.get(pk = build_id), | ||
| 2651 | } | ||
| 2652 | return render(request, "unavailable_artifact.html", context) | ||
