api.py 8.2 KB
Newer Older
baltery's avatar
baltery 已提交
1 2 3 4 5 6 7
# -*- coding: utf-8 -*-
#

import os
import json
import jms_storage

8
from rest_framework import generics
八千流 已提交
9 10
from rest_framework.views import Response, APIView
from django.conf import settings
baltery's avatar
baltery 已提交
11 12 13 14
from django.core.mail import send_mail
from django.utils.translation import ugettext_lazy as _

from .models import Setting
15
from .utils import LDAPUtil
八千流 已提交
16
from common.permissions import IsOrgAdmin, IsSuperUser
17
from common.utils import get_logger
baltery's avatar
baltery 已提交
18
from .serializers import MailTestSerializer, LDAPTestSerializer, LDAPUserSerializer
baltery's avatar
baltery 已提交
19 20


21 22 23
logger = get_logger(__file__)


baltery's avatar
baltery 已提交
24 25 26 27 28 29 30 31
class MailTestingAPI(APIView):
    permission_classes = (IsOrgAdmin,)
    serializer_class = MailTestSerializer
    success_message = _("Test mail sent to {}, please check")

    def post(self, request):
        serializer = self.serializer_class(data=request.data)
        if serializer.is_valid():
32
            email_from = serializer.validated_data["EMAIL_FROM"]
baltery's avatar
baltery 已提交
33 34 35 36 37 38 39
            email_host_user = serializer.validated_data["EMAIL_HOST_USER"]
            for k, v in serializer.validated_data.items():
                if k.startswith('EMAIL'):
                    setattr(settings, k, v)
            try:
                subject = "Test"
                message = "Test smtp setting"
40
                email_from = email_from or email_host_user
41
                send_mail(subject, message,  email_from, [email_from])
baltery's avatar
baltery 已提交
42 43 44 45 46 47 48 49 50 51 52 53 54
            except Exception as e:
                return Response({"error": str(e)}, status=401)

            return Response({"msg": self.success_message.format(email_host_user)})
        else:
            return Response({"error": str(serializer.errors)}, status=401)


class LDAPTestingAPI(APIView):
    permission_classes = (IsOrgAdmin,)
    serializer_class = LDAPTestSerializer
    success_message = _("Test ldap success")

55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
    @staticmethod
    def get_ldap_util(serializer):
        host = serializer.validated_data["AUTH_LDAP_SERVER_URI"]
        bind_dn = serializer.validated_data["AUTH_LDAP_BIND_DN"]
        password = serializer.validated_data["AUTH_LDAP_BIND_PASSWORD"]
        use_ssl = serializer.validated_data.get("AUTH_LDAP_START_TLS", False)
        search_ougroup = serializer.validated_data["AUTH_LDAP_SEARCH_OU"]
        search_filter = serializer.validated_data["AUTH_LDAP_SEARCH_FILTER"]
        attr_map = serializer.validated_data["AUTH_LDAP_USER_ATTR_MAP"]
        try:
            attr_map = json.loads(attr_map)
        except json.JSONDecodeError:
            return Response({"error": "AUTH_LDAP_USER_ATTR_MAP not valid"}, status=401)

        util = LDAPUtil(
            use_settings_config=False, server_uri=host, bind_dn=bind_dn,
            password=password, use_ssl=use_ssl,
            search_ougroup=search_ougroup, search_filter=search_filter,
            attr_map=attr_map
        )
        return util

baltery's avatar
baltery 已提交
77 78
    def post(self, request):
        serializer = self.serializer_class(data=request.data)
79 80
        if not serializer.is_valid():
            return Response({"error": str(serializer.errors)}, status=401)
baltery's avatar
baltery 已提交
81

82
        util = self.get_ldap_util(serializer)
baltery's avatar
baltery 已提交
83

84
        try:
85
            users = util.search_user_items()
86 87
        except Exception as e:
            return Response({"error": str(e)}, status=401)
baltery's avatar
baltery 已提交
88

89 90
        if len(users) > 0:
            return Response({"msg": _("Match {} s users").format(len(users))})
baltery's avatar
baltery 已提交
91
        else:
92
            return Response({"error": "Have user but attr mapping error"}, status=401)
baltery's avatar
baltery 已提交
93 94


95
class LDAPUserListApi(generics.ListAPIView):
八千流 已提交
96
    permission_classes = (IsOrgAdmin,)
baltery's avatar
baltery 已提交
97
    serializer_class = LDAPUserSerializer
八千流 已提交
98

99
    def get_queryset(self):
100 101
        util = LDAPUtil()
        try:
102
            users = util.search_user_items()
103 104
        except Exception as e:
            users = []
baltery's avatar
baltery 已提交
105
            logger.error(e)
106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
        # 前端data_table会根据row.id对table.selected值进行操作
        for user in users:
            user['id'] = user['username']
        return users

    def filter_queryset(self, queryset):
        search = self.request.query_params.get('search')
        if not search:
            return queryset
        search = search.lower()
        queryset = [
            q for q in queryset
            if
            search in q['username'].lower()
            or search in q['name'].lower()
            or search in q['email'].lower()
        ]
        return queryset

    def sort_queryset(self, queryset):
        order_by = self.request.query_params.get('order')
        if not order_by:
            order_by = 'existing'
        if order_by.startswith('-'):
            order_by = order_by.lstrip('-')
            reverse = True
132
        else:
133 134 135 136 137 138 139 140 141 142 143
            reverse = False
        queryset = sorted(queryset, key=lambda x: x[order_by], reverse=reverse)
        return queryset

    def list(self, request, *args, **kwargs):
        queryset = self.filter_queryset(self.get_queryset())
        queryset = self.sort_queryset(queryset)
        page = self.paginate_queryset(queryset)
        if page is not None:
            return self.get_paginated_response(page)
        return Response(queryset)
八千流 已提交
144 145


146
class LDAPUserSyncAPI(APIView):
八千流 已提交
147 148 149
    permission_classes = (IsOrgAdmin,)

    def post(self, request):
150
        username_list = request.data.get('username_list', [])
151 152 153

        util = LDAPUtil()
        try:
154
            result = util.sync_users(username_list)
155 156 157 158 159 160 161 162
        except Exception as e:
            logger.error(e, exc_info=True)
            return Response({'error': str(e)}, status=401)
        else:
            msg = _("succeed: {} failed: {} total: {}").format(
                result['succeed'], result['failed'], result['total']
            )
            return Response({'msg': msg})
八千流 已提交
163 164


baltery's avatar
baltery 已提交
165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243
class ReplayStorageCreateAPI(APIView):
    permission_classes = (IsSuperUser,)

    def post(self, request):
        storage_data = request.data

        if storage_data.get('TYPE') == 'ceph':
            port = storage_data.get('PORT')
            if port.isdigit():
                storage_data['PORT'] = int(storage_data.get('PORT'))

        storage_name = storage_data.pop('NAME')
        data = {storage_name: storage_data}

        if not self.is_valid(storage_data):
            return Response({
                "error": _("Error: Account invalid (Please make sure the "
                           "information such as Access key or Secret key is correct)")},
                status=401
            )

        Setting.save_storage('TERMINAL_REPLAY_STORAGE', data)
        return Response({"msg": _('Create succeed')}, status=200)

    @staticmethod
    def is_valid(storage_data):
        if storage_data.get('TYPE') == 'server':
            return True
        storage = jms_storage.get_object_storage(storage_data)
        target = 'tests.py'
        src = os.path.join(settings.BASE_DIR, 'common', target)
        return storage.is_valid(src, target)


class ReplayStorageDeleteAPI(APIView):
    permission_classes = (IsSuperUser,)

    def post(self, request):
        storage_name = str(request.data.get('name'))
        Setting.delete_storage('TERMINAL_REPLAY_STORAGE', storage_name)
        return Response({"msg": _('Delete succeed')}, status=200)


class CommandStorageCreateAPI(APIView):
    permission_classes = (IsSuperUser,)

    def post(self, request):
        storage_data = request.data
        storage_name = storage_data.pop('NAME')
        data = {storage_name: storage_data}
        if not self.is_valid(storage_data):
            return Response(
                {"error": _("Error: Account invalid (Please make sure the "
                            "information such as Access key or Secret key is correct)")},
                status=401
            )

        Setting.save_storage('TERMINAL_COMMAND_STORAGE', data)
        return Response({"msg": _('Create succeed')}, status=200)

    @staticmethod
    def is_valid(storage_data):
        if storage_data.get('TYPE') == 'server':
            return True
        try:
            storage = jms_storage.get_log_storage(storage_data)
        except Exception:
            return False

        return storage.ping()


class CommandStorageDeleteAPI(APIView):
    permission_classes = (IsSuperUser,)

    def post(self, request):
        storage_name = str(request.data.get('name'))
        Setting.delete_storage('TERMINAL_COMMAND_STORAGE', storage_name)
        return Response({"msg": _('Delete succeed')}, status=200)