From d68a4d9caeab3621fde3d86015cd7a3dc35a9b0f Mon Sep 17 00:00:00 2001 From: ibuler Date: Sat, 29 Sep 2018 10:28:12 +0800 Subject: [PATCH 1/9] =?UTF-8?q?[Update]=20=E4=BF=AE=E6=94=B9=E8=83=8C?= =?UTF-8?q?=E6=99=AF=E8=89=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/static/plugins/elfinder/css/theme-gray.css | 8 +++++++- apps/static/plugins/elfinder/i18n/elfinder.zh_CN.js | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/apps/static/plugins/elfinder/css/theme-gray.css b/apps/static/plugins/elfinder/css/theme-gray.css index 6b136a64d..5c2b35d9e 100644 --- a/apps/static/plugins/elfinder/css/theme-gray.css +++ b/apps/static/plugins/elfinder/css/theme-gray.css @@ -1528,9 +1528,15 @@ a.ui-button:active .ui-icon, .std42-dialog .ui-dialog-titlebar .elfinder-titlebar-minimize:hover .ui-icon { background-color: #ff9800; } -.elfinder-dialog-title { +.elfinder-dialog-title { color: #f1f1f1; + } + +.ui-dialog-buttonpane { + background: #fff; +} + .std42-dialog .ui-dialog-content { background: #fff; } diff --git a/apps/static/plugins/elfinder/i18n/elfinder.zh_CN.js b/apps/static/plugins/elfinder/i18n/elfinder.zh_CN.js index cbbfc12bc..a80e7c4b5 100755 --- a/apps/static/plugins/elfinder/i18n/elfinder.zh_CN.js +++ b/apps/static/plugins/elfinder/i18n/elfinder.zh_CN.js @@ -375,7 +375,7 @@ 'pass' : '密码', // added 18.04.2012 'confirmUnmount' : '确实要卸载 $1?', // from v2.1 added 30.04.2012 'dropFilesBrowser': '从浏览器中拖放或粘贴文件', // from v2.1 added 30.05.2012 - 'dropPasteFiles' : '拖放文件,粘贴网址或剪贴板图像', // from v2.1 added 07.04.2014 + 'dropPasteFiles' : '拖放文件,或粘贴剪贴板图像', // from v2.1 added 07.04.2014 'encoding' : '编码', // from v2.1 added 19.12.2014 'locale' : '语言环境', // from v2.1 added 19.12.2014 'searchTarget' : '目标: $1', // from v2.1 added 22.5.2015 From 9bddc29da4216d1b12becc90869ab179d8077f04 Mon Sep 17 00:00:00 2001 From: ibuler Date: Sat, 29 Sep 2018 10:44:52 +0800 Subject: [PATCH 2/9] =?UTF-8?q?[Update]=20=E6=9A=82=E6=97=B6=E4=B8=8D?= =?UTF-8?q?=E5=AD=98status=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/terminal/serializers.py | 23 ++++++++++------------- apps/terminal/views/terminal.py | 3 +++ 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/apps/terminal/serializers.py b/apps/terminal/serializers.py index 425eae8b1..6933e2896 100644 --- a/apps/terminal/serializers.py +++ b/apps/terminal/serializers.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- # +from django.core.cache import cache from django.utils import timezone from rest_framework import serializers from rest_framework_bulk.serializers import BulkListSerializer @@ -28,19 +29,8 @@ class TerminalSerializer(serializers.ModelSerializer): @staticmethod def get_is_alive(obj): - try: - status = obj.status_set.latest() - except Status.DoesNotExist: - status = None - - if not status: - return False - - delta = timezone.now() - status.date_created - if delta < timezone.timedelta(seconds=600): - return True - else: - return False + key = StatusSerializer.CACHE_KEY_PREFIX + str(obj.id) + return cache.get(key) class SessionSerializer(BulkSerializerMixin, serializers.ModelSerializer): @@ -57,11 +47,18 @@ class SessionSerializer(BulkSerializerMixin, serializers.ModelSerializer): class StatusSerializer(serializers.ModelSerializer): + CACHE_KEY_PREFIX = 'terminal_status_' class Meta: fields = '__all__' model = Status + def create(self, validated_data): + terminal_id = str(validated_data['terminal'].id) + key = self.CACHE_KEY_PREFIX + terminal_id + cache.set(key, 1, 60) + return validated_data + class TaskSerializer(BulkSerializerMixin, serializers.ModelSerializer): diff --git a/apps/terminal/views/terminal.py b/apps/terminal/views/terminal.py index a28fedeec..1adf09513 100644 --- a/apps/terminal/views/terminal.py +++ b/apps/terminal/views/terminal.py @@ -93,6 +93,9 @@ class TerminalAcceptView(SuperUserRequiredMixin, JSONResponseMixin, UpdateView): class TerminalConnectView(LoginRequiredMixin, SuperUserRequiredMixin, DetailView): + """ + Abandon + """ template_name = 'flash_message_standalone.html' model = Terminal From 78936bf9f2c29d113b6b31d7072778e288d20a75 Mon Sep 17 00:00:00 2001 From: ibuler Date: Mon, 8 Oct 2018 19:03:02 +0800 Subject: [PATCH 3/9] =?UTF-8?q?[Update]=20=E6=9B=B4=E6=94=B9=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/__init__.py | 2 +- apps/templates/_footer.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/__init__.py b/apps/__init__.py index a9954fbdc..8a6ac6caa 100644 --- a/apps/__init__.py +++ b/apps/__init__.py @@ -2,4 +2,4 @@ # -*- coding: utf-8 -*- # -__version__ = "1.4.1" +__version__ = "1.4.2" diff --git a/apps/templates/_footer.html b/apps/templates/_footer.html index 088276a0d..270de14d9 100644 --- a/apps/templates/_footer.html +++ b/apps/templates/_footer.html @@ -1,7 +1,7 @@ {% load i18n %} {% endblock %} +
+

{% trans 'Command filter' %}

+ {% bootstrap_field form.cmd_filters layout="horizontal" %} +

{% trans 'Other' %}

{% bootstrap_field form.sudo layout="horizontal" %} {% bootstrap_field form.shell layout="horizontal" %} @@ -101,6 +105,7 @@ var need_change_field_login_mode = [ function protocolChange() { if ($(protocol_id + " option:selected").text() === 'rdp') { $('.auth-fields').removeClass('hidden'); + $('#command-filter-block').addClass('hidden'); $.each(need_change_field, function (index, value) { $(value).closest('.form-group').addClass('hidden') }); diff --git a/apps/assets/templates/assets/admin_user_detail.html b/apps/assets/templates/assets/admin_user_detail.html index 072eb556c..f00e2352a 100644 --- a/apps/assets/templates/assets/admin_user_detail.html +++ b/apps/assets/templates/assets/admin_user_detail.html @@ -90,7 +90,7 @@ diff --git a/apps/assets/templates/assets/cmd_filter_create_update.html b/apps/assets/templates/assets/cmd_filter_create_update.html new file mode 100644 index 000000000..b1f7a57a8 --- /dev/null +++ b/apps/assets/templates/assets/cmd_filter_create_update.html @@ -0,0 +1,20 @@ +{% extends '_base_create_update.html' %} +{% load static %} +{% load bootstrap3 %} +{% load i18n %} + +{% block form %} +
+ {% csrf_token %} + {% bootstrap_field form.name layout="horizontal" %} + {% bootstrap_field form.comment layout="horizontal" %} + +
+
+
+ + +
+
+
+{% endblock %} diff --git a/apps/assets/templates/assets/cmd_filter_detail.html b/apps/assets/templates/assets/cmd_filter_detail.html new file mode 100644 index 000000000..ee68ff2f6 --- /dev/null +++ b/apps/assets/templates/assets/cmd_filter_detail.html @@ -0,0 +1,168 @@ +{% extends 'base.html' %} +{% load static %} +{% load i18n %} + +{% block custom_head_css_js %} + + +{% endblock %} + +{% block content %} +
+
+
+
+ +
+
+
+
+ {{ object.name }} +
+ + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
{% trans 'Name' %}:{{ object.name }}
{% trans 'Comment' %}:{{ object.comment }}
{% trans 'Date created' %}:{{ object.date_created }}
{% trans 'Date updated' %}:{{ object.date_updated }}
{% trans 'Created by' %}:{{ object.created_by }}
+
+
+
+ +
+
+
+ {% trans 'System users' %} +
+
+ + + + + + + + + + + {% for system_user in object.system_users.all %} + + + + + {% endfor %} + +
+ +
+ +
{{ system_user }} + +
+
+
+
+
+
+
+
+
+{% endblock %} +{% block custom_foot_js %} + +{% endblock %} diff --git a/apps/assets/templates/assets/cmd_filter_list.html b/apps/assets/templates/assets/cmd_filter_list.html new file mode 100644 index 000000000..4bc33cf02 --- /dev/null +++ b/apps/assets/templates/assets/cmd_filter_list.html @@ -0,0 +1,79 @@ +{% extends '_base_list.html' %} +{% load i18n static %} +{% block table_search %}{% endblock %} +{% block table_container %} + + + + + + + + + + + + + + +
+ + {% trans 'Name' %}{% trans 'Rules' %}{% trans 'System users' %}{% trans 'Comment' %}{% trans 'Action' %}
+{% endblock %} +{% block content_bottom_left %}{% endblock %} +{% block custom_foot_js %} + +{% endblock %} + + + diff --git a/apps/assets/templates/assets/cmd_filter_rule_create_update.html b/apps/assets/templates/assets/cmd_filter_rule_create_update.html new file mode 100644 index 000000000..bbb02f48c --- /dev/null +++ b/apps/assets/templates/assets/cmd_filter_rule_create_update.html @@ -0,0 +1,57 @@ +{% extends 'base.html' %} +{% load i18n %} +{% load static %} +{% load bootstrap3 %} +{% block custom_head_css_js %} + + +{% endblock %} + +{% block content %} +
+
+
+
+
+
{{ action }}
+ +
+
+
+ {% csrf_token %} + {% if form.non_field_errors %} +
+ {{ form.non_field_errors }} +
+ {% endif %} + {% bootstrap_form form layout="horizontal" %} +
+
+ + +
+
+
+
+
+
+
+
+{% endblock %} + +{% block custom_foot_js %} + +{% endblock %} \ No newline at end of file diff --git a/apps/assets/templates/assets/cmd_filter_rule_list.html b/apps/assets/templates/assets/cmd_filter_rule_list.html new file mode 100644 index 000000000..119b44fd4 --- /dev/null +++ b/apps/assets/templates/assets/cmd_filter_rule_list.html @@ -0,0 +1,115 @@ +{% extends 'base.html' %} +{% load static %} +{% load i18n %} + +{% block custom_head_css_js %} + + +{% endblock %} + +{% block content %} +
+
+
+
+ +
+
+
+
+
+
+ {% trans 'Command filter rule list' %} +
+ + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + +
+ + {% trans 'Type' %}{% trans 'Content' %}{% trans 'Priority' %}{% trans 'Strategy' %}{% trans 'Comment' %}{% trans 'Action' %}
+
+
+
+
+
+
+
+
+{% endblock %} +{% block content_bottom_left %}{% endblock %} +{% block custom_foot_js %} + +{% endblock %} diff --git a/apps/assets/templates/assets/system_user_detail.html b/apps/assets/templates/assets/system_user_detail.html index 5f16e3941..26e9bbef0 100644 --- a/apps/assets/templates/assets/system_user_detail.html +++ b/apps/assets/templates/assets/system_user_detail.html @@ -156,44 +156,47 @@ -{#
#} -{#
#} -{# {% trans 'Nodes' %}#} -{#
#} -{#
#} -{# #} -{# #} -{# #} -{# #} -{# #} -{# #} -{# #} -{# #} -{# #} -{# #} -{##} -{# {% for node in system_user.nodes.all %}#} -{# #} -{# #} -{# #} -{# #} -{# {% endfor %}#} -{# #} -{#
#} -{# #} -{#
#} -{# #} -{#
{{ node }}#} -{# #} -{#
#} -{#
#} -{#
#} + {% if system_user.protocol != 'rdp' %} +
+
+
+ {% trans 'Command filter' %} +
+
+ + + + + + + + + + + {% for cf in object.cmd_filters.all %} + + + + + {% endfor %} + +
+ +
+ +
{{ cf }} + +
+
+
+
+ {% endif %} @@ -201,27 +204,13 @@ {% endblock %} {% block custom_foot_js %} {% endblock %} diff --git a/apps/assets/urls/api_urls.py b/apps/assets/urls/api_urls.py index bdbbe5f1d..9c6865288 100644 --- a/apps/assets/urls/api_urls.py +++ b/apps/assets/urls/api_urls.py @@ -1,8 +1,11 @@ # coding:utf-8 from django.urls import path -from .. import api +from rest_framework_nested import routers +# from rest_framework.routers import DefaultRouter from rest_framework_bulk.routes import BulkRouter +from .. import api + app_name = 'assets' router = BulkRouter() @@ -13,6 +16,11 @@ router.register(r'labels', api.LabelViewSet, 'label') router.register(r'nodes', api.NodeViewSet, 'node') router.register(r'domain', api.DomainViewSet, 'domain') router.register(r'gateway', api.GatewayViewSet, 'gateway') +router.register(r'cmd-filter', api.CommandFilterViewSet, 'cmd-filter') + +cmd_filter_router = routers.NestedDefaultRouter(router, r'cmd-filter', lookup='filter') +cmd_filter_router.register(r'rules', api.CommandFilterRuleViewSet, 'cmd-filter-rule') + urlpatterns = [ path('assets-bulk/', api.AssetListUpdateApi.as_view(), name='asset-bulk-update'), @@ -42,6 +50,9 @@ urlpatterns = [ path('system-user//connective/', api.SystemUserTestConnectiveApi.as_view(), name='system-user-connective'), + path('system-user//cmd-filter-rules/', + api.SystemUserCommandFilterRuleListApi.as_view(), name='system-user-cmd-filter-rule-list'), + path('nodes//children/', api.NodeChildrenApi.as_view(), name='node-children'), path('nodes/children/', api.NodeChildrenApi.as_view(), name='node-children-2'), @@ -64,5 +75,5 @@ urlpatterns = [ api.GatewayTestConnectionApi.as_view(), name='test-gateway-connective'), ] -urlpatterns += router.urls +urlpatterns += router.urls + cmd_filter_router.urls diff --git a/apps/assets/urls/views_urls.py b/apps/assets/urls/views_urls.py index 9d160bedf..76651cfdb 100644 --- a/apps/assets/urls/views_urls.py +++ b/apps/assets/urls/views_urls.py @@ -49,4 +49,12 @@ urlpatterns = [ path('domain//gateway/create/', views.DomainGatewayCreateView.as_view(), name='domain-gateway-create'), path('domain/gateway//update/', views.DomainGatewayUpdateView.as_view(), name='domain-gateway-update'), + + path('cmd-filter/', views.CommandFilterListView.as_view(), name='cmd-filter-list'), + path('cmd-filter/create/', views.CommandFilterCreateView.as_view(), name='cmd-filter-create'), + path('cmd-filter//update/', views.CommandFilterUpdateView.as_view(), name='cmd-filter-update'), + path('cmd-filter//', views.CommandFilterDetailView.as_view(), name='cmd-filter-detail'), + path('cmd-filter//rule/', views.CommandFilterRuleListView.as_view(), name='cmd-filter-rule-list'), + path('cmd-filter//rule/create/', views.CommandFilterRuleCreateView.as_view(), name='cmd-filter-rule-create'), + path('cmd-filter//rule//update/', views.CommandFilterRuleUpdateView.as_view(), name='cmd-filter-rule-update'), ] diff --git a/apps/assets/views/__init__.py b/apps/assets/views/__init__.py index 5660d2738..04fc6c31c 100644 --- a/apps/assets/views/__init__.py +++ b/apps/assets/views/__init__.py @@ -4,3 +4,4 @@ from .system_user import * from .admin_user import * from .label import * from .domain import * +from .cmd_filter import * diff --git a/apps/assets/views/cmd_filter.py b/apps/assets/views/cmd_filter.py new file mode 100644 index 000000000..56c15885b --- /dev/null +++ b/apps/assets/views/cmd_filter.py @@ -0,0 +1,168 @@ +# -*- coding: utf-8 -*- +# + +from django.views.generic import TemplateView, CreateView, \ + UpdateView, DeleteView, DetailView +from django.views.generic.detail import SingleObjectMixin +from django.utils.translation import ugettext_lazy as _ +from django.urls import reverse_lazy +from django.shortcuts import get_object_or_404, reverse + +from common.permissions import AdminUserRequiredMixin +from common.const import create_success_msg, update_success_msg +from ..models import CommandFilter, CommandFilterRule, SystemUser +from ..forms import CommandFilterForm, CommandFilterRuleForm + + +__all__ = ( + "CommandFilterListView", "CommandFilterCreateView", + "CommandFilterUpdateView", + "CommandFilterRuleListView", "CommandFilterRuleCreateView", + "CommandFilterRuleUpdateView", "CommandFilterDetailView", +) + + +class CommandFilterListView(AdminUserRequiredMixin, TemplateView): + template_name = 'assets/cmd_filter_list.html' + + def get_context_data(self, **kwargs): + context = { + 'app': _('Assets'), + 'action': _('Command filter list'), + } + kwargs.update(context) + return super().get_context_data(**kwargs) + + +class CommandFilterCreateView(AdminUserRequiredMixin, CreateView): + model = CommandFilter + template_name = 'assets/cmd_filter_create_update.html' + form_class = CommandFilterForm + success_url = reverse_lazy('assets:cmd-filter-list') + success_message = create_success_msg + + def get_context_data(self, **kwargs): + context = { + 'app': _('Assets'), + 'action': _('Create command filter'), + } + kwargs.update(context) + return super().get_context_data(**kwargs) + + +class CommandFilterUpdateView(AdminUserRequiredMixin, UpdateView): + model = CommandFilter + template_name = 'assets/cmd_filter_create_update.html' + form_class = CommandFilterForm + success_url = reverse_lazy('assets:cmd-filter-list') + success_message = update_success_msg + + def get_context_data(self, **kwargs): + context = { + 'app': _('Assets'), + 'action': _('Update command filter'), + } + kwargs.update(context) + return super().get_context_data(**kwargs) + + +class CommandFilterDetailView(AdminUserRequiredMixin, DetailView): + model = CommandFilter + template_name = 'assets/cmd_filter_detail.html' + + def get_context_data(self, **kwargs): + system_users_remain = SystemUser.objects\ + .exclude(cmd_filters=self.object)\ + .exclude(protocol='rdp') + context = { + 'app': _('Assets'), + 'action': _('Command filter detail'), + 'system_users_remain': system_users_remain + } + kwargs.update(context) + return super().get_context_data(**kwargs) + + +class CommandFilterRuleListView(AdminUserRequiredMixin, SingleObjectMixin, TemplateView): + template_name = 'assets/cmd_filter_rule_list.html' + model = CommandFilter + object = None + + def get(self, request, *args, **kwargs): + self.object = self.get_object(queryset=self.model.objects.all()) + return super().get(request, *args, **kwargs) + + def get_context_data(self, **kwargs): + context = { + 'app': _('Assets'), + 'action': _('Command filter rule list'), + 'object': self.get_object() + } + kwargs.update(context) + return super().get_context_data(**kwargs) + + +class CommandFilterRuleCreateView(AdminUserRequiredMixin, CreateView): + template_name = 'assets/cmd_filter_rule_create_update.html' + model = CommandFilterRule + form_class = CommandFilterRuleForm + success_message = create_success_msg + cmd_filter = None + + def get_success_url(self): + return reverse('assets:cmd-filter-rule-list', kwargs={ + 'pk': self.cmd_filter.id + }) + + def get_form(self, form_class=None): + form = super().get_form(form_class=form_class) + form['filter'].initial = self.cmd_filter + form['filter'].field.widget.attrs['readonly'] = 1 + return form + + def dispatch(self, request, *args, **kwargs): + filter_pk = self.kwargs.get('filter_pk') + self.cmd_filter = get_object_or_404(CommandFilter, pk=filter_pk) + return super().dispatch(request, *args, **kwargs) + + def get_context_data(self, **kwargs): + context = { + 'app': _('Assets'), + 'action': _('Create command filter rule'), + 'object': self.cmd_filter, + } + kwargs.update(context) + return super().get_context_data(**kwargs) + + +class CommandFilterRuleUpdateView(AdminUserRequiredMixin, UpdateView): + template_name = 'assets/cmd_filter_rule_create_update.html' + model = CommandFilterRule + form_class = CommandFilterRuleForm + success_message = create_success_msg + cmd_filter = None + + def get_success_url(self): + return reverse('assets:cmd-filter-rule-list', kwargs={ + 'pk': self.cmd_filter.id + }) + + def get_form(self, form_class=None): + form = super().get_form(form_class=form_class) + form['filter'].initial = self.cmd_filter + form['filter'].field.widget.attrs['readonly'] = 1 + return form + + def dispatch(self, request, *args, **kwargs): + filter_pk = self.kwargs.get('filter_pk') + self.cmd_filter = get_object_or_404(CommandFilter, pk=filter_pk) + return super().dispatch(request, *args, **kwargs) + + def get_context_data(self, **kwargs): + context = { + 'app': _('Assets'), + 'action': _('Update command filter rule'), + 'object': self.cmd_filter, + } + kwargs.update(context) + return super().get_context_data(**kwargs) \ No newline at end of file diff --git a/apps/assets/views/system_user.py b/apps/assets/views/system_user.py index 7a8bc2bab..c8c6ea6be 100644 --- a/apps/assets/views/system_user.py +++ b/apps/assets/views/system_user.py @@ -9,7 +9,7 @@ from django.views.generic.detail import DetailView from common.const import create_success_msg, update_success_msg from ..forms import SystemUserForm -from ..models import SystemUser, Node +from ..models import SystemUser, Node, CommandFilter from common.permissions import AdminUserRequiredMixin @@ -73,7 +73,7 @@ class SystemUserDetailView(AdminUserRequiredMixin, DetailView): context = { 'app': _('Assets'), 'action': _('System user detail'), - 'nodes_remain': Node.objects.exclude(systemuser=self.object) + 'cmd_filters_remain': CommandFilter.objects.exclude(system_users=self.object) } kwargs.update(context) return super().get_context_data(**kwargs) diff --git a/apps/common/fields.py b/apps/common/fields.py index 8afcdf8d9..cccc265de 100644 --- a/apps/common/fields.py +++ b/apps/common/fields.py @@ -86,3 +86,21 @@ class FormEncryptCharField(FormEncryptMixin, forms.CharField): class FormEncryptDictField(FormEncryptMixin, FormDictField): pass + + +class ChoiceDisplayField(serializers.ChoiceField): + def __init__(self, *args, **kwargs): + super(ChoiceDisplayField, self).__init__(*args, **kwargs) + self.choice_strings_to_display = { + six.text_type(key): value for key, value in self.choices.items() + } + + def to_representation(self, value): + if value is None: + return value + return { + 'value': self.choice_strings_to_values.get(six.text_type(value), + value), + 'display': self.choice_strings_to_display.get(six.text_type(value), + value), + } diff --git a/apps/locale/zh/LC_MESSAGES/django.mo b/apps/locale/zh/LC_MESSAGES/django.mo index 5da9e7a3cb0d2e2a193a863b403a1d56747b03b1..4dcc60c68a42ae407f37bf2d39d5d0d818b5a6f9 100644 GIT binary patch delta 16685 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 DaGNrx diff --git a/apps/locale/zh/LC_MESSAGES/django.po b/apps/locale/zh/LC_MESSAGES/django.po index 938b305e7..7bd6620c1 100644 --- a/apps/locale/zh/LC_MESSAGES/django.po +++ b/apps/locale/zh/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Jumpserver 0.3.3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-09-07 12:00+0800\n" +"POT-Creation-Date: 2018-10-10 15:11+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: ibuler \n" "Language-Team: Jumpserver team\n" @@ -33,7 +33,7 @@ msgstr "更新节点资产硬件信息: {}" msgid "Test if the assets under the node are connectable: {}" msgstr "测试节点下资产是否可连接: {}" -#: assets/forms/asset.py:27 assets/models/asset.py:82 assets/models/user.py:113 +#: assets/forms/asset.py:27 assets/models/asset.py:82 assets/models/user.py:112 #: assets/templates/assets/asset_detail.html:183 #: assets/templates/assets/asset_detail.html:191 #: assets/templates/assets/system_user_asset.html:94 perms/models.py:32 @@ -42,7 +42,7 @@ msgstr "节点管理" #: assets/forms/asset.py:30 assets/forms/asset.py:69 assets/forms/asset.py:112 #: assets/forms/asset.py:116 assets/models/asset.py:87 -#: assets/models/cluster.py:19 assets/models/user.py:73 +#: assets/models/cluster.py:19 assets/models/user.py:72 #: assets/templates/assets/asset_detail.html:73 templates/_nav.html:24 #: xpack/plugins/orgs/templates/orgs/org_list.html:18 msgid "Admin user" @@ -129,11 +129,14 @@ msgstr "资产" msgid "Password should not contain special characters" msgstr "不能包含特殊字符" -#: assets/forms/domain.py:59 assets/forms/user.py:79 assets/forms/user.py:142 +#: assets/forms/domain.py:59 assets/forms/user.py:80 assets/forms/user.py:143 #: assets/models/base.py:22 assets/models/cluster.py:18 -#: assets/models/domain.py:18 assets/models/group.py:20 -#: assets/models/label.py:18 assets/templates/assets/admin_user_detail.html:56 +#: assets/models/cmd_filter.py:19 assets/models/domain.py:18 +#: assets/models/group.py:20 assets/models/label.py:18 +#: assets/templates/assets/admin_user_detail.html:56 #: assets/templates/assets/admin_user_list.html:26 +#: assets/templates/assets/cmd_filter_detail.html:61 +#: assets/templates/assets/cmd_filter_list.html:14 #: assets/templates/assets/domain_detail.html:56 #: assets/templates/assets/domain_gateway_list.html:56 #: assets/templates/assets/domain_list.html:25 @@ -162,7 +165,7 @@ msgstr "不能包含特殊字符" msgid "Name" msgstr "名称" -#: assets/forms/domain.py:60 assets/forms/user.py:80 assets/forms/user.py:143 +#: assets/forms/domain.py:60 assets/forms/user.py:81 assets/forms/user.py:144 #: assets/models/base.py:23 assets/templates/assets/admin_user_detail.html:60 #: assets/templates/assets/admin_user_list.html:27 #: assets/templates/assets/domain_gateway_list.html:60 @@ -179,11 +182,11 @@ msgstr "名称" msgid "Username" msgstr "用户名" -#: assets/forms/user.py:24 +#: assets/forms/user.py:25 msgid "Password or private key passphrase" msgstr "密码或密钥密码" -#: assets/forms/user.py:25 assets/models/base.py:24 common/forms.py:104 +#: assets/forms/user.py:26 assets/models/base.py:24 common/forms.py:104 #: users/forms.py:17 users/forms.py:35 users/forms.py:47 #: users/templates/users/login.html:65 #: users/templates/users/reset_password.html:53 @@ -195,33 +198,39 @@ msgstr "密码或密钥密码" msgid "Password" msgstr "密码" -#: assets/forms/user.py:28 users/models/user.py:78 +#: assets/forms/user.py:29 users/models/user.py:78 msgid "Private key" msgstr "ssh私钥" -#: assets/forms/user.py:38 +#: assets/forms/user.py:39 msgid "Invalid private key" msgstr "ssh密钥不合法" -#: assets/forms/user.py:47 +#: assets/forms/user.py:48 msgid "Password and private key file must be input one" msgstr "密码和私钥, 必须输入一个" -#: assets/forms/user.py:128 +#: assets/forms/user.py:129 msgid "* Automatic login mode, must fill in the username." msgstr "自动登录模式,必须填写用户名" -#: assets/forms/user.py:148 +#: assets/forms/user.py:146 assets/models/user.py:120 +#: assets/templates/assets/_system_user.html:66 +#: assets/templates/assets/system_user_detail.html:165 +msgid "Command filter" +msgstr "命令过滤器" + +#: assets/forms/user.py:152 msgid "Auto push system user to asset" msgstr "自动推送系统用户到资产" -#: assets/forms/user.py:149 +#: assets/forms/user.py:153 msgid "" "High level will be using login asset as default, if user was granted more " "than 2 system user" msgstr "高优先级的系统用户将会作为默认登录用户" -#: assets/forms/user.py:151 +#: assets/forms/user.py:155 msgid "" "If you choose manual login mode, you do not need to fill in the username and " "password." @@ -257,7 +266,7 @@ msgid "Hostname" msgstr "主机名" #: assets/models/asset.py:74 assets/models/domain.py:49 -#: assets/models/user.py:116 +#: assets/models/user.py:115 #: assets/templates/assets/domain_gateway_list.html:59 #: assets/templates/assets/system_user_detail.html:70 #: assets/templates/assets/system_user_list.html:31 @@ -271,8 +280,9 @@ msgstr "协议" msgid "Platform" msgstr "系统平台" -#: assets/models/asset.py:83 assets/models/domain.py:52 -#: assets/models/label.py:21 assets/templates/assets/asset_detail.html:105 +#: assets/models/asset.py:83 assets/models/cmd_filter.py:20 +#: assets/models/domain.py:52 assets/models/label.py:21 +#: assets/templates/assets/asset_detail.html:105 #: assets/templates/assets/user_asset_list.html:169 msgid "Is active" msgstr "激活" @@ -349,9 +359,11 @@ msgid "Labels" msgstr "标签管理" #: assets/models/asset.py:126 assets/models/base.py:30 -#: assets/models/cluster.py:28 assets/models/group.py:21 +#: assets/models/cluster.py:28 assets/models/cmd_filter.py:24 +#: assets/models/cmd_filter.py:54 assets/models/group.py:21 #: assets/templates/assets/admin_user_detail.html:68 #: assets/templates/assets/asset_detail.html:117 +#: assets/templates/assets/cmd_filter_detail.html:77 #: assets/templates/assets/domain_detail.html:72 #: assets/templates/assets/system_user_detail.html:100 #: ops/templates/ops/adhoc_detail.html:86 orgs/models.py:15 perms/models.py:37 @@ -363,6 +375,7 @@ msgstr "创建者" #: assets/models/asset.py:129 assets/models/cluster.py:26 #: assets/models/domain.py:21 assets/models/group.py:22 #: assets/models/label.py:24 assets/templates/assets/admin_user_detail.html:64 +#: assets/templates/assets/cmd_filter_detail.html:69 #: assets/templates/assets/domain_detail.html:68 #: assets/templates/assets/system_user_detail.html:96 #: ops/templates/ops/adhoc_detail.html:90 ops/templates/ops/task_detail.html:63 @@ -375,11 +388,15 @@ msgid "Date created" msgstr "创建日期" #: assets/models/asset.py:131 assets/models/base.py:27 -#: assets/models/cluster.py:29 assets/models/domain.py:19 +#: assets/models/cluster.py:29 assets/models/cmd_filter.py:21 +#: assets/models/cmd_filter.py:51 assets/models/domain.py:19 #: assets/models/domain.py:51 assets/models/group.py:23 #: assets/models/label.py:22 assets/templates/assets/admin_user_detail.html:72 #: assets/templates/assets/admin_user_list.html:32 #: assets/templates/assets/asset_detail.html:125 +#: assets/templates/assets/cmd_filter_detail.html:65 +#: assets/templates/assets/cmd_filter_list.html:17 +#: assets/templates/assets/cmd_filter_rule_list.html:62 #: assets/templates/assets/domain_detail.html:76 #: assets/templates/assets/domain_gateway_list.html:61 #: assets/templates/assets/domain_list.html:28 @@ -466,6 +483,77 @@ msgstr "北京电信" msgid "BGP full netcom" msgstr "BGP全网通" +#: assets/models/cmd_filter.py:34 +msgid "Regex" +msgstr "正则表达式" + +#: assets/models/cmd_filter.py:35 terminal/models.py:139 +#: terminal/templates/terminal/command_list.html:55 +#: terminal/templates/terminal/command_list.html:71 +#: terminal/templates/terminal/session_detail.html:48 +#: terminal/templates/terminal/session_list.html:77 +msgid "Command" +msgstr "命令" + +#: assets/models/cmd_filter.py:41 +msgid "Deny" +msgstr "拒绝" + +#: assets/models/cmd_filter.py:42 +#: terminal/templates/terminal/terminal_list.html:76 +msgid "Accept" +msgstr "接受" + +#: assets/models/cmd_filter.py:46 +msgid "Filter" +msgstr "过滤器" + +#: assets/models/cmd_filter.py:47 +#: assets/templates/assets/cmd_filter_rule_list.html:58 +#: audits/templates/audits/login_log_list.html:50 +#: common/templates/common/terminal_setting.html:73 +#: common/templates/common/terminal_setting.html:91 +msgid "Type" +msgstr "类型" + +#: assets/models/cmd_filter.py:48 assets/models/user.py:114 +#: assets/templates/assets/cmd_filter_rule_list.html:60 +msgid "Priority" +msgstr "优先级" + +#: assets/models/cmd_filter.py:49 +#: assets/templates/assets/cmd_filter_rule_list.html:59 +msgid "Content" +msgstr "内容" + +#: assets/models/cmd_filter.py:49 +msgid "One line one command" +msgstr "每行一个命令" + +#: assets/models/cmd_filter.py:50 +#: assets/templates/assets/admin_user_list.html:33 +#: assets/templates/assets/asset_list.html:97 +#: assets/templates/assets/cmd_filter_list.html:18 +#: assets/templates/assets/cmd_filter_rule_list.html:63 +#: assets/templates/assets/domain_gateway_list.html:62 +#: assets/templates/assets/domain_list.html:29 +#: assets/templates/assets/label_list.html:17 +#: assets/templates/assets/system_user_asset.html:53 +#: assets/templates/assets/system_user_list.html:38 audits/models.py:37 +#: audits/templates/audits/operate_log_list.html:41 +#: audits/templates/audits/operate_log_list.html:67 +#: ops/templates/ops/adhoc_history.html:59 ops/templates/ops/task_adhoc.html:64 +#: ops/templates/ops/task_history.html:65 ops/templates/ops/task_list.html:42 +#: perms/templates/perms/asset_permission_list.html:60 +#: terminal/templates/terminal/session_list.html:81 +#: terminal/templates/terminal/terminal_list.html:36 +#: users/templates/users/user_group_list.html:15 +#: users/templates/users/user_list.html:29 +#: xpack/plugins/orgs/templates/orgs/org_list.html:23 +#: xpack/templates/orgs/org_list.html:15 +msgid "Action" +msgstr "动作" + #: assets/models/domain.py:59 assets/templates/assets/domain_detail.html:21 #: assets/templates/assets/domain_detail.html:64 #: assets/templates/assets/domain_gateway_list.html:21 @@ -520,15 +608,15 @@ msgstr "分类" msgid "Key" msgstr "" -#: assets/models/user.py:109 +#: assets/models/user.py:108 msgid "Automatic login" msgstr "自动登录" -#: assets/models/user.py:110 +#: assets/models/user.py:109 msgid "Manually login" msgstr "手动登录" -#: assets/models/user.py:114 +#: assets/models/user.py:113 #: assets/templates/assets/_asset_group_bulk_update_modal.html:11 #: assets/templates/assets/system_user_asset.html:21 #: assets/templates/assets/system_user_detail.html:22 @@ -536,41 +624,40 @@ msgstr "手动登录" #: assets/views/admin_user.py:63 assets/views/admin_user.py:78 #: assets/views/admin_user.py:102 assets/views/asset.py:53 #: assets/views/asset.py:92 assets/views/asset.py:136 assets/views/asset.py:153 -#: assets/views/asset.py:177 assets/views/domain.py:29 -#: assets/views/domain.py:45 assets/views/domain.py:61 -#: assets/views/domain.py:74 assets/views/domain.py:98 -#: assets/views/domain.py:126 assets/views/domain.py:145 -#: assets/views/label.py:26 assets/views/label.py:42 assets/views/label.py:58 -#: assets/views/system_user.py:28 assets/views/system_user.py:44 -#: assets/views/system_user.py:60 assets/views/system_user.py:74 -#: templates/_nav.html:19 +#: assets/views/asset.py:177 assets/views/cmd_filter.py:30 +#: assets/views/cmd_filter.py:46 assets/views/cmd_filter.py:62 +#: assets/views/cmd_filter.py:78 assets/views/cmd_filter.py:97 +#: assets/views/cmd_filter.py:130 assets/views/cmd_filter.py:163 +#: assets/views/domain.py:29 assets/views/domain.py:45 +#: assets/views/domain.py:61 assets/views/domain.py:74 +#: assets/views/domain.py:98 assets/views/domain.py:126 +#: assets/views/domain.py:145 assets/views/label.py:26 assets/views/label.py:42 +#: assets/views/label.py:58 assets/views/system_user.py:28 +#: assets/views/system_user.py:44 assets/views/system_user.py:60 +#: assets/views/system_user.py:74 templates/_nav.html:19 msgid "Assets" msgstr "资产管理" -#: assets/models/user.py:115 -msgid "Priority" -msgstr "优先级" - -#: assets/models/user.py:117 assets/templates/assets/_system_user.html:59 +#: assets/models/user.py:116 assets/templates/assets/_system_user.html:59 #: assets/templates/assets/system_user_detail.html:122 #: assets/templates/assets/system_user_update.html:10 msgid "Auto push" msgstr "自动推送" -#: assets/models/user.py:118 assets/templates/assets/system_user_detail.html:74 +#: assets/models/user.py:117 assets/templates/assets/system_user_detail.html:74 msgid "Sudo" msgstr "Sudo" -#: assets/models/user.py:119 assets/templates/assets/system_user_detail.html:79 +#: assets/models/user.py:118 assets/templates/assets/system_user_detail.html:79 msgid "Shell" msgstr "Shell" -#: assets/models/user.py:120 assets/templates/assets/system_user_detail.html:66 +#: assets/models/user.py:119 assets/templates/assets/system_user_detail.html:66 #: assets/templates/assets/system_user_list.html:32 msgid "Login mode" msgstr "登录模式" -#: assets/models/user.py:181 assets/templates/assets/user_asset_list.html:167 +#: assets/models/user.py:189 assets/templates/assets/user_asset_list.html:167 #: audits/models.py:19 audits/templates/audits/ftp_log_list.html:49 #: audits/templates/audits/ftp_log_list.html:72 perms/forms.py:40 #: perms/models.py:33 perms/models.py:81 @@ -648,6 +735,8 @@ msgid "Select Asset" msgstr "选择资产" #: assets/templates/assets/_asset_group_bulk_update_modal.html:21 +#: assets/templates/assets/cmd_filter_detail.html:89 +#: assets/templates/assets/cmd_filter_list.html:16 #: assets/templates/assets/user_asset_list.html:48 #: users/templates/users/user_granted_asset.html:47 msgid "System users" @@ -708,7 +797,7 @@ msgstr "认证" msgid "Auto generate key" msgstr "自动生成密钥" -#: assets/templates/assets/_system_user.html:65 +#: assets/templates/assets/_system_user.html:69 #: assets/templates/assets/asset_create.html:60 #: assets/templates/assets/asset_update.html:64 #: assets/templates/assets/gateway_create_update.html:53 @@ -717,11 +806,13 @@ msgstr "自动生成密钥" msgid "Other" msgstr "其它" -#: assets/templates/assets/_system_user.html:71 +#: assets/templates/assets/_system_user.html:75 #: assets/templates/assets/admin_user_create_update.html:45 #: assets/templates/assets/asset_bulk_update.html:23 #: assets/templates/assets/asset_create.html:67 #: assets/templates/assets/asset_update.html:71 +#: assets/templates/assets/cmd_filter_create_update.html:15 +#: assets/templates/assets/cmd_filter_rule_create_update.html:40 #: assets/templates/assets/domain_create_update.html:16 #: assets/templates/assets/gateway_create_update.html:58 #: assets/templates/assets/label_create_update.html:18 @@ -743,12 +834,14 @@ msgstr "其它" msgid "Reset" msgstr "重置" -#: assets/templates/assets/_system_user.html:72 +#: assets/templates/assets/_system_user.html:76 #: assets/templates/assets/admin_user_create_update.html:46 #: assets/templates/assets/asset_bulk_update.html:24 #: assets/templates/assets/asset_create.html:68 #: assets/templates/assets/asset_list.html:114 #: assets/templates/assets/asset_update.html:72 +#: assets/templates/assets/cmd_filter_create_update.html:16 +#: assets/templates/assets/cmd_filter_rule_create_update.html:41 #: assets/templates/assets/domain_create_update.html:17 #: assets/templates/assets/gateway_create_update.html:59 #: assets/templates/assets/label_create_update.html:19 @@ -783,6 +876,8 @@ msgstr "关闭" #: assets/templates/assets/admin_user_assets.html:18 #: assets/templates/assets/admin_user_detail.html:18 +#: assets/templates/assets/cmd_filter_detail.html:19 +#: assets/templates/assets/cmd_filter_rule_list.html:19 #: assets/templates/assets/domain_detail.html:18 #: assets/templates/assets/domain_gateway_list.html:18 #: assets/templates/assets/system_user_asset.html:17 @@ -838,6 +933,9 @@ msgstr "测试" #: assets/templates/assets/admin_user_list.html:88 #: assets/templates/assets/asset_detail.html:24 #: assets/templates/assets/asset_list.html:171 +#: assets/templates/assets/cmd_filter_detail.html:29 +#: assets/templates/assets/cmd_filter_list.html:47 +#: assets/templates/assets/cmd_filter_rule_list.html:86 #: assets/templates/assets/domain_detail.html:24 #: assets/templates/assets/domain_detail.html:103 #: assets/templates/assets/domain_gateway_list.html:85 @@ -866,6 +964,9 @@ msgstr "更新" #: assets/templates/assets/admin_user_list.html:89 #: assets/templates/assets/asset_detail.html:28 #: assets/templates/assets/asset_list.html:172 +#: assets/templates/assets/cmd_filter_detail.html:33 +#: assets/templates/assets/cmd_filter_list.html:48 +#: assets/templates/assets/cmd_filter_rule_list.html:87 #: assets/templates/assets/domain_detail.html:28 #: assets/templates/assets/domain_detail.html:104 #: assets/templates/assets/domain_gateway_list.html:86 @@ -900,8 +1001,9 @@ msgstr "选择节点" #: assets/templates/assets/admin_user_detail.html:100 #: assets/templates/assets/asset_detail.html:200 #: assets/templates/assets/asset_list.html:633 +#: assets/templates/assets/cmd_filter_detail.html:106 #: assets/templates/assets/system_user_asset.html:111 -#: assets/templates/assets/system_user_detail.html:330 +#: assets/templates/assets/system_user_detail.html:182 #: assets/templates/assets/system_user_list.html:143 templates/_modal.html:22 #: terminal/templates/terminal/session_detail.html:108 #: users/templates/users/user_detail.html:382 @@ -951,27 +1053,6 @@ msgstr "不可达" msgid "Ratio" msgstr "比例" -#: assets/templates/assets/admin_user_list.html:33 -#: assets/templates/assets/asset_list.html:97 -#: assets/templates/assets/domain_gateway_list.html:62 -#: assets/templates/assets/domain_list.html:29 -#: assets/templates/assets/label_list.html:17 -#: assets/templates/assets/system_user_asset.html:53 -#: assets/templates/assets/system_user_list.html:38 audits/models.py:37 -#: audits/templates/audits/operate_log_list.html:41 -#: audits/templates/audits/operate_log_list.html:67 -#: ops/templates/ops/adhoc_history.html:59 ops/templates/ops/task_adhoc.html:64 -#: ops/templates/ops/task_history.html:65 ops/templates/ops/task_list.html:42 -#: perms/templates/perms/asset_permission_list.html:60 -#: terminal/templates/terminal/session_list.html:81 -#: terminal/templates/terminal/terminal_list.html:36 -#: users/templates/users/user_group_list.html:15 -#: users/templates/users/user_list.html:29 -#: xpack/plugins/orgs/templates/orgs/org_list.html:23 -#: xpack/templates/orgs/org_list.html:15 -msgid "Action" -msgstr "动作" - #: assets/templates/assets/asset_bulk_update.html:8 #: users/templates/users/user_bulk_update.html:8 msgid "Select properties that need to be modified" @@ -1157,7 +1238,6 @@ msgid "This will delete the selected assets !!!" msgstr "删除选择资产" #: assets/templates/assets/asset_list.html:631 -#: assets/templates/assets/system_user_detail.html:328 #: assets/templates/assets/system_user_list.html:141 #: users/templates/users/user_detail.html:380 #: users/templates/users/user_detail.html:406 @@ -1186,6 +1266,37 @@ msgstr "删除失败" msgid "Configuration" msgstr "配置" +#: assets/templates/assets/cmd_filter_detail.html:25 +#: assets/templates/assets/cmd_filter_list.html:15 +#: assets/templates/assets/cmd_filter_rule_list.html:23 +msgid "Rules" +msgstr "规则" + +#: assets/templates/assets/cmd_filter_detail.html:73 +msgid "Date updated" +msgstr "更新日期" + +#: assets/templates/assets/cmd_filter_detail.html:97 +msgid "Binding to system user" +msgstr "绑定到系统用户" + +#: assets/templates/assets/cmd_filter_list.html:6 assets/views/cmd_filter.py:47 +msgid "Create command filter" +msgstr "创建命令过滤器" + +#: assets/templates/assets/cmd_filter_rule_list.html:33 +#: assets/views/cmd_filter.py:98 +msgid "Command filter rule list" +msgstr "命令过滤器列表" + +#: assets/templates/assets/cmd_filter_rule_list.html:50 +msgid "Create rule" +msgstr "创建规则" + +#: assets/templates/assets/cmd_filter_rule_list.html:61 +msgid "Strategy" +msgstr "分类" + #: assets/templates/assets/delete_confirm.html:6 #: perms/templates/perms/delete_confirm.html:6 templates/delete_confirm.html:6 msgid "Confirm delete" @@ -1273,17 +1384,9 @@ msgstr "家目录" msgid "Uid" msgstr "Uid" -#: assets/templates/assets/system_user_detail.html:324 -msgid "Are you sure to remove authentication information for the system user ?" -msgstr "你确定清除该系统用户的认证信息吗 ?" - -#: assets/templates/assets/system_user_detail.html:336 -msgid "Clear auth" -msgstr "清除认证信息" - -#: assets/templates/assets/system_user_detail.html:336 -msgid "success" -msgstr "成功" +#: assets/templates/assets/system_user_detail.html:173 +msgid "Binding command filters" +msgstr "绑定命令过滤器" #: assets/templates/assets/system_user_list.html:10 msgid "" @@ -1369,6 +1472,26 @@ msgstr "更新资产" msgid "already exists" msgstr "已经存在" +#: assets/views/cmd_filter.py:31 +msgid "Command filter list" +msgstr "命令过滤器列表" + +#: assets/views/cmd_filter.py:63 +msgid "Update command filter" +msgstr "更新命令过滤器" + +#: assets/views/cmd_filter.py:79 +msgid "Command filter detail" +msgstr "命令过滤器详情" + +#: assets/views/cmd_filter.py:131 +msgid "Create command filter rule" +msgstr "创建命令过滤器规则" + +#: assets/views/cmd_filter.py:164 +msgid "Update command filter rule" +msgstr "更新命令过滤器规则" + #: assets/views/domain.py:30 templates/_nav.html:23 msgid "Domain list" msgstr "网域列表" @@ -1491,12 +1614,6 @@ msgstr "搜索" msgid "ID" msgstr "ID" -#: audits/templates/audits/login_log_list.html:50 -#: common/templates/common/terminal_setting.html:73 -#: common/templates/common/terminal_setting.html:91 -msgid "Type" -msgstr "类型" - #: audits/templates/audits/login_log_list.html:51 msgid "UA" msgstr "Agent" @@ -1535,19 +1652,19 @@ msgid "Datetime" msgstr "日期" #: audits/views.py:66 audits/views.py:110 audits/views.py:143 -#: templates/_nav.html:67 +#: templates/_nav.html:73 msgid "Audits" msgstr "日志审计" -#: audits/views.py:67 templates/_nav.html:71 +#: audits/views.py:67 templates/_nav.html:77 msgid "FTP log" msgstr "FTP日志" -#: audits/views.py:111 templates/_nav.html:72 +#: audits/views.py:111 templates/_nav.html:78 msgid "Operate log" msgstr "操作日志" -#: audits/views.py:144 templates/_nav.html:73 +#: audits/views.py:144 templates/_nav.html:79 msgid "Password change log" msgstr "改密日志" @@ -1559,7 +1676,7 @@ msgstr "改密日志" msgid "Users" msgstr "用户管理" -#: audits/views.py:184 templates/_nav.html:70 +#: audits/views.py:184 templates/_nav.html:76 msgid "Login log" msgstr "登录日志" @@ -1881,7 +1998,7 @@ msgid "Special char not allowed" msgstr "不能包含特殊字符" #: common/views.py:19 common/views.py:45 common/views.py:71 common/views.py:101 -#: common/views.py:129 templates/_nav.html:100 +#: common/views.py:129 templates/_nav.html:106 msgid "Settings" msgstr "系统设置" @@ -1890,7 +2007,7 @@ msgstr "系统设置" msgid "Update setting successfully, please restart program" msgstr "更新设置成功, 请手动重启程序" -#: jumpserver/views.py:178 +#: jumpserver/views.py:180 msgid "" "
Luna is a separately deployed program, you need to deploy Luna, coco, " "configure nginx for url distribution,
If you see this page, " @@ -1927,7 +2044,7 @@ msgstr "任务" #: ops/models/adhoc.py:157 ops/templates/ops/adhoc_detail.html:57 #: ops/templates/ops/task_adhoc.html:60 msgid "Pattern" -msgstr "" +msgstr "模式" #: ops/models/adhoc.py:158 ops/templates/ops/adhoc_detail.html:61 msgid "Options" @@ -2136,7 +2253,7 @@ msgstr "任务开始: " msgid "Ops" msgstr "作业中心" -#: ops/views.py:37 templates/_nav.html:61 +#: ops/views.py:37 templates/_nav.html:67 msgid "Task list" msgstr "任务列表" @@ -2174,7 +2291,7 @@ msgstr "资产和节点至少选一个" msgid "Date expired" msgstr "失效日期" -#: perms/models.py:45 perms/models.py:92 templates/_nav.html:33 +#: perms/models.py:45 perms/models.py:92 templates/_nav.html:34 msgid "Asset permission" msgstr "资产授权" @@ -2262,7 +2379,7 @@ msgid "Select user groups" msgstr "选择用户组" #: perms/views.py:23 perms/views.py:53 perms/views.py:68 perms/views.py:83 -#: perms/views.py:118 perms/views.py:150 templates/_nav.html:30 +#: perms/views.py:118 perms/views.py:150 templates/_nav.html:31 #: xpack/plugins/orgs/templates/orgs/org_list.html:21 msgid "Perms" msgstr "权限管理" @@ -2365,38 +2482,46 @@ msgstr "" msgid "User list" msgstr "用户列表" -#: templates/_nav.html:39 +#: templates/_nav.html:27 +msgid "Command filters" +msgstr "命令过滤" + +#: templates/_nav.html:40 msgid "Sessions" msgstr "会话管理" -#: templates/_nav.html:42 +#: templates/_nav.html:43 msgid "Session online" msgstr "在线会话" -#: templates/_nav.html:43 +#: templates/_nav.html:44 msgid "Session offline" msgstr "历史会话" -#: templates/_nav.html:44 +#: templates/_nav.html:45 msgid "Commands" msgstr "命令记录" -#: templates/_nav.html:47 templates/_nav_user.html:14 +#: templates/_nav.html:48 templates/_nav_user.html:14 msgid "Web terminal" msgstr "Web终端" -#: templates/_nav.html:51 terminal/views/command.py:50 +#: templates/_nav.html:53 +msgid "File manager" +msgstr "文件管理" + +#: templates/_nav.html:57 terminal/views/command.py:50 #: terminal/views/session.py:75 terminal/views/session.py:93 #: terminal/views/session.py:115 terminal/views/terminal.py:31 #: terminal/views/terminal.py:46 terminal/views/terminal.py:58 msgid "Terminal" msgstr "终端管理" -#: templates/_nav.html:58 +#: templates/_nav.html:64 msgid "Job Center" msgstr "作业中心" -#: templates/_nav.html:88 +#: templates/_nav.html:94 msgid "XPack" msgstr "" @@ -2638,13 +2763,6 @@ msgstr "运行时间" msgid "Replay" msgstr "回放" -#: terminal/models.py:139 terminal/templates/terminal/command_list.html:55 -#: terminal/templates/terminal/command_list.html:71 -#: terminal/templates/terminal/session_detail.html:48 -#: terminal/templates/terminal/session_list.html:77 -msgid "Command" -msgstr "命令" - #: terminal/models.py:142 msgid "Date last active" msgstr "最后活跃日期" @@ -2726,10 +2844,8 @@ msgid "Terminate task send, waiting ..." msgstr "终断任务已发送,请等待" #: terminal/templates/terminal/session_list.html:156 -#, fuzzy -#| msgid "MFA enable success" msgid "Finish session success" -msgstr "MFA 绑定成功" +msgstr "标记会话完成成功" #: terminal/templates/terminal/terminal_detail.html:13 #: terminal/views/terminal.py:59 @@ -2752,10 +2868,6 @@ msgstr "地址" msgid "Alive" msgstr "在线" -#: terminal/templates/terminal/terminal_list.html:76 -msgid "Accept" -msgstr "接受" - #: terminal/templates/terminal/terminal_list.html:78 msgid "Reject" msgstr "拒绝" @@ -2784,36 +2896,36 @@ msgstr "终端列表" msgid "Update terminal" msgstr "更新终端" -#: terminal/views/terminal.py:102 terminal/views/terminal.py:103 +#: terminal/views/terminal.py:105 terminal/views/terminal.py:106 msgid "Redirect to web terminal" msgstr "重定向到web terminal" -#: terminal/views/terminal.py:110 +#: terminal/views/terminal.py:113 msgid "Connect ssh terminal" msgstr "连接ssh终端" -#: terminal/views/terminal.py:111 +#: terminal/views/terminal.py:114 msgid "" "You should use your ssh client tools connect terminal: {}

{}" msgstr "你可以使用ssh客户端工具连接终端" -#: users/api/auth.py:38 users/templates/users/login.html:52 +#: users/api/auth.py:40 users/templates/users/login.html:52 msgid "Log in frequently and try again later" msgstr "登录频繁, 稍后重试" -#: users/api/auth.py:77 +#: users/api/auth.py:79 msgid "Please carry seed value and conduct MFA secondary certification" msgstr "请携带seed值, 进行MFA二次认证" -#: users/api/auth.py:190 +#: users/api/auth.py:192 msgid "Please verify the user name and password first" msgstr "请先进行用户名和密码验证" -#: users/api/auth.py:202 +#: users/api/auth.py:204 msgid "MFA certification failed" msgstr "MFA认证失败" -#: users/api/user.py:134 +#: users/api/user.py:135 msgid "Could not reset self otp, use profile reset instead" msgstr "不能再该页面重置MFA, 请去个人信息页面重置" @@ -3133,7 +3245,7 @@ msgstr "上一步" #: users/templates/users/first_login.html:105 #: users/templates/users/login_otp.html:67 #: users/templates/users/user_otp_authentication.html:26 -#: users/templates/users/user_otp_enable_bind.html:23 +#: users/templates/users/user_otp_enable_bind.html:29 #: users/templates/users/user_otp_enable_install_app.html:26 #: users/templates/users/user_password_authentication.html:21 msgid "Next" @@ -3222,7 +3334,7 @@ msgstr "请打开手机Google Authenticator应用,输入6位动态码" #: users/templates/users/login_otp.html:65 #: users/templates/users/user_otp_authentication.html:23 -#: users/templates/users/user_otp_enable_bind.html:20 +#: users/templates/users/user_otp_enable_bind.html:26 msgid "Six figures" msgstr "6位数字" @@ -3496,7 +3608,7 @@ msgstr "解绑 MFA" msgid "Bind" msgstr "绑定 MFA" -#: users/templates/users/user_otp_enable_bind.html:12 +#: users/templates/users/user_otp_enable_bind.html:14 msgid "" "Use the mobile Google Authenticator application to scan the following qr " "code for a 6-bit verification code" @@ -3737,7 +3849,7 @@ msgstr "用户组授权资产" msgid "Please enable cookies and try again." msgstr "设置你的浏览器支持cookie" -#: users/views/login.py:175 users/views/user.py:524 users/views/user.py:549 +#: users/views/login.py:175 users/views/user.py:526 users/views/user.py:551 msgid "MFA code invalid, or ntp sync server time" msgstr "MFA验证码不正确,或者服务器端时间不对" @@ -3818,19 +3930,19 @@ msgstr "密钥更新" msgid "Password invalid" msgstr "用户名或密码无效" -#: users/views/user.py:579 +#: users/views/user.py:581 msgid "MFA enable success" msgstr "MFA 绑定成功" -#: users/views/user.py:580 +#: users/views/user.py:582 msgid "MFA enable success, return login page" msgstr "MFA 绑定成功,返回到登录页面" -#: users/views/user.py:582 +#: users/views/user.py:584 msgid "MFA disable success" msgstr "MFA 解绑成功" -#: users/views/user.py:583 +#: users/views/user.py:585 msgid "MFA disable success, return login page" msgstr "MFA 解绑成功,返回登录页面" @@ -3882,6 +3994,16 @@ msgstr "创建组织" msgid "Update org" msgstr "更新组织" +#~ msgid "" +#~ "Are you sure to remove authentication information for the system user ?" +#~ msgstr "你确定清除该系统用户的认证信息吗 ?" + +#~ msgid "Clear auth" +#~ msgstr "清除认证信息" + +#~ msgid "success" +#~ msgstr "成功" + #~ msgid "Task has been send, Go to ops task list seen result" #~ msgstr "任务已下发,查看ops任务列表" diff --git a/apps/orgs/views.py b/apps/orgs/views.py index 374f34812..5a363df0a 100644 --- a/apps/orgs/views.py +++ b/apps/orgs/views.py @@ -14,7 +14,8 @@ class SwitchOrgView(DetailView): pk = kwargs.get('pk') self.object = Organization.get_instance(pk) request.session['oid'] = self.object.id.__str__() - return redirect('index') + referer = request.META.get('HTTP_REFERER', reverse('index')) + return redirect(referer) class SwitchToAOrgView(View): diff --git a/apps/templates/_nav.html b/apps/templates/_nav.html index b85e9aebe..5014068dc 100644 --- a/apps/templates/_nav.html +++ b/apps/templates/_nav.html @@ -24,6 +24,7 @@
  • {% trans 'Admin user' %}
  • {% trans 'System user' %}
  • {% trans 'Labels' %}
  • +
  • {% trans 'Command filters' %}
  • @@ -47,6 +48,11 @@ {% trans 'Web terminal' %}
  • +
  • + + {% trans 'File manager' %} + +
  • {% if request.user.is_superuser %}
  • {% trans 'Terminal' %}
  • {% endif %} diff --git a/apps/terminal/urls/views_urls.py b/apps/terminal/urls/views_urls.py index a98a63294..3e144da85 100644 --- a/apps/terminal/urls/views_urls.py +++ b/apps/terminal/urls/views_urls.py @@ -16,6 +16,7 @@ urlpatterns = [ path('terminal//update/', views.TerminalUpdateView.as_view(), name='terminal-update'), path('/accept/', views.TerminalAcceptView.as_view(), name='terminal-accept'), path('web-terminal/', views.WebTerminalView.as_view(), name='web-terminal'), + path('web-sftp/', views.WebSFTPView.as_view(), name='web-sftp'), # Session view path('session-online/', views.SessionOnlineListView.as_view(), name='session-online-list'), diff --git a/apps/terminal/views/terminal.py b/apps/terminal/views/terminal.py index 1adf09513..210bec136 100644 --- a/apps/terminal/views/terminal.py +++ b/apps/terminal/views/terminal.py @@ -16,7 +16,7 @@ from common.permissions import SuperUserRequiredMixin __all__ = [ "TerminalListView", "TerminalUpdateView", "TerminalDetailView", "TerminalDeleteView", "TerminalConnectView", "TerminalAcceptView", - "WebTerminalView", + "WebTerminalView", 'WebSFTPView', ] @@ -124,3 +124,8 @@ class TerminalConnectView(LoginRequiredMixin, SuperUserRequiredMixin, DetailView class WebTerminalView(LoginRequiredMixin, View): def get(self, request, *args, **kwargs): return redirect('/luna/?' + request.GET.urlencode()) + + +class WebSFTPView(LoginRequiredMixin, View): + def get(self, request, *args, **kwargs): + return redirect('/coco/elfinder/sftp/?' + request.GET.urlencode()) diff --git a/requirements/requirements.txt b/requirements/requirements.txt index 7bd31d93e..d1aaf3b1a 100644 --- a/requirements/requirements.txt +++ b/requirements/requirements.txt @@ -71,3 +71,4 @@ urllib3==1.22 vine==1.1.4 drf-yasg==1.9.1 Werkzeug==0.14.1 +drf-nested-routers==0.90.2 From 70fa43adaa0b5ebc8bb4b0ca8ce5eb32f7ab251b Mon Sep 17 00:00:00 2001 From: ibuler Date: Wed, 10 Oct 2018 19:29:53 +0800 Subject: [PATCH 5/9] =?UTF-8?q?[Update]=20=E4=BF=AE=E6=94=B9=E4=B8=80?= =?UTF-8?q?=E4=BA=9B=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/assets/forms/cmd_filter.py | 7 +++++++ apps/assets/models/cmd_filter.py | 10 ++++++---- apps/assets/models/node.py | 10 ++++------ apps/assets/models/user.py | 2 +- .../templates/assets/cmd_filter_list.html | 2 +- .../assets/cmd_filter_rule_create_update.html | 17 +++++++++++++++++ .../templates/assets/system_user_asset.html | 3 ++- apps/assets/views/system_user.py | 3 ++- apps/common/templatetags/common_tags.py | 6 ++++++ apps/locale/zh/LC_MESSAGES/django.mo | Bin 51572 -> 51572 bytes apps/locale/zh/LC_MESSAGES/django.po | 2 +- 11 files changed, 47 insertions(+), 15 deletions(-) diff --git a/apps/assets/forms/cmd_filter.py b/apps/assets/forms/cmd_filter.py index ebac4fee2..6cb35e631 100644 --- a/apps/assets/forms/cmd_filter.py +++ b/apps/assets/forms/cmd_filter.py @@ -1,5 +1,7 @@ # -*- coding: utf-8 -*- # +from django import forms + from orgs.mixins import OrgModelForm from ..models import CommandFilter, CommandFilterRule @@ -18,3 +20,8 @@ class CommandFilterRuleForm(OrgModelForm): fields = [ 'filter', 'type', 'content', 'priority', 'action', 'comment' ] + widgets = { + 'content': forms.Textarea(attrs={ + 'placeholder': 'eg:\r\nreboot\r\nrm -rf' + }), + } diff --git a/apps/assets/models/cmd_filter.py b/apps/assets/models/cmd_filter.py index b06bed5c6..e214073c6 100644 --- a/apps/assets/models/cmd_filter.py +++ b/apps/assets/models/cmd_filter.py @@ -35,11 +35,10 @@ class CommandFilterRule(OrgModelMixin): (TYPE_COMMAND, _('Command')), ) - ACTION_DENY = 'deny' - ACTION_ACCEPT = 'accept' + ACTION_DENY, ACTION_ALLOW = range(2) ACTION_CHOICES = ( (ACTION_DENY, _('Deny')), - (ACTION_ACCEPT, _('Accept')) + (ACTION_ALLOW, _('Allow')), ) id = models.UUIDField(default=uuid.uuid4, primary_key=True) @@ -47,11 +46,14 @@ class CommandFilterRule(OrgModelMixin): type = models.CharField(max_length=16, default=TYPE_COMMAND, choices=TYPE_CHOICES, verbose_name=_("Type")) priority = models.IntegerField(default=50, verbose_name=_("Priority"), validators=[MinValueValidator(1), MaxValueValidator(100)]) content = models.TextField(max_length=1024, verbose_name=_("Content"), help_text=_("One line one command")) - action = models.CharField(max_length=16, default=ACTION_DENY, choices=ACTION_CHOICES, verbose_name=_("Action")) + action = models.IntegerField(default=ACTION_DENY, choices=ACTION_CHOICES, verbose_name=_("Action")) comment = models.CharField(max_length=64, blank=True, default='', verbose_name=_("Comment")) date_created = models.DateTimeField(auto_now_add=True) date_updated = models.DateTimeField(auto_now=True) created_by = models.CharField(max_length=128, blank=True, default='', verbose_name=_('Created by')) + class Meta: + ordering = ('priority', 'action') + def __str__(self): return '{} % {}'.format(self.type, self.content) diff --git a/apps/assets/models/node.py b/apps/assets/models/node.py index 517996086..54cf77364 100644 --- a/apps/assets/models/node.py +++ b/apps/assets/models/node.py @@ -38,12 +38,10 @@ class Node(OrgModelMixin): return True self_key = [int(k) for k in self.key.split(':')] other_key = [int(k) for k in other.key.split(':')] - if len(self_key) < len(other_key): - return True - elif len(self_key) > len(other_key): - return False - else: - return self_key[-1] < other_key[-1] + return self_key.__lt__(other_key) + + def __lt__(self, other): + return not self.__gt__(other) @property def name(self): diff --git a/apps/assets/models/user.py b/apps/assets/models/user.py index 338f861ea..cd90d4207 100644 --- a/apps/assets/models/user.py +++ b/apps/assets/models/user.py @@ -117,7 +117,7 @@ class SystemUser(AssetUser): sudo = models.TextField(default='/bin/whoami', verbose_name=_('Sudo')) shell = models.CharField(max_length=64, default='/bin/bash', verbose_name=_('Shell')) login_mode = models.CharField(choices=LOGIN_MODE_CHOICES, default=AUTO_LOGIN, max_length=10, verbose_name=_('Login mode')) - cmd_filters = models.ManyToManyField('CommandFilter', related_name='system_users', verbose_name=_("Command filter")) + cmd_filters = models.ManyToManyField('CommandFilter', related_name='system_users', verbose_name=_("Command filter"), blank=True) cache_key = "__SYSTEM_USER_CACHED_{}" diff --git a/apps/assets/templates/assets/cmd_filter_list.html b/apps/assets/templates/assets/cmd_filter_list.html index 4bc33cf02..4887d609e 100644 --- a/apps/assets/templates/assets/cmd_filter_list.html +++ b/apps/assets/templates/assets/cmd_filter_list.html @@ -66,7 +66,7 @@ $(document).ready(function(){ var $data_table = $('#cmd_filter_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:label-detail" pk=DEFAULT_PK %}'.replace('{{ DEFAULT_PK }}', uid); + var the_url = '{% url "api-assets:cmd-filter-detail" pk=DEFAULT_PK %}'.replace('{{ DEFAULT_PK }}', uid); objectDelete($this, name, the_url); setTimeout( function () { $data_table.ajax.reload(); diff --git a/apps/assets/templates/assets/cmd_filter_rule_create_update.html b/apps/assets/templates/assets/cmd_filter_rule_create_update.html index bbb02f48c..9b240bd74 100644 --- a/apps/assets/templates/assets/cmd_filter_rule_create_update.html +++ b/apps/assets/templates/assets/cmd_filter_rule_create_update.html @@ -51,7 +51,24 @@ {% block custom_foot_js %} {% endblock %} \ No newline at end of file diff --git a/apps/assets/templates/assets/system_user_asset.html b/apps/assets/templates/assets/system_user_asset.html index a7d5bf50b..bf778d46f 100644 --- a/apps/assets/templates/assets/system_user_asset.html +++ b/apps/assets/templates/assets/system_user_asset.html @@ -1,4 +1,5 @@ {% extends 'base.html' %} +{% load common_tags %} {% load static %} {% load i18n %} @@ -113,7 +114,7 @@ - {% for node in system_user.nodes.all %} + {% for node in system_user.nodes.all|sort %} {{ node }} diff --git a/apps/assets/views/system_user.py b/apps/assets/views/system_user.py index c8c6ea6be..c31fd8da0 100644 --- a/apps/assets/views/system_user.py +++ b/apps/assets/views/system_user.py @@ -91,10 +91,11 @@ class SystemUserAssetView(AdminUserRequiredMixin, DetailView): context_object_name = 'system_user' def get_context_data(self, **kwargs): + nodes_remain = sorted(Node.objects.exclude(systemuser=self.object), reverse=True) context = { 'app': _('assets'), 'action': _('System user asset'), - 'nodes_remain': Node.objects.exclude(systemuser=self.object) + 'nodes_remain': nodes_remain } kwargs.update(context) return super().get_context_data(**kwargs) diff --git a/apps/common/templatetags/common_tags.py b/apps/common/templatetags/common_tags.py index 9123ecef8..7cafb0460 100644 --- a/apps/common/templatetags/common_tags.py +++ b/apps/common/templatetags/common_tags.py @@ -100,3 +100,9 @@ def is_bool_field(field): @register.filter def to_dict(data): return dict(data) + + +@register.filter +def sort(data): + print(data) + return sorted(data) diff --git a/apps/locale/zh/LC_MESSAGES/django.mo b/apps/locale/zh/LC_MESSAGES/django.mo index 4dcc60c68a42ae407f37bf2d39d5d0d818b5a6f9..422c312742c2dee1293b43dd826e86bbb2ef9d98 100644 GIT binary patch delta 21 dcmew|iTTSU<_%ig*q*PQ_I&En%?8_CgaLg33giF) delta 21 dcmew|iTTSU<_%ig*q(N@J>R%{v%xkOVE}wE3f}+# diff --git a/apps/locale/zh/LC_MESSAGES/django.po b/apps/locale/zh/LC_MESSAGES/django.po index 7bd6620c1..89584ac35 100644 --- a/apps/locale/zh/LC_MESSAGES/django.po +++ b/apps/locale/zh/LC_MESSAGES/django.po @@ -1295,7 +1295,7 @@ msgstr "创建规则" #: assets/templates/assets/cmd_filter_rule_list.html:61 msgid "Strategy" -msgstr "分类" +msgstr "策略" #: assets/templates/assets/delete_confirm.html:6 #: perms/templates/perms/delete_confirm.html:6 templates/delete_confirm.html:6 From 76d4e4ad55e58becdccecaea9e96f6da6bee4959 Mon Sep 17 00:00:00 2001 From: ibuler Date: Wed, 10 Oct 2018 19:31:28 +0800 Subject: [PATCH 6/9] =?UTF-8?q?[Update]=20=E4=BF=AE=E6=94=B9=E7=BF=BB?= =?UTF-8?q?=E8=AF=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/locale/zh/LC_MESSAGES/django.mo | Bin 51572 -> 51625 bytes apps/locale/zh/LC_MESSAGES/django.po | 71 ++++++++++++++------------- 2 files changed, 37 insertions(+), 34 deletions(-) diff --git a/apps/locale/zh/LC_MESSAGES/django.mo b/apps/locale/zh/LC_MESSAGES/django.mo index 422c312742c2dee1293b43dd826e86bbb2ef9d98..7f06fc7ba9f86558d1f563ecc739c7062158ff00 100644 GIT binary patch delta 15786 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 delta 15694 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

    (E1$*Lu`HQZ7)Z%UdmpBd)611i{na(t>YHe@ znDQAnN?=AjjvrDAxyC+k7(qC}Cv?)sE)Mg$oBsdT+5qZ*(B?B6v>5)!?hl~e+3JnV zaN0&w@>~1z)T?oCE3v+^A6mOL#Pjw1b#z4_GpU@)Z? z_v;eZrvBG!ZN`)DO#Cf*U8$(2$HnBEQFI-%_6<<~?Z{s8QTVR*pVu0dC9#;ssr_Ae z%dsQ(670Uxv#4*Rov!?N1#eLblmEu@vxxOI`|2u8Wsu!#N?qTG_3Y+Me{nYDDeTcQ0MSY45C_*j2nS5T#bmHR_e#!d(t0(z&6#w&|ip?lZ zDCw+oZJbHmkw)Rv6V#Y1omqu?9m)@sjO21yzf@*79L&8=IDz}Yl*g3y#Er2Krl9W) z8tK|i;sE}sfa?(PQoK*2t`uFX$+fh4Ej&i7>m=nZ${FHm*o=E`QL5VgZ*da&^yI$8 zMAQ$ecLUgeA~ze7xJ8Meeuo=psYg@)oWd`!{_8aLx5@9pK-4wL?1$$lnYniY$5Fnb zyt*<|uV?WYl5fy%9wog#|A*{GH4?hMCf-B&lsGGKHR@w@gX;phsn-5`>I127#}Syo z{V~+PrM}SLnqOjwo9e#BuNX(Js>adh|9i?F%4*6*Zv4%SMY_rL6HcZqpJYrTa#7ds|G!(J zHO{5{kFu4vUr;vCCKK^U>TlvH;`Wq26kTtU&q~QpJuRk?kHwY58z|i=)l<3oy)bTW z=jIKHu4Om}|HMa>vDAm#z;kgXxh0fKYW&(&nR*Fp_ddR7^(V9~O+ACfUs#`odj1Ew zsp~yF?W*1k^S0fy(EFLV5M>zyUB#{3SVXx-Jq>2F2^L`w;zY`;t2k|R{b;H_Ugv*= z#y?P2*p0S$i2Q7vXt^qQnA`_=RD)Cai>u^2c^69 z*@mAGXV>%pi3UlO%Oo~(BboXD>YMQy>bgyNNg2ld7T6f~V+Cx0S1GzarL?C!q9k#z zH--Osjr50Ip^W*q#X0o--<;q)H!E|a8&<%NDU->s!XmGAE>At4oURwh&qXlz7JZQqMmpfv&7L$r?6yDbGiI znR+(NLb+h~b^9>&mh?GpZQI+uC>u}drIuSkuBWvVZ7J_^FH#c}AQ(%7T(|?V$s{X4r@f7a=hw|!5zEUcUuO~Np zk-SE>1EwMV4383*w#K{6>v(~DEM*SuGEzEI`jf9o(F=WmSXX&UN$WQhzoYz1xkJfK zn@_m^Uv-HgXhO-YUawufsOPcxLvtPNbcHa;+xRQKe(fOmm@\n" "Language-Team: Jumpserver team\n" @@ -36,7 +36,7 @@ msgstr "测试节点下资产是否可连接: {}" #: assets/forms/asset.py:27 assets/models/asset.py:82 assets/models/user.py:112 #: assets/templates/assets/asset_detail.html:183 #: assets/templates/assets/asset_detail.html:191 -#: assets/templates/assets/system_user_asset.html:94 perms/models.py:32 +#: assets/templates/assets/system_user_asset.html:95 perms/models.py:32 msgid "Nodes" msgstr "节点管理" @@ -99,7 +99,7 @@ msgstr "选择资产" #: assets/models/domain.py:48 assets/templates/assets/admin_user_assets.html:53 #: assets/templates/assets/asset_detail.html:69 #: assets/templates/assets/domain_gateway_list.html:58 -#: assets/templates/assets/system_user_asset.html:51 +#: assets/templates/assets/system_user_asset.html:52 #: assets/templates/assets/user_asset_list.html:163 msgid "Port" msgstr "端口" @@ -242,7 +242,7 @@ msgstr "如果选择手动登录模式,用户名和密码则不需要填写" #: assets/templates/assets/asset_detail.html:61 #: assets/templates/assets/asset_list.html:93 #: assets/templates/assets/domain_gateway_list.html:57 -#: assets/templates/assets/system_user_asset.html:50 +#: assets/templates/assets/system_user_asset.html:51 #: assets/templates/assets/user_asset_list.html:46 #: assets/templates/assets/user_asset_list.html:162 #: audits/templates/audits/login_log_list.html:52 common/forms.py:133 @@ -256,7 +256,7 @@ msgstr "IP" #: assets/templates/assets/admin_user_assets.html:51 #: assets/templates/assets/asset_detail.html:57 #: assets/templates/assets/asset_list.html:92 -#: assets/templates/assets/system_user_asset.html:49 +#: assets/templates/assets/system_user_asset.html:50 #: assets/templates/assets/user_asset_list.html:45 #: assets/templates/assets/user_asset_list.html:161 common/forms.py:132 #: perms/templates/perms/asset_permission_asset.html:54 @@ -360,7 +360,7 @@ msgstr "标签管理" #: assets/models/asset.py:126 assets/models/base.py:30 #: assets/models/cluster.py:28 assets/models/cmd_filter.py:24 -#: assets/models/cmd_filter.py:54 assets/models/group.py:21 +#: assets/models/cmd_filter.py:53 assets/models/group.py:21 #: assets/templates/assets/admin_user_detail.html:68 #: assets/templates/assets/asset_detail.html:117 #: assets/templates/assets/cmd_filter_detail.html:77 @@ -389,7 +389,7 @@ msgstr "创建日期" #: assets/models/asset.py:131 assets/models/base.py:27 #: assets/models/cluster.py:29 assets/models/cmd_filter.py:21 -#: assets/models/cmd_filter.py:51 assets/models/domain.py:19 +#: assets/models/cmd_filter.py:50 assets/models/domain.py:19 #: assets/models/domain.py:51 assets/models/group.py:23 #: assets/models/label.py:22 assets/templates/assets/admin_user_detail.html:72 #: assets/templates/assets/admin_user_list.html:32 @@ -495,20 +495,19 @@ msgstr "正则表达式" msgid "Command" msgstr "命令" -#: assets/models/cmd_filter.py:41 +#: assets/models/cmd_filter.py:40 msgid "Deny" msgstr "拒绝" -#: assets/models/cmd_filter.py:42 -#: terminal/templates/terminal/terminal_list.html:76 -msgid "Accept" -msgstr "接受" +#: assets/models/cmd_filter.py:41 +msgid "Allow" +msgstr "允许" -#: assets/models/cmd_filter.py:46 +#: assets/models/cmd_filter.py:45 msgid "Filter" msgstr "过滤器" -#: assets/models/cmd_filter.py:47 +#: assets/models/cmd_filter.py:46 #: assets/templates/assets/cmd_filter_rule_list.html:58 #: audits/templates/audits/login_log_list.html:50 #: common/templates/common/terminal_setting.html:73 @@ -516,21 +515,21 @@ msgstr "过滤器" msgid "Type" msgstr "类型" -#: assets/models/cmd_filter.py:48 assets/models/user.py:114 +#: assets/models/cmd_filter.py:47 assets/models/user.py:114 #: assets/templates/assets/cmd_filter_rule_list.html:60 msgid "Priority" msgstr "优先级" -#: assets/models/cmd_filter.py:49 +#: assets/models/cmd_filter.py:48 #: assets/templates/assets/cmd_filter_rule_list.html:59 msgid "Content" msgstr "内容" -#: assets/models/cmd_filter.py:49 +#: assets/models/cmd_filter.py:48 msgid "One line one command" msgstr "每行一个命令" -#: assets/models/cmd_filter.py:50 +#: assets/models/cmd_filter.py:49 #: assets/templates/assets/admin_user_list.html:33 #: assets/templates/assets/asset_list.html:97 #: assets/templates/assets/cmd_filter_list.html:18 @@ -538,7 +537,7 @@ msgstr "每行一个命令" #: assets/templates/assets/domain_gateway_list.html:62 #: assets/templates/assets/domain_list.html:29 #: assets/templates/assets/label_list.html:17 -#: assets/templates/assets/system_user_asset.html:53 +#: assets/templates/assets/system_user_asset.html:54 #: assets/templates/assets/system_user_list.html:38 audits/models.py:37 #: audits/templates/audits/operate_log_list.html:41 #: audits/templates/audits/operate_log_list.html:67 @@ -618,7 +617,7 @@ msgstr "手动登录" #: assets/models/user.py:113 #: assets/templates/assets/_asset_group_bulk_update_modal.html:11 -#: assets/templates/assets/system_user_asset.html:21 +#: assets/templates/assets/system_user_asset.html:22 #: assets/templates/assets/system_user_detail.html:22 #: assets/views/admin_user.py:29 assets/views/admin_user.py:47 #: assets/views/admin_user.py:63 assets/views/admin_user.py:78 @@ -880,7 +879,7 @@ msgstr "关闭" #: assets/templates/assets/cmd_filter_rule_list.html:19 #: assets/templates/assets/domain_detail.html:18 #: assets/templates/assets/domain_gateway_list.html:18 -#: assets/templates/assets/system_user_asset.html:17 +#: assets/templates/assets/system_user_asset.html:18 #: assets/templates/assets/system_user_detail.html:18 #: ops/templates/ops/adhoc_history.html:130 #: ops/templates/ops/task_adhoc.html:116 @@ -903,14 +902,14 @@ msgstr "资产列表" #: assets/templates/assets/admin_user_assets.html:54 #: assets/templates/assets/admin_user_list.html:29 -#: assets/templates/assets/system_user_asset.html:52 +#: assets/templates/assets/system_user_asset.html:53 #: assets/templates/assets/system_user_list.html:34 #: users/templates/users/user_group_granted_asset.html:47 msgid "Reachable" msgstr "可连接" #: assets/templates/assets/admin_user_assets.html:66 -#: assets/templates/assets/system_user_asset.html:65 +#: assets/templates/assets/system_user_asset.html:66 #: assets/templates/assets/system_user_detail.html:116 #: perms/templates/perms/asset_permission_detail.html:114 msgid "Quick update" @@ -923,8 +922,8 @@ msgstr "测试可连接性" #: assets/templates/assets/admin_user_assets.html:75 #: assets/templates/assets/asset_detail.html:171 -#: assets/templates/assets/system_user_asset.html:74 -#: assets/templates/assets/system_user_asset.html:160 +#: assets/templates/assets/system_user_asset.html:75 +#: assets/templates/assets/system_user_asset.html:161 #: assets/templates/assets/system_user_detail.html:151 msgid "Test" msgstr "测试" @@ -1002,7 +1001,7 @@ msgstr "选择节点" #: assets/templates/assets/asset_detail.html:200 #: assets/templates/assets/asset_list.html:633 #: assets/templates/assets/cmd_filter_detail.html:106 -#: assets/templates/assets/system_user_asset.html:111 +#: assets/templates/assets/system_user_asset.html:112 #: assets/templates/assets/system_user_detail.html:182 #: assets/templates/assets/system_user_list.html:143 templates/_modal.html:22 #: terminal/templates/terminal/session_detail.html:108 @@ -1352,27 +1351,27 @@ msgstr "创建网域" msgid "Create label" msgstr "创建标签" -#: assets/templates/assets/system_user_asset.html:30 +#: assets/templates/assets/system_user_asset.html:31 msgid "Assets of " msgstr "资产" -#: assets/templates/assets/system_user_asset.html:71 +#: assets/templates/assets/system_user_asset.html:72 #: assets/templates/assets/system_user_detail.html:148 msgid "Test assets connective" msgstr "测试资产可连接性" -#: assets/templates/assets/system_user_asset.html:80 +#: assets/templates/assets/system_user_asset.html:81 #: assets/templates/assets/system_user_detail.html:139 msgid "Push system user now" msgstr "立刻推送系统" -#: assets/templates/assets/system_user_asset.html:83 -#: assets/templates/assets/system_user_asset.html:158 +#: assets/templates/assets/system_user_asset.html:84 +#: assets/templates/assets/system_user_asset.html:159 #: assets/templates/assets/system_user_detail.html:142 msgid "Push" msgstr "推送" -#: assets/templates/assets/system_user_asset.html:102 +#: assets/templates/assets/system_user_asset.html:103 msgid "Add to node" msgstr "添加到节点" @@ -1532,11 +1531,11 @@ msgstr "更新系统用户" msgid "System user detail" msgstr "系统用户详情" -#: assets/views/system_user.py:95 +#: assets/views/system_user.py:96 msgid "assets" msgstr "资产管理" -#: assets/views/system_user.py:96 +#: assets/views/system_user.py:97 msgid "System user asset" msgstr "系统用户集群资产" @@ -2868,6 +2867,10 @@ msgstr "地址" msgid "Alive" msgstr "在线" +#: terminal/templates/terminal/terminal_list.html:76 +msgid "Accept" +msgstr "接受" + #: terminal/templates/terminal/terminal_list.html:78 msgid "Reject" msgstr "拒绝" From 532abb86b546ac0daa827536cccd659a8f0b9c4a Mon Sep 17 00:00:00 2001 From: ibuler Date: Thu, 11 Oct 2018 11:10:47 +0800 Subject: [PATCH 7/9] =?UTF-8?q?[Update]=20=E6=B7=BB=E5=8A=A0=E6=96=87?= =?UTF-8?q?=E6=A1=88=E8=AF=B4=E6=98=8E=E5=92=8C=E7=BF=BB=E8=AF=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/assets/models/cmd_filter.py | 3 +- .../templates/assets/cmd_filter_list.html | 10 +++ apps/locale/zh/LC_MESSAGES/django.mo | Bin 51625 -> 52759 bytes apps/locale/zh/LC_MESSAGES/django.po | 59 +++++++++++++----- 4 files changed, 57 insertions(+), 15 deletions(-) diff --git a/apps/assets/models/cmd_filter.py b/apps/assets/models/cmd_filter.py index e214073c6..bd37db36e 100644 --- a/apps/assets/models/cmd_filter.py +++ b/apps/assets/models/cmd_filter.py @@ -44,7 +44,8 @@ class CommandFilterRule(OrgModelMixin): id = models.UUIDField(default=uuid.uuid4, primary_key=True) filter = models.ForeignKey('CommandFilter', on_delete=models.CASCADE, verbose_name=_("Filter"), related_name='rules') type = models.CharField(max_length=16, default=TYPE_COMMAND, choices=TYPE_CHOICES, verbose_name=_("Type")) - priority = models.IntegerField(default=50, verbose_name=_("Priority"), validators=[MinValueValidator(1), MaxValueValidator(100)]) + priority = models.IntegerField(default=50, verbose_name=_("Priority"), help_text=_("1-100, the lower will be match first"), + validators=[MinValueValidator(1), MaxValueValidator(100)]) content = models.TextField(max_length=1024, verbose_name=_("Content"), help_text=_("One line one command")) action = models.IntegerField(default=ACTION_DENY, choices=ACTION_CHOICES, verbose_name=_("Action")) comment = models.CharField(max_length=64, blank=True, default='', verbose_name=_("Comment")) diff --git a/apps/assets/templates/assets/cmd_filter_list.html b/apps/assets/templates/assets/cmd_filter_list.html index 4887d609e..1586af8f9 100644 --- a/apps/assets/templates/assets/cmd_filter_list.html +++ b/apps/assets/templates/assets/cmd_filter_list.html @@ -1,6 +1,16 @@ {% extends '_base_list.html' %} {% load i18n static %} {% block table_search %}{% endblock %} +{% block help_message %} +

    + {% trans 'System user bound some command filter, each command filter has some rules,'%} + {% trans 'When user login asset with this system user, then run a command,' %} + {% trans 'The command will be filter by rules, higher priority(lower number) rule run first,' %} + {% trans 'When a rule matched, if rule action is allow, then allow command execute,' %} + {% trans 'else if action is deny, then command with be deny,' %} + {% trans 'else match next rule, if none matched, allowed' %} +
    +{% endblock %} {% block table_container %}
    {% trans "Create command filter" %} diff --git a/apps/locale/zh/LC_MESSAGES/django.mo b/apps/locale/zh/LC_MESSAGES/django.mo index 7f06fc7ba9f86558d1f563ecc739c7062158ff00..79cfc7f2516894c300d85b4c497b1b0a1abe3861 100644 GIT binary patch delta 16857 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%0A1VVtY~yVA(< zkr87OBSUw+IJIcDR=uMl(^uxR=wBt#~19Enk!4&x+DNJxx~_4lyRw3hI! z(L$3)PW#Lk8IusHHT>`NLn7lQSpTdO@{h?8`oB*7aUAD+v{ojC#M};k-jiB?aQTnB{KC z+%PSD=JH)R_gx4GUrtvy#GRFsGuJ0&u6f6e{_p*_U!RsSYjVcQS?;#(H+{jpj9DA#?v~)T>-A1yt9JuF(Sh zhn&7+hMU~w-I$?X`hxWwXZntvZdYmh=lpl8|89@xsfE0|nxp)8|Jrl0nakCQA^f{_ L!zTZDX5aq+QL#be delta 15750 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\n" "Language-Team: Jumpserver team\n" @@ -136,7 +136,7 @@ msgstr "不能包含特殊字符" #: assets/templates/assets/admin_user_detail.html:56 #: assets/templates/assets/admin_user_list.html:26 #: assets/templates/assets/cmd_filter_detail.html:61 -#: assets/templates/assets/cmd_filter_list.html:14 +#: assets/templates/assets/cmd_filter_list.html:24 #: assets/templates/assets/domain_detail.html:56 #: assets/templates/assets/domain_gateway_list.html:56 #: assets/templates/assets/domain_list.html:25 @@ -360,7 +360,7 @@ msgstr "标签管理" #: assets/models/asset.py:126 assets/models/base.py:30 #: assets/models/cluster.py:28 assets/models/cmd_filter.py:24 -#: assets/models/cmd_filter.py:53 assets/models/group.py:21 +#: assets/models/cmd_filter.py:54 assets/models/group.py:21 #: assets/templates/assets/admin_user_detail.html:68 #: assets/templates/assets/asset_detail.html:117 #: assets/templates/assets/cmd_filter_detail.html:77 @@ -389,13 +389,13 @@ msgstr "创建日期" #: assets/models/asset.py:131 assets/models/base.py:27 #: assets/models/cluster.py:29 assets/models/cmd_filter.py:21 -#: assets/models/cmd_filter.py:50 assets/models/domain.py:19 +#: assets/models/cmd_filter.py:51 assets/models/domain.py:19 #: assets/models/domain.py:51 assets/models/group.py:23 #: assets/models/label.py:22 assets/templates/assets/admin_user_detail.html:72 #: assets/templates/assets/admin_user_list.html:32 #: assets/templates/assets/asset_detail.html:125 #: assets/templates/assets/cmd_filter_detail.html:65 -#: assets/templates/assets/cmd_filter_list.html:17 +#: assets/templates/assets/cmd_filter_list.html:27 #: assets/templates/assets/cmd_filter_rule_list.html:62 #: assets/templates/assets/domain_detail.html:76 #: assets/templates/assets/domain_gateway_list.html:61 @@ -520,19 +520,23 @@ msgstr "类型" msgid "Priority" msgstr "优先级" -#: assets/models/cmd_filter.py:48 +#: assets/models/cmd_filter.py:47 +msgid "1-100, the lower will be match first" +msgstr "优先级可选范围为1-100,1最高优先级 100最低优先级" + +#: assets/models/cmd_filter.py:49 #: assets/templates/assets/cmd_filter_rule_list.html:59 msgid "Content" msgstr "内容" -#: assets/models/cmd_filter.py:48 +#: assets/models/cmd_filter.py:49 msgid "One line one command" msgstr "每行一个命令" -#: assets/models/cmd_filter.py:49 +#: assets/models/cmd_filter.py:50 #: assets/templates/assets/admin_user_list.html:33 #: assets/templates/assets/asset_list.html:97 -#: assets/templates/assets/cmd_filter_list.html:18 +#: assets/templates/assets/cmd_filter_list.html:28 #: assets/templates/assets/cmd_filter_rule_list.html:63 #: assets/templates/assets/domain_gateway_list.html:62 #: assets/templates/assets/domain_list.html:29 @@ -735,7 +739,7 @@ msgstr "选择资产" #: assets/templates/assets/_asset_group_bulk_update_modal.html:21 #: assets/templates/assets/cmd_filter_detail.html:89 -#: assets/templates/assets/cmd_filter_list.html:16 +#: assets/templates/assets/cmd_filter_list.html:26 #: assets/templates/assets/user_asset_list.html:48 #: users/templates/users/user_granted_asset.html:47 msgid "System users" @@ -933,7 +937,7 @@ msgstr "测试" #: assets/templates/assets/asset_detail.html:24 #: assets/templates/assets/asset_list.html:171 #: assets/templates/assets/cmd_filter_detail.html:29 -#: assets/templates/assets/cmd_filter_list.html:47 +#: assets/templates/assets/cmd_filter_list.html:57 #: assets/templates/assets/cmd_filter_rule_list.html:86 #: assets/templates/assets/domain_detail.html:24 #: assets/templates/assets/domain_detail.html:103 @@ -964,7 +968,7 @@ msgstr "更新" #: assets/templates/assets/asset_detail.html:28 #: assets/templates/assets/asset_list.html:172 #: assets/templates/assets/cmd_filter_detail.html:33 -#: assets/templates/assets/cmd_filter_list.html:48 +#: assets/templates/assets/cmd_filter_list.html:58 #: assets/templates/assets/cmd_filter_rule_list.html:87 #: assets/templates/assets/domain_detail.html:28 #: assets/templates/assets/domain_detail.html:104 @@ -1266,7 +1270,7 @@ msgid "Configuration" msgstr "配置" #: assets/templates/assets/cmd_filter_detail.html:25 -#: assets/templates/assets/cmd_filter_list.html:15 +#: assets/templates/assets/cmd_filter_list.html:25 #: assets/templates/assets/cmd_filter_rule_list.html:23 msgid "Rules" msgstr "规则" @@ -1279,7 +1283,34 @@ msgstr "更新日期" msgid "Binding to system user" msgstr "绑定到系统用户" -#: assets/templates/assets/cmd_filter_list.html:6 assets/views/cmd_filter.py:47 +#: assets/templates/assets/cmd_filter_list.html:6 +msgid "" +"System user bound some command filter, each command filter has some rules," +msgstr "系统用户可以绑定一些命令过滤器,一个过滤器可以定义一些规则" + +#: assets/templates/assets/cmd_filter_list.html:7 +msgid "When user login asset with this system user, then run a command," +msgstr "当用户使用这个系统用户登录资产,然后执行一个命令" + +#: assets/templates/assets/cmd_filter_list.html:8 +msgid "The command will be filter by rules, higher priority(lower number) rule run first," +msgstr "这个命令需要被绑定过滤器的所有规则匹配,高优先级(数字越低)先被匹配," + +#: assets/templates/assets/cmd_filter_list.html:9 +msgid "" +"When a rule matched, if rule action is allow, then allow command execute," +msgstr "当一个规则匹配到了,如果规则的动作是 允许, 这个命令会被放行," + +#: assets/templates/assets/cmd_filter_list.html:10 +msgid "else if action is deny, then command with be deny," +msgstr "如果规则的动作是 禁止,命令将会被禁止执行," + +#: assets/templates/assets/cmd_filter_list.html:11 +msgid "else match next rule, if none matched, allowed" +msgstr "否则就匹配下一个规则,如果最后没有匹配到规则,则允许执行" + +#: assets/templates/assets/cmd_filter_list.html:16 +#: assets/views/cmd_filter.py:47 msgid "Create command filter" msgstr "创建命令过滤器" From 666815b324ede1f24d96d5ecca46c81522bc4fa2 Mon Sep 17 00:00:00 2001 From: ibuler Date: Fri, 12 Oct 2018 15:04:01 +0800 Subject: [PATCH 8/9] =?UTF-8?q?[Update]=20=E4=BF=AE=E6=94=B9=E6=96=87?= =?UTF-8?q?=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/assets/forms/asset.py | 4 ++-- apps/locale/zh/LC_MESSAGES/django.mo | Bin 52759 -> 52902 bytes apps/locale/zh/LC_MESSAGES/django.po | 10 ++++++++-- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/apps/assets/forms/asset.py b/apps/assets/forms/asset.py index 8b132b350..28c78e981 100644 --- a/apps/assets/forms/asset.py +++ b/apps/assets/forms/asset.py @@ -48,7 +48,7 @@ class AssetCreateForm(OrgModelForm): 'root or other NOPASSWD sudo privilege user existed in asset,' 'If asset is windows or other set any one, more see admin user left menu' ), - # 'platform': _("* required Must set exact system platform, Windows, Linux ..."), + 'platform': _("Windows 2016 RDP protocol is different, If is window 2016, set it"), 'domain': _("If your have some network not connect with each other, you can set domain") } @@ -88,7 +88,7 @@ class AssetUpdateForm(OrgModelForm): 'root or other NOPASSWD sudo privilege user existed in asset,' 'If asset is windows or other set any one, more see admin user left menu' ), - # 'platform': _("* required Must set exact system platform, Windows, Linux ..."), + 'platform': _("Windows 2016 RDP protocol is different, If is window 2016, set it"), 'domain': _("If your have some network not connect with each other, you can set domain") } diff --git a/apps/locale/zh/LC_MESSAGES/django.mo b/apps/locale/zh/LC_MESSAGES/django.mo index 79cfc7f2516894c300d85b4c497b1b0a1abe3861..41d58f1c13259e08ddb1cc1ecafefbf61261203a 100644 GIT binary patch delta 12150 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 RxxMvJ))!mT!%qL>`+xLs`?3H4 delta 12042 zcmXZi3w+4+{>Sm(HpAH1<~DccI^=HJq?pTci6e8rge44Hn!D=9Tyi_E&G<*6B9cpP zxh91vRLdnMp`I+6{(mH=V3!!j8EZVR4zfSJ+CS@#G2T{oQxNU*P$kw*~TR@ zABz)jzykOg>iJRg8w_K9?+k^aJh+A|-g|(d7}l0au?&V_1=J4JM6Iw57Q~)d76+nM z_L|kt!f4_}sD9fqALgJEI)mZN?_H#zOz&ba1}A!6AuMc`#0cWbs6-p#AZ&%&(luBe zw_yzCVj2cN>v`!o2A{{Du`52+&ba`6J-AAtDK>5I5=b-0AiL^KLLI>YR3dj!D-G!2 zdBrdcl}KgO3hSX3(ipXq@mK^Cku&$YV__WGf&JHm2~?=zOw>S`*5F+%M7#;rZa0SD zQB?cyuqs}{a18F~j-n*$@-@UV_$=nfWYiI-U}4PY$o^}Bc~t1Ems!IVsFl2jp|}pU z@*SuIvatf@ppN7o*2jS7+(Zpg^>L{7?NB??6~nL>Dxo316;e?h#-LU@9hJbFSOAxy zGGB$-!d<9@zd=oK5|!WuERA`T) z8Y=VssKgGT5sS}>Vm++b*)6CuYA2GA{=V1S6}&;%mIo=q~Q^#h{L&4TfS5)X}|&+L>2T3!8yu^!_iWpbU4SGCPFo zcoMaOA5oX|J}SX~F#?P8?kd6RsCEr4Zi9N>1=TMZwSZI%$FZnH-aucMY#{|rxCFJb zcP-w4nqU{I;~~_5r_CQx{cfT9Jw{C&$X7-a7DpXTIV^^CP&?HEHEv>8_FoOUQlUhW zt-(;-OPq!ps7{ibsIl1+HDM<#hCNXIhoe^ZGAhxDSP7@2Ue`6)9uMJN4DZJNt7AZS zmsx()QG}reE{n>v9%{m7n24>h7S6T$ov2%V0E^>cjKN&gc)>l~_{C5=Sq7D0ZJ&Zx z7>kfQ4>tUN;nI3Bdb@TZ zSe>{S2I~Ef&nxho3F_x{3o{uz5YNE+n1f0vs1HBEuo1Sy*{Cf(iJCAMmFNxJh4*nH zZe&&EF{YnOJQ0KS{&%FHfuBchWd>>mv(3e*tzVAXy7j0P??+9Pjk-)HExw3a;V)Jn z+22iA9(DPmaRW9&Kb68I3L2>M3vLB{P+K+>HE=3wg%ePTOh(oHmc<I`#d5{JRWZBY|+ z#QfMD^)~cFB{UYb#jm4QJ|ER@J*xd?)RFB(E#xrjt;s z0DZAHCZnG3H;;W;?6zib}vAXoVEi8K$FF zJQbDDBCLeVP-nUuwe`nPU(6pc6d$49hI}L4#8Fs?xVps+Q0<<>h#>g_0#>Rzu{3?uG@x*L752)<~hqZXEdI;urhzZQ!zzqf;e zw&F|F0N-I6=He*qK%n}4sCI`?M{@#|_(`mRmry%a@MV{9QPd99MAbJ!^^do>m1KUe zJq1nB1&d%WtcgQWJFpNnz!KCJuRz`AEvQR%1eM4&)Dhjo_83I=iaVipb^!j4=@^bf zUSa>W)#E8>fa$1Pz0iCM)$n~(yB(;l{v5Rf-=bD@#=L|@iGN15dyMK|Al;1{g^|S3 zsKlD2v;UPSBvPT34#gN8iTYG#q2BM^sMqNfYJywl|F8*h=x8@!0;*pU>a541F56tJ zf;&;;=i)F79>e}WPa$oL>u?ZP5ud^FIAN^&vHBZofQWGKS z&b|n0!U`7G$4100uo8~O;+ToLZ0k{XW*=%n$5H*yVgbGXzvLBoHBh(zFC32g-CP5W zLT%v;)Btl(31^{J@;)l@J*b`h61DOiRN}W$?f<~Rn18aXAAyCb^Ttuo08>#bS%k&# zFlvBvsMqKkD)Wb^FJeJ1hE`S?l~@DR0-B>HOvKvQ4K>~r)I6D}%lsbt>X1!ATa|;# z{2FQ^FT-_=M7`(Lu>#gZz5kt1JCKALI0co^1baRUb$8~Yc4i5x-P@>yKFVPKHSlLt z=*+)Ft>g?Uu`9R=Z{rr6Kh+&Y%W1BCThs(yu`c$;$~X(#;fEL=z~#gi#QA5qUr-WJ zJ1|jas)lb6z&=GYMlaO4zxv2KxGx-KEQAOkx_eRdj+dS_l zJVbrUY|r}?>(AvQ#PhrVb(i%6f1VrgDC!8#VLrT#+KJy#JM<6gND9n%zdDsh)yH8i zOfW}cdE%wm3U^>R{L?J8fH#1+G3G}RQp`4ir28F-v2_2`3oc}8sPw(gU{eCv(B3?9${`keX?(%R$M*P`2@xjH%7fB zX;=*Bp%Pqe@g~&k`8nqO{Qp)3D!w-_qB>kRe>c4)ZfnC(&&yj}3$?O%t8Z;~G5edt zQHhPWI17E9;d>M!aUUxF#v1%=^$#r$$#RL7#30(0Mg!tE1T|iQ#oe$n@gR$* zp%Ph`#r|vMo9)3)RQ!ecmDT51d=WMAb*sN=K0dhQCs`5xz{{weq)|PC4SZ7U$8Op1FNsK%#G6k^>#EvweR5D zgXdAVvMJdUZfJBb>w)&IE_cQuEZK5E68s1>iac)RHzq@YZ`wu;jh zUomf5{XNt~|5#k)Ef<$XZFOzbPPH^UpvLWH_Qhtz$ri6f67sz@uHfxLWqQowv#0@Y zp(c2UWifQQYgf~3VkV$g*xBMiW}4N%YVmxFm*>Tt|0W7r*{(Of{)-$1py zWAXni4qD}&hoixdXMr z&n^DN`~$T!!K+>S5~y*bEspW6A{O;?ygBMiHq`3VQAaWnE8r5;#M|xpLDUf)#mX4; zu3K3(RJ$ip3AaJ*M1NEQLrp);9*jk0I@um9KqZoe8elaB;vRE9)+PSTyo)`FE57G` z)f#W^!Zy_Zi7#P`_gw;Okpz8jqgCud-Qt5d9Q&?u?|n8Z;|u0BY)O0zwZgh<-ScK< z0%{@cP-ooB>PMj3r<;@W>KD(el;5vH^_y1xNnSO-wV}En!#Q{nlW_P4ZeI?VU!l@F zjT-(3^CqhQBP@-D*16|Z%?7A_eR`e!4D4YQ{jI?`i>ILmT7hM7Git)GP!r~u7qKSs zEsIO6cPAc=1*xxtYTv|6Fgvfecc8CT3`0#g7Hi=w48m=wm+=$xD25Q9Lv8p~)aUCy z>PJ}Mhpv4bRwHh2@yn=0r=SvA?^Dn(N;@%cWoC{wIBW5B^R{^(mFQn)kqs`cj7q4n z*&6i|Bnh?UDdtquUv7o%7)pZ^s6=utzKmMw9rLl(2Yuw)hoc5AkLnj|_07%pR^J1a zaDUWJj&iZ@Wl#vEBGX)LZZh|xIvz!>?7YRd?D@ZD=tlReYH3s=y-?#0KrLXT#pCSx zG%U;g^X6E^T5GV;++${&r%(f5Hh(tnnvYP4{)2j}A~v}MnwSZw=bf=A4#Ftr_gibXy)xNh+A(Fxn ztc4R%6TFW)tNo~nPNF*GT71L2V?H$hHuG(F?F*YxsClYc{3I44_S;zDKV~2EB~-?v zP+L63oMUF1D^Urq!}7QpmFNjG7d7z>i~q8?;EufUeXlG94Nx1^v7z}4Y9~6P1{iGh z<57uCw>T5ke>JN8Ivk1zEv~)OjtsSseyH|CFjVhd`YR)t>&DG{6b1!P3qu3n3 zGb28619wI(q&o&i>h`Wl&IubLMTlLae{;RsB`eK#$CPdt4l0RxoR0 z5!yY8I-*2WLOsm>sBs3Huk5k+-?xgn)^M4{@0cHe5W3f`u%7uW zYNCOt1*D?dPr-0pj}>vxUd~@1hFoj#Cu+bd`&@^%7)P9j$+!+RaM*r+9mO)J9o&N2 z;*d|B(WvLmFcx$02|Yi+FJage%i@PV1$8`v%JdRy>wd?Q81xx`uZ?A}4JM;5-#XOR zZbc=u8&mNJF2&e`?k{k^#t7o8=0jBbf}cD65>|*t4OkC#Yhy78pF-W<7O3YPP>DW| zg>f({p;7jHlEoRQh0HaVqxx+?CGe@M_q}5jv;*g@!2{Hh6#T;7?i#4AYL4pI%Y4a9 z$7t#&Tl}uM+1zJ-i7~W0gPJekkjC@bS_;anMqUMfKr$0iD@a1E@I^BfwG-p9EBdJZ z-&y^2^EN8s`}REGup6&97Nou^hA_YP1chL1in^W6@pbHk8sNBj4wcYP7>|!o6E{5K z5^RHd-r0Ns^?gXQcsgn!nW%ABV&0#DH&D>++=UwOC)7ZHVr49p?K;#!)yJU*ZfEfe zW*TY&AIsw`)I@7h<8DLsKZ0s^CY${aqVS_tT*LgtcTgQ4nn6cheYjc5tYB8d3AC?+ z+R-(rajSpnCaQ%Rw=q`3W>^~s>c3a?r0`!Ve#PtfES~zx{RywaF?ac%L+#Koi?cA4 zc&m8;pC&$zNf>(Et#}~nbsUW$7gNUo\n" "Language-Team: Jumpserver team\n" @@ -84,6 +84,10 @@ msgstr "" "root或其他拥有NOPASSWD: ALL权限的用户, 如果是windows或其它硬件可以随意设置一" "个, 更多信息查看左侧 `管理用户` 菜单" +#: assets/forms/asset.py:51 assets/forms/asset.py:91 +msgid "Windows 2016 RDP protocol is different, If is window 2016, set it" +msgstr "Windows 2016的RDP协议与之前不同,如果是请设置" + #: assets/forms/asset.py:52 assets/forms/asset.py:92 msgid "" "If your have some network not connect with each other, you can set domain" @@ -1293,7 +1297,9 @@ msgid "When user login asset with this system user, then run a command," msgstr "当用户使用这个系统用户登录资产,然后执行一个命令" #: assets/templates/assets/cmd_filter_list.html:8 -msgid "The command will be filter by rules, higher priority(lower number) rule run first," +msgid "" +"The command will be filter by rules, higher priority(lower number) rule run " +"first," msgstr "这个命令需要被绑定过滤器的所有规则匹配,高优先级(数字越低)先被匹配," #: assets/templates/assets/cmd_filter_list.html:9 From 7bafa546b5b36966f316c468278be85f545e539c Mon Sep 17 00:00:00 2001 From: ibuler Date: Fri, 12 Oct 2018 15:05:04 +0800 Subject: [PATCH 9/9] =?UTF-8?q?[Update]=20=E4=BF=AE=E6=94=B9=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/__init__.py | 2 +- apps/templates/_footer.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/__init__.py b/apps/__init__.py index 8a6ac6caa..e8c9d2d6e 100644 --- a/apps/__init__.py +++ b/apps/__init__.py @@ -2,4 +2,4 @@ # -*- coding: utf-8 -*- # -__version__ = "1.4.2" +__version__ = "1.4.3" diff --git a/apps/templates/_footer.html b/apps/templates/_footer.html index 270de14d9..12c285f92 100644 --- a/apps/templates/_footer.html +++ b/apps/templates/_footer.html @@ -1,7 +1,7 @@ {% load i18n %}