Erstellen eines erweiterten Attributs mit Hook

From Univention Wiki

Jump to: navigation, search

Im folgenden wird exemplarisch das Anlegen eines erweiterten Attributs beschrieben, das für zusätzliche Änderungen am LDAP-Objekt einen Hook verwendet. Erweiterte Attribute werden in UCS seit Version 2.2-1 unterstützt.

Es soll ein erweitertes Attribut angelegt werden, das definiert, ob es sich bei einem Benutzerkonto um einen Beispielbenutzer handelt. Das erweiterte Attribut soll einen Wert vom Typ boolean speichern und im webbasierten Univention Directory Manager (UDM) eine Checkbox anzeigen, die aktiviert und deaktiviert werden kann.

In diesem Beispiel wird für die Speicherung des Wertes im LDAP die LDAP-Objektklasse univentionFreeAttributes verwendet. Diese LDAP-Objektklasse definiert 20 LDAP-Attribute (univentionFreeAttribute1 bis univentionFreeAttribute20) und wird von UCS automatisch mitgebracht. Sie ist ohne weitere Anpassungen oder Einstellungen sofort für eigene Erweiterungen nutzbar und kann an beliebigen Objekten verwendet werden.

Über einen Hook soll dafür gesorgt werden, dass beim Deaktivieren der Checkbox im UDM (oder beim Setzen des Wertes "0" über UDM-CLI) automatisch die LDAP-Objektklasse univentionFreeAttributes wieder vom Benutzerobjekt entfernt wird.

Dazu muss zunächst das Verzeichnis /usr/lib/python2.4/site-packages/univention/admin/hooks.d/ auf dem Domaincontroller Master angelegt werden, sofern dieses noch nicht existiert. Dies kann über den folgenden Befehl als Benutzer root erfolgen:

VERSION=$(python --version 2>&1 | sed 's/.*\<\([1-9]*\.[0-9]*\)\..*/\1/')
mkdir -p /usr/lib/pymodules/python${VERSION}/univention/admin/hooks.d

Anschließend kann in diesem Verzeichnis eine Python-Datei beispielhook.py mit der benötigten Hook-Klasse abgelegt werden (der Name muss auf .py enden). Die Datei definiert die für dieses Beispiel benötigte Hook-Klasse RemoveObjClassIfUnused, die mehrere Hook-Funktionen enthält. Der Inhalt der Datei sollte wie folgt aussehen:

from univention.admin.hook import simpleHook
class RemoveObjClassIfUnused(simpleHook):
	type='RemoveObjClassIfUnused'

	def hook_ldap_post_modify(self, module):
		univention.debug.debug(univention.debug.ADMIN, univention.debug.INFO,
							   'RemoveObjClassIfUnused: _ldap_post_modify called')
		extattrname = 'isSampleUser'
		classname = 'univentionFreeAttributes'
		if module.oldinfo.get(extattrname) in ['1'] and module.info.get(extattrname) in ['0', None]:
			if classname in module.oldattr.get('objectClass', []):
				module.lo.modify(module.dn, [('objectClass', classname, '')])

	def hook_open(self, module):
		pass

	def hook_ldap_pre_create(self, module):
		pass

	def hook_ldap_addlist(self, module, al=[]):
		return al

	def hook_ldap_post_create(self, module):
		pass

	def hook_ldap_pre_modify(self, module):
		pass

	def hook_ldap_modlist(self, module, ml=[]):
		return ml

	def hook_ldap_pre_remove(self, module):
		pass

	def hook_ldap_post_remove(self, module):
		pass

Wie in diesem Beispiel zu sehen ist, müssen in der Hook-Klasse mehrere Hook-Funktionen implementiert werden. Die Standardimplementierung simpleHook implementiert bereits alle Funktionen so, daß diese beim Aufruf eine Debug-Meldung produzieren. Die Funktion hook_ldap_post_modify() setzt die gewünschte Funktionalität um, dass beim Entfernen des Hakens aus der Checkbox auch die LDAP-Objektklasse vom Benutzerobjekt entfernt wird. Die kurze Logmeldung, die über die Funktion univention.debug.debug() ausgegeben wird, wird in der Logdatei /var/log/univention/directory-manager-cmd.log bzw. /var/log/univention/directory-manager-web.log gespeichert, wenn der Loglevel zuvor auf 4 gesetzt wurde.

Nach dem Erstellen der Hook-Datei muss das erweiterte Attribut angelegt werden. Im folgenden werden Befehle zum Erstellen des erweiterten Attributs auf der Kommandozeile aufgelistet. Der Befehl definiert u.a. auf welchem Reiter das erweiterte Attribut angezeigt werden soll, welchen Beschreibungstext es erhält oder welches LDAP-Attribut genutzt werden soll. Durch die Angabe von hook="RemoveObjClassIfUnused" wird die Hook-Klasse mit dem erweiterten Attribut verknüpft. Das erweiterte Attribut ist nach dem Anlegen sofort einsatzbereit.

$ eval "$(ucr shell)"
$ udm settings/extended_attribute create \
      --ignore_exists \
      --position "cn=custom attributes,cn=univention,$ldap_base" \
      --set name="extAttr-isSampleUser" \
      --set CLIName="isSampleUser" \
      --set module="users/user" \
      --set tabName="Sample tab" \
      --append translationTabName='"de_DE" "Beispielreiter"' \
      --set tabPosition=1 \
      --set shortDescription="User is sample user" \
      --append translationShortDescription='"de_DE" "Benutzer ist ein Beispielbenutzer"' \
      --set longDescription="This user is a special sample user" \
      --append translationLongDescription='"de_DE" "Dieser Benutzer ist ein spezieller Beispielbenutzer"' \
      --set objectClass="univentionFreeAttributes" \
      --set ldapMapping="univentionFreeAttribute1" \
      --set syntax=boolean \
      --set tabAdvanced=0 \
      --set mayChange=1 \
      --set multivalue=0 \
      --set default=0 \
      --set hook="RemoveObjClassIfUnused"

In diesem Beispiel wird als LDAP-Objektklasse univentionFreeAttributes benutzt. Dies ist ein LDAP-Schema für Kundenerweiterungen, das von Univention Corporate Server bereit gestellt wird, um den Aufwand für kleine Erweiterungen im LDAP möglichst gering zu halten. Die LDAP-Objektklasse univentionFreeAttributes kann ohne Einschränkungen für benutzerdefinierte Attribute bzw. erweiterte Attribute verwendet werden. Sie bringt 20 frei zu verwendende Attribute (univentionFreeAttribute1 bis univentionFreeAttribute20) mit und kann in Verbindung mit jedem beliebigen LDAP-Objekt (z.B. einem Benutzerobjekt) verwendet werden. Für komplexere Erweiterungen können eigenen LDAP-Objektklassen definiert und über objectClass mit eingebunden werden.

Wird der Univention Directory Manager nicht nur auf dem Domaincontroller Master verwendet, ist der beschriebene Vorgang auf allen anderen Systemen mit installiertem UDM auf gleiche Weise zu wiederholen.

Weitere Informationen zu Hooks für erweiterte Attribute finden sich auch in SDB #1080.

Personal tools