サルでもできる(かもしれない)、自宅で手軽に、なんちゃってニュースサーバ

※ コメントは、適当なニュースグループか、乾燥板メールで。(2007年4月07日)

このページで解説してる改造やスクリプトは、自由に使っていただいてかまいま せんし、自由に改変していただいてかまいません。その際、特に私に断わる必要 はありません。でも、ナイスな改良を思いついたら、教えてくれるとうれしいか も。

検索ページ等から来た人は、最新版をどうぞ。

更新履歴

概説

ニュースサーバを本格的に運用するのは、結構大変です。が、欲張らなければ、 結構なんとかなりそうです。

というわけで、このページでは、固定IPじゃなくても、Windowsでも、簡易ニュー スサーバを立ち上げられる方法を簡単に説明します。もちろん、固定IPでも大丈 夫だし、大抵のOSで可能な方法です。ただし、以下の内容の全てを試したわけで はありませんので、自己責任で試してください。

ちなみに、自分でニュースサーバを立ち上げると何がうれしいかというと、

  1. 複数のサーバから記事を持ってきて読めるので、サーバを渡り歩く必要が ない。
  2. ささやかながら、ネットニュースの配送に貢献できる。
  3. その気になれば、他人が読める環境を用意できる。

といったところかな?

基本方針

  1. NNTPサーバには、perlモジュールのNNML-1.14を改造したものを使う。
  2. 配送には、NNML附属のnnmirrorを改造したもの使う。
  3. 非固定IPでドメイン名が必要なら、ダイナミックDNSを使う。

parでexe化しといたんで、かなり簡単になってます。

  1. プログラムをダウンロードして適当な場所に展開す る。
  2. 設定ファイルを書き変える。
  3. 走らせる。

だけで基本的にはいけるはず。

perlソースもつけてますが、そっちの詳細はperl版の ページに任せて、ここではexe版の説明のみします。exeなんでWindowsに特 化してます。他のOSの人はperl版を使ってください。スクリプト改造したい人も そちらへ。

何かの事情で古いバージョンがいい人は、更新履歴か らリンク張ってます。

ダウンロードと展開

nnml+0.07をダウンロードして、 適当なディレクトリに展開するだけです。複数の人が使うコンピュータだったり、 公開サーバや相互配送を考えていたりするのなら、セキュリティ的に安全な場所 に置いてください。(nntpサーバ用のパスワードを生書きしたりするから。)

ちなみに上のzipファイルは2MB強、展開すると4MBぐらい。実行時に4MB強の一時 ファイルを作る。この一時ファイルはキャッシュになってるので、取っておくと 次から立ち上がりが若干早くなるはずです。不要になったら消してください。ユー ザ環境変数のTMPかTEMPで指定したところのようです。コントロールパネルのシ ステムの詳細設定の環境変数で場所のチェックや変更ができるはず。

スプールに必要な容量は、fj.*3ヶ月分で数十MB程度、nihon.*3ヶ月分で数百KB 程度かな。最近では。

設定

どうしても必要な設定

etc/config.plを編集してください。テキストファイルです。

# config.pl

$Config->{pathhost} = q[myhome-news];

$site{rlss-news} = {
    host => qw[film.rlss.okayama-u.ac.jp],
    mode => rw,
    pathhost => q[rlss-news],
    group => qw[kgk.*,asataku.*,jape-n.*,feedmania.*,woyadi.*,japon.*,tsukuba.*,null.*,kansai.*,kanto.*,japan.*,fj.*,nihon.*],
};

1;

# end of file

みたいな内容です。「#」で始まる行はコメントです。 「$Config->{pathhost}」の行の「myhome-news」の部分は、自分のサイトを表わ す文字列です。他のサイトとかぶるとまずいので、かぶりにくいように設定しま しょう。いくつかのニュース記事のPath:を見て、どんなのがよいか考えるのが よいでしょう。自分のサイトのドメイン名なんかが無難かも。例文通りなのは論 外。

以下の変更は、必要に応じて行なってください。

$site{}の括弧の中は、そのサーバを表わす適当な文字列です。複数のサーバを 登録するときは、それぞれに、「$site{hoge}=」で始まる定義を書いてください。 (中の文字列は適当に変えて。) hostには、相手のサーバのドメイン名(またはIP アドレス)を書きます。pathhostは、そのサーバのパスホスト(Path: に付加する 文字列)。modeはr, w, rw, のいずれかで、それぞれ、読み込み用、 書き込み用、読み書き用です。groupは、やりとりするニュースグループを表現 する文字列です。それぞれのグループに対する表現を「,」でつないでください。 余分な空白が入るとだめです。「*」はワイルドカードです。欲しくないグルー プを表現するときには「!」を使ってください。(「fj.*,!fj.soc.*」みたいな感 じ。)

ユーザ名foo、パスワードbarでアカウントを持ってる場合は、userとpassを次の ような感じで設定します。

# config.pl

$Config->{pathhost} = q[myhome-news];

$site{rlss-news} = {
    host => qw[film.rlss.okayama-u.ac.jp],
    mode => rw,
    pathhost => q[rlss-news],
    user => foo,
    pass => bar,
    group => qw[kgk.*,asataku.*,jape-n.*,feedmania.*,woyadi.*,japon.*,tsukuba.*,null.*,kansai.*,kanto.*,japan.*,fj.*,nihon.*],
};

1;

# end of file

portというキーワードでポートを指定することもできます。デフォルトは119。

必要に応じた設定。

baseの設定

ニュースの記事を収める場所(base)をetc/base.txtに書いてください。デフォル トはC:/netnewsになってます。0.02以前のバージョンを使ってた人は、該当する ディレクトリを指定するか、適当に改名すれば、続けて使えるはず。ディレクト リ名に日本語文字や空白が含まれると、うまくいかないかも。試してないけど。

ユーザ設定

次に、etc/users_templ.txtを編集します。#で始まる行はコメントです。ユーザ 名、パスワード、パーミッションを空白で区切って書きます。パスワードを「*」 にすると、適当なパスワードを自動生成します。パーミッションはread, write, adminの中から複数選べます。adminのパーミッションを与えたユーザを少なくと も一つは作ってください。また、feedという名前のユーザも作ってください。 他に人に読み書き(または読むだけ)をさせたい場合は、ゲストユーザみたいなの を作っとくとよいでしょう。

# user pass permitions (read, write, admin)
admin * read write admin
feed * read write
guest guest read write
# end

expire設定

etc/expire.txtを編集します。

*:90
kgk.*:never

みたいな内容です。グループにマッチするパターンと記事の保存日数をコロンで 区切ってます。保存日数が「never」の場合はexpireしません。パターンは後の 行の方が優先されます。上の例では、「kgk.*」にマッチするグループはexpire せず、その他のグループは90日でexpireします。「#」で始まる行はコメントで す。

date.txtの設定

sample/date.txtを参考に、var/date.txtを設定することができます。0.02を使っ てる人は、書式が変わってるので要注意。いつの記事からやりとりするかを表わ すファイルで、送出サイト:受取サイト 年月日を4桁2桁2桁で表したもの 時分秒 を2桁ずつで表わしたものという構造です。このファイルが無ければ、最初の実 行時に、相手サーバの一番古い記事から持って来ます。

film.rlss.okayama-u.ac.jp:localhost 20070101 000000
localhost:film.rlss.okayama-u.ac.jp 20070101 000000

expiretime.txtの設定

sample/expiretime.txtを参考に、var/expiretime.txtを設定することができま す。実行時に、この日時から24時間以上経っていれば、expireを実行します。こ のファイルが無ければ、最初の実行時にexpireを実行します。(意味無いけど)

とりあえず使う

ここまでできれば、NNmirror.pmを使って、自分の読めるサーバから記事を持っ てきたり、自分とこの記事を送ったりできます。この方法は、24時間体制じゃな くてもへっちゃらなので、なんちゃって度が高い。

まず、nn_users.exeを実行してください。

  1. etc/users_templ.txtを読み込み、必要ならばパスワードを自動生成して、 var/users.txtに書き込む。
  2. baseディレクトリが無ければ作る。
  3. base/activesというファイルが無ければ作る。
  4. base/passwdというファイルに、パスワードが暗号化された設定が保存さ れる。

といったあたりのことが出きます。

次に、nn_server.exeをオプションなしで立ち上げてください。(結構時間かかる かも。) 何か訳分からんうちに終ってしまう場合はコマンドプロンプトで立ち上 げるとよいかも。うまくいけば、サーバ立ち上げてvar/date.txtで指定した日時 以降の記事を取ってきて、配る必要のある記事は配って、var/date.txtを1時間 前の日時に変えて終わるはずです。(1時間前にしたのは、安全性を考えて。) そ の際、var/expiretime.txtの時間から24時間以上経っていれば、expireを実行し ます。

このとき、base/newsgroupsというファイルが無ければ、グループ名とグループ の説明をtabで区切った行からなるファイルを作ります。

nn_server.exeに数字の引数を与えて立ち上げると、その秒数の間隔で上の動作 を繰り返すはずです。例えば、10分ごとにやりとりしたい場合は、コマンドプロ ンプトで、

nn_server.exe 600

expireは24時間ごとに行ないます。エンタキー押すと、きりのいいところで止ま ります。

いちいちコマンドプロンプトを使うのが面倒であれば、ショートカットリンクを 利用するのがよいかも。プロパティでリンク先のところが 「c:\hoge\nn_server.exe」みたいになってるのを 「c:\hoge\nn_server.exe 600」みたいに変えればOK。

自分で読み書きする

自分のニュースリーダの見るサーバをlocalhostに設定すれば、自分で読み書き できるはず。ゲストアカウントを利用するといいかも。デフォルトではユーザ名 guest、パスワードguest。

スプールを直接読む機能がニュースリーダにあれば、それを使うもよし。

今のところ、サーバのつけるMessage-IDは、あんまりよろしくないので、ニュー スリーダ側でつけた方が、まだましかも。

他人に読み書きさせる

これをやろうとすると、24時間体制に準ずる程度にはサーバを立ち上げっぱなし にする必要があります。

他人に読み書きさせるには、ドメイン名か固定IPが必要です。後者が手に入って ない場合は、ダイナミックDNSで大丈夫でしょう。日本にも無料のダイナミッ クDNSのサービスがいくつかあるみたいですから、調べて使ってください。 DiCEとか使えると ころが便利かも。

取り敢えず、自分のサイトのドメイン名(ポートが標準の119でないときはポート も)とゲストユーザのユーザ名・パスワードを公表(なり使って欲しい人に伝える なり)すればOK。

相互配送

上の方法でも実用上問題ないでしょうが、ちゃんと相互配送した方が配送網が広 がりやすいでしょう。それに、相手が普通のサーバなら、記事を即時送ってくれ るかもしれません。

相互配送しようとすると、24時間体制に準ずる程度にはサーバを立ち上げっぱな しにする必要があります。まあ、相手が普通のサーバなら、数日程度は平気で待っ てくれますが。

相互配送するには、ドメイン名か固定IPが必要です。後者が手に入ってない場合 は、ダイナミックDNSで大丈夫でしょう。日本にも無料のダイナミックDNSのサー ビスがいくつかあるみたいですから、調べて使ってください。

あと、特に、上の「Pathの設定」が重要になります。

配送先を見つけるのは、知合いに頼むなり、どっかのグループで募集するなり、 NewsFeed ML - NetNews の相互配送などのための Mailing listで募集する なり、いろいろ方法があります。

配送してくれるところが決まったら、前項に準じてconfig.plを編集します。た だし、modeはwにしてもいいです。向こうが記事を送ってくれるので、こちらか ら読みにいく必要はありません。まあ、念のためにrwにしてもいいけど。

先方には、自分のドメイン名とpathhostと欲しいグループと配送用のユーザ名と パスワード(ゲストのでもよい)を伝えれば、設定してくれます。相手がinnだっ たら、ユーザ名とパスワードはpasswd.nntpに設定してくれってことになるのか な? 試してないけど。このページで解説してるなんちゃってサーバだってことも 伝えた方がいいかも。なんちゃってサーバ同士の相互配送もできるはず。多分。

グループ等の管理

グループの管理は、初期段階はお隣り任せです。隣接サイトにあるグループで、 こっちがそのサイトに要求してるグループは、自動生成するし、配送もします。 ただし、local.test(配送しないでね)は自動で作ります。この擦り合わせは、一 定時間ごとに実行します。

コントロールメッセージは、newgroup, rmgroup, cancelに対応してます。 Distributionを見てないので、ローカルにコントロールメッセージ発行したいと きは、local.testにでも(クロスポストせずに)送ってください。この要領で、ロー カルグループも作れます。

問題点

所詮、なんちゃってサーバなので、いろいろ問題点はあります。取り敢えず分かっ てることは、

  1. NNMLの解説は非常に少ない。
  2. NNMLはいくつかバグがある。
  3. スパム対策の機能がほとんどない。
  4. コントロールメッセージの対応が中途半端。
  5. Message-IDがタコ。

ぐらい。1番目については、日本語の解説は皆無と言っていいほどありません。 英語にしても附属のドキュメント以外は見かけない。まあ、小さいプログラムな んでソースを読めってか? それとも、自分で解説書け? 誰かお願い(ぉぃ)。

2番目は、見つけ次第修正するしかないか。ニュースサーバとしての運用は、ちゃ んとやってないんじゃないかな?

3番目は、ユーザが書けるようにはしてます。etc/SpamFilter.pmを適当に書き換 えてください。perlが分かればですが。

4番目については、対応してるコントロールメッセージのチェックが甘い。この 状態でcheckgroupsに対応しちゃうと被害が大きそうだから、してません。

最後のは、今後の課題かな。

ちなみに、0.03まで、「記事が多くなると遅い」ってのを挙げてたんですが、 NNMLのバグで送出がうまくいってなくて、タイムアウトになってただけのような 気がします。0.03までだと、記事が送出できないかも。0.05以降では記事が送出 できることは、確認しています。

というわけで、いろいろ問題はありますが、それでもよければ、使ってみてくだ さい。

おわり