diff --git a/apps/jumpserver/celery_flower.py b/apps/jumpserver/celery_flower.py new file mode 100644 index 000000000..480745ada --- /dev/null +++ b/apps/jumpserver/celery_flower.py @@ -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 = _("

Flow service unavailable, check it

") + \ + '

{}
'.format(e) + response = HttpResponse(msg) + return response + diff --git a/apps/jumpserver/conf.py b/apps/jumpserver/conf.py index dc3d43b78..a2250e112 100644 --- a/apps/jumpserver/conf.py +++ b/apps/jumpserver/conf.py @@ -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" } diff --git a/apps/jumpserver/settings.py b/apps/jumpserver/settings.py index d6ce267df..dd3fb170f 100644 --- a/apps/jumpserver/settings.py +++ b/apps/jumpserver/settings.py @@ -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 diff --git a/apps/jumpserver/urls.py b/apps/jumpserver/urls.py index 29168ab6c..80105743c 100644 --- a/apps/jumpserver/urls.py +++ b/apps/jumpserver/urls.py @@ -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.*)', 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\w+)/(?Pv\d)/.*', redirect_format_api), - path('api/health/', HealthCheckView.as_view(), name="health"), - path('luna/', LunaView.as_view(), name='luna-view'), - path('i18n//', I18NView.as_view(), name='i18n-switch'), + re_path('api/(?P\w+)/(?Pv\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//', views.I18NView.as_view(), name='i18n-switch'), path('settings/', include('settings.urls.view_urls', namespace='settings')), # External apps url diff --git a/apps/jumpserver/views.py b/apps/jumpserver/views.py index e9c064b66..06eb7feb5 100644 --- a/apps/jumpserver/views.py +++ b/apps/jumpserver/views.py @@ -224,3 +224,6 @@ class HealthCheckView(APIView): def get(self, request): return JsonResponse({"status": 1, "time": int(time.time())}) + + + diff --git a/apps/locale/zh/LC_MESSAGES/django.mo b/apps/locale/zh/LC_MESSAGES/django.mo index d927e9014..9e67176a9 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 b33f54cd6..bf93405a5 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-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 \n" "Language-Team: Jumpserver team\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>
Tips: Using 5 digits linux " @@ -5499,32 +5490,32 @@ msgstr "" "具)
注意: 如果同时设置了定期执行和周期执行,优先使用定期执行" #: 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 "加载中..." diff --git a/apps/ops/migrations/0008_auto_20190919_2100.py b/apps/ops/migrations/0008_auto_20190919_2100.py new file mode 100644 index 000000000..c804276dd --- /dev/null +++ b/apps/ops/migrations/0008_auto_20190919_2100.py @@ -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',)}, + ), + ] diff --git a/apps/ops/models/adhoc.py b/apps/ops/models/adhoc.py index 0b5e4d755..6cc802488 100644 --- a/apps/ops/models/adhoc.py +++ b/apps/ops/models/adhoc.py @@ -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( diff --git a/apps/ops/serializers.py b/apps/ops/serializers.py index d5da08306..c3df9d1ef 100644 --- a/apps/ops/serializers.py +++ b/apps/ops/serializers.py @@ -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): diff --git a/apps/ops/tasks.py b/apps/ops/tasks.py index f5e190780..2ed747692 100644 --- a/apps/ops/tasks.py +++ b/apps/ops/tasks.py @@ -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 diff --git a/apps/ops/templates/ops/task_list.html b/apps/ops/templates/ops/task_list.html index 965c62b8a..f97b83630 100644 --- a/apps/ops/templates/ops/task_list.html +++ b/apps/ops/templates/ops/task_list.html @@ -1,101 +1,87 @@ {% extends '_base_list.html' %} -{% load i18n %} -{% load static %} - -{% block content_left_head %} -{# #} -{% endblock %} - - -{% block table_search %} -
-
- -
-
-
- -
-
-
-{% endblock %} - -{% block table_head %} - - {% trans 'Name' %} - {% trans 'Run times' %} - {% trans 'Versions' %} - {% trans 'Hosts' %} - {% trans 'Success' %} - {% trans 'Date' %} - {% trans 'Time' %} - {% trans 'Action' %} -{% endblock %} - -{% block table_body %} - {% for object in task_list %} - - - {{ object.name }} - - {{ object.history_summary.failed }}/{{ object.history_summary.success}}/{{ object.history_summary.total}} - - {{ object.adhoc.all | length}} - {{ object.latest_adhoc.hosts | length}} - - {% if object.latest_history %} - {% if object.latest_history.is_success %} - - {% else %} - - {% endif %} - {% endif %} - - {{ object.latest_history.date_start }} - - {% if object.latest_history %} - {{ object.latest_history.timedelta|floatformat }} s - {% endif %} - - - {% trans "Run" %} - {% trans "Delete" %} - +{% load i18n static %} +{% block table_search %}{% endblock %} +{% block table_container %} + + + + + + + + + + + + - {% endfor %} + +
+ + {% trans 'Name' %}{% trans 'Run times' %}{% trans 'Versions' %}{% trans 'Hosts' %}{% trans 'Success' %}{% trans 'Date' %}{% trans 'Time' %}{% trans 'Action' %}
{% endblock %} +{% block content_bottom_left %}{% endblock %} {% block custom_foot_js %} - {% endblock %} diff --git a/apps/ops/views/adhoc.py b/apps/ops/views/adhoc.py index 06a9f1932..4df75305b 100644 --- a/apps/ops/views/adhoc.py +++ b/apps/ops/views/adhoc.py @@ -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) diff --git a/apps/static/js/jumpserver.js b/apps/static/js/jumpserver.js index 03c804da8..96f7a27dd 100644 --- a/apps/static/js/jumpserver.js +++ b/apps/static/js/jumpserver.js @@ -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; diff --git a/apps/templates/_nav.html b/apps/templates/_nav.html index 8b76e9b5d..5690c961d 100644 --- a/apps/templates/_nav.html +++ b/apps/templates/_nav.html @@ -114,6 +114,9 @@ {% endif %} diff --git a/jms b/jms index 17c0d8b47..805faac50 100755 --- a/jms +++ b/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)