Source code for univention.ldap_cache.cache.shard_config
#!/usr/bin/python3
# SPDX-FileCopyrightText: 2021-2025 Univention GmbH
# SPDX-License-Identifier: AGPL-3.0-only
from __future__ import annotations
import json
from contextlib import contextmanager
from typing import TYPE_CHECKING, Any
from univention.ldap_cache.cache import Shard
from univention.ldap_cache.log import log
if TYPE_CHECKING:
from collections.abc import Iterator
CONFIG_FILE = '/usr/share/univention-group-membership-cache/shards.json'
[docs]
def shards_from_config() -> list[type[Shard]]:
ret: list[type[Shard]] = []
try:
with open(CONFIG_FILE) as fd:
config = json.load(fd)
except (OSError, ValueError) as exc:
log('Could not load CONFIG_FILE: %s', exc)
else:
for data in config:
try:
class FromConfig(Shard):
db_name = data['db_name']
single_value = data['single_value']
reverse = data.get('reverse', False)
key = data['key']
value = data['value']
ldap_filter = data['ldap_filter']
ret.append(FromConfig)
except (TypeError, KeyError) as exc:
log('JSON wrong: %s', exc)
return ret
@contextmanager
def _writing_config() -> Iterator[Any]:
try:
with open(CONFIG_FILE) as fd:
shards = json.load(fd)
except OSError:
shards = []
yield shards
with open(CONFIG_FILE, 'w') as fd:
json.dump(shards, fd, sort_keys=True, indent=4)
[docs]
def add_shard_to_config(db_name: str, single_value: bool, reverse: bool, key: str, value: str, ldap_filter: str) -> None:
with _writing_config() as shards:
shard_config = {
'db_name': db_name,
'single_value': single_value and not reverse,
'reverse': reverse,
'key': key,
'value': value,
'ldap_filter': ldap_filter,
}
if shard_config not in shards:
shards.append(shard_config)
[docs]
def rm_shard_from_config(db_name: str, single_value: bool, reverse: bool, key: str, value: str, ldap_filter: str) -> None:
with _writing_config() as shards:
try:
shards.remove({
'db_name': db_name,
'single_value': single_value and not reverse,
'reverse': reverse,
'key': key,
'value': value,
'ldap_filter': ldap_filter,
})
except ValueError:
pass