mirror of https://github.com/jumpserver/jumpserver
Merge pull request #10032 from jumpserver/pr@dev@platform_set_protocols
perf: 修改 platform protocolspull/10034/head
commit
8289e4c2c8
|
@ -6,8 +6,10 @@ from .protocol import Protocol
|
||||||
|
|
||||||
class BaseType(TextChoices):
|
class BaseType(TextChoices):
|
||||||
"""
|
"""
|
||||||
约束应该考虑代是对平台对限制,避免多余对选项,如: mysql 开启 ssh, 或者开启了也没有作用, 比如 k8s 开启了 domain,目前还不支持
|
约束应该考虑代是对平台对限制,避免多余对选项,如: mysql 开启 ssh,
|
||||||
|
或者开启了也没有作用, 比如 k8s 开启了 domain,目前还不支持
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def get_constrains(cls):
|
def get_constrains(cls):
|
||||||
constrains = {}
|
constrains = {}
|
||||||
|
@ -36,7 +38,7 @@ class BaseType(TextChoices):
|
||||||
if choices == '__self__':
|
if choices == '__self__':
|
||||||
choices = [tp]
|
choices = [tp]
|
||||||
protocols = [{'name': name, **settings.get(name, {})} for name in choices]
|
protocols = [{'name': name, **settings.get(name, {})} for name in choices]
|
||||||
protocols[0]['primary'] = True
|
protocols[0]['default'] = True
|
||||||
return protocols
|
return protocols
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
|
@ -74,5 +76,3 @@ class BaseType(TextChoices):
|
||||||
choice for choice in cls_choices
|
choice for choice in cls_choices
|
||||||
if choice[0] in tps
|
if choice[0] in tps
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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),
|
||||||
|
]
|
|
@ -191,25 +191,6 @@ class Asset(NodesRelationMixin, AbsConnectivity, JMSOrgBaseModel):
|
||||||
names.append(n.name + ':' + n.value)
|
names.append(n.name + ':' + n.value)
|
||||||
return names
|
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
|
@lazyproperty
|
||||||
def type(self):
|
def type(self):
|
||||||
return self.platform.type
|
return self.platform.type
|
||||||
|
|
|
@ -10,29 +10,17 @@ __all__ = ['Platform', 'PlatformProtocol', 'PlatformAutomation']
|
||||||
|
|
||||||
|
|
||||||
class PlatformProtocol(models.Model):
|
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'))
|
name = models.CharField(max_length=32, verbose_name=_('Name'))
|
||||||
port = models.IntegerField(verbose_name=_('Port'))
|
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)
|
setting = models.JSONField(verbose_name=_('Setting'), default=dict)
|
||||||
platform = models.ForeignKey('Platform', on_delete=models.CASCADE, related_name='protocols')
|
platform = models.ForeignKey('Platform', on_delete=models.CASCADE, related_name='protocols')
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return '{}/{}'.format(self.name, self.port)
|
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
|
@property
|
||||||
def secret_types(self):
|
def secret_types(self):
|
||||||
return Protocol.settings().get(self.name, {}).get('secret_types')
|
return Protocol.settings().get(self.name, {}).get('secret_types')
|
||||||
|
@ -100,11 +88,6 @@ class Platform(JMSBaseModel):
|
||||||
)
|
)
|
||||||
return linux.id
|
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):
|
def __str__(self):
|
||||||
return self.name
|
return self.name
|
||||||
|
|
||||||
|
|
|
@ -72,16 +72,15 @@ class PlatformAutomationSerializer(serializers.ModelSerializer):
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
class PlatformProtocolsSerializer(serializers.ModelSerializer):
|
class PlatformProtocolSerializer(serializers.ModelSerializer):
|
||||||
setting = ProtocolSettingSerializer(required=False, allow_null=True)
|
setting = ProtocolSettingSerializer(required=False, allow_null=True)
|
||||||
primary = serializers.BooleanField(read_only=True, label=_("Primary"))
|
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = PlatformProtocol
|
model = PlatformProtocol
|
||||||
fields = [
|
fields = [
|
||||||
"id", "name", "port", "primary",
|
"id", "name", "port", "primary",
|
||||||
"default", "required", "secret_types",
|
"required", "default",
|
||||||
"setting",
|
"secret_types", "setting",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
@ -91,7 +90,7 @@ class PlatformSerializer(WritableNestedModelSerializer):
|
||||||
)
|
)
|
||||||
type = LabeledChoiceField(choices=AllTypes.choices(), label=_("Type"))
|
type = LabeledChoiceField(choices=AllTypes.choices(), label=_("Type"))
|
||||||
category = LabeledChoiceField(choices=Category.choices, label=_("Category"))
|
category = LabeledChoiceField(choices=Category.choices, label=_("Category"))
|
||||||
protocols = PlatformProtocolsSerializer(
|
protocols = PlatformProtocolSerializer(
|
||||||
label=_("Protocols"), many=True, required=False
|
label=_("Protocols"), many=True, required=False
|
||||||
)
|
)
|
||||||
automation = PlatformAutomationSerializer(label=_("Automation"), required=False)
|
automation = PlatformAutomationSerializer(label=_("Automation"), required=False)
|
||||||
|
@ -126,6 +125,16 @@ class PlatformSerializer(WritableNestedModelSerializer):
|
||||||
)
|
)
|
||||||
return queryset
|
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):
|
class PlatformOpsMethodSerializer(serializers.Serializer):
|
||||||
id = serializers.CharField(read_only=True)
|
id = serializers.CharField(read_only=True)
|
||||||
|
|
|
@ -99,13 +99,33 @@ class JMSInventory:
|
||||||
if gateway:
|
if gateway:
|
||||||
host.update(self.make_proxy_command(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):
|
def asset_to_host(self, asset, account, automation, protocols, platform):
|
||||||
|
protocol, port = self.get_primary_protocol(protocols)
|
||||||
|
|
||||||
host = {
|
host = {
|
||||||
'name': '{}'.format(asset.name.replace(' ', '_')),
|
'name': '{}'.format(asset.name.replace(' ', '_')),
|
||||||
'jms_asset': {
|
'jms_asset': {
|
||||||
'id': str(asset.id), 'name': asset.name, 'address': asset.address,
|
'id': str(asset.id), 'name': asset.name, 'address': asset.address,
|
||||||
'type': asset.type, 'category': asset.category,
|
'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,
|
'spec_info': asset.spec_info, 'secret_info': asset.secret_info,
|
||||||
'protocols': [{'name': p.name, 'port': p.port} for p in protocols],
|
'protocols': [{'name': p.name, 'port': p.port} for p in protocols],
|
||||||
},
|
},
|
||||||
|
|
Loading…
Reference in New Issue