#!/usr/bin/perl
##
## Sort entires in LDIF by DN (no Net::LDAP::LDIF version)
## Copyright (c) 2007 SATOH Fumiyasu @ OSS Technology, Inc.
##               <http://www.osstech.co.jp/>
##
## License: GNU General Public License version 2 or later
## Date: 2007-11-12, since 2007-11-12
##

use strict;
use warnings;
use MIME::Base64;

my $entries_by_dn = {};
$/ = '';
while (defined(my $entry = <>)) {
  chomp($entry);
  $entry =~ s/\n[ \t]//g;

  my ($b64, $dn) = $entry =~ /^dn:(:)?\s*(.*)$/im;
  next unless (defined($dn));

  chomp($dn);
  $dn = lc(defined($b64) ? MIME::Base64::decode_base64($dn) : $dn);
  $dn =~ s/\s*,\s*/,/g;
  $entries_by_dn->{$dn} = $entry;
}

my @dn_list =
  map { $_->[0] }
  sort {
    my $x;
    for (1..$#$a) {
      defined($a->[$_]) || return -1;
      defined($b->[$_]) || return +1;
      $x = $a->[$_] cmp $b->[$_] and return $x;
    }
    return -1;
  }
  map { [$_, reverse(split(/,/, lc($_)))] }
  keys %$entries_by_dn;

for my $dn (@dn_list) {
  print "\n", $entries_by_dn->{$dn}, "\n";
}

exit(0);

