さてOpenLDAPに登録されるデータについて、rfc2849でいうところの"SAFE-STRING"に収まらないものはBase64でエンコードされた上で格納される事になっています。 その時の目印はAttributeの区切りが':'から'::'になっているものです。
rfc2849をみると他にURLを使う':>'が記述されていますが、これは放っておきましょう。
郵便番号の県名などの日本語データはLDAP上では自動的にbase64エンコーディングされて格納されています。 そのためそのままldapsearchをすると、あまりうれしくない表示になります。
$ ldapsearch -x -b dc=example,dc=org postalCode=9650000 dn: ou=020258,ou=Address,dc=example,dc=org objectClass: organizationalUnit ou: 020258 st:: 56aP5bO255yM l:: 5Lya5rSl6Iul5p2+5biC street:: 5Lul5LiL44Gr5o6y6LyJ44GM44Gq44GE5aC05ZCI postalCode: 9650000 description: 0,0,0,0,0
base64をデコードする簡単なフィルタを作る
そこでパイプに渡すと'::'を認識してbase64デコードするスクリプトを作ってみました。
#!/usr/bin/ruby
require 'base64'
$stdin.each do |line|
if line !~ /^\w+::\s/
print line
next
end
(label, item) = line.split(/\s+/, 2)
printf "%s %s\n", label, Base64.decode64(item)
end
例えばlsuf.rbとかいう名前のファイルに保存して、パイプでそのまま渡してみます。
$ ldapsearch -x -b dc=example,dc=org postalCode=9310000 | ./lsuf.rb dn: ou=020258,ou=Address,dc=example,dc=org objectClass: organizationalUnit ou: 020258 st:: 福島県 l:: 会津若松市 street:: 以下に掲載がない場合 postalCode: 9650000 description: 0,0,0,0,0
実際のところ、これぐらいして確認しないと、本当にデータが保存されているのか自信なくなりますね。
ldapsearchの引数にutf-8(日本語)を渡す
例えば"会津若松市"にある郵便番号を全て表示したい場合には、次のようにする事ができます。
$ ldapsearch -x -b dc=example,dc=org '(l=会津若松市)' postalCode street | ./lsuf.rb # 020258, Address, example.org dn: ou=020258,ou=Address,dc=example,dc=org street:: 以下に掲載がない場合 postalCode: 9650000 ... ... # 020480, Address, example.org dn: ou=020480,ou=Address,dc=example,dc=org street:: 和田 postalCode: 9650811
とりあえずこれでだいたい使えるようになったかな…。
0 件のコメント:
コメントを投稿