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

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

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

更新履歴

概説

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

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

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

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

といったところかな?

基本方針

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

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

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

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

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

何かの事情で古いバージョンがいい人は、一 応残してますんで。0.02も残してます。

ダウンロードと展開

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

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

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

設定

環境変数

start_server.batとset_users.batの中のUSERとHOMEを編集してください。適当 なテキストエディタ(例えばメモ帳。改行コードが変だったらWordPadとか。)で 開けば編集できます。1行目と2行目を自分の環境に合わせて書き変えます。まあ、 コントロールパネルで設定しちゃって、server.exeやnn_users.exeを直接使うっ て手もあるけど。もともとUSERやHOMEが設定されてる場合は、それを流用した方 が平和かも。

set USER=hoge
set HOME=C:\hoge

.\server.exe %1

ただし、1行目のhogeは自分のユーザ名です。が、デフォルト値として使うだけ なので、適当でよいです。 2行目の「"C:\hoge"」は、ニュースの記事が収まる場所を指定してください。そ の下にnewsというディレクトリ(これをbaseという)を作って、その下にいろいろ 入ります。

次に、ニュースの記事を収める場所(base)を用意します。上で決めたHOMEの下 にnewsというディレクトリ(フォルダ)を作ってください。古いバージョン使って、Mailとかにしてる人は、 newsに改名すれば、続けて使えるはず。

次に上で作ったbaseのディレクトリの下に「active」という名前の空のファイル を作ってください。Windowsの場合は、例えば、「右クリック→新規作成→テキ ストドキュメント」でファイルを作って、名前を変更するとか。

ユーザ設定

次に、users.txtを編集します。#で始まる行はコメントです。ユーザ名、パスワー ド、パーミッションを空白で区切って書きます。パーミッションはread, write, adminの中から複数選べます。adminのパーミッションを与えたユーザを少なくと も一つは作ってください。もちろん、サンプルとは変えて。他に人に読み書き (または読むだけ)をさせたい場合は、ゲストユーザみたいなのを作っとくとよい でしょう。

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

編集が終ったら、set_users.batを実行してください。baseディレクトリの下に passwdというファイルができて、パスワードが暗号化された設定が保存されます。

配送設定

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

# config.pl

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

$site{film} = {
    host => "film.rlss.okayama-u.ac.jp",
    mode => rw,
    group => '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 アドレス)を書きます。modeはr, w, rw, のいずれかで、それぞれ、読み込み用、 書き込み用、読み書き用です。groupは、やりとりするニュースグループを表現 する文字列です。それぞれのグループに対する表現を「,」でつないでください。 余分な空白が入るとだめです。「*」はワイルドカードです。欲しくないグルー プを表現するときには「!」を使ってください。(「fj.*,!fj.soc.*」みたいな感 じ。)

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

# config.pl

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

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

1;

# end of file

portというキーワードでポートを指定することもできます。

config.plの編集が終ったら、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

とりあえず使う

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

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

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

start_server.bat 600

エンタキー押すと、きりのいいところで止まります。

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

自分で読み書きする

自分のニュースリーダの見るサーバをlocalhostに設定すれば、自分で読み書き できるはず。

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

他人に読み書きさせる

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

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

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

相互配送

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

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

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

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

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

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

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

問題点

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

  1. NNMLの解説は非常に少ない。
  2. 記事が多くなると遅い。
  3. 即時配送ができない。
  4. expireの機能がない。
  5. スパム対策の機能がない。

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

2番目は、どうやら、全体のデータベースが無さそうなことに起因してるみたい。 newnewsコマンドあたりの実装をハックしないと、どうしようもないんじゃない かな? というか、そもそもnewnewsは遅いものなのかも。

3番目は、記事を受けとった時点で何かアクションを起すようにハックしないと 無理そう。

4番目は、MUA(ニュースリーダとかメールリーダとか)で対処できるかも。でも2 番目に対処しちゃうと同期が難しい? やはり、専用スクリプトを書けってか?

5番目は、3番目と同様。記事を受け取ったらスパムフィルターを通してから、配 送に渡すのがいいんでしょうね。

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

おわり