Verwendung des HookManagers

From Univention Wiki

Jump to: navigation, search

Neu in UCS 2.4-1

Einführung

Die Pythonklasse HookManager aus dem Python-Modul univention.hooks versucht, ein einfaches Interface anzubieten, über das zusätzlicher Pythoncode einfach geladen und ausgeführt werden kann.

Verwendung

Der HookManager liest Python-Dateien aus einem übergebenen Verzeichnispfad ein und registriert die enthaltenen Python-Methoden zu einem oder mehreren Hooks. Die Python-Dateien müssen mindestens eine globale Methode register_hooks() enthalten. Dabei muss die Methode eine Liste von 2er-Tupeln ( (Hookname, Methode) ) zurückgeben. Der Hookname ist frei wählbar. Eine Methode kann für mehrere Hooknamen registriert werden.

Beispiel für eine Datei mit zwei Hook-Methoden:

def my_test_hook(*args, **kwargs):
	print 'TEST_HOOK:', args, kwargs
	return ['Mein', 'Result', 123]

def other_hook(*args, **kwargs):
	print 'ANOTHER_HOOK:', args, kwargs
	return ['Result', 'of' 'second', 'testhook']

def register_hooks():
	return [ ('test_hook', my_test_hook), ('pre_hook', other_hook) ]


Die Methode call_hook(hookname, *args, **kwargs) ruft alle registrierten Methoden für den angegebenen Hooknamen auf und übergibt *args und **kwargs an die Methoden. Der Rückgabewert von jeder Methode wird zwischengespeichert und von call_hook() als Liste zurückgegeben. Wurde keine Methode für einen Hooknamen registriert, wird eine leere Liste zurückgegeben ([]).

Wurde über den Methodenaufruf set_raise_exceptions(False) das Abfangen von Exceptions aktiviert, werden alle Exceptions, die während des Ladens von Python-Dateien auftreten stillschweigend verworfen. Die Hooks der betreffenden Datei sind ggf. nicht verfügbar. Weiterhin werden Exceptions, die während der Ausführung der Hook-Methoden auftreten, abgefangen und anstatt des Rückgabewerts in der Liste von call_hook() zurückgegeben.

Beispiel: [['Mein', 'Result', 123], <exceptions.ValueError instance at 0x7f80496f6638>]

>>> import univention.hooks
>>> hm = univention.hooks.HookManager('./test')
>>> hm.get_hook_list()
['test_hook', 'pre_hook']
>>> hm.call_hook('test_hook', 'abc', 123, x=1, y='B')
TEST_HOOK: ('abc', 123) {'y': 'B', 'x': 1}                                <=== OUTPUT OF FIRST TESTHOOK
MY_SECOND_TEST_HOOK: ('abc', 123) {'y': 'B', 'x': 1}                      <=== OUTPUT OF SECOND TESTHOOK
[['First-Hook', 'Result', 123], ['Result', 'of', 'second', 'testhook']]   <=== RESULT OF call_hook()
>>> hm.call_hook('unknown_hook')
[]
>>>

Verzeichnisse für Python-Hook-Dateien

  • /usr/lib/python2.4/site-packages/univention/management/console/handlers/update/hooks
  • /usr/share/pyshared/univention/admin/hookmanager

Weitere Informationen

Weitere Informationen zur Verwendung von Hooks finden sich in folgenden Artikeln:

Personal tools