6e53f1689d
Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>
34 lines
1.2 KiB
Python
34 lines
1.2 KiB
Python
"""Reputation tasks"""
|
|
from django.core.cache import cache
|
|
from structlog.stdlib import get_logger
|
|
|
|
from authentik.events.geo import GEOIP_READER
|
|
from authentik.events.monitored_tasks import (
|
|
MonitoredTask,
|
|
TaskResult,
|
|
TaskResultStatus,
|
|
prefill_task,
|
|
)
|
|
from authentik.policies.reputation.models import Reputation
|
|
from authentik.policies.reputation.signals import CACHE_KEY_PREFIX
|
|
from authentik.root.celery import CELERY_APP
|
|
|
|
LOGGER = get_logger()
|
|
|
|
|
|
@CELERY_APP.task(bind=True, base=MonitoredTask)
|
|
@prefill_task
|
|
def save_reputation(self: MonitoredTask):
|
|
"""Save currently cached reputation to database"""
|
|
objects_to_update = []
|
|
for _, score in cache.get_many(cache.keys(CACHE_KEY_PREFIX + "*")).items():
|
|
rep, _ = Reputation.objects.get_or_create(
|
|
ip=score["ip"],
|
|
identifier=score["identifier"],
|
|
)
|
|
rep.ip_geo_data = GEOIP_READER.city_dict(score["ip"]) or {}
|
|
rep.score = score["score"]
|
|
objects_to_update.append(rep)
|
|
Reputation.objects.bulk_update(objects_to_update, ["score", "ip_geo_data"])
|
|
self.set_status(TaskResult(TaskResultStatus.SUCCESSFUL, ["Successfully updated Reputation"]))
|