PerlでLDAP検索、しかも全検索

普通にNet::LDAPで bind すると非常に重い、しかも
20万件以上エントリーのあるLDAPを引いてみたところ、Out Of Memory!! が出力されてしまった。
そこでldapsearchをパイプでParseする事に、これで断然高速化が図れかつメモリ使用量も肥大化せずに済む筈だ。

ldapsearchをパイプでPerlに渡す

./ldap_parse.sh
#!/bin/sh

ldapsearch -x -LLL -h xxx.xxx.xxx.xxx -D "cn=admin,o=enecom,c=com" -w password -b c=com '(cn=*)' | ./ldap_parse.pl

exit 0
./ldap_parse.pl
#!/usr/bin/perl

use strict;
use Net::LDAP::LDIF;

my $ldif = Net::LDAP::LDIF->new();
while( not $ldif->eof() ) {
my $entry = $ldif->read_entry();
if ( $ldif->error() ) {
print "Error msg: ", $ldif->error(), "\n";
print "Error lines:\n", $ldif->error_lines(), "\n";
} else {
# some code
}
}
$ldif->done();

exit(0);

LDAP接続の段階からPerlで行う

./ldap_get.pl
#!/usr/bin/perl

use strict;
use Net::LDAP;

my $ldap_host = 'xxx.xxx.xxx.xxx';
my $bind_dn   = 'cn=admin,o=example,c=com';
my $bind_pw   = 'password';
my $base      = 'c=com';
my $filter    = '(cn=*)';

my $ldap = Net::LDAP->new( $ldap_host ) or die "$@ $!";

$ldap->bind( $bind_dn, password => $bind_pw ) or die "$@ $!";

my $mesg = $ldap->search( base => $base, filter => $filter );

$mesg->code and die $mesg->error;

for my $entry ( $mesg->all_entries ) {
# some code
}

$ldap->unbind;

exit(0);