この日記は不定期に更新されます。なんにせよ、大したことは書かれないはずですが。
取扱上の注意
・ こないだの週末にあった合宿のためにいろいろと files を download しなけ ればならなかったのだが、日記を更新してしまうと access line の帯域がか なり喰われてしまう*1ので、日記の更新は pending していた。
*1: うちはいまだに Flet's ISDN の 64kbps‥‥
・ 合宿。思いがけず big な guest がいらしたのだが、当日の朝から風邪がどんどん悪化して、ほ とんどお話を伺うことができなかったのが、実に悔やまれる。発表の間はトイ レと会場を行ったり来たりだったし、夕食後の BOF のときは起きていられな くて早々に寝てしまったし。朝荷物を担いで駅へ向かおうとしたら既に足下が ふらついていたほどだったので、東京からの高速 bus 組の取り纏めと、発表 の video 撮影を引き受けていなければ、参加を中止していたかも。行きの bus の中でも雪隠詰めになってたくらいなので。
・ ただ、現地の風呂の水質は私の皮膚にドンピシャだったらしく、かなり長い間 悩まされていた肩口と背中のかぶれ(あせもや薬品かぶれに由来するもの)が 一気に引いてしまった。(風邪の対策のためもあって)かなり汗だくで寝てい たにも関わらず、だ。時間と金があれば、しばらく湯治をしたいくらい。
・ いまだに腹痛が完全には治まってくれません。日記の更新・補完どころではな い。原稿の書き足しもしなきゃいけないのに‥‥。
・ 諸般の事情で、補完は中断。
・ これまた諸般の事情で、落ちました T_T。
・ 幸か不幸か時間に余裕ができたので、移行作業の続きを進める。
・ PHP3からPHP4への移行の続き。PHP3で<?と書かれていたscript開 始の記号を<?phpに書き換える。ついでに、PHP4自体に統合され ている国際化機能を有効にしないでcompileしてあったので、これを有効にし て*1compileしなおして再install。さらに/usr/local/etc/php.ini を編集してoutput_handlerも国際化版を使用するようにし、入出力 関係の設定変数も適切に指定。最後にapache2ごと再起動。
・ ‥‥PostgreSQLへのaccessがうまくいかないんですが。ていうか、どうして今 までちゃんと動いてたんだ‥‥。Dataを移行しようにも、「version違い」と いわれてpg_dumpallが動かない。むぅ。今すぐには困らない‥‥というか、今 すぐにはどうしようもないので、とりあえずこれはpending。
・ mod_proxy_add_forwardをApache2に移植。配布元にあるdocument に結構間違いがあって、document通りにするとうまく動作しない。仕方がない ので、mod_aliasのsourceを参考にしつつ、でっち上げる。組み込んで動かし てみると、‥‥動いているには動いてるけど、なんか同じ値が2つ表示される なぁ。
・ よくよく調べてみると、mod_proxy_add_forward相当の機能が Apache2では標準で組み込まれていた*2。げーん。‥‥まあ、勉強になったということで‥‥。
・ とりあえずこれでPostgreSQL関連以外は全て移行が‥‥完了したと思ったら、 Apache 1.3のときはうまく動作していたpageの表示言語の自動切り換えがうま く動いていない。とりあえずOptionにMultiViewsを指定しないと index.html.ほげほげを見てもくれないのはまあいいとして*3、日本 語のpageを表示してくれない。ちゃんとproxy越しに HTTP_ACCEPT_LANGUAGEは渡ってきてるんだけどなぁ。
・ ‥‥調べてみたら、LanguagePriority directiveでenが最 優先になっているという罠。ぐぅ。
・ それにしても、MultiViewsを指定しておかないと言語による表示切 り換え機能が動作しないのはなぜ‥‥。
・ その後、ErrorDocumentがらみで格闘しているうちに、標準で含まれ ているerror表示用fileの中身を見て謎が解けた。そーゆーことですか‥‥。
*1: Portからcompileする場合、「mbstring」にcheckを入れる。 「mbregex」はお好みで。
*2: modules/proxy/proxy_http.cを参照。
*3: ほんとはよくない。なんのためにDirectoryIndexに index.html.varを含めてるんだか。
・ 移行作業の続き。せっかくなので、SSL に対応させてみる。
・ 証明書の生成にあたっては、CA の有無によって若干手順に違いがある。で、 どちらもやってみたのだが、「CA あり」の場合、apache2 の起動時に pass phrase の入力が必須になる模様。以前の ume さんの記事に「sendmail で使 用する場合に pass phrase を不要にする方法」が書いてあったのだが、同様 にすると、apache2 の起動時に core を吐いてしまう。Pass phrase なしの場 合はそのまま署名もなし(つまり CA なし)で使うしかないらしい。
・ とりあえず、設定完了。少なくとも browser 上ではちゃんと暗号化されてい るように見えている。
・ ところが、ここで問題が。Firewall 上の Apache は mod_rewrite を使って内 部 server への proxy として動作しているのだが、HTTPS で接続した場合、 その機能がうまく動作しない。いろいろいじっているうちに、VirtualHost の 指定の仕方を変えてやれば、HTTPS でもちゃんと proxy されるようになるこ とがわかった。もちろん、HTTP の場合と HTTPS の場合とで proxy の接続先 を変えることも可能。ただし、SSL 経由の場合、各 virtual domain に access した場合でも、証明書は本物の(= virtual でない)host のものが 使われることに注意*1。
*1: 証明書が使われるのは connection が確立するときで、Apache が VirtualHost の内容を参照するのは、既に接続が確立したあとだから。これが 「Name-based virtual host と SSL は共存できない」と言われる所以。ただ、 証明書が共通になってしまうということに目をつぶれば、ちゃんと SSL 越し でも viatual domain の運用はできる。
・ PHP4 を入れたのを契機に、LDAP と連携して data を管理する仕組みをつくっ てみた。SSL も使えるようになったことだし。
・ 先日来、勉強をかねていじっていたので、基本的な tree は既にでき上がって いる。そこで、その末端に data を追加したり、ある data を修正・削除した りという機能を目指す。
・ じつは、この data は sendmail で LDAP routing を行なうためのもの。現在 virtusertable で管理している仮想 domain の mail address の管理を LDAP で行ない、web 上からその data をいじれるようにするのが目的。
・ Mail address そのものの管理には inetLocalMailRecipient objectClass を 使用するが、その情報の一部を user 自身に変更させる場合、やはり認証機構 が欲しい。これは uid と userPassword の両方が含まれている schema を併 用することで実現できるが、標準的に用意されている schema ではそれ以外の 項目がいくつも含まれているものばかりで、ちょっと大げさ。そこで、最小限 の項目のみを含んだ objectClass を定義する schema を書き、追加。
・ 実験を繰り返しつつ、ひたすらごりごりと PHP4 script を書く。何となくそ れっぽくなってくる。「同じ code を使っているにも関わらず、呼び出すたび に挙動が異なる」という問題も出たが、びみょーに変数名がぶつかっているの を発見。まあ、bug なんて、見つかってみれば、こんなもの。
・ 登録された情報に対する password 認証の実験で、気になる問題が。要するに、 bind する際にその entry の userPassword との照合が行なわれるわけだが、 bind の引数に password が与えられなかった(もしくは password が空値だっ た)場合、userPassword が存在しているか否かに関わらず、必ず anonymous bind になってしまうようだ。userPassword が存在せず*1、かつ bind password が空値だった場合、その user として認証されて欲しかったのだが、 そうはならない。Security に配慮して、userPassword に関しては anonymous bind 時は認証にしか使用できないよう設定してある*2ので、password が設定 されていない情報は「本人が追加する」という手段そのものがなくなってしま う。これは、「empty password は認めない」ということで回避。
・ 管理者権限でいじくる page と、User 自身で情報を書き換えるための page を作成。それっぽく動いている。
・ 念のために、登録した情報に、sendmail が検索するのと同じ(と予想される) 形式で検索をかけてみる。ちゃんと検索できている。よしよし。
*1: 「空値が記録された entry」は存在できない。
*2: 読み書きともに不可。
・ 外堀が埋まってきたので、LDAP を support した sendmail の用意。
・ Ports にある mail/sendmail-ldap を compile。ところが、
conf.o: In function `validate_connection': conf.o(.text+0x1f42): undefined reference to `hosts_ctl' /usr/local/lib/libsasl.so: undefined reference to `krb_get_in_tkt' /usr/local/lib/libsasl.so: undefined reference to `krb_rd_req' /usr/local/lib/libsasl.so: undefined reference to `krb_get_phost' /usr/local/lib/libsasl.so: undefined reference to `krb_get_lrealm' /usr/local/lib/libsasl.so: undefined reference to `krb_mk_req' /usr/local/lib/libsasl.so: undefined reference to `krb_err_txt' /usr/local/lib/libsasl.so: undefined reference to `dest_tkt' /usr/local/lib/libsasl.so: undefined reference to `krb_set_tkt_string' /usr/local/lib/libsasl.so: undefined reference to `tkt_string'
といわれて、link が失敗する。
・ mail/sendmail を単体で compile すると、当然成功する。で、 mail/sendmail-ldap の Makefile を見てみると、LDAP のみならず、 全機能が有効にされている。そこで、SASL をはじめ、TLS と LDAP 以外の SENDMAIL_WITH_ほげほげ を comment out。それでも
conf.o: In function `validate_connection': conf.o(.text+0x1f42): undefined reference to `hosts_ctl'
が依然として残る。さらに SENDMAIL_WITH_TLS=yes も comment out してみるが、結局状況は変わらない。むぅ‥‥。
・ Sendmail の source を grep してみても、確かに hosts_ctl() な んてものは定義されていない。ぐぅ‥‥。
・ とりあえず、保留。
・ まえかわさんから、「header の Content-Type に『charset=iso-8859-1』が含まれているので、文字化けする」というご指摘 をいただいた。ありがとうございます m(__)m。
・ Apache を Ver.2 に上げて以来発生した現象で、気にはなっていたのだが、自 分の環境だけで起きているのではないということがわかったので(爆)、早速 調べる。
・ 結局、http.conf の設定に含まれている
AddDefaultCharset ISO-8859-1
がいけないということがわかる。何たる大きなお世話様*1。早速
AddDefaultCharset ISO-2022-JP
に書き換える*2。
・ すると、今までは「最初に page を見ると文字化けし、reload をかけるとちゃ んと表示される」という挙動を示していたのが、最初から文字化けせずに表示 されるようになった。で、何で今まであまり気にせず放置してあったのかとい うと、人様の site でも同じような現象が出るところが結構あったからなんだ な、これが*3。だから、「自分が使っている環境/browser のせいでは」と思っ ていたのだ。で、ざっと調べてみると、結構いろいろなところではまっている 人が多い現象であることがわかる。然も有りなん。
・ この件で、Netscape Navigator 4.77 は、reload 時とそうでないときとで挙 動が異なることを知る。そーですか、reload 時は header(の一部?)を無視 するのか‥‥。
*1: いや、document を隅から隅までよーく読んでいなかったのが悪いといえば、 それまでなんだけど‥‥。
*2: .htaccess で「AddType text/html; charset=ISO-2022-JP .html .shtml」などとして override してもよいらしい。が、どうせ自 分しか使っていない server だし、そもそも latin-1 な document が置かれ ることはまずないので、server そのものの設定を変更した。もし多言語の file を置く可能性があるなら、とりあえず httpd.conf からは AddDefaultCharset の設定を削ってしまったほうがいいかも。
*3: 商用 site を含む。ぐーぐるさまとか。
・ 私が買った s30 には fxp が内蔵されている*4。で、「これが PC Card と同じような感覚で使えたらなぁ」とか思っていたわけだ。
・ そう思うようになったのは、ずいぶん前。以前に買った TOSHIBA Satellite 2550S には dc が搭載されていて、それを使っている頃から。
・ 具体的には何が問題になるかというと、
という感じ。PC Card な NIC を抜き差しする場合、「挿す」「抜く」という event に対応した振舞いを指定できるし、抜いちゃった場合はそもそも interface 自体が存在しなくなるので、面倒もない。
・ で、思ったことは、「PC Card の抜き差しと同じように、内蔵 NIC も cable の抜き差しを検出して、一定の処理を実行させることができれば、便利なんじゃ ないか」ということ。結局、Satellite 2550S の場合、「suspend から復帰し たあとに内蔵 NIC を触りにいくと必ず kernel が固まる*6」という問題もあっ て、PC Card な 10M NIC を抜き差しして運用していた。その後、重さが我慢 できなくなって machine を持ち運ぶこと自体をしなくなり、この問題はうや むやになっていたのだが、「運搬が割と苦にならず、かつ内蔵 NIC に suspend 後に触っても固まらない」s30を購入することによって、欲求が再燃 したというわけ。
・ 一番簡単な方法は、「shell script などで一定間隔毎に ifconfig(8) を実行し、その `status:' 出力を見て、 active かそうでないかでそれぞれ何らかの処理を呼び出す」という もの。しかし、いくらなんでも周期的に子 process を起動するのはなんだか 美しくない。cost も大きそうだし。というわけで、まずは手始めに「link が up しているかどうかを調べる」だけの program を作ってみた。
・ 「作る」といっても、ifconfig(8) の source から必要な部分を抜 き出すだけ。‥‥できた。すくなくとも、4.2-RELEASE 〜 4.4-RELEASE、 5.0-RELEASE-DP1 ではちゃんと動いてるらしい。
・ これに、任意の外部 program を呼び出す action を指定できれば、とりあえ ずは終わり。Parser 書くかね(← というほど大げさなものじゃないけど)。 どうせなら pccard.conf に似た書式がいいよな。
・ そうそう、up/down 時に呼び出す program には /etc/pccaed_ether をそのま ま流用すればシアワセになれるかな、と思ったのだが、そうは問屋が卸さなかっ た。DHCP を利用する場合、pccard_ether stop を実行すると、単に DHCP client を殺して ARP table を clear するだけで終わってしまう。 removable_route_flush="YES" と設定しておけば route -n flush -inet を実行してくれるが、「もし同時に無線 LAN card などを挿していた場合、経路情報を flush してしまっていいのか」といっ た問題があるし、そもそも IPv6 については何もしてくれない(Address も routing 情報もそのまま)。これは良くない。
・ DHCP client を殺したあと、ifconfig <if> delete と ifconfig <if> inet6 <IPv6 address> delete を実行し*7、 さらにその if に associate された IPv4 及び IPv6 uni-cast address への routing 情報と、IPv6 の default 経路を消せば、完璧。だが、これを一括し てやってくれる command は存在しないので、netstat -rn の出力を加工して route delete するような script を書くか、 netstat の source を参考にそういう program を書かなきゃダメ。
*4: 意図的に無線 LAN model は避けた。IEEE1394 port も叩いてみたかったし。
*5: 厳密にはちょっと違う。
*6: CCS さんによると、「driver が、power down によって内蔵 NIC の status register の内容が壊れることを想定していないのではないか」。つまり、 「status register を読みに行って、もしその値が不正だったら、初期化をや り直す」か、もしくは「APM event に対応して、resume 時には device を初 期化し直す」というような処理を行なっていないのだろう、ということ。かつ て removable でない NIC が desktop でしか使われていなかった頃は OS の 運用中に NIC の電源が落ちるということはなかったからいいのだが、それが note PC に搭載されるようになったことで状況が変化したにも関わらず、 driver の処理がそれに追従できていないということだろう。
*7: この時点で、if が属するそれぞれの network への経路も同時に消える。 が、それまでに通信した peer への経路情報と、IPv4 の「自 address → localhost」の経路は残ったまま。
・ 「Cable が抜かれたあと、link が up する前の状態に各種情報を戻す」とい う前提で追試験をしてみた*1。以下、「残存する」と言う場合、「link up 後に追加された経路が消えずに残っている」ことを指す。
・ まず、link が up した時に行なうべき処理。NIC に対して完全に動的に address を振る場合、
# dhclient fxp0 # rtsol fxp0
で OK。不安であれば、ndp -H を実行しておくといいかもしれない が、何度か実験した限りでは(ndp -H を実行しなくても)ND もちゃ んと行なわれている模様。
・ 次に link が down した場合の処理。まず、dhclient を kill する。 その後、
# ifconfig fxp0 delete
とすると、NIC に付いた IPv4 address と、それに関連する(fxp0 に associate された)経路情報が消える。この時点で、IPv4 については「自 IP → localhost」の経路のみが残存する。この経路は
# route -n flush -inet6
で消せるが、同時に PC Card に他の NIC が刺さっている場合も考慮すると、 手抜きをせずに
# route delete <my IPv4 address> localhost
とした方が良さそう。
・ さらに、
# ifconfig fxp0 inet6 <my IPv6 global address> delete
とすると、NIC に付いた IPv6 global address と、それに関連する(fxp0 に associate された)経路情報が消える。この時点で、IPv6 については 「default → <default gateway>」と「<default gateway> → <default gateway の MAC address>」の経路のみが残存する。なお、 IPv6 では(interface が global address を持つ場合)ひとつの interface に必ず複数の address が割り当てられる*2ため、ifconfig fxp0 inet6 delete というように IPv6 address を省略出来ない点に注意。
・ IPv6 の場合、単純に
# route -n flush -inet6
としてしまうと、必要な経路も一緒に消えてしまって、以後の通信が正しく行 なえなくなる場合がある。なので、余分な経路はひとつづつ消すしかない。と いっても、実際には
# route delete -inet6 default # ndp -c
だけで済むから、大したことはない。
・ 必要な処理も見えてきたし、code を書こうかな。${device} と同様 に、自 IP address(IPv4 と IPv6 の両方)を子 process に渡せれば、十分 だよね。${myaddr4} とか ${myaddr6} てな感じで(設定 file に)書ければいいかな。
・ もっとも、以上の処理は DHCP の利用を前提にしたものなので、そうでない場 合の /etc/pccard_ether の挙動については、未確認。とりあえず、 DHCP base で動くようになったら、検証するかな。
*1: 昨日の日記の記述には若干誤りがあることが判明。
*2: 最低でも、link local address を必ず持つ。つまり、global address を割り 当てられている場合は、必ず複数の address を持つことになる。
*3: DHCP を利用するように設定されている場合、/etc/pccard_ether fxp0 {start|stop} は単に dhclient を起動したり kill したりするだけ。
・ 今回は某 M 氏の肉欲で開催された部会。太昌園でやるのは久しぶり。最終的 に 11 人に。飲むは喰うは。
・ さんざっぱら飲み食いしたが、溜っていた point を最大限(2,500 円)使っ たとはいえ、全員で 8 万円。やっぱり(質に比較して)安いよねぇ。
・ 会計の段になって、「次回以降ご利用下さい」と差し出された割引券を見て、 手持ちの割引券を使うのをすっかり忘れていたのを思い出すという罠。がーん T_T。
・ 帰ってきてから、member に「user ppp で IPv6 通ってる?」と訊くのを忘れ ていたことに気付く。げーん*3。
*4: tcpdump で追いかけたりはまだしてないんだが、どーも 5.0-DP1 の ppp で dialup すると、その上を gif(4) の tunnel が抜けてない ような気がする‥‥。
・ 腹もいっぱいになったので、またぞろ続きを。こんどは、指定した interface に割り当てられている IP address を取得する code を追加。といっても、こ れまた ifconfig(8) の source からの抽出なんだけど。
・ もぞもぞ code を整理した結果、無事に address を得られるようになった。 あとは、これを子 process に渡せるようにすればいい。
・ 肉を喰いに行く途中につらつら考えていたのだが、IPv6 の経路を消す場合、
# route delete -inet6 default
はいいとして*4、
# ndp -c
は、ほかの IPv6 interface が存在している場合のことを考えると、あまりよ ろしくない。当該 I/F を経由する link local address に対して
# route delete -inet6 <peer の link localq address>%fxp0 -link
として消すのが望ましい。Default 経路を無条件で消してしまわないようにす るためにも、「当該 I/F を経由する IPv6 経路情報を取得する」という機能 を追加したほうがいいなぁ。
・ ついでといっては何だが、/etc/pccard_ether の最新版を CVSweb で見てみた。「start」時は、/etc/rc.network6 を読み込んだあと network6_interface_setup ${interface} しているので、IPv6 関連 の初期化は行なわれる。ただ、「stop」時は、IPv6 に関しては何もしてい ない*5。
*5: 本当は良くないかもしれない。経路を取得して、default 経路がしていされた I/F を経由するようになっていた場合のみ削除するのが best なのは、間違い ない。
*6: IPv4 については、DHCP を利用しているかどうかに関わらず、ifconfig ${interface} delete してくれている。
・ また、誰かさんが暴れている。以前にも「明らかに誤っている内容を確認もせ ずに投稿しまくって、それをけなされると今度は第三者を装って擁護・攻撃す る投稿をする」という行動をとっていた人だ。ここしばらく静かだと思ったら‥‥。
・ で、今回も「どーも本人が別人を装って(指摘した人を)攻撃してるとしか思 えないよなぁ」と思っていたら、それを暗に指摘する mail が。指摘する側の 投稿も、これまでの芸風は正直どうかと思っていたのだが、今回は文面を真面 目かつ丁寧にすることによってかえって辛辣さが強調されており、思わずニヤリ。
メールはこちらへ...[五反田 秋彦 as (五)/ Akihiko GOTANDA (a-gota_AT_agt.ne.jp)]
この日記は、GNSを使用して作成されています。作製者の GORRY さんに感謝 m(__)m。