diff --git a/apps/audits/models.py b/apps/audits/models.py index bd4b2abe9..71f0ce353 100644 --- a/apps/audits/models.py +++ b/apps/audits/models.py @@ -1,5 +1,53 @@ +# -*- coding: utf-8 -*- +# + from __future__ import unicode_literals from django.db import models +from django.utils.translation import ugettext_lazy as _ -# Create your models here. + +class LoginLog(models.Model): + LOGIN_TYPE_CHOICE = ( + ('S', 'ssh'), + ('W', 'web'), + ) + + username = models.CharField(max_length=20, verbose_name=_('Username')) + name = models.CharField(max_length=20, blank=True, verbose_name=_('Name')) + login_type = models.CharField(choices=LOGIN_TYPE_CHOICE, max_length=1, verbose_name=_('Login type')) + login_ip = models.GenericIPAddressField(verbose_name=_('Login ip')) + login_city = models.CharField(max_length=100, blank=True, null=True, verbose_name=_('Login city')) + user_agent = models.CharField(max_length=100, blank=True, null=True, verbose_name=_('User agent')) + date_login = models.DateTimeField(auto_now=True, verbose_name=_('Date login')) + date_logout = models.DateTimeField(null=True, verbose_name=_('Date logout')) + + class Meta: + db_table = 'loginlog' + ordering = ['-date_login', 'username'] + + +class ProxyLog(models.Model): + LOGIN_TYPE_CHOICE = ( + ('S', 'ssh'), + ('W', 'web'), + ) + + username = models.CharField(max_length=20, verbose_name=_('Username')) + name = models.CharField(max_length=20, blank=True, verbose_name=_('Name')) + hostname = models.CharField(max_length=128, blank=True, verbose_name=_('Hostname')) + ip = models.GenericIPAddressField(max_length=32, verbose_name=_('IP')) + system_user = models.CharField(max_length=20, verbose_name=_('System user')) + login_type = models.CharField(choices=LOGIN_TYPE_CHOICE, max_length=1, verbose_name=_('Login type')) + log_file = models.CharField(max_length=1000, blank=True, null=True) + is_finished = models.BooleanField(default=False, verbose_name=_('Is finished')) + date_start = models.DateTimeField(auto_now=True, verbose_name=_('Date start')) + date_finished = models.DateTimeField(null=True, verbose_name=_('Date finished')) + + +class CommandLog(models.Model): + proxy_log = models.ForeignKey(ProxyLog, on_delete=models.CASCADE, related_name='proxy_log') + command = models.CharField(max_length=1000, blank=True) + output = models.TextField(blank=True) + date_start = models.DateTimeField(null=True) + date_finished = models.DateTimeField(null=True) diff --git a/apps/users/api.py b/apps/users/api.py index 9de263963..aaf67a9a4 100644 --- a/apps/users/api.py +++ b/apps/users/api.py @@ -12,10 +12,10 @@ from rest_framework_bulk import ListBulkCreateUpdateDestroyAPIView from .models import User, UserGroup from .serializers import UserDetailSerializer, UserAndGroupSerializer, \ GroupDetailSerializer, UserPKUpdateSerializer, UserBulkUpdateSerializer, GroupBulkUpdateSerializer -from common.mixins import BulkDeleteApiMixin +from common.mixins import BulkDeleteApiMixin, get_logger -logger = logging.getLogger('jumpserver.users.api') +logger = get_logger(__name__) class UserDetailApi(generics.RetrieveUpdateDestroyAPIView): diff --git a/docs/table_design.xml b/docs/table_design.xml index de825486b..acc1fe395 100644 --- a/docs/table_design.xml +++ b/docs/table_design.xml @@ -634,10 +634,13 @@ id - +
INTEGER NULL + +CHAR +NULL VARCHAR NULL @@ -663,7 +666,7 @@ id
- +
INTEGER NULL @@ -689,14 +692,20 @@ id
- +
INTEGER NULL + +VARCHAR +NULL CHAR NULL +VARCHAR +NULL + CHAR NULL @@ -705,18 +714,9 @@ CHAR NULL - -INTEGER -NULL CHAR NULL - -VARCHAR -NULL - -VARCHAR -NULL INTEGER NULL @@ -738,11 +738,17 @@ INTEGER NULL + +CHAR +NULL + +VARCHAR +NULL DATE NULL - -CHAR + +DATE NULL id diff --git a/requirements.txt b/requirements.txt index ddf45a598..da30cd976 100644 --- a/requirements.txt +++ b/requirements.txt @@ -23,4 +23,3 @@ sshpubkeys==2.2.0 djangorestframework-bulk==0.2.1 python-gssapi==0.6.4 tornado==4.4.2 - diff --git a/terminal/ssh_server.py b/terminal/ssh_server.py index ce6f54322..3d4f0072d 100644 --- a/terminal/ssh_server.py +++ b/terminal/ssh_server.py @@ -6,21 +6,21 @@ __version__ = '0.3.3' import sys import os -import base64 +# import base64 import time -from binascii import hexlify +# from binascii import hexlify import sys import threading -from multiprocessing.process import Process +# from multiprocessing.process import Process import traceback -import tty -import termios -import struct -import fcntl -import signal +# import tty +# import termios +# import struct +# import fcntl +# import signal import socket import select -import errno +# import errno import paramiko import django @@ -210,8 +210,7 @@ class Navigation: class ProxyChannel: ENTER_CHAR = ['\r', '\n', '\r\n'] output_data = [] - command = [] - output = [] + history = {} def __init__(self, client_channel, backend_channel, client_addr): self.client_channel = client_channel @@ -219,39 +218,30 @@ class ProxyChannel: self.client_addr = client_addr self.in_input_mode = True self.is_first_input = True - self.id = 0 - - # def stream_flow(self, input_=None, output_=None): - # if input_: - # self.in_input_mode = True - # if input_ in ['\r', '\n', '\r\n']: - # self.in_input_mode = False - # - # if output_: - # print(''.join(self.__class__.output_data)) - # if not self.in_input_mode: - # command = ''.join(self.__class__.output_data) - # del self.__class__.output_data - # self.__class__.output_data = [] - # self.__class__.output_data.append(output_) + self.no = 0 + self.command = '' + self.output = '' def get_output(self): if self.in_input_mode is False: - self.__class__.output_data.pop() - result = ''.join(self.__class__.output_data) - self.__class__.output.append(result) + # self.__class__.output_data.pop() + self.output = output = ''.join(self.__class__.output_data)[:200] + self.__class__.history[self.no]['output'] = self.output + self.__class__.history[self.no]['date_finished'] = time.time() print('>>>>>>>>>>> output <<<<<<<<<<') - print(result) + print(output) print('>>>>>>>>>>> end output <<<<<<<<<<') del self.__class__.output_data self.__class__.output_data = [] + self.no += 1 + print(self.__class__.history) def get_command(self, client_data): if client_data in self.__class__.ENTER_CHAR: self.in_input_mode = False - command = ''.join(self.__class__.output_data) + self.command = command = ''.join(self.__class__.output_data) + self.__class__.history[self.no] = {'date_started': time.time(), 'command': self.command} print('########### command ##########') - self.__class__.command.append(command) print(command) print('########### end command ##########') del self.__class__.output_data @@ -268,7 +258,6 @@ class ProxyChannel: if client_channel.change_window_size_event.is_set(): backend_channel.resize_pty(width=client_channel.width, height=client_channel.height) - # print(self.__class__.output) if client_channel in r: # Get output of the command self.get_output()