def _create_async_merge_report_job(details_report_data): """Retrieve merge report job status. :param details_report_data: Details report data to fingerprint :returns: Response for http request """ has_errors, validation_result = validate_details_report_json( details_report_data) if has_errors: return Response(validation_result, status=status.HTTP_400_BAD_REQUEST) # Create FC model and save data details_report = create_details_report(details_report_data) # Create new job to run merge_job = ScanJob(scan_type=ScanTask.SCAN_TYPE_FINGERPRINT, details_report=details_report) merge_job.save() merge_job.log_current_status() job_serializer = ScanJobSerializer(merge_job) response_data = job_serializer.data # start fingerprint job start_scan.send(sender=__name__, instance=merge_job) return Response(response_data, status=status.HTTP_201_CREATED)
def _create_details_report(self): """Send collected host scan facts to fact endpoint. :param facts: The array of fact dictionaries :returns: Identifer for the sent facts """ inspect_tasks = self.scan_job.tasks.filter( scan_type=ScanTask.SCAN_TYPE_INSPECT).order_by('sequence_number') sources = build_sources_from_tasks( inspect_tasks.filter(status=ScanTask.COMPLETED)) if bool(sources): details_report_json = {'sources': sources} has_errors, validation_result = validate_details_report_json( details_report_json) if has_errors: message = 'Scan producted invalid details report JSON: %s' % \ validation_result self.scan_job.fail(message) return ScanTask.FAILED # Create FC model and save data to JSON file details_report = create_details_report( details_report_json) return details_report return None
def _create_details_report(self): """Send collected host scan facts to fact endpoint. :param facts: The array of fact dictionaries :returns: bool indicating if there are errors and dict with result. """ inspect_tasks = self.scan_job.tasks.filter( scan_type=ScanTask.SCAN_TYPE_INSPECT).order_by('sequence_number') sources = build_sources_from_tasks( inspect_tasks.filter(status=ScanTask.COMPLETED)) if bool(sources): details_report_json = {'sources': sources, 'report_type': 'details', 'report_version': create_report_version()} has_errors, validation_result = validate_details_report_json( details_report_json, False) if has_errors: message = 'Scan produced invalid details report JSON: %s' % \ validation_result self.scan_job.fail(message) return True, {} # Create FC model and save data to JSON file details_report = create_details_report(create_report_version(), details_report_json) return False, details_report message = 'No connection results found.' self.scan_job.fail(message) return True, {}
def create(self, request, *args, **kwargs): """Create a details report.""" # pylint: disable=unused-argument # Validate incoming request body has_errors, validation_result = validate_details_report_json( request.data) if has_errors: return Response(validation_result, status=status.HTTP_400_BAD_REQUEST) # Create FC model and save data details_report = create_details_report(request.data) scan_job = ScanJob(scan_type=ScanTask.SCAN_TYPE_FINGERPRINT, details_report=details_report) scan_job.save() scan_job.queue() runner = ScanJobRunner(scan_job) runner.run() if scan_job.status != ScanTask.COMPLETED: # pylint: disable=no-member error_json = {'error': scan_job.tasks.first().status_message} return Response(error_json, status=status.HTTP_400_BAD_REQUEST) scan_job = ScanJob.objects.get(pk=scan_job.id) details_report = DetailsReport.objects.get(pk=details_report.id) # Prepare REST response body serializer = self.get_serializer(details_report) result = serializer.data return Response(result, status=status.HTTP_201_CREATED)
def sync_merge_reports(request): """Merge reports synchronously.""" # pylint: disable=too-many-locals error = {'reports': []} details_report_json = _convert_ids_to_json(request.data) has_errors, validation_result = validate_details_report_json( details_report_json, True) if has_errors: message = _(messages.REPORT_MERGE_NO_RESULTS % validation_result) error.get('reports').append(message) raise ValidationError(error) # Create FC model and save data details_report_json = _reconcile_source_versions(details_report_json) report_version = details_report_json.get('report_version', None) details_report = create_details_report(report_version, details_report_json) merge_job = ScanJob(scan_type=ScanTask.SCAN_TYPE_FINGERPRINT, details_report=details_report) merge_job.save() merge_job.queue() runner = ScanJobRunner(merge_job) runner.run() if merge_job.status != ScanTask.COMPLETED: raise Exception(merge_job.status_message) merge_job.refresh_from_db() details_report = DetailsReport.objects.get(pk=details_report.id) # Prepare REST response body serializer = DetailsReportSerializer(details_report) result = serializer.data return Response(result, status=status.HTTP_201_CREATED)
def create(self, request, *args, **kwargs): """Create a details report.""" # pylint: disable=unused-argument # Validate incoming request body has_errors, validation_result = validate_details_report_json( request.data, True) if has_errors: return Response(validation_result, status=status.HTTP_400_BAD_REQUEST) report_version = request.data.get('report_version', None) warn_deprecated = False if not report_version: warn_deprecated = True report_version = create_report_version() # Create FC model and save data details_report = create_details_report(create_report_version(), request.data) scan_job = ScanJob(scan_type=ScanTask.SCAN_TYPE_FINGERPRINT, details_report=details_report) scan_job.save() if warn_deprecated: scan_job.log_message(_(messages.FC_MISSING_REPORT_VERSION), log_level=logging.WARNING) scan_job.queue() runner = ScanJobRunner(scan_job) runner.run() if scan_job.status != ScanTask.COMPLETED: # pylint: disable=no-member error_json = {'error': scan_job.tasks.first().status_message} return Response(error_json, status=status.HTTP_400_BAD_REQUEST) scan_job = ScanJob.objects.get(pk=scan_job.id) details_report = DetailsReport.objects.get(pk=details_report.id) # Prepare REST response body serializer = self.get_serializer(details_report) result = serializer.data return Response(result, status=status.HTTP_201_CREATED)
def sync_merge_reports(request): """Merge reports synchronously.""" error = { 'reports': [] } reports = validate_merge_report(request.data) sources = [] for report in reports: sources = sources + report.get_sources() details_report_json = {'sources': sources} has_errors, validation_result = validate_details_report_json( details_report_json) if has_errors: message = _(messages.REPORT_MERGE_NO_RESULTS % validation_result) error.get('reports').append(message) raise ValidationError(error) # Create FC model and save data details_report = create_details_report(details_report_json) scan_job = ScanJob(scan_type=ScanTask.SCAN_TYPE_FINGERPRINT, details_report=details_report) scan_job.save() scan_job.queue() runner = ScanJobRunner(scan_job) runner.run() if scan_job.status != ScanTask.COMPLETED: raise Exception(scan_job.status_message) scan_job = ScanJob.objects.get(pk=scan_job.id) details_report = DetailsReport.objects.get(pk=details_report.id) # Prepare REST response body serializer = DetailsReportSerializer(details_report) result = serializer.data return Response(result, status=status.HTTP_201_CREATED)