Merge pull request #10032 from jumpserver/pr@dev@platform_set_protocols

perf: 修改 platform protocols
pull/10034/head
老广 2023-03-22 15:38:01 +08:00 committed by GitHub
commit 8289e4c2c8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 77 additions and 49 deletions

View File

@ -6,8 +6,10 @@ from .protocol import Protocol
class BaseType(TextChoices):
"""
约束应该考虑代是对平台对限制避免多余对选项: mysql 开启 ssh, 或者开启了也没有作用, 比如 k8s 开启了 domain目前还不支持
约束应该考虑代是对平台对限制避免多余对选项: mysql 开启 ssh,
或者开启了也没有作用, 比如 k8s 开启了 domain目前还不支持
"""
@classmethod
def get_constrains(cls):
constrains = {}
@ -36,7 +38,7 @@ class BaseType(TextChoices):
if choices == '__self__':
choices = [tp]
protocols = [{'name': name, **settings.get(name, {})} for name in choices]
protocols[0]['primary'] = True
protocols[0]['default'] = True
return protocols
@classmethod
@ -74,5 +76,3 @@ class BaseType(TextChoices):
choice for choice in cls_choices
if choice[0] in tps
]

View File

@ -0,0 +1,35 @@
# Generated by Django 3.2.17 on 2023-03-21 08:33
from django.db import migrations, models
def migrate_platform_charset(apps, schema_editor):
platform_model = apps.get_model('assets', 'Platform')
platform_model.objects.filter(charset='utf8').update(charset='utf-8')
def migrate_platform_protocol_primary(apps, schema_editor):
platform_model = apps.get_model('assets', 'Platform')
platforms = platform_model.objects.all()
for platform in platforms:
p = platform.protocols.first()
p.primary = True
p.save()
class Migration(migrations.Migration):
dependencies = [
('assets', '0110_auto_20230315_1741'),
]
operations = [
migrations.AddField(
model_name='platformprotocol',
name='primary',
field=models.BooleanField(default=False, verbose_name='Primary'),
),
migrations.RunPython(migrate_platform_charset),
migrations.RunPython(migrate_platform_protocol_primary),
]

View File

@ -191,25 +191,6 @@ class Asset(NodesRelationMixin, AbsConnectivity, JMSOrgBaseModel):
names.append(n.name + ':' + n.value)
return names
@lazyproperty
def primary_protocol(self):
from assets.const.types import AllTypes
primary_protocol_name = AllTypes.get_primary_protocol_name(self.category, self.type)
protocol = self.protocols.filter(name=primary_protocol_name).first()
return protocol
@lazyproperty
def protocol(self):
if not self.primary_protocol:
return 'none'
return self.primary_protocol.name
@lazyproperty
def port(self):
if not self.primary_protocol:
return 0
return self.primary_protocol.port
@lazyproperty
def type(self):
return self.platform.type

View File

@ -10,29 +10,17 @@ __all__ = ['Platform', 'PlatformProtocol', 'PlatformAutomation']
class PlatformProtocol(models.Model):
SETTING_ATTRS = {
'console': False,
'security': 'any,tls,rdp',
'sftp_enabled': True,
'sftp_home': '/tmp'
}
default = models.BooleanField(default=False, verbose_name=_('Default'))
required = models.BooleanField(default=False, verbose_name=_('Required'))
name = models.CharField(max_length=32, verbose_name=_('Name'))
port = models.IntegerField(verbose_name=_('Port'))
primary = models.BooleanField(default=False, verbose_name=_('Primary'))
required = models.BooleanField(default=False, verbose_name=_('Required'))
default = models.BooleanField(default=False, verbose_name=_('Default'))
setting = models.JSONField(verbose_name=_('Setting'), default=dict)
platform = models.ForeignKey('Platform', on_delete=models.CASCADE, related_name='protocols')
def __str__(self):
return '{}/{}'.format(self.name, self.port)
@property
def primary(self):
primary_protocol_name = AllTypes.get_primary_protocol_name(
self.platform.category, self.platform.type
)
return self.name == primary_protocol_name
@property
def secret_types(self):
return Protocol.settings().get(self.name, {}).get('secret_types')
@ -100,11 +88,6 @@ class Platform(JMSBaseModel):
)
return linux.id
@property
def primary_protocol(self):
primary_protocol_name = AllTypes.get_primary_protocol_name(self.category, self.type)
return self.protocols.filter(name=primary_protocol_name).first()
def __str__(self):
return self.name

View File

@ -72,16 +72,15 @@ class PlatformAutomationSerializer(serializers.ModelSerializer):
}
class PlatformProtocolsSerializer(serializers.ModelSerializer):
class PlatformProtocolSerializer(serializers.ModelSerializer):
setting = ProtocolSettingSerializer(required=False, allow_null=True)
primary = serializers.BooleanField(read_only=True, label=_("Primary"))
class Meta:
model = PlatformProtocol
fields = [
"id", "name", "port", "primary",
"default", "required", "secret_types",
"setting",
"required", "default",
"secret_types", "setting",
]
@ -91,7 +90,7 @@ class PlatformSerializer(WritableNestedModelSerializer):
)
type = LabeledChoiceField(choices=AllTypes.choices(), label=_("Type"))
category = LabeledChoiceField(choices=Category.choices, label=_("Category"))
protocols = PlatformProtocolsSerializer(
protocols = PlatformProtocolSerializer(
label=_("Protocols"), many=True, required=False
)
automation = PlatformAutomationSerializer(label=_("Automation"), required=False)
@ -126,6 +125,16 @@ class PlatformSerializer(WritableNestedModelSerializer):
)
return queryset
def validate_protocols(self, protocols):
if not protocols:
raise serializers.ValidationError(_("Protocols is required"))
primary = [p for p in protocols if p.get('primary')]
if not primary:
protocols[0]['primary'] = True
# 这里不设置不行write_nested 不使用 validated 中的
self.initial_data['protocols'] = protocols
return protocols
class PlatformOpsMethodSerializer(serializers.Serializer):
id = serializers.CharField(read_only=True)

View File

@ -99,13 +99,33 @@ class JMSInventory:
if gateway:
host.update(self.make_proxy_command(gateway))
@staticmethod
def get_primary_protocol(protocols):
primary_protocol = [p for p in protocols if p.primary]
if len(primary_protocol) >= 1:
primary = primary_protocol[0]
elif protocols:
primary = protocols[0]
else:
primary = None
if primary:
protocol = primary.name
port = primary.port
else:
protocol = 'null'
port = 0
return protocol, port
def asset_to_host(self, asset, account, automation, protocols, platform):
protocol, port = self.get_primary_protocol(protocols)
host = {
'name': '{}'.format(asset.name.replace(' ', '_')),
'jms_asset': {
'id': str(asset.id), 'name': asset.name, 'address': asset.address,
'type': asset.type, 'category': asset.category,
'protocol': asset.protocol, 'port': asset.port,
'protocol': protocol, 'port': port,
'spec_info': asset.spec_info, 'secret_info': asset.secret_info,
'protocols': [{'name': p.name, 'port': p.port} for p in protocols],
},