どさにっきLTE 〜2013年12月中旬〜

by やまや
<< = >>

2013年12月11日(水)

どんなメールにも指定したヘッダを追加したい。

_ postfix の場合、なんかのテーブルを lookup するところで PREPEND なアクションが実行されればよい。が、

-- main.cf
smtpd_helo_restrictions = regexp:add_header
-- add_header
/./	PREPEND X-Hoge: hogefuga
こんな感じでいいかというと、残念ながらこれは要件を満たさない。なぜなら、smtpd_ なパラメータで設定してるとおり、SMTP で送られたメールにしか効かないから。sendmail コマンドで送られたり、内部で生成されたバウンスには適用されない。バウンスについては bounce.cf に直接書いておくという手もあるけど、sendmail コマンドは打つ手なし。

_ header_checks なら内部からのメールにも適用される。

-- main.cf
header_checks = regexp:add_header
-- add_header
/./	PREPEND X-Hoge: hogefuga
が、こいつは、ヘッダの各行に対してマッチしてるかどうかの判定がおこなわれるので、1通のメールで複数回マッチしてしまうとその数だけヘッダが追加されてしまう。とりあえず要件は満たすけど、でもみっともない。ひとつあればいいのに。どんなメールにもかならず1個だけある、なんて便利なヘッダがあればいんだけど、そんなありがたいものはない。always_add_missing_headers = yes にすると、date やら message-id やらが欠けたメールは自動的に補ってくれるようになるので、こういうヘッダがはじめから複数ついてるなんていうおかしなメールでもなければうまくいきそうだが、ついでに from/to も欠けてたら勝手に追加されてしまうので、DKIM と相性がよくない。今どきの環境なら return-path かならずひとつ存在してることが多いけど、これはローカル配送エージェントが追加するヘッダなので、header_checks の段階ではまだ存在せず使えない。

_ どうすればいいのか。content_filter とか milter とかのかなり大げさな仕掛けを用意してやるしかなさげな気が。

_ …smtp からは smtpd_XXX_restrictions で追加、バウンスは bounce.cf でやる。んで、sendmail コマンドからメールにヘッダを追加するのは sendmail をラッパースクリプトに置き替える、とあちこち分業するのが手っ取り早い気がしてきた。

#!/bin/sh
{ 
    echo X-Hoge: hogefuga
    cat
} | /path/to/original/sendmail "$@"
sendmail を↑みたいなスクリプトに置き替えればいけそうな。実際にはこれだけじゃなくて -bd やら -bp やら -I やらの引数があったらよけいなことをしないようにする必要があるけど。


2013年12月20日(金)

VirtualPC on Windows7(x64)

_ 仕事で使ってる PC が新しくなった。Win7 だぜ。Windows は OS としての機能はともかく、UI はバージョンが上がるごとに退化してるとしか思えん。で、64bit なんだが、これまで使ってた coLinux が動かないんだな。しまった。ちうことで、windows に標準でついてくる virtualpc を使って仮想マシンを入れてみる。NetBSD な。

_ …すげー遅いんですが何これ。pkgsrc から screen をコンパイルしたら2時間かかったんですけど。

_ ちとテスト。

$ cat hello.c
#include <stdio.h>
main(){
    printf("Hello, world!\n");
}
$ time make hello
cc -O2   -o hello hello.c
        9.55 real         1.22 user         0.67 sys
$ time ./hello
Hello, world!
        0.02 real         0.00 user         0.01 sys
時計の進み方もおかしいので、表示されてる時間ははっきりいってアテにならんのだが、それを考慮してもこの仮想環境内ではただの hello world のコンパイルに10秒かかってるということで、ひじょーにおかしい。80386 (387 なし)の時代でもこんなに時間はかからなかったぞ。

_ /dev/zero から /dev/null に 1GB コピー。

> dd if=/dev/zero of=/dev/null bs=1024 count=1048576
1048576+0 records in
1048576+0 records out
1073741824 bytes transferred in 35.985 secs (29838594 bytes/sec)
同じことを仮想環境ではない FreeBSD 上で。
1073741824 bytes transferred in 0.991928 secs (1082479750 bytes/sec)
仮想ディスクイメージの読み書きが遅くて i/o で待たされてるんじゃないかと考えたんだけど、ディスクアクセスが発生しなくてもやっぱり遅かった。

_ 単純な計算。

netbsd$ echo 2^100000 | time bc >/dev/null
        0.54 real         0.54 user         0.00 sys
freebsd$ echo 2^100000 | time bc >/dev/null
        1.27 real         1.25 user         0.01 sys
時計がおかしいので目安にしかならないけど、少なくとも遅くはない。なんで他の仕事は遅いんだかわからん。うーん、この差はなんなんだろう。特定のシステムコールが呼ばれると詰まるとかそんな感じなのかなぁ?

_ 時計がおかしいのもなんでなんだろうなぁ。実世界の倍以上のスピードで進んでいく。母艦の時計と同期してるんじゃないの? ためしに母艦との時刻同期を切った上で ntpd を起動して合わせてみたけど、ntpd が補正できる限度をはるかに越えてるようでまったく効果なし。

_ ちなみに、netbsd がダメなわけではない。centos だと grub 画面は出るがその後インストーラが起動しない。debian だとインストールは成功するが、その後起動しない。起動するだけ netbsd の方がずっとマシ。ぐぐると linux では noreplace-paravirt というオプションつきで起動すればいい、という情報があちこちに書いてあるんでそのとおりにしてるんだけど、それでもうちでは動かない。ふだんの環境は netbsd で別に困らないんだけど、前使ってた colinux のディスクイメージをマウントして中身を取り出したいんで、linux も動いてくれなきゃ困るんだけど…。

_ つーか、ぐぐってみても同じ症状の人が見つからんのだが。

_ win7 の virtualpc というのは XP モードのために存在するのであって、それ以外の OS がまともに動くことを期待しちゃいかんというのはわかってはいるんだけど、うーん。つーことで、VirtulBox に乗り換えました。こっちは快調。

1178/tcp

_ そんなわけで VirtualBox に乗り換えて環境整備続行、SKK 使いなので、この netbsd 上にも skk の辞書サーバをつっこんだわけですが。 変換候補を外部サーバから取得するのは危険とか言われとりますが何を今さらでございますわよ。

_ 動かない。

Dec 20 11:21:09 netbsd inetd[914]: skkserv/tcp: unknown service
…え?
> fgrep 1178 /etc/services
sgi-storman     1178/tcp   # SGI Storage Manager
sgi-storman     1178/udp   # SGI Storage Manager
誰だおまえ。

_ 調べてみたら OSX も 1178/tcp が skkserv になってなかった。FreeBSD や CentOS、Debian などは skkserv になってる。まあ、IANA に正規に登録されたものではないのでしかたないかなという気はするんだけどね。

_ ちなみに、正規に登録されてないけどふつーに使われてるものとしてほかに有名なものに 465/tcp の smtps があるけど、こちらは NetBSD でも smtps として登録されていた。OSX の 465/tcp は urd というサービスになっている。


<< = >>
やまや