diff --git a/connect.py b/connect.py
index 7111436f4..4ab1f4934 100644
--- a/connect.py
+++ b/connect.py
@@ -565,10 +565,11 @@ class Nav(object):
while True:
print "请输入执行的命令, 按q退出"
command = raw_input("\033[1;32mCmds>:\033[0m ").strip()
- ExecLog(host=asset_name_str, user=self.user.username, cmd=command, remote_ip=remote_ip).save()
if command == 'q':
break
runner.run('shell', command, pattern=pattern)
+ ExecLog(host=asset_name_str, user=self.user.username, cmd=command, remote_ip=remote_ip,
+ result=runner.results).save()
for k, v in runner.results.items():
if k == 'ok':
for host, output in v.items():
@@ -605,7 +606,6 @@ class Nav(object):
if not asset_name_str:
color_print('没有匹配主机')
- print
continue
tmp_dir = get_tmp_dir()
logger.debug('Upload tmp dir: %s' % tmp_dir)
@@ -613,15 +613,16 @@ class Nav(object):
bash('rz')
filename_str = ' '.join(os.listdir(tmp_dir))
if not filename_str:
- print color_print("上传文件为空")
+ color_print("上传文件为空")
continue
logger.debug('上传文件: %s' % filename_str)
- FileLog(user=self.user.name, host=asset_name_str, filename=filename_str,
- remote_ip=remote_ip, type='upload').save()
+
runner = MyRunner(res)
runner.run('copy', module_args='src=%s dest=%s directory_mode'
% (tmp_dir, tmp_dir), pattern=pattern)
ret = runner.results
+ FileLog(user=self.user.name, host=asset_name_str, filename=filename_str,
+ remote_ip=remote_ip, type='upload', result=ret).save()
logger.debug('Upload file: %s' % ret)
if ret.get('failed'):
error = '上传目录: %s \n上传失败: [ %s ] \n上传成功 [ %s ]' % (tmp_dir,
@@ -667,10 +668,10 @@ class Nav(object):
file_path = raw_input("\033[1;32mPath>:\033[0m ").strip()
if file_path == 'q':
break
- FileLog(user=self.user.name, host=asset_name_str, filename=file_path, type='download',
- remote_ip=remote_ip).save()
runner.run('fetch', module_args='src=%s dest=%s' % (file_path, tmp_dir), pattern=pattern)
ret = runner.results
+ FileLog(user=self.user.name, host=asset_name_str, filename=file_path, type='download',
+ remote_ip=remote_ip, result=ret).save()
logger.debug('Download file result: %s' % ret)
os.chdir('/tmp')
tmp_dir_name = os.path.basename(tmp_dir)
diff --git a/jlog/models.py b/jlog/models.py
index ef1f81a33..c8ffd77a2 100644
--- a/jlog/models.py
+++ b/jlog/models.py
@@ -33,6 +33,7 @@ class ExecLog(models.Model):
host = models.TextField()
cmd = models.TextField()
remote_ip = models.CharField(max_length=100)
+ result = models.TextField(default='')
datetime = models.DateTimeField(auto_now=True)
@@ -42,6 +43,7 @@ class FileLog(models.Model):
filename = models.TextField()
type = models.CharField(max_length=20)
remote_ip = models.CharField(max_length=100)
+ result = models.TextField(default='')
datetime = models.DateTimeField(auto_now=True)
diff --git a/jlog/urls.py b/jlog/urls.py
index 956fbf839..a490f46eb 100644
--- a/jlog/urls.py
+++ b/jlog/urls.py
@@ -5,6 +5,7 @@ from jlog.views import *
urlpatterns = patterns('',
(r'^$', log_list),
(r'^log_list/(\w+)/$', log_list),
+ (r'^log_detail/(\w+)/$', log_detail),
(r'^history/$', log_history),
(r'^log_kill/', log_kill),
(r'^record/$', log_record),
diff --git a/jlog/views.py b/jlog/views.py
index 9b492fa9a..a6564cbfb 100644
--- a/jlog/views.py
+++ b/jlog/views.py
@@ -129,3 +129,21 @@ def web_terminal(request):
web_terminal_uri = 'ws://%s/terminal?id=%s&role=%s' % (WEB_SOCKET_HOST, asset_id, role_name)
return render_to_response('jlog/web_terminal.html', locals())
+
+@require_role('admin')
+def log_detail(request, offset):
+ log_id = request.GET.get('id')
+ if offset == 'exec':
+ log = get_object(ExecLog, id=log_id)
+ assets_hostname = log.host.split(' ')
+ result = eval(str(log.result))
+ return my_render('jlog/exec_detail.html', locals(), request)
+ elif offset == 'file':
+ log = get_object(FileLog, id=log_id)
+ assets_hostname = log.host.split(' ')
+ file_list = log.filename.split(' ')
+ try:
+ result = eval(str(log.result))
+ except (SyntaxError, NameError):
+ result = {}
+ return my_render('jlog/file_detail.html', locals(), request)
diff --git a/jumpserver/views.py b/jumpserver/views.py
index cd646214f..dfa312819 100644
--- a/jumpserver/views.py
+++ b/jumpserver/views.py
@@ -302,12 +302,10 @@ def upload(request):
illegal_asset = set(asset_select).issubset(set(assets))
return HttpResponse('没有权限的服务器 %s' % ','.join([asset.hostname for asset in illegal_asset]))
- FileLog(user=request.user.username, host=' '.join([asset.hostname for asset in asset_select]),
- filename=' '.join([f.name for f in upload_files]), type='upload', remote_ip=remote_ip).save()
+
for upload_file in upload_files:
file_path = '%s/%s' % (upload_dir, upload_file.name)
- # file_dict[upload_file.name] = file_path
with open(file_path, 'w') as f:
for chunk in upload_file.chunks():
f.write(chunk)
@@ -318,6 +316,9 @@ def upload(request):
% (upload_dir, upload_dir), pattern='*')
ret = runner.results
logger.debug(ret)
+ FileLog(user=request.user.username, host=' '.join([asset.hostname for asset in asset_select]),
+ filename=' '.join([f.name for f in upload_files]), type='upload', remote_ip=remote_ip,
+ result=ret).save()
if ret.get('failed'):
error = '上传目录: %s
上传失败: [ %s ]
上传成功 [ %s ]' % (upload_dir,
', '.join(ret.get('failed').keys()),
@@ -346,11 +347,11 @@ def download(request):
illegal_asset = set(asset_select).issubset(set(assets))
return HttpResponse('没有权限的服务器 %s' % ','.join([asset.hostname for asset in illegal_asset]))
- FileLog(user=request.user.username, host=' '.join([asset.hostname for asset in asset_select]),
- filename=file_path, type='download', remote_ip=remote_ip).save()
res = gen_resource({'user': user, 'asset': asset_select})
runner = MyRunner(res)
runner.run('fetch', module_args='src=%s dest=%s' % (file_path, upload_dir), pattern='*')
+ FileLog(user=request.user.username, host=' '.join([asset.hostname for asset in asset_select]),
+ filename=file_path, type='download', remote_ip=remote_ip, result=runner.results).save()
logger.debug(runner.results)
os.chdir('/tmp')
tmp_dir_name = os.path.basename(upload_dir)
diff --git a/static/css/style.css b/static/css/style.css
index b8a15d909..2dc7a2591 100644
--- a/static/css/style.css
+++ b/static/css/style.css
@@ -2822,7 +2822,9 @@ body.body-small .footer.fixed {
.table > thead > tr > td,
.table > tbody > tr > td,
.table > tfoot > tr > td {
- border-top: 1px solid #e7eaec;
+ /*border-top: 1px solid #e7eaec;*/
+ border-bottom: 1px solid #e7eaec;
+ border-top: none;
line-height: 1.42857;
padding: 8px;
vertical-align: top;
diff --git a/templates/jlog/exec_detail.html b/templates/jlog/exec_detail.html
index 45eb21d4d..1a0baf7b2 100644
--- a/templates/jlog/exec_detail.html
+++ b/templates/jlog/exec_detail.html
@@ -7,7 +7,7 @@