diff --git a/apps/assets/forms/user.py b/apps/assets/forms/user.py
index 5c7d3c770..34a9e3c52 100644
--- a/apps/assets/forms/user.py
+++ b/apps/assets/forms/user.py
@@ -65,17 +65,7 @@ class PasswordAndKeyAuthForm(forms.ModelForm):
class AdminUserForm(PasswordAndKeyAuthForm):
def save(self, commit=True):
- # Because we define custom field, so we need rewrite :method: `save`
- admin_user = super().save(commit=commit)
- password = self.cleaned_data.get('password', '') or None
- private_key, public_key = super().gen_keys()
- admin_user.set_auth(password=password, public_key=public_key, private_key=private_key)
- return admin_user
-
- def clean(self):
- super().clean()
- if not self.instance:
- super().validate_password_key()
+ raise forms.ValidationError("Use api to save")
class Meta:
model = AdminUser
@@ -91,51 +81,7 @@ class SystemUserForm(OrgModelForm, PasswordAndKeyAuthForm):
auto_generate_key = forms.BooleanField(initial=True, required=False)
def save(self, commit=True):
- # Because we define custom field, so we need rewrite :method: `save`
- system_user = super().save()
- password = self.cleaned_data.get('password', '') or None
- login_mode = self.cleaned_data.get('login_mode', '') or None
- protocol = self.cleaned_data.get('protocol') or None
- auto_generate_key = self.cleaned_data.get('auto_generate_key', False)
- private_key, public_key = super().gen_keys()
-
- if login_mode == SystemUser.LOGIN_MANUAL or \
- protocol in [SystemUser.PROTOCOL_TELNET,
- SystemUser.PROTOCOL_VNC]:
- system_user.auto_push = 0
- system_user.save()
- auto_generate_key = False
-
- if auto_generate_key:
- logger.info('Auto generate key and set system user auth')
- if protocol == SystemUser.PROTOCOL_SSH:
- system_user.auto_gen_auth()
- elif protocol == SystemUser.PROTOCOL_RDP:
- system_user.auto_gen_auth_password()
- else:
- system_user.set_auth(password=password, private_key=private_key,
- public_key=public_key)
-
- return system_user
-
- def clean(self):
- super().clean()
- auto_generate = self.cleaned_data.get('auto_generate_key')
- if not self.instance and not auto_generate:
- super().validate_password_key()
-
- def clean_username(self):
- username = self.data.get('username')
- login_mode = self.data.get('login_mode')
- protocol = self.data.get('protocol')
-
- if username:
- return username
- if login_mode == SystemUser.LOGIN_AUTO and \
- protocol != SystemUser.PROTOCOL_VNC:
- msg = _('* Automatic login mode must fill in the username.')
- raise forms.ValidationError(msg)
- return username
+ raise forms.ValidationError("Use api to save")
class Meta:
model = SystemUser
diff --git a/apps/assets/models/base.py b/apps/assets/models/base.py
index bd85d144e..b372bc9fd 100644
--- a/apps/assets/models/base.py
+++ b/apps/assets/models/base.py
@@ -197,6 +197,17 @@ class AssetUser(OrgModelMixin):
self.public_key = ''
self.save()
+ @staticmethod
+ def gen_password():
+ return str(uuid.uuid4())
+
+ @staticmethod
+ def gen_key(username):
+ private_key, public_key = ssh_key_gen(
+ username=username
+ )
+ return private_key, public_key
+
def auto_gen_auth(self):
password = str(uuid.uuid4())
private_key, public_key = ssh_key_gen(
diff --git a/apps/assets/serializers/admin_user.py b/apps/assets/serializers/admin_user.py
index dbbb16406..b05de01f6 100644
--- a/apps/assets/serializers/admin_user.py
+++ b/apps/assets/serializers/admin_user.py
@@ -8,10 +8,10 @@ from common.serializers import AdaptedBulkListSerializer
from ..models import Node, AdminUser
from orgs.mixins import BulkOrgResourceModelSerializer
-from .base import AuthSerializer
+from .base import AuthSerializer, AuthSerializerMixin
-class AdminUserSerializer(BulkOrgResourceModelSerializer):
+class AdminUserSerializer(AuthSerializerMixin, BulkOrgResourceModelSerializer):
"""
管理用户
"""
diff --git a/apps/assets/serializers/asset_user.py b/apps/assets/serializers/asset_user.py
index a111f1993..99497c593 100644
--- a/apps/assets/serializers/asset_user.py
+++ b/apps/assets/serializers/asset_user.py
@@ -4,12 +4,11 @@
from django.utils.translation import ugettext as _
from rest_framework import serializers
-from common.utils import validate_ssh_private_key
from common.serializers import AdaptedBulkListSerializer
from orgs.mixins import BulkOrgResourceModelSerializer
from ..models import AuthBook, Asset
from ..backends import AssetUserManager
-from .base import ConnectivitySerializer
+from .base import ConnectivitySerializer, AuthSerializerMixin
__all__ = [
@@ -24,7 +23,7 @@ class BasicAssetSerializer(serializers.ModelSerializer):
fields = ['hostname', 'ip']
-class AssetUserSerializer(BulkOrgResourceModelSerializer):
+class AssetUserSerializer(AuthSerializerMixin, BulkOrgResourceModelSerializer):
hostname = serializers.CharField(read_only=True, label=_("Hostname"))
ip = serializers.CharField(read_only=True, label=_("IP"))
connectivity = ConnectivitySerializer(read_only=True, label=_("Connectivity"))
@@ -50,13 +49,6 @@ class AssetUserSerializer(BulkOrgResourceModelSerializer):
'public_key': {'write_only': True},
}
- def validate_private_key(self, key):
- password = self.initial_data.get("password")
- valid = validate_ssh_private_key(key, password)
- if not valid:
- raise serializers.ValidationError(_("private key invalid"))
- return key
-
def create(self, validated_data):
if not validated_data.get("name") and validated_data.get("username"):
validated_data["name"] = validated_data["username"]
diff --git a/apps/assets/serializers/base.py b/apps/assets/serializers/base.py
index 3d0fcd58b..ca4aa7502 100644
--- a/apps/assets/serializers/base.py
+++ b/apps/assets/serializers/base.py
@@ -2,7 +2,7 @@
#
from rest_framework import serializers
-from common.utils import ssh_pubkey_gen
+from common.utils import ssh_pubkey_gen, validate_ssh_private_key
class AuthSerializer(serializers.ModelSerializer):
@@ -28,4 +28,38 @@ class AuthSerializer(serializers.ModelSerializer):
class ConnectivitySerializer(serializers.Serializer):
status = serializers.IntegerField()
- datetime = serializers.DateTimeField()
\ No newline at end of file
+ datetime = serializers.DateTimeField()
+
+
+class AuthSerializerMixin:
+ def validate_password(self, password):
+ return password
+
+ def validate_private_key(self, private_key):
+ if not private_key:
+ return
+ password = self.initial_data.get("password")
+ valid = validate_ssh_private_key(private_key, password)
+ if not valid:
+ raise serializers.ValidationError(_("private key invalid"))
+ return private_key
+
+ def validate_public_key(self, public_key):
+ return public_key
+
+ @staticmethod
+ def clean_auth_fields(validated_data):
+ for field in ('password', 'private_key', 'public_key'):
+ value = validated_data.get(field)
+ if not value:
+ validated_data.pop(field, None)
+ # print(validated_data)
+ # raise serializers.ValidationError(">>>>>>")
+
+ def create(self, validated_data):
+ self.clean_auth_fields(validated_data)
+ return super().create(validated_data)
+
+ def update(self, instance, validated_data):
+ self.clean_auth_fields(validated_data)
+ return super().update(instance, validated_data)
diff --git a/apps/assets/serializers/system_user.py b/apps/assets/serializers/system_user.py
index 116dcdd36..6f1c5e416 100644
--- a/apps/assets/serializers/system_user.py
+++ b/apps/assets/serializers/system_user.py
@@ -5,13 +5,14 @@ from django.utils.translation import ugettext_lazy as _
from common.serializers import AdaptedBulkListSerializer
from orgs.mixins import BulkOrgResourceModelSerializer
from ..models import SystemUser
-from .base import AuthSerializer
+from .base import AuthSerializer, AuthSerializerMixin
-class SystemUserSerializer(BulkOrgResourceModelSerializer):
+class SystemUserSerializer(AuthSerializerMixin, BulkOrgResourceModelSerializer):
"""
系统用户
"""
+ auto_generate_key = serializers.BooleanField(initial=True, required=False, write_only=True)
class Meta:
model = SystemUser
@@ -20,7 +21,7 @@ class SystemUserSerializer(BulkOrgResourceModelSerializer):
'id', 'name', 'username', 'password', 'public_key', 'private_key',
'login_mode', 'login_mode_display', 'priority', 'protocol',
'auto_push', 'cmd_filters', 'sudo', 'shell', 'comment', 'nodes',
- 'assets_amount', 'connectivity_amount'
+ 'assets_amount', 'connectivity_amount', 'auto_generate_key'
]
extra_kwargs = {
'password': {"write_only": True},
@@ -32,6 +33,63 @@ class SystemUserSerializer(BulkOrgResourceModelSerializer):
'created_by': {'read_only': True},
}
+ def validate_auto_push(self, value):
+ login_mode = self.initial_data.get("login_mode")
+ protocol = self.initial_data.get("protocol")
+
+ if login_mode == SystemUser.LOGIN_MANUAL or \
+ protocol in [SystemUser.PROTOCOL_TELNET,
+ SystemUser.PROTOCOL_VNC]:
+ value = False
+ return value
+
+ def validate_auto_generate_key(self, value):
+ login_mode = self.initial_data.get("login_mode")
+ protocol = self.initial_data.get("protocol")
+
+ if self.context["request"].method.lower() != "post":
+ value = False
+ elif self.instance:
+ value = False
+ elif login_mode == SystemUser.LOGIN_MANUAL:
+ value = False
+ elif protocol in [SystemUser.PROTOCOL_TELNET, SystemUser.PROTOCOL_VNC]:
+ value = False
+ return value
+
+ def validate_username(self, username):
+ if username:
+ return username
+ login_mode = self.validated_data.get("login_mode")
+ protocol = self.validated_data.get("protocol")
+ if login_mode == SystemUser.LOGIN_AUTO and \
+ protocol != SystemUser.PROTOCOL_VNC:
+ msg = _('* Automatic login mode must fill in the username.')
+ raise serializers.ValidationError(msg)
+ return username
+
+ def validate_password(self, password):
+ super().validate_password(password)
+ auto_gen_key = self.initial_data.get("auto_generate_key", False)
+ private_key = self.initial_data.get("private_key")
+ if not self.instance and not auto_gen_key and not password and not private_key:
+ raise serializers.ValidationError(_("Password or private key required"))
+ return password
+
+ def validate(self, attrs):
+ username = attrs.get("username", "manual")
+ protocol = attrs.get("protocol")
+ auto_gen_key = attrs.get("auto_generate_key", False)
+ if auto_gen_key:
+ password = SystemUser.gen_password()
+ attrs["password"] = password
+ if protocol == SystemUser.PROTOCOL_SSH:
+ private_key, public_key = SystemUser.gen_key(username)
+ attrs["private_key"] = private_key
+ attrs["public_key"] = public_key
+ attrs.pop("auto_generate_key", None)
+ return attrs
+
@classmethod
def setup_eager_loading(cls, queryset):
""" Perform necessary eager loading of data. """
@@ -52,7 +110,6 @@ class SystemUserAuthSerializer(AuthSerializer):
]
-
class SystemUserSimpleSerializer(serializers.ModelSerializer):
"""
系统用户最基本信息的数据结构
diff --git a/apps/assets/templates/assets/_system_user.html b/apps/assets/templates/assets/_system_user.html
index 71c3420d0..ef78187b5 100644
--- a/apps/assets/templates/assets/_system_user.html
+++ b/apps/assets/templates/assets/_system_user.html
@@ -218,6 +218,31 @@ $(document).ready(function () {
})
.on('change', protocol_id, function(){
fieldDisplay();
+}).on("submit", "form", function (evt) {
+ evt.preventDefault();
+ {% block formUrl %}
+ var the_url = '{% url 'api-assets:system-user-list' %}';
+ var redirect_to = '{% url "assets:system-user-list" %}';
+ var method = "POST";
+ {% endblock %}
+ var form = $("form");
+ var data = form.serializeObject();
+
+ objectAttrsIsBool(data, ["auto_generate_key", "auto_push"]);
+ data["private_key"] = $("#id_private_key_file").data('file');
+
+ var props = {
+ url: the_url,
+ data: data,
+ method: method,
+ form: form,
+ redirect_to: redirect_to
+ };
+ formSubmit(props);
+}).on('change', '#id_private_key_file', function () {
+ readFile($(this)).on("onload", function (evt, data) {
+ $(this).attr("data-file", data)
+ })
})
diff --git a/apps/assets/templates/assets/admin_user_create_update.html b/apps/assets/templates/assets/admin_user_create_update.html
index 4ec2780ea..8d32d16ab 100644
--- a/apps/assets/templates/assets/admin_user_create_update.html
+++ b/apps/assets/templates/assets/admin_user_create_update.html
@@ -54,9 +54,38 @@
{% endblock %}
{% block custom_foot_js %}
-
+
{% endblock %}
\ No newline at end of file
diff --git a/apps/assets/templates/assets/system_user_update.html b/apps/assets/templates/assets/system_user_update.html
index 977c3ac31..4414d3dcf 100644
--- a/apps/assets/templates/assets/system_user_update.html
+++ b/apps/assets/templates/assets/system_user_update.html
@@ -14,3 +14,9 @@
{% endblock %}
+{% block formUrl %}
+ var the_url = '{% url 'api-assets:system-user-detail' pk=object.pk %}';
+ var redirect_to = '{% url "assets:system-user-list" %}';
+ var method = "PUT";
+{% endblock %}
+
diff --git a/apps/assets/views/admin_user.py b/apps/assets/views/admin_user.py
index 455ca4a9d..1ded61cb2 100644
--- a/apps/assets/views/admin_user.py
+++ b/apps/assets/views/admin_user.py
@@ -47,7 +47,8 @@ class AdminUserCreateView(PermissionsMixin,
def get_context_data(self, **kwargs):
context = {
'app': _('Assets'),
- 'action': _('Create admin user')
+ 'action': _('Create admin user'),
+ "type": "create"
}
kwargs.update(context)
return super().get_context_data(**kwargs)
@@ -65,6 +66,7 @@ class AdminUserUpdateView(PermissionsMixin, SuccessMessageMixin, UpdateView):
context = {
'app': _('Assets'),
'action': _('Update admin user'),
+ "type": "update"
}
kwargs.update(context)
return super().get_context_data(**kwargs)
diff --git a/apps/locale/zh/LC_MESSAGES/django.mo b/apps/locale/zh/LC_MESSAGES/django.mo
index 1e5e6a70e..3ca6363f6 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 725d56bc6..6dde35429 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: 2019-07-04 17:13+0800\n"
+"POT-Creation-Date: 2019-07-08 15:32+0800\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: ibuler \n"
"Language-Team: Jumpserver team\n"
@@ -71,14 +71,14 @@ msgstr "目标地址"
msgid "Operating parameter"
msgstr "运行参数"
-#: applications/forms/remote_app.py:106 applications/models/remote_app.py:23
+#: applications/forms/remote_app.py:104 applications/models/remote_app.py:23
#: applications/templates/applications/remote_app_detail.html:57
#: applications/templates/applications/remote_app_list.html:22
#: applications/templates/applications/user_remote_app_list.html:18
#: assets/forms/domain.py:15 assets/forms/label.py:13
-#: assets/models/asset.py:292 assets/models/authbook.py:24
-#: assets/serializers/admin_user.py:35 assets/serializers/asset_user.py:89
-#: assets/serializers/system_user.py:29
+#: assets/models/asset.py:286 assets/models/authbook.py:24
+#: assets/serializers/admin_user.py:35 assets/serializers/asset_user.py:81
+#: assets/serializers/system_user.py:30
#: assets/templates/assets/admin_user_list.html:49
#: assets/templates/assets/domain_detail.html:60
#: assets/templates/assets/domain_list.html:26
@@ -86,7 +86,7 @@ msgstr "运行参数"
#: assets/templates/assets/system_user_list.html:55 audits/models.py:19
#: audits/templates/audits/ftp_log_list.html:41
#: audits/templates/audits/ftp_log_list.html:71
-#: perms/forms/asset_permission.py:68 perms/models/asset_permission.py:68
+#: perms/forms/asset_permission.py:68 perms/models/asset_permission.py:76
#: perms/templates/perms/asset_permission_create_update.html:45
#: perms/templates/perms/asset_permission_list.html:48
#: perms/templates/perms/asset_permission_list.html:117
@@ -95,7 +95,7 @@ msgstr "运行参数"
#: terminal/templates/terminal/command_list.html:66
#: terminal/templates/terminal/session_list.html:28
#: terminal/templates/terminal/session_list.html:72
-#: xpack/plugins/change_auth_plan/forms.py:115
+#: xpack/plugins/change_auth_plan/forms.py:114
#: xpack/plugins/change_auth_plan/models.py:413
#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_create_update.html:46
#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_execution_list.html:54
@@ -108,15 +108,15 @@ msgstr "运行参数"
msgid "Asset"
msgstr "资产"
-#: applications/forms/remote_app.py:109 applications/models/remote_app.py:27
+#: applications/forms/remote_app.py:107 applications/models/remote_app.py:27
#: applications/templates/applications/remote_app_detail.html:61
#: applications/templates/applications/remote_app_list.html:23
#: applications/templates/applications/user_remote_app_list.html:19
#: assets/models/user.py:160 assets/templates/assets/user_asset_list.html:172
#: audits/models.py:20 audits/templates/audits/ftp_log_list.html:49
#: audits/templates/audits/ftp_log_list.html:72
-#: perms/forms/asset_permission.py:74 perms/models/asset_permission.py:70
-#: perms/models/asset_permission.py:95
+#: perms/forms/asset_permission.py:74 perms/models/asset_permission.py:78
+#: perms/models/asset_permission.py:103
#: perms/templates/perms/asset_permission_detail.html:140
#: perms/templates/perms/asset_permission_list.html:50
#: perms/templates/perms/asset_permission_list.html:71
@@ -134,11 +134,11 @@ msgstr "系统用户"
#: applications/templates/applications/remote_app_detail.html:53
#: applications/templates/applications/remote_app_list.html:20
#: applications/templates/applications/user_remote_app_list.html:16
-#: assets/forms/domain.py:73 assets/forms/user.py:84 assets/forms/user.py:148
-#: assets/models/asset.py:64 assets/models/base.py:28
-#: assets/models/cluster.py:18 assets/models/cmd_filter.py:20
-#: assets/models/domain.py:20 assets/models/group.py:20
-#: assets/models/label.py:18 assets/templates/assets/admin_user_detail.html:56
+#: assets/forms/asset.py:20 assets/forms/domain.py:73 assets/forms/user.py:74
+#: assets/forms/user.py:94 assets/models/base.py:28 assets/models/cluster.py:18
+#: assets/models/cmd_filter.py:20 assets/models/domain.py:20
+#: 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:47
#: assets/templates/assets/cmd_filter_detail.html:61
#: assets/templates/assets/cmd_filter_list.html:24
@@ -173,7 +173,7 @@ msgstr "系统用户"
#: users/templates/users/user_list.html:35
#: users/templates/users/user_profile.html:51
#: users/templates/users/user_pubkey_update.html:53
-#: xpack/plugins/change_auth_plan/forms.py:98
+#: xpack/plugins/change_auth_plan/forms.py:97
#: xpack/plugins/change_auth_plan/models.py:61
#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_detail.html:61
#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_list.html:12
@@ -205,16 +205,16 @@ msgstr "参数"
#: applications/models/remote_app.py:43
#: applications/templates/applications/remote_app_detail.html:77
-#: assets/models/asset.py:124 assets/models/base.py:36
+#: assets/models/asset.py:151 assets/models/base.py:36
#: assets/models/cluster.py:28 assets/models/cmd_filter.py:25
#: assets/models/cmd_filter.py:58 assets/models/group.py:21
#: assets/templates/assets/admin_user_detail.html:68
-#: assets/templates/assets/asset_detail.html:128
+#: assets/templates/assets/asset_detail.html:124
#: 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:14
-#: perms/models/asset_permission.py:98 perms/models/base.py:41
+#: perms/models/asset_permission.py:106 perms/models/base.py:41
#: perms/templates/perms/asset_permission_detail.html:98
#: perms/templates/perms/remote_app_permission_detail.html:90
#: users/models/user.py:105 users/serializers/v1.py:116
@@ -229,7 +229,7 @@ msgstr "创建者"
# msgstr "创建者"
#: applications/models/remote_app.py:46
#: applications/templates/applications/remote_app_detail.html:73
-#: assets/models/asset.py:125 assets/models/base.py:34
+#: assets/models/asset.py:152 assets/models/base.py:34
#: assets/models/cluster.py:26 assets/models/domain.py:23
#: assets/models/group.py:22 assets/models/label.py:25
#: assets/templates/assets/admin_user_detail.html:64
@@ -237,7 +237,7 @@ msgstr "创建者"
#: 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:64
-#: orgs/models.py:15 perms/models/asset_permission.py:99
+#: orgs/models.py:15 perms/models/asset_permission.py:107
#: perms/models/base.py:42
#: perms/templates/perms/asset_permission_detail.html:94
#: perms/templates/perms/remote_app_permission_detail.html:86
@@ -257,13 +257,13 @@ msgstr "创建日期"
#: applications/templates/applications/remote_app_detail.html:81
#: applications/templates/applications/remote_app_list.html:24
#: applications/templates/applications/user_remote_app_list.html:20
-#: assets/models/asset.py:126 assets/models/base.py:33
+#: assets/models/asset.py:153 assets/models/base.py:33
#: assets/models/cluster.py:29 assets/models/cmd_filter.py:22
#: assets/models/cmd_filter.py:55 assets/models/domain.py:21
#: assets/models/domain.py:53 assets/models/group.py:23
#: assets/models/label.py:23 assets/templates/assets/admin_user_detail.html:72
#: assets/templates/assets/admin_user_list.html:53
-#: assets/templates/assets/asset_detail.html:136
+#: assets/templates/assets/asset_detail.html:132
#: assets/templates/assets/cmd_filter_detail.html:65
#: assets/templates/assets/cmd_filter_list.html:27
#: assets/templates/assets/cmd_filter_rule_list.html:62
@@ -273,7 +273,7 @@ msgstr "创建日期"
#: assets/templates/assets/system_user_detail.html:104
#: assets/templates/assets/system_user_list.html:59
#: assets/templates/assets/user_asset_list.html:175 ops/models/adhoc.py:43
-#: orgs/models.py:16 perms/models/asset_permission.py:100
+#: orgs/models.py:16 perms/models/asset_permission.py:108
#: perms/models/base.py:43
#: perms/templates/perms/asset_permission_detail.html:102
#: perms/templates/perms/remote_app_permission_detail.html:94
@@ -550,7 +550,7 @@ msgstr "动作"
#: applications/templates/applications/user_remote_app_list.html:57
#: assets/templates/assets/user_asset_list.html:100
-#: perms/models/asset_permission.py:27
+#: perms/models/asset_permission.py:28
msgid "Connect"
msgstr "连接"
@@ -612,29 +612,37 @@ msgid "Reachable"
msgstr "可连接"
#: assets/const.py:79 assets/models/utils.py:45 authentication/utils.py:9
-#: xpack/plugins/license/models.py:78
+#: xpack/plugins/license/models.py:79
msgid "Unknown"
msgstr "未知"
-#: assets/forms/asset.py:51 assets/models/asset.py:95 assets/models/user.py:107
-#: assets/templates/assets/asset_detail.html:194
-#: assets/templates/assets/asset_detail.html:202
+#: assets/forms/asset.py:24 assets/models/asset.py:117
+#: assets/models/domain.py:50
+#: assets/templates/assets/domain_gateway_list.html:69
+#: assets/templates/assets/user_asset_list.html:168
+#: settings/templates/settings/replay_storage_create.html:59
+msgid "Port"
+msgstr "端口"
+
+#: assets/forms/asset.py:45 assets/models/asset.py:122
+#: assets/models/user.py:107 assets/templates/assets/asset_detail.html:190
+#: assets/templates/assets/asset_detail.html:198
#: assets/templates/assets/system_user_assets.html:83
-#: perms/models/asset_permission.py:69
+#: perms/models/asset_permission.py:77
#: xpack/plugins/change_auth_plan/models.py:72
msgid "Nodes"
msgstr "节点"
-#: assets/forms/asset.py:54 assets/forms/asset.py:89 assets/models/asset.py:99
+#: assets/forms/asset.py:48 assets/forms/asset.py:83 assets/models/asset.py:126
#: assets/models/cluster.py:19 assets/models/user.py:65
-#: assets/templates/assets/asset_detail.html:80 templates/_nav.html:24
+#: assets/templates/assets/asset_detail.html:76 templates/_nav.html:24
#: xpack/plugins/cloud/models.py:124
#: xpack/plugins/cloud/templates/cloud/sync_instance_task_detail.html:65
#: xpack/plugins/orgs/templates/orgs/org_list.html:18
msgid "Admin user"
msgstr "管理用户"
-#: assets/forms/asset.py:57 assets/forms/asset.py:92 assets/forms/asset.py:131
+#: assets/forms/asset.py:51 assets/forms/asset.py:86 assets/forms/asset.py:125
#: assets/templates/assets/asset_create.html:48
#: assets/templates/assets/asset_create.html:50
#: assets/templates/assets/asset_list.html:85
@@ -643,23 +651,23 @@ msgstr "管理用户"
msgid "Label"
msgstr "标签"
-#: assets/forms/asset.py:60 assets/forms/asset.py:95 assets/models/asset.py:94
+#: assets/forms/asset.py:54 assets/forms/asset.py:89 assets/models/asset.py:121
#: assets/models/domain.py:26 assets/models/domain.py:52
-#: assets/templates/assets/asset_detail.html:84
+#: assets/templates/assets/asset_detail.html:80
#: assets/templates/assets/user_asset_list.html:173
#: xpack/plugins/orgs/templates/orgs/org_list.html:17
msgid "Domain"
msgstr "网域"
-#: assets/forms/asset.py:64 assets/forms/asset.py:86 assets/forms/asset.py:99
-#: assets/forms/asset.py:134 assets/models/node.py:249
+#: assets/forms/asset.py:58 assets/forms/asset.py:80 assets/forms/asset.py:93
+#: assets/forms/asset.py:128 assets/models/node.py:255
#: assets/templates/assets/asset_create.html:42
-#: perms/forms/asset_permission.py:71 perms/forms/asset_permission.py:79
-#: perms/models/asset_permission.py:93
+#: perms/forms/asset_permission.py:71 perms/forms/asset_permission.py:78
+#: perms/models/asset_permission.py:101
#: perms/templates/perms/asset_permission_list.html:49
#: perms/templates/perms/asset_permission_list.html:70
#: perms/templates/perms/asset_permission_list.html:120
-#: xpack/plugins/change_auth_plan/forms.py:116
+#: xpack/plugins/change_auth_plan/forms.py:115
#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_execution_list.html:55
#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_list.html:15
#: xpack/plugins/cloud/models.py:123
@@ -668,7 +676,7 @@ msgstr "网域"
msgid "Node"
msgstr "节点"
-#: assets/forms/asset.py:68 assets/forms/asset.py:103
+#: assets/forms/asset.py:62 assets/forms/asset.py:97
msgid ""
"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"
@@ -676,19 +684,19 @@ msgstr ""
"root或其他拥有NOPASSWD: ALL权限的用户, 如果是windows或其它硬件可以随意设置一"
"个, 更多信息查看左侧 `管理用户` 菜单"
-#: assets/forms/asset.py:71 assets/forms/asset.py:106
+#: assets/forms/asset.py:65 assets/forms/asset.py:100
msgid "Windows 2016 RDP protocol is different, If is window 2016, set it"
msgstr "Windows 2016的RDP协议与之前不同,如果是请设置"
-#: assets/forms/asset.py:72 assets/forms/asset.py:107
+#: assets/forms/asset.py:66 assets/forms/asset.py:101
msgid ""
"If your have some network not connect with each other, you can set domain"
msgstr "如果有多个的互相隔离的网络,设置资产属于的网域,使用网域网关跳转登录"
-#: assets/forms/asset.py:114 assets/forms/asset.py:118
+#: assets/forms/asset.py:108 assets/forms/asset.py:112
#: assets/forms/domain.py:17 assets/forms/label.py:15
#: perms/templates/perms/asset_permission_asset.html:88
-#: xpack/plugins/change_auth_plan/forms.py:106
+#: xpack/plugins/change_auth_plan/forms.py:105
#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_asset_list.html:84
msgid "Select assets"
msgstr "选择资产"
@@ -705,7 +713,7 @@ msgstr "不能包含特殊字符"
msgid "SSH gateway support proxy SSH,RDP,VNC"
msgstr "SSH网关,支持代理SSH,RDP和VNC"
-#: assets/forms/domain.py:74 assets/forms/user.py:85 assets/forms/user.py:149
+#: assets/forms/domain.py:74 assets/forms/user.py:75 assets/forms/user.py:95
#: assets/models/base.py:29
#: assets/templates/assets/_asset_user_auth_update_modal.html:15
#: assets/templates/assets/_asset_user_auth_view_modal.html:21
@@ -726,7 +734,7 @@ msgstr "SSH网关,支持代理SSH,RDP和VNC"
#: users/templates/users/user_detail.html:67
#: users/templates/users/user_list.html:36
#: users/templates/users/user_profile.html:47
-#: xpack/plugins/change_auth_plan/forms.py:100
+#: xpack/plugins/change_auth_plan/forms.py:99
#: xpack/plugins/change_auth_plan/models.py:63
#: xpack/plugins/change_auth_plan/models.py:409
#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_detail.html:65
@@ -741,7 +749,7 @@ msgid "Password or private key passphrase"
msgstr "密码或密钥密码"
#: assets/forms/user.py:26 assets/models/base.py:30
-#: assets/serializers/asset_user.py:70
+#: assets/serializers/asset_user.py:62
#: assets/templates/assets/_asset_user_auth_update_modal.html:21
#: assets/templates/assets/_asset_user_auth_view_modal.html:27
#: authentication/forms.py:13
@@ -759,7 +767,7 @@ msgstr "密码或密钥密码"
msgid "Password"
msgstr "密码"
-#: assets/forms/user.py:29 assets/serializers/asset_user.py:78
+#: assets/forms/user.py:29 assets/serializers/asset_user.py:70
#: assets/templates/assets/_asset_user_auth_update_modal.html:27
#: users/models/user.py:91
msgid "Private key"
@@ -773,21 +781,17 @@ msgstr "不合法的密钥,仅支持RSA/DSA格式的密钥"
msgid "Password and private key file must be input one"
msgstr "密码和私钥, 必须输入一个"
-#: assets/forms/user.py:136
-msgid "* Automatic login mode must fill in the username."
-msgstr "自动登录模式,必须填写用户名"
-
-#: assets/forms/user.py:151 assets/models/cmd_filter.py:31
+#: assets/forms/user.py:97 assets/models/cmd_filter.py:31
#: assets/models/user.py:115 assets/templates/assets/_system_user.html:66
#: assets/templates/assets/system_user_detail.html:165
msgid "Command filter"
msgstr "命令过滤器"
-#: assets/forms/user.py:155
+#: assets/forms/user.py:101
msgid "Auto push system user to asset"
msgstr "自动推送系统用户到资产"
-#: assets/forms/user.py:156
+#: assets/forms/user.py:102
msgid ""
"1-100, High level will be using login asset as default, if user was granted "
"more than 2 system user"
@@ -795,26 +799,18 @@ msgstr ""
"1-100, 1最低优先级,100最高优先级。授权多个用户时,高优先级的系统用户将会作为"
"默认登录用户"
-#: assets/forms/user.py:158
+#: assets/forms/user.py:104
msgid ""
"If you choose manual login mode, you do not need to fill in the username and "
"password."
msgstr "如果选择手动登录模式,用户名和密码可以不填写"
-#: assets/forms/user.py:160
+#: assets/forms/user.py:106
msgid "Use comma split multi command, ex: /bin/whoami,/bin/ifconfig"
msgstr "使用逗号分隔多个命令,如: /bin/whoami,/sbin/ifconfig"
-#: assets/models/asset.py:65 assets/models/asset.py:90
-#: assets/models/domain.py:50
-#: assets/templates/assets/domain_gateway_list.html:69
-#: assets/templates/assets/user_asset_list.html:168
-#: settings/templates/settings/replay_storage_create.html:59
-msgid "Port"
-msgstr "端口"
-
-#: assets/models/asset.py:85 assets/models/domain.py:49
-#: assets/serializers/asset_user.py:29
+#: assets/models/asset.py:112 assets/models/domain.py:49
+#: assets/serializers/asset_user.py:28
#: assets/templates/assets/_asset_list_modal.html:46
#: assets/templates/assets/_asset_user_list.html:15
#: assets/templates/assets/asset_detail.html:64
@@ -830,7 +826,7 @@ msgstr "端口"
msgid "IP"
msgstr "IP"
-#: assets/models/asset.py:86 assets/serializers/asset_user.py:28
+#: assets/models/asset.py:113 assets/serializers/asset_user.py:27
#: assets/templates/assets/_asset_list_modal.html:45
#: assets/templates/assets/_asset_user_auth_update_modal.html:9
#: assets/templates/assets/_asset_user_auth_view_modal.html:15
@@ -847,9 +843,8 @@ msgstr "IP"
msgid "Hostname"
msgstr "主机名"
-#: assets/models/asset.py:89 assets/models/asset.py:92
-#: assets/models/domain.py:51 assets/models/user.py:110
-#: assets/templates/assets/asset_detail.html:72
+#: assets/models/asset.py:116 assets/models/domain.py:51
+#: assets/models/user.py:110 assets/templates/assets/asset_detail.html:72
#: assets/templates/assets/domain_gateway_list.html:70
#: assets/templates/assets/system_user_detail.html:70
#: assets/templates/assets/system_user_list.html:53
@@ -859,86 +854,91 @@ msgstr "主机名"
msgid "Protocol"
msgstr "协议"
-#: assets/models/asset.py:93 assets/templates/assets/asset_detail.html:108
+#: assets/models/asset.py:119 assets/serializers/asset.py:63
+#: assets/templates/assets/asset_create.html:24
+msgid "Protocols"
+msgstr "协议组"
+
+#: assets/models/asset.py:120 assets/templates/assets/asset_detail.html:104
#: assets/templates/assets/user_asset_list.html:170
msgid "Platform"
msgstr "系统平台"
-#: assets/models/asset.py:96 assets/models/cmd_filter.py:21
+#: assets/models/asset.py:123 assets/models/cmd_filter.py:21
#: assets/models/domain.py:54 assets/models/label.py:22
-#: assets/templates/assets/asset_detail.html:116
+#: assets/templates/assets/asset_detail.html:112
#: assets/templates/assets/user_asset_list.html:174
msgid "Is active"
msgstr "激活"
-#: assets/models/asset.py:102 assets/templates/assets/asset_detail.html:68
+#: assets/models/asset.py:129 assets/templates/assets/asset_detail.html:68
msgid "Public IP"
msgstr "公网IP"
-#: assets/models/asset.py:103 assets/templates/assets/asset_detail.html:124
+#: assets/models/asset.py:130 assets/templates/assets/asset_detail.html:120
msgid "Asset number"
msgstr "资产编号"
-#: assets/models/asset.py:106 assets/templates/assets/asset_detail.html:88
+#: assets/models/asset.py:133 assets/templates/assets/asset_detail.html:84
msgid "Vendor"
msgstr "制造商"
-#: assets/models/asset.py:107 assets/templates/assets/asset_detail.html:92
+#: assets/models/asset.py:134 assets/templates/assets/asset_detail.html:88
msgid "Model"
msgstr "型号"
-#: assets/models/asset.py:108 assets/templates/assets/asset_detail.html:120
+#: assets/models/asset.py:135 assets/templates/assets/asset_detail.html:116
msgid "Serial number"
msgstr "序列号"
-#: assets/models/asset.py:110
+#: assets/models/asset.py:137
msgid "CPU model"
msgstr "CPU型号"
-#: assets/models/asset.py:111
+#: assets/models/asset.py:138
#: xpack/plugins/license/templates/license/license_detail.html:80
msgid "CPU count"
msgstr "CPU数量"
-#: assets/models/asset.py:112
+#: assets/models/asset.py:139
msgid "CPU cores"
msgstr "CPU核数"
-#: assets/models/asset.py:113
+#: assets/models/asset.py:140
msgid "CPU vcpus"
msgstr "CPU总数"
-#: assets/models/asset.py:114 assets/templates/assets/asset_detail.html:100
+#: assets/models/asset.py:141 assets/templates/assets/asset_detail.html:96
msgid "Memory"
msgstr "内存"
-#: assets/models/asset.py:115
+#: assets/models/asset.py:142
msgid "Disk total"
msgstr "硬盘大小"
-#: assets/models/asset.py:116
+#: assets/models/asset.py:143
msgid "Disk info"
msgstr "硬盘信息"
-#: assets/models/asset.py:118 assets/templates/assets/asset_detail.html:112
+#: assets/models/asset.py:145 assets/templates/assets/asset_detail.html:108
#: assets/templates/assets/user_asset_list.html:171
msgid "OS"
msgstr "操作系统"
-#: assets/models/asset.py:119
+#: assets/models/asset.py:146
msgid "OS version"
msgstr "系统版本"
-#: assets/models/asset.py:120
+#: assets/models/asset.py:147
msgid "OS arch"
msgstr "系统架构"
-#: assets/models/asset.py:121
+#: assets/models/asset.py:148
msgid "Hostname raw"
msgstr "主机名原始"
-#: assets/models/asset.py:123 assets/templates/assets/asset_create.html:46
-#: assets/templates/assets/asset_detail.html:231 templates/_nav.html:26
+#: assets/models/asset.py:150 assets/templates/assets/asset_create.html:46
+#: assets/templates/assets/asset_detail.html:227 templates/_nav.html:26
msgid "Labels"
msgstr "标签管理"
@@ -1008,7 +1008,7 @@ msgid "Default"
msgstr "默认"
#: assets/models/cluster.py:36 assets/models/label.py:14
-#: users/models/user.py:443
+#: users/models/user.py:453
msgid "System"
msgstr "系统"
@@ -1127,7 +1127,7 @@ msgstr "默认资产组"
#: terminal/templates/terminal/command_list.html:65
#: terminal/templates/terminal/session_list.html:27
#: terminal/templates/terminal/session_list.html:71 users/forms.py:316
-#: users/models/user.py:38 users/models/user.py:431 users/serializers/v1.py:105
+#: users/models/user.py:38 users/models/user.py:441 users/serializers/v1.py:105
#: users/templates/users/user_group_detail.html:78
#: users/templates/users/user_group_list.html:36 users/views/user.py:251
#: xpack/plugins/orgs/forms.py:26
@@ -1136,7 +1136,7 @@ msgstr "默认资产组"
msgid "User"
msgstr "用户"
-#: assets/models/label.py:19 assets/models/node.py:241
+#: assets/models/label.py:19 assets/models/node.py:246
#: assets/templates/assets/label_list.html:15 settings/models.py:30
msgid "Value"
msgstr "值"
@@ -1145,11 +1145,11 @@ msgstr "值"
msgid "Category"
msgstr "分类"
-#: assets/models/node.py:240
+#: assets/models/node.py:245
msgid "Key"
msgstr "键"
-#: assets/models/node.py:297
+#: assets/models/node.py:303
msgid "New node"
msgstr "新节点"
@@ -1166,10 +1166,10 @@ msgstr "手动登录"
#: assets/templates/assets/system_user_assets.html:22
#: assets/templates/assets/system_user_detail.html:22
#: assets/views/admin_user.py:30 assets/views/admin_user.py:49
-#: assets/views/admin_user.py:66 assets/views/admin_user.py:82
-#: assets/views/admin_user.py:107 assets/views/asset.py:52
-#: assets/views/asset.py:69 assets/views/asset.py:128 assets/views/asset.py:171
-#: assets/views/asset.py:199 assets/views/asset.py:231
+#: assets/views/admin_user.py:67 assets/views/admin_user.py:84
+#: assets/views/admin_user.py:109 assets/views/asset.py:40
+#: assets/views/asset.py:57 assets/views/asset.py:106 assets/views/asset.py:133
+#: assets/views/asset.py:173 assets/views/asset.py:203
#: assets/views/cmd_filter.py:31 assets/views/cmd_filter.py:48
#: assets/views/cmd_filter.py:65 assets/views/cmd_filter.py:82
#: assets/views/cmd_filter.py:102 assets/views/cmd_filter.py:136
@@ -1208,37 +1208,33 @@ msgstr "登录模式"
msgid "%(value)s is not an even number"
msgstr "%(value)s is not an even number"
-#: assets/serializers/admin_user.py:36 assets/serializers/asset.py:46
-#: assets/serializers/asset_user.py:30 assets/serializers/system_user.py:30
+#: assets/serializers/admin_user.py:36 assets/serializers/asset.py:64
+#: assets/serializers/asset_user.py:29 assets/serializers/system_user.py:31
#: assets/templates/assets/_asset_user_list.html:18
msgid "Connectivity"
msgstr "连接"
-#: assets/serializers/asset.py:44 assets/templates/assets/asset_create.html:24
-msgid "Protocols"
-msgstr "协议组"
+#: assets/serializers/asset.py:21
+msgid "Protocol format should {}/{}"
+msgstr ""
-#: assets/serializers/asset.py:72
-msgid "Hardware info"
-msgstr "硬件信息"
-
-#: assets/serializers/asset.py:73 orgs/mixins/serializers.py:26
-msgid "Org name"
-msgstr "组织名称"
-
-#: assets/serializers/asset.py:91
+#: assets/serializers/asset.py:38
msgid "Protocol duplicate: {}"
msgstr "协议重复: {}"
-#: assets/serializers/asset_user.py:32
+#: assets/serializers/asset.py:90
+msgid "Hardware info"
+msgstr "硬件信息"
+
+#: assets/serializers/asset.py:91 orgs/mixins/serializers.py:26
+msgid "Org name"
+msgstr "组织名称"
+
+#: assets/serializers/asset_user.py:31
msgid "Backend"
msgstr "后端"
-#: assets/serializers/asset_user.py:57
-msgid "private key invalid"
-msgstr "密钥不合法"
-
-#: assets/serializers/asset_user.py:74 users/forms.py:263
+#: assets/serializers/asset_user.py:66 users/forms.py:263
#: users/models/user.py:94 users/templates/users/first_login.html:42
#: users/templates/users/user_password_update.html:46
#: users/templates/users/user_profile.html:68
@@ -1247,14 +1243,26 @@ msgstr "密钥不合法"
msgid "Public key"
msgstr "ssh公钥"
+#: assets/serializers/base.py:44
+msgid "private key invalid"
+msgstr "密钥不合法"
+
#: assets/serializers/node.py:33
msgid "The same level node name cannot be the same"
msgstr "同级别节点名字不能重复"
-#: assets/serializers/system_user.py:31
+#: assets/serializers/system_user.py:32
msgid "Login mode display"
msgstr "登录模式显示"
+#: assets/serializers/system_user.py:67
+msgid "* Automatic login mode must fill in the username."
+msgstr "自动登录模式,必须填写用户名"
+
+#: assets/serializers/system_user.py:76
+msgid "Password or private key required"
+msgstr "密码或密钥密码需要一个"
+
#: assets/tasks.py:33
msgid "Asset has been disabled, skipped: {}"
msgstr "资产或许不支持ansible, 跳过: {}"
@@ -1334,7 +1342,7 @@ msgstr "推送系统用户到入资产: {}"
msgid "Push system users to asset: {} => {}"
msgstr "推送系统用户到入资产: {} => {}"
-#: assets/tasks.py:602
+#: assets/tasks.py:603
msgid "Test asset user connectivity: {}"
msgstr "测试资产用户可连接性: {}"
@@ -1343,7 +1351,7 @@ msgid "Import admin user"
msgstr "导入管理用户"
#: assets/templates/assets/_admin_user_update_modal.html:4
-#: assets/views/admin_user.py:67
+#: assets/views/admin_user.py:68
msgid "Update admin user"
msgstr "更新管理用户"
@@ -1379,7 +1387,7 @@ msgstr "启用MFA"
msgid "Import assets"
msgstr "导入资产"
-#: assets/templates/assets/_asset_list_modal.html:7 assets/views/asset.py:53
+#: assets/templates/assets/_asset_list_modal.html:7 assets/views/asset.py:41
#: templates/_nav.html:22 xpack/plugins/change_auth_plan/views.py:116
msgid "Asset list"
msgstr "资产列表"
@@ -1393,12 +1401,12 @@ msgid "Update asset user auth"
msgstr "更新资产用户认证信息"
#: assets/templates/assets/_asset_user_auth_update_modal.html:23
-#: xpack/plugins/change_auth_plan/forms.py:102
+#: xpack/plugins/change_auth_plan/forms.py:101
msgid "Please input password"
msgstr "请输入密码"
#: assets/templates/assets/_asset_user_auth_update_modal.html:68
-#: assets/templates/assets/asset_detail.html:311
+#: assets/templates/assets/asset_detail.html:307
#: users/templates/users/user_detail.html:307
#: users/templates/users/user_detail.html:334
#: xpack/plugins/interface/views.py:35
@@ -1446,7 +1454,7 @@ msgstr "查看"
#: assets/templates/assets/_asset_user_list.html:71
#: assets/templates/assets/admin_user_assets.html:61
#: assets/templates/assets/asset_asset_user_list.html:57
-#: assets/templates/assets/asset_detail.html:182
+#: assets/templates/assets/asset_detail.html:178
#: assets/templates/assets/system_user_assets.html:63
#: assets/templates/assets/system_user_detail.html:151
msgid "Test"
@@ -1539,7 +1547,7 @@ msgstr "更新系统用户"
#: assets/templates/assets/_user_asset_detail_modal.html:11
#: assets/templates/assets/asset_asset_user_list.html:13
-#: assets/templates/assets/asset_detail.html:20 assets/views/asset.py:232
+#: assets/templates/assets/asset_detail.html:20 assets/views/asset.py:204
msgid "Asset detail"
msgstr "资产详情"
@@ -1564,7 +1572,7 @@ msgstr "快速更新"
#: assets/templates/assets/admin_user_assets.html:58
#: assets/templates/assets/asset_asset_user_list.html:54
-#: assets/templates/assets/asset_detail.html:179
+#: assets/templates/assets/asset_detail.html:175
msgid "Test connective"
msgstr "测试可连接性"
@@ -1574,13 +1582,13 @@ msgstr "替换资产的管理员"
#: assets/templates/assets/admin_user_detail.html:91
#: perms/templates/perms/asset_permission_asset.html:116
-#: xpack/plugins/change_auth_plan/forms.py:110
+#: xpack/plugins/change_auth_plan/forms.py:109
#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_asset_list.html:112
msgid "Select nodes"
msgstr "选择节点"
#: assets/templates/assets/admin_user_detail.html:100
-#: assets/templates/assets/asset_detail.html:211
+#: assets/templates/assets/asset_detail.html:207
#: assets/templates/assets/asset_list.html:396
#: assets/templates/assets/cmd_filter_detail.html:106
#: assets/templates/assets/system_user_assets.html:100
@@ -1663,12 +1671,12 @@ msgstr "比例"
#: users/templates/users/user_group_list.html:194
#: users/templates/users/user_list.html:158
#: users/templates/users/user_list.html:190
-#: xpack/plugins/vault/templates/vault/vault.html:223
+#: xpack/plugins/vault/templates/vault/vault.html:224
msgid "Please select file"
msgstr "选择文件"
#: assets/templates/assets/asset_asset_user_list.html:16
-#: assets/templates/assets/asset_detail.html:23 assets/views/asset.py:70
+#: assets/templates/assets/asset_detail.html:23 assets/views/asset.py:58
msgid "Asset user list"
msgstr "资产用户列表"
@@ -1677,7 +1685,7 @@ msgid "Asset users of"
msgstr "资产用户"
#: assets/templates/assets/asset_asset_user_list.html:47
-#: assets/templates/assets/asset_detail.html:148
+#: assets/templates/assets/asset_detail.html:144
#: terminal/templates/terminal/session_detail.html:81
#: users/templates/users/user_detail.html:138
#: users/templates/users/user_profile.html:146
@@ -1696,23 +1704,23 @@ msgstr "选择需要修改属性"
msgid "Select all"
msgstr "全选"
-#: assets/templates/assets/asset_detail.html:96
+#: assets/templates/assets/asset_detail.html:92
msgid "CPU"
msgstr "CPU"
-#: assets/templates/assets/asset_detail.html:104
+#: assets/templates/assets/asset_detail.html:100
msgid "Disk"
msgstr "硬盘"
-#: assets/templates/assets/asset_detail.html:132
+#: assets/templates/assets/asset_detail.html:128
#: users/templates/users/user_detail.html:115
#: users/templates/users/user_profile.html:104
msgid "Date joined"
msgstr "创建日期"
-#: assets/templates/assets/asset_detail.html:154
+#: assets/templates/assets/asset_detail.html:150
#: assets/templates/assets/user_asset_list.html:46
-#: perms/models/asset_permission.py:96 perms/models/base.py:38
+#: perms/models/asset_permission.py:104 perms/models/base.py:38
#: perms/templates/perms/asset_permission_create_update.html:55
#: perms/templates/perms/asset_permission_detail.html:120
#: perms/templates/perms/remote_app_permission_create_update.html:54
@@ -1726,11 +1734,11 @@ msgstr "创建日期"
msgid "Active"
msgstr "激活中"
-#: assets/templates/assets/asset_detail.html:171
+#: assets/templates/assets/asset_detail.html:167
msgid "Refresh hardware"
msgstr "更新硬件信息"
-#: assets/templates/assets/asset_detail.html:174
+#: assets/templates/assets/asset_detail.html:170
msgid "Refresh"
msgstr "刷新"
@@ -1743,7 +1751,7 @@ msgstr ""
"左侧是资产树,右击可以新建、删除、更改树节点,授权资产也是以节点方式组织的,"
"右侧是属于该节点下的资产"
-#: assets/templates/assets/asset_list.html:61 assets/views/asset.py:129
+#: assets/templates/assets/asset_list.html:61 assets/views/asset.py:107
msgid "Create asset"
msgstr "创建资产"
@@ -2038,26 +2046,26 @@ msgstr "系统用户删除失败"
msgid "Admin user list"
msgstr "管理用户列表"
-#: assets/views/admin_user.py:83 assets/views/admin_user.py:108
+#: assets/views/admin_user.py:85 assets/views/admin_user.py:110
msgid "Admin user detail"
msgstr "管理用户详情"
-#: assets/views/asset.py:82 templates/_nav_user.html:4
+#: assets/views/asset.py:70 templates/_nav_user.html:4
msgid "My assets"
msgstr "我的资产"
-#: assets/views/asset.py:144
+#: assets/views/asset.py:134
+msgid "Update asset"
+msgstr "更新资产"
+
+#: assets/views/asset.py:146
msgid "Bulk update asset success"
msgstr "批量更新资产成功"
-#: assets/views/asset.py:172
+#: assets/views/asset.py:174
msgid "Bulk update asset"
msgstr "批量更新资产"
-#: assets/views/asset.py:200
-msgid "Update asset"
-msgstr "更新资产"
-
#: assets/views/cmd_filter.py:32
msgid "Command filter list"
msgstr "命令过滤器列表"
@@ -2437,7 +2445,7 @@ msgstr "代码错误"
#: authentication/templates/authentication/login.html:27
#: authentication/templates/authentication/login_otp.html:27
#: users/templates/users/reset_password.html:25
-#: xpack/plugins/interface/models.py:36
+#: xpack/plugins/interface/models.py:39
msgid "Welcome to the Jumpserver open source fortress"
msgstr "欢迎使用Jumpserver开源堡垒机"
@@ -2973,7 +2981,7 @@ msgstr "更新任务内容: {}"
#: ops/views/adhoc.py:45 ops/views/adhoc.py:71 ops/views/adhoc.py:85
#: ops/views/adhoc.py:99 ops/views/adhoc.py:113 ops/views/adhoc.py:127
-#: ops/views/adhoc.py:141 ops/views/command.py:47 ops/views/command.py:72
+#: ops/views/adhoc.py:141 ops/views/command.py:47 ops/views/command.py:77
msgid "Ops"
msgstr "作业中心"
@@ -2989,7 +2997,7 @@ msgstr "执行历史"
msgid "Command execution list"
msgstr "命令执行列表"
-#: ops/views/command.py:73 templates/_nav_user.html:26
+#: ops/views/command.py:78 templates/_nav_user.html:26
msgid "Command execution"
msgstr "命令执行"
@@ -2998,7 +3006,7 @@ msgid "Organization"
msgstr "组织"
#: perms/forms/asset_permission.py:65 perms/forms/remote_app_permission.py:34
-#: perms/models/asset_permission.py:94 perms/models/base.py:37
+#: perms/models/asset_permission.py:102 perms/models/base.py:37
#: perms/templates/perms/asset_permission_list.html:47
#: perms/templates/perms/asset_permission_list.html:67
#: perms/templates/perms/asset_permission_list.html:114
@@ -3011,46 +3019,46 @@ msgstr "组织"
msgid "User group"
msgstr "用户组"
-#: perms/forms/asset_permission.py:82
+#: perms/forms/asset_permission.py:81
msgid ""
"Tips: The RDP protocol does not support separate controls for uploading or "
"downloading files"
msgstr "提示:RDP 协议不支持单独控制上传或下载文件"
-#: perms/forms/asset_permission.py:92 perms/forms/remote_app_permission.py:47
+#: perms/forms/asset_permission.py:91 perms/forms/remote_app_permission.py:47
msgid "User or group at least one required"
msgstr "用户和用户组至少选一个"
-#: perms/forms/asset_permission.py:101
+#: perms/forms/asset_permission.py:100
msgid "Asset or group at least one required"
msgstr "资产和节点至少选一个"
-#: perms/models/asset_permission.py:26 settings/forms.py:143
+#: perms/models/asset_permission.py:27 settings/forms.py:143
msgid "All"
msgstr "全部"
-#: perms/models/asset_permission.py:28
+#: perms/models/asset_permission.py:29
msgid "Upload file"
msgstr "上传文件"
-#: perms/models/asset_permission.py:29
+#: perms/models/asset_permission.py:30
msgid "Download file"
msgstr "下载文件"
-#: perms/models/asset_permission.py:30
+#: perms/models/asset_permission.py:31
msgid "Upload download"
msgstr "上传下载"
-#: perms/models/asset_permission.py:72
+#: perms/models/asset_permission.py:80
msgid "Actions"
msgstr "动作"
-#: perms/models/asset_permission.py:76 perms/models/asset_permission.py:106
+#: perms/models/asset_permission.py:84 perms/models/asset_permission.py:114
#: templates/_nav.html:44
msgid "Asset permission"
msgstr "资产授权"
-#: perms/models/asset_permission.py:97 perms/models/base.py:40
+#: perms/models/asset_permission.py:105 perms/models/base.py:40
#: perms/templates/perms/asset_permission_detail.html:90
#: perms/templates/perms/remote_app_permission_detail.html:82
#: users/models/user.py:102 users/templates/users/user_detail.html:107
@@ -4373,11 +4381,11 @@ msgid ""
"You should use your ssh client tools connect terminal: {}
{}"
msgstr "你可以使用ssh客户端工具连接终端"
-#: users/api/user.py:93
+#: users/api/user.py:97
msgid "You do not have permission."
msgstr "你没有权限"
-#: users/api/user.py:186
+#: users/api/user.py:190
msgid "Could not reset self otp, use profile reset instead"
msgstr "不能再该页面重置MFA, 请去个人信息页面重置"
@@ -4494,7 +4502,7 @@ msgstr "复制你的公钥到这里"
msgid "Select users"
msgstr "选择用户"
-#: users/models/user.py:37 users/models/user.py:439
+#: users/models/user.py:37 users/models/user.py:449
msgid "Administrator"
msgstr "管理员"
@@ -4544,7 +4552,7 @@ msgstr "最后更新密码日期"
msgid "User auth from {}, go there change password"
msgstr "用户认证源来自 {}, 请去相应系统修改密码"
-#: users/models/user.py:442
+#: users/models/user.py:452
msgid "Administrator is the super user of system"
msgstr "Administrator是初始的超级管理员"
@@ -5305,26 +5313,25 @@ msgid "Password length"
msgstr "密码长度"
#: xpack/plugins/change_auth_plan/forms.py:45
-#: xpack/plugins/change_auth_plan/models.py:213
-msgid "* For security, do not change {} user's password"
-msgstr "* 为了安全,禁止更改 {} 用户的密码"
+msgid "* For security, please do not change root user's password"
+msgstr "* 为了安全,请不要更改root用户的密码"
-#: xpack/plugins/change_auth_plan/forms.py:55
+#: xpack/plugins/change_auth_plan/forms.py:54
msgid "* Please enter custom password"
msgstr "* 请输入自定义密码"
-#: xpack/plugins/change_auth_plan/forms.py:64
+#: xpack/plugins/change_auth_plan/forms.py:63
msgid "* Please enter a valid crontab expression"
msgstr "* 请输入有效的 crontab 表达式"
-#: xpack/plugins/change_auth_plan/forms.py:117
+#: xpack/plugins/change_auth_plan/forms.py:116
#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_create_update.html:60
#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_detail.html:81
#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_list.html:17
msgid "Periodic perform"
msgstr "定时执行"
-#: xpack/plugins/change_auth_plan/forms.py:121
+#: xpack/plugins/change_auth_plan/forms.py:120
msgid ""
"Tips: The username of the user on the asset to be modified. if the user "
"exists, change the password; If the user does not exist, create the user."
@@ -5332,11 +5339,11 @@ msgstr ""
"提示:用户名为将要修改的资产上的用户的用户名。如果用户存在,则修改密码;如果"
"用户不存在,则创建用户。"
-#: xpack/plugins/change_auth_plan/forms.py:125
+#: xpack/plugins/change_auth_plan/forms.py:124
msgid "Tips: (Units: hour)"
msgstr "提示:(单位: 时)"
-#: xpack/plugins/change_auth_plan/forms.py:126
+#: xpack/plugins/change_auth_plan/forms.py:125
msgid ""
"eg: Every Sunday 03:05 run <5 3 * * 0>
Tips: Using 5 digits linux "
"crontab expressions ( 0;
+ if (hasFile) {
+ var reader = new FileReader();//新建一个FileReader
+ console.log(typeof files[0]);
+ reader.readAsText(files[0], "UTF-8");//读取文件
+ reader.onload = function(evt){ //读取完文件之后会回来这里
+ ref.trigger("onload", evt.target.result);
+ };
+ } else {
+ ref.trigger("onload", null);
+ }
+
+ return ref
+}
+