Skip to content

ldap2ldap : copie d'enregistrements à partir d'un serveur ldap vers un autre en modifiant le DN

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.

Rétroliens

Pas de rétroliens

Commentaires

Afficher les commentaires en Vue non groupée | Vue groupée

Francesco sur :

Bonjour,

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 :

Bonjour,

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.

Ajouter un commentaire

Marquer un texte en gras: *mot*, souligner un texte: _mot_.
Les smilies standard comme :-) et ;-) sont convertis en images.
Les adresses Email ne sont pas affichées, et sont seulement utilisées pour la communication.

Pour éviter le spam par des robits automatisés (spambots), merci d'entrer les caractères que vous voyez dans l'image ci-dessous dans le champ de fomulaire prévu à cet effet. Assurez-vous que votre navigateur gère et accepte les cookies, sinon votre commentaire ne pourra pas être enregistré.
CAPTCHA

Form options
tweetbackcheck