diff --git a/README.md b/README.md index 14a2c4143..0177c1abe 100644 --- a/README.md +++ b/README.md @@ -26,36 +26,7 @@ Jumpserver是一款使用Python, Django开发的开源跳板机系统, 助力互 ### Install 安装 - 1. 安装 Python3 - 略 - - 2. 安装依赖 - - ``` - $ cd requirements && yum -y install $(cat rpm_requirements.txt) && pip install -r requirements.txt - ``` - - 3. 修改配置文件 - - ``` - $ cp config_example.py config.py - ``` - - 4. 修改表结构 - - ``` - $ cd apps && python manage.py makemigrations && python manage.py migrate - ``` - - 5. 运行 - - ``` - $ python run_server.py - ``` - - 6. 其它 - - 整合luna,coco需要nginx来配合, 详见详细安装文档 +    [详细安装](https://github.com/jumpserver/jumpserver/wiki/v0.5.0-%E5%9F%BA%E4%BA%8E-CentOS7) ### Usage 使用 diff --git a/apps/assets/api.py b/apps/assets/api.py index bd22c7336..dfea55741 100644 --- a/apps/assets/api.py +++ b/apps/assets/api.py @@ -1,5 +1,5 @@ # ~*~ coding: utf-8 ~*~ -# Copyright (C) 2014-2017 Beijing DuiZhan Technology Co.,Ltd. All Rights Reserved. +# Copyright (C) 2014-2018 Beijing DuiZhan Technology Co.,Ltd. All Rights Reserved. # # Licensed under the GNU General Public License v2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -87,7 +87,7 @@ class AssetGroupViewSet(CustomFilterMixin, BulkModelViewSet): """ Asset group api set, for add,delete,update,list,retrieve resource """ - queryset = AssetGroup.objects.all() + queryset = AssetGroup.objects.all().annotate(asset_count=Count("assets")) serializer_class = serializers.AssetGroupSerializer permission_classes = (IsSuperUser,) @@ -298,9 +298,7 @@ class SystemUserTestConnectiveApi(generics.RetrieveAPIView): class LabelViewSet(BulkModelViewSet): - queryset = Label.objects.annotate(asset_count=Count("assets"))\ - .annotate(admin_user_count=Count("adminuser")) \ - .annotate(system_user_count=Count("systemuser")) + queryset = Label.objects.annotate(asset_count=Count("assets")) permission_classes = (IsSuperUser,) serializer_class = serializers.LabelSerializer diff --git a/apps/assets/hands.py b/apps/assets/hands.py index 1545bce62..c160051bb 100644 --- a/apps/assets/hands.py +++ b/apps/assets/hands.py @@ -6,7 +6,7 @@ Other module of this app shouldn't connect with other app. - :copyright: (c) 2014-2017 by Jumpserver Team. + :copyright: (c) 2014-2018 by Jumpserver Team. :license: GPL v2, see LICENSE for more details. """ diff --git a/apps/assets/models/label.py b/apps/assets/models/label.py index d4be2286e..f7d341d6c 100644 --- a/apps/assets/models/label.py +++ b/apps/assets/models/label.py @@ -16,7 +16,7 @@ class Label(models.Model): id = models.UUIDField(default=uuid.uuid4, primary_key=True) name = models.CharField(max_length=128, verbose_name=_("Name")) value = models.CharField(max_length=128, verbose_name=_("Value")) - category = models.CharField(max_length=128, choices=CATEGORY_CHOICES, verbose_name=_("Category")) + category = models.CharField(max_length=128, choices=CATEGORY_CHOICES, default=USER_CATEGORY, verbose_name=_("Category")) is_active = models.BooleanField(default=True, verbose_name=_("Is active")) comment = models.TextField(blank=True, null=True, verbose_name=_("Comment")) date_created = models.DateTimeField( diff --git a/apps/assets/models/user.py b/apps/assets/models/user.py index ee71afab1..aa44a539c 100644 --- a/apps/assets/models/user.py +++ b/apps/assets/models/user.py @@ -30,7 +30,6 @@ class AssetUser(models.Model): _password = models.CharField(max_length=256, blank=True, null=True, verbose_name=_('Password')) _private_key = models.TextField(max_length=4096, blank=True, null=True, verbose_name=_('SSH private key'), validators=[private_key_validator, ]) _public_key = models.TextField(max_length=4096, blank=True, verbose_name=_('SSH public key')) - labels = models.ManyToManyField('assets.Label', blank=True, verbose_name=_("Labels")) comment = models.TextField(blank=True, verbose_name=_('Comment')) date_created = models.DateTimeField(auto_now_add=True) date_updated = models.DateTimeField(auto_now=True) diff --git a/apps/assets/serializers.py b/apps/assets/serializers.py index 7fe14da1b..ef8097805 100644 --- a/apps/assets/serializers.py +++ b/apps/assets/serializers.py @@ -22,7 +22,7 @@ class AssetGroupSerializer(BulkSerializerMixin, serializers.ModelSerializer): @staticmethod def get_assets_amount(obj): - return obj.assets.count() + return obj.asset_count class AssetUpdateSystemUserSerializer(serializers.ModelSerializer): @@ -288,8 +288,6 @@ class MyAssetGroupGrantedSerializer(serializers.ModelSerializer): class LabelSerializer(serializers.ModelSerializer): asset_count = serializers.SerializerMethodField() - admin_user_count = serializers.SerializerMethodField() - system_user_count = serializers.SerializerMethodField() class Meta: model = Label @@ -300,14 +298,6 @@ class LabelSerializer(serializers.ModelSerializer): def get_asset_count(obj): return obj.asset_count - @staticmethod - def get_admin_user_count(obj): - return obj.admin_user_count - - @staticmethod - def get_system_user_count(obj): - return obj.system_user_count - def get_field_names(self, declared_fields, info): fields = super().get_field_names(declared_fields, info) fields.extend(['get_category_display']) diff --git a/apps/assets/templates/assets/admin_user_assets.html b/apps/assets/templates/assets/admin_user_assets.html index c00a56e60..7ec123fe2 100644 --- a/apps/assets/templates/assets/admin_user_assets.html +++ b/apps/assets/templates/assets/admin_user_assets.html @@ -121,7 +121,7 @@ function initTable() { {data: "type" }, {data: "is_connective" }], op_html: $('#actions').html() }; - jumpserver.initDataTable(options); + jumpserver.initServerSideDataTable(options); } $(document).ready(function () { diff --git a/apps/assets/templates/assets/asset_group_detail.html b/apps/assets/templates/assets/asset_group_detail.html index 4a9b719b1..dda393e0d 100644 --- a/apps/assets/templates/assets/asset_group_detail.html +++ b/apps/assets/templates/assets/asset_group_detail.html @@ -184,7 +184,7 @@ function initTable() { {data: "get_type_display" }, {data: "is_connective" }, {data: "id"}], op_html: $('#actions').html() }; - jumpserver.initDataTable(options); + jumpserver.initServerSideDataTable(options); } diff --git a/apps/assets/templates/assets/asset_group_list.html b/apps/assets/templates/assets/asset_group_list.html index e27d78867..58fbbc51c 100644 --- a/apps/assets/templates/assets/asset_group_list.html +++ b/apps/assets/templates/assets/asset_group_list.html @@ -34,10 +34,6 @@ $(document).ready(function(){ var detail_btn = '' + cellData + ''; $(td).html(detail_btn.replace('{{ DEFAULT_PK }}', rowData.id)); }}, - {targets: 3, createdCell: function (td, cellData) { - var innerHtml = cellData.length > 30 ? cellData.substring(0, 30) + '...': cellData; - $(td).html('' + innerHtml + ''); - }}, {targets: 4, createdCell: function (td, cellData, rowData) { var update_btn = '{% trans "Update" %}'.replace('{{ DEFAULT_PK }}', cellData); var del_btn = '{% trans "Delete" %}'.replace('{{ DEFAULT_PK }}', cellData); diff --git a/apps/assets/templates/assets/cluster_assets.html b/apps/assets/templates/assets/cluster_assets.html index 88969a000..b2e33e578 100644 --- a/apps/assets/templates/assets/cluster_assets.html +++ b/apps/assets/templates/assets/cluster_assets.html @@ -176,7 +176,7 @@ function initTable() { {data: "get_type_display" }, {data: "is_connective" }, {data: "id"}], op_html: $('#actions').html() }; - jumpserver.initDataTable(options); + jumpserver.initServerSideDataTable(options); } diff --git a/apps/assets/templates/assets/label_list.html b/apps/assets/templates/assets/label_list.html index 81c5358b2..efed4a994 100644 --- a/apps/assets/templates/assets/label_list.html +++ b/apps/assets/templates/assets/label_list.html @@ -14,8 +14,6 @@ {% trans 'Name' %} {% trans 'Value' %} {% trans 'Asset' %} - {% trans 'Admin user' %} - {% trans 'System user' %} {% trans 'Action' %} @@ -36,7 +34,7 @@ function initTable() { $(td).html(detail_btn.replace('{{ DEFAULT_PK }}', rowData.id)); }}, - {targets: 6, createdCell: function (td, cellData, rowData) { + {targets: 4, createdCell: function (td, cellData, rowData) { var update_btn = '{% trans "Update" %}'.replace('{{ DEFAULT_PK }}', cellData); var del_btn = '{% trans "Delete" %}'.replace('{{ DEFAULT_PK }}', cellData); $(td).html(update_btn + del_btn) @@ -44,8 +42,7 @@ function initTable() { ajax_url: '{% url "api-assets:label-list" %}?sort=name', columns: [ {data: "id"}, {data: "name" }, {data: "value" }, - {data: "asset_count" }, {data: "admin_user_count" }, - {data: "system_user_count" }, {data: "id"} + {data: "asset_count" }, {data: "id"} ], op_html: $('#actions').html() }; diff --git a/apps/assets/templates/assets/system_user_asset.html b/apps/assets/templates/assets/system_user_asset.html index afff889f6..91c2ffbe0 100644 --- a/apps/assets/templates/assets/system_user_asset.html +++ b/apps/assets/templates/assets/system_user_asset.html @@ -121,7 +121,7 @@ function initAssetsTable() { columns: [{data: "hostname" }, {data: "ip" }, {data: "port" }, {data: "hostname" }], op_html: $('#actions').html() }; - jumpserver.initDataTable(options); + jumpserver.initServerSideDataTable(options); } $(document).ready(function () { diff --git a/apps/assets/views/cluster.py b/apps/assets/views/cluster.py index 835229fc1..5df58953c 100644 --- a/apps/assets/views/cluster.py +++ b/apps/assets/views/cluster.py @@ -60,11 +60,6 @@ class ClusterUpdateView(AdminUserRequiredMixin, SuccessMessageMixin, UpdateView) success_url = reverse_lazy('assets:cluster-list') success_message = update_success_msg - def form_valid(self, form): - cluster = form.save(commit=False) - cluster.save() - return super().form_valid(form) - def get_context_data(self, **kwargs): context = { 'app': _('assets'), diff --git a/apps/common/api.py b/apps/common/api.py index e8680e85e..e75f6147a 100644 --- a/apps/common/api.py +++ b/apps/common/api.py @@ -63,8 +63,6 @@ class LDAPTestingAPI(APIView): search_filter = serializer.validated_data["AUTH_LDAP_SEARCH_FILTER"] attr_map = serializer.validated_data["AUTH_LDAP_USER_ATTR_MAP"] - print(serializer.validated_data) - try: attr_map = json.loads(attr_map) except json.JSONDecodeError: @@ -77,9 +75,6 @@ class LDAPTestingAPI(APIView): except Exception as e: return Response({"error": str(e)}, status=401) - print(search_ou) - print(search_filter % ({"user": "*"})) - print(attr_map.values()) ok = conn.search(search_ou, search_filter % ({"user": "*"}), attributes=list(attr_map.values())) if not ok: diff --git a/apps/common/fields.py b/apps/common/fields.py index 36a8bdf9a..417e88504 100644 --- a/apps/common/fields.py +++ b/apps/common/fields.py @@ -5,6 +5,7 @@ import json from django import forms from django.utils import six from django.core.exceptions import ValidationError +from django.utils.translation import ugettext as _ class DictField(forms.Field): @@ -18,16 +19,16 @@ class DictField(forms.Field): # we don't need to handle that explicitly. if isinstance(value, six.string_types): try: - print(value) value = json.loads(value) return value except json.JSONDecodeError: - pass - value = {} - return value + return ValidationError(_("Not a valid json")) + else: + return ValidationError(_("Not a string type")) def validate(self, value): - print(value) + if isinstance(value, ValidationError): + raise value if not value and self.required: raise ValidationError(self.error_messages['required'], code='required') diff --git a/apps/common/forms.py b/apps/common/forms.py index 073bb671f..9b88af3b9 100644 --- a/apps/common/forms.py +++ b/apps/common/forms.py @@ -4,7 +4,9 @@ import json from django import forms from django.utils.translation import ugettext_lazy as _ +from django.utils.html import escape from django.db import transaction +from django.conf import settings from .models import Setting from .fields import DictField @@ -24,34 +26,38 @@ def to_form_value(value): data = value return data except json.JSONDecodeError: - return '' + return "" class BaseForm(forms.Form): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - settings = Setting.objects.all() + db_settings = Setting.objects.all() for name, field in self.fields.items(): - db_value = getattr(settings, name).value - if db_value: + db_value = getattr(db_settings, name).value + django_value = getattr(settings, name) if hasattr(settings, name) else None + if db_value is False or db_value: field.initial = to_form_value(db_value) + elif django_value is False or django_value: + field.initial = to_form_value(to_model_value(django_value)) - def save(self): + def save(self, category="default"): if not self.is_bound: raise ValueError("Form is not bound") - settings = Setting.objects.all() + db_settings = Setting.objects.all() if self.is_valid(): with transaction.atomic(): for name, value in self.cleaned_data.items(): field = self.fields[name] if isinstance(field.widget, forms.PasswordInput) and not value: continue - if value == to_form_value(getattr(settings, name).value): + if value == to_form_value(getattr(db_settings, name).value): continue defaults = { 'name': name, + 'category': category, 'value': to_model_value(value) } Setting.objects.update_or_create(defaults=defaults, name=name) @@ -72,9 +78,6 @@ class BasicSettingForm(BaseForm): max_length=1024, label=_("Email Subject Prefix"), initial="[Jumpserver] " ) - AUTH_LDAP = forms.BooleanField( - label=_("Enable LDAP Auth"), initial=False, required=False - ) class EmailSettingForm(BaseForm): @@ -129,3 +132,28 @@ class LDAPSettingForm(BaseForm): AUTH_LDAP_START_TLS = forms.BooleanField( label=_("Use SSL"), initial=False, required=False ) + + +class TerminalSettingForm(BaseForm): + SORT_BY_CHOICES = ( + ('hostname', _('Hostname')), + ('ip', _('IP')), + ) + TERMINAL_ASSET_LIST_SORT_BY = forms.ChoiceField( + choices=SORT_BY_CHOICES, initial='hostname', label=_("List sort by") + ) + TERMINAL_HEARTBEAT_INTERVAL = forms.IntegerField( + initial=5, label=_("Heartbeat interval"), help_text=_("Units: seconds") + ) + TERMINAL_PASSWORD_AUTH = forms.BooleanField( + initial=True, required=False, label=_("Password auth") + ) + TERMINAL_PUBLIC_KEY_AUTH = forms.BooleanField( + initial=True, required=False, label=_("Public key auth") + ) + TERMINAL_COMMAND_STORAGE = DictField( + label=_("Command storage"), help_text=_( + "Set terminal storage setting, `default` is the using as default," + "You can set other storage and some terminal using" + ) + ) diff --git a/apps/common/models.py b/apps/common/models.py index 091b8b83a..1f634bce2 100644 --- a/apps/common/models.py +++ b/apps/common/models.py @@ -2,6 +2,7 @@ import json import ldap from django.db import models +from django.db.utils import ProgrammingError, OperationalError from django.utils.translation import ugettext_lazy as _ from django.conf import settings from django_auth_ldap.config import LDAPSearch @@ -24,6 +25,7 @@ class SettingManager(models.Manager): class Setting(models.Model): name = models.CharField(max_length=128, unique=True, verbose_name=_("Name")) value = models.TextField(verbose_name=_("Value")) + category = models.CharField(max_length=128, default="default") enabled = models.BooleanField(verbose_name=_("Enabled"), default=True) comment = models.TextField(verbose_name=_("Comment")) @@ -33,17 +35,28 @@ class Setting(models.Model): return self.name @property - def value_(self): + def cleaned_value(self): try: return json.loads(self.value) except json.JSONDecodeError: return None + @cleaned_value.setter + def cleaned_value(self, item): + try: + v = json.dumps(item) + self.value = v + except json.JSONDecodeError as e: + raise ValueError("Json dump error: {}".format(str(e))) + @classmethod def refresh_all_settings(cls): - settings_list = cls.objects.all() - for setting in settings_list: - setting.refresh_setting() + try: + settings_list = cls.objects.all() + for setting in settings_list: + setting.refresh_setting() + except (ProgrammingError, OperationalError): + pass def refresh_setting(self): try: @@ -53,9 +66,9 @@ class Setting(models.Model): setattr(settings, self.name, value) if self.name == "AUTH_LDAP": - if self.value_ and settings.AUTH_LDAP_BACKEND not in settings.AUTHENTICATION_BACKENDS: + if self.cleaned_value and settings.AUTH_LDAP_BACKEND not in settings.AUTHENTICATION_BACKENDS: settings.AUTHENTICATION_BACKENDS.insert(0, settings.AUTH_LDAP_BACKEND) - elif not self.value_ and settings.AUTH_LDAP_BACKEND in settings.AUTHENTICATION_BACKENDS: + elif not self.cleaned_value and settings.AUTH_LDAP_BACKEND in settings.AUTHENTICATION_BACKENDS: settings.AUTHENTICATION_BACKENDS.remove(settings.AUTH_LDAP_BACKEND) if self.name == "AUTH_LDAP_SEARCH_FILTER": diff --git a/apps/common/templates/common/basic_setting.html b/apps/common/templates/common/basic_setting.html index fb5039795..496eca977 100644 --- a/apps/common/templates/common/basic_setting.html +++ b/apps/common/templates/common/basic_setting.html @@ -20,6 +20,9 @@
  • {% trans 'LDAP setting' %}
  • +
  • + {% trans 'Terminal setting' %} +
  • diff --git a/apps/common/templates/common/email_setting.html b/apps/common/templates/common/email_setting.html index 7561849bd..1fd772db1 100644 --- a/apps/common/templates/common/email_setting.html +++ b/apps/common/templates/common/email_setting.html @@ -20,6 +20,9 @@
  • {% trans 'LDAP setting' %}
  • +
  • + {% trans 'Terminal setting' %} +
  • diff --git a/apps/common/templates/common/ldap_setting.html b/apps/common/templates/common/ldap_setting.html index 26f021569..f0569f873 100644 --- a/apps/common/templates/common/ldap_setting.html +++ b/apps/common/templates/common/ldap_setting.html @@ -20,6 +20,9 @@
  • {% trans 'LDAP setting' %}
  • +
  • + {% trans 'Terminal setting' %} +
  • diff --git a/apps/common/templates/common/terminal_setting.html b/apps/common/templates/common/terminal_setting.html new file mode 100644 index 000000000..c15ff4bc7 --- /dev/null +++ b/apps/common/templates/common/terminal_setting.html @@ -0,0 +1,129 @@ +{% extends 'base.html' %} +{% load static %} +{% load bootstrap3 %} +{% load i18n %} +{% load common_tags %} + +{% block content %} +
    +
    +
    +
    + +
    +
    +
    +
    + {% if form.non_field_errors %} +
    + {{ form.non_field_errors }} +
    + {% endif %} + {% csrf_token %} +

    {% trans "Basic setting" %}

    + {% for field in form %} + {% if not field.field|is_bool_field %} + {% bootstrap_field field layout="horizontal" %} + {% else %} +
    + +
    +
    + {{ field }} +
    +
    + {{ field.help_text }} +
    +
    +
    + {% endif %} + {% endfor %} + +
    +

    {% trans "Command storage" %}

    + + + + + + + + + {% for name, setting in command_storage.items %} + + + + + {% endfor %} + +
    {% trans 'Name' %}{% trans 'Type' %}
    {{ name }}{{ setting.TYPE }}
    +{# #} +{#
    #} +{#

    {% trans "Replay storage" %}

    #} + +
    +
    +
    + + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +{% endblock %} +{% block custom_foot_js %} + +{% endblock %} diff --git a/apps/common/urls/view_urls.py b/apps/common/urls/view_urls.py index ff8086bde..466f7c49c 100644 --- a/apps/common/urls/view_urls.py +++ b/apps/common/urls/view_urls.py @@ -10,4 +10,5 @@ urlpatterns = [ url(r'^$', views.BasicSettingView.as_view(), name='basic-setting'), url(r'^email/$', views.EmailSettingView.as_view(), name='email-setting'), url(r'^ldap/$', views.LDAPSettingView.as_view(), name='ldap-setting'), + url(r'^terminal/$', views.TerminalSettingView.as_view(), name='terminal-setting'), ] diff --git a/apps/common/views.py b/apps/common/views.py index 4135ca82c..dc0d74f92 100644 --- a/apps/common/views.py +++ b/apps/common/views.py @@ -1,9 +1,12 @@ -from django.views.generic import View, TemplateView +from django.views.generic import TemplateView from django.shortcuts import render, redirect from django.contrib import messages from django.utils.translation import ugettext as _ +from django.conf import settings -from .forms import EmailSettingForm, LDAPSettingForm, BasicSettingForm +from .forms import EmailSettingForm, LDAPSettingForm, BasicSettingForm, \ + TerminalSettingForm +from .models import Setting from .mixins import AdminUserRequiredMixin from .signals import ldap_auth_enable @@ -25,8 +28,6 @@ class BasicSettingView(AdminUserRequiredMixin, TemplateView): form = self.form_class(request.POST) if form.is_valid(): form.save() - if "AUTH_LDAP" in form.cleaned_data: - ldap_auth_enable.send(form.cleaned_data["AUTH_LDAP"]) msg = _("Update setting successfully, please restart program") messages.success(request, msg) return redirect('settings:basic-setting') @@ -79,6 +80,8 @@ class LDAPSettingView(AdminUserRequiredMixin, TemplateView): form = self.form_class(request.POST) if form.is_valid(): form.save() + if "AUTH_LDAP" in form.cleaned_data: + ldap_auth_enable.send(form.cleaned_data["AUTH_LDAP"]) msg = _("Update setting successfully, please restart program") messages.success(request, msg) return redirect('settings:ldap-setting') @@ -86,3 +89,31 @@ class LDAPSettingView(AdminUserRequiredMixin, TemplateView): context = self.get_context_data() context.update({"form": form}) return render(request, self.template_name, context) + + +class TerminalSettingView(AdminUserRequiredMixin, TemplateView): + form_class = TerminalSettingForm + template_name = "common/terminal_setting.html" + + def get_context_data(self, **kwargs): + command_storage = settings.TERMINAL_COMMAND_STORAGE + context = { + 'app': _('Settings'), + 'action': _('Terminal setting'), + 'form': self.form_class(), + 'command_storage': command_storage, + } + kwargs.update(context) + return super().get_context_data(**kwargs) + + def post(self, request): + form = self.form_class(request.POST) + if form.is_valid(): + form.save() + msg = _("Update setting successfully, please restart program") + messages.success(request, msg) + return redirect('settings:terminal-setting') + else: + context = self.get_context_data() + context.update({"form": form}) + return render(request, self.template_name, context) diff --git a/apps/jumpserver/settings.py b/apps/jumpserver/settings.py index 06db81d85..4926c4538 100644 --- a/apps/jumpserver/settings.py +++ b/apps/jumpserver/settings.py @@ -274,7 +274,7 @@ EMAIL_HOST_USER = CONFIG.EMAIL_HOST_USER EMAIL_HOST_PASSWORD = CONFIG.EMAIL_HOST_PASSWORD EMAIL_USE_SSL = CONFIG.EMAIL_USE_SSL EMAIL_USE_TLS = CONFIG.EMAIL_USE_TLS -EMAIL_SUBJECT_PREFIX = CONFIG.EMAIL_SUBJECT_PREFIX +EMAIL_SUBJECT_PREFIX = CONFIG.EMAIL_SUBJECT_PREFIX or '' REST_FRAMEWORK = { # Use Django's standard `django.contrib.auth` permissions, @@ -298,7 +298,7 @@ REST_FRAMEWORK = { 'DATETIME_FORMAT': '%Y-%m-%d %H:%M:%S %z', 'DATETIME_INPUT_FORMATS': ['%Y-%m-%d %H:%M:%S %z'], # 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination', - 'PAGE_SIZE': 15 + # 'PAGE_SIZE': 15 } AUTHENTICATION_BACKENDS = [ @@ -373,7 +373,20 @@ CAPTCHA_FOREGROUND_COLOR = '#001100' CAPTCHA_NOISE_FUNCTIONS = ('captcha.helpers.noise_dots',) CAPTCHA_TEST_MODE = CONFIG.CAPTCHA_TEST_MODE -COMMAND_STORAGE_BACKEND = 'terminal.backends.command.db' +COMMAND_STORAGE = { + 'ENGINE': 'terminal.backends.command.db', +} + +TERMINAL_COMMAND_STORAGE = { + "default": { + "TYPE": "server", + }, + # 'ali-es': { + # 'TYPE': 'elasticsearch', + # 'HOSTS': ['http://elastic:changeme@localhost:9200'], + # }, +} + # Django bootstrap3 setting, more see http://django-bootstrap3.readthedocs.io/en/latest/settings.html BOOTSTRAP3 = { diff --git a/apps/locale/zh/LC_MESSAGES/django.mo b/apps/locale/zh/LC_MESSAGES/django.mo index 5b01e493b..132dcab94 100644 Binary files a/apps/locale/zh/LC_MESSAGES/django.mo and b/apps/locale/zh/LC_MESSAGES/django.mo differ diff --git a/apps/locale/zh/LC_MESSAGES/django.po b/apps/locale/zh/LC_MESSAGES/django.po index 2c7f39971..b29f512de 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-01-12 18:51+0800\n" +"POT-Creation-Date: 2018-01-23 11:56+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: ibuler \n" "Language-Team: Jumpserver team\n" @@ -18,7 +18,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" #: assets/forms.py:23 assets/forms.py:53 assets/forms.py:99 perms/forms.py:37 -#: perms/templates/perms/asset_permission_asset.html:116 users/forms.py:246 +#: perms/templates/perms/asset_permission_asset.html:116 users/forms.py:245 msgid "Select asset groups" msgstr "选择资产组" @@ -44,7 +44,7 @@ msgstr "默认使用管理用户" #: assets/forms.py:76 assets/forms.py:81 assets/forms.py:127 #: assets/templates/assets/asset_group_detail.html:75 perms/forms.py:34 -#: perms/templates/perms/asset_permission_asset.html:88 users/forms.py:243 +#: perms/templates/perms/asset_permission_asset.html:88 users/forms.py:242 msgid "Select assets" msgstr "选择资产" @@ -66,7 +66,7 @@ msgstr "端口" #: assets/templates/assets/system_user_list.html:26 perms/models.py:17 #: perms/templates/perms/asset_permission_create_update.html:40 #: perms/templates/perms/asset_permission_list.html:28 templates/_nav.html:22 -#: terminal/backends/command/models.py:11 terminal/models.py:93 +#: terminal/backends/command/models.py:11 terminal/models.py:116 #: terminal/templates/terminal/command_list.html:40 #: terminal/templates/terminal/command_list.html:73 #: terminal/templates/terminal/session_list.html:41 @@ -77,7 +77,7 @@ msgid "Asset" msgstr "资产" #: assets/forms.py:161 perms/forms.py:40 -#: perms/templates/perms/asset_permission_detail.html:144 users/forms.py:249 +#: perms/templates/perms/asset_permission_detail.html:144 users/forms.py:248 msgid "Select system users" msgstr "选择系统用户" @@ -99,14 +99,15 @@ msgstr "选择的系统用户将会在该集群资产上创建" #: assets/templates/assets/cluster_detail.html:57 #: assets/templates/assets/cluster_list.html:19 #: assets/templates/assets/system_user_detail.html:58 -#: assets/templates/assets/system_user_list.html:24 common/models.py:25 -#: ops/models.py:31 ops/templates/ops/task_detail.html:56 -#: ops/templates/ops/task_list.html:34 perms/models.py:14 +#: assets/templates/assets/system_user_list.html:24 common/models.py:26 +#: common/templates/common/terminal_setting.html:62 ops/models.py:31 +#: ops/templates/ops/task_detail.html:56 ops/templates/ops/task_list.html:34 +#: perms/models.py:14 #: perms/templates/perms/asset_permission_create_update.html:33 #: perms/templates/perms/asset_permission_detail.html:62 #: perms/templates/perms/asset_permission_list.html:25 -#: perms/templates/perms/asset_permission_user.html:54 terminal/models.py:14 -#: terminal/models.py:118 terminal/templates/terminal/terminal_detail.html:43 +#: perms/templates/perms/asset_permission_user.html:54 terminal/models.py:15 +#: terminal/models.py:141 terminal/templates/terminal/terminal_detail.html:43 #: terminal/templates/terminal/terminal_list.html:29 users/models/group.py:14 #: users/models/user.py:35 users/templates/users/_select_user_modal.html:13 #: users/templates/users/user_detail.html:62 @@ -126,10 +127,10 @@ msgstr "集群级别管理用户" #: assets/forms.py:200 msgid "Password or private key password" -msgstr "密码或秘钥不合法" +msgstr "密码或秘钥密码" #: assets/forms.py:201 assets/forms.py:262 assets/models/user.py:30 -#: common/forms.py:110 users/forms.py:16 users/forms.py:24 +#: common/forms.py:113 users/forms.py:16 users/forms.py:24 #: users/templates/users/login.html:56 #: users/templates/users/reset_password.html:52 #: users/templates/users/user_create.html:11 @@ -239,7 +240,7 @@ msgstr "测试环境" #: assets/templates/assets/asset_list.html:31 #: assets/templates/assets/cluster_assets.html:52 #: assets/templates/assets/system_user_asset.html:53 -#: assets/templates/assets/user_asset_list.html:20 +#: assets/templates/assets/user_asset_list.html:20 common/forms.py:140 #: perms/templates/perms/asset_permission_asset.html:55 #: users/templates/users/login_log_list.html:52 #: users/templates/users/user_granted_asset.html:49 @@ -253,7 +254,7 @@ msgstr "IP" #: assets/templates/assets/asset_list.html:30 #: assets/templates/assets/cluster_assets.html:51 #: assets/templates/assets/system_user_asset.html:52 -#: assets/templates/assets/user_asset_list.html:19 +#: assets/templates/assets/user_asset_list.html:19 common/forms.py:139 #: perms/templates/perms/asset_permission_asset.html:54 #: users/templates/users/user_granted_asset.html:48 #: users/templates/users/user_group_granted_asset.html:49 @@ -400,9 +401,9 @@ msgstr "创建日期" #: assets/templates/assets/asset_group_list.html:17 #: assets/templates/assets/cluster_detail.html:97 #: assets/templates/assets/system_user_detail.html:100 -#: assets/templates/assets/system_user_list.html:30 common/models.py:28 +#: assets/templates/assets/system_user_list.html:30 common/models.py:30 #: ops/models.py:37 perms/models.py:24 -#: perms/templates/perms/asset_permission_detail.html:98 terminal/models.py:22 +#: perms/templates/perms/asset_permission_detail.html:98 terminal/models.py:25 #: terminal/templates/terminal/terminal_detail.html:63 users/models/group.py:15 #: users/models/user.py:47 users/templates/users/user_detail.html:110 #: users/templates/users/user_group_detail.html:67 @@ -494,7 +495,7 @@ msgstr "Shell" #: assets/models/user.py:269 perms/models.py:19 #: perms/templates/perms/asset_permission_detail.html:136 #: perms/templates/perms/asset_permission_list.html:30 templates/_nav.html:26 -#: terminal/backends/command/models.py:12 terminal/models.py:94 +#: terminal/backends/command/models.py:12 terminal/models.py:117 #: terminal/templates/terminal/command_list.html:48 #: terminal/templates/terminal/command_list.html:74 #: terminal/templates/terminal/session_list.html:49 @@ -576,9 +577,9 @@ msgstr "仅修改你需要更新的字段" #: assets/views/admin_user.py:106 assets/views/asset.py:48 #: assets/views/asset.py:61 assets/views/asset.py:84 assets/views/asset.py:144 #: assets/views/asset.py:161 assets/views/asset.py:185 -#: assets/views/cluster.py:26 assets/views/cluster.py:85 -#: assets/views/cluster.py:102 assets/views/group.py:34 -#: assets/views/group.py:52 assets/views/group.py:69 assets/views/group.py:87 +#: assets/views/cluster.py:26 assets/views/cluster.py:80 +#: assets/views/cluster.py:97 assets/views/group.py:34 assets/views/group.py:52 +#: assets/views/group.py:69 assets/views/group.py:87 #: assets/views/system_user.py:28 assets/views/system_user.py:44 #: assets/views/system_user.py:60 assets/views/system_user.py:75 #: templates/_nav.html:19 @@ -650,7 +651,7 @@ msgstr "自动生成秘钥" #: assets/templates/assets/asset_update.html:47 #: assets/templates/assets/cluster_create_update.html:46 #: perms/templates/perms/asset_permission_create_update.html:45 -#: terminal/templates/terminal/terminal_update.html:40 +#: terminal/templates/terminal/terminal_update.html:41 msgid "Other" msgstr "其它" @@ -661,12 +662,13 @@ msgstr "其它" #: assets/templates/assets/asset_group_create.html:16 #: assets/templates/assets/asset_update.html:55 #: assets/templates/assets/cluster_create_update.html:54 -#: common/templates/common/basic_setting.html:56 -#: common/templates/common/email_setting.html:56 -#: common/templates/common/ldap_setting.html:56 +#: common/templates/common/basic_setting.html:58 +#: common/templates/common/email_setting.html:59 +#: common/templates/common/ldap_setting.html:59 +#: common/templates/common/terminal_setting.html:82 #: perms/templates/perms/asset_permission_create_update.html:67 -#: terminal/templates/terminal/terminal_update.html:45 -#: users/templates/users/_user.html:49 +#: terminal/templates/terminal/terminal_update.html:46 +#: users/templates/users/_user.html:43 #: users/templates/users/user_bulk_update.html:23 #: users/templates/users/user_password_update.html:58 #: users/templates/users/user_profile.html:139 @@ -681,15 +683,16 @@ msgstr "重置" #: assets/templates/assets/asset_bulk_update.html:24 #: assets/templates/assets/asset_create.html:41 #: assets/templates/assets/asset_group_create.html:17 -#: assets/templates/assets/asset_list.html:55 +#: assets/templates/assets/asset_list.html:53 #: assets/templates/assets/asset_update.html:56 #: assets/templates/assets/cluster_create_update.html:55 -#: common/templates/common/basic_setting.html:57 -#: common/templates/common/email_setting.html:57 -#: common/templates/common/ldap_setting.html:57 +#: common/templates/common/basic_setting.html:59 +#: common/templates/common/email_setting.html:60 +#: common/templates/common/ldap_setting.html:60 +#: common/templates/common/terminal_setting.html:83 #: perms/templates/perms/asset_permission_create_update.html:68 -#: terminal/templates/terminal/terminal_update.html:46 -#: users/templates/users/_user.html:50 +#: terminal/templates/terminal/terminal_update.html:47 +#: users/templates/users/_user.html:44 #: users/templates/users/first_login.html:62 #: users/templates/users/forgot_password.html:44 #: users/templates/users/user_bulk_update.html:24 @@ -726,8 +729,8 @@ msgstr "资产列表" #: assets/templates/assets/asset_detail.html:24 #: assets/templates/assets/asset_group_detail.html:18 #: assets/templates/assets/asset_group_detail.html:177 -#: assets/templates/assets/asset_group_list.html:42 -#: assets/templates/assets/asset_list.html:95 +#: assets/templates/assets/asset_group_list.html:38 +#: assets/templates/assets/asset_list.html:98 #: assets/templates/assets/cluster_assets.html:170 #: assets/templates/assets/cluster_detail.html:25 #: assets/templates/assets/cluster_list.html:43 @@ -750,8 +753,8 @@ msgstr "更新" #: assets/templates/assets/admin_user_list.html:84 #: assets/templates/assets/asset_detail.html:28 #: assets/templates/assets/asset_group_detail.html:22 -#: assets/templates/assets/asset_group_list.html:43 -#: assets/templates/assets/asset_list.html:96 +#: assets/templates/assets/asset_group_list.html:39 +#: assets/templates/assets/asset_list.html:99 #: assets/templates/assets/cluster_detail.html:29 #: assets/templates/assets/cluster_list.html:44 #: assets/templates/assets/system_user_detail.html:30 @@ -776,9 +779,9 @@ msgstr "资产列表" #: assets/templates/assets/admin_user_assets.html:62 #: assets/templates/assets/asset_group_detail.html:53 -#: assets/templates/assets/asset_list.html:34 #: assets/templates/assets/cluster_assets.html:54 #: assets/templates/assets/user_asset_list.html:22 +#: common/templates/common/terminal_setting.html:63 #: users/templates/users/login_log_list.html:50 msgid "Type" msgstr "类型" @@ -786,7 +789,7 @@ msgstr "类型" #: assets/templates/assets/admin_user_assets.html:63 #: assets/templates/assets/admin_user_list.html:25 #: assets/templates/assets/asset_detail.html:376 -#: assets/templates/assets/asset_list.html:38 +#: assets/templates/assets/asset_list.html:36 #: assets/templates/assets/system_user_asset.html:55 #: assets/templates/assets/system_user_list.html:27 msgid "Reachable" @@ -827,8 +830,8 @@ msgstr "使用集群管理用户" #: assets/templates/assets/admin_user_detail.html:101 #: assets/templates/assets/asset_detail.html:230 -#: assets/templates/assets/asset_group_list.html:85 -#: assets/templates/assets/asset_list.html:214 +#: assets/templates/assets/asset_group_list.html:81 +#: assets/templates/assets/asset_list.html:220 #: assets/templates/assets/cluster_assets.html:104 #: assets/templates/assets/cluster_list.html:89 #: assets/templates/assets/system_user_detail.html:164 @@ -859,7 +862,7 @@ msgstr "比例" #: assets/templates/assets/admin_user_list.html:29 #: assets/templates/assets/asset_group_detail.html:55 #: assets/templates/assets/asset_group_list.html:18 -#: assets/templates/assets/asset_list.html:39 +#: assets/templates/assets/asset_list.html:37 #: assets/templates/assets/cluster_assets.html:56 #: assets/templates/assets/cluster_list.html:23 #: assets/templates/assets/system_user_list.html:31 @@ -879,7 +882,7 @@ msgid "Group" msgstr "组" #: assets/templates/assets/asset_detail.html:20 assets/views/asset.py:186 -#: assets/views/cluster.py:103 +#: assets/views/cluster.py:98 msgid "Asset detail" msgstr "资产详情" @@ -909,7 +912,7 @@ msgid "Quick modify" msgstr "快速修改" #: assets/templates/assets/asset_detail.html:175 -#: assets/templates/assets/asset_list.html:37 +#: assets/templates/assets/asset_list.html:35 #: assets/templates/assets/user_asset_list.html:25 perms/models.py:20 #: perms/templates/perms/asset_permission_create_update.html:47 #: perms/templates/perms/asset_permission_detail.html:116 @@ -970,8 +973,8 @@ msgstr "移除" msgid "Create asset group" msgstr "创建资产组" -#: assets/templates/assets/asset_group_list.html:80 -#: assets/templates/assets/asset_list.html:209 +#: assets/templates/assets/asset_group_list.html:76 +#: assets/templates/assets/asset_list.html:215 #: assets/templates/assets/cluster_list.html:84 #: assets/templates/assets/system_user_list.html:129 #: users/templates/users/user_detail.html:333 @@ -981,29 +984,29 @@ msgstr "创建资产组" msgid "Are you sure?" msgstr "你确认吗?" -#: assets/templates/assets/asset_group_list.html:81 +#: assets/templates/assets/asset_group_list.html:77 #: users/templates/users/user_group_list.html:78 msgid "This will delete the selected groups !!!" msgstr "删除选择组" -#: assets/templates/assets/asset_group_list.html:89 +#: assets/templates/assets/asset_group_list.html:85 msgid "Group deleted" msgstr "组已被删除" -#: assets/templates/assets/asset_group_list.html:90 -#: assets/templates/assets/asset_group_list.html:95 +#: assets/templates/assets/asset_group_list.html:86 +#: assets/templates/assets/asset_group_list.html:91 msgid "Group Delete" msgstr "删除" -#: assets/templates/assets/asset_group_list.html:94 +#: assets/templates/assets/asset_group_list.html:90 msgid "Group deleting failed." msgstr "删除失败" -#: assets/templates/assets/asset_group_list.html:157 +#: assets/templates/assets/asset_group_list.html:153 msgid "The selected asset groups has been updated successfully." msgstr "更新成功" -#: assets/templates/assets/asset_group_list.html:158 +#: assets/templates/assets/asset_group_list.html:154 msgid "AssetGroup Updated" msgstr "资产组更新" @@ -1021,52 +1024,47 @@ msgstr "导出" msgid "Create asset" msgstr "创建资产" -#: assets/templates/assets/asset_list.html:35 -#: assets/templates/assets/user_asset_list.html:23 -msgid "Env" -msgstr "环境" - -#: assets/templates/assets/asset_list.html:36 +#: assets/templates/assets/asset_list.html:34 #: assets/templates/assets/user_asset_list.html:24 msgid "Hardware" msgstr "硬件" -#: assets/templates/assets/asset_list.html:48 +#: assets/templates/assets/asset_list.html:46 #: users/templates/users/user_list.html:37 msgid "Delete selected" msgstr "批量删除" -#: assets/templates/assets/asset_list.html:49 +#: assets/templates/assets/asset_list.html:47 #: users/templates/users/user_list.html:38 msgid "Update selected" msgstr "批量更新" -#: assets/templates/assets/asset_list.html:50 +#: assets/templates/assets/asset_list.html:48 #: users/templates/users/user_list.html:39 msgid "Deactive selected" msgstr "禁用所选" -#: assets/templates/assets/asset_list.html:51 +#: assets/templates/assets/asset_list.html:49 #: users/templates/users/user_list.html:40 msgid "Active selected" msgstr "激活所选" -#: assets/templates/assets/asset_list.html:210 +#: assets/templates/assets/asset_list.html:216 msgid "This will delete the selected assets !!!" msgstr "删除选择资产" # msgid "Deleted!" # msgstr "删除" -#: assets/templates/assets/asset_list.html:218 +#: assets/templates/assets/asset_list.html:224 msgid "Asset Deleted." msgstr "已被删除" -#: assets/templates/assets/asset_list.html:219 -#: assets/templates/assets/asset_list.html:224 +#: assets/templates/assets/asset_list.html:225 +#: assets/templates/assets/asset_list.html:230 msgid "Asset Delete" msgstr "删除" -#: assets/templates/assets/asset_list.html:223 +#: assets/templates/assets/asset_list.html:229 msgid "Asset Deleting failed." msgstr "删除失败" @@ -1202,6 +1200,10 @@ msgstr "删除系统用户" msgid "System Users Deleting failed." msgstr "系统用户删除失败" +#: assets/templates/assets/user_asset_list.html:23 +msgid "Env" +msgstr "环境" + #: assets/templates/assets/user_asset_list.html:26 msgid "Connective" msgstr "连接性" @@ -1238,16 +1240,16 @@ msgstr "已经存在" msgid "Cluster list" msgstr "集群列表" -#: assets/views/cluster.py:42 assets/views/cluster.py:70 +#: assets/views/cluster.py:42 assets/views/cluster.py:65 #: assets/views/system_user.py:96 msgid "assets" msgstr "资产管理" -#: assets/views/cluster.py:71 +#: assets/views/cluster.py:66 msgid "Update Cluster" msgstr "更新Cluster" -#: assets/views/cluster.py:86 +#: assets/views/cluster.py:81 msgid "Cluster detail" msgstr "集群详情" @@ -1293,82 +1295,119 @@ msgstr "%(name)s 创建成功" msgid "%(name)s was updated successfully" msgstr "%(name)s 更新成功" -#: common/forms.py:64 +#: common/fields.py:25 +#, fuzzy +#| msgid "Not a valid ssh public key" +msgid "Not a valid json" +msgstr "ssh密钥不合法" + +#: common/fields.py:27 +msgid "Not a string type" +msgstr "" + +#: common/forms.py:70 msgid "Current SITE URL" msgstr "当前站点URL" -#: common/forms.py:68 +#: common/forms.py:74 msgid "User Guide URL" msgstr "用户向导URL" -#: common/forms.py:69 +#: common/forms.py:75 msgid "User first login update profile done redirect to it" msgstr "用户第一次登录,修改profile后重定向到地址" -#: common/forms.py:72 +#: common/forms.py:78 msgid "Email Subject Prefix" msgstr "Email主题前缀" -#: common/forms.py:76 -msgid "Enable LDAP Auth" -msgstr "二次验证" - -#: common/forms.py:82 +#: common/forms.py:85 msgid "SMTP host" msgstr "SMTP主机" -#: common/forms.py:84 +#: common/forms.py:87 msgid "SMTP port" msgstr "SMTP端口" -#: common/forms.py:86 +#: common/forms.py:89 msgid "SMTP user" msgstr "SMTP账号" -#: common/forms.py:89 +#: common/forms.py:92 msgid "SMTP password" msgstr "SMTP密码" -#: common/forms.py:90 +#: common/forms.py:93 msgid "Some provider use token except password" msgstr "一些邮件提供商需要输入的是Token" -#: common/forms.py:93 common/forms.py:130 +#: common/forms.py:96 common/forms.py:133 msgid "Use SSL" msgstr "使用SSL" -#: common/forms.py:94 +#: common/forms.py:97 msgid "If SMTP port is 465, may be select" msgstr "如果SMTP端口是465,通常需要启用SSL" -#: common/forms.py:97 +#: common/forms.py:100 msgid "Use TLS" msgstr "使用TLS" -#: common/forms.py:98 +#: common/forms.py:101 msgid "If SMTP port is 587, may be select" msgstr "如果SMTP端口是587,通常需要启用TLS" -#: common/forms.py:104 +#: common/forms.py:107 msgid "LDAP server" msgstr "LDAP地址" -#: common/forms.py:107 +#: common/forms.py:110 msgid "Bind DN" msgstr "绑定DN" -#: common/forms.py:114 +#: common/forms.py:117 msgid "User OU" msgstr "用户OU" -#: common/forms.py:117 +#: common/forms.py:120 msgid "User search filter" msgstr "用户过滤器" -#: common/forms.py:120 +#: common/forms.py:123 msgid "User attr map" msgstr "LDAP属性映射" +#: common/forms.py:143 +msgid "List sort by" +msgstr "资产列表排序" + +#: common/forms.py:146 +msgid "Heartbeat interval" +msgstr "心跳间隔" + +#: common/forms.py:146 ops/models.py:32 +msgid "Units: seconds" +msgstr "单位: 秒" + +#: common/forms.py:149 +msgid "Password auth" +msgstr "密码认证" + +#: common/forms.py:152 +msgid "Public key auth" +msgstr "秘钥认证" + +#: common/forms.py:155 common/templates/common/terminal_setting.html:58 +#: terminal/forms.py:21 terminal/models.py:19 +msgid "Command storage" +msgstr "命令存储" + +#: common/forms.py:156 +msgid "" +"Set terminal storage setting, `default` is the using as default,You can set " +"other storage and some terminal using" +msgstr "设置终端命令存储,default是默认用的存储方式" + #: common/mixins.py:29 msgid "is discard" msgstr "" @@ -1377,55 +1416,61 @@ msgstr "" msgid "discard time" msgstr "" -#: common/models.py:26 +#: common/models.py:27 msgid "Value" msgstr "值" -#: common/models.py:27 +#: common/models.py:29 msgid "Enabled" msgstr "启用" #: common/templates/common/basic_setting.html:15 #: common/templates/common/email_setting.html:15 -#: common/templates/common/ldap_setting.html:15 common/views.py:18 +#: common/templates/common/ldap_setting.html:15 +#: common/templates/common/terminal_setting.html:15 +#: common/templates/common/terminal_setting.html:38 common/views.py:21 msgid "Basic setting" msgstr "基本设置" #: common/templates/common/basic_setting.html:18 #: common/templates/common/email_setting.html:18 -#: common/templates/common/ldap_setting.html:18 common/views.py:45 +#: common/templates/common/ldap_setting.html:18 +#: common/templates/common/terminal_setting.html:18 common/views.py:47 msgid "Email setting" msgstr "邮件设置" #: common/templates/common/basic_setting.html:21 #: common/templates/common/email_setting.html:21 -#: common/templates/common/ldap_setting.html:21 common/views.py:70 +#: common/templates/common/ldap_setting.html:21 +#: common/templates/common/terminal_setting.html:21 common/views.py:73 msgid "LDAP setting" msgstr "LDAP设置" -#: common/templates/common/basic_setting.html:55 -#: common/templates/common/email_setting.html:55 -#: common/templates/common/ldap_setting.html:55 +#: common/templates/common/basic_setting.html:24 +#: common/templates/common/email_setting.html:24 +#: common/templates/common/ldap_setting.html:24 +#: common/templates/common/terminal_setting.html:24 common/views.py:102 +msgid "Terminal setting" +msgstr "终端设置" + +#: common/templates/common/email_setting.html:58 +#: common/templates/common/ldap_setting.html:58 msgid "Test connection" msgstr "测试连接" -#: common/views.py:17 common/views.py:44 common/views.py:69 +#: common/views.py:20 common/views.py:46 common/views.py:72 common/views.py:101 #: templates/_nav.html:69 msgid "Settings" msgstr "系统设置" -#: common/views.py:30 common/views.py:55 common/views.py:80 -msgid "Update setting successfully" -msgstr "更新设置成功" +#: common/views.py:31 common/views.py:57 common/views.py:85 common/views.py:113 +msgid "Update setting successfully, please restart program" +msgstr "更新设置成功, 请手动重启程序" #: ops/models.py:32 msgid "Interval" msgstr "间隔" -#: ops/models.py:32 -msgid "Units: seconds" -msgstr "单位: 秒" - #: ops/models.py:33 msgid "Crontab" msgstr "Crontab" @@ -1569,7 +1614,7 @@ msgstr "执行历史" #: ops/templates/ops/adhoc_history.html:52 #: ops/templates/ops/adhoc_history_detail.html:58 -#: ops/templates/ops/task_history.html:55 terminal/models.py:101 +#: ops/templates/ops/task_history.html:55 terminal/models.py:124 #: terminal/templates/terminal/session_list.html:77 msgid "Date start" msgstr "开始日期" @@ -1686,18 +1731,18 @@ msgid "Task run history" msgstr "执行历史" #: perms/forms.py:16 users/forms.py:147 users/forms.py:152 users/forms.py:164 -#: users/forms.py:195 +#: users/forms.py:194 msgid "Select users" msgstr "选择用户" #: perms/forms.py:18 perms/models.py:15 #: perms/templates/perms/asset_permission_create_update.html:36 #: perms/templates/perms/asset_permission_list.html:26 templates/_nav.html:12 -#: terminal/backends/command/models.py:10 terminal/models.py:92 +#: terminal/backends/command/models.py:10 terminal/models.py:115 #: terminal/templates/terminal/command_list.html:32 #: terminal/templates/terminal/command_list.html:72 #: terminal/templates/terminal/session_list.html:33 -#: terminal/templates/terminal/session_list.html:71 users/forms.py:191 +#: terminal/templates/terminal/session_list.html:71 users/forms.py:190 #: users/models/user.py:30 users/templates/users/user_group_detail.html:78 #: users/views/user.py:337 msgid "User" @@ -1842,16 +1887,12 @@ msgstr "资产授权包含用户" msgid "Asset permission asset list" msgstr "资产组授权包含资产" -#: templates/_header_bar.html:14 -msgid "Welcome to use Jumpserver system" -msgstr "欢迎使用Jumpserver开源跳板机系统" - #: templates/_header_bar.html:18 msgid "Help" msgstr "帮助" -#: templates/_header_bar.html:33 templates/_nav_user.html:9 -#: users/templates/users/_user.html:42 +#: templates/_header_bar.html:32 templates/_nav_user.html:9 +#: users/templates/users/_user.html:36 #: users/templates/users/user_password_update.html:37 #: users/templates/users/user_profile.html:17 #: users/templates/users/user_profile_update.html:37 @@ -1860,24 +1901,24 @@ msgstr "帮助" msgid "Profile" msgstr "个人信息" -#: templates/_header_bar.html:37 +#: templates/_header_bar.html:36 msgid "Admin page" msgstr "管理页面" -#: templates/_header_bar.html:39 +#: templates/_header_bar.html:38 msgid "User page" msgstr "用户页面" -#: templates/_header_bar.html:42 +#: templates/_header_bar.html:41 msgid "Logout" msgstr "注销登录" -#: templates/_header_bar.html:46 users/templates/users/login.html:42 +#: templates/_header_bar.html:45 users/templates/users/login.html:42 #: users/templates/users/login.html:61 msgid "Login" msgstr "登录" -#: templates/_header_bar.html:59 templates/_nav.html:4 +#: templates/_header_bar.html:58 templates/_nav.html:4 msgid "Dashboard" msgstr "仪表盘" @@ -1912,8 +1953,8 @@ msgid "Close" msgstr "关闭" #: templates/_nav.html:9 users/views/group.py:28 users/views/group.py:44 -#: users/views/group.py:62 users/views/group.py:79 users/views/login.py:194 -#: users/views/login.py:243 users/views/user.py:57 users/views/user.py:72 +#: users/views/group.py:62 users/views/group.py:79 users/views/login.py:197 +#: users/views/login.py:246 users/views/user.py:57 users/views/user.py:72 #: users/views/user.py:91 users/views/user.py:147 users/views/user.py:304 #: users/views/user.py:318 users/views/user.py:355 users/views/user.py:377 msgid "Users" @@ -1952,7 +1993,7 @@ msgstr "在线会话" msgid "Session offline" msgstr "离线会话" -#: templates/_nav.html:53 terminal/models.py:99 +#: templates/_nav.html:53 terminal/models.py:122 #: terminal/templates/terminal/command_list.html:55 #: terminal/templates/terminal/command_list.html:71 #: terminal/templates/terminal/session_detail.html:48 @@ -1993,64 +2034,68 @@ msgstr "输出" msgid "Session" msgstr "会话" -#: terminal/forms.py:15 +#: terminal/forms.py:27 msgid "Coco ssh listen port" msgstr "SSH 监听端口" -#: terminal/forms.py:16 +#: terminal/forms.py:28 msgid "Coco http/ws listen port" msgstr "Http/Websocket 监听端口" -#: terminal/models.py:15 +#: terminal/models.py:16 msgid "Remote Address" msgstr "远端地址" -#: terminal/models.py:16 +#: terminal/models.py:17 msgid "SSH Port" msgstr "SSH端口" -#: terminal/models.py:17 +#: terminal/models.py:18 msgid "HTTP Port" msgstr "HTTP端口" -#: terminal/models.py:68 +#: terminal/models.py:20 +msgid "Replay storage" +msgstr "录像存储" + +#: terminal/models.py:91 msgid "Session Online" msgstr "在线会话" -#: terminal/models.py:69 +#: terminal/models.py:92 msgid "CPU Usage" msgstr "CPU使用" -#: terminal/models.py:70 +#: terminal/models.py:93 msgid "Memory Used" msgstr "内存使用" -#: terminal/models.py:71 +#: terminal/models.py:94 msgid "Connections" msgstr "连接数" -#: terminal/models.py:72 +#: terminal/models.py:95 msgid "Threads" msgstr "线程数" -#: terminal/models.py:73 +#: terminal/models.py:96 msgid "Boot Time" msgstr "运行时间" -#: terminal/models.py:96 terminal/templates/terminal/session_list.html:74 +#: terminal/models.py:119 terminal/templates/terminal/session_list.html:74 #: terminal/templates/terminal/terminal_detail.html:47 msgid "Remote addr" msgstr "远端地址" -#: terminal/models.py:98 terminal/templates/terminal/session_list.html:100 +#: terminal/models.py:121 terminal/templates/terminal/session_list.html:100 msgid "Replay" msgstr "回放" -#: terminal/models.py:102 +#: terminal/models.py:125 msgid "Date end" msgstr "结束日期" -#: terminal/models.py:119 +#: terminal/models.py:142 msgid "Args" msgstr "参数" @@ -2404,7 +2449,7 @@ msgstr "忘记密码" #: users/templates/users/forgot_password.html:33 msgid "Input your email, that will send a mail to your" -msgstr "输入您的邮箱, 将会发一封重置短信邮件到您的邮箱中" +msgstr "输入您的邮箱, 将会发一封重置邮件到您的邮箱中" #: users/templates/users/login.html:47 msgid "Captcha invalid" @@ -2473,10 +2518,8 @@ msgid "An e-mail has been sent to the user\\'s mailbox." msgstr "已发送邮件到用户邮箱" #: users/templates/users/user_detail.html:334 -msgid "" -"This will reset the user's password. A password-reset email will be sent to " -"the user\\'s mailbox." -msgstr "重设密码邮件将会发送到用户邮箱" +msgid "This will reset the user password and send a reset mail" +msgstr "将失效用户当前密码,并发送重设密码邮件到用户邮箱" #: users/templates/users/user_detail.html:348 msgid "" @@ -2490,8 +2533,8 @@ msgid "Reset SSH public key" msgstr "重置SSH密钥" #: users/templates/users/user_detail.html:359 -msgid "This will reset the user\\" -msgstr "重置" +msgid "This will reset the user public key and send a reset mail" +msgstr "将会失效用户当前秘钥,并发送重置邮件到用户邮箱" #: users/templates/users/user_detail.html:376 #: users/templates/users/user_profile.html:170 @@ -2740,48 +2783,48 @@ msgstr "编辑用户组" msgid "Please enable cookies and try again." msgstr "设置你的浏览器支持cookie" -#: users/views/login.py:84 +#: users/views/login.py:87 msgid "Logout success" msgstr "退出登录成功" -#: users/views/login.py:85 +#: users/views/login.py:88 msgid "Logout success, return login page" msgstr "退出登录成功,返回到登录页面" -#: users/views/login.py:101 +#: users/views/login.py:104 msgid "Email address invalid, please input again" msgstr "邮箱地址错误,重新输入" -#: users/views/login.py:114 +#: users/views/login.py:117 msgid "Send reset password message" msgstr "发送重置密码邮件" -#: users/views/login.py:115 +#: users/views/login.py:118 msgid "Send reset password mail success, login your mail box and follow it " msgstr "" "发送重置邮件成功, 请登录邮箱查看, 按照提示操作 (如果没收到,请等待3-5分钟)" -#: users/views/login.py:129 +#: users/views/login.py:132 msgid "Reset password success" msgstr "重置密码成功" -#: users/views/login.py:130 +#: users/views/login.py:133 msgid "Reset password success, return to login page" msgstr "重置密码成功,返回到登录页面" -#: users/views/login.py:147 users/views/login.py:160 +#: users/views/login.py:150 users/views/login.py:163 msgid "Token invalid or expired" msgstr "Token错误或失效" -#: users/views/login.py:156 +#: users/views/login.py:159 msgid "Password not same" msgstr "密码不一致" -#: users/views/login.py:194 +#: users/views/login.py:197 msgid "First login" msgstr "首次登陆" -#: users/views/login.py:244 +#: users/views/login.py:247 msgid "Login log list" msgstr "登录日志" @@ -2813,5 +2856,17 @@ msgstr "密码更新" msgid "Public key update" msgstr "秘钥更新" +#~ msgid "Add command storage" +#~ msgstr "添加命令存储" + +#~ msgid "Welcome to use Jumpserver system" +#~ msgstr "欢迎使用Jumpserver开源跳板机系统" + +#~ msgid "This will reset the user\\" +#~ msgstr "重置" + +#~ msgid "Enable LDAP Auth" +#~ msgstr "LDAP认证" + #~ msgid "Connect" #~ msgstr "连接" diff --git a/apps/ops/models.py b/apps/ops/models.py index 3c96f5146..471df25d7 100644 --- a/apps/ops/models.py +++ b/apps/ops/models.py @@ -165,7 +165,7 @@ class AdHoc(models.Model): if item and isinstance(item, list): self._tasks = json.dumps(item) else: - raise SyntaxError('Tasks should be a list') + raise SyntaxError('Tasks should be a list: {}'.format(item)) @property def hosts(self): diff --git a/apps/ops/utils.py b/apps/ops/utils.py index 0a9dce8c9..55862dd44 100644 --- a/apps/ops/utils.py +++ b/apps/ops/utils.py @@ -16,6 +16,8 @@ def update_or_create_ansible_task( run_as_admin=False, run_as="", become_info=None, created_by=None, ): + if not hosts or not tasks or not task_name: + return defaults = { 'name': task_name, @@ -41,7 +43,7 @@ def update_or_create_ansible_task( new_adhoc.become = become_info if not adhoc or adhoc != new_adhoc: - logger.debug("Task create new adhoc: {}".format(task_name)) + print("Task create new adhoc: {}".format(task_name)) new_adhoc.save() task.latest_adhoc = new_adhoc created = True diff --git a/apps/static/css/jumpserver.css b/apps/static/css/jumpserver.css index 28fe88b68..999fe5810 100644 --- a/apps/static/css/jumpserver.css +++ b/apps/static/css/jumpserver.css @@ -303,7 +303,7 @@ div.dataTables_wrapper div.dataTables_filter { .profile-element div:first-child { line-height: 60px; - width: 70px; + /*width: 70px;*/ float: left; text-align: center; } diff --git a/apps/static/img/avatar/admin.png b/apps/static/img/avatar/admin.png index 0d07dbf97..d81e793b2 100644 Binary files a/apps/static/img/avatar/admin.png and b/apps/static/img/avatar/admin.png differ diff --git a/apps/static/img/avatar/user.png b/apps/static/img/avatar/user.png index 0c7d8fb74..d81e793b2 100644 Binary files a/apps/static/img/avatar/user.png and b/apps/static/img/avatar/user.png differ diff --git a/apps/static/img/logo-text.png b/apps/static/img/logo-text.png new file mode 100644 index 000000000..cb76b555a Binary files /dev/null and b/apps/static/img/logo-text.png differ diff --git a/apps/templates/_footer.html b/apps/templates/_footer.html index 9ce501444..b2c106f50 100644 --- a/apps/templates/_footer.html +++ b/apps/templates/_footer.html @@ -4,6 +4,6 @@
    - Copyright 北京堆栈科技有限公司 © 2014-2017 + Copyright 北京堆栈科技有限公司 © 2014-2018
    \ No newline at end of file diff --git a/apps/templates/_header_bar.html b/apps/templates/_header_bar.html index a8866dfcc..74c0787c9 100644 --- a/apps/templates/_header_bar.html +++ b/apps/templates/_header_bar.html @@ -10,9 +10,9 @@