events: create event when system task fails

This commit is contained in:
Jens Langhammer 2021-01-18 09:34:48 +01:00
parent 32667f37d1
commit 3d3a0cd9e3
14 changed files with 36 additions and 12 deletions

View file

@ -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):

View file

@ -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()

View file

@ -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):

View file

@ -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()

View file

@ -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:

View file

@ -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):

View file

@ -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

View file

@ -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)

View file

@ -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 (

View file

@ -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,

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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