Source code for univention.ldap_cache.listener_module
#!/usr/bin/python3
# SPDX-FileCopyrightText: 2021-2025 Univention GmbH
# SPDX-License-Identifier: AGPL-3.0-only
from __future__ import annotations
from logging import getLogger
from typing import TYPE_CHECKING, Any
from univention.ldap_cache.cache import get_cache
from univention.listener.handler import ListenerModuleHandler
if TYPE_CHECKING:
from collections.abc import Mapping, Sequence
[docs]
class LdapCacheHandler(ListenerModuleHandler):
def __init__(self, *args: Any, **kwargs: Any) -> None:
self._counter = 0
super().__init__(*args, **kwargs)
cache_logger = getLogger('univention.ldap_cache')
cache_logger.setLevel(self.logger.level)
for handler in self.logger.handlers:
cache_logger.addHandler(handler)
def _cleanup_cache_if_needed(self) -> None:
self._counter += 1
if self._counter % 1000 == 0:
for _name, db in get_cache():
db.cleanup()
[docs]
def create(self, dn: str, new: Mapping[str, Sequence[bytes]]) -> None:
for shard in get_cache().get_shards_for_query(self.config.get_ldap_filter()):
shard.add_object((dn, new))
self._cleanup_cache_if_needed()
[docs]
def modify(self, dn: str, old: Mapping[str, Sequence[bytes]], new: Mapping[str, Sequence[bytes]], old_dn: str | None) -> None:
for shard in get_cache().get_shards_for_query(self.config.get_ldap_filter()):
shard.rm_object((old_dn or dn, old))
shard.add_object((dn, new))
self._cleanup_cache_if_needed()
[docs]
def remove(self, dn: str, old: Mapping[str, Sequence[bytes]]) -> None:
for shard in get_cache().get_shards_for_query(self.config.get_ldap_filter()):
shard.rm_object((dn, old))
self._cleanup_cache_if_needed()
[docs]
def post_run(self) -> None:
self._counter = -1
self._cleanup_cache_if_needed()
[docs]
class Configuration(ListenerModuleHandler.Configuration):
priority = 2.0