Vcard 形式(vcf)のファイルから、LDAP 用のldif ファイルへと変換するスクリプトを作成してみました。
手元にあった、NTT Docomo SH901iS の電話帳データ(vcf) を利用してテストしました。
What is this?
Vcard(vcf) から LDIF への変換スクリプト
Require
- sh (メインは、シェルスクリプト)
- nkf (前処理の為 : 後述)
- sed (前処理の為 : 後述)
- php (本処理)
インストール : php.net からダウンロード - pear-Contact_Vcard_Parse
本家 : PEAR :: Package :: Contact_Vcard_Parse からダウンロード - mbstring
インストール : phpを –enable-mbstring つきでコンパイル等 (PHP: マルチバイト文字列関数 (mbstring) – Manual 等を参照)
Files
- vcf2ldif (本体)
- lib/ (vcf2ldifが呼び出すファイルたち)
- pre.sed (前処理のsedで用いる)
- vcf2ldif.php (本処理)
- conf/ (設定)
- conf.sh (vcf2ldif用)
- conf.php (lib/vcf2ldif.php用)
Install
最新版のダウンロードは、subversion のクライアントから、
[user]% svn co http://milk.pnkx.com:8080/svn/pub/software/mail/vcf2ldif/trunk
で、trunk ディレクトリが出来上がると思うので、その中に入っています。
vcf2ldif の実行権限、lib/vcf2ldif.php の実行権限、実行するディレクトリで書き込み権限があることを確認して下さい。
Usage
[user]% /path/to/vcf2ldif /path/to/vcffile.vcf
vcfファイルを引数に与えて下さい。今の所オプションはありません。
Config
設定は、confディレクトリ以下のファイルに記述します。
- conf.sh
- conf.php
これは、シェルスクリプトであるvcf2ldif 用の設定です。出力ファイル名の設定や、php, sed, nkf のパスを指定できます。
これは、phpスクリプトである lib/vcf2ldif.php 用の設定です。出力するldifのsuffix、出力ファイルの上書き設定、pearファイルのパス、出力するログのレベルなどが指定できます。
Tips
Contact_Vcard_Parseは、1つのファイルが複数のデータ(BEGIN:VCARD — END:VCARD)からなる場合にも対応しています。このvcf2ldifもそれに合わせてあります。よって、大量のvcfファイルを処理する場合は、以下のコマンド等でvcfファイルを結合してから実行すると手間が省けます。
[user]% cat /path/to/vcf/dir/*.vcf > all.vcf
/path/to/vcf2ldif all.vcf
Instruction
データについて
処理を行っているデータ(vcfでのフィールド)は、
- メールアドレス(EMAIL)
- 名前(N)
- 電話番号(TEL)
- 住所(ADR)
- 郵便番号(ADR)
- 誕生日(BDAY)
です。
ldif 側では、objectClass: inetOrgPerson に当ててます。誕生日などは、ldif側 には該当するフィールドが無いので、description: BDAY{20070523} のようにしています。
今後は、vcf のNOTE フィールドや、PHOTO フィールドや、CATEGORY フィールドなどにも対応できたらいいな、と思います。
動作について。
vcf2ldif はシェルスクリプトです。メインの処理自体は lib/vcf2lidf.php で行っておりますので、バッチファイルを用意すれば、windowsでも動作可能だと思います。
前処理は以下の流れです。
1. 当方EUC環境ですが、SH901iS の出力するvcfファイルはShift_JIS なので、nkf にてShift_JISからEUCへ変換。
2. 住所やNOTE(メモ?)等、QUOTED-PRINTABLE にてエンコードされた部分は、改行されている場合もあり、pear-Contact_Vcard_Parseでは改行をうまく処理できません(VCFは多分本来改行がデータの区切りにならなければならず、vcfファイルが不適切?)。なので、sed を利用して改行を取り除きます。
前処理が終わったら、それをphpファイルに渡してあげます。そうすると、phpは、output.ldif というファイルを出力します。
出来上がるデータには、cn=”姓名” sn=”姓名” となっています。共に日本語なので、UTF-8(LDIFの仕様)にphp内部でmbstring を用いて変換し、それをbase64でエンコードしています。
本当は、kakasi を利用して、ローマ字の名前もcn=”"としたかったのですが、base64でエンコードしたものと一緒にすると、何故かLDAP側でローマ字の方が文字化けるようなので、とりあえず全て日本語を用いるようにしています。
また、出来上がるDNは、dn: mail=”xxx@xxx.xxx”,$suffix という形にしています。これは、メールアドレスが複数ある人の場合は、名前をDNにすると重複してしまうためです。
Developing Environment
動作確認は以下の環境で行っています。
OS : 6.2-RELEASE FreeBSD
php5-5.2.1_3
ja-kakasi-2.3.4
pear-Contact_Vcard_Parse-1.31.0
php5-mbstring-5.2.1_3
openldap-server-2.3.35
openldap-sasl-client-2.3.35
Popularity: 51% [?]