111 lines
5.2 KiB
Python
111 lines
5.2 KiB
Python
from django.http import HttpResponse
|
|
from rest_framework.decorators import action
|
|
from rest_framework.generics import get_object_or_404
|
|
from rest_framework.response import Response
|
|
from rest_framework.viewsets import ModelViewSet
|
|
|
|
from core.mixins import ApiPermissionCheckMixin
|
|
from devices.enums import DeviceType
|
|
from devices.models.firewall import ArmaIndustrialFirewall
|
|
from devices.serializers.firewall import FirewallSerializer, CheckFirewallConnectionSerializer, \
|
|
AifUploadIdsRulesetsSerializer, AifUploadConfigSerializer
|
|
from devices.services.firewall import FirewallService
|
|
from devices.services.vector import VectorService
|
|
from devices.tasks.firewall import download_files_from_firewall_task
|
|
|
|
|
|
class ArmaIndustrialFirewallViewSet(ApiPermissionCheckMixin, ModelViewSet):
|
|
queryset = ArmaIndustrialFirewall.objects.all()
|
|
serializer_class = FirewallSerializer
|
|
|
|
def perform_create(self, serializer):
|
|
check_connection_serializer = CheckFirewallConnectionSerializer(data=self.request.data)
|
|
check_connection_serializer.is_valid(raise_exception=True)
|
|
|
|
fs = FirewallService()
|
|
fs.check_connection(check_connection_serializer.validated_data)
|
|
firewall = serializer.save(type=DeviceType.FIREWALL)
|
|
|
|
fs.firewall = firewall
|
|
|
|
vector = VectorService(firewall)
|
|
vector.update_config()
|
|
|
|
def perform_update(self, serializer):
|
|
check_connection_serializer = CheckFirewallConnectionSerializer(data=self.request.data)
|
|
check_connection_serializer.is_valid(raise_exception=True)
|
|
fs = FirewallService()
|
|
fs.check_connection(check_connection_serializer.validated_data)
|
|
|
|
firewall = serializer.save()
|
|
vector = VectorService(firewall)
|
|
vector.update_config()
|
|
|
|
def perform_destroy(self, device):
|
|
vector = VectorService(device)
|
|
vector.delete_config()
|
|
device.delete()
|
|
|
|
@action(detail=True, methods=['GET'])
|
|
def status(self, request, *args, **kwargs):
|
|
firewall = get_object_or_404(ArmaIndustrialFirewall, pk=kwargs['pk'])
|
|
response = FirewallService(firewall).check_status()
|
|
return Response(response)
|
|
|
|
@action(detail=True, methods=['POST'])
|
|
def upload_ids_rulesets(self, request, *args, **kwargs):
|
|
firewall = get_object_or_404(ArmaIndustrialFirewall, pk=kwargs['pk'])
|
|
serializer = AifUploadIdsRulesetsSerializer(data=request.data)
|
|
serializer.is_valid(raise_exception=True)
|
|
rulesets_file = serializer.validated_data['rulesets']
|
|
response = FirewallService(firewall).upload_file(rulesets_file, 'rulesets')
|
|
return Response(response)
|
|
|
|
@action(detail=True, methods=['POST'])
|
|
def upload_config(self, request, *args, **kwargs):
|
|
firewall = get_object_or_404(ArmaIndustrialFirewall, pk=kwargs['pk'])
|
|
serializer = AifUploadConfigSerializer(data=request.data)
|
|
serializer.is_valid(raise_exception=True)
|
|
config_file = serializer.validated_data['conffile']
|
|
response = FirewallService(firewall).upload_file(config_file, 'config')
|
|
return Response(response)
|
|
|
|
@action(detail=True, methods=['GET'])
|
|
def download_rulesets(self, request, *args, **kwargs): # Deprecated
|
|
firewall = get_object_or_404(ArmaIndustrialFirewall, pk=kwargs['pk'])
|
|
file_byte, name = FirewallService(firewall).download_file('rulesets')
|
|
response = HttpResponse(file_byte, content_type="application/file")
|
|
response['Content-Disposition'] = f'attachment; filename="{name}"'
|
|
return response
|
|
|
|
@action(detail=True, methods=['GET'])
|
|
def download_config(self, request, *args, **kwargs): # Deprecated
|
|
firewall = get_object_or_404(ArmaIndustrialFirewall, pk=kwargs['pk'])
|
|
file_byte, name = FirewallService(firewall).download_file('config')
|
|
response = HttpResponse(file_byte, content_type="application/file")
|
|
response['Content-Disposition'] = f'attachment; filename="{name}"'
|
|
return response
|
|
|
|
@action(detail=True, methods=['GET'])
|
|
def download_config_new(self, request, *args, **kwargs): # todo remove suffix _new
|
|
firewall = get_object_or_404(ArmaIndustrialFirewall, pk=kwargs['pk'])
|
|
task = download_files_from_firewall_task.apply_async(args=(firewall.pk, request.user.pk, 'config'))
|
|
return Response({'task_id': task.id})
|
|
|
|
@action(detail=True, methods=['GET'])
|
|
def download_rulesets_new(self, request, *args, **kwargs): # todo remove suffix _new
|
|
firewall = get_object_or_404(ArmaIndustrialFirewall, pk=kwargs['pk'])
|
|
task = download_files_from_firewall_task.apply_async(args=(firewall.pk, request.user.pk, 'rulesets'))
|
|
return Response({'task_id': task.id})
|
|
|
|
@action(detail=True, methods=['POST'])
|
|
def reboot(self, request, *args, **kwargs):
|
|
firewall = get_object_or_404(ArmaIndustrialFirewall, pk=kwargs['pk'])
|
|
response = FirewallService(firewall).reboot()
|
|
return Response(response)
|
|
|
|
@action(detail=True, methods=['GET'])
|
|
def rule_fields(self, request, *args, **kwargs):
|
|
firewall = get_object_or_404(ArmaIndustrialFirewall, pk=kwargs['pk'])
|
|
response = FirewallService(firewall).rule_fields(request)
|
|
return Response(response)
|