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()