diff --git a/apps/terminal/api.py b/apps/terminal/api.py index c9bb68ed6..924a30dfd 100644 --- a/apps/terminal/api.py +++ b/apps/terminal/api.py @@ -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() diff --git a/apps/terminal/backends/__init__.py b/apps/terminal/backends/__init__.py index ef1ba56a9..9a1c338f5 100644 --- a/apps/terminal/backends/__init__.py +++ b/apps/terminal/backends/__init__.py @@ -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 diff --git a/apps/terminal/backends/command/es.py b/apps/terminal/backends/command/es.py index 9c75fc978..dde8e1e95 100644 --- a/apps/terminal/backends/command/es.py +++ b/apps/terminal/backends/command/es.py @@ -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 diff --git a/apps/terminal/serializers.py b/apps/terminal/serializers.py index 8c40315a7..c18c5023d 100644 --- a/apps/terminal/serializers.py +++ b/apps/terminal/serializers.py @@ -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 diff --git a/apps/terminal/templatetags/terminal_tags.py b/apps/terminal/templatetags/terminal_tags.py index cd7120fec..c5643c67b 100644 --- a/apps/terminal/templatetags/terminal_tags.py +++ b/apps/terminal/templatetags/terminal_tags.py @@ -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 diff --git a/apps/terminal/views/command.py b/apps/terminal/views/command.py index 0af0b5bfd..748261414 100644 --- a/apps/terminal/views/command.py +++ b/apps/terminal/views/command.py @@ -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): diff --git a/apps/terminal/views/session.py b/apps/terminal/views/session.py index 3b66baff7..71caeae48 100644 --- a/apps/terminal/views/session.py +++ b/apps/terminal/views/session.py @@ -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): diff --git a/requirements/requirements.txt b/requirements/requirements.txt index e0ecc634e..5fb844181 100644 --- a/requirements/requirements.txt +++ b/requirements/requirements.txt @@ -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