|
| 1 | +from vm_app.models import Node |
| 2 | +from vm_app.serializers import NodeSerializer, ResourceSerializer, FindingSerializer, NewFindingRequestSerializer |
| 3 | +from rest_framework_mongoengine import generics |
| 4 | +from rest_framework.response import Response |
| 5 | +from rest_framework.views import APIView |
| 6 | +from rest_framework import status |
| 7 | + |
| 8 | +class NodeList(generics.ListCreateAPIView): |
| 9 | + queryset = Node.objects.all() |
| 10 | + serializer_class = NodeSerializer |
| 11 | + |
| 12 | +class NodeDetails(generics.RetrieveUpdateDestroyAPIView): |
| 13 | + queryset = Node.objects.all() |
| 14 | + serializer_class = NodeSerializer |
| 15 | + |
| 16 | +class NodeAddFinding(APIView): |
| 17 | + def get_object(self, id): |
| 18 | + return Node.objects.get(pk=id) |
| 19 | + |
| 20 | + def patch(self, request, id, format=None): |
| 21 | + node = self.get_object(id) |
| 22 | + serializer = NewFindingRequestSerializer(data=request.data) |
| 23 | + if not serializer.is_valid(): |
| 24 | + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) |
| 25 | + req_resource = request.data['resource'] |
| 26 | + finding_data = request.data.copy() |
| 27 | + del finding_data['resource'] |
| 28 | + serializer = FindingSerializer(data=finding_data) |
| 29 | + if not serializer.is_valid(): |
| 30 | + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) |
| 31 | + node.node_resources.get(resource=req_resource).findings.create(**finding_data) #ToDo: Use res_id (objectid) instead |
| 32 | + node.save() |
| 33 | + return Response(serializer.data, status=status.HTTP_201_CREATED) |
| 34 | + |
| 35 | +class AllNodesRiskScore(APIView): |
| 36 | + def get_object(self): |
| 37 | + return Node.objects |
| 38 | + |
| 39 | + def get(self, request, format=None): |
| 40 | + nodes = self.get_object() |
| 41 | + data = {"nodes": []} |
| 42 | + for node in nodes: |
| 43 | + node_data = {} |
| 44 | + node_data["id"] = str(node.id) |
| 45 | + node_data["node_name"] = node.node_name |
| 46 | + node_data["risk_score"] = node.risk_score() |
| 47 | + data["nodes"].append(node_data) |
| 48 | + return Response(data, status=status.HTTP_200_OK) |
| 49 | + |
| 50 | +class NodeRiskScore(APIView): |
| 51 | + def get_object(self, id): |
| 52 | + return Node.objects.get(pk=id) |
| 53 | + |
| 54 | + def get(self, request, id, format=None): |
| 55 | + node = self.get_object(id) |
| 56 | + data = {} |
| 57 | + data["id"] = str(node.id) |
| 58 | + data["node_name"] = node.node_name |
| 59 | + data["risk_score"] = node.risk_score() |
| 60 | + data["resources"] = [] |
| 61 | + for resource in node.node_resources: |
| 62 | + serializer = ResourceSerializer(resource) |
| 63 | + resource_data = serializer.data |
| 64 | + del resource_data["findings"] |
| 65 | + resource_data["risk_score"] = resource.risk_score() |
| 66 | + data["resources"].append(resource_data) |
| 67 | + return Response(data, status=status.HTTP_200_OK) |
| 68 | + |
| 69 | +class ResourceRiskScore(APIView): |
| 70 | + def get_object(self, id, r_id): |
| 71 | + return Node.objects.get(pk=id).node_resources.get(resource_id=r_id) |
| 72 | + |
| 73 | + def get(self, request, id, r_id, format=None): |
| 74 | + res = self.get_object(id, r_id) |
| 75 | + data = {} |
| 76 | + data["id"] = id |
| 77 | + data["resource_id"] = str(res.resource_id) |
| 78 | + data["risk_score"] = res.risk_score() |
| 79 | + data["findings"] = [] |
| 80 | + for finding in res.findings: |
| 81 | + serializer = FindingSerializer(finding) |
| 82 | + finding_data = serializer.data |
| 83 | + data["findings"].append(finding_data) |
| 84 | + return Response(data, status=status.HTTP_200_OK) |
| 85 | + |
0 commit comments