diff --git a/apps/jumpserver/settings.py b/apps/jumpserver/settings.py index 6f9880acc..e06158852 100644 --- a/apps/jumpserver/settings.py +++ b/apps/jumpserver/settings.py @@ -284,7 +284,6 @@ BROKER_URL = 'redis://%(password)s%(host)s:%(port)s/3' % { } CELERY_RESULT_BACKEND = BROKER_URL - # Cache use redis CACHES = { 'default': { diff --git a/apps/terminal/api.py b/apps/terminal/api.py index e76cf2783..a895723d4 100644 --- a/apps/terminal/api.py +++ b/apps/terminal/api.py @@ -1,52 +1,63 @@ # -*- coding: utf-8 -*- # +from django.core.cache import cache +from django.conf import settings from rest_framework.generics import ListCreateAPIView, RetrieveUpdateDestroyAPIView from rest_framework.views import APIView, Response +from rest_framework.viewsets import ModelViewSet from rest_framework.permissions import AllowAny from common.utils import signer, get_object_or_none -from .models import Terminal, TerminalHeatbeat +from .models import Terminal, HeatbeatFailedLog from .serializers import TerminalSerializer, TerminalHeatbeatSerializer from .hands import IsSuperUserOrTerminalUser -class TerminalCreateListApi(ListCreateAPIView): +class TerminalViewSet(ModelViewSet): queryset = Terminal.objects.all() serializer_class = TerminalSerializer permission_classes = (AllowAny,) - def post(self, request, *args, **kwargs): + def create(self, request, *args, **kwargs): name = signer.unsign(request.data.get('name', '')) if name: terminal = get_object_or_none(Terminal, name=name) if terminal: + data = { + 'data': {'name': name, 'id': terminal.id}, + } if terminal.is_active: - return Response(data={'data': {'name': name, 'id': terminal.id}, - 'msg': 'Success'}, - status=200) + data['msg'] = 'Success' + return Response(data=data, status=200) else: - return Response(data={'data': {'name': name, 'ip': terminal.ip}, - 'msg': 'Need admin active it'}, - status=203) + data['msg'] = 'Need admin active this terminal' + return Response(data=data, status=203) else: ip = request.META.get('X-Real-IP') or request.META.get('REMOTE_ADDR') terminal = Terminal.objects.create(name=name, ip=ip) - return Response(data={'data': {'name': name, 'ip': terminal.ip}, - 'msg': 'Need admin active it'}, - status=201) + data = { + 'data': {'name': name, 'id': terminal.id}, + 'msg': 'Need admin active this terminal', + } + return Response(data=data, status=201) else: return Response(data={'msg': 'Secrete key invalid'}, status=401) -class TerminalHeatbeatApi(ListCreateAPIView): - model = TerminalHeatbeat - serializer_class = TerminalHeatbeatSerializer +class TerminalHeatbeatApi(APIView): + # model = HeatbeatFailedLog + # serializer_class = TerminalHeatbeatSerializer permission_classes = (IsSuperUserOrTerminalUser,) + def put(self, request, *args, **kwargs): + terminal_id = request.user.id + cache.set('terminal_heatbeat_%s' % terminal_id, settings.CONFIG.TERMINAL_HEATBEAT_INTERVAL * 3) + return Response({'msg': 'Success'}) -class TerminalApiDetailUpdateDetailApi(RetrieveUpdateDestroyAPIView): - queryset = Terminal.objects.all() - serializer_class = TerminalSerializer - permission_classes = (IsSuperUserOrTerminalUser,) + +# class TerminalApiDetailUpdateDetailApi(RetrieveUpdateDestroyAPIView): +# queryset = Terminal.objects.all() +# serializer_class = TerminalSerializer +# permission_classes = (IsSuperUserOrTerminalUser,) diff --git a/apps/terminal/models.py b/apps/terminal/models.py index 8b65ed6da..e64a43d89 100644 --- a/apps/terminal/models.py +++ b/apps/terminal/models.py @@ -36,9 +36,10 @@ class Terminal(models.Model): ordering = ['is_active'] -class TerminalHeatbeat(models.Model): +class HeatbeatFailedLog(models.Model): + """Terminal heatbeat failed log""" terminal = models.ForeignKey(Terminal, on_delete=models.CASCADE) date_created = models.DateTimeField(auto_now_add=True) class Meta: - db_table = 'terminal_heatbeat' + db_table = 'heatbeat_failed_log' diff --git a/apps/terminal/serializers.py b/apps/terminal/serializers.py index 5bac8e11b..d025f7254 100644 --- a/apps/terminal/serializers.py +++ b/apps/terminal/serializers.py @@ -3,26 +3,26 @@ from rest_framework import serializers -from .models import Terminal, TerminalHeatbeat +from .models import Terminal, HeatbeatFailedLog from .hands import ProxyLog class TerminalSerializer(serializers.ModelSerializer): - proxy_amount = serializers.SerializerMethodField() + proxy_online = serializers.SerializerMethodField() class Meta: model = Terminal - fields = ['id', 'name', 'ip', 'type', 'url', 'comment', 'is_active', - 'get_type_display', 'proxy_amount'] + fields = ['id', 'name', 'ip', 'type', 'url', 'comment', + 'is_active', 'get_type_display', 'proxy_online'] @staticmethod - def get_proxy_amount(obj): + def get_proxy_online(obj): return ProxyLog.objects.filter(terminal=obj.name, is_finished=False).count() class TerminalHeatbeatSerializer(serializers.ModelSerializer): class Meta: - model = TerminalHeatbeat + model = HeatbeatFailedLog fields = ['terminal'] diff --git a/apps/terminal/templates/terminal/terminal_list.html b/apps/terminal/templates/terminal/terminal_list.html index 60db0c104..0440a2d0c 100644 --- a/apps/terminal/templates/terminal/terminal_list.html +++ b/apps/terminal/templates/terminal/terminal_list.html @@ -27,8 +27,9 @@