From 01558c985a999cf35d268cd94d825068ce1b8f5a Mon Sep 17 00:00:00 2001 From: ibuler Date: Sun, 3 Dec 2017 20:42:36 +0800 Subject: [PATCH] =?UTF-8?q?[Feture]=20=E6=B7=BB=E5=8A=A0session=20?= =?UTF-8?q?=E5=88=97=E8=A1=A8=EF=BC=8C=E5=B9=B6=E6=94=AF=E6=8C=81kill=20se?= =?UTF-8?q?ssion?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/terminal/api.py | 90 ++++++++++--------- apps/terminal/models.py | 8 +- apps/terminal/serializers.py | 6 +- .../templates/terminal/session_online.html | 29 +++--- apps/terminal/urls/api_urls.py | 7 +- 5 files changed, 75 insertions(+), 65 deletions(-) diff --git a/apps/terminal/api.py b/apps/terminal/api.py index d8b90e734..e58d72bbb 100644 --- a/apps/terminal/api.py +++ b/apps/terminal/api.py @@ -16,8 +16,8 @@ from django.conf import settings from common.utils import get_object_or_none from .models import Terminal, Status, Session, Task -from .serializers import TerminalSerializer, TerminalStatusSerializer, \ - TerminalSessionSerializer, TerminalTaskSerializer +from .serializers import TerminalSerializer, StatusSerializer, \ + SessionSerializer, TaskSerializer from .hands import IsSuperUserOrAppUser, IsAppUser, ProxyLog, \ IsSuperUserOrAppUserOrUserReadonly from .backends import get_command_store, get_replay_store, SessionCommandSerializer @@ -64,48 +64,58 @@ class TerminalViewSet(viewsets.ModelViewSet): return super().get_permissions() -class TerminalStatusViewSet(viewsets.ModelViewSet): +class StatusViewSet(viewsets.ModelViewSet): queryset = Status.objects.all() - serializer_class = TerminalStatusSerializer + serializer_class = StatusSerializer permission_classes = (IsSuperUserOrAppUser,) - session_serializer_class = TerminalSessionSerializer + session_serializer_class = SessionSerializer + task_serializer_class = TaskSerializer def create(self, request, *args, **kwargs): self.handle_sessions() - return super().create(request, *args, **kwargs) + super().create(request, *args, **kwargs) + tasks = self.request.user.terminal.task_set.filter(is_finished=False) + serializer = self.task_serializer_class(tasks, many=True) + return Response(serializer.data, status=201) def handle_sessions(self): sessions_active = [] + for session_data in self.request.data.get("sessions", []): - session_data["terminal"] = self.request.user.terminal.id - _uuid = session_data["uuid"] - session = get_object_or_none(Session, uuid=_uuid) - if session: - serializer = TerminalSessionSerializer( - data=session_data, instance=session - ) - else: - serializer = TerminalSessionSerializer(data=session_data) - - if serializer.is_valid(): - serializer.save() - else: - msg = "session data is not valid {}".format(serializer.errors) - logger.error(msg) - + self.create_or_update_session(session_data) if not session_data["is_finished"]: - sessions_active.append(session_data["id"]) + sessions_active.append(session_data["uuid"]) sessions_in_db_active = Session.objects.filter( - is_finished=False, terminal=self.request.user.terminal.id + is_finished=False, + terminal=self.request.user.terminal.id ) for session in sessions_in_db_active: - if str(session.id) not in sessions_active: + if str(session.uuid) not in sessions_active: session.is_finished = True session.date_end = timezone.now() session.save() + def create_or_update_session(self, session_data): + session_data["terminal"] = self.request.user.terminal.id + _uuid = session_data["uuid"] + session = get_object_or_none(Session, uuid=_uuid) + if session: + serializer = SessionSerializer( + data=session_data, instance=session + ) + else: + serializer = SessionSerializer(data=session_data) + + if serializer.is_valid(): + session = serializer.save() + return session + else: + msg = "session data is not valid {}".format(serializer.errors) + logger.error(msg) + return None + def get_queryset(self): terminal_id = self.kwargs.get("terminal", None) if terminal_id: @@ -123,9 +133,9 @@ class TerminalStatusViewSet(viewsets.ModelViewSet): return super().get_permissions() -class TerminalSessionViewSet(viewsets.ModelViewSet): +class SessionViewSet(viewsets.ModelViewSet): queryset = Session.objects.all() - serializers_class = TerminalSessionSerializer + serializers_class = SessionSerializer permission_classes = (IsSuperUserOrAppUser,) def get_queryset(self): @@ -136,21 +146,21 @@ class TerminalSessionViewSet(viewsets.ModelViewSet): return self.queryset -class TerminalTaskViewSet(viewsets.ModelViewSet): +class TaskViewSet(viewsets.ModelViewSet): queryset = Task.objects.all() - serializer_class = TerminalTaskSerializer + serializer_class = TaskSerializer permission_classes = (IsSuperUserOrAppUser,) - def get_queryset(self): - terminal_id = self.kwargs.get("terminal", None) - if terminal_id: - terminal = get_object_or_404(Terminal, id=terminal_id) - self.queryset = terminal.status_set.all() - - if hasattr(self.request.user, "terminal"): - terminal = self.request.user.terminal - self.queryset = terminal.terminalstatus_set.all() - return self.queryset + # def get_queryset(self): + # terminal_id = self.kwargs.get("terminal", None) + # if terminal_id: + # terminal = get_object_or_404(Terminal, id=terminal_id) + # self.queryset = terminal.status_set.all() + # + # if hasattr(self.request.user, "terminal"): + # terminal = self.request.user.terminal + # self.queryset = terminal.status_set.all() + # return self.queryset class SessionReplayAPI(APIView): @@ -182,7 +192,7 @@ class SessionReplayAPI(APIView): return Response({"session_id": session.id}, status=201) -class SessionCommandViewSet(viewsets.ViewSet): +class CommandViewSet(viewsets.ViewSet): """接受app发送来的command log, 格式如下 { "user": "admin", diff --git a/apps/terminal/models.py b/apps/terminal/models.py index 2e0fe98e2..bfe742f45 100644 --- a/apps/terminal/models.py +++ b/apps/terminal/models.py @@ -94,7 +94,7 @@ class Session(models.Model): is_finished = models.BooleanField(default=False) has_replay = models.BooleanField(default=False, verbose_name=_("Replay")) has_command = models.BooleanField(default=False, verbose_name=_("Command")) - terminal = models.UUIDField(null=True, verbose_name=_("Terminal")) + terminal = models.ForeignKey(Terminal, null=True, on_delete=models.CASCADE) date_start = models.DateTimeField(verbose_name=_("Date Start")) date_end = models.DateTimeField(verbose_name=_("Date End"), null=True) @@ -106,8 +106,12 @@ class Session(models.Model): class Task(models.Model): + NAME_CHOICES = ( + ("kill_session", "Kill Session"), + ) + id = models.UUIDField(default=uuid.uuid4, primary_key=True) - name = models.CharField(max_length=128, verbose_name=_("Name")) + name = models.CharField(max_length=128, choices=NAME_CHOICES, verbose_name=_("Name")) args = models.CharField(max_length=1024, verbose_name=_("Task Args")) terminal = models.ForeignKey(Terminal, null=True, on_delete=models.CASCADE) is_finished = models.BooleanField(default=False) diff --git a/apps/terminal/serializers.py b/apps/terminal/serializers.py index 79d1bc03f..de108a878 100644 --- a/apps/terminal/serializers.py +++ b/apps/terminal/serializers.py @@ -35,21 +35,21 @@ class TerminalSerializer(serializers.ModelSerializer): return False -class TerminalSessionSerializer(serializers.ModelSerializer): +class SessionSerializer(serializers.ModelSerializer): class Meta: model = Session fields = '__all__' -class TerminalStatusSerializer(serializers.ModelSerializer): +class StatusSerializer(serializers.ModelSerializer): class Meta: fields = '__all__' model = Status -class TerminalTaskSerializer(serializers.ModelSerializer): +class TaskSerializer(serializers.ModelSerializer): class Meta: fields = '__all__' diff --git a/apps/terminal/templates/terminal/session_online.html b/apps/terminal/templates/terminal/session_online.html index e190a92ad..ad36b03eb 100644 --- a/apps/terminal/templates/terminal/session_online.html +++ b/apps/terminal/templates/terminal/session_online.html @@ -66,9 +66,8 @@ {% trans 'System user' %} {% trans 'Terminal' %} {% trans 'Command' %} - {% trans 'Success' %} - {% trans 'Finished' %} {% trans 'Monitor' %} + {% trans 'Terminate' %} {% trans 'Date start' %} {% trans 'Time' %} {% endblock %} @@ -85,13 +84,6 @@ {{ session.system_user }} {{ session.terminal.name }} {{ session.commands.all|length}} - - {% if session.is_failed %} - - {% else %} - - {% endif %} - {% if session.is_finished %} @@ -101,10 +93,10 @@ {% else %} - + - + {% endif %} {{ session.date_start }} @@ -131,13 +123,13 @@ {% block custom_foot_js %} {% endblock %} diff --git a/apps/terminal/urls/api_urls.py b/apps/terminal/urls/api_urls.py index c3f7f2123..ba5116842 100644 --- a/apps/terminal/urls/api_urls.py +++ b/apps/terminal/urls/api_urls.py @@ -10,10 +10,11 @@ from .. import api app_name = 'terminal' router = routers.DefaultRouter() -router.register(r'v1/terminal/(?P[0-9]+)?/?status', api.TerminalStatusViewSet, 'terminal-status') -router.register(r'v1/terminal/(?P[0-9]+)?/?sessions', api.TerminalSessionViewSet, 'terminal-sessions') +router.register(r'v1/terminal/(?P[0-9]+)?/?status', api.StatusViewSet, 'terminal-status') +router.register(r'v1/terminal/(?P[0-9]+)?/?sessions', api.SessionViewSet, 'terminal-sessions') +router.register(r'v1/tasks', api.TaskViewSet, 'tasks') router.register(r'v1/terminal', api.TerminalViewSet, 'terminal') -router.register(r'v1/command', api.SessionCommandViewSet, 'command') +router.register(r'v1/command', api.CommandViewSet, 'command') urlpatterns = [ url(r'^v1/sessions/(?P[0-9a-zA-Z\-_]+)/replay/$', api.SessionReplayAPI.as_view(), name='session-replay'),