Lazy Diary @ Hatena Blog

PowerShell / Java / miscellaneous things about software development, Tips & Gochas. CC BY-SA 4.0/Apache License 2.0

inn 作業

やっと終了したらしいです。

makedbz -i は実行しても変わりがなかったので、前回のここから作業を開始。

makehistory: dbzstore duplicate message-id /usr/local/news/db/history:
[2C6E8FA1C32E4AB0D94952D3507A73CC]@1153646 No such file or directory 

message-id が被っているそうな。ということは、message-id が同じである 2 つの記事の、どちらかを削除するなり何なりすればいいわけである。

ここで、「2C6E8FA1C32E4AB0D94952D3507A73CC」は /usr/local/news/db/history ファイルの中の文字列である。これを検索すると、次の 2 行が該当する。

$ grep 2C6E8FA1C32E4AB0D94952D3507A73CC history
[2C6E8FA1C32E4AB0D94952D3507A73CC]      830353116~-~830353116 \
    @050100000032000000060000000000000000@
[2C6E8FA1C32E4AB0D94952D3507A73CC]      830357457~-~830353116 \
    @05010000000C000005DB0000000000000000@ 

本当にダブってるのはこの記事だけ? ということで、調べる。

$ perl -ne 'print "$1\n" if /^\[(.+)\]/;' history | wc -l               # ... (1)
$ perl -ne 'print "$1\n" if /^\[(.+)\]/;' history | sort | uniq | wc -l # ... (2) 

(1) - (2) = 1 となる。ダブってるのはこの記事だけ。

ここで第 2 フィールドに注目。history(5) を見ると、ここは「記事到着時刻~記事廃棄期限(なければ '-')~記事中の Date ヘッダの値」(いずれも Epoch からの秒数)となっている。この 3 番目の「記事中の Date ヘッダの値」が使えそう。
date(1) を使い、 /var/spool/news/articles/ 以下のファイルの Date ヘッダの書式に合わせたモノを得る。

$ date -r 830353116 "+Date: %e %b %Y %T +0900"
Date: 24 Apr 1996 22:38:36 +0900 

検索する。grep -H でファイル名も表示。

$ cd /var/spool/news/articles/cclub/
$ find . -exec grep -H "4 Apr 1996 22:38:36" {} \;
./projects/netbsd/6:Date: 24 Apr 1996 22:38:36 +0900
./old/cclub-ml96/1499:Date: 24 Apr 1996 22:38:36 +0900 

で、この記事を見ると、やはり Message-ID ヘッダの値が同じである。

この記事の問題は、マルチポストされていて(記事の内容はヘッダ以外同じで)、かつ Message-ID が同じ、ということである。マルチポストされた記事なら、クロスポストされた記事と認識されるように改変しても問題はない(はずである)。
さて、クロスポストされた記事は、ファイルとしては以下のような状況になっている。

  • 記事のファイルはクロスポストされた全ての newsgroup に存在する。
  • 新しいバージョンの INN が走っていたときに投稿された記事であれば、このファイルはハードリンクである。
  • 古いバージョンの INN が走っていたときに投稿された記事であれば、このファイルは普通のファイルである。つまり、ファイルが 2 つあり、内容は同じである。

で、このハードリンクしてる、というのに気付かなかったので、2 つのファイルのヘッダの Xref: フィールドを書きかえた。こんな感じ。

Xref: cclub.cc.tut.ac.jp cclub.projects.netbsd:6 cclub.old.cclub-ml96:1499 

ヒストリデータベースと overview を作成する。今度は Message-ID が被っている旨のエラーが出ない。

$ cd /usr/local/news/db
$ sudo -u news rm -rf /var/spool/news/overview/*
$ sudo -u news /usr/local/news/bin/makehistory
$ sudo -u news /usr/local/news/bin/makehistory -O
makehistory: cannot write overview data "@05010000000200000D3D0000000000000000@"
 :
(上記のような内容がえんえんと出力される)
 :
$ sudo -u news /usr/local/news/bin/makedbz -f history -i 

この "makehistory: cannot write overview data ..." ってのは無視していいらしい。該当する記事が spool 中に存在しないために出るらしい。実際、該当するファイルはないみたい。

ここで、makehistory と makedbz は両方とも、 /usr/local/news/db に存在するファイル history および history[.n].{dir, hash, index} を更新するコマンドである。

  • makedbz の出力が、実際に用いるべきファイル
  • makedbz の方が、後に実行されている
  • inn が実際に使うのは history.{dir, hash, index} という名前の方のファイル
  • makehistory の出力ファイルは history.{dir, hash, index}
  • makedbz の出力ファイルは、history.{dir, hash, index} と history.n.{dir, hash, index} の、どちらの 3 ファイルか沸からない

というわけで、history.{dir, hash, index} よりも history.n.{dir, hash, index} の方が新しいファイルだった場合、以下のようにする。

$ sudo -u news rm history.dir history.hash history.index
$ sudo -u news mv history.n.dir history.dir
$ sudo -u news mv history.n.hash history.hash
$ sudo -u news mv history.n.index history.index 

最後に、inn を立ち上げる。

$ sudo -u news /usr/local/news/bin/rc.news
INND is running 

あとは、/var/log/messages を確認したり、slrn とか mnews で記事が閲覧できることを確認して、めでたしめでたし。(slrn と mnews の両方を使って確認をするときは、~/.newsrc ファイルを逐一削除すること)


あとは mew の動作確認か。