mirror of https://github.com/jumpserver/jumpserver
[Update] 修改任务执行
parent
847e37e641
commit
89fa0658e1
|
@ -0,0 +1,25 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
from django.http import HttpResponse
|
||||
from django.conf import settings
|
||||
from django.utils.translation import ugettext as _
|
||||
from django.views.decorators.csrf import csrf_exempt
|
||||
|
||||
from proxy.views import proxy_view
|
||||
|
||||
flower_url = settings.FLOWER_URL
|
||||
|
||||
|
||||
@csrf_exempt
|
||||
def celery_flower_view(request, path):
|
||||
if not request.user.is_superuser:
|
||||
return HttpResponse("Forbidden")
|
||||
remote_url = 'http://{}/{}'.format(flower_url, path)
|
||||
try:
|
||||
response = proxy_view(request, remote_url)
|
||||
except Exception as e:
|
||||
msg = _("<h1>Flow service unavailable, check it</h1>") + \
|
||||
'<br><br> <div>{}</div>'.format(e)
|
||||
response = HttpResponse(msg)
|
||||
return response
|
||||
|
|
@ -382,7 +382,8 @@ defaults = {
|
|||
'SYSLOG_ADDR': '', # '192.168.0.1:514'
|
||||
'SYSLOG_FACILITY': 'user',
|
||||
'PERM_SINGLE_ASSET_TO_UNGROUP_NODE': False,
|
||||
'WINDOWS_SSH_DEFAULT_SHELL': 'cmd'
|
||||
'WINDOWS_SSH_DEFAULT_SHELL': 'cmd',
|
||||
'FLOWER_URL': "127.0.0.1:5555"
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -623,3 +623,4 @@ BACKEND_ASSET_USER_AUTH_VAULT = False
|
|||
|
||||
PERM_SINGLE_ASSET_TO_UNGROUP_NODE = CONFIG.PERM_SINGLE_ASSET_TO_UNGROUP_NODE
|
||||
WINDOWS_SSH_DEFAULT_SHELL = CONFIG.WINDOWS_SSH_DEFAULT_SHELL
|
||||
FLOWER_URL = CONFIG.FLOWER_URL
|
||||
|
|
|
@ -7,7 +7,9 @@ from django.conf.urls.static import static
|
|||
from django.conf.urls.i18n import i18n_patterns
|
||||
from django.views.i18n import JavaScriptCatalog
|
||||
|
||||
from .views import IndexView, LunaView, I18NView, HealthCheckView, redirect_format_api
|
||||
# from .views import IndexView, LunaView, I18NView, HealthCheckView, redirect_format_api
|
||||
from . import views
|
||||
from .celery_flower import celery_flower_view
|
||||
from .swagger import get_swagger_view
|
||||
|
||||
api_v1 = [
|
||||
|
@ -40,6 +42,7 @@ app_view_patterns = [
|
|||
path('orgs/', include('orgs.urls.views_urls', namespace='orgs')),
|
||||
path('auth/', include('authentication.urls.view_urls'), name='auth'),
|
||||
path('applications/', include('applications.urls.views_urls', namespace='applications')),
|
||||
re_path(r'flower/(?P<path>.*)', celery_flower_view, name='flower-view'),
|
||||
]
|
||||
|
||||
|
||||
|
@ -57,13 +60,13 @@ js_i18n_patterns = i18n_patterns(
|
|||
|
||||
|
||||
urlpatterns = [
|
||||
path('', IndexView.as_view(), name='index'),
|
||||
path('', views.IndexView.as_view(), name='index'),
|
||||
path('api/v1/', include(api_v1)),
|
||||
path('api/v2/', include(api_v2)),
|
||||
re_path('api/(?P<app>\w+)/(?P<version>v\d)/.*', redirect_format_api),
|
||||
path('api/health/', HealthCheckView.as_view(), name="health"),
|
||||
path('luna/', LunaView.as_view(), name='luna-view'),
|
||||
path('i18n/<str:lang>/', I18NView.as_view(), name='i18n-switch'),
|
||||
re_path('api/(?P<app>\w+)/(?P<version>v\d)/.*', views.redirect_format_api),
|
||||
path('api/health/', views.HealthCheckView.as_view(), name="health"),
|
||||
path('luna/', views.LunaView.as_view(), name='luna-view'),
|
||||
path('i18n/<str:lang>/', views.I18NView.as_view(), name='i18n-switch'),
|
||||
path('settings/', include('settings.urls.view_urls', namespace='settings')),
|
||||
|
||||
# External apps url
|
||||
|
|
|
@ -224,3 +224,6 @@ class HealthCheckView(APIView):
|
|||
|
||||
def get(self, request):
|
||||
return JsonResponse({"status": 1, "time": int(time.time())})
|
||||
|
||||
|
||||
|
||||
|
|
Binary file not shown.
|
@ -8,7 +8,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: Jumpserver 0.3.3\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2019-09-19 14:43+0800\n"
|
||||
"POT-Creation-Date: 2019-09-19 19:50+0800\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: ibuler <ibuler@qq.com>\n"
|
||||
"Language-Team: Jumpserver team<ibuler@qq.com>\n"
|
||||
|
@ -95,15 +95,15 @@ 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:121
|
||||
#: xpack/plugins/change_auth_plan/models.py:409
|
||||
#: xpack/plugins/change_auth_plan/forms.py:64
|
||||
#: xpack/plugins/change_auth_plan/models.py:412
|
||||
#: 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
|
||||
#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_execution_subtask_list.html:13
|
||||
#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_list.html:14
|
||||
#: xpack/plugins/cloud/models.py:307
|
||||
#: xpack/plugins/cloud/templates/cloud/sync_instance_task_instance.html:63
|
||||
#: xpack/plugins/orgs/templates/orgs/org_list.html:16
|
||||
#: xpack/plugins/orgs/templates/orgs/org_list.html:17
|
||||
#: xpack/plugins/vault/forms.py:13 xpack/plugins/vault/forms.py:15
|
||||
msgid "Asset"
|
||||
msgstr "资产"
|
||||
|
@ -151,8 +151,8 @@ msgstr "资产"
|
|||
#: users/templates/users/user_list.html:35
|
||||
#: users/templates/users/user_profile.html:51
|
||||
#: users/templates/users/user_pubkey_update.html:57
|
||||
#: xpack/plugins/change_auth_plan/forms.py:104
|
||||
#: xpack/plugins/change_auth_plan/models.py:60
|
||||
#: xpack/plugins/change_auth_plan/forms.py:47
|
||||
#: xpack/plugins/change_auth_plan/models.py:63
|
||||
#: 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
|
||||
#: xpack/plugins/cloud/models.py:59 xpack/plugins/cloud/models.py:144
|
||||
|
@ -199,7 +199,7 @@ msgstr "参数"
|
|||
#: perms/templates/perms/remote_app_permission_detail.html:90
|
||||
#: users/models/user.py:414 users/serializers/v1.py:141
|
||||
#: users/templates/users/user_detail.html:111
|
||||
#: xpack/plugins/change_auth_plan/models.py:105
|
||||
#: xpack/plugins/change_auth_plan/models.py:108
|
||||
#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_detail.html:113
|
||||
#: xpack/plugins/cloud/models.py:80 xpack/plugins/cloud/models.py:179
|
||||
#: xpack/plugins/gathered_user/models.py:46
|
||||
|
@ -261,7 +261,7 @@ msgstr "创建日期"
|
|||
#: users/templates/users/user_group_detail.html:67
|
||||
#: users/templates/users/user_group_list.html:37
|
||||
#: users/templates/users/user_profile.html:138
|
||||
#: xpack/plugins/change_auth_plan/models.py:101
|
||||
#: xpack/plugins/change_auth_plan/models.py:104
|
||||
#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_detail.html:117
|
||||
#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_list.html:19
|
||||
#: xpack/plugins/cloud/models.py:77 xpack/plugins/cloud/models.py:173
|
||||
|
@ -271,7 +271,7 @@ msgstr "创建日期"
|
|||
#: xpack/plugins/cloud/templates/cloud/sync_instance_task_list.html:18
|
||||
#: xpack/plugins/gathered_user/models.py:42
|
||||
#: xpack/plugins/orgs/templates/orgs/org_detail.html:64
|
||||
#: xpack/plugins/orgs/templates/orgs/org_list.html:22
|
||||
#: xpack/plugins/orgs/templates/orgs/org_list.html:23
|
||||
msgid "Comment"
|
||||
msgstr "备注"
|
||||
|
||||
|
@ -384,7 +384,7 @@ msgstr "提交"
|
|||
#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_detail.html:20
|
||||
#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_execution_list.html:17
|
||||
#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_execution_list.html:106
|
||||
#: xpack/plugins/change_auth_plan/views.py:88
|
||||
#: xpack/plugins/change_auth_plan/views.py:91
|
||||
msgid "Detail"
|
||||
msgstr "详情"
|
||||
|
||||
|
@ -432,7 +432,7 @@ msgstr "详情"
|
|||
#: xpack/plugins/cloud/templates/cloud/sync_instance_task_list.html:57
|
||||
#: xpack/plugins/gathered_user/templates/gathered_user/task_list.html:51
|
||||
#: xpack/plugins/orgs/templates/orgs/org_detail.html:25
|
||||
#: xpack/plugins/orgs/templates/orgs/org_list.html:88
|
||||
#: xpack/plugins/orgs/templates/orgs/org_list.html:93
|
||||
msgid "Update"
|
||||
msgstr "更新"
|
||||
|
||||
|
@ -474,7 +474,7 @@ msgstr "更新"
|
|||
#: xpack/plugins/cloud/templates/cloud/sync_instance_task_list.html:58
|
||||
#: xpack/plugins/gathered_user/templates/gathered_user/task_list.html:52
|
||||
#: xpack/plugins/orgs/templates/orgs/org_detail.html:29
|
||||
#: xpack/plugins/orgs/templates/orgs/org_list.html:90
|
||||
#: xpack/plugins/orgs/templates/orgs/org_list.html:95
|
||||
msgid "Delete"
|
||||
msgstr "删除"
|
||||
|
||||
|
@ -532,7 +532,7 @@ msgstr "创建远程应用"
|
|||
#: xpack/plugins/cloud/templates/cloud/sync_instance_task_history.html:72
|
||||
#: xpack/plugins/cloud/templates/cloud/sync_instance_task_list.html:19
|
||||
#: xpack/plugins/gathered_user/templates/gathered_user/task_list.html:20
|
||||
#: xpack/plugins/orgs/templates/orgs/org_list.html:23
|
||||
#: xpack/plugins/orgs/templates/orgs/org_list.html:24
|
||||
msgid "Action"
|
||||
msgstr "动作"
|
||||
|
||||
|
@ -588,7 +588,7 @@ msgstr "端口"
|
|||
#: assets/templates/assets/asset_detail.html:198
|
||||
#: assets/templates/assets/system_user_assets.html:83
|
||||
#: perms/models/asset_permission.py:79
|
||||
#: xpack/plugins/change_auth_plan/models.py:71
|
||||
#: xpack/plugins/change_auth_plan/models.py:74
|
||||
#: xpack/plugins/gathered_user/models.py:31
|
||||
#: xpack/plugins/gathered_user/templates/gathered_user/task_list.html:17
|
||||
msgid "Nodes"
|
||||
|
@ -599,7 +599,7 @@ msgstr "节点"
|
|||
#: assets/models/user.py:68 assets/templates/assets/asset_detail.html:76
|
||||
#: templates/_nav.html:44 xpack/plugins/cloud/models.py:161
|
||||
#: xpack/plugins/cloud/templates/cloud/sync_instance_task_detail.html:68
|
||||
#: xpack/plugins/orgs/templates/orgs/org_list.html:18
|
||||
#: xpack/plugins/orgs/templates/orgs/org_list.html:19
|
||||
msgid "Admin user"
|
||||
msgstr "管理用户"
|
||||
|
||||
|
@ -607,7 +607,7 @@ msgstr "管理用户"
|
|||
#: assets/templates/assets/asset_create.html:48
|
||||
#: assets/templates/assets/asset_create.html:50
|
||||
#: assets/templates/assets/asset_list.html:85
|
||||
#: xpack/plugins/orgs/templates/orgs/org_list.html:20
|
||||
#: xpack/plugins/orgs/templates/orgs/org_list.html:21
|
||||
msgid "Label"
|
||||
msgstr "标签"
|
||||
|
||||
|
@ -615,18 +615,18 @@ msgstr "标签"
|
|||
#: assets/models/asset.py:144 assets/models/domain.py:26
|
||||
#: assets/models/domain.py:52 assets/templates/assets/asset_detail.html:80
|
||||
#: assets/templates/assets/user_asset_list.html:53
|
||||
#: xpack/plugins/orgs/templates/orgs/org_list.html:17
|
||||
#: xpack/plugins/orgs/templates/orgs/org_list.html:18
|
||||
msgid "Domain"
|
||||
msgstr "网域"
|
||||
|
||||
#: assets/forms/asset.py:68 assets/forms/asset.py:101 assets/forms/asset.py:114
|
||||
#: assets/forms/asset.py:149 assets/models/node.py:401
|
||||
#: assets/forms/asset.py:149 assets/models/node.py:402
|
||||
#: assets/templates/assets/asset_create.html:42
|
||||
#: perms/forms/asset_permission.py:82 perms/forms/asset_permission.py:89
|
||||
#: perms/templates/perms/asset_permission_list.html:53
|
||||
#: perms/templates/perms/asset_permission_list.html:74
|
||||
#: perms/templates/perms/asset_permission_list.html:124
|
||||
#: xpack/plugins/change_auth_plan/forms.py:122
|
||||
#: xpack/plugins/change_auth_plan/forms.py:65
|
||||
#: 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:157
|
||||
|
@ -655,8 +655,8 @@ msgstr "如果有多个的互相隔离的网络,设置资产属于的网域,
|
|||
#: assets/forms/asset.py:129 assets/forms/asset.py:133
|
||||
#: assets/forms/domain.py:17 assets/forms/label.py:15
|
||||
#: perms/templates/perms/asset_permission_asset.html:78
|
||||
#: xpack/plugins/change_auth_plan/forms.py:112
|
||||
#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_asset_list.html:84
|
||||
#: xpack/plugins/change_auth_plan/forms.py:55
|
||||
#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_asset_list.html:74
|
||||
msgid "Select assets"
|
||||
msgstr "选择资产"
|
||||
|
||||
|
@ -693,9 +693,9 @@ 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:106
|
||||
#: xpack/plugins/change_auth_plan/models.py:62
|
||||
#: xpack/plugins/change_auth_plan/models.py:405
|
||||
#: xpack/plugins/change_auth_plan/forms.py:49
|
||||
#: xpack/plugins/change_auth_plan/models.py:65
|
||||
#: xpack/plugins/change_auth_plan/models.py:408
|
||||
#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_detail.html:65
|
||||
#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_execution_list.html:53
|
||||
#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_execution_subtask_list.html:12
|
||||
|
@ -722,8 +722,8 @@ msgstr "密码或密钥密码"
|
|||
#: users/templates/users/user_profile_update.html:41
|
||||
#: users/templates/users/user_pubkey_update.html:41
|
||||
#: users/templates/users/user_update.html:20
|
||||
#: xpack/plugins/change_auth_plan/models.py:92
|
||||
#: xpack/plugins/change_auth_plan/models.py:260
|
||||
#: xpack/plugins/change_auth_plan/models.py:95
|
||||
#: xpack/plugins/change_auth_plan/models.py:263
|
||||
msgid "Password"
|
||||
msgstr "密码"
|
||||
|
||||
|
@ -780,7 +780,7 @@ msgstr "使用逗号分隔多个命令,如: /bin/whoami,/sbin/ifconfig"
|
|||
#: audits/templates/audits/login_log_list.html:60
|
||||
#: perms/templates/perms/asset_permission_asset.html:58 settings/forms.py:140
|
||||
#: users/templates/users/_granted_assets.html:26
|
||||
#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_asset_list.html:51
|
||||
#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_asset_list.html:54
|
||||
#: xpack/plugins/gathered_user/templates/gathered_user/gathered_user_list.html:73
|
||||
msgid "IP"
|
||||
msgstr "IP"
|
||||
|
@ -797,7 +797,7 @@ msgstr "IP"
|
|||
#: perms/templates/perms/asset_permission_asset.html:57
|
||||
#: perms/templates/perms/asset_permission_list.html:73 settings/forms.py:139
|
||||
#: users/templates/users/_granted_assets.html:25
|
||||
#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_asset_list.html:50
|
||||
#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_asset_list.html:53
|
||||
#: xpack/plugins/gathered_user/templates/gathered_user/gathered_user_list.html:72
|
||||
msgid "Hostname"
|
||||
msgstr "主机名"
|
||||
|
@ -915,13 +915,13 @@ msgstr "版本"
|
|||
msgid "AuthBook"
|
||||
msgstr ""
|
||||
|
||||
#: assets/models/base.py:31 xpack/plugins/change_auth_plan/models.py:96
|
||||
#: xpack/plugins/change_auth_plan/models.py:267
|
||||
#: assets/models/base.py:31 xpack/plugins/change_auth_plan/models.py:99
|
||||
#: xpack/plugins/change_auth_plan/models.py:270
|
||||
msgid "SSH private key"
|
||||
msgstr "ssh密钥"
|
||||
|
||||
#: assets/models/base.py:32 xpack/plugins/change_auth_plan/models.py:99
|
||||
#: xpack/plugins/change_auth_plan/models.py:263
|
||||
#: assets/models/base.py:32 xpack/plugins/change_auth_plan/models.py:102
|
||||
#: xpack/plugins/change_auth_plan/models.py:266
|
||||
msgid "SSH public key"
|
||||
msgstr "ssh公钥"
|
||||
|
||||
|
@ -1099,11 +1099,11 @@ msgstr "默认资产组"
|
|||
#: users/templates/users/user_group_list.html:36 users/views/user.py:250
|
||||
#: xpack/plugins/orgs/forms.py:26
|
||||
#: xpack/plugins/orgs/templates/orgs/org_detail.html:113
|
||||
#: xpack/plugins/orgs/templates/orgs/org_list.html:14
|
||||
#: xpack/plugins/orgs/templates/orgs/org_list.html:15
|
||||
msgid "User"
|
||||
msgstr "用户"
|
||||
|
||||
#: assets/models/label.py:19 assets/models/node.py:392
|
||||
#: assets/models/label.py:19 assets/models/node.py:393
|
||||
#: assets/templates/assets/label_list.html:15 settings/models.py:30
|
||||
msgid "Value"
|
||||
msgstr "值"
|
||||
|
@ -1116,15 +1116,15 @@ msgstr "分类"
|
|||
msgid "New node"
|
||||
msgstr "新节点"
|
||||
|
||||
#: assets/models/node.py:316
|
||||
#: assets/models/node.py:317
|
||||
msgid "ungrouped"
|
||||
msgstr "未分组"
|
||||
|
||||
#: assets/models/node.py:318
|
||||
#: assets/models/node.py:319
|
||||
msgid "empty"
|
||||
msgstr "空"
|
||||
|
||||
#: assets/models/node.py:391
|
||||
#: assets/models/node.py:392
|
||||
msgid "Key"
|
||||
msgstr "键"
|
||||
|
||||
|
@ -1155,7 +1155,7 @@ msgstr "手动登录"
|
|||
#: assets/views/label.py:27 assets/views/label.py:45 assets/views/label.py:73
|
||||
#: assets/views/system_user.py:29 assets/views/system_user.py:46
|
||||
#: assets/views/system_user.py:63 assets/views/system_user.py:79
|
||||
#: templates/_nav.html:39 xpack/plugins/change_auth_plan/models.py:67
|
||||
#: templates/_nav.html:39 xpack/plugins/change_auth_plan/models.py:70
|
||||
msgid "Assets"
|
||||
msgstr "资产管理"
|
||||
|
||||
|
@ -1194,7 +1194,7 @@ msgstr "登录模式"
|
|||
#: terminal/templates/terminal/session_list.html:29
|
||||
#: terminal/templates/terminal/session_list.html:73
|
||||
#: users/templates/users/_granted_assets.html:27
|
||||
#: xpack/plugins/orgs/templates/orgs/org_list.html:19
|
||||
#: xpack/plugins/orgs/templates/orgs/org_list.html:20
|
||||
msgid "System user"
|
||||
msgstr "系统用户"
|
||||
|
||||
|
@ -1298,7 +1298,7 @@ msgstr "测试资产可连接性: {}"
|
|||
|
||||
#: assets/tasks/asset_user_connectivity.py:27
|
||||
#: assets/tasks/push_system_user.py:130
|
||||
#: xpack/plugins/change_auth_plan/models.py:518
|
||||
#: xpack/plugins/change_auth_plan/models.py:521
|
||||
msgid "The asset {} system platform {} does not support run Ansible tasks"
|
||||
msgstr "资产 {} 系统平台 {} 不支持运行 Ansible 任务"
|
||||
|
||||
|
@ -1408,7 +1408,7 @@ msgid "Import assets"
|
|||
msgstr "导入资产"
|
||||
|
||||
#: assets/templates/assets/_asset_list_modal.html:7 assets/views/asset.py:38
|
||||
#: templates/_nav.html:42 xpack/plugins/change_auth_plan/views.py:115
|
||||
#: templates/_nav.html:42 xpack/plugins/change_auth_plan/views.py:118
|
||||
msgid "Asset list"
|
||||
msgstr "资产列表"
|
||||
|
||||
|
@ -1416,7 +1416,6 @@ msgstr "资产列表"
|
|||
#: assets/templates/assets/_node_tree.html:40
|
||||
#: ops/templates/ops/command_execution_create.html:49
|
||||
#: users/templates/users/_granted_assets.html:7
|
||||
#: users/templates/users/_granted_assets.html:83
|
||||
#: xpack/plugins/cloud/templates/cloud/sync_instance_task_create_update.html:66
|
||||
msgid "Loading"
|
||||
msgstr "加载中"
|
||||
|
@ -1430,7 +1429,7 @@ msgid "Update asset user auth"
|
|||
msgstr "更新资产用户认证信息"
|
||||
|
||||
#: assets/templates/assets/_asset_user_auth_update_modal.html:23
|
||||
#: xpack/plugins/change_auth_plan/forms.py:108
|
||||
#: xpack/plugins/change_auth_plan/forms.py:51
|
||||
msgid "Please input password"
|
||||
msgstr "请输入密码"
|
||||
|
||||
|
@ -1616,8 +1615,8 @@ msgstr "替换资产的管理员"
|
|||
|
||||
#: assets/templates/assets/admin_user_detail.html:91
|
||||
#: perms/templates/perms/asset_permission_asset.html:103
|
||||
#: xpack/plugins/change_auth_plan/forms.py:116
|
||||
#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_asset_list.html:109
|
||||
#: xpack/plugins/change_auth_plan/forms.py:59
|
||||
#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_asset_list.html:99
|
||||
#: xpack/plugins/gathered_user/forms.py:36
|
||||
msgid "Select nodes"
|
||||
msgstr "选择节点"
|
||||
|
@ -1643,7 +1642,7 @@ msgstr "选择节点"
|
|||
#: xpack/plugins/cloud/templates/cloud/sync_instance_task_create_update.html:54
|
||||
#: xpack/plugins/gathered_user/templates/gathered_user/task_create_update.html:45
|
||||
#: xpack/plugins/interface/templates/interface/interface.html:103
|
||||
#: xpack/plugins/orgs/templates/orgs/org_create_update.html:33
|
||||
#: xpack/plugins/orgs/templates/orgs/org_create_update.html:34
|
||||
msgid "Confirm"
|
||||
msgstr "确认"
|
||||
|
||||
|
@ -1857,7 +1856,7 @@ msgstr "删除选择资产"
|
|||
#: users/templates/users/user_group_list.html:118
|
||||
#: users/templates/users/user_list.html:254
|
||||
#: xpack/plugins/interface/templates/interface/interface.html:101
|
||||
#: xpack/plugins/orgs/templates/orgs/org_create_update.html:32
|
||||
#: xpack/plugins/orgs/templates/orgs/org_create_update.html:33
|
||||
msgid "Cancel"
|
||||
msgstr "取消"
|
||||
|
||||
|
@ -2249,7 +2248,7 @@ msgid "MFA"
|
|||
msgstr "MFA"
|
||||
|
||||
#: audits/models.py:86 audits/templates/audits/login_log_list.html:63
|
||||
#: xpack/plugins/change_auth_plan/models.py:413
|
||||
#: xpack/plugins/change_auth_plan/models.py:416
|
||||
#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_execution_subtask_list.html:15
|
||||
#: xpack/plugins/cloud/models.py:278
|
||||
#: xpack/plugins/cloud/templates/cloud/sync_instance_task_history.html:69
|
||||
|
@ -2275,8 +2274,8 @@ msgstr "登录日期"
|
|||
#: perms/templates/perms/asset_permission_detail.html:86
|
||||
#: perms/templates/perms/remote_app_permission_detail.html:78
|
||||
#: terminal/models.py:165 terminal/templates/terminal/session_list.html:34
|
||||
#: xpack/plugins/change_auth_plan/models.py:246
|
||||
#: xpack/plugins/change_auth_plan/models.py:416
|
||||
#: xpack/plugins/change_auth_plan/models.py:249
|
||||
#: xpack/plugins/change_auth_plan/models.py:419
|
||||
#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_execution_list.html:59
|
||||
#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_execution_subtask_list.html:17
|
||||
#: xpack/plugins/gathered_user/models.py:143
|
||||
|
@ -2328,23 +2327,23 @@ msgid "Date"
|
|||
msgstr "日期"
|
||||
|
||||
#: audits/views.py:86 audits/views.py:130 audits/views.py:167
|
||||
#: audits/views.py:212 audits/views.py:244 templates/_nav.html:126
|
||||
#: audits/views.py:212 audits/views.py:244 templates/_nav.html:129
|
||||
msgid "Audits"
|
||||
msgstr "日志审计"
|
||||
|
||||
#: audits/views.py:87 templates/_nav.html:130
|
||||
#: audits/views.py:87 templates/_nav.html:133
|
||||
msgid "FTP log"
|
||||
msgstr "FTP日志"
|
||||
|
||||
#: audits/views.py:131 templates/_nav.html:131
|
||||
#: audits/views.py:131 templates/_nav.html:134
|
||||
msgid "Operate log"
|
||||
msgstr "操作日志"
|
||||
|
||||
#: audits/views.py:168 templates/_nav.html:132
|
||||
#: audits/views.py:168 templates/_nav.html:135
|
||||
msgid "Password change log"
|
||||
msgstr "改密日志"
|
||||
|
||||
#: audits/views.py:213 templates/_nav.html:129
|
||||
#: audits/views.py:213 templates/_nav.html:132
|
||||
msgid "Login log"
|
||||
msgstr "登录日志"
|
||||
|
||||
|
@ -2492,6 +2491,7 @@ msgid "Secret"
|
|||
msgstr "密文"
|
||||
|
||||
#: authentication/templates/authentication/_access_key_modal.html:48
|
||||
#: users/templates/users/_granted_assets.html:75
|
||||
msgid "Show"
|
||||
msgstr "显示"
|
||||
|
||||
|
@ -2816,8 +2816,8 @@ msgstr "完成时间"
|
|||
|
||||
#: ops/models/adhoc.py:331 ops/templates/ops/adhoc_history.html:57
|
||||
#: ops/templates/ops/task_history.html:63 ops/templates/ops/task_list.html:33
|
||||
#: xpack/plugins/change_auth_plan/models.py:249
|
||||
#: xpack/plugins/change_auth_plan/models.py:419
|
||||
#: xpack/plugins/change_auth_plan/models.py:252
|
||||
#: xpack/plugins/change_auth_plan/models.py:422
|
||||
#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_execution_list.html:58
|
||||
#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_execution_subtask_list.html:16
|
||||
#: xpack/plugins/gathered_user/models.py:146
|
||||
|
@ -3105,7 +3105,7 @@ msgstr "空"
|
|||
#: users/models/user.py:379 users/templates/users/_select_user_modal.html:16
|
||||
#: users/templates/users/user_detail.html:218
|
||||
#: users/templates/users/user_list.html:38
|
||||
#: xpack/plugins/orgs/templates/orgs/org_list.html:15
|
||||
#: xpack/plugins/orgs/templates/orgs/org_list.html:16
|
||||
msgid "User group"
|
||||
msgstr "用户组"
|
||||
|
||||
|
@ -3192,7 +3192,7 @@ msgstr "添加资产"
|
|||
#: settings/templates/settings/terminal_setting.html:98
|
||||
#: settings/templates/settings/terminal_setting.html:120
|
||||
#: users/templates/users/user_group_detail.html:95
|
||||
#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_asset_list.html:90
|
||||
#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_asset_list.html:80
|
||||
#: xpack/plugins/orgs/templates/orgs/org_detail.html:93
|
||||
#: xpack/plugins/orgs/templates/orgs/org_detail.html:130
|
||||
msgid "Add"
|
||||
|
@ -3204,7 +3204,7 @@ msgstr "添加节点"
|
|||
|
||||
#: perms/templates/perms/asset_permission_asset.html:109
|
||||
#: users/templates/users/user_detail.html:235
|
||||
#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_asset_list.html:115
|
||||
#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_asset_list.html:105
|
||||
msgid "Join"
|
||||
msgstr "加入"
|
||||
|
||||
|
@ -3315,7 +3315,7 @@ msgstr "添加用户组"
|
|||
#: perms/views/remote_app_permission.py:81
|
||||
#: perms/views/remote_app_permission.py:115
|
||||
#: perms/views/remote_app_permission.py:148 templates/_nav.html:69
|
||||
#: xpack/plugins/orgs/templates/orgs/org_list.html:21
|
||||
#: xpack/plugins/orgs/templates/orgs/org_list.html:22
|
||||
msgid "Perms"
|
||||
msgstr "权限管理"
|
||||
|
||||
|
@ -3910,7 +3910,7 @@ msgstr "用户来源不是LDAP"
|
|||
|
||||
#: settings/views.py:19 settings/views.py:46 settings/views.py:73
|
||||
#: settings/views.py:103 settings/views.py:131 settings/views.py:144
|
||||
#: settings/views.py:158 settings/views.py:185 templates/_nav.html:167
|
||||
#: settings/views.py:158 settings/views.py:185 templates/_nav.html:170
|
||||
msgid "Settings"
|
||||
msgstr "系统设置"
|
||||
|
||||
|
@ -4103,19 +4103,23 @@ msgstr "终端管理"
|
|||
msgid "Job Center"
|
||||
msgstr "作业中心"
|
||||
|
||||
#: templates/_nav.html:116 templates/_nav.html:133
|
||||
#: templates/_nav.html:116 templates/_nav.html:136
|
||||
msgid "Batch command"
|
||||
msgstr "批量命令"
|
||||
|
||||
#: templates/_nav.html:143
|
||||
#: templates/_nav.html:118
|
||||
msgid "Task monitor"
|
||||
msgstr "任务监控"
|
||||
|
||||
#: templates/_nav.html:146
|
||||
msgid "XPack"
|
||||
msgstr ""
|
||||
|
||||
#: templates/_nav.html:151 xpack/plugins/cloud/views.py:28
|
||||
#: templates/_nav.html:154 xpack/plugins/cloud/views.py:28
|
||||
msgid "Account list"
|
||||
msgstr "账户列表"
|
||||
|
||||
#: templates/_nav.html:152
|
||||
#: templates/_nav.html:155
|
||||
msgid "Sync instance"
|
||||
msgstr "同步实例"
|
||||
|
||||
|
@ -4546,7 +4550,7 @@ msgstr "生成重置密码链接,通过邮件发送给用户"
|
|||
msgid "Set password"
|
||||
msgstr "设置密码"
|
||||
|
||||
#: users/forms.py:133 xpack/plugins/change_auth_plan/models.py:85
|
||||
#: users/forms.py:133 xpack/plugins/change_auth_plan/models.py:88
|
||||
#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_create_update.html:51
|
||||
#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_detail.html:69
|
||||
#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_execution_list.html:57
|
||||
|
@ -4628,7 +4632,8 @@ msgstr "管理员"
|
|||
msgid "Application"
|
||||
msgstr "应用程序"
|
||||
|
||||
#: users/models/user.py:129
|
||||
#: users/models/user.py:129 xpack/plugins/orgs/forms.py:38
|
||||
#: xpack/plugins/orgs/templates/orgs/org_list.html:14
|
||||
msgid "Auditor"
|
||||
msgstr "审计员"
|
||||
|
||||
|
@ -5445,21 +5450,7 @@ msgstr "MFA 解绑成功,返回登录页面"
|
|||
msgid "Password length"
|
||||
msgstr "密码长度"
|
||||
|
||||
#: xpack/plugins/change_auth_plan/forms.py:51
|
||||
#: xpack/plugins/change_auth_plan/models.py:209
|
||||
msgid "* For security, do not change {} user's password"
|
||||
msgstr "* 为了安全,禁止更改 {} 用户的密码"
|
||||
|
||||
#: xpack/plugins/change_auth_plan/forms.py:61
|
||||
msgid "* Please enter custom password"
|
||||
msgstr "* 请输入自定义密码"
|
||||
|
||||
#: xpack/plugins/change_auth_plan/forms.py:70
|
||||
#: xpack/plugins/cloud/serializers.py:73
|
||||
msgid "* Please enter a valid crontab expression"
|
||||
msgstr "* 请输入有效的 crontab 表达式"
|
||||
|
||||
#: xpack/plugins/change_auth_plan/forms.py:123
|
||||
#: xpack/plugins/change_auth_plan/forms.py:66
|
||||
#: 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
|
||||
|
@ -5473,7 +5464,7 @@ msgstr "* 请输入有效的 crontab 表达式"
|
|||
msgid "Periodic perform"
|
||||
msgstr "定时执行"
|
||||
|
||||
#: xpack/plugins/change_auth_plan/forms.py:127
|
||||
#: xpack/plugins/change_auth_plan/forms.py:70
|
||||
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."
|
||||
|
@ -5481,12 +5472,12 @@ msgstr ""
|
|||
"提示:用户名为将要修改的资产上的用户的用户名。如果用户存在,则修改密码;如果"
|
||||
"用户不存在,则创建用户。"
|
||||
|
||||
#: xpack/plugins/change_auth_plan/forms.py:131 xpack/plugins/cloud/forms.py:90
|
||||
#: xpack/plugins/change_auth_plan/forms.py:74 xpack/plugins/cloud/forms.py:90
|
||||
#: xpack/plugins/gathered_user/forms.py:44
|
||||
msgid "Tips: (Units: hour)"
|
||||
msgstr "提示:(单位: 时)"
|
||||
|
||||
#: xpack/plugins/change_auth_plan/forms.py:132 xpack/plugins/cloud/forms.py:91
|
||||
#: xpack/plugins/change_auth_plan/forms.py:75 xpack/plugins/cloud/forms.py:91
|
||||
#: xpack/plugins/gathered_user/forms.py:45
|
||||
msgid ""
|
||||
"eg: Every Sunday 03:05 run <5 3 * * 0> <br> Tips: Using 5 digits linux "
|
||||
|
@ -5499,32 +5490,32 @@ msgstr ""
|
|||
"具</a>) <br>注意: 如果同时设置了定期执行和周期执行,优先使用定期执行"
|
||||
|
||||
#: xpack/plugins/change_auth_plan/meta.py:9
|
||||
#: xpack/plugins/change_auth_plan/models.py:113
|
||||
#: xpack/plugins/change_auth_plan/models.py:253
|
||||
#: xpack/plugins/change_auth_plan/models.py:116
|
||||
#: xpack/plugins/change_auth_plan/models.py:256
|
||||
#: xpack/plugins/change_auth_plan/views.py:33
|
||||
#: xpack/plugins/change_auth_plan/views.py:50
|
||||
#: xpack/plugins/change_auth_plan/views.py:72
|
||||
#: xpack/plugins/change_auth_plan/views.py:87
|
||||
#: xpack/plugins/change_auth_plan/views.py:114
|
||||
#: xpack/plugins/change_auth_plan/views.py:129
|
||||
#: xpack/plugins/change_auth_plan/views.py:144
|
||||
#: xpack/plugins/change_auth_plan/views.py:74
|
||||
#: xpack/plugins/change_auth_plan/views.py:90
|
||||
#: xpack/plugins/change_auth_plan/views.py:117
|
||||
#: xpack/plugins/change_auth_plan/views.py:132
|
||||
#: xpack/plugins/change_auth_plan/views.py:147
|
||||
msgid "Change auth plan"
|
||||
msgstr "改密计划"
|
||||
|
||||
#: xpack/plugins/change_auth_plan/models.py:54
|
||||
#: xpack/plugins/change_auth_plan/models.py:57
|
||||
msgid "Custom password"
|
||||
msgstr "自定义密码"
|
||||
|
||||
#: xpack/plugins/change_auth_plan/models.py:55
|
||||
#: xpack/plugins/change_auth_plan/models.py:58
|
||||
msgid "All assets use the same random password"
|
||||
msgstr "所有资产使用相同的随机密码"
|
||||
|
||||
#: xpack/plugins/change_auth_plan/models.py:56
|
||||
#: xpack/plugins/change_auth_plan/models.py:59
|
||||
msgid "All assets use different random password"
|
||||
msgstr "所有资产使用不同的随机密码"
|
||||
|
||||
#: xpack/plugins/change_auth_plan/models.py:75
|
||||
#: xpack/plugins/change_auth_plan/models.py:144
|
||||
#: xpack/plugins/change_auth_plan/models.py:78
|
||||
#: xpack/plugins/change_auth_plan/models.py:147
|
||||
#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_detail.html:100
|
||||
#: xpack/plugins/cloud/models.py:165 xpack/plugins/cloud/models.py:219
|
||||
#: xpack/plugins/cloud/templates/cloud/sync_instance_task_detail.html:91
|
||||
|
@ -5533,8 +5524,8 @@ msgstr "所有资产使用不同的随机密码"
|
|||
msgid "Cycle perform"
|
||||
msgstr "周期执行"
|
||||
|
||||
#: xpack/plugins/change_auth_plan/models.py:80
|
||||
#: xpack/plugins/change_auth_plan/models.py:142
|
||||
#: xpack/plugins/change_auth_plan/models.py:83
|
||||
#: xpack/plugins/change_auth_plan/models.py:145
|
||||
#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_detail.html:92
|
||||
#: xpack/plugins/cloud/models.py:170 xpack/plugins/cloud/models.py:217
|
||||
#: xpack/plugins/cloud/templates/cloud/sync_instance_task_detail.html:83
|
||||
|
@ -5543,48 +5534,73 @@ msgstr "周期执行"
|
|||
msgid "Regularly perform"
|
||||
msgstr "定期执行"
|
||||
|
||||
#: xpack/plugins/change_auth_plan/models.py:89
|
||||
#: xpack/plugins/change_auth_plan/models.py:92
|
||||
#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_detail.html:74
|
||||
msgid "Password rules"
|
||||
msgstr "密码规则"
|
||||
|
||||
#: xpack/plugins/change_auth_plan/models.py:213
|
||||
#: xpack/plugins/change_auth_plan/models.py:212
|
||||
msgid "* For security, do not change {} user's password"
|
||||
msgstr "* 为了安全,禁止更改 {} 用户的密码"
|
||||
|
||||
#: xpack/plugins/change_auth_plan/models.py:216
|
||||
msgid "Assets is empty, please add the asset"
|
||||
msgstr "资产为空,请添加资产"
|
||||
|
||||
#: xpack/plugins/change_auth_plan/models.py:257
|
||||
#: xpack/plugins/change_auth_plan/models.py:260
|
||||
msgid "Change auth plan snapshot"
|
||||
msgstr "改密计划快照"
|
||||
|
||||
#: xpack/plugins/change_auth_plan/models.py:272
|
||||
#: xpack/plugins/change_auth_plan/models.py:423
|
||||
#: xpack/plugins/change_auth_plan/models.py:275
|
||||
#: xpack/plugins/change_auth_plan/models.py:426
|
||||
msgid "Change auth plan execution"
|
||||
msgstr "改密计划执行"
|
||||
|
||||
#: xpack/plugins/change_auth_plan/models.py:432
|
||||
#: xpack/plugins/change_auth_plan/models.py:435
|
||||
msgid "Change auth plan execution subtask"
|
||||
msgstr "改密计划执行子任务"
|
||||
|
||||
#: xpack/plugins/change_auth_plan/models.py:450
|
||||
#: xpack/plugins/change_auth_plan/models.py:453
|
||||
msgid "Authentication failed"
|
||||
msgstr "认证失败"
|
||||
|
||||
#: xpack/plugins/change_auth_plan/models.py:452
|
||||
#: xpack/plugins/change_auth_plan/models.py:455
|
||||
msgid "Connection timeout"
|
||||
msgstr "连接超时"
|
||||
|
||||
#: xpack/plugins/change_auth_plan/serializers.py:58
|
||||
msgid "* For security, do not change {}'s password"
|
||||
msgstr "* 为了安全,禁止更改 {} 的密码"
|
||||
|
||||
#: xpack/plugins/change_auth_plan/serializers.py:68
|
||||
msgid "* Please enter custom password"
|
||||
msgstr "* 请输入自定义密码"
|
||||
|
||||
#: xpack/plugins/change_auth_plan/serializers.py:78
|
||||
msgid "* Please enter the correct password length"
|
||||
msgstr "* 请输入正确的密码长度"
|
||||
|
||||
#: xpack/plugins/change_auth_plan/serializers.py:81
|
||||
msgid "* Password length range 6-30 bits"
|
||||
msgstr "* 密码长度范围 6-30 位"
|
||||
|
||||
#: xpack/plugins/change_auth_plan/serializers.py:97
|
||||
#: xpack/plugins/cloud/serializers.py:73
|
||||
msgid "* Please enter a valid crontab expression"
|
||||
msgstr "* 请输入有效的 crontab 表达式"
|
||||
|
||||
#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_asset_list.html:23
|
||||
#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_detail.html:26
|
||||
#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_execution_list.html:23
|
||||
#: xpack/plugins/change_auth_plan/views.py:130
|
||||
#: xpack/plugins/change_auth_plan/views.py:133
|
||||
msgid "Plan execution list"
|
||||
msgstr "执行列表"
|
||||
|
||||
#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_asset_list.html:76
|
||||
#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_asset_list.html:66
|
||||
msgid "Add asset to this plan"
|
||||
msgstr "添加资产"
|
||||
|
||||
#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_asset_list.html:101
|
||||
#: xpack/plugins/change_auth_plan/templates/change_auth_plan/plan_asset_list.html:91
|
||||
msgid "Add node to this plan"
|
||||
msgstr "添加节点"
|
||||
|
||||
|
@ -5644,11 +5660,11 @@ msgstr "创建计划"
|
|||
msgid "Plan list"
|
||||
msgstr "计划列表"
|
||||
|
||||
#: xpack/plugins/change_auth_plan/views.py:73
|
||||
#: xpack/plugins/change_auth_plan/views.py:75
|
||||
msgid "Update plan"
|
||||
msgstr "更新计划"
|
||||
|
||||
#: xpack/plugins/change_auth_plan/views.py:145
|
||||
#: xpack/plugins/change_auth_plan/views.py:148
|
||||
msgid "Plan execution task list"
|
||||
msgstr "执行任务列表"
|
||||
|
||||
|
@ -6110,6 +6126,12 @@ msgstr "无效的许可证"
|
|||
msgid "Admin"
|
||||
msgstr "管理员"
|
||||
|
||||
#: xpack/plugins/orgs/forms.py:42
|
||||
#, fuzzy
|
||||
#| msgid "Select admins"
|
||||
msgid "Select auditor"
|
||||
msgstr "选择管理员"
|
||||
|
||||
#: xpack/plugins/orgs/meta.py:8 xpack/plugins/orgs/views.py:26
|
||||
#: xpack/plugins/orgs/views.py:43 xpack/plugins/orgs/views.py:60
|
||||
#: xpack/plugins/orgs/views.py:77
|
||||
|
@ -6168,15 +6190,6 @@ msgstr "创建"
|
|||
#~ msgid "%(name)s was %(action)s successfully"
|
||||
#~ msgstr "%(name)s %(action)s成功"
|
||||
|
||||
#~ msgid "* For security, do not change {}'s password"
|
||||
#~ msgstr "* 为了安全,禁止更改 {} 的密码"
|
||||
|
||||
#~ msgid "* Please enter the correct password length"
|
||||
#~ msgstr "* 请输入正确的密码长度"
|
||||
|
||||
#~ msgid "* Password length range 6-30 bits"
|
||||
#~ msgstr "* 密码长度范围 6-30 位"
|
||||
|
||||
#~ msgid "Loading..."
|
||||
#~ msgstr "加载中..."
|
||||
|
||||
|
|
|
@ -0,0 +1,28 @@
|
|||
# Generated by Django 2.1.7 on 2019-09-19 13:00
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('ops', '0007_auto_20190724_2002'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='task',
|
||||
name='date_updated',
|
||||
field=models.DateTimeField(auto_now=True, verbose_name='Date updated'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='task',
|
||||
name='date_created',
|
||||
field=models.DateTimeField(auto_now_add=True, db_index=True, verbose_name='Date created'),
|
||||
),
|
||||
migrations.AlterModelOptions(
|
||||
name='task',
|
||||
options={'get_latest_by': 'date_created',
|
||||
'ordering': ('-date_updated',)},
|
||||
),
|
||||
]
|
|
@ -13,7 +13,7 @@ from django.utils import timezone
|
|||
from django.utils.translation import ugettext_lazy as _
|
||||
from django_celery_beat.models import PeriodicTask
|
||||
|
||||
from common.utils import get_signer, get_logger
|
||||
from common.utils import get_signer, get_logger, lazyproperty
|
||||
from orgs.utils import set_to_root_org
|
||||
from ..celery.utils import delete_celery_periodic_task, \
|
||||
create_or_update_celery_periodic_tasks, \
|
||||
|
@ -42,7 +42,8 @@ class Task(models.Model):
|
|||
is_deleted = models.BooleanField(default=False)
|
||||
comment = models.TextField(blank=True, verbose_name=_("Comment"))
|
||||
created_by = models.CharField(max_length=128, blank=True, default='')
|
||||
date_created = models.DateTimeField(auto_now_add=True, db_index=True)
|
||||
date_created = models.DateTimeField(auto_now_add=True, db_index=True, verbose_name=_("Date created"))
|
||||
date_updated = models.DateTimeField(auto_now=True, verbose_name=_("Date updated"))
|
||||
__latest_adhoc = None
|
||||
_ignore_auto_created_by = True
|
||||
|
||||
|
@ -51,16 +52,39 @@ class Task(models.Model):
|
|||
return str(self.id).split('-')[-1]
|
||||
|
||||
@property
|
||||
def latest_adhoc(self):
|
||||
if not self.__latest_adhoc:
|
||||
self.__latest_adhoc = self.get_latest_adhoc()
|
||||
return self.__latest_adhoc
|
||||
|
||||
@latest_adhoc.setter
|
||||
def latest_adhoc(self, item):
|
||||
self.__latest_adhoc = item
|
||||
def versions(self):
|
||||
return self.adhoc.all().count()
|
||||
|
||||
@property
|
||||
def is_success(self):
|
||||
if self.latest_history:
|
||||
return self.latest_history.is_success
|
||||
else:
|
||||
return False
|
||||
|
||||
@property
|
||||
def timedelta(self):
|
||||
if self.latest_history:
|
||||
return self.latest_history.timedelta
|
||||
else:
|
||||
return 0
|
||||
|
||||
@property
|
||||
def date_start(self):
|
||||
if self.latest_history:
|
||||
return self.latest_history.date_start
|
||||
else:
|
||||
return None
|
||||
|
||||
@property
|
||||
def assets_amount(self):
|
||||
return self.latest_adhoc.hosts.count()
|
||||
|
||||
@lazyproperty
|
||||
def latest_adhoc(self):
|
||||
return self.get_latest_adhoc()
|
||||
|
||||
@lazyproperty
|
||||
def latest_history(self):
|
||||
try:
|
||||
return self.history.all().latest()
|
||||
|
@ -139,6 +163,7 @@ class Task(models.Model):
|
|||
class Meta:
|
||||
db_table = 'ops_task'
|
||||
unique_together = ('name', 'created_by')
|
||||
ordering = ('-date_updated',)
|
||||
get_latest_by = 'date_created'
|
||||
|
||||
|
||||
|
@ -246,6 +271,7 @@ class AdHoc(models.Model):
|
|||
)
|
||||
|
||||
def _run_only(self):
|
||||
Task.objects.filter(id=self.task.id).update(date_updated=timezone.now())
|
||||
runner = AdHocRunner(self.inventory, options=self.options)
|
||||
try:
|
||||
result = runner.run(
|
||||
|
|
|
@ -19,7 +19,12 @@ class CeleryTaskSerializer(serializers.Serializer):
|
|||
class TaskSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = Task
|
||||
fields = '__all__'
|
||||
fields = [
|
||||
'id', 'name', 'interval', 'crontab', 'is_periodic',
|
||||
'is_deleted', 'comment', 'created_by', 'date_created',
|
||||
'versions', 'is_success', 'timedelta', 'assets_amount',
|
||||
'date_updated', 'history_summary',
|
||||
]
|
||||
|
||||
|
||||
class AdHocSerializer(serializers.ModelSerializer):
|
||||
|
|
|
@ -128,7 +128,7 @@ def hello_callback(result):
|
|||
@shared_task
|
||||
def add(a, b):
|
||||
time.sleep(5)
|
||||
return max(b)
|
||||
return a + b
|
||||
|
||||
|
||||
@shared_task
|
||||
|
|
|
@ -1,101 +1,87 @@
|
|||
{% extends '_base_list.html' %}
|
||||
{% load i18n %}
|
||||
{% load static %}
|
||||
|
||||
{% block content_left_head %}
|
||||
{# <div class="uc pull-left m-r-5"><a class="btn btn-sm btn-primary btn-create-asset"> {% trans "Create task" %} </a></div>#}
|
||||
{% endblock %}
|
||||
|
||||
|
||||
{% block table_search %}
|
||||
<form id="search_form" method="get" action="" class="pull-right form-inline">
|
||||
<div class="input-group">
|
||||
<input type="text" class="form-control input-sm" name="keyword" placeholder="{% trans 'Search' %}" value="{{ keyword }}">
|
||||
</div>
|
||||
<div class="input-group">
|
||||
<div class="input-group-btn">
|
||||
<button id='search_btn' type="submit" class="btn btn-sm btn-primary">
|
||||
{% trans "Search" %}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
{% endblock %}
|
||||
|
||||
{% block table_head %}
|
||||
<th class="text-center"></th>
|
||||
<th class="text-center">{% trans 'Name' %}</th>
|
||||
<th class="text-center">{% trans 'Run times' %}</th>
|
||||
<th class="text-center">{% trans 'Versions' %}</th>
|
||||
<th class="text-center">{% trans 'Hosts' %}</th>
|
||||
<th class="text-center">{% trans 'Success' %}</th>
|
||||
<th class="text-center">{% trans 'Date' %}</th>
|
||||
<th class="text-center">{% trans 'Time' %}</th>
|
||||
<th class="text-center">{% trans 'Action' %}</th>
|
||||
{% endblock %}
|
||||
|
||||
{% block table_body %}
|
||||
{% for object in task_list %}
|
||||
<tr class="gradeX">
|
||||
<td class="text-center"><input type="checkbox" class="cbx-term"> </td>
|
||||
<td class="text-left"><a href="{% url 'ops:task-detail' pk=object.id %}">{{ object.name }}</a></td>
|
||||
<td class="text-center">
|
||||
<span class="text-danger">{{ object.history_summary.failed }}</span>/<span class="text-navy">{{ object.history_summary.success}}</span>/{{ object.history_summary.total}}
|
||||
</td>
|
||||
<td class="text-center">{{ object.adhoc.all | length}}</td>
|
||||
<td class="text-center">{{ object.latest_adhoc.hosts | length}}</td>
|
||||
<td class="text-center">
|
||||
{% if object.latest_history %}
|
||||
{% if object.latest_history.is_success %}
|
||||
<i class="fa fa-check text-navy"></i>
|
||||
{% else %}
|
||||
<i class="fa fa-times text-danger"></i>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
</td>
|
||||
<td class="text-center">{{ object.latest_history.date_start }}</td>
|
||||
<td class="text-center">
|
||||
{% if object.latest_history %}
|
||||
{{ object.latest_history.timedelta|floatformat }} s
|
||||
{% endif %}
|
||||
</td>
|
||||
<td class="text-center">
|
||||
<a data-uid="{{ object.id }}" class="btn btn-xs btn-primary btn-run">{% trans "Run" %}</a>
|
||||
<a data-uid="{{ object.id }}" class="btn btn-xs btn-danger btn-del">{% trans "Delete" %}</a>
|
||||
</td>
|
||||
{% load i18n static %}
|
||||
{% block table_search %}{% endblock %}
|
||||
{% block table_container %}
|
||||
<table class="table table-striped table-bordered table-hover " id="task_list_table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="text-center">
|
||||
<input id="" type="checkbox" class="ipt_check_all">
|
||||
</th>
|
||||
<th class="text-left">{% trans 'Name' %}</th>
|
||||
<th class="text-center">{% trans 'Run times' %}</th>
|
||||
<th class="text-center">{% trans 'Versions' %}</th>
|
||||
<th class="text-center">{% trans 'Hosts' %}</th>
|
||||
<th class="text-center">{% trans 'Success' %}</th>
|
||||
<th class="text-center">{% trans 'Date' %}</th>
|
||||
<th class="text-center">{% trans 'Time' %}</th>
|
||||
<th class="text-center">{% trans 'Action' %}</th>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</thead>
|
||||
</table>
|
||||
{% endblock %}
|
||||
|
||||
{% block content_bottom_left %}{% endblock %}
|
||||
{% block custom_foot_js %}
|
||||
<script src="{% static 'js/plugins/datepicker/bootstrap-datepicker.js' %}"></script>
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
$('table').DataTable({
|
||||
"searching": false,
|
||||
"paging": false,
|
||||
"bInfo" : false,
|
||||
"order": [],
|
||||
"columnDefs": [
|
||||
{ "targets": 0, "orderable": false },
|
||||
{ "targets": 4, "orderable": false },
|
||||
{ "targets": 5, "orderable": false },
|
||||
{ "targets": 8, "orderable": false }
|
||||
]
|
||||
});
|
||||
$('.select2').select2({
|
||||
dropdownAutoWidth : true,
|
||||
width: 'auto'
|
||||
});
|
||||
$('#date .input-daterange').datepicker({
|
||||
format: "yyyy-mm-dd",
|
||||
todayBtn: "linked",
|
||||
keyboardNavigation: false,
|
||||
forceParse: false,
|
||||
calendarWeeks: true,
|
||||
autoclose: true
|
||||
});
|
||||
|
||||
$(document).ready(function () {
|
||||
var options = {
|
||||
ele: $('#task_list_table'),
|
||||
buttons: [],
|
||||
columnDefs: [
|
||||
{targets: 1, createdCell: function (td, cellData, rowData) {
|
||||
cellData = htmlEscape(cellData);
|
||||
var innerHtml = '<a href="{% url "ops:task-detail" pk=DEFAULT_PK %}">' + cellData + '</a>'
|
||||
innerHtml = innerHtml.replace('{{ DEFAULT_PK }}', rowData.id);
|
||||
$(td).html(innerHtml);
|
||||
}},
|
||||
{targets: 2, createdCell: function (td, cellData) {
|
||||
var innerHtml = '<span class="text-danger">failed</span>/<span class="text-navy">success</span>/total';
|
||||
if (cellData) {
|
||||
innerHtml = innerHtml.replace('failed', cellData.failed)
|
||||
.replace('success', cellData.success)
|
||||
.replace('total', cellData.total);
|
||||
$(td).html(innerHtml);
|
||||
} else {
|
||||
$(td).html('')
|
||||
}
|
||||
}},
|
||||
{targets: 5, createdCell: function (td, cellData) {
|
||||
var successBtn = '<i class="fa fa-check text-navy"></i>';
|
||||
var failedBtn = '<i class="fa fa-times text-danger"></i>';
|
||||
if (cellData) {
|
||||
$(td).html(successBtn)
|
||||
} else {
|
||||
$(td).html(failedBtn)
|
||||
}
|
||||
}},
|
||||
{targets: 6, createdCell: function (td, cellData) {
|
||||
$(td).html(toSafeLocalDateStr(cellData));
|
||||
}},
|
||||
{targets: 7, createdCell: function (td, cellData) {
|
||||
var delta = readableSecond(cellData);
|
||||
$(td).html(delta);
|
||||
}},
|
||||
{
|
||||
targets: 8,
|
||||
createdCell: function (td, cellData, rowData) {
|
||||
var runBtn = '<a data-uid="ID" class="btn btn-xs btn-primary btn-run">{% trans "Run" %}</a> '.replace('ID', cellData);
|
||||
var delBtn = '<a data-uid="ID" class="btn btn-xs btn-danger btn-del">{% trans "Delete" %}</a>'.replace('ID', cellData);
|
||||
$(td).html(runBtn + delBtn)
|
||||
}
|
||||
}
|
||||
],
|
||||
ajax_url: '{% url "api-ops:task-list" %}',
|
||||
columns: [
|
||||
{data: "id"}, {data: "name", className: "text-left"}, {data: "history_summary", orderable: false},
|
||||
{data: "versions", orderable: false}, {data: "assets_amount", orderable: false},
|
||||
{data: "is_success", orderable: false}, {data: "date_updated"},
|
||||
{data: "timedelta", orderable:false}, {data: "id", orderable: false},
|
||||
],
|
||||
order: [],
|
||||
op_html: $('#actions').html()
|
||||
};
|
||||
jumpserver.initServerSideDataTable(options);
|
||||
}).on('click', '.btn-del', function () {
|
||||
var $this = $(this);
|
||||
var name = $this.closest("tr").find(":nth-child(2)").children('a').html();
|
||||
|
@ -122,7 +108,6 @@ $(document).ready(function() {
|
|||
success: success,
|
||||
success_message: "{% trans 'Task start: ' %}" + " " + name
|
||||
});
|
||||
|
||||
})
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
from django.utils.translation import ugettext as _
|
||||
from django.conf import settings
|
||||
from django.views.generic import ListView, DetailView
|
||||
from django.views.generic import ListView, DetailView, TemplateView
|
||||
|
||||
from common.mixins import DatetimeSearchMixin
|
||||
from common.permissions import PermissionsMixin, IsOrgAdmin
|
||||
|
@ -17,7 +17,7 @@ __all__ = [
|
|||
]
|
||||
|
||||
|
||||
class TaskListView(PermissionsMixin, DatetimeSearchMixin, ListView):
|
||||
class TaskListView(PermissionsMixin, TemplateView):
|
||||
paginate_by = settings.DISPLAY_PER_PAGE
|
||||
model = Task
|
||||
ordering = ('-date_created',)
|
||||
|
@ -26,27 +26,10 @@ class TaskListView(PermissionsMixin, DatetimeSearchMixin, ListView):
|
|||
keyword = ''
|
||||
permission_classes = [IsOrgAdmin]
|
||||
|
||||
def get_queryset(self):
|
||||
queryset = super().get_queryset()
|
||||
if current_org.is_real():
|
||||
queryset = queryset.filter(created_by=current_org.id)
|
||||
else:
|
||||
queryset = queryset.filter(created_by='')
|
||||
|
||||
self.keyword = self.request.GET.get('keyword', '')
|
||||
if self.keyword:
|
||||
queryset = queryset.filter(
|
||||
name__icontains=self.keyword,
|
||||
)
|
||||
return queryset
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = {
|
||||
'app': _('Ops'),
|
||||
'action': _('Task list'),
|
||||
'date_from': self.date_from,
|
||||
'date_to': self.date_to,
|
||||
'keyword': self.keyword,
|
||||
}
|
||||
kwargs.update(context)
|
||||
return super().get_context_data(**kwargs)
|
||||
|
|
|
@ -1139,7 +1139,10 @@ function timeOffset(a, b) {
|
|||
var start = safeDate(a);
|
||||
var end = safeDate(b);
|
||||
var offset = (end - start) / 1000;
|
||||
return readableSecond(offset)
|
||||
}
|
||||
|
||||
function readableSecond(offset) {
|
||||
var days = offset / 3600 / 24;
|
||||
var hours = offset / 3600;
|
||||
var minutes = offset / 60;
|
||||
|
|
|
@ -114,6 +114,9 @@
|
|||
<ul class="nav nav-second-level">
|
||||
<li id="task"><a href="{% url 'ops:task-list' %}">{% trans 'Task list' %}</a></li>
|
||||
<li id="command-execution"><a href="{% url 'ops:command-execution-start' %}">{% trans 'Batch command' %}</a></li>
|
||||
{% if request.user.is_superuser %}
|
||||
<li><a href="{% url 'flower-view' path='' %}" target="_blank" >{% trans 'Task monitor' %}</a></li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
</li>
|
||||
{% endif %}
|
||||
|
|
31
jms
31
jms
|
@ -200,9 +200,13 @@ def is_running(s, unlink=True):
|
|||
|
||||
|
||||
def parse_service(s):
|
||||
all_services = ['gunicorn', 'celery_ansible', 'celery_default', 'beat']
|
||||
all_services = [
|
||||
'gunicorn', 'celery_ansible', 'celery_default', 'beat', 'flower'
|
||||
]
|
||||
if s == 'all':
|
||||
return all_services
|
||||
elif s == 'gunicorn':
|
||||
return ['gunicorn', 'flower']
|
||||
elif s == "celery":
|
||||
return ["celery_ansible", "celery_default"]
|
||||
elif "," in s:
|
||||
|
@ -240,17 +244,19 @@ def get_start_gunicorn_kwargs():
|
|||
|
||||
|
||||
def get_start_celery_ansible_kwargs():
|
||||
print("\n- Start Celery as Distributed Task Queue")
|
||||
print("\n- Start Celery as Distributed Task Queue: Ansible")
|
||||
return get_start_worker_kwargs('ansible', 4)
|
||||
|
||||
|
||||
def get_start_celery_default_kwargs():
|
||||
print("\n- Start Celery as Distributed Task Queue: Celery")
|
||||
return get_start_worker_kwargs('celery', 2)
|
||||
|
||||
|
||||
def get_start_worker_kwargs(queue, num):
|
||||
# Todo: Must set this environment, otherwise not no ansible result return
|
||||
os.environ.setdefault('PYTHONOPTIMIZE', '1')
|
||||
os.environ.setdefault('ANSIBLE_FORCE_COLOR', 'True')
|
||||
|
||||
if os.getuid() == 0:
|
||||
os.environ.setdefault('C_FORCE_ROOT', '1')
|
||||
|
@ -261,6 +267,24 @@ def get_start_worker_kwargs(queue, num):
|
|||
'-l', 'INFO',
|
||||
'-c', str(num),
|
||||
'-Q', queue,
|
||||
'-n', '{}@%h'.format(queue)
|
||||
]
|
||||
return {"cmd": cmd, "cwd": APPS_DIR}
|
||||
|
||||
|
||||
def get_start_flower_kwargs():
|
||||
print("\n- Start Flower as Task Monitor")
|
||||
if os.getuid() == 0:
|
||||
os.environ.setdefault('C_FORCE_ROOT', '1')
|
||||
|
||||
cmd = [
|
||||
'celery', 'flower',
|
||||
'-A', 'ops',
|
||||
'-l', 'INFO',
|
||||
'--url_prefix=flower',
|
||||
'--auto_refresh=False',
|
||||
'--max_tasks=1000',
|
||||
'--tasks_columns=uuid,name,args,state,received,started,runtime,worker'
|
||||
]
|
||||
return {"cmd": cmd, "cwd": APPS_DIR}
|
||||
|
||||
|
@ -333,6 +357,7 @@ def start_service(s):
|
|||
"celery_ansible": get_start_celery_ansible_kwargs,
|
||||
"celery_default": get_start_celery_default_kwargs,
|
||||
"beat": get_start_beat_kwargs,
|
||||
"flower": get_start_flower_kwargs,
|
||||
}
|
||||
|
||||
kwargs = services_kwargs.get(s)()
|
||||
|
@ -449,7 +474,7 @@ if __name__ == '__main__':
|
|||
)
|
||||
parser.add_argument(
|
||||
"service", type=str, default="all", nargs="?",
|
||||
choices=("all", "gunicorn", "celery", "beat", "celery,beat"),
|
||||
choices=("all", "gunicorn", "celery", "beat", "celery,beat", "flower"),
|
||||
help="The service to start",
|
||||
)
|
||||
parser.add_argument('-d', '--daemon', nargs="?", const=1)
|
||||
|
|
Loading…
Reference in New Issue