mirror of https://github.com/jumpserver/jumpserver
基本完成
parent
50d21fcdca
commit
b30697ea20
|
@ -182,6 +182,7 @@ class Jtty(object):
|
||||||
raise ServerError('Create %s failed, Please modify %s permission.' % (today_connect_log_dir, tty_log_dir))
|
raise ServerError('Create %s failed, Please modify %s permission.' % (today_connect_log_dir, tty_log_dir))
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
# log_file_f = open('/opt/jumpserver/logs/tty/20151102/a_b_191034.log', 'a')
|
||||||
log_file_f = open(log_file_path + '.log', 'a')
|
log_file_f = open(log_file_path + '.log', 'a')
|
||||||
log_time_f = open(log_file_path + '.time', 'a')
|
log_time_f = open(log_file_path + '.time', 'a')
|
||||||
except IOError:
|
except IOError:
|
||||||
|
|
|
@ -11,11 +11,13 @@ import tornado.options
|
||||||
import tornado.web
|
import tornado.web
|
||||||
import tornado.websocket
|
import tornado.websocket
|
||||||
import tornado.httpserver
|
import tornado.httpserver
|
||||||
|
import tornado.gen
|
||||||
|
|
||||||
from tornado.options import define, options
|
from tornado.options import define, options
|
||||||
from pyinotify import WatchManager, Notifier, ProcessEvent, IN_DELETE, IN_CREATE, IN_MODIFY
|
from pyinotify import WatchManager, Notifier, ProcessEvent, IN_DELETE, IN_CREATE, IN_MODIFY
|
||||||
|
|
||||||
define("port", default=8080, help="run on the given port", type=int)
|
define("port", default=8080, help="run on the given port", type=int)
|
||||||
|
define("host", default='0.0.0.0', help="run port on", type=str)
|
||||||
|
|
||||||
|
|
||||||
class EventHandler(ProcessEvent):
|
class EventHandler(ProcessEvent):
|
||||||
|
@ -63,7 +65,7 @@ class Application(tornado.web.Application):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
handlers = [
|
handlers = [
|
||||||
(r'/', MainHandler),
|
(r'/', MainHandler),
|
||||||
(r'/send', SendHandler),
|
(r'/monitor', MonitorHandler),
|
||||||
]
|
]
|
||||||
|
|
||||||
setting = {
|
setting = {
|
||||||
|
@ -75,31 +77,33 @@ class Application(tornado.web.Application):
|
||||||
tornado.web.Application.__init__(self, handlers, **setting)
|
tornado.web.Application.__init__(self, handlers, **setting)
|
||||||
|
|
||||||
|
|
||||||
class SendHandler(tornado.websocket.WebSocketHandler):
|
class MonitorHandler(tornado.websocket.WebSocketHandler):
|
||||||
clients = set()
|
clients = set()
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
self.file_path = None
|
||||||
|
super(self.__class__, self).__init__(*args, **kwargs)
|
||||||
|
|
||||||
def check_origin(self, origin):
|
def check_origin(self, origin):
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def open(self):
|
def open(self):
|
||||||
SendHandler.clients.add(self)
|
# 获取监控的path
|
||||||
|
self.file_path = self.get_argument('file_path', '')
|
||||||
|
MonitorHandler.clients.add(self)
|
||||||
self.stream.set_nodelay(True)
|
self.stream.set_nodelay(True)
|
||||||
|
|
||||||
def on_message(self, message):
|
def on_message(self, message):
|
||||||
self.write_message(message)
|
self.write_message('Connect WebSocket Success. <br/>')
|
||||||
# while True:
|
# 监控日志,发生变动发向客户端
|
||||||
# self.write_message(json.dumps(message))
|
file_monitor('%s.log' % self.file_path, client=self)
|
||||||
# time.sleep(1)
|
self.write_message('Disconnect WebSocket.<br/>')
|
||||||
# # 服务器主动关闭
|
|
||||||
# self.close()
|
|
||||||
# SendHandler.clients.remove(self)
|
|
||||||
|
|
||||||
file_monitor('/opt/jumpserver/logs/tty/20151102/a_b_191034.log', client=self)
|
|
||||||
self.write_message('monitor /tmp/test1234')
|
|
||||||
|
|
||||||
def on_close(self):
|
def on_close(self):
|
||||||
# 客户端主动关闭
|
# 客户端主动关闭
|
||||||
SendHandler.clients.remove(self)
|
self.close()
|
||||||
|
self.finish()
|
||||||
|
MonitorHandler.clients.remove(self)
|
||||||
|
|
||||||
|
|
||||||
class MainHandler(tornado.web.RequestHandler):
|
class MainHandler(tornado.web.RequestHandler):
|
||||||
|
@ -111,5 +115,7 @@ if __name__ == '__main__':
|
||||||
tornado.options.parse_command_line()
|
tornado.options.parse_command_line()
|
||||||
app = Application()
|
app = Application()
|
||||||
server = tornado.httpserver.HTTPServer(app)
|
server = tornado.httpserver.HTTPServer(app)
|
||||||
server.listen(options.port)
|
server.bind(options.port, options.host)
|
||||||
|
# server.listen(options.port)
|
||||||
|
server.start(num_processes=1)
|
||||||
tornado.ioloop.IOLoop.instance().start()
|
tornado.ioloop.IOLoop.instance().start()
|
||||||
|
|
|
@ -42,7 +42,7 @@
|
||||||
|
|
||||||
ws.onmessage = function(evt){
|
ws.onmessage = function(evt){
|
||||||
console.log(evt.data);
|
console.log(evt.data);
|
||||||
$('#content').append(evt.data.replace('\r\n', '<br />').replace('[\r\n]', '<br />'));
|
$('#content').append(evt.data.replace(/\n|\r|(\r\n)|(\u0085)|(\u2028)|(\u2029)/g, '<br>'));
|
||||||
};
|
};
|
||||||
|
|
||||||
ws.onclose = function(evt){
|
ws.onclose = function(evt){
|
||||||
|
|
|
@ -77,7 +77,7 @@
|
||||||
<td id="remote_ip" class="text-center"> {{ post.remote_ip }} </td>
|
<td id="remote_ip" class="text-center"> {{ post.remote_ip }} </td>
|
||||||
{% ifnotequal session_role_id 0 %}
|
{% ifnotequal session_role_id 0 %}
|
||||||
<td class="text-center"><a href="/jlog/history/?id={{ post.id }}" class="log_command"> 命令统计 </a></td>
|
<td class="text-center"><a href="/jlog/history/?id={{ post.id }}" class="log_command"> 命令统计 </a></td>
|
||||||
<td class="text-center"><a class="monitor" filename="{{ post.log_path }}"> 监控 </a></td>
|
<td class="text-center"><a class="monitor" file_path="{{ post.log_path }}"> 监控 </a></td>
|
||||||
<td class="text-center"><input type="button" id="cut" class="btn btn-danger btn-xs" name="cut" value="阻断" onclick='cut("{{ post.pid }}")' /></td>
|
<td class="text-center"><input type="button" id="cut" class="btn btn-danger btn-xs" name="cut" value="阻断" onclick='cut("{{ post.pid }}")' /></td>
|
||||||
{% endifnotequal %}
|
{% endifnotequal %}
|
||||||
<td class="text-center"> {{ post.start_time|date:"Y-m-d H:i:s" }} </td>
|
<td class="text-center"> {{ post.start_time|date:"Y-m-d H:i:s" }} </td>
|
||||||
|
@ -99,13 +99,66 @@
|
||||||
|
|
||||||
{#<script src="http://{{ web_socket_host }}/socket.io/socket.io.js"></script>#}
|
{#<script src="http://{{ web_socket_host }}/socket.io/socket.io.js"></script>#}
|
||||||
<script>
|
<script>
|
||||||
$(document).ready(function(){
|
{# $(document).ready(function(){#}
|
||||||
$('.monitor').click(function(){
|
{# $('.monitor').click(function(){#}
|
||||||
window.open('/jlog/monitor/', '监控', 'height=500, width=910, top=89px, left=99px,toolbar=no,menubar=no,scrollbars=auto,resizeable=no,location=no,status=no');
|
{# window.open('/jlog/monitor/', '监控', 'height=500, width=910, top=89px, left=99px,toolbar=no,menubar=no,scrollbars=auto,resizeable=no,location=no,status=no');#}
|
||||||
})
|
{# })#}
|
||||||
});
|
{# });#}
|
||||||
|
|
||||||
function log_search(){
|
|
||||||
|
function init(obj){
|
||||||
|
var file_path = obj.attr('file_path');
|
||||||
|
console.log(file_path);
|
||||||
|
var socket = new WebSocket('ws://j:8080/monitor?file_path='+file_path);
|
||||||
|
socket.onopen = function(evt){
|
||||||
|
socket.send(file_path)
|
||||||
|
};
|
||||||
|
|
||||||
|
var username = obj.closest('tr').find('#username').text();
|
||||||
|
var ip = obj.closest('tr').find('#ip').text();
|
||||||
|
|
||||||
|
BootstrapDialog.show({message: function(){
|
||||||
|
var tag = $('<pre id="log" style="height: 500px;overflow: auto;background-color: rgba(0, 0, 0, 0);line-height: 0.8; border: none"></pre>');
|
||||||
|
{# document.cookie.split('; ').forEach(function(obj){#}
|
||||||
|
{# var info = obj.split('=');#}
|
||||||
|
{# if(info.length == 2 ){#}
|
||||||
|
{# if(info[0] == 'username'){#}
|
||||||
|
{# username = info[1];#}
|
||||||
|
{# }else if(info[0] == 'seed'){#}
|
||||||
|
{# seed = info[1];#}
|
||||||
|
{# }#}
|
||||||
|
{# }#}
|
||||||
|
{# });#}
|
||||||
|
|
||||||
|
//服务器端认证
|
||||||
|
{# socket.send('login', {userid:message.id, filename:message.filename,username:username,seed:seed});#}
|
||||||
|
socket.onmessage = function(evt){
|
||||||
|
var control_regx = /\x1B\[([0-9]{1,3}((;[0-9]{1,3})*)?)?[m|K]/g;
|
||||||
|
var newline_regx = /\n|\r|(\r\n)|(\u0085)|(\u2028)|(\u2029)/g;
|
||||||
|
{# if (option == 'new') {#}
|
||||||
|
tag.append(evt.data.replace(newline_regx, '<br />').replace(control_regx, ''));
|
||||||
|
{# } else if (option == 'exist') {#}
|
||||||
|
{# tag.append('<pre>' + exsit_message + '</pre>');#}
|
||||||
|
{# }#}
|
||||||
|
tag.animate({ scrollTop: tag[0].scrollHeight}, 1);
|
||||||
|
};
|
||||||
|
|
||||||
|
tag[0].style.color = "#00FF00";
|
||||||
|
return tag[0];
|
||||||
|
} ,
|
||||||
|
title:'Jumpserver实时监控 '+' 登录用户名: '+'<span class="text-info">'+username+'</span>'+' 登录主机: '+'<span class="text-info">'+ip,
|
||||||
|
onhide:function(){
|
||||||
|
socket.close();
|
||||||
|
}});
|
||||||
|
}
|
||||||
|
|
||||||
|
$(document).ready(function(){
|
||||||
|
$('.monitor').click(function(){
|
||||||
|
init($(this))
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
|
function log_search(){
|
||||||
$.ajax({
|
$.ajax({
|
||||||
type: "GET",
|
type: "GET",
|
||||||
url: "/jlog/search/?env=online",
|
url: "/jlog/search/?env=online",
|
||||||
|
@ -114,9 +167,9 @@
|
||||||
$(".tab-content").html(data);
|
$(".tab-content").html(data);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
$(document).ready(function(){
|
$(document).ready(function(){
|
||||||
$('.log_command').on('click',function(){
|
$('.log_command').on('click',function(){
|
||||||
var url = $(this).attr('href');
|
var url = $(this).attr('href');
|
||||||
var username = $('#username')[0].innerText;
|
var username = $('#username')[0].innerText;
|
||||||
|
@ -142,7 +195,7 @@
|
||||||
});
|
});
|
||||||
|
|
||||||
$('')
|
$('')
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue