最新

おおいわのこめんと (2010-08)


2010-08-22

[Work] Mutual ドラフト書き書き

早いもので、もう前回の更新から半年経ってしまったのでドラフト更新を取りまとめ中。 前回のコメントを元にAA(固定幅フォント)を書いたり、解説を大幅に加筆したり……。

……いい加減 XML を直接編集するのはなんとかしたいなぁ……。

[Comp] 停電顛末

今月の頭に職場のビルの設備点検で停電があったのですが、復帰させてみたら……。

マシン3台が派手に fsck の餌食になり、1台死亡、1台重傷、1台軽傷 とか、やってられないんですけど……。 復帰に結局半日かかりました。 まぁこの3台が全部実験系マシンで、 重要なサーバ群はすべて無事だったのと、死亡したマシンは全く重要なデータが なかったのが幸いでしたね。でも、重傷の1台はディスク不調が激しいマシンなので しょうがないにしても、残り2台はなんか ext3 のコード辺りにバグが潜んでいそうで、 すごい嫌な感じ……。

死亡した1台は、qemu の ARM で Fail-Safe C のパッケージビルドテストに使っていた どうでもいい仮想マシンだったので、サクッと消して1から再構築したのですが、 qemu の中の Linux が Disk IO error を通知して(ホストでは何もエラーがでない) fsck が完了しないという、非常に謎な状態でした。なんだったんだろう。

重傷の1台も残っていた etch マシンだったので、この期に退役させてしまいました。 ああ、そのうちまた代わりの実験マシンを構築しないと……。

[Comp] レガシープロトコル実装

僕の回りの環境には、未だにいろいろとレガシーなプロトコルの実装が走っています。 まぁ目立つところでは UUCP と SOCKS ですね。UUCP は自宅で、なぜか「UUCP over SecSH」という 新しいんだか古いんだかさっぱりわからない設定で一応未だに動いています。

SOCKS はプライベードアドレスのマシンの ssh サーバにつなぐのに重要なのですが、 どうもいい実装が見つからないんですね。一応 Debian のパッケージを一通りみて 良さげなものを入れているのですが、どうも(x86 で)安定しない。 時々謎のフリーズをするので、コードにバグがあるのか、今の新しいKernelの仕様に どこか追従できていないのか、どちらにしても嫌な感じです。 古いCのコードで、一応 Debian で監視対象になっているとはいえ メンテされているかも怪しいソースなので、隠れているバッファ溢れとかあると致命的だし、 いずれ何とかしたいとは思っていました。

で、バッファ溢れに関しては Fail-Safe C でコンパイルしろという声があちこちから聞こえてきそうですが、 メモリ以外の部分でも実装誤りの懸念もあるのと、ちょっと謎事情で予行演習しておきたかったこともあるので、 サクッと OCaml で実装し直してみました。デバッグ楽だし、万が一バグっててもメモリ安全なのは安心です。 これくらいだったら Perl でも書けますが、ARM とか組み込み環境だと Perl でも結構遅いんで、 OpenMicroServer に導入することを考えるとせめてコンパイラのある言語、ということと、 設定ファイルのパーサとか書き始めると面倒なので回避。

SOCKS は SOCKS 4 は RFC になっていなくて、SOCKS 5 は RFC 1928 になっています。FTP を使うために逆向きの接続を張る機能とか UDP 対応とかもあったりしますし、 SOCKS 5 は認証とか暗号とか絡むとややこしいですが、今時の HTTP や SSH を通すだけだったら そんなものはいらない(上位層で認証すればいいし、順方向 TCP だけで十分)ので、 基本的な部分だけだったらそんなにややこしくはありません。 いまさら平文のパスワード認証とか実装したくないし、頑張ってややこしいの実装 (場合によっては仕様提案含む) しても対応クライアントないし……。

接続したあとの通信転送の部分について TCP が絡むと half-close とかいろいろややこしい事情もあったりするのですが、 まぁ以前に似たようなツールのC実装をみたこともあるので、思い出しつつ実験しながら作っていって、 一応 Debian の connect-proxy と ちゃんと喋れる実装ができました。 一応設定ファイルとやらも作って、接続可能なホストとかクライアントとかポートとかは指定できるようにしてみました。 そうじゃないと open proxy 作っちゃいますからねぇ。

で、大体書けたかなー、と思ったところで、次にこれを常駐デーモンにする段になって、 syslog に吐き出す関数がないことにいまさら気がつく。 もちろん Libc の syslog(3) 関数を wrapper 書いて呼べばいいんですけど、 せっかく安全な言語でここまで書いてきて、肝心なところで C でコード書かなきゃいけないのは嫌だったのと、 いかにもメッセージ長とか format 文字列とか嫌な仕様だったので、ついでに syslog プロトコルも サクッと実装。調べてみると、syslog のプロトコルは RFC 3164 で 2001年に文書化されているのですが、どうも C library の /var/log 経由のログ出力のほうは、 若干違うフォーマットを使っている様子。そちらに合わせる形で現物合わせで実装してみました。 もちろんフォーマット文字列とか、フラグの指定方法とかはそれなりに ML っぽく再デザインしてあります。 一応ログもちゃんと吐けているようなので、これで大丈夫かな。

というわけで、あとは私製 Debian パッケージにしてテスト環境に導入、といった感じですが、 公開するほどの需要ありますか?

いやー、やっぱりコード書くのは楽しいねぇ。……と書かざるを得ないくらいには忙しくてとても趣味プログラムなぞ最近はやってられんのです。なんとかしたい……。


大岩 寛 (おおいわ ゆたか) <yutaka@oiwa.jp.nospam ... remove .nospam> .

Copyright © 2005-2014 Yutaka OIWA. All rights reserved.
Posted comments and trackbacks are copyrighted by their respective posters.

記事の内容について (Disclaimer / Terms and Conditions)