43 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			43 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| """LDAP Sync tasks"""
 | |
| from time import time
 | |
| 
 | |
| from django.core.cache import cache
 | |
| from django.utils.text import slugify
 | |
| from ldap3.core.exceptions import LDAPException
 | |
| 
 | |
| from passbook.lib.tasks import MonitoredTask, TaskResult, TaskResultStatus
 | |
| from passbook.root.celery import CELERY_APP
 | |
| from passbook.sources.ldap.models import LDAPSource
 | |
| from passbook.sources.ldap.sync import LDAPSynchronizer
 | |
| 
 | |
| 
 | |
| @CELERY_APP.task()
 | |
| def ldap_sync_all():
 | |
|     """Sync all sources"""
 | |
|     for source in LDAPSource.objects.filter(enabled=True):
 | |
|         ldap_sync.delay(source.pk)
 | |
| 
 | |
| 
 | |
| @CELERY_APP.task(bind=True, base=MonitoredTask)
 | |
| def ldap_sync(self: MonitoredTask, source_pk: int):
 | |
|     """Sync a single source"""
 | |
|     source: LDAPSource = LDAPSource.objects.get(pk=source_pk)
 | |
|     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"],
 | |
|                 uid=slugify(source.name),
 | |
|             )
 | |
|         )
 | |
|     except LDAPException as exc:
 | |
|         self.set_status(
 | |
|             TaskResult(TaskResultStatus.ERROR, uid=slugify(source.name)).with_error(exc)
 | |
|         )
 | 
