UCS Hooks in 3.1?

german

#1

Hallo,

ich versuche seit Stunden vergeblich gemäß

Anleitung: wiki.univention.de/index.php?tit … s_mit_Hook
Forum: Fragen zur UDM/UMC Programmierung
und Google einen Hook in 3.1 zu implementieren.

Ich erhalte einfach keine Ausgabe, die mich glauben lassen würde, dass der Hook geladen/gestartet wird, wenn ich das entsprechende Feld in der Web-GUI (de-)aktiviere.

Folgende Pfade habe ich bereits probiert:

hier mein UDM Eintrag:

[quote]DN: cn=extAttr-isSampleUser,cn=custom attributes,cn=univention,dc=ad,dc=in,dc=xplosion,dc=de
ARG: None
translationLongDescription: de_DE: Dieser Benutzer ist ein spezieller Beispielbenutzer
objectClass: univentionFreeAttributes
groupPosition: None
module: users/user
overwritePosition: None
hook: RemoveObjClassIfUnused
overwriteTab: None
translationTabName: de_DE: Beispielreiter
shortDescription: User is sample user
groupName: None
version: 2
valueRequired: None
CLIName: isSampleUser
translationShortDescription: de_DE: Benutzer ist ein Beispielbenutzer
fullWidth: None
longDescription: This user is a special sample user
doNotSearch: None
tabName: Sample tab
syntax: boolean
tabAdvanced: 0
name: extAttr-isSampleUser
default: 0
mayChange: 1
multivalue: 0
ldapMapping: univentionFreeAttribute1
deleteObjectClass: None
notEditable: 0
options: None
tabPosition: 1
disableUDMWeb: None
[/quote]

Die Datei hat “+x” und endet auf “.py”. Mein “Hook”:

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

Jemand einen Hinweis/Tipp?

Danke,

Fabian


#2

Hallo,

ich habe das Beispiel aus dem Wiki noch einmal mit einem 3.1-1-System ausprobiert. Der Pfad war in der Tat nicht korrekt (das habe ich im Wiki angepasst). Mit dem folgenden Pfad funktioniert es:

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

Danach habe ich den Beispiel-Python-Code in dem obigen Verzeichnis hooks.d als hook.py gespeichert (die Endung .py ist wichtig, sonst wird die Datei ignoriert, das wird auch im Wiki beschrieben) und das Extended Attribut wie dort angegeben angelegt. Um die Log-Level auch für UMC anzupassen habe ich folgende Variablen gesetzt:

ucr set umc/{server,module}/debug/level=4

Damit der geänderte Log-Level wirksam wird, muss der UMC-Server neu gestartet werden:

invoke-rc.d univention-management-console-server restart

Danach konnte ich die Debug-Ausgabe in den Logdateien finden:

rgrep _ldap_post_modify /var/log/univention/

Ich hoffe das hilft weiter.

Viele Grüße
Alexander Kläser