*1  SSH + Google Authenticator

最近アカウント乗っ取り系の話がよく出ていてつい先日も Twitter のパスワードリセットを食らったところなのだが、そう言えば ssh は 2 Factors auth に対応しているのかなと思って (秘密鍵とパスフレーズが既に2 Factorsに近い気もするが、そこへの追加認証手段という意味で) ちょっと調べてみると PAM に Gooogle Authenticator による認証を追加する方法が普通にあるのだった。やり方はほぼ Two Factor SSH with Google Authenticator のまま。 Debian だと libpam-google-authenticator は deb があったのですごく簡単。
# aptitude install libpam-google-authenticator 
インストールしたら PAM の ssh 認証に google authenticator を追加する。設定ファイルの最初の方に下記の行を追加。
# vi /etc/pam.d/sshd
...
auth required pam_google_authenticator.so
...
sshd 側で Challenge Response の Auth を有効化する。
# vi /etc/ssh/sshd_config 
...
ChallengeResponseAuthentication yes
...
# /etc/init.d/sshd restart
Google Authenticator のキーを新規生成。コマンドが用意されているので ssh でログインするユーザ権限で実行する。secret key や scratch codes などは ~/.google_authenticator に保存されるようなので特にここでメモる必要はないが、このサーバに入るための緊急用認証情報である scratch codes はどこか別のところに記録しておいたほうがいいだろう。いくつか設定を聞かれるので答えておく。これも後から設定ファイルで変更できる。
$ google-authenticator

[ここにURLかQRコードが表示される]
Your new secret key is: XXXXXXXXXXXXXXXXXXXXXXXXXXX
Your verification code is 492939
Your emergency scratch codes are:
  67136983
  19738098
  69970608
  69623422
  35724953

Do you want me to update your "~/.google_authenticator" file (y/n) y
(設定ファイルを上書きするか)

Do you want to disallow multiple uses of the same authentication
token? This restricts you to one login about every 30s, but it increases
your chances to notice or even prevent man-in-the-middle attacks (y/n) y
(同じトークンを複数箇所から使えないようにするか)

By default, tokens are good for 30 seconds and in order to compensate for
possible time-skew between the client and the server, we allow an extra
token before and after the current time. If you experience problems with poor
time synchronization, you can increase the window from its default
size of 1:30min to about 4min. Do you want to do so (y/n) n
(時計が同期してない環境のために、同期のズレの許容幅を標準の1:30から4:00にするか)

If the computer that you are logging into isn't hardened against brute-force
login attempts, you can enable rate-limiting for the authentication module.
By default, this limits attackers to no more than 3 login attempts every 30s.
Do you want to enable rate-limiting (y/n) y
(総当たり攻撃を防ぐため30秒位内の試行回数を3回までに制限するか)
元記事だと Google の URL が表示されていたが、手元の環境では terminal 内に QR コードが表示されたので、Android の Google Authenticator アプリから Menu → Setup Account → Scan a barcode で簡単にアカウント追加できる。もしくは同時に表示されている Secret Key を入力してもいい。

なお既に Google アカウントで 2 Factor auth を使っている場合でも、単にアプリ内に verification code が並んで表示されるので特に問題はない。表示識別名は `whoami`@hostname` 相当になるようだが当然アプリ側で変更できる。
$ ssh yoosee@example.com
Verification code: 
...
Verification code に Google Authenticator に表示される対応の数字6桁を入れると認証される。当然この他に公開鍵 (ないしパスワード) による認証が行われる。

ちなみに当然ながらこれ、scp などの認証でも毎回聞かれる上に ssh-agent なども効かないので頻繁に接続を繰り返すようなケースには向かなさそうだ。

*1  3TB SATA HDD の Debian GNU/Linux での初期設定

HDDがなかなか安くならないなとしばらく様子を伺っていたが、自宅サーバの容量が一杯になりつつあるので流石に諦めてSeagate Barracuda 7200シリーズ 3.5inch SATA 6Gb/s 3TB 7200rpm 64MB 4Kセクター ST3000DM001$149.99 で購入。値段は1ドル80円換算で日本とほとんど変わらない。下記は Debian GNU/Linux wheezy/sid での設定とディスク内容のマイグレーションを備忘録として書いたものだが、正確性は担保しないので当然ながら自己責任で参考にしてください。

まずは自宅のHP ML115に追加接続して Linux で起動。ちなみに元々の disk が sda で新しく導入した disk が sdb 。
[    1.848040] ata1: SATA link up 3.0 Gbps (SStatus 123 SControl 300)
[    1.856296] ata1.00: ATA-8: ST3000DM001-9YN166, CC4B, max UDMA/133
[    1.856301] ata1.00: 5860533168 sectors, multi 16: LBA48 NCQ (depth 31/32)
[    1.872281] ata1.00: configured for UDMA/133
...
[ 2.676866] sd 0:0:0:0: [sdb] 5860533168 512-byte logical blocks: (3.00 TB/2.72 TiB)
[ 2.676872] sd 0:0:0:0: [sdb] 4096-byte physical blocks
[ 2.676935] sd 0:0:0:0: [sdb] Write Protect is off
[ 2.676939] sd 0:0:0:0: [sdb] Mode Sense: 00 3a 00 00
[ 2.676967] sd 0:0:0:0: [sdb] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
起動時に認識はしている。BIOSなどによっては認識しないこともあるらしいのでそこは一安心。今回は2TBより大きなディスクなので fdisk/cfdisk では正しく扱えない (確か700GB程度しか認識しない状態になるはず) ため parted にて GPT を使う。まあ今時 parted だよねーという話ではある。ちなみに partition を切る必要が無ければ
 # mkfs -t ext4 /dev/sdb
とかして丸ごと使う分には 3TB でも問題なく行けるはず。さておき。下記ではまず最初に label を gpt に設定した後、1 を / partition (ext3, rootfs, bootable) 10GiB 、2 が swap で 4Gib、3 で残り全てをLVMに割り当てている。コンサバ気味に rootfs は lvm 上ではなく素の primary 上に ext3 で作っている。1 の start を 2048s にしているのは 0 だと alignment がどうのと怒られたから。なお parted は interactive なやりとり中に disk を実際にいじっているので操作間違いにはくれぐれも注意。X で使ってるなら gparted の方がいいかも。
# parted /dev/sdb
(parted) mklabel gpt
...
(parted) mkpart primary 2048s 10GiB
...
(parted) set 1 boot on
...
(parted) mkpartfs primary linux-swap 10Gib 14GiB
...
(parted) mkpart primary 14Gib -1s
...
(parted) set 3 lvm on
...
(parted) print
Model: ATA ST3000DM001-9YN1 (scsi)
Disk /dev/sdb: 3001GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt

Number Start End Size File system Name Flags
1 1049kB 4295MB 4294MB ext3 primary
2 4295MB 8590MB 4295MB primary
3 8590MB 3001GB 2992GB primary lvm
(parted) quit
そうしておいて LVM 部分を更に /usr /var /home に切り分け。この辺は趣味の世界だけど、昔からの習性で自分で Linux を入れるときはなんとなくこの構成にしていることが多い。今時だと /var はもっと大きくてもいいが、Virtual Machine なんかも /home の下に作れば済むのでこれくらいにしてる。LVM の基本的な使い方は 基本的なLVMの使い方A Beginner's Guide To LVM 等を参照のこと。
# pvcreate /dev/sdb3
# pvscan
PV /dev/sda3 VG userspace lvm2 [2.72 TiB / 0 free]
Total: 1 [2.72 TiB] / in use: 1 [2.72 TiB] / in no VG: 0 [0 ]
# vgcreate uservolume00 /dev/sdb3
# vgscan
Reading all physical volumes. This may take a while...
Found volume group "uservolume00" using metadata type lvm2
# lvcreate -L 10G -n usr
# lvcreate -L 20G -n var 
# lvcreate -l 100%FREE -n home
# lvscan
ACTIVE '/dev/uservolume00/var' [20.00 GiB] inherit
ACTIVE '/dev/uservolume00/usr' [10.00 GiB] inherit
ACTIVE '/dev/uservolume00/home' [2.69 TiB] inherit
あとは普通にファイルシステムを作る。
# mkfs -t ext4 /dev/uservolume00/home
# mount -t ext4 /dev/uservolume00/home /mnt
...

*2  rootfs その他を新しい disk に切り替え

元のファイルシステムは LVM とかじゃない素の partition なので、あまり素敵技術は使えない。もっと賢い方法があったら知りたいけど、とりあえず単純に rsync する。真面目にやる人は当然 single user mode でやりましょう。
# mkdir /target
# mount /dev/sdb1 /target
# mkdir /target/usr /target/var
# mount /dev/usrvolume00/usr /target/usr
# mount /dev/usrvolume00/var /target/var
# mount /dev/usrvolume00/home /target/home
# rsync -avD /etc /bin /sbin /boot /lib /lib32 /lib64 /usr /var /target
# rsync -avD /home /target
# rsync -avD /vmlinuz /initrd.img /target
mount で見て殆どの tmpfs, procfs, sysfs, udev, devpts, cgroup とかは勝手に面倒見てくれるはずなので directory だけ作っておく。
# mkdir /target/proc /target/sys /target/run /target/dev /target/root /target/mnt /target/tmp
新しいシステムでの /etc/fstab (/target/etc/fstab)を書き換え。 LVM じゃないやつは最初に UUID を取っておく。parted から label つけて使ってもいいけどそこはお好みで。
# blkid /dev/sdb1
/dev/sda1: UUID="......-.....-....." TYPE="ext3"
swap も確保してるので作っておく。今時の mkswap なら UUID も勝手に割り当ててくれるはず。
# mkswap /dev/sda2
/target/etc/fstab を編集。
UUID="......-.....-....." / ext3 defaults 0 1
/dev/uservolume00/usr  /usr  defaults  0  2
/dev/uservolume00/var  /var  defaults  0  2
/dev/uservolume00/home  /home  defaults  0  2

UUID="......-.....-....." none swap sw 0 0
あとは grub を入れれば終わり。そのまま入れても initrd 等がおかしくなるので新しい / に chroot して linux-image を reconfigure する作戦。あと grub-install は GPT だと文句を言ってくるので --force で無理やり入れてしまう。
# chroot /target
# dpkg-reconfigure linux-image-3.2.0-2-amd64
# grub-install /dev/sdb --force
とりあえず /boot/grub/grub.cfg の当該部分はこんな感じに。
menuentry 'Debian GNU/Linux, with Linux 3.2.0-2-amd64' --class debian --class gnu-linux --class gnu --class os {
        insmod gzio
        insmod part_gpt
        insmod ext2
        set root='(hd1,gpt1)'
        search --no-floppy --fs-uuid --set=root a61b7b93-5992-49d3-aa12-ea65ec3d3325
        echo    'Loading Linux 3.2.0-2-amd64 ...'
        linux   /boot/vmlinuz-3.2.0-2-amd64 root=UUID=a61b7b93-5992-49d3-aa12-ea65ec3d3325 ro  quiet
        echo    'Loading initial ramdisk ...'
        initrd  /boot/initrd.img-3.2.0-2-amd64
}
物理的に sda と sdb のケーブルを繋ぎかえて再起動すれば完了、のはず。UUIDやLVMで管理しているので繋ぎ変える必要はないのだけど、これも趣味の問題である。

*1  Ubuntu 11.10 から 12.04 にあげたら X が起動しなくなった問題への対処

繋がってしまえば大した事はない話なのだが結構ハマったのでメモとして。最近のインストーラや自動設定ツールはよく出来てるからこういう問題でハマることって少なくなった分、たまに出ると手間取る。

まずは Ubuntu 11.10 でSingle Monitorで動いていたものが12.04へ上げたらそもそもXが起動しなくなったところから。エラーでは /usr/sbin/lightdm が異常終了しているとなっており、/var/log/Xorg.0.log や /var/log/Xorg.failsafe.log などを眺めるに nvidia driver が無いとか騒いでいる。とりあえず後から入れた proprietary のドライバを削除。
sudo apt-get purge nvidia\*
sudo dpkg-reconfigure -phigh xserver-xorg
これで低解像度だが起動だけはするようになった。/etc/apt/sources.list.d/ からnvidia 関係のものを削除し、Ubunsu の nvidia driver を入れてみる。
sudo apt-get update
sudo apt-get install nvidia-current
sudo cp /etc/X11/xorg.conf /etc/X11/xorg.conf.backup
sudo nvidia-xconfig
この後に再起動 (ないし X を restart) して、とりあえず無事に X が上がるところまでは回復。

*2  Ubuntu 12.04 と NVIDIA Quadro NVS420でマルチディスプレイ接続

さてここからが本番。Windows7 では問題なく利用できている NVIDIA Quadro NVS420 と Dell Monitor 2台を繋いだ環境を、Ubuntu 12.04 でも使えるように設定。普通であれば通常の設定画面である gnome-configuration-center の Display セクションに2台目のディスプレイが表示されて設定できるはずだが、この環境では表示されない。ので nvidia-settings から設定する。
% dpkg -l nvidia\* | grep \^ii
ii  nvidia-current                         295.40-0ubuntu1
  NVIDIA binary Xorg driver, kernel module and VDPAU library
ii  nvidia-settings                        295.33-0ubuntu1
  Tool of configuring the NVIDIA graphics driver
と言う感じで nvidia-current を入れると依存して nvidia-settings パッケージが入っているはずなので、コマンドラインから nvidia-settings を実行、ないしメニューからnvidiaで検索して実行。

この時点で X Server Display Configuration に 2台のディスプレイが表示されているはずなので、2台目の方を TwinView で activate する。nvidia-setting からは直接設定を反映させられないので、Save to X Configuration File から /etc/X11/xorg.conf に保存して X を再起動する必要あり。これで次回ログイン時には dual monitor でセッションが開始されるはず。gnome-configuration-center からは1枚の大きなディスプレイとして認識されるようだ。

これ、最初に選択しようとしたときは Separate X Screen しか選択できず、しかもそちらで起動すると 2台目のディスプレイが真っ白に表示されるというバグを踏み、かつそれを解決しても X の process が別なのでモニター間でウィンドウの受け渡しができない、と言う状態になった。これはなんの事はない NVIDIA Quadro NVS 420 は 4つの出力が 2+2 で異なるGPUに割り当てられていて、X は別GPUでは別プロセスになるらしい。2台でTwinViewするだけなら同じ側のスロットに2台とも繋げば大丈夫。

*1  $ python -m SimpleHTTPServer

Command-line Fu の Popular で見つけた。
$ python -m SimpleHTTPServer
と実行するだけで、実行したディレクトリを root とした http サーバが 8000 番で立ち上がる。http://$HOSTNAME:8000/ でディレクトリのファイル一覧にアクセス可能。アクセスするとアクセスログも STDERR に出力される。ちょっとしたファイルの受け渡しなどに便利かもしれない。

*2  ruby WEBrick でワンライナー

ついでにrubyで同じ事をする one liner 。webrick を使ってこんな感じか。
$ ruby -r webrick -e 'WEBrick::HTTPServer.new({:DocumentRoot => "./", :Port=>8000}).start'
デフォルト値があるかどうかだけの違いではある。

APC Backup-UPS ES BE550R

Posted by yoosee on Debian at 2009-01-20 13:49 JST

*1  APC Backup-UPS ES BE550R 550VA

APC ES500 BACK-UPS ブラック BE500JPこの辺りは日本ほど電力供給が安定していないし夏になると雷も多いので、手軽なUPSが欲しくなり、しばらく前に APC Backup-UPS ES BE550R 550VA を買った。Costco で $45 くらいと安かったのは、新商品のBE550G が出ているからだろうか。まあUPSとしての機能には大差あるまい。こういうのがCostcoで売っているのがアメリカらしいという気もする。日本だと APC ES500 BACK-UPS ブラック BE500JP が相当品か?

USBケーブルでステータスをサーバに送れるので、Debian で apcupsd を入れて利用しているが、apcupsd.conf で設定変更したのはこれくらい。
UPSCABLE usb
UPSTYPE usb
DEVICE
実際に使い始めてみると思ったよりも Power Failue が発生しているのが見える。
Wed Dec 10 06:41:13 EST 2008  Power failure.
Wed Dec 10 06:41:15 EST 2008  Power is back. UPS running on mains.
Tue Dec 23 05:22:46 EST 2008  UPS Self Test switch to battery.
Tue Dec 23 05:22:54 EST 2008  UPS Self Test completed: Not supported
Wed Jan 07 07:53:55 EST 2009  Power failure.
Wed Jan 07 07:53:57 EST 2009  Power is back. UPS running on mains.
Tue Jan 13 09:25:21 EST 2009  Power failure.
Tue Jan 13 09:25:23 EST 2009  Power is back. UPS running on mains.
と言う具合で、月に1,2度は2秒程度の瞬断がある感じ。以前に時々サーバが落ちていたのはおそらくこれが原因だったんだろう。

self-test に失敗しているのは元々その機能が無いからか。新しいモデルの BE550G には Automatic self-test | Periodic battery self-test ensures early detection of a battery that needs to be replaced. と言う具合に機能があるようなので、ちょっと残念。

Shell のコマンド実行回数を数える

Posted by yoosee on Debian at 2008-04-19 22:00 JST

*1  Shell History | Weboo! Returns.

このネタは定期的に出てくるけど、自分では書いたことが無かった気がするので試しに。awk の切り出しは extended history で保存している都合で、切り出しカラムを $2 から $4 に変えている。

直近1000回。
% history-all|tail -1000|awk '{a[$4]++ } END{for(i in a){print a[i] " " i}}' |sort -rn|head
95 lv
59 ls
51 edic
50 ruby
48 cd
43 rm
40 mv
38 sudo
33 jdic
32 w3m
edic, jdic はそれぞれ dic コマンドを 英和・和英 で起動するための alias。

普段使っているzshでは 横着プログラミング 第3回: 履歴マニア にあるように過去の履歴をひたすら蓄積しているので、その約2万回分でカウント。
% history-all|awk '{a[$4]++ } END{for(i in a){print a[i] " " i}}' |sort -rn|head
1431 lv
1212 google
1062 sudo
960 ls
860 edic
694 w3m
688 cd
657 rm
614 mv
569 grep
なんだかやけに sudo が多いような…。

ちなみに google と言うのはコマンドラインから w3m に google 検索パラメータを投げるだけのプログラム。
#!/usr/bin/perl

my $arg = join("+", @ARGV);
my $q=`echo $arg | nkf -w`;
system("w3m \"http://www.google.com/search?lr=lang_ja&q=$q\"");
コンソール上で生活していると、これが意外と便利。

*1  RecordMyDesktop で X 上の操作を録画

X 上で動作するアプリケーションのデモを PowerPoint に張り付けてやりたいと思い、ちょっと探したら RecordMyDesktop と言うツールが見つかった。録画形式は Ogg Theora 。PyGTK が入っていればGUIで録画設定できるが、手元では都合でコマンドラインで実行した。と言っても例えば単一ウィンドウの動作を録画するには xwininfo から Window id を抜きだし (例えば 0x2e0005 として)、コマンドラインで指定するだけ。
 % recordmydesktop -windowid 0x2e0005 -fps 30 -v_bitrate 50000 -o out.ogg
コマンド実行で録画を開始し、Control-C で中断するとエンコードする。Ogg Theora 形式では素の Windows 上で再生出来ないので ffmpeg で変換。
 % ffmpeg -an -vcodec mpeg1video -i out.ogg out.mpg
今回は音声はoffにした。

あとは Windows に持っていってパワーポイントのメニューから挿入 » ビデオとサウンド » ファイルからサウンドを選び、ファイルを指定すればいい。
ただこのやり方だと .ppt ファイルに埋め込まれるのは絶対パスのリンクだけらしく、動画ファイルを削除したりパスを変更すると再生出来なくなるので注意が必要。せめて相対パスで登録できればいいんだが、今のところやり方を見つけられてない。

ともあれデモなんかは現地で操作するより録画しておいた方が色々と安心だし、動作にあわせた解説も練習や録音が出来て楽。ちなみに Windows 上で似たようなことをするならばWink, CamStudio, Jing など色々あるらしい。

*1  SMTPレベルでのspam送信機能改善

数年前から MTA レベルの spam フィルタ技術として tarpitting + greylist 等を適用しているが、最近どうも効きが悪い感じがしたので、すり抜けてくる spam について少し調査をしてみた。結論としては spam 送信ソフトの実装レベルがかなり上がってきた事が伺える。
SMTP的な挙動が正常なMTAと区別が付かないspammerの増加
Greylist (わざと再送要求する) や Tarpit (応答コード送信を遅延させる) といった手法に普通の MTA と同じようにきちんと対応してくる spammer が増えてきている。元々 spam 送信者のソフトウェアが真面目に実装されていない事を利用した手法なので、真面目に実装した方が spam 送信率が高くなると認識された時点で対応されるのはある意味当然ではあるのだが、思ったより早く対応が進んでいる。
その他でも、HELO/EHLO できちんと FQDN を送信してきたり、セカンダリMXを参照して再送をかけてきたりと、全般的にSMTP的な振る舞いは正しいMTAと区別できないレベルのものが確実に増えてきている。特に英語spamに顕著。
ISPの真っ当なメールサーバを中継してくるspammerの増加
正当なISPのメールサーバから正当なFromで送りつけてくる spammer が最近は多少目立つようになってきた。ほぼ同じ内容のspamが複数の送信者・ISP経由から来ているのを見るに、恐らくはウィルス感染PCのbotnetから広く浅く送ってきているのだろう。これをやられるともうSMTPレベルではフィルタのしようがなく、本文の文章解析に頼るしかない。

*2  From / To / Subject / Body の工夫

SMTPレベル以外でも、From / To や Subject, 本文自体にも色々と工夫が見られる。
From が自分自身 (To と同一) であったりランダムであったりする
SpamAssassin では blacklist_from と言う From 固定フィルタがあるが、これが使えなくなる。From が自分自身と言うケースに付いては SPF のような送信サーバ認証を使う手はあり、SpamAssassin 等でも whitelist_from_spf と言った SPF 認証された From のみを Whitelist として扱う設定がある。
個人的な問題は私の主メールアドレスのドメインを登録している NSI が未だに TXT レコードの編集に対応していないという所だが、SPF 対応サーバ自体は去年のドコモの PSF フィルタ開始から増加している
Subject や本文にスペルミスを入れてくる
英語spamでの話になるが、固定文字列フィルタをすり抜けるためにわざとキーワードをスペルミスしてくる。よくあるのは Viagra を Viagara や Viarga と言ったようなもの。

今のところはまだこうしたインテリジェントなspammerは大多数ではないため、既存の手法もそれなりの割合では効いているが、出来のいいツールが出回るようになると現行の手法では対処が難しくなるだろう。まめにメンテナンスされた DNSRBLs 、ドメイン認証、フロー制御、あとはコンテンツレベルでのより賢いフィルタリング等の重要性が増していくだろうが、より CPU リソースを消費する方向に進んでいると言うのはかなり憂鬱な話ではある。

どちらにせよ大量のサンプルと申告者を持っているサービスは有利になるので、個人レベルならば例えば「Gmailへフォワード→POP3で取得」などという方法を使うのも手かもしれない。

*1  日本語ファイル名をローマ字に変換する ruby + kakasi script

Palm TX で使っている pTunes が例によってSDカード上の日本語ファイルを扱ってくれない(id3tagは大丈夫だがファイルリストに表示されない)ので、ディレクトリ名・ファイル名をローマ字に変換するスクリプトを書いた。引数にディレクトリを指定すると recursive に日本語ファイル名をローマ字に変換する。処理には libkakasi を使用して、前段では -w での分かち処理もしている。また空白はアンダーラインに変換。割と破壊的なので利用には注意を。
#!/usr/bin/ruby

require 'kakasi'
require 'find'
require 'nkf'

def romanize_dir dir
  Find.find(dir) do |fpath|
    next if NKF.guess(fpath) == 5 && !/\s+/ =~ fpath # ascii or whitespace
    begin
      filename = Kakasi.kakasi('-w', NKF.nkf('-e',fpath)).gsub(/\s*\/\s*/, '/')
      filename_roman = Kakasi.kakasi('-Ha -Ka -Ja -Ea -ka', filename)
      filename_roman.gsub!(/\s+/, '_').gsub!(/\^/,'-')
    rescue
      puts "failed to convert string #{fpath} - #{$!}:#{$@}"
      next
    end

    begin
      File.rename(fpath, filename_roman)
      puts fpath + " to " + filename_roman
    rescue
      puts "failed to convert filename #{fpath} - #{$!}:#{$@}"
    end
    if(File.directory? filename_roman)
      puts " + into directory #{filename_roman}"
      romanize_dir filename_roman
    end
  end
end

dir = ARGV.shift
romanize_dir dir
Windows だと同様の用途には Flexible RenamerGanmigi と言ったものがあるみたい。試してはいない。

*1  Re: IMAP filtering, how to mark my own messages read

メールを procmail で imap 用 Maildir フォルダに振り分ける際、一部メールに関しては最初から既読に出来ないものかと調べてみたら、Re: IMAP filtering, how to mark my own messages read と言う方法が見つかった。
Maildir ではファイル名で未読・既読状態等を管理しており、基本的には cur/ ディレクトリに :2,S と言う名前で終わっていれば既読とみなされる。そこで
:0
* conditions
{
  foldername=whatever

  :0c
  .$foldername/ # stores in .$foldername/new/

  :0
  * LASTFOLDER ?? /\/[^/]+$
  { tail=$MATCH }

  TRAP="mv $LASTFOLDER .$foldername/cur/$tail:2,S"

  HOST
}
のようなルールで、特定 conditions の場合に mv コマンドでファイル名を強制的に書き換えてしまう TRAP (procmail 実行終了時に実行される処理) を仕込む。直接 new/ から cur/ に mv をかけるあたりも Maildir の思想を完全に否定しているし、結構乱暴な方法ではあるけど、普通に使う分にはこれで問題になることはあまり無さそうなので、まぁ用には足るんじゃなかろうか。
procmail 以外の振り分けソフトならもっとスマートな方法があるだろうか?

fml → mailman 移行メモ

Posted by yoosee on Debian at 2008-01-10 21:00 JST

*1  fml → mailman 移行メモ

メモ書き。mailman で予め listname でメーリングリストを作成し、必要な設定をしておく。メンバーの移行は普通に fml の /var/spool/ml/listname/members などから Webインターフェイス経由で登録。

アーカイブの移行は fml 付随の packmbox.pl を使い
# cd /var/spool/ml/listname/spool/
# perl /.../packmbox.pl > /tmp/listname.mbox
# mv /tmp/listname.box /var/lib/mailman/archives/private/listname.mbox/
# cd /var/lib/mailman/archives/private/listname.mbox/
# /usr/lib/mailman/bin/arch listname listname.mbox
だーっと過去メールが流れて html の index が作成される。閲覧権限には要注意。

mailman 1:2.1.9-9 では fml 風の [listname:01234] 的な通番付き Subject を作ることが標準で出来る。fml で使っていた通番をそのまま引き継ぐにはホームサーバー非定期日記(風) を参考に
# /var/lib/mailman/bin/withlist listname
listname のリストを読み込中 (ロック解除)
変数 `m' が mlname の MailList インスタンスです
>>> m.Lock()
>>> m.post_id = (/var/spool/ml/listname/seq より1多い数字)
>>> m.Save()
>>> m.Unlock()
>>> ^D
最終処理中 
とする。

About W.W.Walker

World Wide Walker は yoosee による blog です。PDA, Web・サーバ技術, 美味しい食べ物などの話題を取り上げています... read more

Monthly Archives

Select Month to read
  

Ads

Recent Entries

Related Sites