2019-10-11 12:43:35 +01:00
|
|
|
"""LDAP Sync tasks"""
|
2020-09-19 14:25:17 +01:00
|
|
|
from time import time
|
|
|
|
|
|
|
|
from django.core.cache import cache
|
2020-10-16 20:31:12 +01:00
|
|
|
from django.utils.text import slugify
|
2020-10-16 13:17:47 +01:00
|
|
|
from ldap3.core.exceptions import LDAPException
|
2020-09-19 14:25:17 +01:00
|
|
|
|
2020-10-16 13:17:47 +01:00
|
|
|
from passbook.lib.tasks import MonitoredTask, TaskResult, TaskResultStatus
|
2019-10-11 11:53:48 +01:00
|
|
|
from passbook.root.celery import CELERY_APP
|
|
|
|
from passbook.sources.ldap.models import LDAPSource
|
2020-09-21 20:35:50 +01:00
|
|
|
from passbook.sources.ldap.sync import LDAPSynchronizer
|
2019-10-11 11:53:48 +01:00
|
|
|
|
|
|
|
|
|
|
|
@CELERY_APP.task()
|
2020-10-16 13:17:47 +01:00
|
|
|
def ldap_sync_all():
|
2019-10-11 11:53:48 +01:00
|
|
|
"""Sync all sources"""
|
|
|
|
for source in LDAPSource.objects.filter(enabled=True):
|
2020-10-16 13:17:47 +01:00
|
|
|
ldap_sync.delay(source.pk)
|
2020-09-14 22:35:01 +01:00
|
|
|
|
|
|
|
|
2020-10-16 13:17:47 +01:00
|
|
|
@CELERY_APP.task(bind=True, base=MonitoredTask)
|
|
|
|
def ldap_sync(self: MonitoredTask, source_pk: int):
|
2020-09-14 22:35:01 +01:00
|
|
|
"""Sync a single source"""
|
2020-09-19 14:25:17 +01:00
|
|
|
source: LDAPSource = LDAPSource.objects.get(pk=source_pk)
|
2020-10-16 13:17:47 +01:00
|
|
|
try:
|
|
|
|
syncer = LDAPSynchronizer(source)
|
|
|
|
user_count = syncer.sync_users()
|
|
|
|
group_count = syncer.sync_groups()
|
|
|
|
syncer.sync_membership()
|
|
|
|
cache_key = source.state_cache_prefix("last_sync")
|
|
|
|
cache.set(cache_key, time(), timeout=60 * 60)
|
|
|
|
self.set_status(
|
|
|
|
TaskResult(
|
|
|
|
TaskResultStatus.SUCCESSFUL,
|
|
|
|
[f"Synced {user_count} users", f"Synced {group_count} groups"],
|
2020-10-16 20:31:12 +01:00
|
|
|
uid=slugify(source.name),
|
2020-10-16 13:17:47 +01:00
|
|
|
)
|
|
|
|
)
|
|
|
|
except LDAPException as exc:
|
2020-10-16 15:42:46 +01:00
|
|
|
self.set_status(
|
2020-10-16 20:31:12 +01:00
|
|
|
TaskResult(TaskResultStatus.ERROR, uid=slugify(source.name)).with_error(exc)
|
2020-10-16 15:42:46 +01:00
|
|
|
)
|