perl と悪戦苦闘2010年10月19日 23時25分

いやはや。
いつもながら久しぶりにやると忘れていることだらけである。
今日は半日以上、perl の ldap 操作関数と格闘していた。
まず、perl でちょんぼをやらかしてうまくいかない。
それからスクリプトでディレクトリからユーザ情報を取り出すところまでは割合すんなりいった。ところが今度は更新がうまくいかない。
更新には $ldap->modify() というメソッドを使うが、エラーもなくスクリプトは終了しているのにディレクトリ自体には反映されないという問題が出た。
ウェブをあちこち探すが、perl で ldap をいじろうという人が少ないのか、日本語のページで使えそうなのは殆どない。仕方がないので英語のページをあちこち見て回るが、欲しい情報に行き当らない。
何とかエラーの表示の仕方を真似してエラーを表示させたらパーミッションがないという毎度のお粗末な結末だった。slapd.conf に localhost を追加したり、ユーザによるパスワードの変更を許可したりして漸くディレクトリの更新はできるようになった。

更新できるようになったということは ldap のユーザでウェブサーバの認証ができるかどうか確認しなければならない。
ということで Apache の設定ファイルをいじる。ちょっと迷ったりしたが、こちらは比較的すんなりできるようになった。

次の問題はメールだ。現行のシステムはパスワードを変更するとウェブサーバのパスワードも変更するが、メールサーバにメールも送信する。送信するのは変更通知確認のメールと、それとは別にメールサーバに対してユーザパスワードを変更するコマンドメールも送信している。ldap でユーザ管理をしたいのはウェブサーバとメールサーバで個別にパスワードを管理していて、この不細工な仕様を廃止したいからでもある。

すでに動作しているスクリプトからメール送信部分を取り出して貼り付けて、テストしているのにどういうわけかメールの送信ができない。
あれこれやってみるが解決しない。並行して別の類似のスクリプトから送信されるメールはちゃんとメールサーバに届いているというのに、パスワードの変更スクリプトで送信しようとすると駄目だ。送信したメールは行方不明だ。後で気が付いたが、ウェブサーバの不思議なところにメールを配送していた。
ログを見るとなぜか正常な別のスクリプトとデバッグしているパスワードのスクリプトでログの内容が違う。
あれこれ試行錯誤するが、一向に解決しない。html ファイルのディレクトリのユーザ認証と、cgi ディレクトリのユーザ認証が違っているからこういう問題が起きるのかと疑ってみたりもするが、exim のログを見る限りそうではないようだ。

結局わからないまま帰宅する。帰ってから exim の本を見て exim のログを調べる。違うのはわかるが、原因がわからない。
さらにあれこれする。
たまたまメールに送信する内容をファイルに出力したものをサーバから取り寄せて見ると、改行が余分になっている。これは落し穴だった。
会社では telnet の画面で見ていた。テキストが一行おきに表示されていた。これは unix 系 OS とメールの改行コードが違うからだと思い込んでいた。
改めてテキストファイルに出力してみたものを取り寄せて開いて見るとやはりテキストが一行おきに出力されている。exim の挙動がおかしいのはこれが原因ではないか。バイナリファイルエディタで開いてみると確かに 0x0d 0x0a 0x0a (\r\n\n) になっている。

ん、なぜだ。print 文に細工がしてあるかと思って調べても特に違いはない。

あっ、と思った。なぜかスクリプトの最初の方に次のような行があることに気がついたのだった。

$\ = "\n";

これは改行コードを \n にする代入文だ。確かに正常に動作しているスクリプトを見るとそんなものは入っていない。なぜこんなものか入っていたのか。誰が入れたのだ、と喚きたいところだが、誰もこんなスクリプトをいじる筈はないので、自分が入れたに違いない。しかし、いつの間に。

こうして万年初心者サーバ管理者の一日は終っていくのだった。