{% 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); } .pre-class { background-color: rgba(0, 0, 0, 1); } .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> </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> </tr> {% endfor %} </tbody> </table> <div class="row"> <div class="col-sm-6"></div> {% include 'paginator.html' %} </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 option, exsit_message; 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){ option = obj.option; console.log(option+'so') exsit_message = obj.content; console.log(obj.content) //去除log中的颜色控制字符 var regx = /\x1B\[([0-9]{1,3}((;[0-9]{1,3})*)?)?[m|K]/g; // tag.append('<p>'+escapeString(obj.content.replace(regx,''))+'</p>'); if (option == 'new') { tag.append('<p style="margin: 2px">' + escapeString(obj.content) + '</p>'); } else if (option == 'exist') { tag.append('<p style="margin: 0">' + exsit_message + '</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 %}