Listener Handler

german
integration

#1

Hallo,

Wir haben einen einfachen Listener. Der schreibt alles in ein File und ein Subprozess liest dieses und setzt es um.

#!/usr/bin/python2.6

__package__='' 	# workaround for PEP 366
import listener
import os, binascii, subprocess

name        = '7i'
description = 'update 7iApps on changes in UCS-LDAP'
filter      = '(objectClass=iiiiiii4ucs-user)'
attributes  = ['uid','uidNumber','cn','iiiiiii4ucs-user-type','iiiiiii4ucs-user-app-dokuwiki','iiiiiii4ucs-user-app-phpmyfaq','iiiiiii4ucs-user-app-redmine','iiiiiii4ucs-user-app-svn','iiiiiii4ucs-user-app-trac','iiiiiii4ucs-user-app-wordpress','iiiiiii4ucs-user-site-home','iiiiiii4ucs-user-site-test','iiiiiii4ucs-user-site-sites']

def handler(dn, new, old):
    listener.setuid(0)
    try:
        str = ''
        if new:
            for s in new:
                for val in new[s]:
                    str += 'new:'+s+'='+val+'\n'
        if old:
            for s in old:
                for val in old[s]:
                    str += 'old:'+s+'='+val+'\n'
        filename = '/tmp/7i4ucs-'+binascii.b2a_hex(os.urandom(15))
        f = open(filename,'w')
        f.write(str)
        f.close()  
        os.chmod(filename,0666)
        subprocess.call(['/usr/bin/7i4ucs','Listener',filename])
        # listener.run('/usr/bin/7i4ucs',['7i4ucs','Listener',filename],uid=0)
    finally:
        listener.unsetuid()
  1. Der Listener funktioniert aus meiner Sicht oft nicht. Wie kann ich überprüfen, wo es hängen bleibt? /var/log/univention/ hilft dabei oft nicht weiter.

  2. Wird der Listener nur aufgerufen, wenn ein LDAP-Objekt geändert hat? Ist es auch möglich den Listener anzustossen, wen der Admin in der UMC das User-Formular ohne Änderungen nur abschickt?

Besten Dank,
Michael Hofmann


#2

Hallo,

erstmal zu den Fragen:

[quote=“mphofmann”]1. Der Listener funktioniert aus meiner Sicht oft nicht. Wie kann ich überprüfen, wo es hängen bleibt? /var/log/univention/ hilft dabei oft nicht weiter.[/quote]Die Logdtatei des Listeners (/var/log/univention/listener.log) enthält eigentlich diverse Informationen zum Ablauf und den Listener-Modulen. Ggf. möchten Sie hier einfach das Debuglevel etwas erhöhen:ucr set listener/debug/level='4' /etc/init.d/univention-directory-listener restart
Um weitere Informationen aus Ihrem Modul zu erhalten, können Sie mit “univention-debug” Arbeiten. Beispiele dazu finden Sie z.B. im Wiki: [wiki]Entwicklung von Univention Directory Listener-Modulen[/wiki]
Zu beachten ist hier ggf. das die von Ihnen vorgegebenen Filter recht restriktiv ist. Das Modul wird nur auf Änderungen an den in “attributes” gelisteten Attributen an Objekten reagieren die die Objektklasse “iiiiiii4ucs-user” besitzen.

[quote=“mphofmann”]2. Wird der Listener nur aufgerufen, wenn ein LDAP-Objekt geändert hat? Ist es auch möglich den Listener anzustossen, wen der Admin in der UMC das User-Formular ohne Änderungen nur abschickt?[/quote]Der Listener kann nur auf Änderungen an LDAP-Objekten reagieren, er wird quasi vom LDAP-Server informiert. Aktionen in der UMC sind ihm daher unbekannt.

Ein paar Punkte die mir in Ihrem Modul noch aufgefallen sind:

  • listener.setuid(0) sollte nur für den Code verwendet werden wo es nötig ist, d.h. das schreiben der temporären Datei kann/sollte aus Benutzer “listener” geschehen.

  • Um eine “sichere” temporäre Datei zu generieren können Sie das Python-Modul “tempfile” verwenden. Das Modul sorg ggf. auch dafür dass die erzeugte Datei wieder gelöscht wird (beim close des Filedescriptor bzw. durch die garbage collection):

import tempfile tmp = tempfile.TemporaryFile() tmp.write('some')

  • Statt “subprocess.call” können Sie direkt “listener.run” verwenden (Beispiele ebenfalls im Wiki)

Mit freundlichen Grüßen
Janis Meybohm