Commit 9c7bd7d2 authored by ibuler's avatar ibuler

[Fixture] 添加record log

parent a79c3dd1
...@@ -7,12 +7,14 @@ from __future__ import absolute_import, unicode_literals ...@@ -7,12 +7,14 @@ from __future__ import absolute_import, unicode_literals
from rest_framework import generics, viewsets from rest_framework import generics, viewsets
from rest_framework_bulk import BulkModelViewSet from rest_framework_bulk import BulkModelViewSet
from audits.backends import command_store from audits.backends import command_store, record_store
from audits.backends.command.serializers import CommandLogSerializer from audits.backends.command.serializers import CommandLogSerializer
from audits.backends.record.serializers import RecordSerializer
from . import models, serializers from . import models, serializers
from .hands import IsSuperUserOrAppUser, IsAppUser from .hands import IsSuperUserOrAppUser, IsAppUser
# Todo: 忘记当时为何不和ProxyLogViewSet复用了
class ProxyLogReceiveView(generics.CreateAPIView): class ProxyLogReceiveView(generics.CreateAPIView):
queryset = models.ProxyLog.objects.all() queryset = models.ProxyLog.objects.all()
serializer_class = serializers.ProxyLogSerializer serializer_class = serializers.ProxyLogSerializer
...@@ -38,9 +40,6 @@ class ProxyLogViewSet(viewsets.ModelViewSet): ...@@ -38,9 +40,6 @@ class ProxyLogViewSet(viewsets.ModelViewSet):
"date_start": "" "date_start": ""
} }
some params we need generate: {
"log_file", "", # No use now, may be think more about monitor and record
}
""" """
queryset = models.ProxyLog.objects.all() queryset = models.ProxyLog.objects.all()
...@@ -66,3 +65,34 @@ class CommandLogViewSet(BulkModelViewSet): ...@@ -66,3 +65,34 @@ class CommandLogViewSet(BulkModelViewSet):
serializer_class = CommandLogSerializer serializer_class = CommandLogSerializer
permission_classes = (IsSuperUserOrAppUser,) permission_classes = (IsSuperUserOrAppUser,)
class RecordLogViewSet(BulkModelViewSet):
"""接受app发送来的record log, 格式如下
{
"proxy_log_id": 23,
"output": "d2hvbWFp", # base64.b64encode(s)
"timestamp": 1485238673.0
}
"""
serializer_class = RecordSerializer
permission_classes = (IsSuperUserOrAppUser,)
def get_queryset(self):
filter_kwargs = {}
proxy_log_id = self.request.query_params.get('proxy_log_id')
data_from_ts = self.request.query_params.get('date_from_ts')
if proxy_log_id:
filter_kwargs['proxy_log_id'] = proxy_log_id
if data_from_ts:
filter_kwargs['date_from_ts'] = data_from_ts
if filter_kwargs:
return record_store.filter(**filter_kwargs)
else:
return record_store.all()
...@@ -3,4 +3,8 @@ from django.conf import settings ...@@ -3,4 +3,8 @@ from django.conf import settings
command_engine = import_module(settings.COMMAND_STORE_BACKEND) command_engine = import_module(settings.COMMAND_STORE_BACKEND)
command_store = command_engine.CommandStore() command_store = command_engine.CommandStore()
record_engine = import_module(settings.RECORD_STORE_BACKEND)
record_store = record_engine.RecordStore()
from .command.serializers import CommandLogSerializer from .command.serializers import CommandLogSerializer
...@@ -11,8 +11,8 @@ class CommandBase(object): ...@@ -11,8 +11,8 @@ class CommandBase(object):
pass pass
@abc.abstractmethod @abc.abstractmethod
def filter(self, date_from=None, date_to=None, user='', def filter(self, date_from_ts=None, date_to_ts=None, user='',
asset='', system_user='', command=''): asset='', system_user='', command='', proxy_log_id=0):
pass pass
......
...@@ -17,7 +17,7 @@ class CommandStore(CommandBase): ...@@ -17,7 +17,7 @@ class CommandStore(CommandBase):
) )
def filter(self, date_from_ts=None, date_to_ts=None, user='', def filter(self, date_from_ts=None, date_to_ts=None, user='',
asset='', system_user='', command='', proxy_log_id=''): asset='', system_user='', command='', proxy_log_id=0):
filter_kwargs = {} filter_kwargs = {}
if date_from_ts: if date_from_ts:
......
...@@ -12,10 +12,10 @@ class CommandLogSerializer(serializers.ModelSerializer): ...@@ -12,10 +12,10 @@ class CommandLogSerializer(serializers.ModelSerializer):
model = CommandLog model = CommandLog
fields = '__all__' fields = '__all__'
def save(self): def create(self, validated_data):
try: try:
output = self.validated_data['output'] output = validated_data['output']
self.validated_data['output'] = base64.b64decode(output) validated_data['output'] = base64.b64decode(output)
except IndexError: except IndexError:
pass pass
return command_store.save(**dict(self.validated_data)) return command_store.save(**dict(validated_data))
# coding: utf-8
import abc
class RecordBase(object):
__metaclass__ = abc.ABCMeta
@abc.abstractmethod
def save(self, proxy_log_id, output, timestamp):
pass
@abc.abstractmethod
def filter(self, date_from_ts=None, proxy_log_id=None):
pass
# ~*~ coding: utf-8 ~*~
from .base import RecordBase
from audits.models import RecordLog
class RecordStore(RecordBase):
model = RecordLog
queryset = []
def save(self, proxy_log_id, output, timestamp):
return self.model.objects.create(
proxy_log_id=proxy_log_id, output=output, timestamp=timestamp
)
def filter(self, date_from_ts=None, proxy_log_id=''):
filter_kwargs = {}
if date_from_ts:
filter_kwargs['timestamp__gte'] = date_from_ts
if proxy_log_id:
filter_kwargs['proxy_log_id'] = proxy_log_id
if filter_kwargs:
self.queryset = self.model.objects.filter(**filter_kwargs)
return self.queryset
def all(self):
"""返回所有数据"""
return self.model.objects.all()
# ~*~ coding: utf-8 ~*~
import base64
from rest_framework import serializers
from audits.models import RecordLog
from audits.backends import record_store
class RecordSerializer(serializers.ModelSerializer):
"""使用这个类作为基础Command Log Serializer类, 用来序列化"""
class Meta:
model = RecordLog
fields = '__all__'
def create(self, validated_data):
try:
output = validated_data['output']
validated_data['output'] = base64.b64decode(output)
except IndexError:
pass
return record_store.save(**dict(validated_data))
...@@ -46,7 +46,6 @@ class ProxyLog(models.Model): ...@@ -46,7 +46,6 @@ class ProxyLog(models.Model):
null=True, verbose_name=_('Login type')) null=True, verbose_name=_('Login type'))
terminal = models.CharField( terminal = models.CharField(
max_length=32, blank=True, null=True, verbose_name=_('Terminal')) max_length=32, blank=True, null=True, verbose_name=_('Terminal'))
log_file = models.CharField(max_length=1000, blank=True, null=True)
is_failed = models.BooleanField( is_failed = models.BooleanField(
default=False, verbose_name=_('Did connect failed')) default=False, verbose_name=_('Did connect failed'))
is_finished = models.BooleanField( is_finished = models.BooleanField(
...@@ -64,14 +63,14 @@ class ProxyLog(models.Model): ...@@ -64,14 +63,14 @@ class ProxyLog(models.Model):
class CommandLog(models.Model): class CommandLog(models.Model):
proxy_log_id = models.IntegerField() proxy_log_id = models.IntegerField(db_index=True)
user = models.CharField(max_length=48, db_index=True) user = models.CharField(max_length=48, db_index=True)
asset = models.CharField(max_length=128, db_index=True) asset = models.CharField(max_length=128, db_index=True)
system_user = models.CharField(max_length=48, db_index=True) system_user = models.CharField(max_length=48, db_index=True)
command_no = models.IntegerField() command_no = models.IntegerField()
command = models.CharField(max_length=1000, blank=True, db_index=True) command = models.CharField(max_length=1000, blank=True, db_index=True)
output = models.TextField(blank=True) output = models.TextField(blank=True)
timestamp = models.FloatField(null=True, db_index=True) timestamp = models.FloatField(db_index=True)
def __unicode__(self): def __unicode__(self):
return '%s: %s' % (self.id, self.command) return '%s: %s' % (self.id, self.command)
...@@ -81,9 +80,12 @@ class CommandLog(models.Model): ...@@ -81,9 +80,12 @@ class CommandLog(models.Model):
class RecordLog(models.Model): class RecordLog(models.Model):
proxy_log_id = models.IntegerField() proxy_log_id = models.IntegerField(db_index=True)
output = models.TextField(verbose_name=_('Output')) output = models.TextField(verbose_name=_('Output'))
timestamp = models.FloatField(null=True) timestamp = models.FloatField(db_index=True)
def __unicode__(self): def __unicode__(self):
return 'Record: %s' % self.proxy_log_id return 'Record: %s' % self.proxy_log_id
class Meta:
ordering = ['timestamp']
...@@ -8,6 +8,7 @@ app_name = 'audits' ...@@ -8,6 +8,7 @@ app_name = 'audits'
router = routers.DefaultRouter() router = routers.DefaultRouter()
router.register(r'v1/proxy-log', api.ProxyLogViewSet, 'proxy-log') router.register(r'v1/proxy-log', api.ProxyLogViewSet, 'proxy-log')
router.register(r'v1/command-log', api.CommandLogViewSet, 'command-log') router.register(r'v1/command-log', api.CommandLogViewSet, 'command-log')
router.register(r'v1/record-log', api.RecordLogViewSet, 'record-log')
urlpatterns = [ urlpatterns = [
url(r'^v1/proxy-log/receive/$', api.ProxyLogReceiveView.as_view(), url(r'^v1/proxy-log/receive/$', api.ProxyLogReceiveView.as_view(),
......
...@@ -325,4 +325,4 @@ CAPTCHA_IMAGE_SIZE = (75, 33) ...@@ -325,4 +325,4 @@ CAPTCHA_IMAGE_SIZE = (75, 33)
CAPTCHA_FOREGROUND_COLOR = '#001100' CAPTCHA_FOREGROUND_COLOR = '#001100'
COMMAND_STORE_BACKEND = 'audits.backends.command.db' COMMAND_STORE_BACKEND = 'audits.backends.command.db'
RECORD_STORE_BACKEND = 'audits.backends.record.db'
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment