[EMAIL PROTECTED] ([EMAIL PROTECTED]) wrote:
>
>
> You can else try something like this..
>
> - Make un sub program that take a DN in paramter and make search for
> objects with "objectClass=organizationalUnit" and a "BASE" scope.
> -> If found, for each objects, recursively call your sub program with
> DN as parameter.
> -> And then, delete all entries under this OU.
>
> I think, this method works, i have done something like this in java. But it
> may exist a better way to do this.
Here you go. You might need to implement paged result sets, if your
directory enforces a result limit.
Can somebody with commit access include this into the examples? Also,
suggestions for improvement of speed are welcome :-)
Thanks,
--
Mike
#!/usr/bin/perl -w
#
# recursive-ldap-delete.pl
#
# Mike Jackson <[EMAIL PROTECTED]>
#
use strict;
use Net::LDAP;
my $server = "localhost";
my $binddn = "cn=directory manager";
my $bindpasswd = "foobar";
my $base = "dc=bigcorp,dc=com";
my $delbranch = "ou=users,$base"; # branch to remove
my $ldap = Net::LDAP->new( $server ) or die "$@";
$ldap->bind( $binddn, password => $bindpasswd, version => 3 );
my $result = $ldap->search( base => $delbranch,
filter => "(objectclass=*)" );
my @dnlist;
my $entry;
foreach $entry ( $result->all_entries ) { push @dnlist, $entry->dn }
# explode dn into an array and push
# arrays to indexed hash of arrays
my %HoL;
my $i = 0;
for ( @dnlist ) {
s/,$base//;
$HoL{$i} = [ split(",", $_) ];
$i++;
}
# sorted descending by number of members (leaf nodes last)
foreach my $key ( sort { @{$HoL{$b}} <=> @{$HoL{$a}} } keys %HoL ) {
my $dn = join(",", @{ $HoL{$key} }).",$base";
$ldap->delete($dn);
}
$entry->update ( $ldap );
$ldap->unbind;
0;