基本完成

pull/26/head
ibuler 2015-11-03 19:12:15 +08:00
parent 50d21fcdca
commit b30697ea20
4 changed files with 86 additions and 26 deletions

View File

@ -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:

View File

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

View File

@ -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){

View File

@ -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 @@
}); });
$('') $('')
}); });