From bf4ac58e7105de7e2670134ad8c8fdb76bedb1de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20OUDOT?= Date: Mon, 27 Feb 2023 07:07:49 +0100 Subject: [PATCH 1/4] Initial import of script done by Marc Baudoin --- ldap-dit.pl | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 ldap-dit.pl diff --git a/ldap-dit.pl b/ldap-dit.pl new file mode 100644 index 0000000..0526329 --- /dev/null +++ b/ldap-dit.pl @@ -0,0 +1,68 @@ +#! /usr/pkg/bin/perl + +use strict ; +use warnings ; + +use Tree::Simple ; # apt install libtree-simple-perl + +# https://metacpan.org/pod/Tree::Simple + +# devel/p5-File-Find-Rule-Perl +# devel/p5-Test-Version +# devel/p5-Tree-Simple + +my $annuaire = undef ; +my $apex = undef ; + +while ( <> ) +{ + if ( my ( $dn ) = /^dn: (.+)$/ ) + { + if ( not defined ( $annuaire ) ) + { + $annuaire->{$dn} = Tree::Simple->new ( $dn ) ; + $apex = $dn ; + } + else + { + my ( $premier , $suite ) = $dn =~ /^([^,]+),(.+)$/ ; + $annuaire->{$dn} = Tree::Simple->new ( $dn , $annuaire->{$suite} ) ; + } + } +} + +my $profondeur = -1 ; +my @aff_vert = ( ) ; + +print "$apex\n" ; + +$annuaire->{$apex}->traverse +( + sub + { + my ( $element ) = @_ ; + my $tag = $element->getNodeValue ( ) ; + $profondeur = $element->getDepth ( ) ; + if ( $profondeur != 0 ) + { + foreach my $p ( 0 .. $profondeur - 1 ) + { + if ( $aff_vert[$p] ) + { + print '| ' ; + } + else + { + print ' ' ; + } + } + } + print '+-- ' . $tag . "($profondeur)" . "\n" ; + + if ( not $element->isLeaf ( ) ) + { + $aff_vert[$profondeur] = 1 if $element->isFirstChild ( ) ; + $aff_vert[$profondeur] = 0 if $element->isLastChild ( ) ; + } + } +) ; From 8efc6acf54dce815b2bf493e88edff844c8b463e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20OUDOT?= Date: Mon, 27 Feb 2023 07:13:25 +0100 Subject: [PATCH 2/4] Add LICENSE and code cleaning --- ldap-dit.pl | 117 +++++++++++++++++++++++++++------------------------- 1 file changed, 60 insertions(+), 57 deletions(-) diff --git a/ldap-dit.pl b/ldap-dit.pl index 0526329..a8782c2 100644 --- a/ldap-dit.pl +++ b/ldap-dit.pl @@ -1,68 +1,71 @@ #! /usr/pkg/bin/perl -use strict ; -use warnings ; +#==================================================================== +# Script to convert CSV or LDIF into LDIF +# +# Copyright (C) Marc Baudoin +# Copyright (C) LTB-project.org +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# GPL License: http://www.gnu.org/licenses/gpl.txt +# +#==================================================================== -use Tree::Simple ; # apt install libtree-simple-perl +use strict; +use warnings; -# https://metacpan.org/pod/Tree::Simple +use Tree::Simple; -# devel/p5-File-Find-Rule-Perl -# devel/p5-Test-Version -# devel/p5-Tree-Simple +my $annuaire = undef; +my $apex = undef; -my $annuaire = undef ; -my $apex = undef ; - -while ( <> ) -{ - if ( my ( $dn ) = /^dn: (.+)$/ ) - { - if ( not defined ( $annuaire ) ) - { - $annuaire->{$dn} = Tree::Simple->new ( $dn ) ; - $apex = $dn ; - } - else - { - my ( $premier , $suite ) = $dn =~ /^([^,]+),(.+)$/ ; - $annuaire->{$dn} = Tree::Simple->new ( $dn , $annuaire->{$suite} ) ; - } - } +while (<>) { + if ( my ($dn) = /^dn: (.+)$/ ) { + if ( not defined($annuaire) ) { + $annuaire->{$dn} = Tree::Simple->new($dn); + $apex = $dn; + } + else { + my ( $premier, $suite ) = $dn =~ /^([^,]+),(.+)$/; + $annuaire->{$dn} = Tree::Simple->new( $dn, $annuaire->{$suite} ); + } + } } -my $profondeur = -1 ; -my @aff_vert = ( ) ; +my $profondeur = -1; +my @aff_vert = (); -print "$apex\n" ; +print "$apex\n"; -$annuaire->{$apex}->traverse -( - sub - { - my ( $element ) = @_ ; - my $tag = $element->getNodeValue ( ) ; - $profondeur = $element->getDepth ( ) ; - if ( $profondeur != 0 ) - { - foreach my $p ( 0 .. $profondeur - 1 ) - { - if ( $aff_vert[$p] ) - { - print '| ' ; - } - else - { - print ' ' ; - } - } - } - print '+-- ' . $tag . "($profondeur)" . "\n" ; +$annuaire->{$apex}->traverse( + sub { + my ($element) = @_; + my $tag = $element->getNodeValue(); + $profondeur = $element->getDepth(); + if ( $profondeur != 0 ) { + foreach my $p ( 0 .. $profondeur - 1 ) { + if ( $aff_vert[$p] ) { + print '| '; + } + else { + print ' '; + } + } + } + print '+-- ' . $tag . "($profondeur)" . "\n"; - if ( not $element->isLeaf ( ) ) - { - $aff_vert[$profondeur] = 1 if $element->isFirstChild ( ) ; - $aff_vert[$profondeur] = 0 if $element->isLastChild ( ) ; - } - } -) ; + if ( not $element->isLeaf() ) { + $aff_vert[$profondeur] = 1 if $element->isFirstChild(); + $aff_vert[$profondeur] = 0 if $element->isLastChild(); + } + } +); From 38af444cb1b62451142df7965b67d90053cc17b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20OUDOT?= Date: Mon, 27 Feb 2023 07:16:36 +0100 Subject: [PATCH 3/4] Use international vars --- ldap-dit.pl | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/ldap-dit.pl b/ldap-dit.pl index a8782c2..5a518b4 100644 --- a/ldap-dit.pl +++ b/ldap-dit.pl @@ -25,34 +25,34 @@ use Tree::Simple; -my $annuaire = undef; -my $apex = undef; +my $directory = undef; +my $apex = undef; while (<>) { if ( my ($dn) = /^dn: (.+)$/ ) { - if ( not defined($annuaire) ) { - $annuaire->{$dn} = Tree::Simple->new($dn); + if ( not defined($directory) ) { + $directory->{$dn} = Tree::Simple->new($dn); $apex = $dn; } else { - my ( $premier, $suite ) = $dn =~ /^([^,]+),(.+)$/; - $annuaire->{$dn} = Tree::Simple->new( $dn, $annuaire->{$suite} ); + my ( $first, $next ) = $dn =~ /^([^,]+),(.+)$/; + $directory->{$dn} = Tree::Simple->new( $dn, $directory->{$next} ); } } } -my $profondeur = -1; -my @aff_vert = (); +my $depth = -1; +my @aff_vert = (); print "$apex\n"; -$annuaire->{$apex}->traverse( +$directory->{$apex}->traverse( sub { my ($element) = @_; my $tag = $element->getNodeValue(); - $profondeur = $element->getDepth(); - if ( $profondeur != 0 ) { - foreach my $p ( 0 .. $profondeur - 1 ) { + $depth = $element->getDepth(); + if ( $depth != 0 ) { + foreach my $p ( 0 .. $depth - 1 ) { if ( $aff_vert[$p] ) { print '| '; } @@ -61,11 +61,11 @@ } } } - print '+-- ' . $tag . "($profondeur)" . "\n"; + print '+-- ' . $tag . "($depth)" . "\n"; if ( not $element->isLeaf() ) { - $aff_vert[$profondeur] = 1 if $element->isFirstChild(); - $aff_vert[$profondeur] = 0 if $element->isLastChild(); + $aff_vert[$depth] = 1 if $element->isFirstChild(); + $aff_vert[$depth] = 0 if $element->isLastChild(); } } ); From fcd961ad5e7735e63334d54e4c5a27b3a1da0a69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20OUDOT?= Date: Fri, 9 May 2025 11:37:25 +0200 Subject: [PATCH 4/4] Normalize DN --- ldap-dit.pl | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/ldap-dit.pl b/ldap-dit.pl index 5a518b4..caf9c75 100644 --- a/ldap-dit.pl +++ b/ldap-dit.pl @@ -1,7 +1,7 @@ #! /usr/pkg/bin/perl #==================================================================== -# Script to convert CSV or LDIF into LDIF +# Script to print DIT from LDIF file # # Copyright (C) Marc Baudoin # Copyright (C) LTB-project.org @@ -24,19 +24,41 @@ use warnings; use Tree::Simple; +use Net::LDAP::Util qw/ldap_explode_dn/; my $directory = undef; my $apex = undef; while (<>) { if ( my ($dn) = /^dn: (.+)$/ ) { + + # Normalize DN + my $dn_explode = ldap_explode_dn( $dn, 'casefold' => 'lower' ); + next unless $dn_explode; + my @dn_full = @$dn_explode; + my ( $rdn, $branch ); + + for my $i ( 0 .. $#dn_full ) { + $branch = $branch ? $branch .= ", " : ""; + foreach my $attr ( keys %{ $dn_full[$i] } ) { + if ( $i == 0 ) { + $rdn = $rdn ? $rdn .= "+" : ""; + $rdn .= $attr . "=" . lc( %{ $dn_full[$i] }{$attr} ); + } + else { + $branch .= $attr . "=" . lc( %{ $dn_full[$i] }{$attr} ); + } + } + } + + $dn = $rdn . ', ' . $branch; + if ( not defined($directory) ) { $directory->{$dn} = Tree::Simple->new($dn); $apex = $dn; } else { - my ( $first, $next ) = $dn =~ /^([^,]+),(.+)$/; - $directory->{$dn} = Tree::Simple->new( $dn, $directory->{$next} ); + $directory->{$dn} = Tree::Simple->new( $dn, $directory->{$branch} ); } } } @@ -61,7 +83,7 @@ } } } - print '+-- ' . $tag . "($depth)" . "\n"; + print '+-- ' . $tag . " ($depth)" . "\n"; if ( not $element->isLeaf() ) { $aff_vert[$depth] = 1 if $element->isFirstChild();