#!/bin/perl # ---------------------------------------------------------------------- # Conversion d'un schema LDAP DSEE en format OpenLDAP # # Lancer avec les options : # -f fichier ldif (99user.ldif) # -n nom du scheman dans OpenLDAP # -a OID de base des attributs # -o OID de base des object classes # # Note : le fichier LDIF est traité pour supprimer les sauts de ligne # ---------------------------------------------------------------------- use strict; use POSIX; use File::Temp; use File::Basename; use Getopt::Std; # Definition des options en ligne use vars qw($opt_a); use vars qw($opt_f); use vars qw($opt_n); use vars qw($opt_o); # Recuperation des arguments : getopts ("a:f:n:o:"); # --- Controles if ( $opt_a eq "" ) { print "Veuillez saisir une valeur pour la racine des OID Attributs \n" &Usage(); } if ( $opt_o eq "" ) { print "Veuillez saisir une valeur pour la racine des OID Object Classes \n" &Usage(); } if ( $opt_n eq "" ) { print "Veuillez saisir un nom pour le schema OpenLDAP \n" ; &Usage(); } if ( $opt_f eq "" ) { print "Veuillez saisir un nom de fichier schema \n" &Usage(); } # # Parametres & variables # my $logLevel=0; my $message; my $inputFile = $opt_f; my @inputLines; my $nbAttributes=0; my $nbObjectClasses=0; my $lineout; my $baseAttOID=$opt_a; my $baseObjOID=$opt_o; my $numAtt=1; my $numObj=1; my $AttOID=''; my $ObjOID=''; my $pos; # --- Fonctions --- sub Usage { print "$0 : conversion de schema LDIF DSEE vers OpenLDAP\n"; print "\nUsage : \tperl $0 -f fichierSource -n -a -o \n"; print "\nExemple : perl $0 -f 99user.ldif -n guest -a 1.3.6.1.4.1.0.1.1 -o 1.3.6.1.4.1.0.1.10 \n"; print "\n"; print "Il faut auparavant convertir le fichier LDIF avec : perl -p0e 's/\n //g' 99user.ldif pour supprimer les sauts de ligne"; exit 0; } # ------------------------------- # Log # appel : &printLog("message",level) # ------------------------------- sub printLog { my (@args) = @_; if ( $logLevel ge $args[1] ) { print " ".$args[0]."\n"; } } # ------------------------------- # Ecriture dans le fichier de schema cible # appel : &printSchema("ligne") # ------------------------------- sub printSchema { my (@args) = @_; print SCHEMAfile $args[0]."\n"; } # ------------------------------- # Lecture du fichier d'entree # ------------------------------- sub readLDIF() { my ($file) = @_; my $linein=''; my $index=0; open( ldifFILE, $file ) or die "Erreur lors de l'ouverture du fichier $file"; my $var ; { local $/; $var = ; } # Suppression des lignes tronquées $var =~ s/\n //g ; my $tmp = File::Temp->new(SUFFIX=>'.tmp') or die "File:Temp: $!\n"; print $tmp $var; seek $tmp, 0, 0 or die "Seek $tmp failed $! \n"; while( defined( $linein = <$tmp> ) ) { # next if $linein =~ /^\s*#/; ### évite le traitement des commentaires # next if $linein =~ /$^/; ### évite le traitement des lignes vides chomp $linein; # Attribute Type if ( $linein =~ /attributeTypes:/) { &printLog($linein,1); $lineout='olcAttributeTypes: ('; $AttOID = $baseAttOID.'.'.$numAtt; $numAtt++; $lineout .= $AttOID.' '; $pos = index ($linein,'NAME'); $lineout .= substr($linein, $pos); &printSchema($lineout); $nbAttributes++; } # Object Class if ( $linein =~ /objectClasses:/) { &printLog($linein,1); $lineout='olcObjectClasses: ('; $ObjOID = $baseObjOID.'.'.$numObj; $numObj++; $lineout .= $ObjOID.' '; $pos = index ($linein,'NAME'); $lineout .= substr($linein, $pos); &printSchema($lineout); $nbObjectClasses++; } # print "Ligne : ",$linein; } close(ldifFILE); close($tmp); } # =========== MAIN ================= &printLog("Traitement du fichier LDIF : ".$inputFile,0); # # Ouverture du fichier CSV my $olcFile = 'olcSchema'.$opt_n.'.ldif'; &printLog("Ouverture du fichier de sortie ".$olcFile,0); open (SCHEMAfile,">",$olcFile); # Entete du fichier de schema &printSchema('dn: cn='.$opt_n.',cn=schema,cn=config'); &printSchema('objectClass: olcSchemaConfig'); &printSchema('cn: '.$opt_n); &printLog("Generation du fichier de sortie",0); &readLDIF($inputFile); &printLog("Fermeture fichier de sortie",0); close (SCHEMAfile); &printLog("Nombre d'attributs traitées : ".$nbAttributes,0); &printLog("Nombre de classes d'objets traitées : ".$nbObjectClasses,0); &printLog("Fin du traitement",0);