AD Connector: Werte umschreiben

german

#1

Moin,
wir möchten mittels AD Connector das Attribute proxyAddresses aus dem AD zur mailAlternativAddress in der UCS LDAP ummappen.

Leider sind die Werte im AD mit führendem SMTP: gespeichert, also z.B.

proxyAddresses: smtp:SAnders@hh.example.com
proxyAddresses: smtp:SAnders@example.com
proxyAddresses: SMTP:S.Anders@example.com

Dieses “SMTP:” bzw. “smtp:” wollen wir im Zuge der Synchronisation entfernen.

Deshalb haben wir versucht, mittels einer mapping Funktion, die Werte umzuschreiben. Hier die AD Configuration:

ad_mapping = {
        'user': univention.connector.property (
        ...
       post_attributes={
                                       ...
                                        'mailAlternativeAddress': univention.connector.attribute (
                                                ucs_attribute='mailAlternativeAddress',
                                                ldap_attribute='mailAlternativeAddress',
                                                con_attribute='proxyAddresses',
                                                mapping=[mapToWin,mapToUCS],
                                        ),
      ...
     )
}

Am Anfang der mapping Datei haben wir unsere Funktionen definiert:

def mapToWin(connector,key,object):
    ud.debug(ud.LDAP, ud.WARN, "tb %s"% traceback.extract_stack())
    ud.debug(ud.LDAP, ud.WARN, "mapAltWin con: %s" % connector)
    ud.debug(ud.LDAP, ud.WARN, "mapAltWin key: %s" % key)
    ud.debug(ud.LDAP, ud.WARN, "mapAltWin obj: %s" % object)
    proxy=object["attributes"]["proxyAddresses"]
    ucslist=[]
    for s in proxy:
      s=s.replace("smtp:","")
      s=s.replace("SMTP:","")
      ucslist.append(s)
    ud.debug(ud.LDAP, ud.WARN, "mapAltWin out: %s" % ucslist)
    return ucslist

def mapToUCS(connector,key,object):
    # wir machen nur einen Sync in die eine Richtung, hier eine Exception werfen
    b=42/0
    return object

Wir haben jetzt leider festgestellt, dass die Funktion zweimal aufgerufen wird und anscheint unterschiedliche Dinge zurückgeben soll:

Stack Trace 1:/usr/lib/pymodules/python2.6/univention/connector/init.py Zeile: 1615

('/usr/share/pyshared/univention/connector/ad/main.py', 315, '<module>', 'main()'),
 ('/usr/share/pyshared/univention/connector/ad/main.py', 291, 'main', 'connect()'), 
('/usr/share/pyshared/univention/connector/ad/main.py', 268, 'connect', 'ad.resync_rejected()'),
 ('/usr/lib/pymodules/python2.6/univention/connector/ad/__init__.py', 1847, 'resync_rejected', 'mapped_object = self._object_mapping(property_key,object)'), 
('/usr/lib/pymodules/python2.6/univention/connector/__init__.py', 1615, '_object_mapping', "object_out['attributes']self.property[key].post_attributes[attr_key].ldap_attribute]=self.property[key].post_attributes[attr_key].mapping[1](self, key, object)"),

Stack Trace 2:/usr/lib/pymodules/python2.6/univention/connector/init.py Zeile: 1049

('/usr/share/pyshared/univention/connector/ad/main.py', 315, '<module>', 'main()'),
 ('/usr/share/pyshared/univention/connector/ad/main.py', 291, 'main', 'connect()'),
 ('/usr/share/pyshared/univention/connector/ad/main.py', 268, 'connect', 'ad.resync_rejected()'),
 ('/usr/lib/pymodules/python2.6/univention/connector/ad/__init__.py', 1850, 'resync_rejected', 'sync_successfull = self.sync_to_ucs(property_key, mapped_object, premapped_ad_dn)'), 
('/usr/lib/pymodules/python2.6/univention/connector/__init__.py', 1249, 'sync_to_ucs', 'result = self.modify_in_ucs(property_type, object, module, position)'),
 ('/usr/lib/pymodules/python2.6/univention/connector/__init__.py', 1110, 'modify_in_ucs', 'self.__set_values(property_type,object,ucs_object)'),
 ('/usr/lib/pymodules/python2.6/univention/connector/__init__.py', 1049, '__set_values', 'set_values(self.property[property_type].post_attributes[attr_key].mapping[1](self, property_type, object))'), 

Gibt es einen anderen Weg oder eine uns unbekannte Doku die uns hier helfen könnte?

Vielen Dank
Sven Anders


#2

Ein alternativer Weg sind die post_con_modify_functions und post_ucs_modify_functions Funktionen. Dort können gezielt Funktionen nach dem Modifizieren aufgerufen werden und diese Funktionen können dann entsprechend die Attribute vergleichen und modifizieren. Beispiele müsste es im AD Connector Code geben.

Ich glaube die mapping-Funktionen werden bisher im AD Connector noch nicht wirklich verwendet. Von daher kann es gut sein, dass die Implementierung da fehlerhaft ist.


#3

Hallo Herr Gohmann,

vielen Dank für die Antwort.

Wir konnten das jetzt mittels post_ucs_modify_functions lösen. Das ist aufwendiger, da wir die Attribut-Liste im Skript auf Unterschiede vergleichen müssen. Wir würden lieber die mapping Funktion nutzen.

Viele Grüße an die Weser

Sven Anders