IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

Aide PERL newbie


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 43
    Par défaut Aide PERL newbie
    Bonjour,

    J'ai le fichier students.ldif suivant :

    dn: cn=Eric DURAND
    cn: Eric DURAND
    xmozillanickname: DURAND
    mail: edurand@ent.priv
    givenname: Eric
    sn: DURAND
    objectclass: top
    objectclass: person
    userPassword: 5f4eb6bbf2994ad2e259a4b8c932f9c8

    dn: cn=Claude DUPONT
    cn: Claude DUPONT
    xmozillanickname: DUPONTC
    mail: cdupont@ent.priv
    givenname: Claude
    sn: DUPONT
    objectclass: top
    objectclass: person
    userPassword: b2a219a7ee0debaf86e9b94eb6b7edf9

    etc.

    J'ai commencé à coder un script pour modifier son contenu et le re-écrire au bon format dans un autre fichier (students_tmp.ldif) avant importation dans la base LDAP.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    #-------------------------------------------#
    #!/usr/bin/perl -w
    use Digest::MD5 qw(md5);
    use MIME::Base64 qw(encode_base64);
    use strict;
    my ($fichier, $mdp, $ligne, $attribut, $hashedPasswd);
    print "Entrez un nom de fichier : ";
    $fichier = <STDIN>;
    chomp($fichier);
    open(FIC, $fichier) || die "Problème à l\'ouverture : $!";
    open(FILE,">students_tmp.ldif") || die ("Erreur de creation de students_tmp.ldif") ;
    while($ligne = <FIC>)
    {
    	if($ligne =~ /userPassword:/)
    	{
    		($attribut, $mdp) = split(/ /, $ligne);
    		# MD5 hash
           		my @md5 = split "",$mdp;
    		my @res;
    		for (my $i = 0 ; $i < 32 ; $i+=2)
    		{
    			my $c = (((hex $md5[$i]) << 4) % 255) | (hex $md5[$i+1]);
    			$res[$i/2] = chr $c;
    		}
    		$hashedPasswd = "{MD5}".encode_base64(join "", @res);
    		$ligne =~ s/$mdp/$hashedPasswd/;
    		print FILE $ligne;
    	}
    	else {
    		if($ligne !~ /^xmozillanickname/) 
    		{
    			$ligne =~ s/givenname/givenName/;  
    			$ligne =~ s/objectclass/objectClass/;    			
    			print FILE $ligne;
    		}
       	}
    }
    close FIC and close FILE;
    print "Terminé !!!\n";
    #-------------------------------------------#
    Aujourd'hui, je ne parviens pas à faire mes deux dernières modifs :

    1) J'aimerais ajouter pour chaque ligne commençant par dn: cn l'expression ,ou=users,dc=ent,dc=priv

    Ainsi, dn: cn=Eric DURAND deviendrait dn: cn=Eric DURAND,ou=users,dc=ent,dc=priv

    2) j'aimerai insérer avant chaque ligne commençant par userPassword: la ligne suivante : objectClass: inetOrgPerson

    Ainsi, j'obtiendrai le résultat suivant :

    objectclass: person
    objectClass: inetOrgPerson
    userPassword: 5f4eb6bbf2994ad2e259a4b8c932f9c8

    Merci bien pour vos contributions.

  2. #2
    Rédactrice

    Avatar de stoyak
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    408
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 408
    Par défaut
    tu devrais déjà faire un chomp de $ligne après ton while.
    Ensuite
    1) J'aimerais ajouter pour chaque ligne commençant par dn: cn l'expression ,ou=users,dc=ent,dc=priv

    Ainsi, dn: cn=Eric DURAND deviendrait dn: cn=Eric DURAND,ou=users,dc=ent,dc=priv
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if ( $ligne =~ /^dn: cn/) {
      $ligne = $ligne . "ou=users,dc=ent,dc=priv\n";
    }
    2) j'aimerai insérer avant chaque ligne commençant par userPassword: la ligne suivante : objectClass: inetOrgPerson
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if ( $ligne =~ /^userPassword:/) {
      $ligne = "objectClass: inetOrgPerson" . $ligne . "\n";
    }
    voilà

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 43
    Par défaut
    Merci stoyak pour ces solutions.

    La première condition me retourne :

    dn: cn=Eric DURAND
    ,ou=users,dc=gdroger,dc=priv
    cn: Eric DURAND

    et non dn: cn=Eric DURAND,ou=users,dc=ent,dc=priv

    La deuxième condition ne me rajoute rien.

    J'en ai profité pour déplacer print FILE $ligne; dans le while. Il est inutile qu'elle soit dans les conditions if.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    while($ligne = <FIC>)
    {
    	if($ligne =~ /userPassword:/)
    	{
    		($attribut, $mdp) = split(/ /, $ligne);
    		# MD5 hash
           		my @md5 = split "",$mdp;
    		my @res;
    		for (my $i = 0 ; $i < 32 ; $i+=2)
    		{
    			my $c = (((hex $md5[$i]) << 4) % 255) | (hex $md5[$i+1]);
    			$res[$i/2] = chr $c;
    		}
    		$hashedPasswd = "{MD5}".encode_base64(join "", @res);
    		$ligne =~ s/$mdp/$hashedPasswd/;
    	}
    	else {
    		if ( $ligne =~ /^dn: cn/) 
    		{
    			$ligne = $ligne . ",ou=users,dc=ent,dc=priv\n";
    		}
    		if ( $ligne =~ /^userPassword:/)
    		{
    			$ligne = "objectClass: inetOrgPerson" . $ligne . "\n";
    			print FILE $ligne;
    		}
    		if($ligne !~ /^xmozillanickname/) 
    		{
    			$ligne =~ s/givenname/givenName/;  
    			$ligne =~ s/objectclass/objectClass/;    			
    		}
    	}
    	print FILE $ligne;
    }

  4. #4
    Rédactrice

    Avatar de stoyak
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    408
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 408
    Par défaut
    Il faut que tu fasse un chomp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    while($ligne = <FIC>)
    {
            chomp $ligne;
    	if($ligne =~ /userPassword:/)
    	{
    		($attribut, $mdp) = split(/ /, $ligne);
    		# MD5 hash
           		my @md5 = split "",$mdp;
    		my @res;
    		for (my $i = 0 ; $i < 32 ; $i+=2)
    		{
    			my $c = (((hex $md5[$i]) << 4) % 255) | (hex $md5[$i+1]);
    			$res[$i/2] = chr $c;
    		}
    		$hashedPasswd = "{MD5}".encode_base64(join "", @res);
    		$ligne =~ s/$mdp/$hashedPasswd/;
    	}
    	else {
    		if ( $ligne =~ /^dn: cn/) 
    		{
    			$ligne = $ligne . ",ou=users,dc=ent,dc=priv\n";
    		}
    		if ( $ligne =~ /^userPassword:/i)
    		{
    			$ligne = "objectClass: inetOrgPerson" . $ligne . "\n";
    			print FILE $ligne;
    		}
    		if($ligne !~ /^xmozillanickname/) 
    		{
    			$ligne =~ s/givenname/givenName/;  
    			$ligne =~ s/objectclass/objectClass/;    			
    		}
    	}
    	print FILE $ligne;
    }

  5. #5
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    C'est parce que tu as mis tes nouvelles conditions dans le else() alors que le if() est la partie exécutée si tu as userPassword dans la ligne. Par ailleurs tu n'as pas fait de chomp() comme conseillé par stoyak.

    Ma solution ressemblerait plutôt à cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    #!/usr/bin/perl
    use strict; use warnings;
     
    use MIME::Base64 qw(encode_base64);
     
    print "Entrez un nom de fichier : \n";
    chomp( my $filename = <STDIN> );
     
    open my($input), '<', $filename
      or die "Problème à l'ouverture de $filename : $!\n";
    open my($output), '>', 'students_tmp.ldif'
      or die "Erreur de creation de students_tmp.ldif : $!\n";
     
    while( my $line = <$input>) {
      chomp($line);
     
      if($line =~ m/^userPassword:/) {
        my (undef, $pwd) = split /:\s*/, $line, 2;
        # MD5 hash
        my $md5 = encode_base64(pack 'H*', $pwd);
        $line = "objectClass: inetOrgPerson\nuserPassword: {MD5}$md5";
      }
     
      if($line !~ m/^xmozillanickname/) {
        $line =~ s/givenname/givenName/;
        $line =~ s/objectclass/objectClass/;
      }
     
      if( $line =~ m/^dn: cn/ ) {
        $line .= ",ou=users,dc=ent,dc=priv";
      }
     
      print {$output} "$line\n";
    }
     
    close $input; close $output;
     
    print "Terminé !!!\n";
     
    __END__
    --
    Jedaï

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 43
    Par défaut
    C'est nettement plus propre. On sent l'expérience derrière ces quelques lignes. Merci Jedai et stoyak pour l'entraide.

    L'insertion est correcte. Le hash est nettement plus propre. Il faudra que j'analyse ces queqlues lignes.

    Toutefois,le retour me restitue ceci :

    ,ou=users,dc=gdroger,dc=priv
    cn: Eric DURAND
    ...

    dn: cn=Eric DURAND n'est plus affiché.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 43
    Par défaut
    Si j'écris :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if( $line =~ m/^dn: cn/ ) {
        	print $line . "toto\n";
    }
    Cela me renvoie :

    totocn: Eric DURAND

    La concaténation ne s'effectue pas

  8. #8
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Citation Envoyé par sneakz Voir le message
    Toutefois,le retour me restitue ceci :

    ,ou=users,dc=gdroger,dc=priv
    cn: Eric DURAND
    ...

    dn: cn=Eric DURAND n'est plus affiché.
    Tu as du faire une erreur en recopiant, a priori tu as écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $line = ",ou=users,dc=ent,dc=priv";
    là où mon code dit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $line .= ",ou=users,dc=ent,dc=priv";
    (et oui, le petit point devant le égal fait toute la différence)

    --
    Jedaï

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. aide perl xml et wxwidgets
    Par Camille_B dans le forum Langage
    Réponses: 7
    Dernier message: 11/09/2009, 12h57
  2. Aide Perl et Proxy
    Par badrh0 dans le forum Web
    Réponses: 1
    Dernier message: 14/07/2008, 21h39
  3. [langage] newbie demande de l'aide
    Par rbh dans le forum Langage
    Réponses: 5
    Dernier message: 03/06/2004, 14h29
  4. [langage] Script Perl Aide
    Par julfra dans le forum Langage
    Réponses: 7
    Dernier message: 17/05/2004, 09h55
  5. [langage] Script en Perl - besoin d'aide
    Par julfra dans le forum Langage
    Réponses: 8
    Dernier message: 13/05/2004, 14h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo