今まで、tomocha.net は IPv6に対応しているといっていましたが、今回から正式にIPv6をサポートいたしましました。
これまでは、リバースプロキシを使用し、既存のサーバに転送していました。
既存のサーバはWindows 2000 Server + Apache + Active Perl を使用し、動作していました。
その際に、文字コードは、Shift_JIS だったり、EUC-JPだったり混在、そして、最も厄介なのは、改行コードが CR+LFとなっていたことです。今までは動いていましたが、新しく引っ越しすると動かない、nkf -Lu としても、正しく文字コードが認識出来ずに文字化けすると言ったことがあり、一個一個確認作業が必要です。ちなみにCGIの数が240個ほどありました…えーえーえーえ!!
このサイトは97年頃から運用され、NT4.0→Win2000と引き継がれ、昔はJPerlとかつわれていたり…あとは、sendmail.cgi とか?なので、サイトの引っ越しというか、移転作業が非常に大変でしたが、この際一気に作業してしまいました。
幸いにも、HNSはIPv6でも、無事にアクセス及びアクセス解析、ログ出力が出来ているようで、問題は有りませんでした(一番大変かな…とおもっていた内の一つです。)
非常に面倒だったのは、既存の設置されている掲示板や、アクセス解析のたぐいでしたが、2日ほど掛けて、全部新サーバへひととおり引っ越しが完了しDNSを向け直しました。尚、今回は、サーバが3台構成となります。(内DB鯖1台)正しくは、4台ですが…。(コンテンツ更新用のsambaがいる)
ということで、無事に新しいサーバに移転が出来ました。
色々と協力してくださった方々ありがとうございます。
★ 改行コードの変換:
nkf --overwrite -Lu を挑戦
使ってみたところ、正しく入力文字コードが認識出来ないため、壊れてしまいます。また、元々Shift_JISで作成されているCGIは、EUC-JPに変換したところで、プログラムの出力文字コードをShift_JISになっているといったところで、結局は文字化けしてしまいます。掲示板とかのログファイルも同様ですね。この辺は追々、プログラムを改修し手で直すとします。
tr -d \\r を挑戦
これは、成功しました。
ですが、
tr -d \\r < index.cgi > index2.cgi.newのようにしたうえ、元のファイルにmvしないといけないと言うことがあり、結局は動作確認のためだけに使用しました。
まあ、こんな感じでいけるんでしょうけど。
for file in `find . -name *.cgi` do tr -d '\r' < $file > $file.new done
dos2unix を使う
恐らく一番メジャーで無難な方法でしょうが、入っていませんでした。なので、今回スルーしましたが、そのままファイルを置換してくれるらしいので、
find . -name *.cgi -exec dos2unix {} \;
みたいな方法で一発で出来るかも知れません。文字コードは変わらないのですね、後でLinuxで確認してみて知りました。
ただ、バックアップファイルがナイのかぁ…。とおもい、manをみてみたら、 -b オプションをつければいけるらしいです。
Debianでは、tofrodos を入れる必要がありますが、今回はFreeBSD上で試していたので…。有りませんでした。恐らく何かをいれれば入るのでしょうが…。
とおもい、ぐぐれば出てきました。dosunixというのをいれたら行けるそうですね。ports にありました → /usr/ports/converters/dosunix
逆のunix2dosというのもあるそうで…。
こっちらのほうが、似ているようでしたが…。よく分かりません(笑)
perl を使う
perl でおこなえばいいじゃん、といわれて教えていただいたので、試してみました。
結局最終的にはこの案を採用で。
perl -i.bak -npe 'tr/\r//d' *.cgi
問題が出ないのを確認して、一括変換しました。
find . -name '*.cgi' -type -f -exec perl -i.bak -npe 'tr/\r//d' {} \;
★ IPv6への対応:
アクセス解析のプログラムや掲示板の大半は、gethostbyaddr で取っているようで、逆引きを試みると、unknown.Level3.net になってしまいます。
$host = gethostbyaddr(pack("C4", split(/\./, $addr)), 2)
ちょうど、
perlで、ホスト名からIPアドレスを引くには?をみて、C*にし、16進数値のリストにさせて終わりです。
このままじゃIPv6での逆引きは出来ませんが、そもそも、IPv6で逆引きをしている人は私みたいな人たちだけなので、まあいいでしょう。
まぁ、今回は頑張るつもりもないので、予備知識として…
IRCでは、#2 CGI用のPerlスクリプトでのIPv6のアドレスの取り扱い
> inet_pton 使うべきだと思う。 > use Socket; use Socket6; して、my $remote = gethostbyaddr(inet_pton(AF_INET6, $ipaddr), AF_INET6);
という会話がありましたが(^_^;
★ 掲示板等の文字コード変換:
この辺は割愛。ソースを一部葬りました。Jcodeを使っているので、下記の分及び、HTMLのMETA部分の charset をEUC-JP へ置きかえて、ログファイルなどをEUC-JPで保存し直して終わりです。このときについでに改行コードも修正しました。面倒だったのでこの辺は秀丸で。。
&jcode'convert(*val, "sjis", "", "z"); ↓ &jcode'convert(*val, "euc", "", "z");
★ ともちゃ日記のデザイン:
一部修正しました。
テンプレートとか、掲示板の方がデフォルトのママなので、修正。
この辺はデザインファイルとわかれておらず、CGI直接べた書きされている物なので、直接CGIを修正し、見やすくデザインを取り込みました。
これで、ともちゃ日記の掲示板(ツッコミ)機能が利用しやすくなるかと思います。
★ apacheの設定ファイル:
コレについては色々とやっているので、後日執筆します。