diff --git a/Dockerfile b/Dockerfile index c0fc19fa2..e2ec06457 100644 --- a/Dockerfile +++ b/Dockerfile @@ -63,9 +63,9 @@ RUN mkdir -p /opt/oracle/ \ WORKDIR /tmp/build COPY ./requirements ./requirements -ARG PIP_MIRROR=https://mirrors.aliyun.com/pypi/simple/ +ARG PIP_MIRROR=https://pypi.douban.com/simple ENV PIP_MIRROR=$PIP_MIRROR -ARG PIP_JMS_MIRROR=https://mirrors.aliyun.com/pypi/simple/ +ARG PIP_JMS_MIRROR=https://pypi.douban.com/simple ENV PIP_JMS_MIRROR=$PIP_JMS_MIRROR # 因为以 jms 或者 jumpserver 开头的 mirror 上可能没有 RUN pip install --upgrade pip==20.2.4 setuptools==49.6.0 wheel==0.34.2 -i ${PIP_MIRROR} \ diff --git a/apps/audits/api.py b/apps/audits/api.py index ca0e4d86a..ff1bb0309 100644 --- a/apps/audits/api.py +++ b/apps/audits/api.py @@ -12,6 +12,7 @@ from common.api import CommonGenericViewSet from orgs.mixins.api import OrgGenericViewSet, OrgBulkModelViewSet, OrgRelationMixin from orgs.utils import current_org from ops.models import CommandExecution +from . import filters from .models import FTPLog, UserLoginLog, OperateLog, PasswordChangeLog from .serializers import FTPLogSerializer, UserLoginLogSerializer, CommandExecutionSerializer from .serializers import OperateLogSerializer, PasswordChangeLogSerializer, CommandExecutionHostsRelationSerializer @@ -126,12 +127,7 @@ class CommandExecutionViewSet(ListModelMixin, OrgGenericViewSet): class CommandExecutionHostRelationViewSet(OrgRelationMixin, OrgBulkModelViewSet): serializer_class = CommandExecutionHostsRelationSerializer m2m_field = CommandExecution.hosts.field - filterset_fields = { - 'id': ['exact'], - 'asset': ['exact'], - 'asset__hostname': ['icontains'], - 'commandexecution': ['exact'], - } + filterset_class = filters.CommandExecutionFilter search_fields = ('asset__hostname', ) http_method_names = ['options', 'get'] rbac_perms = { diff --git a/apps/audits/filters.py b/apps/audits/filters.py index 470c2c4b5..b8bf466ec 100644 --- a/apps/audits/filters.py +++ b/apps/audits/filters.py @@ -1,10 +1,14 @@ +from django.db.models import F, Value +from django.db.models.functions import Concat +from django_filters.rest_framework import CharFilter from rest_framework import filters from rest_framework.compat import coreapi, coreschema from orgs.utils import current_org +from ops.models import CommandExecution +from common.drf.filters import BaseFilterSet - -__all__ = ['CurrentOrgMembersFilter'] +__all__ = ['CurrentOrgMembersFilter', 'CommandExecutionFilter'] class CurrentOrgMembersFilter(filters.BaseFilterBackend): @@ -30,3 +34,22 @@ class CurrentOrgMembersFilter(filters.BaseFilterBackend): else: queryset = queryset.filter(user__in=self._get_user_list()) return queryset + + +class CommandExecutionFilter(BaseFilterSet): + hostname_ip = CharFilter(method='filter_hostname_ip') + + class Meta: + model = CommandExecution.hosts.through + fields = ( + 'id', 'asset', 'commandexecution', 'hostname_ip' + ) + + def filter_hostname_ip(self, queryset, name, value): + queryset = queryset.annotate( + hostname_ip=Concat( + F('asset__hostname'), Value('('), + F('asset__ip'), Value(')') + ) + ).filter(hostname_ip__icontains=value) + return queryset diff --git a/apps/users/models/user.py b/apps/users/models/user.py index 9fd6ea0b9..78d5eb540 100644 --- a/apps/users/models/user.py +++ b/apps/users/models/user.py @@ -800,7 +800,8 @@ class User(AuthMixin, TokenMixin, RoleMixin, MFAMixin, AbstractUser): def is_password_authenticate(self): cas = self.Source.cas saml2 = self.Source.saml2 - return self.source not in [cas, saml2] + oauth2 = self.Source.oauth2 + return self.source not in [cas, saml2, oauth2] def set_unprovide_attr_if_need(self): if not self.name: