ldap2ldap : copie d'enregistrements à partir d'un serveur ldap vers un autre en modifiant le DN
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
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.
Commentaires
Afficher les commentaires en Vue non groupée | Vue groupée
Francesco sur :
Je veux copier les enregistrements d'un serveur A contenant l'annuaire Ldap à un serveur B.
Je ne veux pas faire de réplication mais juste si le serveur A crash que je puisse mettre des fichiers sur le serveur B.
Ces fichiers concernent le backup de l'annuaire LDAP du serveur A.
Lorsque je 'déplace' ces fichiers sur le serveur B, c'est à dire /etc/ldap et /var/lib/ldap je ne peux pas accéder à l'annuaire. La est mon problème. Si quelqu'un à déja rencontré ce problème et peut faire partager son expérience pour moi et pour tous les membres de ce forum intéréssé.
Merci d'avance.
Bonne journée,
Cordialement
Francesco
David sur :
Il faut que le serveur ldap soit arrêter pour pouvoir déplacer/copier le répertoire qui contient la base.
Sinon il faut faire un slapcat
David.