mirror of https://github.com/jumpserver/jumpserver
				
				
				
			[Update] 优化使用storage sdk
							parent
							
								
									46520287d9
								
							
						
					
					
						commit
						d615eb80b5
					
				|  | @ -9,6 +9,7 @@ from django.core.cache import cache | |||
| from django.shortcuts import get_object_or_404, redirect | ||||
| from django.utils import timezone | ||||
| from django.core.files.storage import default_storage | ||||
| from django.http.response import HttpResponseRedirectBase | ||||
| from django.http import HttpResponseNotFound | ||||
| from django.conf import settings | ||||
| 
 | ||||
|  | @ -25,7 +26,7 @@ from .serializers import TerminalSerializer, StatusSerializer, \ | |||
|     SessionSerializer, TaskSerializer, ReplaySerializer | ||||
| from .hands import IsSuperUserOrAppUser, IsAppUser, \ | ||||
|     IsSuperUserOrAppUserOrUserReadonly | ||||
| from .backends import get_command_store, get_multi_command_store, \ | ||||
| from .backends import get_command_storage, get_multi_command_storage, \ | ||||
|     SessionCommandSerializer | ||||
| 
 | ||||
| logger = logging.getLogger(__file__) | ||||
|  | @ -227,8 +228,8 @@ class CommandViewSet(viewsets.ViewSet): | |||
|     } | ||||
| 
 | ||||
|     """ | ||||
|     command_store = get_command_store() | ||||
|     multi_command_storage = get_multi_command_store() | ||||
|     command_store = get_command_storage() | ||||
|     multi_command_storage = get_multi_command_storage() | ||||
|     serializer_class = SessionCommandSerializer | ||||
|     permission_classes = (IsSuperUserOrAppUser,) | ||||
| 
 | ||||
|  | @ -291,19 +292,20 @@ class SessionReplayViewSet(viewsets.ViewSet): | |||
|             url = default_storage.url(path) | ||||
|             return redirect(url) | ||||
|         else: | ||||
|             configs = settings.TERMINAL_REPLAY_STORAGE.items() | ||||
|             configs = settings.TERMINAL_REPLAY_STORAGE | ||||
|             configs = [cfg for cfg in configs if cfg['TYPE'] != 'server'] | ||||
|             if not configs: | ||||
|                 return HttpResponseNotFound() | ||||
| 
 | ||||
|             for name, config in configs: | ||||
|                 client = jms_storage.init(config) | ||||
|                 date = self.session.date_start.strftime('%Y-%m-%d') | ||||
|                 file_path = os.path.join(date, str(self.session.id) + '.replay.gz') | ||||
|                 target_path = default_storage.base_location + '/' + path | ||||
| 
 | ||||
|                 if client and client.has_file(file_path) and \ | ||||
|                         client.download_file(file_path, target_path): | ||||
|                     return redirect(default_storage.url(path)) | ||||
|             date = self.session.date_start.strftime('%Y-%m-%d') | ||||
|             file_path = os.path.join(date, str(self.session.id) + '.replay.gz') | ||||
|             target_path = default_storage.base_location + '/' + path | ||||
|             storage = jms_storage.get_multi_object_storage(configs) | ||||
|             ok, err = storage.download(file_path, target_path) | ||||
|             if ok: | ||||
|                 return redirect(default_storage.url(path)) | ||||
|             else: | ||||
|                 logger.error("Failed download replay file: {}".format(err)) | ||||
|         return HttpResponseNotFound() | ||||
| 
 | ||||
| 
 | ||||
|  | @ -313,34 +315,14 @@ class SessionReplayV2ViewSet(SessionReplayViewSet): | |||
|     session = None | ||||
| 
 | ||||
|     def retrieve(self, request, *args, **kwargs): | ||||
|         session_id = kwargs.get('pk') | ||||
|         self.session = get_object_or_404(Session, id=session_id) | ||||
|         path = self.gen_session_path() | ||||
|         response = super().retrieve(request, *args, **kwargs) | ||||
|         data = { | ||||
|             'type': 'guacamole' if self.session.protocol == 'rdp' else 'json', | ||||
|             'src': '', | ||||
|         } | ||||
| 
 | ||||
|         if default_storage.exists(path): | ||||
|             url = default_storage.url(path) | ||||
|             data['src'] = url | ||||
|         if isinstance(response, HttpResponseRedirectBase): | ||||
|             data['src'] = response.url | ||||
|             return Response(data) | ||||
|         else: | ||||
|             configs = settings.TERMINAL_REPLAY_STORAGE.items() | ||||
|             if not configs: | ||||
|                 return HttpResponseNotFound() | ||||
| 
 | ||||
|             for name, config in configs: | ||||
|                 client = jms_storage.init(config) | ||||
|                 date = self.session.date_start.strftime('%Y-%m-%d') | ||||
|                 file_path = os.path.join(date, str(self.session.id) + '.replay.gz') | ||||
|                 target_path = default_storage.base_location + '/' + path | ||||
| 
 | ||||
|                 if client and client.has_file(file_path) and \ | ||||
|                         client.download_file(file_path, target_path): | ||||
|                     url = default_storage.url(path) | ||||
|                     data['src'] = url | ||||
|                     return Response(data) | ||||
|         return HttpResponseNotFound() | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
|  | @ -7,19 +7,19 @@ TYPE_ENGINE_MAPPING = { | |||
| } | ||||
| 
 | ||||
| 
 | ||||
| def get_command_store(): | ||||
|     params = settings.COMMAND_STORAGE | ||||
|     engine_class = import_module(params['ENGINE']) | ||||
|     storage = engine_class.CommandStore(params) | ||||
| def get_command_storage(): | ||||
|     config = settings.COMMAND_STORAGE | ||||
|     engine_class = import_module(config['ENGINE']) | ||||
|     storage = engine_class.CommandStore(config) | ||||
|     return storage | ||||
| 
 | ||||
| 
 | ||||
| def get_terminal_command_store(): | ||||
| def get_terminal_command_storages(): | ||||
|     storage_list = {} | ||||
|     for name, params in settings.TERMINAL_COMMAND_STORAGE.items(): | ||||
|         tp = params['TYPE'] | ||||
|         if tp == 'server': | ||||
|             storage = get_command_store() | ||||
|             storage = get_command_storage() | ||||
|         else: | ||||
|             if not TYPE_ENGINE_MAPPING.get(tp): | ||||
|                 continue | ||||
|  | @ -29,9 +29,9 @@ def get_terminal_command_store(): | |||
|     return storage_list | ||||
| 
 | ||||
| 
 | ||||
| def get_multi_command_store(): | ||||
| def get_multi_command_storage(): | ||||
|     from .command.multi import CommandStore | ||||
|     storage_list = get_terminal_command_store().values() | ||||
|     storage_list = get_terminal_command_storages().values() | ||||
|     storage = CommandStore(storage_list) | ||||
|     return storage | ||||
| 
 | ||||
|  |  | |||
|  | @ -1,41 +1,22 @@ | |||
| # -*- coding: utf-8 -*- | ||||
| # | ||||
| 
 | ||||
| from jms_es_sdk import ESStore | ||||
| from jms_storage.es import ESStorage | ||||
| from .base import CommandBase | ||||
| from .models import AbstractSessionCommand | ||||
| 
 | ||||
| 
 | ||||
| class CommandStore(CommandBase, ESStore): | ||||
| class CommandStore(ESStorage, CommandBase): | ||||
|     def __init__(self, params): | ||||
|         hosts = params.get('HOSTS', ['http://localhost']) | ||||
|         ESStore.__init__(self, hosts=hosts) | ||||
| 
 | ||||
|     def save(self, command): | ||||
|         return ESStore.save(self, command) | ||||
| 
 | ||||
|     def bulk_save(self, commands): | ||||
|         return ESStore.bulk_save(self, commands) | ||||
|         super().__init__(params) | ||||
| 
 | ||||
|     def filter(self, date_from=None, date_to=None, | ||||
|                user=None, asset=None, system_user=None, | ||||
|                input=None, session=None): | ||||
| 
 | ||||
|         data = ESStore.filter( | ||||
|             self, date_from=date_from, date_to=date_to, | ||||
|             user=user, asset=asset, system_user=system_user, | ||||
|             input=input, session=session | ||||
|         ) | ||||
|         data = super().filter(date_from=date_from, date_to=date_to, | ||||
|                               user=user, asset=asset, system_user=system_user, | ||||
|                               input=input, session=session) | ||||
|         return AbstractSessionCommand.from_multi_dict( | ||||
|             [item["_source"] for item in data["hits"] if item] | ||||
|         ) | ||||
| 
 | ||||
|     def count(self, date_from=None, date_to=None, | ||||
|               user=None, asset=None, system_user=None, | ||||
|               input=None, session=None): | ||||
|         amount = ESStore.count( | ||||
|             self, date_from=date_from, date_to=date_to, | ||||
|             user=user, asset=asset, system_user=system_user, | ||||
|             input=input, session=session | ||||
|         ) | ||||
|         return amount | ||||
|  |  | |||
|  | @ -9,7 +9,7 @@ from rest_framework_bulk.serializers import BulkListSerializer | |||
| from common.mixins import BulkSerializerMixin | ||||
| from common.utils import get_object_or_none | ||||
| from .models import Terminal, Status, Session, Task | ||||
| from .backends import get_multi_command_store | ||||
| from .backends import get_multi_command_storage | ||||
| 
 | ||||
| 
 | ||||
| class TerminalSerializer(serializers.ModelSerializer): | ||||
|  | @ -47,7 +47,7 @@ class TerminalSerializer(serializers.ModelSerializer): | |||
| 
 | ||||
| class SessionSerializer(serializers.ModelSerializer): | ||||
|     command_amount = serializers.SerializerMethodField() | ||||
|     command_store = get_multi_command_store() | ||||
|     command_store = get_multi_command_storage() | ||||
| 
 | ||||
|     class Meta: | ||||
|         model = Session | ||||
|  |  | |||
|  | @ -1,10 +1,10 @@ | |||
| # ~*~ coding: utf-8 ~*~ | ||||
| 
 | ||||
| from django import template | ||||
| from ..backends import get_multi_command_store | ||||
| from ..backends import get_multi_command_storage | ||||
| 
 | ||||
| register = template.Library() | ||||
| command_store = get_multi_command_store() | ||||
| command_store = get_multi_command_storage() | ||||
| 
 | ||||
| 
 | ||||
| @register.filter | ||||
|  |  | |||
|  | @ -9,10 +9,10 @@ from django.utils.translation import ugettext as _ | |||
| from common.mixins import DatetimeSearchMixin, AdminUserRequiredMixin | ||||
| from ..models import Command | ||||
| from .. import utils | ||||
| from ..backends import get_multi_command_store | ||||
| from ..backends import get_multi_command_storage | ||||
| 
 | ||||
| __all__ = ['CommandListView'] | ||||
| common_storage = get_multi_command_store() | ||||
| common_storage = get_multi_command_storage() | ||||
| 
 | ||||
| 
 | ||||
| class CommandListView(DatetimeSearchMixin, AdminUserRequiredMixin, ListView): | ||||
|  |  | |||
|  | @ -10,7 +10,7 @@ from django.conf import settings | |||
| from users.utils import AdminUserRequiredMixin | ||||
| from common.mixins import DatetimeSearchMixin | ||||
| from ..models import Session, Command, Terminal | ||||
| from ..backends import get_multi_command_store | ||||
| from ..backends import get_multi_command_storage | ||||
| from .. import utils | ||||
| 
 | ||||
| 
 | ||||
|  | @ -19,7 +19,7 @@ __all__ = [ | |||
|     'SessionDetailView', | ||||
| ] | ||||
| 
 | ||||
| command_store = get_multi_command_store() | ||||
| command_store = get_multi_command_storage() | ||||
| 
 | ||||
| 
 | ||||
| class SessionListView(AdminUserRequiredMixin, DatetimeSearchMixin, ListView): | ||||
|  |  | |||
|  | @ -40,7 +40,6 @@ itsdangerous==0.24 | |||
| itypes==1.1.0 | ||||
| Jinja2==2.10 | ||||
| jmespath==0.9.3 | ||||
| jms-es-sdk | ||||
| kombu==4.0.2 | ||||
| ldap3==2.4 | ||||
| MarkupSafe==1.0 | ||||
|  | @ -62,7 +61,7 @@ pytz==2017.3 | |||
| PyYAML==3.12 | ||||
| redis==2.10.6 | ||||
| requests==2.18.4 | ||||
| jms-storage==0.0.13 | ||||
| jms-storage==0.0.15 | ||||
| s3transfer==0.1.13 | ||||
| simplejson==3.13.2 | ||||
| six==1.11.0 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 ibuler
						ibuler