58 lines
2.4 KiB
Python
58 lines
2.4 KiB
Python
import logging
|
|
|
|
from django.db import transaction
|
|
from django.utils.translation import gettext_lazy
|
|
from rest_framework.exceptions import ValidationError
|
|
from rest_framework.generics import get_object_or_404
|
|
|
|
from rest_framework import serializers
|
|
from inputs.enums import LogInputType
|
|
from inputs.models import LogInput, LogInputArmaIF, LogInputEndpoint
|
|
from inputs.services.inputs import create_input, update_input
|
|
from inputs.services.update_config import update_arma_config, update_endpoint_config
|
|
|
|
_log = logging.getLogger(__name__)
|
|
|
|
|
|
class InputSerializer(serializers.ModelSerializer):
|
|
port = serializers.IntegerField(min_value=1500, max_value=65535, write_only=True)
|
|
|
|
class Meta:
|
|
model = LogInput
|
|
fields = ['id', 'label', 'type', 'can_delete', 'port']
|
|
|
|
def validate_port(self, value):
|
|
input_kwargs = {}
|
|
if self.instance:
|
|
loginput_id = self.instance.pk
|
|
input_kwargs = {'input': loginput_id}
|
|
if LogInputArmaIF.objects.filter(port=value).exclude(**input_kwargs).exists() or \
|
|
LogInputEndpoint.objects.filter(port=value).exclude(**input_kwargs).exists():
|
|
raise ValidationError(gettext_lazy('This port is already in use'))
|
|
return value
|
|
|
|
def create(self, validated_data):
|
|
with transaction.atomic():
|
|
port = validated_data.pop('port')
|
|
input_instance = super().create(validated_data)
|
|
create_input(input_instance, port)
|
|
_log.info(
|
|
f'User [{self.context["request"].user}] create logstash config [{input_instance.config_file_name}]')
|
|
return input_instance
|
|
|
|
def update(self, instance, validated_data):
|
|
with transaction.atomic():
|
|
port = validated_data.pop('port', None)
|
|
input_instance = super().update(instance, validated_data)
|
|
update_input(input_instance, port)
|
|
_log.info(
|
|
f'User [{self.context["request"].user}] update logstash config [{input_instance.config_file_name}]')
|
|
return input_instance
|
|
|
|
def to_representation(self, instance: LogInput):
|
|
log_input_data = super().to_representation(instance)
|
|
if instance.type == LogInputType.ARMAIF:
|
|
log_input_data['port'] = instance.loginputarmaif.port
|
|
elif instance.type == LogInputType.ENDPOINT:
|
|
log_input_data['port'] = instance.loginputendpoint.port
|
|
return log_input_data
|