Commit 53e4dc7a authored by ibuler@qq.com's avatar ibuler@qq.com

search detail

parent 76ad6730
...@@ -19,3 +19,13 @@ class Alert(models.Model): ...@@ -19,3 +19,13 @@ class Alert(models.Model):
msg = models.CharField(max_length=20) msg = models.CharField(max_length=20)
time = models.DateTimeField(null=True) time = models.DateTimeField(null=True)
is_finished = models.BigIntegerField(default=False) is_finished = models.BigIntegerField(default=False)
class TtyLog(models.Model):
log_id = models.IntegerField(max_length=50)
username = models.CharField(max_length=100)
host = models.CharField(max_length=100)
remote_ip = models.CharField(max_length=100)
datetime = models.DateTimeField()
cmd = models.CharField(max_length=200)
...@@ -8,5 +8,5 @@ urlpatterns = patterns('', ...@@ -8,5 +8,5 @@ urlpatterns = patterns('',
# url(r'^log_kill/', log_kill), # url(r'^log_kill/', log_kill),
url(r'^history/$', log_history), url(r'^history/$', log_history),
url(r'^record/$', log_record), url(r'^record/$', log_record),
# url(r'^search/$', log_search), url(r'^search/$', log_search),
) )
\ No newline at end of file \ No newline at end of file
...@@ -92,14 +92,11 @@ def log_list(request, offset): ...@@ -92,14 +92,11 @@ def log_list(request, offset):
def log_history(request): def log_history(request):
""" 命令历史记录 """ """ 命令历史记录 """
log_id = request.GET.get('id', 0) log_id = request.GET.get('id', 0)
log = Log.objects.filter(id=int(log_id)) tty_logs = TtyLog.objects.filter(log_id=int(log_id)).order_by('datetime')
if log: if tty_logs:
log = log[0] content = ''
log_his = "%s.his" % log.log_path for tty_log in tty_logs:
print log_his content += '%s: %s\n' % (tty_log.datetime.now().strftime('%Y-%m-%d %H:%M:%S'), tty_log.cmd)
if os.path.isfile(log_his):
f = open(log_his)
content = f.read()
return HttpResponse(content) return HttpResponse(content)
else: else:
return HttpResponse('无日志记录, 请查看日志处理脚本是否开启!') return HttpResponse('无日志记录, 请查看日志处理脚本是否开启!')
...@@ -119,6 +116,10 @@ def log_record(request): ...@@ -119,6 +116,10 @@ def log_record(request):
return HttpResponse('无日志记录, 请查看日志处理脚本是否开启!') return HttpResponse('无日志记录, 请查看日志处理脚本是否开启!')
def log_search(request):
print request.GET
return render_to_response('jlog/log_filter.html', locals())
# def log_search(request): # def log_search(request):
# """ 日志搜索 """ # """ 日志搜索 """
# offset = request.GET.get('env', '') # offset = request.GET.get('env', '')
......
...@@ -20,7 +20,7 @@ from django.template import RequestContext ...@@ -20,7 +20,7 @@ from django.template import RequestContext
from juser.models import User, UserGroup from juser.models import User, UserGroup
from jasset.models import Asset, AssetGroup from jasset.models import Asset, AssetGroup
from jasset.models import AssetAlias from jasset.models import AssetAlias
from jlog.models import Log from jlog.models import Log, TtyLog
from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned
from django.http import HttpResponseRedirect from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response from django.shortcuts import render_to_response
...@@ -202,7 +202,6 @@ class Jtty(object): ...@@ -202,7 +202,6 @@ class Jtty(object):
try: try:
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')
log_res_f = open(log_file_path + '.his', 'a')
except IOError: except IOError:
raise ServerError('Create logfile failed, Please modify %s permission.' % today_connect_log_dir) raise ServerError('Create logfile failed, Please modify %s permission.' % today_connect_log_dir)
...@@ -210,14 +209,14 @@ class Jtty(object): ...@@ -210,14 +209,14 @@ class Jtty(object):
log_path=log_file_path, start_time=datetime.datetime.now(), pid=pid) log_path=log_file_path, start_time=datetime.datetime.now(), pid=pid)
log_file_f.write('Start time is %s\n' % datetime.datetime.now()) log_file_f.write('Start time is %s\n' % datetime.datetime.now())
log.save() log.save()
return log_file_f, log_time_f, log_res_f, log return log_file_f, log_time_f, ip_list, log
def posix_shell(self): def posix_shell(self):
""" """
Use paramiko channel connect server interactive. Use paramiko channel connect server interactive.
使用paramiko模块的channel,连接后端,进入交互式 使用paramiko模块的channel,连接后端,进入交互式
""" """
log_file_f, log_time_f, log_res_f, log = self.log_record() log_file_f, log_time_f, ip_list, log = self.log_record()
old_tty = termios.tcgetattr(sys.stdin) old_tty = termios.tcgetattr(sys.stdin)
pre_timestamp = time.time() pre_timestamp = time.time()
input_r = '' input_r = ''
...@@ -261,8 +260,7 @@ class Jtty(object): ...@@ -261,8 +260,7 @@ class Jtty(object):
if str(x) in ['\r', '\n', '\r\n']: if str(x) in ['\r', '\n', '\r\n']:
input_r = remove_control_char(input_r) input_r = remove_control_char(input_r)
log_res_f.write('%s: %s\n' % (datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"), input_r)) TtyLog(log_id=log.id, username=self.username, host=self.ip, remote_ip=ip_list, datetime=datetime.datetime.now(), cmd=input_r).save()
log_res_f.flush()
input_r = '' input_r = ''
input_mode = False input_mode = False
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
{% extends 'base.html' %}
{% block self_head_css_js %}
<link href="/static/css/plugins/datapicker/datepicker3.css" rel="stylesheet">
<link href="/static/css/plugins/chosen/chosen.css" rel="stylesheet">
<script src="/static/js/plugins/chosen/chosen.jquery.js"></script>
{% endblock %}
{% block content %}
{% include 'nav_cat_bar.html' %}
<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>
<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><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 class="active"><a href="/jlog/search/" class="text-center"><i class="fa fa-bar-chart-o"></i> 详细搜索 </a></li>
</ul>
</div>
<br/>
<div class="tab-content">
<form method="get" action="" role="form" class="form-inline">
<p>
选择相应条件进行搜索
</p>
<div class="form-group" id="data_5">
<div class="input-daterange input-group" id="datepicker">
<input type="text" class="input-sm form-control" style="width: 100px;" name="start" value="{{ date_seven_day }}">
<span class="input-group-addon">to</span>
<input type="text" class="input-sm form-control" style="width: 100px;" name="end" value="{{ date_now_str }}">
</div>
</div>
<div class="form-group">
<div class="input-group">
<select name="single" data-placeholder="用户名" class="chosen-select" multiple style="width:300px;" tabindex="2">
<option value="用户">用户名</option>
<option value="Bolivia, Plurinational State of">hongweiguang</option>
<option value="Bonaire, Sint Eustatius and Saba">wangyong</option>
<option value="Bosnia and Herzegovina">hehe</option>
<option value="Botswana">wangyong</option>
<option value="Bouvet Island">wangyongd</option>
<option value="Romania">Romania</option>
<option value="Zambia">Zambia</option>
<option value="Zimbabwe">Zimbabwe</option>
</select>
</div>
</div>
<div class="form-group">
<div class="input-group">
<select name="multi" data-placeholder="主机" class="chosen-select" multiple style="width:200px;" tabindex="4">
<option value="主机">主机</option>
<option value="United States">172.16.1.1</option>
<option value="Afghanistan">172.16.1.1</option>
<option value="Aland Islands">172.16.1.1</option>
<option value="Albania">172.16.1.1</option>
<option value="Algeria">172.16.1.1</option>
<option value="American Samoa">172.16.1.1</option>
<option value="Andorra">172.16.1.1</option>
<option value="Angola">172.16.1.1</option>
<option value="Anguilla">172.16.1.1</option>
<option value="Antarctica">172.16.1.1</option>
</select>
</div>
</div>
<div class="form-group">
<input id="cmd" name="cmd" placeholder="命令" type="text" class="form-control" style="width: 200px;">
</div>
<div class="form-group">
<button id="submit_button" class="btn btn-primary" type="submit">搜索</button>
</div>
</form>
<div class="row">
<div class="col-sm-6">
</div>
{% include 'paginator.html' %}
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<script>
function log_search(){
$.ajax({
type: "GET",
url: "/jlog/search/?env=offline",
data: $("#search_form").serialize(),
success: function (data) {
$(".tab-content").html(data);
}
});
}
$(document).ready(function(){
$('#data_5 .input-daterange').datepicker({
dateFormat: 'yy-mm-dd',
keyboardNavigation: false,
forceParse: false,
autoclose: true
});
});
var config = {
'.chosen-select' : {},
'.chosen-select-deselect' : {allow_single_deselect:true},
'.chosen-select-no-single' : {disable_search_threshold:10},
'.chosen-select-no-results': {no_results_text:'Oops, nothing found!'},
'.chosen-select-width' : {width:"95%"}
};
for (var selector in config) {
$(selector).chosen(config[selector]);
}
</script>
{% endblock %}
{% block self_footer_js %}
<script src="/static/js/cropper/cropper.min.js"></script>
<script src="/static/js/datapicker/bootstrap-datepicker.js"></script>
<script src="/static/js/plugins/chosen/chosen.jquery.js"></script>
{% endblock %}
\ No newline at end of file
{% extends 'base.html' %} {% extends 'base.html' %}
{% block self_head_css_js %} {% block self_head_css_js %}
<link href="/static/css/plugins/datapicker/datepicker3.css" rel="stylesheet"> <link href="/static/css/plugins/datapicker/datepicker3.css" rel="stylesheet">
<link href="/static/css/plugins/chosen/chosen.css" rel="stylesheet">
<script src="/static/js/plugins/chosen/chosen.jquery.js"></script>
{% endblock %} {% endblock %}
{% block content %} {% block content %}
{% include 'nav_cat_bar.html' %} {% include 'nav_cat_bar.html' %}
...@@ -54,8 +56,13 @@ ...@@ -54,8 +56,13 @@
<ul class="nav nav-tabs"> <ul class="nav nav-tabs">
<li><a href="/jlog/log_list/online/" class="text-center"><i class="fa fa-laptop"></i> 在线 </a></li> <li><a href="/jlog/log_list/online/" class="text-center"><i class="fa fa-laptop"></i> 在线 </a></li>
<li class="active"><a href="/jlog/log_list/offline/" class="text-center"><i class="fa fa-bar-chart-o"></i> 历史记录 </a></li> <li class="active"><a href="/jlog/log_list/offline/" class="text-center"><i class="fa fa-bar-chart-o"></i> 历史记录 </a></li>
<li style="float: right"> {# <li><a href="/jlog/search/" class="text-center"><i class="fa fa-bar-chart-o"></i> 详细搜索 </a></li>#}
</ul>
</div>
<br/>
<form class="form-inline" action="" method="get"> <form class="form-inline" action="" method="get">
<div class="form-group" id="data_5">
<div class="form-group" id="data_5"> <div class="form-group" id="data_5">
<div class="input-daterange input-group" id="datepicker"> <div class="input-daterange input-group" id="datepicker">
<input type="text" class="input-sm form-control" style="width: 100px;" name="start" value="{{ date_seven_day }}"> <input type="text" class="input-sm form-control" style="width: 100px;" name="start" value="{{ date_seven_day }}">
...@@ -64,16 +71,45 @@ ...@@ -64,16 +71,45 @@
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<input type="text" class="form-control input-sm" id="search_input" name="keyword" placeholder="Search"> <div class="input-group">
<select name="single" data-placeholder="用户名" class="chosen-select" multiple style="width:200px;" tabindex="2">
<option value="用户">用户名</option>
<option value="Bolivia, Plurinational State of">hongweiguang</option>
<option value="Bonaire, Sint Eustatius and Saba">wangyong</option>
<option value="Bosnia and Herzegovina">hehe</option>
<option value="Botswana">wangyong</option>
<option value="Bouvet Island">wangyongd</option>
<option value="Romania">Romania</option>
<option value="Zambia">Zambia</option>
<option value="Zimbabwe">Zimbabwe</option>
</select>
</div>
</div>
<div class="form-group">
<div class="input-group">
<select name="multi" data-placeholder="主机" class="chosen-select" multiple style="width:200px;" tabindex="4">
<option value="主机">主机</option>
<option value="United States">172.16.1.1</option>
<option value="Afghanistan">172.16.1.1</option>
<option value="Aland Islands">172.16.1.1</option>
<option value="Albania">172.16.1.1</option>
<option value="Algeria">172.16.1.1</option>
<option value="American Samoa">172.16.1.1</option>
<option value="Andorra">172.16.1.1</option>
<option value="Angola">172.16.1.1</option>
<option value="Anguilla">172.16.1.1</option>
<option value="Antarctica">172.16.1.1</option>
</select>
</div>
</div>
<div class="form-group">
<input id="cmd" name="cmd" placeholder="命令" type="text" class="form-control" style="width: 200px;">
</div>
</div> </div>
<button id='search_btn' type="submit" class="btn btn-sm btn-primary"> <button id='search_btn' type="submit" class="btn btn-sm btn-primary">
Search Search
</button> </button>
</form> </form>
</li>
</ul>
</div>
<br/>
<div class="tab-content"> <div class="tab-content">
<table class="table table-striped table-bordered table-hover "> <table class="table table-striped table-bordered table-hover ">
<thead> <thead>
...@@ -91,6 +127,7 @@ ...@@ -91,6 +127,7 @@
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{% for post in contacts.object_list %} {% for post in contacts.object_list %}
<tr class="gradeX"> <tr class="gradeX">
<td class="text-center" id="username"> {{ post.user }} </td> <td class="text-center" id="username"> {{ post.user }} </td>
...@@ -167,6 +204,17 @@ ...@@ -167,6 +204,17 @@
autoclose: true autoclose: true
}); });
var config = {
'.chosen-select' : {},
'.chosen-select-deselect' : {allow_single_deselect:true},
'.chosen-select-no-single' : {disable_search_threshold:10},
'.chosen-select-no-results': {no_results_text:'Oops, nothing found!'},
'.chosen-select-width' : {width:"95%"}
};
for (var selector in config) {
$(selector).chosen(config[selector]);
}
</script> </script>
{% endblock %} {% endblock %}
{% block self_footer_js %} {% block self_footer_js %}
......
...@@ -50,6 +50,7 @@ ...@@ -50,6 +50,7 @@
<ul class="nav nav-tabs"> <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 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><a href="/jlog/log_list/offline/" class="text-center"><i class="fa fa-bar-chart-o"></i> 历史记录 </a></li>
<li><a href="/jlog/search/" class="text-center"><i class="fa fa-bar-chart-o"></i> 详细搜索 </a></li>
</ul> </ul>
</div> </div>
<br/> <br/>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment