Net::LDAP::Alternative

perl-ldap (Net::LDAP) のインターフェースがわかりにくくて、たまにこいつでプログラムを書こうとすると、いつもど忘れして perldoc と睨めっこするはめになるので、違うインターフェースで LDAP アクセスできるラッパモジュールを書いてます。とりあえずプロトタイプ版の Net::LDAP::Alternative を置いておきます。まだ未完成で pod すらちゃんと書いてないですが。

インターフェースがどんな風に違うかを例で示してみます。「特定の検索条件にマッチするエントリの電話番号を書き換える」という操作を、Net::LDAP で書くとこんな感じになります。

my $ldap = Net::LDAP->new(
    'kenny',
    port => 389,
);

$ldap->bind(
    'cn=Directory Manager',
    password => 'password',
);

my $msg = $ldap->search(
    base   => 'o=southpark',
    filter => '(&(uid=miya)(cn=gosuke*))',
);

for my $entry ( $msg->entries ) {
    print $entry->get_value('telephonenumber');
    $ldap->modify(
        $entry->dn,
        replace => { telephonenumber => '00-0000-0000' }
    );
}

これを Net::LDAP::Alternative で書くとこうなります。

my $ldap = Net::LDAP::Alternative->new({
    host    => 'kenny',
    port    => '389',
    bind_dn => 'cn=Directory Manager',
    bind_pw => 'password',
    base    => 'o=southpark',
});

my $entries = $ldap->search({
    uid => 'miya',
    cn  => 'gosuke*',
});

while ( my $entry = $entries->next ) {
    print $entry->telephonenumber;
    $entry->telephonenumber('00-0000-0000');
    $entry->update;
}

Net::LDAP と特に異なる点は、

ってとこですね。

また、1件しか検索結果が返らないことがわかっている場合は、Net::LDAP であれば

my $msg = $ldap->search(
    base   => 'o=southpark',
    filter => '(&(uid=miya)(cn=gosuke*))',
);

my $entry = ($msg->entries)[0];

といった感じでエントリを取得するわけですが、Net::LDAP::Alternative では

my $entry = $ldap->search({
    uid => 'miya',
    cn  => 'gosuke*',
})->first;

といった感じでエントリ取得ができます。

こんな感じで、DBIx::Class のインターフェースを参考にして、直感的にわかりやすいようにしてます。

とりあえずなんとなくつくってみただけなので、これを発展させるかどうかはまだ未定。