From c940a4c0fb882a49112c80ba9f196b401af45527 Mon Sep 17 00:00:00 2001 From: ibuler Date: Thu, 23 Mar 2017 00:15:25 +0800 Subject: [PATCH 1/7] =?UTF-8?q?[Fixture]=20=E5=A2=9E=E5=8A=A0=20task=20lis?= =?UTF-8?q?t=20=E5=88=A0=E9=99=A4=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/assets/tasks.py | 3 +- apps/assets/templates/assets/asset_list.html | 38 +--------------- apps/ops/api.py | 15 ++++++ apps/ops/api/__init__.py | 1 - apps/ops/api/exc.py | 16 ------- apps/ops/api/permissions.py | 19 -------- apps/ops/api/serializers.py | 4 -- apps/ops/api/views.py | 7 --- apps/ops/hands.py | 4 ++ apps/ops/serializers.py | 13 ++++++ apps/ops/templates/ops/task_list.html | 48 ++++---------------- apps/ops/urls/api_urls.py | 8 +++- 12 files changed, 50 insertions(+), 126 deletions(-) create mode 100644 apps/ops/api.py delete mode 100644 apps/ops/api/__init__.py delete mode 100644 apps/ops/api/exc.py delete mode 100644 apps/ops/api/permissions.py delete mode 100644 apps/ops/api/serializers.py delete mode 100644 apps/ops/api/views.py create mode 100644 apps/ops/hands.py create mode 100644 apps/ops/serializers.py diff --git a/apps/assets/tasks.py b/apps/assets/tasks.py index 89e2e410e..b716dc644 100644 --- a/apps/assets/tasks.py +++ b/apps/assets/tasks.py @@ -12,8 +12,7 @@ def update_assets_hardware_info(assets): task_tuple = ( ('setup', ''), ) - task_name = ','.join([asset.hostname for asset in assets]) - summary, result = run_AdHoc(task_tuple, assets, record=True, task_name=task_name) + summary, result = run_AdHoc(task_tuple, assets, record=False) for hostname, info in result['contacted'].items(): if info: info = info[0]['ansible_facts'] diff --git a/apps/assets/templates/assets/asset_list.html b/apps/assets/templates/assets/asset_list.html index d12462cab..6641fb0e6 100644 --- a/apps/assets/templates/assets/asset_list.html +++ b/apps/assets/templates/assets/asset_list.html @@ -104,37 +104,6 @@ function tagShow() { } } //onload; -function objDelete(obj, name, url) { - function doDelete() { - var body = {}; - var success = function() { - swal('Deleted!', "[ "+name+"]"+" has been deleted ", "success"); - $(obj).parent().parent().remove(); - }; - var fail = function() { - swal("Failed", "Delete"+"[ "+name+" ]"+"failed", "error"); - }; - APIUpdateAttr({ - url: url, - body: JSON.stringify(body), - method: 'DELETE', - success: success, - error: fail - }); - } - swal({ - title: 'Are you sure delete ?', - text: " [" + name + "] ", - type: "warning", - showCancelButton: true, - cancelButtonText: 'Cancel', - confirmButtonColor: "#DD6B55", - confirmButtonText: 'Confirm', - closeOnConfirm: false - }, function () { - doDelete() - }); -} $(document).ready(function(){ var options = { @@ -214,15 +183,10 @@ $(document).ready(function(){ .on('click', '.btn_asset_delete', function () { var $this = $(this); - var $data_table = $("#asset_list_table").DataTable(); var name = $(this).closest("tr").find(":nth-child(2)").children('a').html(); var uid = $this.data('uid'); var the_url = '{% url "api-assets:asset-detail" pk=99991937 %}'.replace('99991937', uid); - console.log(the_url); - objDelete($this, name, the_url); - setTimeout( function () { - $data_table.ajax.reload(); - }, 3000); + objectDelete($this, name, the_url); }) .on('click', '#btn_bulk_update', function () { diff --git a/apps/ops/api.py b/apps/ops/api.py new file mode 100644 index 000000000..3a9e45b25 --- /dev/null +++ b/apps/ops/api.py @@ -0,0 +1,15 @@ +# ~*~ coding: utf-8 ~*~ + + +from rest_framework import viewsets + +from .hands import IsSuperUser +from .models import Task +from .serializers import TaskSerializer + + +class TaskViewSet(viewsets.ModelViewSet): + queryset = Task.objects.all() + serializer_class = TaskSerializer + permission_classes = (IsSuperUser,) + diff --git a/apps/ops/api/__init__.py b/apps/ops/api/__init__.py deleted file mode 100644 index c8b15abe0..000000000 --- a/apps/ops/api/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from views import * \ No newline at end of file diff --git a/apps/ops/api/exc.py b/apps/ops/api/exc.py deleted file mode 100644 index 81deb805c..000000000 --- a/apps/ops/api/exc.py +++ /dev/null @@ -1,16 +0,0 @@ -# ~*~ coding: utf-8 ~*~ -from __future__ import unicode_literals, print_function - -from rest_framework.exceptions import APIException -from django.utils.translation import ugettext as _ - - -class ServiceUnavailable(APIException): - status_code = default_code = 503 - default_detail = _('Service temporarily unavailable, try again later.') - - -class ServiceNotImplemented(APIException): - status_code = default_code = 501 - default_detail = _('This service maybe implemented in the future, but now not implemented!') - diff --git a/apps/ops/api/permissions.py b/apps/ops/api/permissions.py deleted file mode 100644 index 0fc0d0861..000000000 --- a/apps/ops/api/permissions.py +++ /dev/null @@ -1,19 +0,0 @@ -# ~*~ coding: utf-8 ~*~ -from __future__ import unicode_literals - -from rest_framework import permissions - - -class AdminUserRequired(permissions.BasePermission): - """ - Custom permission to only allow admin user to access the resource. - """ - - def has_object_permission(self, request, view, obj): - # Read permissions are allowed to any request, - # so we'll always allow GET, HEAD or OPTIONS requests. - if request.method in permissions.SAFE_METHODS: - return True - - # Write permissions are only allowed to the admin role. - return request.user.is_staff diff --git a/apps/ops/api/serializers.py b/apps/ops/api/serializers.py deleted file mode 100644 index af472b3cb..000000000 --- a/apps/ops/api/serializers.py +++ /dev/null @@ -1,4 +0,0 @@ -# ~*~ coding: utf-8 ~*~ -from __future__ import unicode_literals - - diff --git a/apps/ops/api/views.py b/apps/ops/api/views.py deleted file mode 100644 index affa9cdc7..000000000 --- a/apps/ops/api/views.py +++ /dev/null @@ -1,7 +0,0 @@ -# ~*~ coding: utf-8 ~*~ -from __future__ import unicode_literals -from rest_framework import viewsets - -from serializers import * -from permissions import * - diff --git a/apps/ops/hands.py b/apps/ops/hands.py new file mode 100644 index 000000000..d7175db18 --- /dev/null +++ b/apps/ops/hands.py @@ -0,0 +1,4 @@ +# ~*~ coding: utf-8 ~*~ + +from users.permissions import IsSuperUser + diff --git a/apps/ops/serializers.py b/apps/ops/serializers.py new file mode 100644 index 000000000..986ee66e6 --- /dev/null +++ b/apps/ops/serializers.py @@ -0,0 +1,13 @@ +# ~*~ coding: utf-8 ~*~ +from __future__ import unicode_literals +from rest_framework import serializers + +from .models import Task + + +class TaskSerializer(serializers.ModelSerializer): + class Meta: + model = Task + fields = '__all__' + + diff --git a/apps/ops/templates/ops/task_list.html b/apps/ops/templates/ops/task_list.html index cb64849a4..dac614805 100644 --- a/apps/ops/templates/ops/task_list.html +++ b/apps/ops/templates/ops/task_list.html @@ -35,7 +35,7 @@ {% endblock %} {% block table_head %} - + {% trans 'Name' %} {% trans 'Asset' %} {% trans 'Success' %} @@ -69,6 +69,7 @@ {{ object.timedelta }} s {% trans "Run again" %} + {% trans "Delete" %} {% endfor %} @@ -92,45 +93,14 @@ forceParse: false, autoclose: true }); + + }).on('click', '.btn-del', function () { + var $this = $(this); + var name = $(this).closest("tr").find(":nth-child(2)").children('a').html(); + var uid = $this.data('uid'); + var the_url = '{% url "api-ops:task-detail" pk=99991937 %}'.replace('99991937', uid); + objectDelete($this, name, the_url); }) -{# function terminateConnection(data) {#} -{# function success() {#} -{# window.setTimeout(function () {#} -{# window.location.reload()#} -{# }, 300)#} -{# }#} -{# var the_url = "{% url 'api-applications:terminate-connection' %}";#} -{# APIUpdateAttr({url: the_url, method: 'POST', body: JSON.stringify(data), success: success, success_message: 'Terminate success'});#} -{# }#} -{# $(document).ready(function() {#} -{# $('table').DataTable({#} -{# "searching": false,#} -{# "paging": false,#} -{# "bInfo" : false,#} -{# "order": []#} -{# });#} -{# $('.select2').select2();#} -{# $('#date .input-daterange').datepicker({#} -{# dateFormat: 'mm/dd/yy',#} -{# keyboardNavigation: false,#} -{# forceParse: false,#} -{# autoclose: true#} -{# });#} -{# }).on('click', '.btn-term', function () {#} -{# var $this = $(this);#} -{# var proxy_log_id = $this.attr('value');#} -{# var data = {#} -{# proxy_log_id: proxy_log_id#} -{# };#} -{# terminateConnection(data)#} -{# }).on('click', '#btn_bulk_update', function () {#} -{# var data = [];#} -{# $('.cbx-term:checked').each(function () {#} -{# data.push({proxy_log_id: $(this).attr('value')})#} -{# });#} -{# terminateConnection(data)#} -{# })#} -{# #} {% endblock %} diff --git a/apps/ops/urls/api_urls.py b/apps/ops/urls/api_urls.py index d97d28a4a..c96bfb926 100644 --- a/apps/ops/urls/api_urls.py +++ b/apps/ops/urls/api_urls.py @@ -2,6 +2,12 @@ from __future__ import unicode_literals from rest_framework.routers import DefaultRouter +from .. import api -urlpatterns = [] \ No newline at end of file +router = DefaultRouter() +router.register(r'v1/tasks', api.TaskViewSet, 'task') + +urlpatterns = [] + +urlpatterns += router.urls From b60e5a7ee308fd8536f4a01cf4c068086e8725d3 Mon Sep 17 00:00:00 2001 From: ibuler Date: Fri, 24 Mar 2017 00:27:33 +0800 Subject: [PATCH 2/7] =?UTF-8?q?[Change]=20=E4=BF=AE=E6=94=B9=E4=B8=80?= =?UTF-8?q?=E4=BA=9Bview?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/assets/models/asset.py | 7 +- apps/assets/models/user.py | 18 +- ..._list.html => proxy_log_offline_list.html} | 0 .../audits/proxy_log_online_list.html | 173 ++++++++++++++++++ apps/audits/urls/views_urls.py | 12 +- apps/audits/views.py | 34 +++- apps/common/utils.py | 6 +- apps/ops/ansible/inventory.py | 12 +- apps/ops/ansible/runner.py | 6 +- apps/ops/templates/ops/task_detail.html | 35 ++++ apps/ops/utils.py | 9 +- apps/ops/views.py | 2 + apps/perms/tasks.py | 4 +- apps/templates/_nav.html | 7 +- tmp/.gitkeep | 0 15 files changed, 300 insertions(+), 25 deletions(-) rename apps/audits/templates/audits/{proxy_log_list.html => proxy_log_offline_list.html} (100%) create mode 100644 apps/audits/templates/audits/proxy_log_online_list.html create mode 100644 tmp/.gitkeep diff --git a/apps/assets/models/asset.py b/apps/assets/models/asset.py index 068f41aa2..1e6540586 100644 --- a/apps/assets/models/asset.py +++ b/apps/assets/models/asset.py @@ -112,7 +112,12 @@ class Asset(models.Model): 'groups': [group.name for group in self.groups.all()], 'username': self.admin_user.username if self.admin_user else '', 'password': self.admin_user.password if self.admin_user else '', - 'private_key': self.admin_user.private_key if self.admin_user else None, + 'private_key': self.admin_user.private_key_file if self.admin_user else None, + 'become': { + 'method': self.admin_user.become_method, + 'user': self.admin_user.become_user, + 'pass': self.admin_user.become_pass, + } if self.admin_user.become else {}, } class Meta: diff --git a/apps/assets/models/user.py b/apps/assets/models/user.py index ee2a156ab..48d0f4029 100644 --- a/apps/assets/models/user.py +++ b/apps/assets/models/user.py @@ -3,12 +3,14 @@ # from __future__ import unicode_literals - +import os import logging +from hashlib import md5 from django.core.exceptions import ValidationError from django.db import models from django.utils.translation import ugettext_lazy as _ +from django.conf import settings from common.utils import signer, validate_ssh_private_key, ssh_key_string_to_obj @@ -38,7 +40,7 @@ class AdminUser(models.Model): become = models.BooleanField(default=True) become_method = models.CharField(choices=BECOME_METHOD_CHOICES, default='sudo', max_length=4) become_user = models.CharField(default='root', max_length=64) - become_password = models.CharField(default='', max_length=128) + become_pass = models.CharField(default='', max_length=128) _public_key = models.CharField( max_length=4096, blank=True, verbose_name=_('SSH public key')) comment = models.TextField(blank=True, verbose_name=_('Comment')) @@ -74,6 +76,18 @@ class AdminUser(models.Model): def private_key(self, private_key_raw): self._private_key = signer.sign(private_key_raw) + @property + def private_key_file(self): + if not self.private_key: + return None + project_dir = settings.PROJECT_DIR + tmp_dir = os.path.join(project_dir, 'tmp') + key_name = md5(self._private_key).hexdigest() + key_path = os.path.join(tmp_dir, key_name) + if not os.path.exists(key_path): + self.private_key.write_private_key_file(key_path) + return key_path + @property def public_key(self): return signer.unsign(self._public_key) diff --git a/apps/audits/templates/audits/proxy_log_list.html b/apps/audits/templates/audits/proxy_log_offline_list.html similarity index 100% rename from apps/audits/templates/audits/proxy_log_list.html rename to apps/audits/templates/audits/proxy_log_offline_list.html diff --git a/apps/audits/templates/audits/proxy_log_online_list.html b/apps/audits/templates/audits/proxy_log_online_list.html new file mode 100644 index 000000000..6a3c815b0 --- /dev/null +++ b/apps/audits/templates/audits/proxy_log_online_list.html @@ -0,0 +1,173 @@ +{% extends '_base_list.html' %} +{% load i18n %} +{% load static %} +{% block content_left_head %} + + +{% endblock %} + + +{% block table_search %} +
+
+
+ + + to + +
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+ +
+
+
+{% endblock %} + +{% block table_head %} + + {% trans 'ID' %} + {% trans 'User' %} + {% trans 'Asset' %} + {% trans 'System user' %} + {% trans 'Terminal' %} + {% trans 'Command' %} + {% trans 'Success' %} + {% trans 'Finished' %} + {% trans 'R/M' %} + {% trans 'Date start' %} + {% trans 'Time' %} +{% endblock %} + +{% block table_body %} + {% for proxy_log in proxy_log_list %} + + + + {{ proxy_log.id }} + + {{ proxy_log.user }} + {{ proxy_log.asset }} + {{ proxy_log.system_user }} + {{ proxy_log.terminal }} + {{ proxy_log.commands.all|length}} + + {% if proxy_log.is_failed %} + + {% else %} + + {% endif %} + + {% if proxy_log.is_finished %} + + + + + + + {% else %} + + + + + + + {% endif %} + {{ proxy_log.date_start }} + {{ proxy_log.date_finished|timeuntil:proxy_log.date_start }} + + {% endfor %} +{% endblock %} + +{% block content_bottom_left %} +
+
+ +
+ +
+
+
+{% endblock %} + +{% block custom_foot_js %} + + +{% endblock %} + diff --git a/apps/audits/urls/views_urls.py b/apps/audits/urls/views_urls.py index d28882704..1ad6439b3 100644 --- a/apps/audits/urls/views_urls.py +++ b/apps/audits/urls/views_urls.py @@ -4,14 +4,16 @@ from .. import views app_name = 'audits' urlpatterns = [ - url(r'^proxy-log$', views.ProxyLogListView.as_view(), - name='proxy-log-list'), - url(r'^proxy-log/(?P\d+)$', views.ProxyLogDetailView.as_view(), + url(r'^proxy-log-offline/$', views.ProxyLogOfflineListView.as_view(), + name='proxy-log-offline-list'), + url(r'^proxy-log-online/$', views.ProxyLogOnlineListView.as_view(), + name='proxy-log-online-list'), + url(r'^proxy-log/(?P\d+)/$', views.ProxyLogDetailView.as_view(), name='proxy-log-detail'), # url(r'^proxy-log/(?P\d+)/commands$', views.ProxyLogCommandsListView.as_view(), name='proxy-log-commands-list'), - url(r'^command-log$', views.CommandLogListView.as_view(), + url(r'^command-log/$', views.CommandLogListView.as_view(), name='command-log-list'), - url(r'^login-log$', views.LoginLogListView.as_view(), + url(r'^login-log/$', views.LoginLogListView.as_view(), name='login-log-list'), ] diff --git a/apps/audits/views.py b/apps/audits/views.py index 20bc3f8aa..33762c25b 100644 --- a/apps/audits/views.py +++ b/apps/audits/views.py @@ -22,7 +22,7 @@ from audits.backends import CommandLogSerializer class ProxyLogListView(AdminUserRequiredMixin, ListView): model = ProxyLog - template_name = 'audits/proxy_log_list.html' + template_name = 'audits/proxy_log_online_list.html' context_object_name = 'proxy_log_list' paginate_by = settings.CONFIG.DISPLAY_PER_PAGE keyword = user = asset = system_user = date_from_s = date_to_s = '' @@ -89,6 +89,38 @@ class ProxyLogListView(AdminUserRequiredMixin, ListView): return super(ProxyLogListView, self).get_context_data(**kwargs) +class ProxyLogOfflineListView(ProxyLogListView): + template_name = 'audits/proxy_log_online_list.html' + + def get_queryset(self): + queryset = super(ProxyLogOfflineListView, self).get_queryset() + queryset = queryset.filter(is_finished=True) + return queryset + + def get_context_data(self, **kwargs): + context = { + 'action': _('Proxy log offline list'), + } + kwargs.update(context) + return super(ProxyLogOfflineListView, self).get_context_data(**kwargs) + + +class ProxyLogOnlineListView(ProxyLogListView): + template_name = 'audits/proxy_log_online_list.html' + + def get_queryset(self): + queryset = super(ProxyLogOnlineListView, self).get_queryset() + queryset = queryset.filter(is_finished=False) + return queryset + + def get_context_data(self, **kwargs): + context = { + 'action': _('Proxy log online list'), + } + kwargs.update(context) + return super(ProxyLogOnlineListView, self).get_context_data(**kwargs) + + class ProxyLogDetailView(AdminUserRequiredMixin, SingleObjectMixin, ListView): diff --git a/apps/common/utils.py b/apps/common/utils.py index 3e543a107..1fa8e3915 100644 --- a/apps/common/utils.py +++ b/apps/common/utils.py @@ -2,6 +2,7 @@ # from __future__ import unicode_literals +from collections import OrderedDict from six import string_types import base64 import os @@ -53,6 +54,7 @@ def get_object_or_none(model, **kwargs): class Signer(object): + """用来加密,解密,和基于时间戳的方式验证token""" def __init__(self, secret_key=SECRET_KEY): self.secret_key = secret_key @@ -330,13 +332,13 @@ def encrypt_password(password): return None -from collections import OrderedDict def capacity_convert(size, expect='auto', rate=1000): """ - :param cap: '100MB', '1G' + :param size: '100MB', '1G' :param expect: 'K, M, G, T + :param rate: Default 1000, may be 1024 :return: """ rate_mapping = ( diff --git a/apps/ops/ansible/inventory.py b/apps/ops/ansible/inventory.py index e9b2496d8..5c421e916 100644 --- a/apps/ops/ansible/inventory.py +++ b/apps/ops/ansible/inventory.py @@ -21,16 +21,16 @@ class JMSHost(Host): # 添加密码和秘钥 if asset.get('password'): self.set_variable('ansible_ssh_pass', asset['password']) - if asset.get('key'): + if asset.get('private_key'): self.set_variable('ansible_ssh_private_key_file', asset['private_key']) # 添加become支持 - become = asset.get("become", None) - if become is not None: + become = asset.get("become", False) + if become: self.set_variable("ansible_become", True) - self.set_variable("ansible_become_method", become.get('method')) - self.set_variable("ansible_become_user", become.get('user')) - self.set_variable("ansible_become_pass", become.get('pass')) + self.set_variable("ansible_become_method", become.get('method', 'sudo')) + self.set_variable("ansible_become_user", become.get('user', 'root')) + self.set_variable("ansible_become_pass", become.get('pass', '')) else: self.set_variable("ansible_become", False) diff --git a/apps/ops/ansible/runner.py b/apps/ops/ansible/runner.py index 1af3d7a0d..6496c4202 100644 --- a/apps/ops/ansible/runner.py +++ b/apps/ops/ansible/runner.py @@ -265,8 +265,10 @@ class AdHocRunner(object): result['success'].append(host) for host, msgs in self.results_callback.result_q['dark'].items(): - msg = '\n'.join(['{}: {}'.format(msg.get('invocation', {}).get('module_name'), - msg.get('msg', '')) for msg in msgs]) + msg = '\n'.join(['{} {}: {}'.format( + msg.get('module_stdout', ''), + msg.get('invocation', {}).get('module_name'), + msg.get('msg', '')) for msg in msgs]) result['failed'].append((host, msg)) return result diff --git a/apps/ops/templates/ops/task_detail.html b/apps/ops/templates/ops/task_detail.html index a0f38e86c..bc8fbf682 100644 --- a/apps/ops/templates/ops/task_detail.html +++ b/apps/ops/templates/ops/task_detail.html @@ -68,7 +68,17 @@ {% trans 'Is success ' %}: + {% if object.is_finished %} {{ object.is_success|yesno:"Yes,No,Unkown" }} + {% else %} + +
+
+ 40% Complete (success) +
+
+ + {% endif %} {% trans 'Assets ' %}: @@ -84,6 +94,31 @@ + +
+
+ Result +
+ + + + + + + + + + +
+
+
+
+{{ object.result }}
+                                    
+
+
+
diff --git a/apps/ops/utils.py b/apps/ops/utils.py index d1b5190dd..0c3cbbc99 100644 --- a/apps/ops/utils.py +++ b/apps/ops/utils.py @@ -18,7 +18,7 @@ logger = get_logger(__file__) def run_AdHoc(task_tuple, assets, task_name='Ansible AdHoc runner', task_id=None, pattern='all', - record=True, verbose=False): + record=True, verbose=True): """ :param task_tuple: (('module_name', 'module_args'), ('module_name', 'module_args')) :param assets: [asset1, asset2] @@ -51,6 +51,11 @@ def run_AdHoc(task_tuple, assets, else: record = Task.objects.get(uuid=task_id) record.date_start = timezone.now() + record.date_finished = None + record.timedelta = None + record.is_finished = False + record.is_success = False + record.save() ts_start = time.time() if verbose: logger.debug('Start runner {}'.format(task_name)) @@ -61,7 +66,7 @@ def run_AdHoc(task_tuple, assets, record.date_finished = timezone.now() record.is_finished = True if verbose: - record.result = json.dumps(result) + record.result = json.dumps(result, indent=4, sort_keys=True) record.summary = json.dumps(summary) record.timedelta = timedelta if len(summary['failed']) == 0: diff --git a/apps/ops/views.py b/apps/ops/views.py index dadf71faf..145f72534 100644 --- a/apps/ops/views.py +++ b/apps/ops/views.py @@ -1,5 +1,6 @@ # ~*~ coding: utf-8 ~*~ from __future__ import unicode_literals +import time import json from datetime import datetime @@ -81,4 +82,5 @@ class TaskRunView(View): def get(self, request, *args, **kwargs): pk = kwargs.get(self.pk_url_kwarg) rerun_task.delay(pk) + time.sleep(0.5) return redirect(reverse('ops:task-detail', kwargs={'pk': pk})) diff --git a/apps/perms/tasks.py b/apps/perms/tasks.py index 50ced1ee3..6bef200cd 100644 --- a/apps/perms/tasks.py +++ b/apps/perms/tasks.py @@ -35,10 +35,10 @@ def push_users(self, assets, users): ('authorized_key', "user={} state=present key='{}'".format( user['username'], user['public_key'])), ('lineinfile', - "name=/etc/sudoers state=present regexp='^{0} ALL=(ALL)' " + "dest=/etc/sudoers state=present regexp='^{0} ALL=' " "line='{0} ALL=(ALL) NOPASSWD: {1}' " "validate='visudo -cf %s'".format( - user['username'], user.get('sudo', '/bin/whoami') + user['username'], user.get('sudo', '/sbin/ifconfig') )) ]) task_name = 'Push user {}'.format(','.join([user['name'] for user in users])) diff --git a/apps/templates/_nav.html b/apps/templates/_nav.html index 6792a22b2..6b89cd330 100644 --- a/apps/templates/_nav.html +++ b/apps/templates/_nav.html @@ -56,8 +56,11 @@
  • {% trans 'Audits' %}
  • - {% for u in user_list %} - + {% endfor %}
    - {% for a in asset_list %} - + {% endfor %}
    diff --git a/apps/audits/templates/audits/proxy_log_detail.html b/apps/audits/templates/audits/proxy_log_detail.html index 909d66fe6..0fa28b517 100644 --- a/apps/audits/templates/audits/proxy_log_detail.html +++ b/apps/audits/templates/audits/proxy_log_detail.html @@ -1,6 +1,7 @@ {% extends 'base.html' %} {% load static %} {% load i18n %} +{% load common_tags %} {% block custom_head_css_js %} diff --git a/apps/audits/templates/audits/proxy_log_offline_list.html b/apps/audits/templates/audits/proxy_log_offline_list.html index 6a3c815b0..ffe695662 100644 --- a/apps/audits/templates/audits/proxy_log_offline_list.html +++ b/apps/audits/templates/audits/proxy_log_offline_list.html @@ -24,16 +24,16 @@
    @@ -68,7 +68,7 @@ {% trans 'Command' %} {% trans 'Success' %} {% trans 'Finished' %} - {% trans 'R/M' %} + {% trans 'Play' %} {% trans 'Date start' %} {% trans 'Time' %} {% endblock %} @@ -113,20 +113,6 @@ {% endfor %} {% endblock %} -{% block content_bottom_left %} -
    -
    - -
    - -
    -
    -
    -{% endblock %} {% block custom_foot_js %} diff --git a/apps/audits/templates/audits/proxy_log_online_list.html b/apps/audits/templates/audits/proxy_log_online_list.html index 6a3c815b0..500fe68b3 100644 --- a/apps/audits/templates/audits/proxy_log_online_list.html +++ b/apps/audits/templates/audits/proxy_log_online_list.html @@ -24,16 +24,16 @@
    @@ -68,7 +68,7 @@ {% trans 'Command' %} {% trans 'Success' %} {% trans 'Finished' %} - {% trans 'R/M' %} + {% trans 'Monitor' %} {% trans 'Date start' %} {% trans 'Time' %} {% endblock %} diff --git a/apps/audits/views.py b/apps/audits/views.py index 33762c25b..de7cc9421 100644 --- a/apps/audits/views.py +++ b/apps/audits/views.py @@ -3,7 +3,6 @@ import time from datetime import datetime -import pytz from django.views.generic import ListView, UpdateView, DeleteView, DetailView, TemplateView from django.views.generic.edit import SingleObjectMixin from django.utils.translation import ugettext as _ @@ -25,7 +24,7 @@ class ProxyLogListView(AdminUserRequiredMixin, ListView): template_name = 'audits/proxy_log_online_list.html' context_object_name = 'proxy_log_list' paginate_by = settings.CONFIG.DISPLAY_PER_PAGE - keyword = user = asset = system_user = date_from_s = date_to_s = '' + keyword = username = hostname = system_user = date_from_s = date_to_s = '' ordering = ['is_finished', '-id'] date_format = '%m/%d/%Y' @@ -37,8 +36,8 @@ class ProxyLogListView(AdminUserRequiredMixin, ListView): self.queryset = super(ProxyLogListView, self).get_queryset() self.keyword = self.request.GET.get('keyword', '') - self.user = self.request.GET.get('user') - self.asset = self.request.GET.get('asset') + self.username = self.request.GET.get('username') + self.ip = self.request.GET.get('ip') self.system_user = self.request.GET.get('system_user') self.date_from_s = self.request.GET.get('date_from', date_from_default) self.date_to_s = self.request.GET.get('date_to', date_to_default) @@ -53,10 +52,10 @@ class ProxyLogListView(AdminUserRequiredMixin, ListView): self.date_to_s + ' 23:59:59', '%m/%d/%Y %H:%M:%S') date_to = date_to.replace(tzinfo=timezone.get_current_timezone()) filter_kwargs['date_start__lt'] = date_to - if self.user: - filter_kwargs['user'] = self.user - if self.asset: - filter_kwargs['asset'] = self.asset + if self.username: + filter_kwargs['user'] = self.username + if self.ip: + filter_kwargs['ip'] = self.ip if self.system_user: filter_kwargs['system_user'] = self.system_user if self.keyword: @@ -81,8 +80,8 @@ class ProxyLogListView(AdminUserRequiredMixin, ListView): 'keyword': self.keyword, 'date_from': self.date_from_s, 'date_to': self.date_to_s, - 'user': self.user, - 'asset': self.asset, + 'username': self.username, + 'ip': self.ip, 'system_user': self.system_user, } kwargs.update(context) @@ -90,7 +89,7 @@ class ProxyLogListView(AdminUserRequiredMixin, ListView): class ProxyLogOfflineListView(ProxyLogListView): - template_name = 'audits/proxy_log_online_list.html' + template_name = 'audits/proxy_log_offline_list.html' def get_queryset(self): queryset = super(ProxyLogOfflineListView, self).get_queryset() @@ -163,7 +162,7 @@ class CommandLogListView(AdminUserRequiredMixin, ListView): template_name = 'audits/command_log_list.html' paginate_by = settings.CONFIG.DISPLAY_PER_PAGE context_object_name = 'command_list' - user = asset = system_user = command = date_from_s = date_to_s = '' + username = ip = system_user = command = date_from_s = date_to_s = '' date_format = '%m/%d/%Y' ordering = ['-id'] @@ -173,8 +172,8 @@ class CommandLogListView(AdminUserRequiredMixin, ListView): date_from_default = (date_now - timezone.timedelta(7)) \ .strftime(self.date_format) self.command = self.request.GET.get('command', '') - self.user = self.request.GET.get('user') - self.asset = self.request.GET.get('asset') + self.username = self.request.GET.get('username') + self.ip = self.request.GET.get('ip') self.system_user = self.request.GET.get('system_user') self.date_from_s = \ self.request.GET.get('date_from', date_from_default) @@ -194,10 +193,10 @@ class CommandLogListView(AdminUserRequiredMixin, ListView): .replace(tzinfo=timezone.get_current_timezone()) date_to_ts = time.mktime(date_to.timetuple()) filter_kwargs['date_to_ts'] = date_to_ts - if self.user: - filter_kwargs['user'] = self.user - if self.asset: - filter_kwargs['asset'] = self.asset + if self.username: + filter_kwargs['user'] = self.username + if self.ip: + filter_kwargs['asset'] = self.ip if self.system_user: filter_kwargs['system_user'] = self.system_user if self.command: @@ -215,8 +214,8 @@ class CommandLogListView(AdminUserRequiredMixin, ListView): 'command': self.command, 'date_from': self.date_from_s, 'date_to': self.date_to_s, - 'user': self.user, - 'asset': self.asset, + 'username': self.username, + 'ip': self.ip, 'system_user': self.system_user, } kwargs.update(context) diff --git a/apps/templates/_footer.html b/apps/templates/_footer.html index c43bda248..d0ef4c5b0 100644 --- a/apps/templates/_footer.html +++ b/apps/templates/_footer.html @@ -3,6 +3,6 @@ Version 0.4.0 GPL.
    - Copyright Jumpserver.org Team © 2014-2016 + Copyright Jumpserver.org Team © 2014-2017
    \ No newline at end of file diff --git a/apps/templates/_nav.html b/apps/templates/_nav.html index 6b89cd330..078229c39 100644 --- a/apps/templates/_nav.html +++ b/apps/templates/_nav.html @@ -56,11 +56,11 @@
  • {% trans 'Audits' %}
  • -
  • - - {% trans 'File' %} - - -
  • -
  • - - {% trans 'Settings' %} - -
  • +{#
  • #} +{# #} +{# {% trans 'File' %}#} +{# #} +{# #} +{#
  • #} +{#
  • #} +{# #} +{# {% trans 'Settings' %}#} +{# #} +{#
  • #}
  • {% trans 'IDC' %}
  • {% trans 'Admin user' %}
  • {% trans 'System user' %}
  • -
  • {% trans 'Label' %}
  • From 1f9dbb6bdcf7ed98d3126644ea8244c3c3420726 Mon Sep 17 00:00:00 2001 From: ibuler Date: Fri, 24 Mar 2017 23:13:17 +0800 Subject: [PATCH 5/7] =?UTF-8?q?[Change]=20=E4=BF=AE=E5=A4=8D=E9=AA=8C?= =?UTF-8?q?=E8=AF=81=E7=A0=81=E6=A8=A1=E7=B3=8A=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/jumpserver/settings.py | 3 ++- apps/templates/_footer.html | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/jumpserver/settings.py b/apps/jumpserver/settings.py index 758a93221..ed919cb47 100644 --- a/apps/jumpserver/settings.py +++ b/apps/jumpserver/settings.py @@ -320,8 +320,9 @@ CACHES = { } # Captcha settings, more see https://django-simple-captcha.readthedocs.io/en/latest/advanced.html -CAPTCHA_IMAGE_SIZE = (75, 33) +CAPTCHA_IMAGE_SIZE = (80, 33) CAPTCHA_FOREGROUND_COLOR = '#001100' +CAPTCHA_NOISE_FUNCTIONS = ('captcha.helpers.noise_dots',) COMMAND_STORE_BACKEND = 'audits.backends.command.db' RECORD_STORE_BACKEND = 'audits.backends.record.db' diff --git a/apps/templates/_footer.html b/apps/templates/_footer.html index d0ef4c5b0..95f0f82d3 100644 --- a/apps/templates/_footer.html +++ b/apps/templates/_footer.html @@ -1,6 +1,7 @@