From 69bbdab45052a61dd120cfc7bffa67d96302fbdc Mon Sep 17 00:00:00 2001 From: ibuler Date: Fri, 4 Dec 2015 13:42:05 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E4=B8=8A=E4=BC=A0=E4=B8=8B?= =?UTF-8?q?=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- connect.py | 15 ++-- jlog/models.py | 2 + jlog/urls.py | 1 + jlog/views.py | 18 ++++ jumpserver/views.py | 11 +-- static/css/style.css | 4 +- templates/jlog/exec_detail.html | 152 ++++++++------------------------ templates/jlog/log_exec.html | 2 +- templates/jlog/log_file.html | 4 +- 9 files changed, 80 insertions(+), 129 deletions(-) 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 @@
- + {{ log.id }}
@@ -28,44 +28,30 @@ - + - + - + - - + + - - - - - - - - - - - - - - - - - + @@ -76,10 +62,10 @@ -
+
-
授权主机/组
+
结果
-
-

用户的所有授权主机

- 这里包含了用户所有的主机组和组下的主机. -
-{# {% for group in user|get_user_asset_group %}#} -{#
#} -{#
#} -{#
#} -{# #} -{# {{ group.name }}#} -{#
#} -{# 共: {{ group | group_asset_list_count }}台#} -{#
#} -{#
#} -{#

{{ group.comment }}

#} -{#

#} -{# {% for asset in group|group_asset_list %}#} -{# {{ asset.ip }}
#} -{# {% endfor %}#} -{#

#} -{#

#} -{#
#} -{#
#} -{#
#} -{# {% endfor %}#} -{# {% if not user|get_user_asset_group %}#} -{# (无)#} -{# {% endif %}#} -
-
-
- -
-
-
-
登录记录
-
- 最近登录 -
-
-
-
-
- {% for log in logs_last %} -
- - image - -
-{# {{ log.start_time|time_delta }}#} - {{ log.start_time }} - {{ log.user }} 登录了 {{ log.host }}.
- {{ log.start_time|date:"Y-m-d H:i:s" }} -
-
+
+
+
ID{{ user.id }}{{ log.id }}
用户名{{ user.username }}{{ log.user }}
来源IP{{ user.name }}{{ log.remote_ip }}
角色{{ user.id | get_role }}日期{{ log.datetime|date:"Y-m-d H:i:s" }}
Email{{ user.email }}
激活{{ user.is_active|bool2str }}
添加日期{{ user.date_joined|date:"Y-m-d H:i:s" }}
最后登录{{ user.last_login|date:"Y-m-d H:i:s" }}
所在用户组主机 - {% for group in user.group.all %} - - - + {% for asset_name in assets_hostname %} + {% if asset_name %} + + + + {% endif %} {% endfor %}
{{ group.name }}
{{ asset_name }}
+ + + + + {% for result, info in result.items %} + {% for host, msg in info.items %} + {% ifequal result 'failed' %} + + + + + {% else %} + + + + + {% endifequal %} + {% endfor %} {% endfor %} - {% if not logs_last %} - (暂无) - {% endif %} - - {% if logs_num > 10 %} - - {% endif %} - - -
命令{{ log.cmd }}
{{ host }}{{ msg }}
{{ host }}{{ msg }}
+ +