Source code for univention.appcenter.listener
#!/usr/bin/python3
#
# Univention App Center
# Listener integration
#
# SPDX-FileCopyrightText: 2018-2025 Univention GmbH
# SPDX-License-Identifier: AGPL-3.0-only
#
import json
import os
import shutil
from datetime import datetime
from ldap.filter import filter_format
from univention.appcenter.app_cache import Apps
from univention.listener.handler import ListenerModuleHandler
LISTENER_DUMP_DIR = '/var/lib/univention-appcenter/listener/'
[docs]
class AppListener(ListenerModuleHandler):
def _get_new_file_name(self):
timestamp = datetime.now().strftime('%Y-%m-%d-%H-%M-%S-%f')
return '%s/%s/%s.json' % (LISTENER_DUMP_DIR, self.config.get_name(), timestamp)
[docs]
def initialize(self):
dirname = '%s/%s/' % (LISTENER_DUMP_DIR, self.config.get_name())
try:
with self.as_root():
shutil.rmtree(dirname)
except OSError:
pass
with self.as_root():
os.makedirs(dirname)
def _write_json(self, dn, obj, command, log_as=None):
app = Apps().find(self.config.get_name())
if app.listener_udm_version >= 3:
entry_uuid = obj.get('univentionObjectIdentifier', [None])[0]
else:
entry_uuid = obj.get('entryUUID', [None])[0]
object_type = obj.get('univentionObjectType', [None])[0]
attrs = {
'entry_uuid': entry_uuid.decode('UTF-8') if entry_uuid is not None else entry_uuid,
'dn': dn,
'object_type': object_type.decode('UTF-8') if object_type is not None else object_type,
'command': command,
}
with self.as_root():
filename = self._get_new_file_name()
with open(filename, 'w') as fd:
json.dump(attrs, fd, sort_keys=True, indent=4)
self.logger.info('%s of %s (id: %s, file: %s)', log_as or command, dn, entry_uuid, filename)
[docs]
def create(self, dn, new):
self._write_json(dn, new, 'modify', log_as='create')
[docs]
def modify(self, dn, old, new, old_dn):
self._write_json(dn, new, 'modify')
[docs]
def remove(self, dn, old):
self._write_json(dn, old, 'delete')
[docs]
class Configuration(ListenerModuleHandler.Configuration):
[docs]
def get_description(self):
return 'Listener module for App %s' % self.get_name()
[docs]
def get_ldap_filter(self):
app = Apps().find(self.get_name())
return '(|%s)' % ''.join(filter_format('(univentionObjectType=%s)', [udm_module]) for udm_module in app.listener_udm_modules)