Net::LDAP::Alternative

Posted by Gosuke Miyashita Sun, 31 Dec 2006 19:10:24 GMT

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 と特に異なる点は、

  • bind は明示的にしない。(コンストラクタで bind してる。)
  • search を簡略化。LDAP 特有のフィルタ記法で書かなくて良い。
  • 検索して得られるエントリをイテレータにしてみた。
  • エントリの属性取得のアクセサメソッドを実装。(get_value をつかわなくてよい。)
  • エントリの属性変更もアクセサメソッド経由でできるので直感的にわかりやすい。

ってとこですね。

また、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 のインターフェースを参考にして、直感的にわかりやすいようにしてます。

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

Trackbacks

Use the following link to trackback from your own site:
http://blog.mizzy.org/articles/trackback/372

Comments

Leave a response

Comments