mirror of https://github.com/jumpserver/jumpserver
perf: 优化 platform
parent
5358f35c08
commit
a0b6849ccb
|
@ -6,6 +6,7 @@ from common.drf.serializers import GroupedChoiceSerailizer
|
|||
from assets.models import Platform
|
||||
from assets.serializers import PlatformSerializer
|
||||
from assets.const import AllTypes, Category
|
||||
from assets.resources.platform import get_platform_methods
|
||||
|
||||
|
||||
__all__ = ['AssetPlatformViewSet']
|
||||
|
@ -21,7 +22,8 @@ class AssetPlatformViewSet(JMSModelViewSet):
|
|||
search_fields = ['name']
|
||||
rbac_perms = {
|
||||
'categories': 'assets.view_platform',
|
||||
'type_constraints': 'assets.view_platform'
|
||||
'type_constraints': 'assets.view_platform',
|
||||
'ops_methods': 'assets.view_platform'
|
||||
}
|
||||
|
||||
@action(methods=['GET'], detail=False)
|
||||
|
@ -37,6 +39,20 @@ class AssetPlatformViewSet(JMSModelViewSet):
|
|||
limits = AllTypes.get_constraints(category, tp)
|
||||
return Response(limits)
|
||||
|
||||
@action(methods=['GET'], detail=False, url_path='ops-methods')
|
||||
def ops_methods(self, request, *args, **kwargs):
|
||||
category = request.query_params.get('category')
|
||||
tp = request.query_params.get('type')
|
||||
item = request.query_params.get('item')
|
||||
methods = get_platform_methods()
|
||||
if category:
|
||||
methods = list(filter(lambda x: x['category'] == category, methods))
|
||||
if tp:
|
||||
methods = list(filter(lambda x: x['type'] == tp, methods))
|
||||
if item:
|
||||
methods = list(filter(lambda x: x.get('method') == item, methods))
|
||||
return Response(methods)
|
||||
|
||||
def check_object_permissions(self, request, obj):
|
||||
if request.method.lower() in ['delete', 'put', 'patch'] and obj.internal:
|
||||
self.permission_denied(
|
||||
|
|
|
@ -3,7 +3,7 @@ import yaml
|
|||
|
||||
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||
|
||||
platform_ops_methods = []
|
||||
platform_ops_methods = None
|
||||
|
||||
|
||||
def get_platform_methods():
|
||||
|
@ -16,29 +16,16 @@ def get_platform_methods():
|
|||
continue
|
||||
manifest_path = os.path.join(path, 'manifest.yml')
|
||||
if not os.path.exists(manifest_path):
|
||||
print("Path not exists: {}".format(manifest_path))
|
||||
continue
|
||||
f = open(manifest_path, 'r')
|
||||
try:
|
||||
manifest = yaml.safe_load(f)
|
||||
except yaml.YAMLError as e:
|
||||
print(e)
|
||||
continue
|
||||
current, category, tp, name = rel_path.split('/')
|
||||
manifest.update({
|
||||
'id': name,
|
||||
'category': category,
|
||||
'type': tp,
|
||||
})
|
||||
methods.append(manifest)
|
||||
return methods
|
||||
|
||||
|
||||
def get_platform_method(platform, method):
|
||||
methods = get_platform_methods()
|
||||
|
||||
def key(m):
|
||||
return m.get('method') == method \
|
||||
and m['category'] == platform.category \
|
||||
and m['type'] == platform.type
|
||||
return list(filter(key, methods))
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
id: change_password_ansible
|
||||
name: Change password using ansible
|
||||
version: 1
|
||||
description: 使用特权账号更改账号的密码
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
id: create_account_ansible
|
||||
name: Create account by ansible
|
||||
version: 1
|
||||
description: 使用特权账号更改账号的密码
|
||||
|
|
|
@ -1,4 +1,8 @@
|
|||
id: verify_account_ansible
|
||||
name: Change password using ansible
|
||||
version: 1
|
||||
description: 使用特权账号更改账号的密码
|
||||
author: ibuler
|
||||
category: host
|
||||
type: linux
|
||||
method: verify_account
|
||||
|
|
|
@ -42,3 +42,4 @@ class NetworkingSerializer(AssetSerializer):
|
|||
class CloudSerializer(AssetSerializer):
|
||||
class Meta(AssetSerializer.Meta):
|
||||
model = Cloud
|
||||
fields = AssetSerializer.Meta.fields + ['cluster']
|
||||
|
|
|
@ -10,7 +10,20 @@ from ..const import Category, AllTypes
|
|||
__all__ = ['PlatformSerializer']
|
||||
|
||||
|
||||
class ProtocolSettingSerializer(serializers.Serializer):
|
||||
SECURITY_CHOICES = [
|
||||
('any', 'Any'),
|
||||
('rdp', 'RDP'),
|
||||
('tls', 'TLS'),
|
||||
('nla', 'NLA'),
|
||||
]
|
||||
console = serializers.BooleanField(required=False)
|
||||
security = serializers.ChoiceField(choices=SECURITY_CHOICES, default='any', required=False)
|
||||
|
||||
|
||||
class PlatformProtocolsSerializer(serializers.ModelSerializer):
|
||||
setting = ProtocolSettingSerializer(required=False)
|
||||
|
||||
class Meta:
|
||||
model = PlatformProtocol
|
||||
fields = ['id', 'name', 'port', 'setting']
|
||||
|
@ -33,18 +46,12 @@ class PlatformSerializer(JMSWritableNestedModelSerializer):
|
|||
'category', 'type',
|
||||
]
|
||||
fields = fields_small + [
|
||||
'domain_enabled', 'domain_default',
|
||||
'su_enabled', 'su_method',
|
||||
'protocols_enabled', 'protocols',
|
||||
'ping_enabled', 'ping_method',
|
||||
'domain_enabled', 'domain_default', 'su_enabled', 'su_method',
|
||||
'protocols_enabled', 'protocols', 'ping_enabled', 'ping_method',
|
||||
'verify_account_enabled', 'verify_account_method',
|
||||
'create_account_enabled', 'create_account_method',
|
||||
'change_password_enabled', 'change_password_method',
|
||||
'type_constraints',
|
||||
'comment', 'charset',
|
||||
]
|
||||
read_only_fields = [
|
||||
'category_display', 'type_display',
|
||||
'type_constraints', 'comment', 'charset',
|
||||
]
|
||||
extra_kwargs = {
|
||||
'su_enabled': {'label': '启用切换账号'},
|
||||
|
@ -56,4 +63,17 @@ class PlatformSerializer(JMSWritableNestedModelSerializer):
|
|||
'change_password_method': {'label': '账号改密方式'},
|
||||
}
|
||||
|
||||
def validate_verify_account_method(self, value):
|
||||
if not value and self.initial_data.get('verify_account_enabled', False):
|
||||
raise serializers.ValidationError(_('This field is required.'))
|
||||
return value
|
||||
|
||||
def validate_create_account_method(self, value):
|
||||
if not value and self.initial_data.get('create_account_enabled', False):
|
||||
raise serializers.ValidationError(_('This field is required.'))
|
||||
return value
|
||||
|
||||
def validate_change_password_method(self, value):
|
||||
if not value and self.initial_data.get('change_password_enabled', False):
|
||||
raise serializers.ValidationError(_('This field is required.'))
|
||||
return value
|
||||
|
|
|
@ -33,7 +33,6 @@ class SimpleMetadataWithFilters(SimpleMetadata):
|
|||
"""
|
||||
actions = {}
|
||||
view.raw_action = getattr(view, 'action', None)
|
||||
print("Request in metadata: ", request.path, request.GET)
|
||||
for method in self.methods & set(view.allowed_methods):
|
||||
if hasattr(view, 'action_map'):
|
||||
view.action = view.action_map.get(method.lower(), view.action)
|
||||
|
|
Loading…
Reference in New Issue