mirror of https://github.com/jumpserver/jumpserver
218 lines
9.2 KiB
HTML
218 lines
9.2 KiB
HTML
|
{% extends 'base.html' %}
|
||
|
{% block content %}
|
||
|
{% include 'nav_cat_bar.html' %}
|
||
|
<style>
|
||
|
.bootstrap-dialog-body {
|
||
|
background-color: rgba(0, 0, 0, 0);
|
||
|
}
|
||
|
.bootstrap-dialog-message {
|
||
|
background-color: rgba(0, 0, 0, 0);
|
||
|
}
|
||
|
.modal-content {
|
||
|
background-color: rgba(0, 0, 0, 0.6);
|
||
|
}
|
||
|
.modal-dialog {
|
||
|
background-color: rgba(0, 0, 0, 0);
|
||
|
width: 800px;
|
||
|
}
|
||
|
.modal-body {
|
||
|
background-color: rgba(0, 0, 0, 0);
|
||
|
}
|
||
|
.modal-header {
|
||
|
background-color: #FFFFFF;
|
||
|
}
|
||
|
</style>
|
||
|
|
||
|
<div class="wrapper wrapper-content animated fadeInRight">
|
||
|
<div class="row">
|
||
|
<div class="col-lg-12">
|
||
|
<div class="ibox float-e-margins">
|
||
|
<div id="ibox-content" class="ibox-title">
|
||
|
<h5> 用户日志详细信息列表 </h5>
|
||
|
<div class="ibox-tools">
|
||
|
<a class="collapse-link">
|
||
|
<i class="fa fa-chevron-up"></i>
|
||
|
</a>
|
||
|
<a class="dropdown-toggle" data-toggle="dropdown" href="#">
|
||
|
<i class="fa fa-wrench"></i>
|
||
|
</a>
|
||
|
<ul class="dropdown-menu dropdown-user">
|
||
|
<li><a href="#">未启用 1</a>
|
||
|
</li>
|
||
|
<li><a href="#">未启用 2</a>
|
||
|
</li>
|
||
|
</ul>
|
||
|
<a class="close-link">
|
||
|
<i class="fa fa-times"></i>
|
||
|
</a>
|
||
|
</div>
|
||
|
</div>
|
||
|
|
||
|
<div class="ibox-content">
|
||
|
<div class="panel-options">
|
||
|
<ul class="nav nav-tabs">
|
||
|
<li class="active"><a href="/jlog/log_list/online/" class="text-center"><i class="fa fa-laptop"></i> 在线 </a></li>
|
||
|
<li><a href="/jlog/log_list/offline/" class="text-center"><i class="fa fa-bar-chart-o"></i> 历史记录 </a></li>
|
||
|
<li style="float: right">
|
||
|
<form id="search_form" method="get" action="" class="pull-right mail-search">
|
||
|
<div class="input-group">
|
||
|
<input type="text" class="form-control input-sm" id="search_input" name="keyword" placeholder="Search">
|
||
|
<input type="text" style="display: none">
|
||
|
<div class="input-group-btn">
|
||
|
<button id='search_btn' type="button" class="btn btn-sm btn-primary" onclick="log_search()">
|
||
|
Search
|
||
|
</button>
|
||
|
</div>
|
||
|
</div>
|
||
|
</form>
|
||
|
</li>
|
||
|
</ul>
|
||
|
</div>
|
||
|
<br/>
|
||
|
<div class="tab-content">
|
||
|
<table class="table table-striped table-bordered table-hover ">
|
||
|
<thead>
|
||
|
<tr>
|
||
|
<th class="text-center"> 用户名 </th>
|
||
|
<th class="text-center"> 登录主机 </th>
|
||
|
<th class="text-center"> 实时监控 </th>
|
||
|
<th class="text-center"> 阻断 </th>
|
||
|
<th class="text-center"> 登录时间 </th>
|
||
|
<th class="text-center"> 结束时间 </th>
|
||
|
|
||
|
</tr>
|
||
|
</thead>
|
||
|
<tbody>
|
||
|
{% for post in contacts.object_list %}
|
||
|
<tr class="gradeX">
|
||
|
<td id="username" class="text-center"> {{ post.user }} </td>
|
||
|
<td id="ip" class="text-center"> {{ post.host }} </td>
|
||
|
<td class="text-center"><a class="monitor" filename="{{ 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"> {{ post.start_time|date:"Y-m-d H:i:s" }} </td>
|
||
|
<td class="text-center"> {{ post.end_time|date:"Y-m-d H:i:s" }} </td>
|
||
|
</tr>
|
||
|
{% endfor %}
|
||
|
</tbody>
|
||
|
</table>
|
||
|
<div class="row">
|
||
|
<div class="col-sm-6 col-sm-offset-6">
|
||
|
<div class="dataTables_paginate paging_simple_numbers" id="editable_paginate">
|
||
|
<ul class="pagination" style="margin-top: 0; float: right">
|
||
|
|
||
|
{% if contacts.has_previous %}
|
||
|
<li><a href="?page={{ contacts.previous_page_number }}">«</a></li>
|
||
|
{% endif %}
|
||
|
|
||
|
{% for page in p.page_range %}
|
||
|
{% ifequal offset1 page %}
|
||
|
<li class="active"><a href="?page={{ page }}" title="第{{ page }}页">{{ page }}</a></li>
|
||
|
{% else %}
|
||
|
<li><a href="?page={{ page }}" title="第{{ page }}页">{{ page }}</a></li>
|
||
|
{% endifequal %}
|
||
|
{% endfor %}
|
||
|
{% if contacts.has_next %}
|
||
|
<li><a href="?page={{ contacts.next_page_number }}">»</a></li>
|
||
|
{% endif %}
|
||
|
</ul>
|
||
|
</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
|
||
|
|
||
|
<script src="http://{{ web_socket_host }}/socket.io/socket.io.js"></script>
|
||
|
<script>
|
||
|
$.fn.webSocket = function(opt){
|
||
|
var st = {};
|
||
|
st = $.extend(st,opt);
|
||
|
var message = {};
|
||
|
var $this = $(this);
|
||
|
var genUid = function(){
|
||
|
return new Date().getTime()+""+Math.floor(Math.random()*899+100);
|
||
|
};
|
||
|
var init = function(e){
|
||
|
var socket = io.connect('ws://'+globalConfig.SOCKET_HOST);
|
||
|
var node = $(e.target);
|
||
|
message.id = genUid();
|
||
|
message.filename = node.attr('filename');
|
||
|
var username = $('#username')[0].innerText;
|
||
|
var ip = $('#ip')[0].innerText;
|
||
|
BootstrapDialog.show({message:function(){
|
||
|
var escapeString = function (html){
|
||
|
var elem = document.createElement('div')
|
||
|
var txt = document.createTextNode(html)
|
||
|
elem.appendChild(txt)
|
||
|
return elem.innerHTML;
|
||
|
}
|
||
|
var tag = $('<div id="log" style="height: 500px;overflow: auto;background-color: rgba(0, 0, 0, 0);"></div>');
|
||
|
//告诉服务器端有用户登录
|
||
|
socket.emit('login', {userid:message.id, filename:message.filename});
|
||
|
socket.on('message',function(obj){
|
||
|
//去除log中的颜色控制字符
|
||
|
var regx = /\x1B\[([0-9]{1,3}((;[0-9]{1,3})*)?)?[m|K]/g;
|
||
|
// tag.append('<p>'+escapeString(obj.content.replace(regx,''))+'</p>');
|
||
|
tag.append('<p>'+escapeString(obj.content)+'</p>');
|
||
|
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.emit('disconnect');
|
||
|
}});
|
||
|
}
|
||
|
$this.on("click",function(e){
|
||
|
init(e);
|
||
|
return false;
|
||
|
});
|
||
|
}
|
||
|
$('.log_command').on('click',function(){
|
||
|
var url = $(this).attr('href');
|
||
|
$.ajax({url:url,success:function(data){
|
||
|
BootstrapDialog.show({title:'命令统计',message:data});
|
||
|
}});
|
||
|
return false;
|
||
|
})
|
||
|
globalConfig = {
|
||
|
SOCKET_HOST: "{{ web_socket_host }}"
|
||
|
}
|
||
|
$(".monitor").webSocket()
|
||
|
|
||
|
|
||
|
function log_search(){
|
||
|
console.log('hell0')
|
||
|
$.ajax({
|
||
|
type: "GET",
|
||
|
url: "/jlog/search/?env=online",
|
||
|
data: $("#search_form").serialize(),
|
||
|
success: function (data) {
|
||
|
$(".tab-content").html(data);
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
|
||
|
$("#search_input").keydown(function(e){
|
||
|
if(e.keyCode==13){
|
||
|
log_search()
|
||
|
}
|
||
|
})
|
||
|
|
||
|
function cut(num){
|
||
|
var g_url = "/jlog/log_kill/"+num;
|
||
|
console.log(g_url);
|
||
|
$.ajax({
|
||
|
type: "GET",
|
||
|
url: g_url,
|
||
|
success: window.open("/jlog/","_self")
|
||
|
});
|
||
|
|
||
|
}
|
||
|
</script>
|
||
|
{% endblock %}
|