mirror of https://github.com/jumpserver/jumpserver
feat: 命令记录接口增加 remote_addr 字段
parent
89cad224c5
commit
35a10fdd62
|
@ -9,7 +9,7 @@ from rest_framework.fields import DateTimeField
|
|||
from rest_framework.response import Response
|
||||
from django.template import loader
|
||||
|
||||
from terminal.models import CommandStorage
|
||||
from terminal.models import CommandStorage, Session
|
||||
from terminal.filters import CommandFilter
|
||||
from orgs.utils import current_org
|
||||
from common.permissions import IsOrgAdminOrAppUser, IsOrgAuditor, IsAppUser
|
||||
|
@ -146,15 +146,26 @@ class CommandViewSet(JMSBulkModelViewSet):
|
|||
|
||||
page = self.paginate_queryset(queryset)
|
||||
if page is not None:
|
||||
page = self.load_remote_addr(page)
|
||||
serializer = self.get_serializer(page, many=True)
|
||||
return self.get_paginated_response(serializer.data)
|
||||
|
||||
# 适配像 ES 这种没有指定分页只返回少量数据的情况
|
||||
queryset = queryset[:]
|
||||
|
||||
queryset = self.load_remote_addr(queryset)
|
||||
serializer = self.get_serializer(queryset, many=True)
|
||||
return Response(serializer.data)
|
||||
|
||||
def load_remote_addr(self, queryset):
|
||||
commands = list(queryset)
|
||||
session_ids = {command.session for command in commands}
|
||||
sessions = Session.objects.filter(id__in=session_ids).values_list('id', 'remote_addr')
|
||||
session_addr_map = {str(i): addr for i, addr in sessions}
|
||||
for command in commands:
|
||||
command.remote_addr = session_addr_map.get(command.session, '')
|
||||
return commands
|
||||
|
||||
def get_queryset(self):
|
||||
command_storage_id = self.request.query_params.get('command_storage_id')
|
||||
storage = CommandStorage.objects.get(id=command_storage_id)
|
||||
|
|
|
@ -4,6 +4,7 @@ import uuid
|
|||
from django.db import models
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from common.utils.common import lazyproperty
|
||||
from orgs.mixins.models import OrgModelMixin
|
||||
|
||||
|
||||
|
@ -27,6 +28,15 @@ class AbstractSessionCommand(OrgModelMixin):
|
|||
class Meta:
|
||||
abstract = True
|
||||
|
||||
@lazyproperty
|
||||
def remote_addr(self):
|
||||
from terminal.models import Session
|
||||
session = Session.objects.filter(id=self.session).first()
|
||||
if session:
|
||||
return session.remote_addr
|
||||
else:
|
||||
return ''
|
||||
|
||||
@classmethod
|
||||
def get_risk_level_str(cls, risk_level):
|
||||
risk_mapper = dict(cls.RISK_LEVEL_CHOICES)
|
||||
|
|
|
@ -19,6 +19,7 @@ class SessionCommandSerializer(serializers.Serializer):
|
|||
risk_level_display = serializers.SerializerMethodField(label=_('Risk level display'))
|
||||
org_id = serializers.CharField(max_length=36, required=False, default='', allow_null=True, allow_blank=True)
|
||||
timestamp = serializers.IntegerField(label=_('Timestamp'))
|
||||
remote_addr = serializers.CharField(read_only=True, label=_('Remote Address'))
|
||||
|
||||
@staticmethod
|
||||
def get_risk_level_display(obj):
|
||||
|
|
Loading…
Reference in New Issue