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