2022-04-26 13:30:01 +00:00
|
|
|
from rest_framework import serializers
|
|
|
|
from django.utils.translation import gettext_lazy as _
|
|
|
|
|
2022-09-01 06:46:31 +00:00
|
|
|
from common.drf.fields import LabeledChoiceField
|
2022-08-18 09:58:59 +00:00
|
|
|
from common.drf.serializers import JMSWritableNestedModelSerializer
|
2022-09-15 08:22:01 +00:00
|
|
|
from ..models import Platform, PlatformProtocol, PlatformAutomation
|
2022-08-18 09:58:59 +00:00
|
|
|
from ..const import Category, AllTypes
|
2022-04-26 13:30:01 +00:00
|
|
|
|
2022-08-29 02:49:53 +00:00
|
|
|
|
2022-08-30 06:13:33 +00:00
|
|
|
__all__ = ['PlatformSerializer', 'PlatformOpsMethodSerializer']
|
2022-04-26 13:30:01 +00:00
|
|
|
|
|
|
|
|
2022-08-29 07:50:25 +00:00
|
|
|
class ProtocolSettingSerializer(serializers.Serializer):
|
|
|
|
SECURITY_CHOICES = [
|
|
|
|
('any', 'Any'),
|
|
|
|
('rdp', 'RDP'),
|
|
|
|
('tls', 'TLS'),
|
|
|
|
('nla', 'NLA'),
|
|
|
|
]
|
2022-09-07 09:12:53 +00:00
|
|
|
# RDP
|
2022-08-29 07:50:25 +00:00
|
|
|
console = serializers.BooleanField(required=False)
|
2022-09-08 12:31:04 +00:00
|
|
|
security = serializers.ChoiceField(choices=SECURITY_CHOICES, default='any')
|
|
|
|
|
2022-09-07 09:12:53 +00:00
|
|
|
# SFTP
|
2022-09-08 12:31:04 +00:00
|
|
|
sftp_enabled = serializers.BooleanField(default=True, label=_("SFTP enabled"))
|
|
|
|
sftp_home = serializers.CharField(default='/tmp', label=_("SFTP home"))
|
2022-08-29 07:50:25 +00:00
|
|
|
|
|
|
|
|
2022-09-15 08:22:01 +00:00
|
|
|
class PlatformAutomationSerializer(serializers.ModelSerializer):
|
|
|
|
class Meta:
|
|
|
|
model = PlatformAutomation
|
|
|
|
fields = [
|
|
|
|
'id', 'ping_enabled', 'ping_method',
|
|
|
|
'gather_facts_enabled', 'gather_facts_method',
|
|
|
|
'create_account_enabled', 'create_account_method',
|
|
|
|
'change_password_enabled', 'change_password_method',
|
|
|
|
'verify_account_enabled', 'verify_account_method',
|
|
|
|
'gather_accounts_enabled', 'gather_accounts_method',
|
|
|
|
]
|
|
|
|
extra_kwargs = {
|
2022-09-15 13:20:56 +00:00
|
|
|
'ping_enabled': {'label': '启用资产探测'},
|
|
|
|
'ping_method': {'label': '探测方式'},
|
2022-09-15 08:22:01 +00:00
|
|
|
'gather_facts_enabled': {'label': '启用收集信息'},
|
|
|
|
'gather_facts_method': {'label': '收集信息方式'},
|
|
|
|
'verify_account_enabled': {'label': '启用校验账号'},
|
|
|
|
'verify_account_method': {'label': '校验账号方式'},
|
|
|
|
'create_account_enabled': {'label': '启用创建账号'},
|
|
|
|
'create_account_method': {'label': '创建账号方式'},
|
|
|
|
'change_password_enabled': {'label': '启用账号创建改密'},
|
|
|
|
'change_password_method': {'label': '账号创建改密方式'},
|
|
|
|
'gather_accounts_enabled': {'label': '启用账号收集'},
|
|
|
|
'gather_accounts_method': {'label': '收集账号方式'},
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2022-08-18 09:58:59 +00:00
|
|
|
class PlatformProtocolsSerializer(serializers.ModelSerializer):
|
2022-09-07 09:12:53 +00:00
|
|
|
setting = ProtocolSettingSerializer(required=False, allow_null=True)
|
2022-08-29 07:50:25 +00:00
|
|
|
|
2022-08-18 09:58:59 +00:00
|
|
|
class Meta:
|
|
|
|
model = PlatformProtocol
|
|
|
|
fields = ['id', 'name', 'port', 'setting']
|
2022-04-26 13:30:01 +00:00
|
|
|
|
|
|
|
|
2022-08-18 09:58:59 +00:00
|
|
|
class PlatformSerializer(JMSWritableNestedModelSerializer):
|
2022-09-01 06:46:31 +00:00
|
|
|
type = LabeledChoiceField(choices=AllTypes.choices, label=_("Type"))
|
|
|
|
category = LabeledChoiceField(choices=Category.choices, label=_("Category"))
|
2022-08-18 09:58:59 +00:00
|
|
|
protocols = PlatformProtocolsSerializer(label=_('Protocols'), many=True, required=False)
|
2022-09-15 08:22:01 +00:00
|
|
|
automation = PlatformAutomationSerializer(label=_('Automation'), required=False)
|
2022-09-01 06:46:31 +00:00
|
|
|
su_method = LabeledChoiceField(
|
2022-08-29 02:49:53 +00:00
|
|
|
choices=[('sudo', 'sudo su -'), ('su', 'su - ')],
|
|
|
|
label='切换方式', required=False, default='sudo'
|
|
|
|
)
|
2022-09-15 08:22:01 +00:00
|
|
|
brand = LabeledChoiceField(choices=[], label='厂商', required=False, allow_null=True)
|
2022-04-26 13:30:01 +00:00
|
|
|
|
|
|
|
class Meta:
|
|
|
|
model = Platform
|
2022-04-30 15:19:43 +00:00
|
|
|
fields_mini = ['id', 'name', 'internal']
|
|
|
|
fields_small = fields_mini + [
|
2022-09-08 12:31:04 +00:00
|
|
|
'category', 'type', 'charset',
|
2022-08-18 09:58:59 +00:00
|
|
|
]
|
|
|
|
fields = fields_small + [
|
2022-09-08 12:31:04 +00:00
|
|
|
'protocols_enabled', 'protocols', 'domain_enabled',
|
2022-09-15 08:22:01 +00:00
|
|
|
'su_enabled', 'su_method', 'brand', 'automation', 'comment',
|
2022-04-30 15:19:43 +00:00
|
|
|
]
|
2022-08-29 02:49:53 +00:00
|
|
|
extra_kwargs = {
|
|
|
|
'su_enabled': {'label': '启用切换账号'},
|
2022-09-15 13:20:56 +00:00
|
|
|
'protocols_enabled': {'label': '启用协议'},
|
2022-09-01 06:46:31 +00:00
|
|
|
'domain_enabled': {'label': "启用网域"},
|
|
|
|
'domain_default': {'label': "默认网域"},
|
2022-08-29 02:49:53 +00:00
|
|
|
}
|
2022-04-30 15:19:43 +00:00
|
|
|
|
2022-09-15 08:22:01 +00:00
|
|
|
def __init__(self, *args, **kwargs):
|
|
|
|
super().__init__(*args, **kwargs)
|
|
|
|
self.set_brand_choices()
|
|
|
|
|
|
|
|
def set_brand_choices(self):
|
|
|
|
field = self.fields.get('brand')
|
|
|
|
request = self.context.get('request')
|
|
|
|
if not field or not request:
|
|
|
|
return
|
|
|
|
category = request.query_params.get('category', '')
|
|
|
|
constraints = Category.platform_constraints().get(category)
|
|
|
|
if not constraints:
|
|
|
|
return
|
|
|
|
field.choices = constraints.get('brands', [])
|
|
|
|
if field.choices:
|
|
|
|
field.required = True
|
2022-08-30 06:13:33 +00:00
|
|
|
|
|
|
|
|
|
|
|
class PlatformOpsMethodSerializer(serializers.Serializer):
|
|
|
|
id = serializers.CharField(read_only=True)
|
|
|
|
name = serializers.CharField(max_length=50, label=_('Name'))
|
|
|
|
category = serializers.CharField(max_length=50, label=_('Category'))
|
|
|
|
type = serializers.ListSerializer(child=serializers.CharField())
|
|
|
|
method = serializers.CharField()
|