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 のインターフェースを参考にして、直感的にわかりやすいようにしてます。
とりあえずなんとなくつくってみただけなので、これを発展させるかどうかはまだ未定。