Univention python API

german

#1

Hallo,
Gibt es eine Möglichkeit, die Python Module der Univention Directory Manager Tools direkt zu nutzen? Gibt es Dokumentationen darüber?

Zur Erklärung: Im Hause verwenden wir seit Jahren ein kleines Applet für Outlook, das die Abwesenheitsmeldungen der Nutzer verwaltet. Es sendet über einen kleinen eingebauten Mailer die Daten per Mail an einen bestimmten Account am Mailserver. Auch wenn ich persönlich bedenken betreffs dieser Implementation der Kommunikation mit dem Server habe, so soll es dennoch auch weiterhin nutzbar bleiben. Der Nutzer hat sich halt deran gewöhnt. Daher habe ich ein kleines Python-Skript geschrieben, dass /usr/sbin/univention-directory-manager aufruft (popen) und erst per “list” Daten zur Überprüfung holt und danach nötige Änderungen per “modify” per Kommandozeilenparameter übergibt (kolabForwardAddress/etc.). Das war auf die Schnelle für mich die einfachste Lösung, ist aber sicher nicht professionell und schon gar nicht perfekt. (denke ich mal)

Nun habe ich mir daher gedacht, das ginge doch vielleicht auch “the Univention Way”, wobei ich aber gar nicht weiß, wie dieser aussehen könnte. Können Sie mir da Tips geben? (Falls das Ergebnis irgendwie allgemein nutzbar werden sollte, was ich allerdings leider bezweifel, hätte ich auch kein Problem damit, es als Open Source zu veröffentlichen.)


#2

Hallo,

es ist möglich in Pythonskripten die Univention Directory Manager Module direkt anzusprechen. Ein Beispiel dafür findet sich unter anderem in dieser Datei:

/usr/lib/python2.4/site-packages/univention/admincli/passwd.py

Auf unserer Webseite steht auch Dokumentation zum Erstellen von Erweiterungen bereit:
http://www.univention.de/doku_devel.html

Mit freundlichen Grüßen
Tobias Scherer


#3

Hallo,

aufgrund diverser Nichtmöglichkeiten des Abwesenheitssystems in UCS muss dieses, sollte ich nicht ein paar grundlegende Dinge übersehen, eh für unsere Bedürfnisse quasi neu implementiert werden. (u.A. Automatische Antwort nach 3 (bzw. x) Tagen Abwesenheit/Nichtabrufen einer Mail, Weiterleitung nur an interne Adressen, automatisches Anhängen eines Zusatztextes an alle Antworten des Systems, gleichzeitige Nutzung von Sieve-Skripten und Abwesenheitsnachrichten(dies ist für uns vorerst nicht notwendig))

Wer damit nun letztendlich beauftragt wird oder ob es jemand aus unserem Hause macht, steht noch nicht fest, daher werde ich mich vorerst nicht darum kümmern. Vielen Dank aber für Ihren Hinweis. Sollte Univention damit beauftragt werden, wird dies natürlich über offizielle Wege gehen und nicht hier übers Forum.

Mit freundlichen Grüßen
Michael Heide


#4

Hallo,

Alternativ zur Funktionalität für Abwesenheitsnotizen im Univention Directory Manager gibt es im Univention Kolab2 Webclient noch eine weitere Möglichkeit Abwesenheitsnotizen zu definieren. Diese Funktionalität ist in dem E-Mail-Filter Modul enthalten, welches Sie unter ‘Mein Konto’ -> ‘E-Mail FIlter’ finden können.

Mit freundlichen Grüßen
Andreas Büsching


#5

Der Link auf die “devel”-Doku ist recht mager als Antwort - soweit komme ich selber auch. Wo sind die Python-Klassen dokumentiert? Ich habe vor allem Doku zum erstellen von udm/ucm Modulen gesehen, ich bin jedoch v.a. daran interessiert, einen Accountimport (cmdline-tool) selber zu schreiben, welcher die von udm via cmdline bereitgestellt funktionalität via Python-API nutzt.

In der UDM doku finde ich immerhin den Hinweis auf die “object” Klasse. Nicht beantwortet: wie bekomme ich ein object? wenn ich Attribute ändere: sind die sofort im LDAP oder braucht es eine “commit”/“store” operation? Vermisst weiter: wie (über sipleLdap?) kann ich im LDAP suchen? Oder soll man da die Standard LDAP API von Python benutzen?

Danke für einen präziseren Verweis auf die relevante Doku.

Adrian von Bidder


#6

Im Univention Wiki ist die Entwicklung eines UDM-Moduls mit einem Beispielmodul dokumentiert (Entwicklung und Integration eigener Module in Univention Directory Manager). Von der Wiki-Seite führt ein Link zu dem Beispielmodul im Subversion-Repository. Im aktuellen Zustand des Beispielmoduls gibt es darin ein Beispiel-Skript ip-phone-tool, das die Grundzüge der Verwendung der Python API des UDM-Moduls zeigt.


#7

Vielleicht ging die Antwort noch etwas an der Zielrichtung der Frage vorbei. Die von UDM bereitgestellte Funktionalität kann generell auf zwei Arten verwendet werden:
[ul]
[li] Python-API, die direkt die UDM-Module verwendet[/li]
[li] Shell-Skripting per univention-directory-manager Commandline Programm.[/li][/ul]
Die Kernfunktionalität des univention-directory-manager Commandline Programms wird durch den univention-cli-server bereitgestellt (aus dem Paket univention-directory-manager-tools), der über das univention.admincli.admin Python-Modul die Commandline in die Python-API übersetzt.

Zu der Frage bezüglich der Python Klassenstruktur und Methoden: Der Begriff “object” ist doppelt belegt: Eine so benannte Objektklasse wird zum Einen direkt von Python bereitgestellt und liefert einfach nur den sogenannten “new-style” Klassen-Typus. Die gleichnamigen Objektklassen der UDM Python-API hingegen werden über die sogenannten ‘handler’, auch UDM-Module genannt, definiert. Jeder dieser Handler stellt eine eigene Klasse “object” bereit (z.B. univention.admin.handlers.users.user.object).

Eine Objekt-Instanz einer solchen UDM-Modulklasse wird entweder durch normale Instanziierung der gewünschten Klasse neu erzeugt oder ein existierendes Objekt kann bei Kenntnis der LDAP-DN über die Methode univention.admin.objects.get konstruiert werden. Durch anschließendes Aufrufen der ‘open’-Methode liest die UDM-Modulinstanz die Objektdaten aus dem LDAP-Backend und speichert sie in den Datenstrukturen simpleLdap.oldattr (LDAP attribute) und in simpleLdap.oldinfo (UDM properties, übersetzt aus LDAP-Attributen) zwischen und stellt sie dann zu Bearbeitung als simpleLdap.info bereit (quasi als Cache).

simpleLdap stellt unter anderem die Methoden create, modify, move und remove bereit (über seine Basisklasse ‘base’). Diese Methoden vergleichen simpleLdap.info mit simpleLdap.oldinfo und schreiben Änderungen entsprechend in das LDAP-Backend. Die Änderungen werden also erst dann in das LDAP-Backend geschrieben, wenn die entsprechende Methode aufgerufen wird (d.h. noch nicht, wenn einfach nur ein Wert in das lokale Dictionary des UDM-Modulobjekts geschrieben wird).

Jede UDM-Modulklasse stellt per ‘lookup’ eine Methode bereit, die über einen modulspezifischen LDAP-Filter genau solche Objekte aus dem LDAP-Backend sucht, die durch das Modul bearbeitet werden können. Die lookup-Methode liefert DN-Strings als Ergebnis. In dem Beispielskript sieht man, dass man diese DN-Strings alternativ natürlich auch per python-ldap selbst aus dem LDAP-Backend heraussuchen kann. Dann muss man allerdings sicher sein, dass das anschließend zum Öffnen und Bearbeiten gewählte UDM-Modul auch zu dem Objekttypen passt. Die Verwendung der python-ldap API sollte sonst vermieden werden, da man dann am UDM vorbei arbeitet.

Viele Grüße,
Arvid Requate


#8

Besten Dank, Arvid

(… Hmm. Habe nie ein Mail erhalten mit dieser Antwort. Ich denke das Forum sollte mir Antworten doch per Mail schicken??? …)


#9

Hallo,

diese Problem sollte vor einiger Zeit (allerdings vermutlich nach dem Beitrag des Kollegen) behoben worden sein.

Mit freundlichen Grüßen
Janis Meybohm


#10

Ja, hat geklappt. Danke.