Apache でローミングアクセス

注意: このページは内容が古くなってます。mod_roaming などを使ったほうがてっとりばやいと思います

履歴

Netscape Communicator 4.5 日本語版が出たのというので、さっそくインストールしました。で、いろいろ試してたら「編集(E)」→「設定(E)...」に「ローミング」というカテゴリがあるのに目が止まりました。

カテゴリを選択してみます。どうやら bookmark とか cookies などの設定情報をサーバに保存しておき、他のマシンにインストールのクライアントからも利用できるようにする仕掛けのようです。プロトコルとしては LDAP また HTTP のようですな。

「複数のクライアントで bookmark が共有できるはないかっ!」っつーことで、どういうしかけで動いているのか、お手軽なHTTP を使った場合について調べてみました。

動作の観察

まず、Communicator の「編集(E)」→「設定(E)...」から「ローミングアクセス」のカテゴリを選択します。「ローミングアクセス」をクリックして現れる「このプロファイルに対してローミングアクセスを有効にする(E)」にチェックを入れます。次にその下の「ユーザ名(U)」にユーザ名を入れます。どういうユーザ名を使えばいいのかわからないので、適当に自分のノートPCのアカウント名を入れておきました (私のノートPCはLinuxが動いてます)。

「ローミングアクセス」の「サーバ情報」をクリック。「HTTPサーバ(H)」にチェックを入れ、「ベースURL(B)」に適当に「http://mynote.domain/~myname/profile/」とでも入れておきます。「mynote.domain」は私のノートPCのホスト名、「/~myname/profile/」は今思い付いた適当なURLです (myname はアカウント名)。たぶん、このURL配下にデータが格納されるのでしょう。

「ファイル選択」はとりあえずデフォルトにしときます。

ひととおり設定したら、Communicator を終了。ノート上の Apache のログ を tail -f で流し見状態にしておき (Debian デフォルトなので tail -f /var/log/apache/access.log)、Commnicatro を起動。

といったことをあれこれ繰り返してみると、どうやら、PUTDELETEといったメソッドを使ってるみたいです。そういや、Netscape Navigator Gold 以降の Netscape Navigator (Composer) や、Amayaの Publishing 機能とかで使ってたっけ。でも、PUT や DELETE はどうやってハンドルするのだ…

さっそく RFC とか、Apache 関連サイト、検索エンジンなどで調べてみます。Apache では PUT や DELETE は「Script」で設定すれば良さそうです。さらに具体的に参考になりそうなものをApache Weekの記事に見付けました。Perl で書かれたサンプルのハンドラもあります。

PUT と DELETE の処理を設定

/etc/apache/srm.conf

Script PUT /cgi-bin/put
Script DELETE /cgi-bin/delete

を追加。/cgi-bin/に該当する/usr/lib/cgi-bin/に、ApacheWeek のサンプルスクリプトを改造したputdeleteを置き、CGI として実行できるように設定します。

ローミングサーバの指定で記述した /~myname/profile/ という URL に該当するディレクトリ (ここでは/home/myname/public_html/profile/) を作って、その中に

AuthName mynote.domain-myname-profile
AuthType Basic
AuthUserFile /usr/home/myname/etc/webpasswd
require valid-user

と書いた .htaccess を作成します (Apache の access.confOverride 指定により、この .htaccess が有効になってることが必要)。このディレクトリ (/home/myname/public_html/profile/) はとりあえず chmod 777 しておき、httpd から起動された put や delete がファイルを読み書きできるようにします。セキュリティ上はもう少し考えたほうがいいけど、とりあえずここでは無視します:-)

そして、Apache 付属のhtpasswdコマンドでパスワードファイル(この場合は/usr/home/myname/etc/webpasswd)にローミングユーザ名としてCommunicatorに設定した「myname」のエントリを作成し、ユーザ認証するように準備。

さて、Communicator を起動してみます。パスワードを訊かれるのでhtpasswdでセットしたものを入力し続行。この時のログを見てみると

mydesktop - - [16/Nov/1998:20:01:11 +0900] "PUT /~myname/profile/WRITETEST HTTP/1.0" 401 401
mydesktop - myname [16/Nov/1998:20:01:11 +0900] "PUT /~myname/profile/WRITETEST HTTP/1.0" 204 0
mydesktop - myname [16/Nov/1998:20:01:11 +0900] "DELETE /~myname/profile/WRITETEST HTTP/1.0" 200 56
mydesktop - myname [16/Nov/1998:20:01:12 +0900] "HEAD /~myname/profile/liprefs HTTP/1.0" 404 0
mydesktop - myname [16/Nov/1998:20:01:12 +0900] "HEAD /~myname/profile/abookJNB.na2 HTTP/1.0" 404 0
mydesktop - myname [16/Nov/1998:20:01:13 +0900] "HEAD /~myname/profile/filters HTTP/1.0" 404 0
mydesktop - myname [16/Nov/1998:20:01:13 +0900] "HEAD /~myname/profile/bookmarks HTTP/1.0" 404 0
mydesktop - myname [16/Nov/1998:20:01:13 +0900] "HEAD /~myname/profile/cookies HTTP/1.0" 404 0

という記録が出てます。まず「WRITETEST」を書いて消す、という動作で read-write 権限をチェックし、liprefsなどのファイル名で設定がストアされてないかチェックしています。ここでは初めてのアクセスなので全部「404 (NotFound)」に終ってます。

今度は Communicator を終了してみましょう。「ローミングアクセスサーバにアップロードする項目を…」というダイアログが出たあと何やら表示されます。この時のログは…

mydesktop - myname [16/Nov/1998:20:02:17 +0900] "PUT /~myname/profile/li11038.tmp HTTP/1.0" 204 0
mydesktop - myname [16/Nov/1998:20:02:17 +0900] "MOVE /~myname/profile/li11038.tmp HTTP/1.0" 501 221
mydesktop - myname [16/Nov/1998:11:13:17 +0900] "DELETE /~myname/profile/li11038.tmp HTTP/1.0" 405 246

「MOVE」って何?

MOVE をなんとかする

たぶん、仮の名前を指定して「PUT」でアップロードし、「MOVE」で正しい名前(この例だと liprefs)に変更しようとしたが、エラー (501 Method Not Implemented) になったので、「DELETE」で取り消した、ということなのでしょうね。

MOVE は何? HTTP/1.1 の中を探しても見付からない…。そこであちこちで調べてみると、

MOVE OLD-URI HTTP/1.0
New-URI:
NEW-URI

といったリクエストを送っているようです (WEBDAV にも MOVE はあるけど、ちょっと違うみたい)。

さて、どうしたものか。てっとりばやいので、Apache 本体にパッチをあててみました。→ Apache 1.3.3 用 MOVE メソッド拡張パッチ

Apache にパッチを当てて、コンパイルし、インストール (テストなので /usr/local/apache を ServerRoot) します。

このパッチで MOVE を PUT と似たような手順で処理できると思います。具体的には、srm.conf

Script MOVE /cgi-bin/move

を追加し、/cgi-bin/move として moveを置きます。

Communicator を起動し、bookmark や cookies などに変更を加え、Communicator を終了すると

mydesktop - myname [17/Nov/1998:03:14:42 +0900] "HEAD /~myname/profile/liprefs HTTP/1.0" 200 0
mydesktop - myname [17/Nov/1998:03:14:43 +0900] "PUT /~myname/profile/li458.tmp HTTP/1.0" 204 0
mydesktop - myname [17/Nov/1998:03:14:43 +0900] "HEAD /~myname/profile/liprefs HTTP/1.0" 200 0
mydesktop - myname [17/Nov/1998:03:14:43 +0900] "MOVE /~myname/profile/li458.tmp HTTP/1.0" 200 56

と記録されます。どうやらうまくいってるみたいです(^^)。

異る OS 間での使用

使ってるクライアントが Windows 環境 Only、とかならこれでも良さそうですが、UNIX 環境など、文字コードなどの設定が違うものだとうまくなさそうです。ブックマークの文字コードについて調べてみると、

Windows (日本語版 Communicator)
Shift_JIS
UNIX (英語版 Communicator で Resource のみ日本語化したもの)
EUC_JP

となってます。ちなみに改行コードはどちらも「CR+CR+LF」というものを使っており、英語だけなら問題ありません。ブックマーク中のどのフォルダをユーザ設定ツールバーとして使うのかについてはブックマーク編集でフォルダを選択し、「ツールバーフォルダに設定」「ツールバーフォルダを解除」という設定を行って変更できますが、これは、prefs.js に情報が格納されます。

cookies については OS 間で共有できそうです。

各種設定 prefs.js (liprefs.js) はフォント名などの問題もあり、変換は面倒そうです。でも、そんなに変更するものでもないですから、手動で設定すれば実用上は問題ないでしょう。

そこで、ブックマークの変換を試みます。サーバが自動的に判断すれば良いのですが、PUT/MOVE/GET のハンドラに組み込む必要がありますので、とりあえず、それは後回し。サーバ上で手動で実行するスクリプトを作って試すことにします。

bookmark 変換スクリプト

作ってみました。とりあえず UNIX → WIN です。

win-bookmark.headを、スクリプト中で指定されたパスに置き、root 権限でスクリプトを実行すると、漢字コードの変換を行って、rename します。別途、jcode.pl が必要 (Debian なら libjcode-perl をインストール)。

UNIX 上の Communicator を終了させ、サーバに bookmark を保存。そして、このスクリプトを実行した後、Windows 上の Communicator を起動すると、bookmark がサーバからダウンロードされます。おー、UNIX 上のと同じ bookmark が使えてる! ブックマーク編集ウインドウで「ツールバーフォルダに設定」を実行すれば、ツールバーも同じに!

Netscape による情報

「そういや、Netscape 社が提供している情報を見てないな」ということで、netscape.com からいくらか検索してみました。

とりあえずこんなところかな。最初から netscape.com を検索すれば良かったな…。LDAP な部分は Apache のには直接関係ないけど。

bookmark 変換スクリプト(2)

WIN → UNIX です。

これでOKだと思う。

MOVE 不要

Manually Implementing Roaming Accessをちゃんと見てみる。なんだ、MOVE がない HTTP サーバのための解決方法も書いてあるじゃない。Windows ならば、C:\Program Files\Netscape\Users\myname\prefs.js

user_pref("li.server.http.useSimplePut", true);

を追加してみる。さっそく動作確認。Apache のログを見ると、

mydesktop - myname [19/Nov/1998:21:44:44 +0900] "HEAD /~myname/profile/bookmarks HTTP/1.0" 200 0
mydesktop - myname [19/Nov/1998:21:44:44 +0900] "PUT /~myname/profile/bookmarks HTTP/1.0" 204 0

話が簡単になったな、と。UNIX 系列なら、~/.netscape/preferences.jsだ。これで Apache にパッチ当てる必要がなくなった(^^)


TODO

bookmark 変換を Apache から自動的に実行させるよう、Script で指定できるハンドラとして使えるようにする。

Apache を使わずに inetd から起動する小さなコマンドですませる方法を考える。

「フリーな」LDAPサーバも試みてみる。


関連情報

最近はなにもやってないですが、他にも「Apache で roaming」というをいろいろ見付けました

How to Implement Roaming Access with Communicator 4.5 and Apache 1.3.x
結構詳しい。CCK (Client Customization Kit) や MCD (Mission Control Desktop) へのリンクがある
mod_roaming
そのものズバリ。Module として romaing 機能を実装
CPAN - Apache [FTP]
CPAN 上の Apache 用のモジュール集。Apache::Roaming というものがある。別途、mod_perl が必要
戻る