Ce script python permet de prendre des enregistrements d'un serveur LDAP pour
les insérer dans un autre serveur LDAP tout en modifiant le DN (on peut aussi
ajouter des items si on le souhaite).
On pourrait utiliser un export ldif du premier, puis quelques scripts sed ou
autres pour faire les modifications et réimporter le fichier ldif, mais pour
cela les données vont être stockés de manière temporaire dans un fichier...
Dans le cas d'une utilisation automatique, cela peut poser certains problèmes
d'avoir un fichier temporaire...
Comme c'est un petit script, il n'y a pas de paramètre à lui passer, mais
quelques petites choses à modifier
#!/usr/bin/env python
import ldap
import ldap.modlist
import string
ldapIn = ldap.open("ldap-from-server")
ldapIn.simple_bind_s("admin1","pass1")
Ce sont les paramètres de connexion au serveur LDAP qui va nous servir de source:
- ldap-from-server : nom du serveur LDAP
- admin1 : dn de l'administrateur
- pass1 : mot de passe de l'administrateur
On n'est pas obligé d'utiliser l'utilisateur admin pour le serveur LDAP
source, si la connexion en anonyme retourne tous les enregistrements
que l'on a besoin. Dans ce cas, admin1 et pass1 sont vides ("").
ldapOut = ldap.open("ldap-to-server")
ldapOut.simple_bind_s("admin2","pass2")
Ce sont les paramètres de connexion au serveur LDAP où on va insérer les enregistrements :
- ldap-to-server : nom du serveur LDAP
- admin2 : dn de l'administrateur
- pass2 : mot de passe de l'administrateur
resultats = ldapIn.search_s("o=contact,dc=domain", ldap.SCOPE_SUBTREE,
"objectclass=*")
On recherche l'ensemble des objets qui sont dans la base 'o=contact,dc=domain' (à modifier).
Le paramètre ldap.SCOPE_SUBTREE indique que l'on veut tous les objets fils.
Le filtre de recherche est (objectclass=*), ce qui correspond à tous les enregistrements.
Cette fonction de recherche récupère d'un seul coup l'ensembles des
enregistrements, il faut donc que le serveur LDAP soit capable de les renvoyer
tous. Pour OpenLDAP, il faut vérifier le paramètre sizelimit dans le fichier de
configuration.
for resultat in resultats :
dn = string.replace(resultat[0],"o=contact","ou=Contact")
dn = string.replace(dn,"dc=domain","dc=new_domain")
On reconstruit le nouveau dn de l'enregistrement. Lors de la recherche celui-ci est placer dans resultat[0].
A modifier en fonction du nouveau dn.
resultat[1]['ou']=['Contact']
resultat[1]['objectClass'] += ['organizationalUnit']
On complète notre enregistrement en lui ajouter la clef ou que l'on a utilisé dans notre DN.
La clef ou étant dans l'object organizationlUnit, on ajoute cet objet à l'enregistrement.
if dn != "ou=Contact,dc=new_domain" :
ldapOut.add_s(dn,ldap.modlist.addModlist(resultat[1]))
Un test est réalisé si l'enregistrement a un dn =
"ou=Contact,dc=new_domain" car dans le cas présent, cet enregistrement
était déjà créé dans le serveur de destination.
Et on valide notre enregistrement dans le serveur de destination.
Le script peut-être téléchargé ici.