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