def retrieve(self, request, pk=None): """Get a scan job.""" if not pk or (pk and not is_int(pk)): error = {'id': [_(messages.COMMON_ID_INV)]} raise ValidationError(error) scan = get_object_or_404(self.queryset, pk=pk) serializer = ScanJobSerializer(scan) json_scan = serializer.data json_scan = expand_scanjob(json_scan) return Response(json_scan)
def jobs(request, pk=None): """Get the jobs of a scan.""" # pylint: disable=invalid-name if pk is not None: if not is_int(pk): return Response(status=status.HTTP_404_NOT_FOUND) result = [] scan = get_object_or_404(Scan.objects.all(), pk=pk) if request.method == 'GET': job_queryset = get_job_queryset_query_set(scan, request.query_params) paginator = StandardResultsSetPagination() page = paginator.paginate_queryset(job_queryset, request) if page is not None: serializer = ScanJobSerializer(page, many=True) for scan in serializer.data: json_scan = expand_scanjob(scan) result.append(json_scan) return paginator.get_paginated_response(serializer.data) for job in job_queryset: job_serializer = ScanJobSerializer(job) job_json = job_serializer.data job_json = expand_scanjob(job_serializer.data) result.append(job_json) return Response(result) else: job_data = {} job_data['scan'] = pk job_serializer = ScanJobSerializer(data=job_data) job_serializer.is_valid(raise_exception=True) job_serializer.save() scanjob_obj = ScanJob.objects.get(pk=job_serializer.data['id']) scanjob_obj.log_current_status() start_scan.send(sender=ScanViewSet.__class__, instance=scanjob_obj) return Response(job_serializer.data, status=status.HTTP_201_CREATED)
def cancel(self, request, pk=None): """Cancel the running scan.""" if not pk or (pk and not is_int(pk)): error = {'id': [_(messages.COMMON_ID_INV)]} raise ValidationError(error) scan = get_object_or_404(self.queryset, pk=pk) if (scan.status == ScanTask.COMPLETED or scan.status == ScanTask.FAILED or scan.status == ScanTask.CANCELED): err_msg = _(messages.NO_CANCEL) return JsonResponse({'non_field_errors': [err_msg]}, status=400) # Kill job before changing job state cancel_scan.send(sender=self.__class__, instance=scan) scan.cancel() serializer = ScanJobSerializer(scan) json_scan = serializer.data json_scan = expand_scanjob(json_scan) return Response(json_scan, status=200)
def restart(self, request, pk=None): """Restart a paused scan.""" if not pk or (pk and not is_int(pk)): error = {'id': [_(messages.COMMON_ID_INV)]} raise ValidationError(error) scan = get_object_or_404(self.queryset, pk=pk) if scan.status == ScanTask.PAUSED: # Update job state before starting job scan.restart() restart_scan.send(sender=self.__class__, instance=scan) serializer = ScanJobSerializer(scan) json_scan = serializer.data json_scan = expand_scanjob(json_scan) return Response(json_scan, status=200) elif scan.status == ScanTask.RUNNING: err_msg = _(messages.ALREADY_RUNNING) return JsonResponse({'non_field_errors': [err_msg]}, status=400) err_msg = _(messages.NO_RESTART) return JsonResponse({'non_field_errors': [err_msg]}, status=400)
def pause(self, request, pk=None): """Pause the running scan.""" if not pk or (pk and not is_int(pk)): error = {'id': [_(messages.COMMON_ID_INV)]} raise ValidationError(error) scan = get_object_or_404(self.queryset, pk=pk) if scan.status == ScanTask.RUNNING: # Kill job before changing job state pause_scan.send(sender=self.__class__, instance=scan) scan.pause() serializer = ScanJobSerializer(scan) json_scan = serializer.data json_scan = expand_scanjob(json_scan) return Response(json_scan, status=200) elif scan.status == ScanTask.PAUSED: err_msg = _(messages.ALREADY_PAUSED) return JsonResponse({'non_field_errors': [err_msg]}, status=400) err_msg = _(messages.NO_PAUSE) return JsonResponse({'non_field_errors': [err_msg]}, status=400)