From f58797b35e5ee319c30eef69a50e41a62f449024 Mon Sep 17 00:00:00 2001 From: Thomas Constans Date: Tue, 22 Oct 2019 19:16:18 +0200 Subject: [PATCH] rajout doc mise au point password.pl qui prend une branche en parametre mise au point add_attribute.pl qui rajoute l'OC le cas echeant --- add_attribute.pl | 72 ++++++++++++++++++++++++++++++++++++++++++++++++ doc.md | 50 +++++++++++++++++++++++++++++++++ password.pl | 16 ++++++++++- test.pl | 67 -------------------------------------------- 4 files changed, 137 insertions(+), 68 deletions(-) create mode 100644 add_attribute.pl create mode 100644 doc.md delete mode 100644 test.pl diff --git a/add_attribute.pl b/add_attribute.pl new file mode 100644 index 0000000..adefc99 --- /dev/null +++ b/add_attribute.pl @@ -0,0 +1,72 @@ +#/usr/bin/perl + +use strict; +use Net::LDAP; +use Text::CSV; + +my $ldapserver = "localhost"; +my $binddn = "cn=manager,o=od"; +my $bindpw = "123Soleil" ; + +my $ldap = Net::LDAP->new( $ldapserver ) or die "$@" ; + +my $mesg = $ldap->bind( $binddn, + password => $bindpw + ); + +$mesg->code and die $mesg->error; # check for errors +my $csv = Text::CSV->new({ sep_char => ';' }) ; +my $file = $ARGV[0] or die "Need to get CSV file on the command line\n" ; + +open(my $data, '<', $file) or die "Could not open '$file' $!\n"; +my @cols = @{$csv->getline ($data)}; +foreach my $c (@cols){ + print "column: ". $c ."\t" ; +} +print "\n" ; +my $row = {} ; +$csv->bind_columns (\@{$row}{@cols}); +while ($csv->getline ($data)) { + my $dn = $row->{dn} ; + if ( $dn =~ /^dn / ) { next ; } + my $idTechnique = $row->{idTechnique} ? $row->{idTechnique} : "UNDEFINED" ; + my $question1 = $row->{question1} ? $row->{question1} : "UNDEFINED" ; + my $question2 = $row->{question2} ? $row->{question2} : "UNDEFINED" ; + my $question3 = $row->{question3} ? $row->{question3} : "UNDEFINED" ; + my $reponse1 = $row->{reponse1} ? $row->{reponse1} : "UNDEFINED" ; + my $reponse2 = $row->{reponse2} ? $row->{reponse2} : "UNDEFINED" ; + my $reponse3 = $row->{reponse3} ? $row->{reponse3} : "UNDEFINED" ; + my $siren = $row->{siren} ? $row->{siren} : "UNDEFINED" ; + my $civilite = $row->{civilite} ? $row->{civilite} : "UNDEFINED" ; + my $userPassword = $row->{userPassword} ; + my $userPassword = `slappasswd -n -s $userPassword` ; + + my $mesg = $ldap -> search( + scope => 'base', + attrs => ['1.1'], + filter => '(objectClass=klesiaentreprise)', + base => $dn, + ); + if( $mesg-> count() == 0 ) { + my $mesg = $ldap-> modify( $dn, + add => { + objectClass => 'klesiaentreprise', + }); + }else{ + warn $dn . " already of type klesia\n" ; + my $mesg = $ldap-> modify( $dn, + changes=> [ + replace => [ 'idTechnique' => $idTechnique ], + replace => [ 'question1' => $question1 ], + replace => [ 'question2' => $question2 ], + replace => [ 'question3' => $question3 ], + replace => [ 'reponse1' => $reponse1 ], + replace => [ 'reponse2' => $reponse2 ], + replace => [ 'reponse3' => $reponse3 ], + replace => [ 'siren' => $siren], + replace => [ 'civilite' => $civilite], + replace => [ 'userPassword' => $userPassword ], + ] + ) ; + $mesg->code and warn $dn."\t".$mesg->error; } + } \ No newline at end of file diff --git a/doc.md b/doc.md new file mode 100644 index 0000000..9ab4eed --- /dev/null +++ b/doc.md @@ -0,0 +1,50 @@ +##### Documentation + +#### Définition des nouveaux attributs + +Avant de pouvoir ajouter les nouveaux attributs aux objets ldap existants, il +faut rajouter leur définition auprès du serveur LDAP. + +Cela se fait en injectant le fichier **klesia_entreprise_schema.ldif** via la +commande: +```bash + sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f klesia_entreprise_schema.ldif + +Il faut ensuite rajouter l'attribut objectClass avec la valeur klesiaentreprise +à tous les objets à qui on souhaite ajouter les attributs. +``` + +#### Script 1 : add_attributes.pl + +Ce script est responsable de l'ajout de la classe d'objet décrit ci-dessus d'une +part, et de l'ajout des attributs supplémentaires d'autre part. + +Il attend en entrée un fichier csv ayant la structure suivante: +dn de l'entrée à modifier +nom attribut 1 +valeur attribut 1 +... +nom attribut n +valeur attribut n + +Chaque champ étant séparé par un ; + + +Pour chaque ligne du fichier csv: + - vérification de la présence de l'attribut objectClass=klesiaEntreprise + - rajout de cet attribut le cas échéant. + - pour chaque attribut: + - mise à jour de l'attribut avec la valeur correspondante + + +#### Script 2 : password.pl + +Ce script va modifier toutes les entrées d'une branche ldap donnée ayant un +attribut **userPassword** non déjà hashé. + +Il prend en entrée le dn de la branche à modifier. + +Ex d'utilisation: +``` +perl password.pl ou=PeopleEnt,o=od +``` diff --git a/password.pl b/password.pl index 7e9d3e8..10e96d8 100644 --- a/password.pl +++ b/password.pl @@ -9,7 +9,9 @@ use Net::LDAP; my $ldapserver = "localhost"; my $binddn = "cn=manager,o=od"; my $bindpw = "123Soleil" ; -my $base = 'ou=peopleEnt,o=od' ; + + +my $base = $ARGV[0] or die 'gimme a valid ldap base\n' ; my $ldap = Net::LDAP->new( $ldapserver ) or die "$@" ; @@ -19,6 +21,18 @@ my $mesg = $ldap->bind( $binddn, $mesg->code and die $mesg->error; # check for errors +$mesg = $ldap->search( + scope => 'base', + attrs => ['1.1'], + base => $base , + filter=> '(objectClass=*)', + ); +die $mesg->error if $mesg->code ; + +if( $mesg -> count() ==0 ) { + die( "Wrong base or unknown error\n") ; +} + $mesg = $ldap->search( base=> $base, filter=>"(&(objectClass=person)(userpassword=*))", diff --git a/test.pl b/test.pl deleted file mode 100644 index 8cea0c9..0000000 --- a/test.pl +++ /dev/null @@ -1,67 +0,0 @@ -#/usr/bin/perl - -# on abandonne python pour perl -# ce script est capable de rajouter l'attribut description avec une valeur issue -# d'un fichier csv passé en argument -use strict; -use Net::LDAP; -use Text::CSV; - -my $ldapserver = "localhost"; -my $binddn = "cn=manager,o=od"; -my $bindpw = "123Soleil" ; - -my $ldap = Net::LDAP->new( $ldapserver ) or die "$@" ; - -my $mesg = $ldap->bind( $binddn, - password => $bindpw - ); - -$mesg->code and die $mesg->error; # check for errors -my $csv = Text::CSV->new({ sep_char => ';' }) ; -my $file = $ARGV[0] or die "Need to get CSV file on the command line\n" ; - -open(my $data, '<', $file) or die "Could not open '$file' $!\n"; -my @cols = @{$csv->getline ($data)}; -foreach my $c (@cols){ - print "columne: ". $c ."\t" ; -} -my $row = {} ; -$csv->bind_columns (\@{$row}{@cols}); -while ($csv->getline ($data)) { - my $dn = $row->{dn} ; -# my $mesg = $ldap-> search( -# base=> $dn, -# scope=> "base", -# filter=> "(description=".$attr1.")") ; -# print $mesg->count() ; -# if ($mesg->count() != 0) { next ; } - my $idTechnique = $row->{idTechnique} ? $row->{idTechnique} : "xx" ; - my $question1 = $row->{question1} ? $row->{question1} : "xx" ; - my $question2 = $row->{question2} ? $row->{question2} : "xx" ; - my $question3 = $row->{question3} ? $row->{question3} : "_" ; - my $reponse1 = $row->{reponse1} ? $row->{reponse1} : "_" ; - my $reponse2 = $row->{reponse2} ? $row->{reponse2} : "_" ; - my $reponse3 = $row->{reponse3} ? $row->{reponse3} : "_" ; - my $siren = $row->{siren} ? $row->{siren} : "" ; - my $civilite = $row->{civilite} ? $row->{civilite} : "" ; - my $userPassword = $row->{userPassword} ; - my $userPassword = `slappasswd -n -s $userPassword` ; - print $dn."\t >>".$question3 ."<<\n"; - my $mesg = $ldap-> modify( $dn, - changes=> [ - replace => [ 'objectClass' => 'klesiaentreprise' ], - replace => [ 'idTechnique' => $idTechnique ], - replace => [ 'question1' => $question1 ], - replace => [ 'question2' => $question2 ], - replace => [ 'question3' => $question3 ], - replace => [ 'reponse1' => $reponse1 ], - replace => [ 'reponse2' => $reponse2 ], - replace => [ 'reponse3' => $reponse3 ], - replace => [ 'siren' => $siren], - replace => [ 'civilite' => $civilite], - replace => [ 'userPassword' => $userPassword ], - ] - ) ; - $mesg->code and warn $mesg->error; # check for errors -} \ No newline at end of file