〜2004年7月下旬〜
まずはrequireできるようにln -s lily.cgi lily.rbしておく。 sample/webrick/hello.rbを参考にすると、 res.bodyに入れとけってことなので、
require 'lily' require 'webrick' class LilyContent < Lily def webrick_body=(body) @content = body end def print(*s) @content << s.join("") unless s[0] =~ /Content-type:/ end end
としてみる。幸いなことにlilyはprintしか使ってないので、 printをここで定義した。 ちゃんとやるなら$stdout.writeを定義すべき。
続いてcgi.rbを使うのもなんだし、 lilyではCGI#path_infoとCGI#[]しか使ってないので、 そのあたりをでっちあげてみる。
class LCGI attr_reader :params def initialize(req) @req = req @params = {} req.query.each do |key, value| @params[key] = Array(value) end end def path_info @req.path_info end def [](name) @params[name] end end
以上準備できたのでdo_GETを作ってmountする。 POSTもGETと同じでいい。
class Lilylet < WEBrick::HTTPServlet::AbstractServlet def do_GET(req, res) res["content-type"] = "text/html" lily = LilyContent.new(LCGI.new(req), load_env) lily.webrick_body = res.body lily.disp end alias do_POST do_GET end httpd = WEBrick::HTTPServer.new(:DocumentRoot=>Dir.pwd, :Port=>10080) httpd.mount("/lily", Lilylet) trap(:INT) do httpd.shutdown end httpd.start
これでhttp://localhost:10080/lily/でアクセスできる。
咳さんのプレゼン資料の表紙に笑う。
昨日の続き。print以外が使えるように$stdoutを置き換えてみる。
class Stdout def initialize(body) @body = body end def write(*s) @body << s.join("") unless s[0] =~ /Content-type:/ end end
というクラスを作っておいて、do_GETの中で
$stdout = Stdout.new(res.body)
とすれば一応目的は達成できるけど、いまいち。 直接$stdout.writeを定義しようとすると、 res.bodyをどうやって渡すか悩むし。
lily.cgiのほうを手を加えないで済むうまい手をもうちょっと摸索してみよう。
さらに続き。わざわざクラスを作らなくてもres.bodyにwriteメソッドを追加しちゃうのはどうだろう?
class << res.body def write(*s) self << s.join("") unless s[0] =~ /Content-type:/ end end $stdout = res.body
それはそれとして、lily.cfgでurlを設定していないときは CGI#server_nameとCGI#script_nameが必要だった。
def server_name @req.host end def server_port @req.port end def script_name @req.script_name end
以上をまとめて lilylet.rbという名前で置いとこう。
WEBrickでservlet化したのはいいが、これだと1つしか動かせない。 lily自身はnewして複数起動できるわけだし、lily.cfgを切り替えれば対応できそうな気がする。
というわけで、こんなのを考えてみた。
def load_config(dir) config = {} open(File.join(dir, "lily.cfg")) do |f| f.grep(/^([a-z_:]+)\s+(.*)/) do key, val = $1, $2 || "" val = File.join(dir, val) if /dir$/ =~ key && /^\// !~ val config[key] = val end end config end
として、datadir, flavordir, plugindirを絶対パスに変換してしまう。あとは
lily = Lily.new(LCGI.new(req), load_config(@options[0]))
のようにload_envの代わりにload_configを使い
httpd.mount("/foo/lily", Lilylet, "/home/foo/lily") httpd.mount("/bar/lily", Lilylet, "/home/bar/lily")
と好きなだけmountしとけば
http://localhost:10080/foo/lily/で/home/foo/lilyに http://localhost:10080/bar/lily/で/home/bar/lilyに
アクセスできる。
考えてみたら$stdoutを別のものに置き換えたらthread safeにならない。 だめじゃん。ちゃんと排他制御しよう。
require 'thread' module Stdout @@mutex = Mutex.new def redirect @@mutex.synchronize do stdout = $stdout.dup $stdout = self yield $stdout = stdout end end def write(*s) self << s.join("") unless s[0] =~ /Content-type:/ end end
のようなmoduleを作って
(res.body.extend Stdout).redirect do lily.disp end
というようにextendすればよさげだ。
それはもうすごい数。いったい何が起きたんだ? とりあえず明日の朝までruby-*-ctl@ruby-lang.org宛てのメールは/dev/nullに捨てるんでよろしく。
追記: 大元で対処したので、現在ruby-*-ctlは復活してます。
-ctl宛てにvirusやらspamが来たときに、REJECT_COMMAND_HANDLERがauto_registだと非常にやっかいなことになる。 もはやconfirm mailを送り返しても迷惑なだけだろう。
今朝ignoreにしたらなぜか投稿自体が流れなくなるという自体になったらしい。 どうにも納得いかないよねえ。
MAIL_LIST ruby-talk@$DOMAINNAME PERMIT_POST_FROM members_only REJECT_POST_HANDLER reject CONTROL_ADDRESS ruby-talk-ctl@$DOMAINNAME PERMIT_COMMAND_FROM members_only REJECT_COMMAND_HANDLER ignore
じゃだめなのかな。
zipとexeのような添付はもう全部要らないってわけで、~/.procmailrcで
:0 B * ^(UEsDBAoAA[AQ]AAA|TV[qo][QA]AA[ME]AAAA[EC]AAAA) junk/.
としている。もう2,3ヶ月ぐらい経つと思うけど、この設定で全然問題ないなあ。 こんな正規表現でいいならprocmailやめられるか。
それはそれとして、Mydoom.M祭りのわりには今日は32通と思ったよりも少ない。 ruby-lang.orgにvirus scanが入ったおかげか。
Changes:
Highlights of this release include support for DNS queries over TCP and minimal support for DNSSEC and EDNS. The DHCP server now pushes configuration changes out to existing clients better. There are some minor bugfixes and a new "contrib" section, which has a utility that produces an page showing the contents of the DHCP lease pool.
Changes:
diet can now use $DIETHOME to locate the installation. Some BSD backwards compatibility cruft was added. A few bugfixes were made.
というわけでAltGr問題はinputrcで解決したようだ。
"\M-[": "[" "\M-]": "]" "\M-{": "{" "\M-}": "}" "\M-\\": "\\" "\M-|": "|" "\M-@": "@" "\M-~": "~"
Perlではこうだけど、Rubyではどう?という質問はありがちだけど、その逆はあまり見たことがない。ちょっと新鮮。
うーむ。なんか気になる。他のソフトでもありうる話なのかな。 すぐ思いつくのはdot-dot-slash攻撃だけど単純すぎか(あややじゃないよ)。
昼ぐらいからPort 135へのアクセスが急増。なんか流行り始めてる?
ruby-lang.orgにも導入されたClam AntiVirusを入れてみた。 どのくらいの実力なのか~/Mail/virusで試す。
% clamscan -m ~/Mail/virus <...> ----------- SCAN SUMMARY ----------- Known viruses: 23051 Scanned directories: 1 Scanned files: 9881 Infected files: 9872 Data scanned: 255.07 MB I/O buffer size: 131072 bytes Time: 156.649 sec (2 m 36 s)
OKになってしまったファイルを調べてみると、 zipとpifファイルが添付されたメールだった。 これらはvirusかどうかも不明だしねえ。 結構すごいね。
これで種類がわかりやすくはなったが、なんか名前が他とは違うような。 NetskyがSomeFoolだったりで。でもそういう目的なら online scannerで十分か。