From 26a7fa836cbda5dbfa77d97e4ab74b05a12cead9 Mon Sep 17 00:00:00 2001 From: xinwen Date: Wed, 14 Jul 2021 11:17:48 +0800 Subject: [PATCH 1/9] =?UTF-8?q?fix:=20=E7=BD=91=E5=85=B3=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E8=BF=9E=E6=8E=A5=20500?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/assets/models/domain.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/assets/models/domain.py b/apps/assets/models/domain.py index 4d500e503..e39cca48e 100644 --- a/apps/assets/models/domain.py +++ b/apps/assets/models/domain.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # - +import socket import uuid import random import re @@ -80,7 +80,8 @@ class Gateway(BaseUser): except(paramiko.AuthenticationException, paramiko.BadAuthenticationType, paramiko.SSHException, - paramiko.ssh_exception.NoValidConnectionsError) as e: + paramiko.ssh_exception.NoValidConnectionsError, + socket.gaierror) as e: return False, str(e) try: From 7d4be819b83861928f6ba14534fe940f360e5132 Mon Sep 17 00:00:00 2001 From: Bai Date: Wed, 14 Jul 2021 11:31:09 +0800 Subject: [PATCH 2/9] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E8=B5=84=E4=BA=A7=E5=AF=BC=E5=87=BA=E6=96=87?= =?UTF-8?q?=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/assets/serializers/system_user.py | 4 +- apps/locale/zh/LC_MESSAGES/django.po | 113 +++++++++---------------- 2 files changed, 41 insertions(+), 76 deletions(-) diff --git a/apps/assets/serializers/system_user.py b/apps/assets/serializers/system_user.py index adeadbe01..12f383944 100644 --- a/apps/assets/serializers/system_user.py +++ b/apps/assets/serializers/system_user.py @@ -236,7 +236,7 @@ class SystemUserSimpleSerializer(serializers.ModelSerializer): class RelationMixin(BulkSerializerMixin, serializers.Serializer): - systemuser_display = serializers.ReadOnlyField(label=_("System user")) + systemuser_display = serializers.ReadOnlyField(label=_("System user name")) def get_field_names(self, declared_fields, info): fields = super().get_field_names(declared_fields, info) @@ -245,7 +245,7 @@ class RelationMixin(BulkSerializerMixin, serializers.Serializer): class SystemUserAssetRelationSerializer(RelationMixin, serializers.ModelSerializer): - asset_display = serializers.ReadOnlyField(label=_('Asset')) + asset_display = serializers.ReadOnlyField(label=_('Asset hostname')) class Meta: model = SystemUser.assets.through diff --git a/apps/locale/zh/LC_MESSAGES/django.po b/apps/locale/zh/LC_MESSAGES/django.po index c9122bf1b..9432f6442 100644 --- a/apps/locale/zh/LC_MESSAGES/django.po +++ b/apps/locale/zh/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: JumpServer 0.3.3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-07-13 16:52+0800\n" +"POT-Creation-Date: 2021-07-14 11:27+0800\n" "PO-Revision-Date: 2021-05-20 10:54+0800\n" "Last-Translator: ibuler \n" "Language-Team: JumpServer team\n" @@ -25,7 +25,7 @@ msgstr "" #: orgs/models.py:23 perms/models/base.py:49 settings/models.py:29 #: terminal/models/storage.py:23 terminal/models/task.py:16 #: terminal/models/terminal.py:100 users/forms/profile.py:32 -#: users/models/group.py:15 users/models/user.py:550 +#: users/models/group.py:15 users/models/user.py:551 #: users/templates/users/_select_user_modal.html:13 #: users/templates/users/user_asset_permission.html:37 #: users/templates/users/user_asset_permission.html:154 @@ -61,7 +61,7 @@ msgstr "激活中" #: orgs/models.py:26 perms/models/base.py:57 settings/models.py:34 #: terminal/models/storage.py:26 terminal/models/terminal.py:114 #: tickets/models/ticket.py:73 users/models/group.py:16 -#: users/models/user.py:583 xpack/plugins/change_auth_plan/models.py:77 +#: users/models/user.py:584 xpack/plugins/change_auth_plan/models.py:77 #: xpack/plugins/cloud/models.py:35 xpack/plugins/cloud/models.py:98 #: xpack/plugins/gathered_user/models.py:26 msgid "Comment" @@ -99,7 +99,7 @@ msgstr "动作" #: terminal/backends/command/models.py:18 #: terminal/backends/command/serializers.py:12 terminal/models/session.py:38 #: tickets/models/comment.py:17 users/models/user.py:176 -#: users/models/user.py:746 users/models/user.py:772 +#: users/models/user.py:747 users/models/user.py:773 #: users/serializers/group.py:19 #: users/templates/users/user_asset_permission.html:38 #: users/templates/users/user_asset_permission.html:64 @@ -121,9 +121,9 @@ msgstr "系统用户" #: applications/serializers/attrs/application_category/remote_app.py:33 #: assets/models/asset.py:357 assets/models/authbook.py:15 #: assets/models/gathered_user.py:14 assets/serializers/admin_user.py:33 -#: assets/serializers/system_user.py:223 assets/serializers/system_user.py:248 -#: audits/models.py:38 perms/models/asset_permission.py:99 -#: templates/index.html:82 terminal/backends/command/models.py:19 +#: assets/serializers/system_user.py:223 audits/models.py:38 +#: perms/models/asset_permission.py:99 templates/index.html:82 +#: terminal/backends/command/models.py:19 #: terminal/backends/command/serializers.py:13 terminal/models/session.py:40 #: users/templates/users/user_asset_permission.html:40 #: users/templates/users/user_asset_permission.html:70 @@ -179,7 +179,7 @@ msgstr "格式为逗号分隔的字符串, * 表示匹配所有. " #: applications/serializers/attrs/application_type/vmware_client.py:26 #: assets/models/base.py:173 assets/models/gathered_user.py:15 #: audits/models.py:100 authentication/forms.py:15 authentication/forms.py:17 -#: ops/models/adhoc.py:148 users/forms/profile.py:31 users/models/user.py:548 +#: ops/models/adhoc.py:148 users/forms/profile.py:31 users/models/user.py:549 #: users/templates/users/_select_user_modal.html:14 #: xpack/plugins/change_auth_plan/models.py:47 #: xpack/plugins/change_auth_plan/models.py:278 @@ -490,7 +490,7 @@ msgstr "标签管理" #: assets/models/cluster.py:28 assets/models/cmd_filter.py:26 #: assets/models/cmd_filter.py:67 assets/models/group.py:21 #: common/db/models.py:70 common/mixins/models.py:49 orgs/models.py:24 -#: orgs/models.py:422 perms/models/base.py:55 users/models/user.py:591 +#: orgs/models.py:422 perms/models/base.py:55 users/models/user.py:592 #: users/serializers/group.py:33 xpack/plugins/change_auth_plan/models.py:81 #: xpack/plugins/cloud/models.py:104 xpack/plugins/gathered_user/models.py:30 msgid "Created by" @@ -504,12 +504,11 @@ msgstr "创建者" #: assets/models/label.py:25 common/db/models.py:72 common/mixins/models.py:50 #: ops/models/adhoc.py:38 ops/models/command.py:29 orgs/models.py:25 #: orgs/models.py:420 perms/models/base.py:56 users/models/group.py:18 -#: users/models/user.py:773 xpack/plugins/cloud/models.py:107 +#: users/models/user.py:774 xpack/plugins/cloud/models.py:107 msgid "Date created" msgstr "创建日期" -#: assets/models/authbook.py:16 assets/models/user.py:276 -#: assets/serializers/system_user.py:239 audits/models.py:39 +#: assets/models/authbook.py:16 assets/models/user.py:276 audits/models.py:39 #: perms/models/application_permission.py:31 #: perms/models/asset_permission.py:101 templates/_nav.html:45 #: terminal/backends/command/models.py:20 @@ -577,7 +576,7 @@ msgstr "带宽" msgid "Contact" msgstr "联系人" -#: assets/models/cluster.py:22 users/models/user.py:569 +#: assets/models/cluster.py:22 users/models/user.py:570 msgid "Phone" msgstr "手机" @@ -603,7 +602,7 @@ msgid "Default" msgstr "默认" #: assets/models/cluster.py:36 assets/models/label.py:14 -#: users/models/user.py:758 +#: users/models/user.py:759 msgid "System" msgstr "系统" @@ -875,6 +874,14 @@ msgstr "路径应该以 / 开头" msgid "Password or private key required" msgstr "密码或密钥密码需要一个" +#: assets/serializers/system_user.py:239 +msgid "System user name" +msgstr "系统用户名称" + +#: assets/serializers/system_user.py:248 +msgid "Asset hostname" +msgstr "资产主机名" + #: assets/tasks/account_connectivity.py:30 msgid "The asset {} system platform {} does not support run Ansible tasks" msgstr "资产 {} 系统平台 {} 不支持运行 Ansible 任务" @@ -1110,7 +1117,7 @@ msgstr "用户代理" #: audits/models.py:105 #: authentication/templates/authentication/_mfa_confirm_modal.html:14 #: authentication/templates/authentication/login_otp.html:6 -#: users/forms/profile.py:64 users/models/user.py:572 +#: users/forms/profile.py:64 users/models/user.py:573 #: users/serializers/profile.py:102 msgid "MFA" msgstr "多因子认证" @@ -1435,13 +1442,13 @@ msgid "Show" msgstr "显示" #: authentication/templates/authentication/_access_key_modal.html:66 -#: users/models/user.py:462 users/serializers/profile.py:99 +#: users/models/user.py:463 users/serializers/profile.py:99 #: users/templates/users/user_verify_mfa.html:32 msgid "Disable" msgstr "禁用" #: authentication/templates/authentication/_access_key_modal.html:67 -#: users/models/user.py:463 users/serializers/profile.py:100 +#: users/models/user.py:464 users/serializers/profile.py:100 msgid "Enable" msgstr "启用" @@ -1814,7 +1821,7 @@ msgstr "" "div>" #: notifications/backends/__init__.py:11 users/forms/profile.py:101 -#: users/models/user.py:552 +#: users/models/user.py:553 msgid "Email" msgstr "邮件" @@ -2007,7 +2014,7 @@ msgstr "组织审计员" msgid "GLOBAL" msgstr "全局组织" -#: orgs/models.py:419 users/models/user.py:560 +#: orgs/models.py:419 users/models/user.py:561 #: users/templates/users/_select_user_modal.html:15 msgid "Role" msgstr "角色" @@ -2079,7 +2086,7 @@ msgid "Favorite" msgstr "收藏夹" #: perms/models/base.py:51 templates/_nav.html:21 users/models/group.py:31 -#: users/models/user.py:556 users/templates/users/_select_user_modal.html:16 +#: users/models/user.py:557 users/templates/users/_select_user_modal.html:16 #: users/templates/users/user_asset_permission.html:39 #: users/templates/users/user_asset_permission.html:67 #: users/templates/users/user_database_app_permission.html:38 @@ -2092,7 +2099,7 @@ msgstr "用户组" #: tickets/serializers/ticket/meta/ticket_type/apply_application.py:77 #: tickets/serializers/ticket/meta/ticket_type/apply_asset.py:43 #: tickets/serializers/ticket/meta/ticket_type/apply_asset.py:81 -#: users/models/user.py:588 +#: users/models/user.py:589 msgid "Date expired" msgstr "失效日期" @@ -3885,7 +3892,7 @@ msgstr "不能和原来的密钥相同" msgid "Not a valid ssh public key" msgstr "SSH密钥不合法" -#: users/forms/profile.py:160 users/models/user.py:580 +#: users/forms/profile.py:160 users/models/user.py:581 #: users/templates/users/user_password_update.html:48 msgid "Public key" msgstr "SSH公钥" @@ -3898,43 +3905,43 @@ msgstr "系统管理员" msgid "System auditor" msgstr "系统审计员" -#: users/models/user.py:464 +#: users/models/user.py:465 msgid "Force enable" msgstr "强制启用" -#: users/models/user.py:529 +#: users/models/user.py:530 msgid "Local" msgstr "数据库" -#: users/models/user.py:563 +#: users/models/user.py:564 msgid "Avatar" msgstr "头像" -#: users/models/user.py:566 +#: users/models/user.py:567 msgid "Wechat" msgstr "微信" -#: users/models/user.py:577 +#: users/models/user.py:578 msgid "Private key" msgstr "ssh私钥" -#: users/models/user.py:596 +#: users/models/user.py:597 msgid "Source" msgstr "来源" -#: users/models/user.py:600 +#: users/models/user.py:601 msgid "Date password last updated" msgstr "最后更新密码日期" -#: users/models/user.py:603 +#: users/models/user.py:604 msgid "Need update password" msgstr "需要更新密码" -#: users/models/user.py:754 +#: users/models/user.py:755 msgid "Administrator" msgstr "管理员" -#: users/models/user.py:757 +#: users/models/user.py:758 msgid "Administrator is the super user of system" msgstr "Administrator是初始的超级管理员" @@ -5089,45 +5096,3 @@ msgstr "旗舰版" #: xpack/plugins/license/models.py:77 msgid "Community edition" msgstr "社区版" - -#~ msgid "Latest version" -#~ msgstr "最新版本" - -#~ msgid "Test admin user connectivity period: {}" -#~ msgstr "定期测试管理账号可连接性: {}" - -#~ msgid "Test admin user connectivity: {}" -#~ msgstr "测试管理帐号可连接性: {}" - -#~ msgid "Test asset user connectivity: {}" -#~ msgstr "测试资产用户可连接性: {}" - -#~ msgid "{} Start task: {}" -#~ msgstr "{} 任务开始: {}" - -#~ msgid "{} Task finish" -#~ msgstr "{} 任务结束" - -#~ msgid "Deleted failed, There are related assets" -#~ msgstr "删除失败,存在关联资产" - -#~ msgid "System user(Dynamic)" -#~ msgstr "系统用户(动态)" - -#~ msgid "Could not remove asset admin user" -#~ msgstr "不能移除资产的管理用户账号" - -#~ msgid "Latest version could not be delete" -#~ msgstr "最新版本的不能被删除" - -#~ msgid "Bulk delete deny" -#~ msgstr "拒绝批量删除" - -#~ msgid "Admin user name" -#~ msgstr "管理用户名称" - -#~ msgid "Backend" -#~ msgstr "后端" - -#~ msgid "Terminal command alert" -#~ msgstr "终端命令告警" From bf885f94e4a1c4e49541ab686d56d20f885b6c64 Mon Sep 17 00:00:00 2001 From: Bai Date: Wed, 14 Jul 2021 12:27:03 +0800 Subject: [PATCH 3/9] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E8=B5=84=E4=BA=A7=E5=AF=BC=E5=87=BA=E6=96=87?= =?UTF-8?q?=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/locale/zh/LC_MESSAGES/django.mo | Bin 76078 -> 76217 bytes apps/locale/zh/LC_MESSAGES/djangojs.mo | Bin 2782 -> 2741 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/locale/zh/LC_MESSAGES/django.mo b/apps/locale/zh/LC_MESSAGES/django.mo index bc41b05ae39c2ef8b85a7962e4bbe84b619456b1..bfe44878a3827be3ff86222e1b1066d711988e33 100644 GIT binary patch delta 22314 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 delta 22212 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 GO#cU9eWA(# diff --git a/apps/locale/zh/LC_MESSAGES/djangojs.mo b/apps/locale/zh/LC_MESSAGES/djangojs.mo index 4bd390695a945e5f13744670c777354e7d85cc70..24e68caf523648ed333a85c565401a6fbac6a37e 100644 GIT binary patch delta 273 zcmXZWKMnyw6oB!!OV;kjzlh1o5`~h4LM73PBe(!}(Cr1pDRc^Aqfprch)$u=XjN*3 zZ+O*j^1hkOdzhoyx11z$L{^?iQ$#iekve8L#2b<%@c&lT2#d_yIKm!IaG`yx{h*%J z3kKY~V*{VQB)`K)2Zm}xA1gRT`_T+zoMRai?BW{jf+s9thIa8Q*3b?A?~U3~2e_n< N!!&kx`Sk6*a$nFs8a@C3 delta 312 zcmXZWzY76j7zgm@kRO*HB}y1940QG0p`77T$Y8xdGq6mDP<9-({S9Y&x7-NWB7 z4omWX-e9|IAI_0m@;>d^`Ub>PEs2^C`;-6a F{Q~9OCL#a; From 601a48071f72d902dd8fde5629a96f4b39f24c78 Mon Sep 17 00:00:00 2001 From: xinwen Date: Wed, 14 Jul 2021 13:53:28 +0800 Subject: [PATCH 4/9] =?UTF-8?q?fix:=20=E7=BB=84=E7=BB=87=E7=BB=9F=E8=AE=A1?= =?UTF-8?q?=E4=B8=AD=E7=B3=BB=E7=BB=9F=E7=94=A8=E6=88=B7=E6=95=B0=E9=87=8F?= =?UTF-8?q?=E4=B8=8D=E5=AF=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/orgs/caches.py | 4 ++-- apps/orgs/signals_handler/cache.py | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/apps/orgs/caches.py b/apps/orgs/caches.py index cc4f71a2a..febbc64a9 100644 --- a/apps/orgs/caches.py +++ b/apps/orgs/caches.py @@ -54,8 +54,8 @@ class OrgResourceStatisticsCache(OrgRelatedCache): assets_amount = IntegerField() nodes_amount = IntegerField(queryset=Node.objects) - admin_users_amount = IntegerField(queryset=AdminUser.objects) - system_users_amount = IntegerField(queryset=SystemUser.objects) + admin_users_amount = IntegerField(queryset=SystemUser.objects.filter(type=SystemUser.Type.admin)) + system_users_amount = IntegerField(queryset=SystemUser.objects.filter(type=SystemUser.Type.common)) domains_amount = IntegerField(queryset=Domain.objects) gateways_amount = IntegerField(queryset=Gateway.objects) diff --git a/apps/orgs/signals_handler/cache.py b/apps/orgs/signals_handler/cache.py index 96d2a6186..734ad7af0 100644 --- a/apps/orgs/signals_handler/cache.py +++ b/apps/orgs/signals_handler/cache.py @@ -55,8 +55,7 @@ class OrgResourceStatisticsRefreshUtil: Application: ['applications_amount'], Gateway: ['gateways_amount'], Domain: ['domains_amount'], - SystemUser: ['system_users_amount'], - AdminUser: ['admin_users_amount'], + SystemUser: ['system_users_amount', 'admin_users_amount'], Node: ['nodes_amount'], Asset: ['assets_amount'], UserGroup: ['groups_amount'], From 2e190c9ea9d213a16f7c428ed2890555e4d3c68d Mon Sep 17 00:00:00 2001 From: xinwen Date: Wed, 14 Jul 2021 14:58:40 +0800 Subject: [PATCH 5/9] =?UTF-8?q?fix:=20=E6=8E=88=E6=9D=83=E8=BF=87=E6=9C=9F?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E5=88=B7=E6=96=B0=E6=8E=88=E6=9D=83=E6=A0=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/perms/tasks.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/perms/tasks.py b/apps/perms/tasks.py index 8c796ad27..6490c4ecd 100644 --- a/apps/perms/tasks.py +++ b/apps/perms/tasks.py @@ -15,7 +15,7 @@ logger = get_logger(__file__) @register_as_period_task(interval=settings.PERM_EXPIRED_CHECK_PERIODIC) -@shared_task(queue='celery_check_asset_perm_expired') +@shared_task() @atomic() def check_asset_permission_expired(): """ From 9684b2d4ac3e62cff99e779b81f68e3f670b2d37 Mon Sep 17 00:00:00 2001 From: Bai Date: Wed, 14 Jul 2021 15:14:24 +0800 Subject: [PATCH 6/9] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E8=B5=84=E4=BA=A7=E5=8F=AF=E8=BF=9E=E6=8E=A5=E6=80=A7=E8=8E=B7?= =?UTF-8?q?=E5=8F=96admin=5Fuser=E6=80=BB=E6=98=AF=E6=96=B0=E5=8A=A0?= =?UTF-8?q?=E8=BD=BD=E7=9A=84authbook=E5=AF=B9=E8=B1=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/assets/models/asset.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/apps/assets/models/asset.py b/apps/assets/models/asset.py index 6bb46fc7c..3078543b1 100644 --- a/apps/assets/models/asset.py +++ b/apps/assets/models/asset.py @@ -225,9 +225,14 @@ class Asset(AbsConnectivity, ProtocolsMixin, NodesRelationMixin, OrgModelMixin): def __str__(self): return '{0.hostname}({0.ip})'.format(self) + __admin_user = None + @property def admin_user(self): - return self.system_users.filter(type='admin').first() + # 解决每次获取资产管理用户时都是最新的对象 + if self.__admin_user is None: + self.__admin_user = self.system_users.filter(type='admin').first() + return self.__admin_user @admin_user.setter def admin_user(self, system_user): From 019f00a34a041cc20849f1c90730731cc17be85f Mon Sep 17 00:00:00 2001 From: ibuler Date: Wed, 14 Jul 2021 16:22:27 +0800 Subject: [PATCH 7/9] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E7=89=B9?= =?UTF-8?q?=E6=9D=83=E8=B4=A6=E5=8F=B7=E5=88=9B=E5=BB=BA=E5=92=8C=E5=AF=BC?= =?UTF-8?q?=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit perf: 优化搜索 perf: Huany perf: 还原 perf: 又改 xxx --- apps/assets/api/system_user.py | 1 - apps/assets/serializers/admin_user.py | 43 +++++++++----------------- apps/assets/serializers/system_user.py | 31 ++----------------- 3 files changed, 16 insertions(+), 59 deletions(-) diff --git a/apps/assets/api/system_user.py b/apps/assets/api/system_user.py index 6ffd1c3c5..03a506640 100644 --- a/apps/assets/api/system_user.py +++ b/apps/assets/api/system_user.py @@ -39,7 +39,6 @@ class SystemUserViewSet(OrgBulkModelViewSet): serializer_class = serializers.SystemUserSerializer serializer_classes = { 'default': serializers.SystemUserSerializer, - 'list': serializers.SystemUserListSerializer, } permission_classes = (IsOrgAdminOrAppUser,) diff --git a/apps/assets/serializers/admin_user.py b/apps/assets/serializers/admin_user.py index bf16004f4..c72670ba8 100644 --- a/apps/assets/serializers/admin_user.py +++ b/apps/assets/serializers/admin_user.py @@ -1,40 +1,25 @@ # -*- coding: utf-8 -*- # -from django.utils.translation import ugettext_lazy as _ - from ..models import SystemUser -from orgs.mixins.serializers import BulkOrgResourceModelSerializer - -from .base import AuthSerializerMixin +from .system_user import SystemUserSerializer as SuS -class AdminUserSerializer(AuthSerializerMixin, BulkOrgResourceModelSerializer): +class AdminUserSerializer(SuS): """ 管理用户 """ - class Meta: - model = SystemUser - fields_mini = ['id', 'name', 'username'] - fields_write_only = ['password', 'private_key', 'public_key'] - fields_small = fields_mini + fields_write_only + [ - 'date_created', 'date_updated', - 'comment', 'created_by' - ] - fields_fk = ['assets_amount'] - fields = fields_small + fields_fk - read_only_fields = ['date_created', 'date_updated', 'created_by', 'assets_amount'] + class Meta(SuS.Meta): + fields = SuS.Meta.fields_mini + \ + SuS.Meta.fields_write_only + \ + SuS.Meta.fields_m2m + \ + [ + 'type', 'protocol', "priority", 'sftp_root', 'ssh_key_fingerprint', + 'date_created', 'date_updated', 'comment', 'created_by', + ] - extra_kwargs = { - 'username': {"required": True}, - 'password': {"write_only": True}, - 'private_key': {"write_only": True}, - 'public_key': {"write_only": True}, - 'assets_amount': {'label': _('Asset')}, - } + def validate_type(self, val): + return SystemUser.Type.admin - def create(self, validated_data): - data = {k: v for k, v in validated_data.items()} - data['protocol'] = 'ssh' - data['type'] = SystemUser.Type.admin - return super().create(data) + def validate_protocol(self, val): + return 'ssh' diff --git a/apps/assets/serializers/system_user.py b/apps/assets/serializers/system_user.py index 12f383944..76589e84b 100644 --- a/apps/assets/serializers/system_user.py +++ b/apps/assets/serializers/system_user.py @@ -9,7 +9,7 @@ from ..models import SystemUser, Asset from .base import AuthSerializerMixin __all__ = [ - 'SystemUserSerializer', 'SystemUserListSerializer', + 'SystemUserSerializer', 'SystemUserSimpleSerializer', 'SystemUserAssetRelationSerializer', 'SystemUserNodeRelationSerializer', 'SystemUserTaskSerializer', 'SystemUserUserRelationSerializer', 'SystemUserWithAuthInfoSerializer', @@ -22,7 +22,7 @@ class SystemUserSerializer(AuthSerializerMixin, BulkOrgResourceModelSerializer): 系统用户 """ auto_generate_key = serializers.BooleanField(initial=True, required=False, write_only=True) - type_display = serializers.ReadOnlyField(source='get_type_display') + type_display = serializers.ReadOnlyField(source='get_type_display', label=_('Type display')) ssh_key_fingerprint = serializers.ReadOnlyField(label=_('SSH key fingerprint')) class Meta: @@ -173,33 +173,6 @@ class SystemUserSerializer(AuthSerializerMixin, BulkOrgResourceModelSerializer): attrs = self.validate_gen_key(attrs) return attrs - -class SystemUserListSerializer(SystemUserSerializer): - - class Meta(SystemUserSerializer.Meta): - fields_mini = ['id', 'name', 'username'] - fields_write_only = ['password', 'public_key', 'private_key'] - fields_small = fields_mini + fields_write_only + [ - 'protocol', 'login_mode', 'login_mode_display', 'priority', - 'sudo', 'shell', 'home', 'system_groups', - 'ad_domain', 'sftp_root', 'ssh_key_fingerprint', - "username_same_with_user", 'auto_push', 'auto_generate_key', - 'date_created', 'date_updated', - 'comment', 'created_by', - ] - fields_m2m = ["assets_amount"] - fields = fields_small + fields_m2m - extra_kwargs = { - 'password': {"write_only": True}, - 'public_key': {"write_only": True}, - 'private_key': {"write_only": True}, - 'nodes_amount': {'label': _('Nodes amount')}, - 'assets_amount': {'label': _('Assets amount')}, - 'login_mode_display': {'label': _('Login mode display')}, - 'created_by': {'read_only': True}, - 'ad_domain': {'label': _('Ad domain')}, - } - @classmethod def setup_eager_loading(cls, queryset): """ Perform necessary eager loading of data. """ From d7f587216df8478962c7b51f2750657101482548 Mon Sep 17 00:00:00 2001 From: Bai Date: Wed, 14 Jul 2021 16:49:28 +0800 Subject: [PATCH 8/9] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E7=94=A8=E6=88=B7=E5=8F=AF=E8=BF=9E=E6=8E=A5?= =?UTF-8?q?=E6=80=A7=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/assets/tasks/system_user_connectivity.py | 2 +- .../migrations/0020_adhoc_run_system_user.py | 20 +++++++++++++++++++ apps/ops/models/adhoc.py | 3 ++- apps/ops/utils.py | 4 ++-- 4 files changed, 25 insertions(+), 4 deletions(-) create mode 100644 apps/ops/migrations/0020_adhoc_run_system_user.py diff --git a/apps/assets/tasks/system_user_connectivity.py b/apps/assets/tasks/system_user_connectivity.py index 91264c1c7..5b0cf5845 100644 --- a/apps/assets/tasks/system_user_connectivity.py +++ b/apps/assets/tasks/system_user_connectivity.py @@ -83,7 +83,7 @@ def test_system_user_connectivity_util(system_user, assets, task_name): _task, created = update_or_create_ansible_task( task_name=_task_name, hosts=_hosts, tasks=_tasks, pattern='all', options=const.TASK_OPTIONS, - run_as=_username, + run_as=_username, system_user=system_user ) raw, summary = _task.run() success = summary.get('success', False) diff --git a/apps/ops/migrations/0020_adhoc_run_system_user.py b/apps/ops/migrations/0020_adhoc_run_system_user.py new file mode 100644 index 000000000..2b9815cd6 --- /dev/null +++ b/apps/ops/migrations/0020_adhoc_run_system_user.py @@ -0,0 +1,20 @@ +# Generated by Django 3.1.6 on 2021-07-14 08:44 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('assets', '0076_delete_assetuser'), + ('ops', '0019_adhocexecution_celery_task_id'), + ] + + operations = [ + migrations.AddField( + model_name='adhoc', + name='run_system_user', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='assets.systemuser'), + ), + ] diff --git a/apps/ops/models/adhoc.py b/apps/ops/models/adhoc.py index 083d40d4d..4c4c549f9 100644 --- a/apps/ops/models/adhoc.py +++ b/apps/ops/models/adhoc.py @@ -146,6 +146,7 @@ class AdHoc(OrgModelMixin): hosts = models.ManyToManyField('assets.Asset', verbose_name=_("Host")) run_as_admin = models.BooleanField(default=False, verbose_name=_('Run as admin')) run_as = models.CharField(max_length=64, default='', blank=True, null=True, verbose_name=_('Username')) + run_system_user = models.ForeignKey('assets.SystemUser', null=True, on_delete=models.CASCADE) become = EncryptJsonDictCharField(max_length=1024, default='', blank=True, null=True, verbose_name=_("Become")) created_by = models.CharField(max_length=64, default='', blank=True, null=True, verbose_name=_('Create by')) date_created = models.DateTimeField(auto_now_add=True, db_index=True) @@ -167,7 +168,7 @@ class AdHoc(OrgModelMixin): inventory = JMSInventory( self.hosts.all(), run_as_admin=self.run_as_admin, - run_as=self.run_as, become_info=become_info + run_as=self.run_as, become_info=become_info, system_user=self.run_system_user ) return inventory diff --git a/apps/ops/utils.py b/apps/ops/utils.py index 9993ea2cb..a01543b95 100644 --- a/apps/ops/utils.py +++ b/apps/ops/utils.py @@ -28,7 +28,7 @@ def update_or_create_ansible_task( task_name, hosts, tasks, interval=None, crontab=None, is_periodic=False, callback=None, pattern='all', options=None, - run_as_admin=False, run_as=None, become_info=None, + run_as_admin=False, run_as=None, system_user=None, become_info=None, ): if not hosts or not tasks or not task_name: return None, None @@ -49,7 +49,7 @@ def update_or_create_ansible_task( adhoc = task.get_latest_adhoc() new_adhoc = AdHoc(task=task, pattern=pattern, run_as_admin=run_as_admin, - run_as=run_as) + run_as=run_as, run_system_user=system_user) new_adhoc.tasks = tasks new_adhoc.options = options new_adhoc.become = become_info From 5b741de896cdbaffcfbe9595bcbe265debcebf3d Mon Sep 17 00:00:00 2001 From: Bai Date: Wed, 14 Jul 2021 18:51:24 +0800 Subject: [PATCH 9/9] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E8=B5=84=E4=BA=A7=E5=AF=BC=E5=87=BA=E5=8C=85?= =?UTF-8?q?=E5=90=AB=E7=BB=84=E7=BB=87=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/assets/serializers/system_user.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/assets/serializers/system_user.py b/apps/assets/serializers/system_user.py index 76589e84b..bfd9fa511 100644 --- a/apps/assets/serializers/system_user.py +++ b/apps/assets/serializers/system_user.py @@ -210,10 +210,11 @@ class SystemUserSimpleSerializer(serializers.ModelSerializer): class RelationMixin(BulkSerializerMixin, serializers.Serializer): systemuser_display = serializers.ReadOnlyField(label=_("System user name")) + org_name = serializers.ReadOnlyField(label=_("Org name")) def get_field_names(self, declared_fields, info): fields = super().get_field_names(declared_fields, info) - fields.extend(['systemuser', "systemuser_display"]) + fields.extend(['systemuser', "systemuser_display", "org_name"]) return fields