diff --git a/apps/locale/ja/LC_MESSAGES/django.po b/apps/locale/ja/LC_MESSAGES/django.po index 91c1abe30..ac6f12e6a 100644 --- a/apps/locale/ja/LC_MESSAGES/django.po +++ b/apps/locale/ja/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-02-22 21:23+0800\n" +"POT-Creation-Date: 2023-02-23 16:29+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -249,7 +249,7 @@ msgstr "アカウントバックアップ計画" #: accounts/models/automations/backup_account.py:83 #: assets/models/automations/base.py:114 audits/models.py:55 -#: ops/models/base.py:55 ops/models/celery.py:63 ops/models/job.py:186 +#: ops/models/base.py:55 ops/models/celery.py:63 ops/models/job.py:191 #: perms/models/asset_permission.py:72 terminal/models/applet/host.py:109 #: terminal/models/session/session.py:45 #: tickets/models/ticket/apply_application.py:30 @@ -371,7 +371,7 @@ msgstr "開始日" #: accounts/models/automations/change_secret.py:74 #: assets/models/automations/base.py:115 ops/models/base.py:56 -#: ops/models/celery.py:64 ops/models/job.py:187 +#: ops/models/celery.py:64 ops/models/job.py:192 #: terminal/models/applet/host.py:110 msgid "Date finished" msgstr "終了日" @@ -450,7 +450,7 @@ msgstr "アカウントの確認" #: assets/serializers/platform.py:91 assets/serializers/platform.py:136 #: authentication/serializers/connect_token_secret.py:103 ops/mixin.py:21 #: ops/models/adhoc.py:21 ops/models/celery.py:15 ops/models/celery.py:57 -#: ops/models/job.py:90 ops/models/playbook.py:23 ops/serializers/job.py:19 +#: ops/models/job.py:91 ops/models/playbook.py:23 ops/serializers/job.py:19 #: orgs/models.py:69 perms/models/asset_permission.py:56 rbac/models/role.py:29 #: settings/models.py:33 settings/serializers/sms.py:6 #: terminal/models/applet/applet.py:27 terminal/models/component/endpoint.py:12 @@ -546,7 +546,7 @@ msgstr "カテゴリ" #: assets/models/cmd_filter.py:74 assets/models/platform.py:78 #: assets/serializers/asset/common.py:122 assets/serializers/platform.py:96 #: audits/serializers.py:48 -#: authentication/serializers/connect_token_secret.py:116 ops/models/job.py:101 +#: authentication/serializers/connect_token_secret.py:116 ops/models/job.py:102 #: perms/serializers/user_permission.py:26 terminal/models/applet/applet.py:31 #: terminal/models/component/storage.py:57 #: terminal/models/component/storage.py:146 terminal/serializers/applet.py:29 @@ -599,7 +599,7 @@ msgstr "特別情報" #: accounts/serializers/automations/base.py:22 #: assets/models/automations/base.py:19 #: assets/serializers/automations/base.py:20 ops/models/base.py:17 -#: ops/models/job.py:103 ops/serializers/job.py:20 +#: ops/models/job.py:104 ops/serializers/job.py:20 #: terminal/templates/terminal/_msg_command_execute_alert.html:16 msgid "Assets" msgstr "資産" @@ -1065,7 +1065,7 @@ msgstr "SSHパブリックキー" #: assets/models/_user.py:27 assets/models/cmd_filter.py:40 #: assets/models/cmd_filter.py:88 assets/models/group.py:23 -#: common/db/models.py:37 ops/models/adhoc.py:27 ops/models/job.py:109 +#: common/db/models.py:37 ops/models/adhoc.py:27 ops/models/job.py:110 #: ops/models/playbook.py:26 rbac/models/role.py:37 settings/models.py:38 #: terminal/models/applet/applet.py:36 terminal/models/applet/applet.py:158 #: terminal/models/applet/host.py:111 terminal/models/component/endpoint.py:24 @@ -1078,7 +1078,7 @@ msgstr "コメント" #: assets/models/_user.py:28 assets/models/automations/base.py:113 #: assets/models/cmd_filter.py:41 assets/models/group.py:22 -#: common/db/models.py:35 ops/models/base.py:54 ops/models/job.py:185 +#: common/db/models.py:35 ops/models/base.py:54 ops/models/job.py:190 #: users/models/user.py:943 msgid "Date created" msgstr "作成された日付" @@ -1267,7 +1267,7 @@ msgid "Asset automation task" msgstr "アセットの自動化タスク" #: assets/models/automations/base.py:112 audits/models.py:177 -#: audits/serializers.py:49 ops/models/base.py:49 ops/models/job.py:178 +#: audits/serializers.py:49 ops/models/base.py:49 ops/models/job.py:183 #: terminal/models/applet/applet.py:157 terminal/models/applet/host.py:108 #: terminal/models/component/status.py:27 terminal/serializers/applet.py:18 #: terminal/serializers/applet_host.py:93 tickets/models/ticket/general.py:283 @@ -3279,7 +3279,7 @@ msgstr "VCS" msgid "Adhoc" msgstr "コマンド#コマンド#" -#: ops/const.py:39 ops/models/job.py:99 +#: ops/const.py:39 ops/models/job.py:100 msgid "Playbook" msgstr "Playbook" @@ -3340,17 +3340,17 @@ msgstr "定期的または定期的に設定を行う必要があります" msgid "Pattern" msgstr "パターン" -#: ops/models/adhoc.py:24 ops/models/job.py:94 +#: ops/models/adhoc.py:24 ops/models/job.py:95 msgid "Module" msgstr "モジュール" -#: ops/models/adhoc.py:25 ops/models/celery.py:58 ops/models/job.py:93 +#: ops/models/adhoc.py:25 ops/models/celery.py:58 ops/models/job.py:94 #: terminal/models/component/task.py:16 msgid "Args" msgstr "アルグ" #: ops/models/adhoc.py:26 ops/models/base.py:16 ops/models/base.py:53 -#: ops/models/job.py:102 ops/models/job.py:184 ops/models/playbook.py:25 +#: ops/models/job.py:103 ops/models/job.py:189 ops/models/playbook.py:25 #: terminal/models/session/sharing.py:23 msgid "Creator" msgstr "作成者" @@ -3367,12 +3367,12 @@ msgstr "最後の実行" msgid "Date last run" msgstr "最終実行日" -#: ops/models/base.py:51 ops/models/job.py:182 +#: ops/models/base.py:51 ops/models/job.py:187 #: xpack/plugins/cloud/models.py:170 msgid "Result" msgstr "結果" -#: ops/models/base.py:52 ops/models/job.py:183 +#: ops/models/base.py:52 ops/models/job.py:188 msgid "Summary" msgstr "概要" @@ -3412,47 +3412,47 @@ msgstr "発売日" msgid "Celery Task Execution" msgstr "Celery タスク実行" -#: ops/models/job.py:96 +#: ops/models/job.py:97 msgid "Chdir" msgstr "実行ディレクトリ" -#: ops/models/job.py:97 +#: ops/models/job.py:98 msgid "Timeout (Seconds)" msgstr "タイムアウト(秒)" -#: ops/models/job.py:104 +#: ops/models/job.py:105 msgid "Use Parameter Define" msgstr "パラメータ定義を使用する" -#: ops/models/job.py:105 +#: ops/models/job.py:106 msgid "Parameters define" msgstr "パラメータ定義" -#: ops/models/job.py:106 +#: ops/models/job.py:107 msgid "Runas" msgstr "ユーザーとして実行" -#: ops/models/job.py:108 +#: ops/models/job.py:109 msgid "Runas policy" msgstr "ユーザー ポリシー" -#: ops/models/job.py:170 +#: ops/models/job.py:171 msgid "Job" msgstr "ジョブ#ジョブ#" -#: ops/models/job.py:181 +#: ops/models/job.py:186 msgid "Parameters" msgstr "パラメータ" -#: ops/models/job.py:189 +#: ops/models/job.py:194 msgid "Material" msgstr "" -#: ops/models/job.py:191 +#: ops/models/job.py:196 msgid "Material Type" msgstr "" -#: ops/models/job.py:442 +#: ops/models/job.py:455 msgid "Job Execution" msgstr "ジョブ実行" @@ -3528,6 +3528,10 @@ msgstr "定期的なタスクの作成または更新" msgid "Periodic check service performance" msgstr "サービスのパフォーマンスを定期的に確認する" +#: ops/tasks.py:114 +msgid "Clean up unexpected jobs" +msgstr "例外ジョブのクリーンアップ" + #: ops/templates/ops/celery_task_log.html:4 msgid "Task log" msgstr "タスクログ" @@ -5987,19 +5991,19 @@ msgstr "" "チケットのタイトル: {} チケット申請者: {} チケットプロセッサ: {} チケットID: " "{}" -#: tickets/handlers/base.py:86 +#: tickets/handlers/base.py:85 msgid "Change field" msgstr "フィールドを変更" -#: tickets/handlers/base.py:86 +#: tickets/handlers/base.py:85 msgid "Before change" msgstr "変更前" -#: tickets/handlers/base.py:86 +#: tickets/handlers/base.py:85 msgid "After change" msgstr "変更後" -#: tickets/handlers/base.py:98 +#: tickets/handlers/base.py:97 msgid "{} {} the ticket" msgstr "{} {} チケット" @@ -6255,7 +6259,7 @@ msgstr "無効な承認アクション" msgid "This user is not authorized to approve this ticket" msgstr "このユーザーはこの作業指示を承認する権限がありません" -#: users/api/user.py:179 +#: users/api/user.py:182 msgid "Could not reset self otp, use profile reset instead" msgstr "自己otpをリセットできませんでした、代わりにプロファイルリセットを使用" diff --git a/apps/locale/zh/LC_MESSAGES/django.po b/apps/locale/zh/LC_MESSAGES/django.po index 89a9dbcc4..1c622bbe9 100644 --- a/apps/locale/zh/LC_MESSAGES/django.po +++ b/apps/locale/zh/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: JumpServer 0.3.3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-02-22 21:23+0800\n" +"POT-Creation-Date: 2023-02-23 16:29+0800\n" "PO-Revision-Date: 2021-05-20 10:54+0800\n" "Last-Translator: ibuler \n" "Language-Team: JumpServer team\n" @@ -248,7 +248,7 @@ msgstr "账号备份计划" #: accounts/models/automations/backup_account.py:83 #: assets/models/automations/base.py:114 audits/models.py:55 -#: ops/models/base.py:55 ops/models/celery.py:63 ops/models/job.py:186 +#: ops/models/base.py:55 ops/models/celery.py:63 ops/models/job.py:191 #: perms/models/asset_permission.py:72 terminal/models/applet/host.py:109 #: terminal/models/session/session.py:45 #: tickets/models/ticket/apply_application.py:30 @@ -370,7 +370,7 @@ msgstr "开始日期" #: accounts/models/automations/change_secret.py:74 #: assets/models/automations/base.py:115 ops/models/base.py:56 -#: ops/models/celery.py:64 ops/models/job.py:187 +#: ops/models/celery.py:64 ops/models/job.py:192 #: terminal/models/applet/host.py:110 msgid "Date finished" msgstr "结束日期" @@ -449,7 +449,7 @@ msgstr "账号验证" #: assets/serializers/platform.py:91 assets/serializers/platform.py:136 #: authentication/serializers/connect_token_secret.py:103 ops/mixin.py:21 #: ops/models/adhoc.py:21 ops/models/celery.py:15 ops/models/celery.py:57 -#: ops/models/job.py:90 ops/models/playbook.py:23 ops/serializers/job.py:19 +#: ops/models/job.py:91 ops/models/playbook.py:23 ops/serializers/job.py:19 #: orgs/models.py:69 perms/models/asset_permission.py:56 rbac/models/role.py:29 #: settings/models.py:33 settings/serializers/sms.py:6 #: terminal/models/applet/applet.py:27 terminal/models/component/endpoint.py:12 @@ -542,7 +542,7 @@ msgstr "类别" #: assets/models/cmd_filter.py:74 assets/models/platform.py:78 #: assets/serializers/asset/common.py:122 assets/serializers/platform.py:96 #: audits/serializers.py:48 -#: authentication/serializers/connect_token_secret.py:116 ops/models/job.py:101 +#: authentication/serializers/connect_token_secret.py:116 ops/models/job.py:102 #: perms/serializers/user_permission.py:26 terminal/models/applet/applet.py:31 #: terminal/models/component/storage.py:57 #: terminal/models/component/storage.py:146 terminal/serializers/applet.py:29 @@ -595,7 +595,7 @@ msgstr "特殊信息" #: accounts/serializers/automations/base.py:22 #: assets/models/automations/base.py:19 #: assets/serializers/automations/base.py:20 ops/models/base.py:17 -#: ops/models/job.py:103 ops/serializers/job.py:20 +#: ops/models/job.py:104 ops/serializers/job.py:20 #: terminal/templates/terminal/_msg_command_execute_alert.html:16 msgid "Assets" msgstr "资产" @@ -1057,7 +1057,7 @@ msgstr "SSH公钥" #: assets/models/_user.py:27 assets/models/cmd_filter.py:40 #: assets/models/cmd_filter.py:88 assets/models/group.py:23 -#: common/db/models.py:37 ops/models/adhoc.py:27 ops/models/job.py:109 +#: common/db/models.py:37 ops/models/adhoc.py:27 ops/models/job.py:110 #: ops/models/playbook.py:26 rbac/models/role.py:37 settings/models.py:38 #: terminal/models/applet/applet.py:36 terminal/models/applet/applet.py:158 #: terminal/models/applet/host.py:111 terminal/models/component/endpoint.py:24 @@ -1070,7 +1070,7 @@ msgstr "备注" #: assets/models/_user.py:28 assets/models/automations/base.py:113 #: assets/models/cmd_filter.py:41 assets/models/group.py:22 -#: common/db/models.py:35 ops/models/base.py:54 ops/models/job.py:185 +#: common/db/models.py:35 ops/models/base.py:54 ops/models/job.py:190 #: users/models/user.py:943 msgid "Date created" msgstr "创建日期" @@ -1259,7 +1259,7 @@ msgid "Asset automation task" msgstr "资产自动化任务" #: assets/models/automations/base.py:112 audits/models.py:177 -#: audits/serializers.py:49 ops/models/base.py:49 ops/models/job.py:178 +#: audits/serializers.py:49 ops/models/base.py:49 ops/models/job.py:183 #: terminal/models/applet/applet.py:157 terminal/models/applet/host.py:108 #: terminal/models/component/status.py:27 terminal/serializers/applet.py:18 #: terminal/serializers/applet_host.py:93 tickets/models/ticket/general.py:283 @@ -3244,7 +3244,7 @@ msgstr "VCS" msgid "Adhoc" msgstr "命令" -#: ops/const.py:39 ops/models/job.py:99 +#: ops/const.py:39 ops/models/job.py:100 msgid "Playbook" msgstr "Playbook" @@ -3305,17 +3305,17 @@ msgstr "需要周期或定期设置" msgid "Pattern" msgstr "模式" -#: ops/models/adhoc.py:24 ops/models/job.py:94 +#: ops/models/adhoc.py:24 ops/models/job.py:95 msgid "Module" msgstr "模块" -#: ops/models/adhoc.py:25 ops/models/celery.py:58 ops/models/job.py:93 +#: ops/models/adhoc.py:25 ops/models/celery.py:58 ops/models/job.py:94 #: terminal/models/component/task.py:16 msgid "Args" msgstr "参数" #: ops/models/adhoc.py:26 ops/models/base.py:16 ops/models/base.py:53 -#: ops/models/job.py:102 ops/models/job.py:184 ops/models/playbook.py:25 +#: ops/models/job.py:103 ops/models/job.py:189 ops/models/playbook.py:25 #: terminal/models/session/sharing.py:23 msgid "Creator" msgstr "创建者" @@ -3332,12 +3332,12 @@ msgstr "最后执行" msgid "Date last run" msgstr "最后运行日期" -#: ops/models/base.py:51 ops/models/job.py:182 +#: ops/models/base.py:51 ops/models/job.py:187 #: xpack/plugins/cloud/models.py:170 msgid "Result" msgstr "结果" -#: ops/models/base.py:52 ops/models/job.py:183 +#: ops/models/base.py:52 ops/models/job.py:188 msgid "Summary" msgstr "汇总" @@ -3377,47 +3377,47 @@ msgstr "发布日期" msgid "Celery Task Execution" msgstr "Celery 任务执行" -#: ops/models/job.py:96 +#: ops/models/job.py:97 msgid "Chdir" msgstr "运行目录" -#: ops/models/job.py:97 +#: ops/models/job.py:98 msgid "Timeout (Seconds)" msgstr "超时时间(秒)" -#: ops/models/job.py:104 +#: ops/models/job.py:105 msgid "Use Parameter Define" msgstr "使用参数定义" -#: ops/models/job.py:105 +#: ops/models/job.py:106 msgid "Parameters define" msgstr "参数定义" -#: ops/models/job.py:106 +#: ops/models/job.py:107 msgid "Runas" msgstr "运行用户" -#: ops/models/job.py:108 +#: ops/models/job.py:109 msgid "Runas policy" msgstr "用户策略" -#: ops/models/job.py:170 +#: ops/models/job.py:171 msgid "Job" msgstr "作业" -#: ops/models/job.py:181 +#: ops/models/job.py:186 msgid "Parameters" msgstr "参数" -#: ops/models/job.py:189 +#: ops/models/job.py:194 msgid "Material" msgstr "" -#: ops/models/job.py:191 +#: ops/models/job.py:196 msgid "Material Type" msgstr "" -#: ops/models/job.py:442 +#: ops/models/job.py:455 msgid "Job Execution" msgstr "作业执行" @@ -3493,6 +3493,10 @@ msgstr "创建或更新周期任务" msgid "Periodic check service performance" msgstr "周期检测服务性能" +#: ops/tasks.py:114 +msgid "Clean up unexpected jobs" +msgstr "清理异常作业" + #: ops/templates/ops/celery_task_log.html:4 msgid "Task log" msgstr "任务列表" @@ -5909,19 +5913,19 @@ msgid "" msgstr "" "通过工单创建, 工单标题: {}, 工单申请人: {}, 工单处理人: {}, 工单 ID: {}" -#: tickets/handlers/base.py:86 +#: tickets/handlers/base.py:85 msgid "Change field" msgstr "变更字段" -#: tickets/handlers/base.py:86 +#: tickets/handlers/base.py:85 msgid "Before change" msgstr "变更前" -#: tickets/handlers/base.py:86 +#: tickets/handlers/base.py:85 msgid "After change" msgstr "变更后" -#: tickets/handlers/base.py:98 +#: tickets/handlers/base.py:97 msgid "{} {} the ticket" msgstr "{} {} 工单" @@ -6175,7 +6179,7 @@ msgstr "无效的审批动作" msgid "This user is not authorized to approve this ticket" msgstr "此用户无权审批此工单" -#: users/api/user.py:179 +#: users/api/user.py:182 msgid "Could not reset self otp, use profile reset instead" msgstr "不能在该页面重置 MFA 多因子认证, 请去个人信息页面重置" diff --git a/apps/ops/models/job.py b/apps/ops/models/job.py index 4cb297191..ed936ddba 100644 --- a/apps/ops/models/job.py +++ b/apps/ops/models/job.py @@ -3,6 +3,7 @@ import logging import os import uuid from collections import defaultdict +from datetime import timedelta from celery import current_task from django.conf import settings @@ -172,6 +173,10 @@ class Job(JMSOrgBaseModel, PeriodTaskModelMixin): ordering = ['date_created'] +zombie_task_exception = Exception( + 'This task has been marked as a zombie task because it has not updated its status for too long') + + class JobExecution(JMSOrgBaseModel): id = models.UUIDField(default=uuid.uuid4, primary_key=True) task_id = models.UUIDField(null=True) @@ -190,6 +195,14 @@ class JobExecution(JMSOrgBaseModel): job_type = models.CharField(max_length=128, choices=Types.choices, default=Types.adhoc, verbose_name=_("Material Type")) + # clean up zombie execution + + @classmethod + def clean_unexpected_execution(cls): + for execution in cls.objects.filter(status__in=[JobStatus.running]).all(): + if execution.date_created < (timezone.now() - timedelta(hours=3)): + execution.set_error(zombie_task_exception) + @property def current_job(self): if self.job.version != self.job_version: diff --git a/apps/ops/tasks.py b/apps/ops/tasks.py index aff569ba7..833e20ea0 100644 --- a/apps/ops/tasks.py +++ b/apps/ops/tasks.py @@ -5,7 +5,7 @@ from celery.exceptions import SoftTimeLimitExceeded from django.utils.translation import ugettext_lazy as _ from common.utils import get_logger, get_object_or_none -from orgs.utils import tmp_to_org +from orgs.utils import tmp_to_org, tmp_to_root_org from .celery.decorator import ( register_as_period_task, after_app_ready_start ) @@ -109,3 +109,10 @@ def create_or_update_registered_periodic_tasks(): @register_as_period_task(interval=3600) def check_server_performance_period(): ServerPerformanceCheckUtil().check_and_publish() + + +@shared_task(verbose_name=_("Clean up unexpected jobs")) +@register_as_period_task(interval=3600) +def clean_up_unexpected_jobs(): + with tmp_to_root_org(): + JobExecution.clean_unexpected_execution()