events: create event when system task fails
This commit is contained in:
		| @ -14,7 +14,7 @@ from rest_framework.response import Response | ||||
| from rest_framework.serializers import Serializer | ||||
| from rest_framework.viewsets import ViewSet | ||||
|  | ||||
| from authentik.lib.tasks import TaskInfo | ||||
| from authentik.events.monitored_tasks import TaskInfo | ||||
|  | ||||
|  | ||||
| class TaskSerializer(Serializer): | ||||
|  | ||||
| @ -6,7 +6,7 @@ from structlog.stdlib import get_logger | ||||
|  | ||||
| from authentik import __version__ | ||||
| from authentik.events.models import Event, EventAction | ||||
| from authentik.lib.tasks import MonitoredTask, TaskResult, TaskResultStatus | ||||
| from authentik.events.monitored_tasks import MonitoredTask, TaskResult, TaskResultStatus | ||||
| from authentik.root.celery import CELERY_APP | ||||
|  | ||||
| LOGGER = get_logger() | ||||
|  | ||||
| @ -4,7 +4,7 @@ from typing import Any, Dict | ||||
| from django.views.generic.base import TemplateView | ||||
|  | ||||
| from authentik.admin.mixins import AdminRequiredMixin | ||||
| from authentik.lib.tasks import TaskInfo, TaskResultStatus | ||||
| from authentik.events.monitored_tasks import TaskInfo, TaskResultStatus | ||||
|  | ||||
|  | ||||
| class TaskListView(AdminRequiredMixin, TemplateView): | ||||
|  | ||||
| @ -11,7 +11,7 @@ from django.utils.timezone import now | ||||
| from structlog.stdlib import get_logger | ||||
|  | ||||
| from authentik.core.models import ExpiringModel | ||||
| from authentik.lib.tasks import MonitoredTask, TaskResult, TaskResultStatus | ||||
| from authentik.events.monitored_tasks import MonitoredTask, TaskResult, TaskResultStatus | ||||
| from authentik.root.celery import CELERY_APP | ||||
|  | ||||
| LOGGER = get_logger() | ||||
|  | ||||
| @ -22,7 +22,6 @@ from authentik.events.utils import cleanse_dict, get_user, sanitize_dict | ||||
| from authentik.lib.sentry import SentryIgnoredException | ||||
| from authentik.lib.utils.http import get_client_ip | ||||
| from authentik.policies.models import PolicyBindingModel | ||||
| from authentik.stages.email.tasks import send_mail | ||||
| from authentik.stages.email.utils import TemplateEmailMessage | ||||
|  | ||||
| LOGGER = get_logger("authentik.events") | ||||
| @ -57,6 +56,9 @@ class EventAction(models.TextChoices): | ||||
|     POLICY_EXCEPTION = "policy_exception" | ||||
|     PROPERTY_MAPPING_EXCEPTION = "property_mapping_exception" | ||||
|  | ||||
|     SYSTEM_TASK_EXECUTION = "system_task_execution" | ||||
|     SYSTEM_TASK_EXCEPTION = "system_task_exception" | ||||
|  | ||||
|     CONFIGURATION_ERROR = "configuration_error" | ||||
|  | ||||
|     MODEL_CREATED = "model_created" | ||||
| @ -280,6 +282,8 @@ class NotificationTransport(models.Model): | ||||
|         ) | ||||
|         # Email is sent directly here, as the call to send() should have been from a task. | ||||
|         try: | ||||
|             from authentik.stages.email.tasks import send_mail | ||||
|  | ||||
|             # pyright: reportGeneralTypeIssues=false | ||||
|             return send_mail(mail.__dict__)  # pylint: disable=no-value-for-parameter | ||||
|         except (SMTPException, ConnectionError, OSError) as exc: | ||||
|  | ||||
| @ -8,6 +8,8 @@ from typing import Any, Dict, List, Optional | ||||
| from celery import Task | ||||
| from django.core.cache import cache | ||||
| 
 | ||||
| from authentik.events.models import Event, EventAction | ||||
| 
 | ||||
| 
 | ||||
| class TaskResultStatus(Enum): | ||||
|     """Possible states of tasks""" | ||||
| @ -122,6 +124,13 @@ class MonitoredTask(Task): | ||||
|                 task_call_args=args, | ||||
|                 task_call_kwargs=kwargs, | ||||
|             ).save(self.result_timeout_hours) | ||||
|             Event.new( | ||||
|                 EventAction.SYSTEM_TASK_EXECUTION, | ||||
|                 message=( | ||||
|                     f"Task {self.__name__} finished successfully: " | ||||
|                     "\n".join(self._result.messages) | ||||
|                 ), | ||||
|             ).save() | ||||
|         return super().after_return(status, retval, task_id, args, kwargs, einfo=einfo) | ||||
| 
 | ||||
|     # pylint: disable=too-many-arguments | ||||
| @ -138,6 +147,13 @@ class MonitoredTask(Task): | ||||
|             task_call_args=args, | ||||
|             task_call_kwargs=kwargs, | ||||
|         ).save(self.result_timeout_hours) | ||||
|         Event.new( | ||||
|             EventAction.SYSTEM_TASK_EXCEPTION, | ||||
|             message=( | ||||
|                 f"Task {self.__name__} encountered an error: " | ||||
|                 "\n".join(self._result.messages) | ||||
|             ), | ||||
|         ).save() | ||||
|         return super().on_failure(exc, task_id, args, kwargs, einfo=einfo) | ||||
| 
 | ||||
|     def run(self, *args, **kwargs): | ||||
| @ -9,7 +9,7 @@ from authentik.events.models import ( | ||||
|     NotificationTransport, | ||||
|     NotificationTransportError, | ||||
| ) | ||||
| from authentik.lib.tasks import MonitoredTask, TaskResult, TaskResultStatus | ||||
| from authentik.events.monitored_tasks import MonitoredTask, TaskResult, TaskResultStatus | ||||
| from authentik.policies.engine import PolicyEngine, PolicyEngineMode | ||||
| from authentik.policies.models import PolicyBinding | ||||
| from authentik.root.celery import CELERY_APP | ||||
|  | ||||
| @ -87,4 +87,4 @@ class TestEventsNotifications(TestCase): | ||||
|                 "authentik.events.models.NotificationTransport.send", execute_mock | ||||
|             ): | ||||
|                 Event.new(EventAction.CUSTOM_PREFIX).save() | ||||
|         self.assertEqual(passes.call_count, 0) | ||||
|         self.assertEqual(passes.call_count, 1) | ||||
|  | ||||
| @ -8,7 +8,7 @@ from django.db.models.base import Model | ||||
| from django.utils.text import slugify | ||||
| from structlog.stdlib import get_logger | ||||
|  | ||||
| from authentik.lib.tasks import MonitoredTask, TaskResult, TaskResultStatus | ||||
| from authentik.events.monitored_tasks import MonitoredTask, TaskResult, TaskResultStatus | ||||
| from authentik.lib.utils.reflection import path_to_class | ||||
| from authentik.outposts.controllers.base import ControllerException | ||||
| from authentik.outposts.models import ( | ||||
|  | ||||
| @ -3,7 +3,7 @@ from django.core.cache import cache | ||||
| from structlog.stdlib import get_logger | ||||
|  | ||||
| from authentik.core.models import User | ||||
| from authentik.lib.tasks import MonitoredTask, TaskResult, TaskResultStatus | ||||
| from authentik.events.monitored_tasks import MonitoredTask, TaskResult, TaskResultStatus | ||||
| from authentik.policies.reputation.models import IPReputation, UserReputation | ||||
| from authentik.policies.reputation.signals import ( | ||||
|     CACHE_KEY_IP_PREFIX, | ||||
|  | ||||
| @ -5,7 +5,7 @@ from django.core.cache import cache | ||||
| from django.utils.text import slugify | ||||
| from ldap3.core.exceptions import LDAPException | ||||
|  | ||||
| from authentik.lib.tasks import MonitoredTask, TaskResult, TaskResultStatus | ||||
| from authentik.events.monitored_tasks import MonitoredTask, TaskResult, TaskResultStatus | ||||
| from authentik.root.celery import CELERY_APP | ||||
| from authentik.sources.ldap.models import LDAPSource | ||||
| from authentik.sources.ldap.sync import LDAPSynchronizer | ||||
|  | ||||
| @ -3,7 +3,7 @@ from django.utils.timezone import now | ||||
| from structlog.stdlib import get_logger | ||||
|  | ||||
| from authentik.core.models import User | ||||
| from authentik.lib.tasks import MonitoredTask, TaskResult, TaskResultStatus | ||||
| from authentik.events.monitored_tasks import MonitoredTask, TaskResult, TaskResultStatus | ||||
| from authentik.lib.utils.time import timedelta_from_string | ||||
| from authentik.root.celery import CELERY_APP | ||||
| from authentik.sources.saml.models import SAMLSource | ||||
|  | ||||
| @ -9,7 +9,7 @@ from django.core.mail.utils import DNS_NAME | ||||
| from django.utils.text import slugify | ||||
| from structlog.stdlib import get_logger | ||||
|  | ||||
| from authentik.lib.tasks import MonitoredTask, TaskResult, TaskResultStatus | ||||
| from authentik.events.monitored_tasks import MonitoredTask, TaskResult, TaskResultStatus | ||||
| from authentik.root.celery import CELERY_APP | ||||
| from authentik.stages.email.models import EmailStage | ||||
|  | ||||
|  | ||||
| @ -7584,6 +7584,8 @@ definitions: | ||||
|           - policy_execution | ||||
|           - policy_exception | ||||
|           - property_mapping_exception | ||||
|           - system_task_execution | ||||
|           - system_task_exception | ||||
|           - configuration_error | ||||
|           - model_created | ||||
|           - model_updated | ||||
| @ -8300,6 +8302,8 @@ definitions: | ||||
|           - policy_execution | ||||
|           - policy_exception | ||||
|           - property_mapping_exception | ||||
|           - system_task_execution | ||||
|           - system_task_exception | ||||
|           - configuration_error | ||||
|           - model_created | ||||
|           - model_updated | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	 Jens Langhammer
					Jens Langhammer