mirror of
https://github.com/jumpserver/jumpserver.git
synced 2025-09-16 07:18:22 +00:00
feat: 添加Endpoint (#8041)
* feat: add Endpoint EndpointRule EndpointProtocol model * feat: add Endpoint EndpointRule EndpointProtocol API * feat: modify protocols field * feat: 修改序列类 * feat: 获取connect-url连接地址 * feat: 获取connect-url连接地址 * feat: 优化后台获取smart-endpoint逻辑 * feat: 优化后台获取smart-endpoint逻辑 * feat: 删除配置KOKO、XRDP、MAGNUS * feat: 删除配置KOKO、XRDP、MAGNUS * feat: 修改翻译 * feat: 修改smart endpoint * feat: 修改翻译 * feat: smart API 添加token解析 * feat: 删除 smart serializer * feat: 修改迁移逻辑 * feat: 解决冲突 * feat: 修改匹配 endpoint Co-authored-by: Jiangjie.Bai <bugatti_it@163.com>
This commit is contained in:
@@ -7,3 +7,4 @@ from .task import *
|
||||
from .storage import *
|
||||
from .status import *
|
||||
from .sharing import *
|
||||
from .endpoint import *
|
||||
|
78
apps/terminal/api/endpoint.py
Normal file
78
apps/terminal/api/endpoint.py
Normal file
@@ -0,0 +1,78 @@
|
||||
from rest_framework.decorators import action
|
||||
from rest_framework.response import Response
|
||||
from rest_framework import status
|
||||
from common.drf.api import JMSBulkModelViewSet
|
||||
from common.utils import get_object_or_none
|
||||
from django.shortcuts import get_object_or_404
|
||||
from assets.models import Asset
|
||||
from orgs.utils import tmp_to_root_org
|
||||
from applications.models import Application
|
||||
from terminal.models import Session
|
||||
from ..models import Endpoint, EndpointRule
|
||||
from .. import serializers
|
||||
|
||||
|
||||
__all__ = ['EndpointViewSet', 'EndpointRuleViewSet']
|
||||
|
||||
|
||||
class EndpointViewSet(JMSBulkModelViewSet):
|
||||
filterset_fields = ('name', 'host')
|
||||
search_fields = filterset_fields
|
||||
serializer_class = serializers.EndpointSerializer
|
||||
queryset = Endpoint.objects.all()
|
||||
rbac_perms = {
|
||||
'smart': 'terminal.view_endpoint'
|
||||
}
|
||||
|
||||
@staticmethod
|
||||
def get_target_ip(request):
|
||||
# 用来方便测试
|
||||
target_ip = request.GET.get('target_ip')
|
||||
if target_ip:
|
||||
return target_ip
|
||||
|
||||
asset_id = request.GET.get('asset_id')
|
||||
app_id = request.GET.get('app_id')
|
||||
session_id = request.GET.get('session_id')
|
||||
token = request.GET.get('token')
|
||||
if token:
|
||||
from authentication.api.connection_token import TokenCacheMixin as TokenUtil
|
||||
value = TokenUtil().get_token_from_cache(token)
|
||||
if value:
|
||||
if value.get('type') == 'asset':
|
||||
asset_id = value.get('asset')
|
||||
else:
|
||||
app_id = value.get('application')
|
||||
if asset_id:
|
||||
pk, model = asset_id, Asset
|
||||
elif app_id:
|
||||
pk, model = app_id, Application
|
||||
elif session_id:
|
||||
pk, model = session_id, Session
|
||||
else:
|
||||
return ''
|
||||
|
||||
with tmp_to_root_org():
|
||||
instance = get_object_or_404(model, pk=pk)
|
||||
target_ip = instance.get_target_ip()
|
||||
return target_ip
|
||||
|
||||
@action(methods=['get'], detail=False, url_path='smart')
|
||||
def smart(self, request, *args, **kwargs):
|
||||
protocol = request.GET.get('protocol')
|
||||
if not protocol:
|
||||
return Response(
|
||||
data={'error': _('Not found protocol query params')},
|
||||
status=status.HTTP_404_NOT_FOUND
|
||||
)
|
||||
target_ip = self.get_target_ip(request)
|
||||
endpoint = EndpointRule.match_endpoint(target_ip, protocol, request)
|
||||
serializer = self.get_serializer(endpoint)
|
||||
return Response(serializer.data)
|
||||
|
||||
|
||||
class EndpointRuleViewSet(JMSBulkModelViewSet):
|
||||
filterset_fields = ('name',)
|
||||
search_fields = filterset_fields
|
||||
serializer_class = serializers.EndpointRuleSerializer
|
||||
queryset = EndpointRule.objects.all()
|
Reference in New Issue
Block a user