Merge pull request #3374 from jumpserver/dev

Dev
pull/3463/head
老广 2019-10-23 10:17:45 +08:00 committed by GitHub
commit 93e8c9e534
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 86 additions and 37 deletions

View File

@ -6,15 +6,37 @@
<script src="{% static 'js/plugins/xterm/xterm.js' %}"></script> <script src="{% static 'js/plugins/xterm/xterm.js' %}"></script>
<script src="{% static 'js/plugins/xterm/addons/fit/fit.js' %}"></script> <script src="{% static 'js/plugins/xterm/addons/fit/fit.js' %}"></script>
<link rel="stylesheet" href="{% static 'js/plugins/xterm/xterm.css' %}" /> <link rel="stylesheet" href="{% static 'js/plugins/xterm/xterm.css' %}" />
<link rel="shortcut icon" href="{{ FAVICON_URL }}" type="image/x-icon">
<style> <style>
body { body {
background-color: black; background-color: black;
} }
.xterm-rows { .xterm-rows {
{#padding: 15px;#}
font-family: "Bitstream Vera Sans Mono", Monaco, "Consolas", Courier, monospace; font-family: "Bitstream Vera Sans Mono", Monaco, "Consolas", Courier, monospace;
font-size: 13px; font-size: 13px;
} }
.terminal .xterm-viewport {
background-color: #1f1b1b;
overflow: auto;
}
body ::-webkit-scrollbar-track {
-webkit-box-shadow: inset 0 0 2px rgba(0, 0, 0, 0.3);
background-color: #272323;
border-radius: 6px;
}
body ::-webkit-scrollbar {
width: 8px;
height: 8px;
}
body ::-webkit-scrollbar-thumb {
background-color: #494141;
border-radius: 6px;
}
</style> </style>
</head> </head>
<div id="term" style="height: 100%;width: 100%"> <div id="term" style="height: 100%;width: 100%">
@ -36,7 +58,8 @@
cursorBlink: false, cursorBlink: false,
screenKeys: false, screenKeys: false,
fontFamily: '"Monaco", "Consolas", "monospace"', fontFamily: '"Monaco", "Consolas", "monospace"',
fontSize: 12, fontSize: 13,
lineHeight: 1.2,
rightClickSelectsWord: true, rightClickSelectsWord: true,
disableStdin: true disableStdin: true
}); });

View File

@ -34,6 +34,27 @@
.select2-container .select2-selection--single { .select2-container .select2-selection--single {
height: 34px; height: 34px;
} }
.terminal .xterm-viewport {
background-color: #1f1b1b;
overflow: auto;
}
body ::-webkit-scrollbar-track {
-webkit-box-shadow: inset 0 0 2px rgba(0, 0, 0, 0.3);
background-color: #272323;
border-radius: 6px;
}
body ::-webkit-scrollbar {
width: 8px;
height: 8px;
}
body ::-webkit-scrollbar-thumb {
background-color: #494141;
border-radius: 6px;
}
</style> </style>
{% endblock %} {% endblock %}
@ -201,11 +222,10 @@
cursorBlink: false, cursorBlink: false,
screenKeys: false, screenKeys: false,
fontFamily: 'monaco, Consolas, "Lucida Console", monospace', fontFamily: 'monaco, Consolas, "Lucida Console", monospace',
fontSize: 14, fontSize: 13,
lineHeight: 1,
rightClickSelectsWord: true, rightClickSelectsWord: true,
disableStdin: true, disableStdin: true,
cursorBlink: false, lineHeight: 1.2,
theme: { theme: {
background: '#1f1b1b' background: '#1f1b1b'
} }

View File

@ -23,40 +23,46 @@ class CeleryLogWebsocket(JsonWebsocketConsumer):
if task_id: if task_id:
self.handle_task(task_id) self.handle_task(task_id)
def wait_util_log_path_exist(self, task_id):
log_path = get_celery_task_log_path(task_id)
while not self.disconnected:
if not os.path.exists(log_path):
self.send_json({'message': '.', 'task': task_id})
time.sleep(0.5)
continue
self.send_json({'message': '\r\n'})
try:
logger.debug('Task log path: {}'.format(log_path))
task_log_f = open(log_path, 'rb')
return task_log_f
except OSError:
return None
def read_log_file(self, task_id):
task_log_f = self.wait_util_log_path_exist(task_id)
if not task_log_f:
return
task_end_mark = []
while not self.disconnected:
data = task_log_f.read(4096)
if data:
data = data.replace(b'\n', b'\r\n')
self.send_json(
{'message': data.decode(errors='ignore'), 'task': task_id})
if data.find(b'succeeded in') != -1:
task_end_mark.append(1)
if data.find(bytes(task_id, 'utf8')) != -1:
task_end_mark.append(1)
elif len(task_end_mark) == 2:
logger.debug('Task log end: {}'.format(task_id))
break
time.sleep(0.2)
task_log_f.close()
def handle_task(self, task_id): def handle_task(self, task_id):
logger.info("Task id: {}".format(task_id)) logger.info("Task id: {}".format(task_id))
log_path = get_celery_task_log_path(task_id) thread = threading.Thread(target=self.read_log_file, args=(task_id,))
def func():
task_log_f = None
while not self.disconnected:
if not os.path.exists(log_path):
self.send_json({'message': '.', 'task': task_id})
time.sleep(0.5)
continue
self.send_json({'message': '\r\n'})
try:
logger.debug('Task log path: {}'.format(log_path))
task_log_f = open(log_path, 'rb')
break
except OSError:
return
if not task_log_f:
return
while not self.disconnected:
data = task_log_f.readline()
if data:
data = data.replace(b'\n', b'\r\n')
self.send_json({'message': data.decode(errors='ignore'), 'task': task_id})
if data.startswith(b'Task') and data.find(b'succeeded'):
break
time.sleep(0.1)
task_log_f.close()
thread = threading.Thread(target=func)
thread.start() thread.start()
def disconnect(self, close_code): def disconnect(self, close_code):