2022-04-12 09:45:10 +00:00
|
|
|
from rest_framework import serializers
|
|
|
|
from django.utils.translation import ugettext_lazy as _
|
|
|
|
from common.drf.serializers import BulkModelSerializer
|
2022-06-28 12:12:55 +00:00
|
|
|
from acls.serializers.rules import ip_group_child_validator, ip_group_help_text
|
2022-09-22 10:47:16 +00:00
|
|
|
from ..utils import db_port_manager
|
2022-04-12 09:45:10 +00:00
|
|
|
from ..models import Endpoint, EndpointRule
|
|
|
|
|
2022-09-22 10:47:16 +00:00
|
|
|
|
2022-04-12 09:45:10 +00:00
|
|
|
__all__ = ['EndpointSerializer', 'EndpointRuleSerializer']
|
|
|
|
|
|
|
|
|
|
|
|
class EndpointSerializer(BulkModelSerializer):
|
2022-09-22 07:52:47 +00:00
|
|
|
# 解决 luna 处理繁琐的问题, 返回 magnus 监听的当前 db 的 port
|
|
|
|
magnus_listen_db_port = serializers.SerializerMethodField(label=_('Magnus listen db port'))
|
2022-09-22 09:23:17 +00:00
|
|
|
magnus_listen_port_range = serializers.CharField(
|
|
|
|
max_length=128, default=db_port_manager.magnus_listen_port_range, read_only=True,
|
|
|
|
label=_('Magnus Listen port range'),
|
|
|
|
help_text=_(
|
|
|
|
'The range of ports that Magnus listens on is modified in the configuration file'
|
|
|
|
)
|
|
|
|
)
|
2022-04-12 09:45:10 +00:00
|
|
|
|
|
|
|
class Meta:
|
|
|
|
model = Endpoint
|
|
|
|
fields_mini = ['id', 'name']
|
|
|
|
fields_small = [
|
|
|
|
'host',
|
2022-09-22 07:52:47 +00:00
|
|
|
'https_port', 'http_port', 'ssh_port', 'rdp_port',
|
2022-09-22 09:23:17 +00:00
|
|
|
'magnus_listen_db_port', 'magnus_listen_port_range',
|
2022-04-12 09:45:10 +00:00
|
|
|
]
|
|
|
|
fields = fields_mini + fields_small + [
|
|
|
|
'comment', 'date_created', 'date_updated', 'created_by'
|
|
|
|
]
|
|
|
|
extra_kwargs = {
|
|
|
|
'https_port': {'default': 443},
|
|
|
|
'http_port': {'default': 80},
|
|
|
|
'ssh_port': {'default': 2222},
|
|
|
|
'rdp_port': {'default': 3389},
|
|
|
|
}
|
|
|
|
|
2022-09-22 07:52:47 +00:00
|
|
|
def get_magnus_listen_db_port(self, obj: Endpoint):
|
2022-07-13 08:29:05 +00:00
|
|
|
view = self.context.get('view')
|
|
|
|
if not view or view.action not in ['smart']:
|
|
|
|
return 0
|
2022-09-22 07:52:47 +00:00
|
|
|
return obj.get_port(view.target_instance, view.target_protocol)
|
|
|
|
|
2022-04-12 09:45:10 +00:00
|
|
|
|
|
|
|
class EndpointRuleSerializer(BulkModelSerializer):
|
2022-06-28 12:12:55 +00:00
|
|
|
_ip_group_help_text = '{} <br> {}'.format(
|
|
|
|
ip_group_help_text,
|
|
|
|
_('If asset IP addresses under different endpoints conflict, use asset labels')
|
|
|
|
)
|
2022-04-12 09:45:10 +00:00
|
|
|
ip_group = serializers.ListField(
|
2022-06-28 12:12:55 +00:00
|
|
|
default=['*'], label=_('IP'), help_text=_ip_group_help_text,
|
2022-04-12 09:45:10 +00:00
|
|
|
child=serializers.CharField(max_length=1024, validators=[ip_group_child_validator])
|
|
|
|
)
|
|
|
|
endpoint_display = serializers.ReadOnlyField(source='endpoint.name', label=_('Endpoint'))
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
model = EndpointRule
|
|
|
|
fields_mini = ['id', 'name']
|
|
|
|
fields_small = fields_mini + ['ip_group', 'priority']
|
|
|
|
fields_fk = ['endpoint', 'endpoint_display']
|
|
|
|
fields = fields_mini + fields_small + fields_fk + [
|
|
|
|
'comment', 'date_created', 'date_updated', 'created_by'
|
|
|
|
]
|
|
|
|
extra_kwargs = {
|
|
|
|
}
|