Merge pull request #2392 from jumpserver/dev

Dev
pull/2486/head
老广 2019-02-15 10:44:32 +08:00 committed by GitHub
commit 041edb6177
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 46 additions and 17 deletions

View File

@ -9,7 +9,7 @@ COPY ./requirements /tmp/requirements
RUN yum -y install epel-release openldap-clients telnet && cd /tmp/requirements && \ RUN yum -y install epel-release openldap-clients telnet && cd /tmp/requirements && \
yum -y install $(cat rpm_requirements.txt) yum -y install $(cat rpm_requirements.txt)
RUN cd /tmp/requirements && pip install -r requirements.txt RUN cd /tmp/requirements && pip install -i https://mirrors.aliyun.com/pypi/simple/ -r requirements.txt || pip install -r requirements.txt
COPY . /opt/jumpserver COPY . /opt/jumpserver
RUN echo > config.yml RUN echo > config.yml

View File

@ -311,6 +311,7 @@ function onRename(event, treeId, treeNode, isCancel){
function onSelected(event, treeNode) { function onSelected(event, treeNode) {
current_node = treeNode; current_node = treeNode;
current_node_id = treeNode.meta.node.id; current_node_id = treeNode.meta.node.id;
zTree.expandNode(current_node, true);
var url = asset_table.ajax.url(); var url = asset_table.ajax.url();
url = setUrlParam(url, "node_id", current_node_id); url = setUrlParam(url, "node_id", current_node_id);
url = setUrlParam(url, "show_current_asset", getCookie('show_current_asset')); url = setUrlParam(url, "show_current_asset", getCookie('show_current_asset'));

View File

@ -206,6 +206,14 @@ class LogTailApi(generics.RetrieveAPIView):
def get_log_path(self): def get_log_path(self):
raise NotImplementedError() raise NotImplementedError()
def filter_line(self, line):
"""
过滤行可能替换一些信息
:param line:
:return:
"""
return line
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
mark = request.query_params.get("mark") or str(uuid.uuid4()) mark = request.query_params.get("mark") or str(uuid.uuid4())
log_path = self.get_log_path() log_path = self.get_log_path()
@ -224,9 +232,16 @@ class LogTailApi(generics.RetrieveAPIView):
offset = cache.get(mark, 0) offset = cache.get(mark, 0)
f.seek(offset) f.seek(offset)
data = f.read(self.buff_size).replace('\n', '\r\n') data = f.read(self.buff_size).replace('\n', '\r\n')
mark = str(uuid.uuid4()) mark = str(uuid.uuid4())
cache.set(mark, f.tell(), 5) cache.set(mark, f.tell(), 5)
if data == '' and self.is_file_finish_write(): if data == '' and self.is_file_finish_write():
self.end = True self.end = True
return Response({"data": data, 'end': self.end, 'mark': mark}) _data = ''
for line in data.split('\r\n'):
new_line = self.filter_line(line)
if line == '':
continue
_data += new_line + '\r\n'
return Response({"data": _data, 'end': self.end, 'mark': mark})

View File

@ -218,10 +218,9 @@ LOGGING = {
'file': { 'file': {
'encoding': 'utf8', 'encoding': 'utf8',
'level': 'DEBUG', 'level': 'DEBUG',
'class': 'logging.handlers.TimedRotatingFileHandler', 'class': 'logging.handlers.RotatingFileHandler',
'when': "D", 'maxBytes': 1024*1024*100,
'interval': 1, 'backupCount': 7,
"backupCount": 7,
'formatter': 'main', 'formatter': 'main',
'filename': JUMPSERVER_LOG_FILE, 'filename': JUMPSERVER_LOG_FILE,
}, },

View File

@ -2,6 +2,8 @@
# #
import os import os
import re
from celery.result import AsyncResult from celery.result import AsyncResult
from rest_framework import generics from rest_framework import generics
@ -19,12 +21,18 @@ class CeleryTaskLogApi(LogTailApi):
permission_classes = (IsValidUser,) permission_classes = (IsValidUser,)
task = None task = None
task_id = '' task_id = ''
pattern = re.compile(r'Task .* succeeded in \d+\.\d+s.*')
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
self.task_id = str(kwargs.get('pk')) self.task_id = str(kwargs.get('pk'))
self.task = AsyncResult(self.task_id) self.task = AsyncResult(self.task_id)
return super().get(request, *args, **kwargs) return super().get(request, *args, **kwargs)
def filter_line(self, line):
if self.pattern.match(line):
line = self.pattern.sub(line, '')
return line
def get_log_path(self): def get_log_path(self):
new_path = get_celery_task_log_path(self.task_id) new_path = get_celery_task_log_path(self.task_id)
if new_path and os.path.isfile(new_path): if new_path and os.path.isfile(new_path):

View File

@ -1,6 +1,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# #
from rest_framework import viewsets from rest_framework import viewsets
from django.db import transaction
from common.permissions import IsValidUser from common.permissions import IsValidUser
from ..models import CommandExecution from ..models import CommandExecution
@ -11,7 +12,6 @@ from ..tasks import run_command_execution
class CommandExecutionViewSet(viewsets.ModelViewSet): class CommandExecutionViewSet(viewsets.ModelViewSet):
serializer_class = CommandExecutionSerializer serializer_class = CommandExecutionSerializer
permission_classes = (IsValidUser,) permission_classes = (IsValidUser,)
task = None
def get_queryset(self): def get_queryset(self):
return CommandExecution.objects.filter( return CommandExecution.objects.filter(
@ -22,6 +22,6 @@ class CommandExecutionViewSet(viewsets.ModelViewSet):
instance = serializer.save() instance = serializer.save()
instance.user = self.request.user instance.user = self.request.user
instance.save() instance.save()
run_command_execution.apply_async( transaction.on_commit(lambda: run_command_execution.apply_async(
args=(instance.id,), task_id=str(instance.id) args=(instance.id,), task_id=str(instance.id)
) ))

View File

@ -41,7 +41,10 @@ def run_ansible_task(tid, callback=None, **kwargs):
@shared_task @shared_task
def run_command_execution(cid, **kwargs): def run_command_execution(cid, **kwargs):
execution = get_object_or_none(CommandExecution, id=cid) execution = get_object_or_none(CommandExecution, id=cid)
return execution.run() if execution:
execution.run()
else:
logger.error("Not found the execution id: {}".format(cid))
@shared_task @shared_task

View File

@ -170,8 +170,8 @@ function initResultTerminal() {
term = new Terminal({ term = new Terminal({
cursorBlink: false, cursorBlink: false,
screenKeys: false, screenKeys: false,
fontFamily: '"Monaco", "Consolas", "monospace"', fontFamily: '"Consolas", "monospace"',
fontSize: 13, fontSize: 14,
rightClickSelectsWord: true, rightClickSelectsWord: true,
disableStdin: true, disableStdin: true,
theme: { theme: {

View File

@ -168,7 +168,7 @@ class Session(OrgModelMixin):
upload_to = 'replay' upload_to = 'replay'
ACTIVE_CACHE_KEY_PREFIX = 'SESSION_ACTIVE_{}' ACTIVE_CACHE_KEY_PREFIX = 'SESSION_ACTIVE_{}'
def get_rel_replay_path(self, version=2): def get_rel_replay_path(self, version=3):
""" """
获取session日志的文件路径 获取session日志的文件路径
:param version: 原来后缀是 .gz为了统一新版本改为 .replay.gz :param version: 原来后缀是 .gz为了统一新版本改为 .replay.gz
@ -177,10 +177,13 @@ class Session(OrgModelMixin):
suffix = '.replay.gz' suffix = '.replay.gz'
if version == 1: if version == 1:
suffix = '.gz' suffix = '.gz'
date = self.date_start.strftime('%Y-%m-%d') if version <= 2:
date = self.date_start.strftime('%Y-%m-%d')
else:
date = self.date_start.utcnow().strftime('%Y-%m-%d')
return os.path.join(date, str(self.id) + suffix) return os.path.join(date, str(self.id) + suffix)
def get_local_path(self, version=2): def get_local_path(self, version=3):
rel_path = self.get_rel_replay_path(version=version) rel_path = self.get_rel_replay_path(version=version)
if version == 2: if version == 2:
local_path = os.path.join(self.upload_to, rel_path) local_path = os.path.join(self.upload_to, rel_path)

2
jms
View File

@ -176,7 +176,7 @@ def start_celery():
cmd = [ cmd = [
'celery', 'worker', 'celery', 'worker',
'-A', 'ops', '-A', 'ops',
'-l', LOG_LEVEL.lower(), '-l', 'INFO',
'--pidfile', pid_file, '--pidfile', pid_file,
'--autoscale', '20,4', '--autoscale', '20,4',
] ]

View File

@ -14,7 +14,7 @@ coreapi==2.3.3
coreschema==0.0.4 coreschema==0.0.4
cryptography==2.3.1 cryptography==2.3.1
decorator==4.1.2 decorator==4.1.2
Django==2.1 Django==2.1.7
django-auth-ldap==1.7.0 django-auth-ldap==1.7.0
django-bootstrap3==9.1.0 django-bootstrap3==9.1.0
django-celery-beat==1.1.1 django-celery-beat==1.1.1