Offline-News-mini-HOWTO 土屋 雅稔 v0.0.4, 24 September 1999 この文書は、gnspool と nntpd を組合わせ、足りない部分については自分で スクリプトを書くことにより、簡単なニュースサーバーを構築しようとした試 みについて記述した文書です。 1. はじめに gnspool を使ってニュースを取り込み、mnews の NSPL モードで記事を読む環 境は大変快適でした。ところが、黒船(もう1台のPC)がやってきて、俺にも ニュースを読ませろと言うのです。 INN+suck でそれが出来るのは知っていましたが、その少し前に fj.os.linux でニュースの逆流事故を見ていたので、少し二の足を踏みました。また、INN は個人で使うにはオーバースペックだと言うことも問題でした。 そこで、軽くて、簡単に設定が出来て、NNTP が扱えるシステムはないかと模 索した結果、 gnspool+nntpd でそれが出来ることを発見しました。この文書 はその設定の記録です。 1.1. 特徴 gnspool によって生成されるファイルは、基本的に C-News のサブセットに なっています。そして、nntpd は、もともと C-News と組み合わせて NNTP Server を実現するためのデーモンです。そこで、この2つを組合せ、足りない 部分は他のコマンドやスクリプトで補うことによって、簡単なニュースシステ ムを構成する。それがこの文書の基本方針です。 このニュースシステムの利点としては、 o 設定が簡単 o 逆流事故が極めて起こりにくい 欠点としては、 o ローカルニュースグループが作れない o XOVER コマンドが動作しない o 自分でシェルスクリプトや Perl のスクリプトを書く必要がある などでしょう。 1.2. この文書の対象となる人 あなたのサイトで、ニュースを購読しようとする人が一人だけで、かつ、ニュ ースを購読しようとするマシンも1台だけならば、オフラインでニュースを購 読することに対応したニュースリーダーを使う方が簡単で便利な解決方法で しょう。そのようなニュースリーダーとしては、以下のようなものがありま す。 o gn + gnspool o slrn + slrnpull o Gnus + gnus-offline また、各種のニュースリーダーと gnspool を組合わせる方法も有力です。 そのような組合わせとしては、 o mnews + gnspool o Gnus + gnspool などがあります。これらの方法については、gn の付属ドキュメントに詳細 な情報が記述されていますから、参考にして下さい。 間欠接続環境でニュースを読むことの出来るニュースリーダーについての簡潔 なサマリーがここ に あります。 では、ニュースを購読する複数の人が存在する、または、ニュースを購読する マシンが複数存在する場合にはどうするべきでしょうか。その場合は、第一に leafnode の利用を考慮するべきです。参考になりそうな URL を以下に列挙し ておきます。 o Leafnode o News Leafsite mini HOWTO さて、本当にこの文書を読むべき人は、どのような人でしょうか。 o ニュースシステムの細部まで、自分好みに設定したい人。また、そのため には、スクリプトを書いたりして工夫する手間を惜しまない人。 o ニュースとメールの統合的な解決策が欲しい人。 このような条件に当てはまる人は、この文書を読む価値があるかも知れま せん。また、これまで gnspool を使ってニュースを取り込んでいた人は、 簡単にこのシステムに移行することが出来るでしょう。 1.3. 無保証 なるべく、間違いのないように書いたつもりですが、この文書は完全に無保証 です。(なにしろ、筆者は C-News, INN どちらも運用したことがありません。 とんでもない間違いをしている可能性があります。) あなたの責任のもとで利 用して下さい。 筆者の利用している OS は Linux-2.0.29 で、環境は Slackware-3.1 がベー スになっています。この文書中でも、その環境を前提とした書き方をしている かも知れません。そのような部分は適宜読みかえて利用して下さい。 間違いの指摘、誤植の連絡、感想、質問などは大歓迎です。 1.4. 再配布について この文書は、GNU一般公用許諾書の「バージョン2」或いはそれ以降の適当なバ ージョンのいずれかを選択して再配布することが出来ます。 1.5. 更新履歴 この文書は、Message-ID: <5iqtm4$36m@ns.h.kyoto-u.ac.jp> の記事 に、 頂いたアドバイスなどを加えて加筆訂正したものです。 o 投稿時の From について加筆した さらに、Message-ID: <5l434n$li6$2@tetoron.imel.kyoto-u.ac.jp> の記事 に 追加訂正しました。 o impost に関する記述を加えた o 環境変数による誤動作が起こりにくいようにした 1.6. メンテナンスの放棄 この文書の最初のバージョンは、1997年5月に書かれました。その頃、私はま だ駆け出しの Linux ユーザーでした。この2年の間に、Linux と INTERNET を 取り巻く環境は劇的に変化し、PPP などによる間欠接続環境で Linux を使う ことはもはや普通になりました。また、そのような環境でメールやニュースを 利用するための Tips も豊富に蓄積されています。そのため、この文書の必要 性はもはや殆んどなくなった、と筆者は考えています。 従って、筆者はこの文書のメンテナンスを、今後、原則的に放棄します。ただ し、この文書を読まれた方からの明らかな間違いの指摘や改良の提案について は、反映を出来る限り続けるつもりです。また、この文書のメンテナンスを引 き継いでくださる方がいらっしゃれば、喜んでこの文書を提供したいと思いま す。 2. 用意するもの 以下のソースが必要です。 o gn-1.35.tar.gz o nntp-1.5.11tp-linux.tgz gn のホームページは、http://www.omronsoft.co.jp/~yamasita/gn/ です。nntp-1.5.11tp は、sunsite の Linux/system/daemons で見つかるでしょう。日本国内で は、ftp://ftp.spin.ad.jp/pub/Linux/system/daemons/ などでミラーされて います。 [注. gn の最新バージョンは 1.40 になっています。この文書に記述され ている方法でインストールすることも、まだ出来るようですが、より簡易 な方法が提供されています。詳細については、付属ドキュメントを参照し てください。] 3. news ユーザーの作成 この文書で紹介するニュースシステムは、news ユーザーの権限で実行するこ とを想定しています。ユーザー news が存在しない場合は作成するか、適当に 読みかえて下さい。ただし、環境変数 NNTPSERVER, NEWSLIB, NEWSSPOOL が全 体の設定に矛盾しないよう気をつけて下さい。私の /etc/passwd では、次の ようになっています。 ______________________________________________________________________ news:*:9:13:news:/usr/lib/news: ______________________________________________________________________ 特に、既に gnspool を使っている人は要注意です。gnspool を root 権限で 実行していた場合は、スプールディレクトリや active, history といった ファイルの所有者を news.news に変更しておく必要があります。 ______________________________________________________________________ chown -R news:news /usr/lib/news ______________________________________________________________________ 4. gnspool この章では、gnspool のインストール、記事の取り込みの設定について解説し ます。既に、 gnspool を使っている人は、適当に読み飛ばして下さい。 4.1. インストール 適当なディレクトリに、gn-1.35 のソースを展開します。Linux 用の Makefile は、 gn-1.35/mkfiles/unix/linux という名前で用意されています ので、コピーして下さい。 gn の config プログラムは、インストール先のディレクトリをチェックしま すので、先に必要なディレクトリを作っておきます。 ______________________________________________________________________ mkdir /var/spool/news mkdir /usr/lib/news mkdir /usr/lib/news/bin mkdir /usr/lib/news/man ______________________________________________________________________ 次に、gn-1.35/src/ に移動して configur を実行します。 configur の実行時にインストール先などの指定を求められます。私は次のよ うにしました。 ______________________________________________________________________ BINDIR = /usr/lib/news/bin MANDIR = /usr/lib/news/man NEWSSPOOL = /usr/spool/news NEWSLIB = /usr/lib/news MAIL_KANJI_CODE = JIS PROCESS_KANJI_CODE = JIS FILE_KANJI_CODE = JIS DISPLAY_KANJI_CODE = JIS NEWSRC = ~/.newsrc ______________________________________________________________________ また、これらの設定は site.def を変更することによっても変更できます。 が、 site.def を変更した後は、必ず、configur を再実行しましょう。 この後、make ; make install すれば、必要なファイルがインストールされる はずです。 4.2. ニュースを取り込むための設定 次のような内容の /usr/lib/news/.gnrc を作成します。.gnrc の設定法の詳 細については、gn(1) を参照して下さい。 ______________________________________________________________________ NNTPSERVER news.server NAME Hoge Hoge DOMAINNAME mydomain.or.jp ORGANIZATION dokoka GENERICFROM 1 UNSUBSCRIBE all,!fj.os.linux ARTICLE_LIMIT 0 ARTICLE_LEAVE 0 SELECT_LIMIT 0 GNSPOOL_LANG EUC AUTHOR_COPY /dev/null NEWSRC ~/.newsrc ______________________________________________________________________ この指定は、fj.os.linux のみを取り込むという指定です。この指定によっ て、ニュースサーバー上に存在する f.o.l の記事が全てスプールに取り込ま れます。NAME, DOMAINNAME, AUTHOR_COPY 等の指定は、ニュースに投稿する際 に必要になります。初回の起動時は、大量の記事を取り込むためかなり時間が かかるので、注意して下さい。設定が終ったら、 ______________________________________________________________________ su news -c "/usr/lib/news/bin/gnspool -g -h news.server" ______________________________________________________________________ とコマンドを入力します。このコマンドによって、/var/spool/news の下に記 事が取り込まれ、/usr/lib/news/active が生成されているはずです。 誤動作を避けるため、NNTP Server はコマンドラインで明示的に指定して下さ い。 gnspool は、.gnrc の設定よりも環境変数 NNTPSERVER を優先します。 さらに、 su コマンドは現在の環境変数を引き継ぎます。従って、環境変数 NNTPSERVER が設定されている状態で上記のコマンドを発行すると、意図しな い NNTP Server に接続することがあり得ます。次のスクリプトを用いると gnspool に .gnrc の指定を強制させることができます。 ______________________________________________________________________ #!/bin/bash export NEWSLIB=/usr/lib/news export NEWSSPOOL=/var/spool/news gnrc=$NEWSLIB/.gnrc export NNTPSERVER=$(/usr/bin/awk '/^NNTPSERVER/ {print $2}' $gnrc) /usr/lib/news/bin/gnspool -g ______________________________________________________________________ 環境変数 NEWSLIB, NEWSSPOOL の設定も加えてありますが、これはおまじない みたいなものです。 /usr/lib/news/.gnrc に次の設定を加えると、上流のニュースサーバーでキャ ンセルされた記事がローカルスプールに存在する場合、その記事を消去するよ うになります。 ______________________________________________________________________ REMOVE_CANCELED 1 ______________________________________________________________________ すなわち、上流ニュースサーバーによってコントロールメッセージや Expire:, Supersedes: などのヘッダが処理された結果に追随します。 ただし、上流ニュースサーバーの expire 期限が経過した後もローカルの記事 を残しておきたい場合には、この方法は使えません。 Message-ID による検索ができるようにするには、/usr/lib/news/.gnrc に、 ______________________________________________________________________ USE_HISTORY 1 ______________________________________________________________________ という行を加えて下さい。この行を加えると、/usr/lib/news/history が生成 されるようになります。 5. nntpd この章では、nntpd のインストール、設定、gnspool, gninews との連係につ いて解説します。 5.1. インストール 適当なディレクトリに nntpd のソースを展開します。 まず、nntp.1.5.11t/common/conf.h を編集します。特にディレクトリ関係の 設定は、gnspool での設定と矛盾しないようにしなければなりません。私は次 のようにしました。 ______________________________________________________________________ #define DBM #undef DBZ #define CNEWS #define GHNAME #undef UUNAME #define STAT_FILE "/usr/lib/news/mgdstats" #define NGDATE_FILE "/usr/lib/news/groupdates" #define ACTIVE_FILE "/usr/lib/news/active" #define ACCESS_FILE "/usr/lib/news/nntp_access" #define DISTRIBUTIONS_FILE "/usr/lib/news/distributions" #define NEWSGROUPS_FILE "/usr/lib/news/newsgroups" #define HISTORY_FILE "/usr/lib/news/history" #define INEWS "/usr/lib/news/inews" #define POSTER "news" ______________________________________________________________________ デフォルトでは dbz ライブラリを使うようになっているのを、dbm ライブラ リを使うように変更しています。dbz ライブラリのある人は、そのままで構い ません。変更した場合は、Makefile も変更します。 デフォルトでは /etc/uucpname を参照してホストの名前を解決するように なっていますから、gethostname() を使って解決するように変更しました。 編集が終ったら、make server を実行して nntpd を生成して下さい。私のと ころでは nntp.1.5.11t/server/timer.c に変更が必要でした。124行目の select() 関数がおかしいといわれたので、 ______________________________________________________________________ #if 1 /* Was EXECLAN */ n = select(fileno(stdin) + 1,&readfds, (fd_set*)0, (fd_set*)0, timeout); #else ______________________________________________________________________ と変更しました。 次に、root になって /usr/sbin/ に nntpd をコピーします。 5.2. ニュースを読むための設定 /etc/inetd.conf を修正して、nntpd が起動されるようにします。次の1行を 付け加えるか、修正して下さい。 ______________________________________________________________________ nntp stream tcp nowait news /usr/sbin/tcpd nntpd ______________________________________________________________________ 次に、/usr/lib/news/nntp_access を作成します。このファイルで、nntp に よるアクセスを許可するホストを設定しています。とりあえずは、次のような 設定でよいでしょう。 ______________________________________________________________________ default no no localhost read post ______________________________________________________________________ ここまでの設定でニュースを読めるようになっているはずです。環境変数 NNTPSERVER を localhost に設定して mnews などで読んでみましょう。 読めなかった場合は、telnet localhost nntpとして、反応を見て下さい。 "Can't talk to you" といわれた場合は nntp_access の設定が間違っていま す。 /var/log/messages や /var/log/syslog にエラーの情報が残っていると 思いますので、参考にして下さい。 5.3. ニュースを投稿するための設定 次のような内容のスクリプト /usr/lib/news/inews を作成します。 ______________________________________________________________________ #!/bin/sh /usr/lib/news/bin/gninews ______________________________________________________________________ これだけで、投稿できるようになっているはずです。ニュースリーダーから投 稿のテストをして下さい。すると、/var/spool/news/news.out/gn?????? とい うファイルに投稿した記事がスプールされているはずです。次に、 ______________________________________________________________________ su news -c "gnspool -py -h news.server" ______________________________________________________________________ を実行すれば、実際にニュースサーバーに記事が投稿されます。(この場合 も、NNTP Server は明示的に指定して下さい。) 5.4. From: 行について gnspool で記事を投稿する場合、スプール時の From: は無視され、.gnrc の 設定を用いて次のように変更されます。 [注. gn-1.40 からスプール時の From: を使うように gnspool に強制するこ とが出来るようになりました。gn(1) のオプション SUBSTITUTE_HEADER につ いての説明を参照してください。このオプションを適切に設定すると、後述の impost に頼らずに From: を使い分けることができます。] ______________________________________________________________________ From: news@mydomain.or.jp (Hoge Hoge) ______________________________________________________________________ 名前とドメイン名は .gnrc の設定が使われ、gnspool を実行しているアカウ ント (news) と組み合わせて、From: が生成されるようになっています。従っ て、送信者を明示したい場合は、Sender: や Reply-To: などのヘッダを利用 して下さい。 news@mydomain.or.jp が、自分とは関係ない人のメールアドレスとなって都合 が悪い場合には、環境変数 LOGINNAME が利用できます。例えば、次のような スクリプトを用いると、 ______________________________________________________________________ #!/bin/bash export NEWSLIB=/usr/lib/news export NEWSSPOOL=/var/spool/news export LOGINNAME=hogehoge gnrc=$NEWSLIB/.gnrc export NNTPSERVER=$(/usr/bin/awk '/^NNTPSERVER/ {print $2}' $gnrc) /usr/lib/news/bin/gnspool -py ______________________________________________________________________ アカウント名の代わりに環境変数 LOGINNAME が使われ、 ______________________________________________________________________ From: hogehoge@mydomain.or.jp (Hoge Hoge) ______________________________________________________________________ とすることができます。 5.5. impost の利用 どうしても From: を使い分けたい場合には、impost という Perl のスクリプ トがあります。gnspool の代わりに投稿用のスクリプトとして使えば、スプー ルした時の From: を使って投稿することが出来ます。最新バージョンは 0.99i で、ftp://falcon.econ.kyoto-u.ac.jp/pub/dist/impost/ で手に入ります。 [ この項は fj.os.linux に投稿された次の記事を参考として書かれました。 o Message-ID: <5lh4km$s68$1@horse.fsinet.or.jp> o Message-ID: <5lid4e$gvj$1@horse.fsinet.or.jp> おおつかさんに感謝します。 ] 実際に impost を使う手順について解説します。impost を /usr/lib/news/bin/ にコピーして下さい。その時、先頭行の perl のパスを システムに合わせて変更し、実行許可属性を与えておきます。次に、環境設定 ファイル /usr/lib/news/.impostrc を用意します。私は次のような内容にし ました。 ______________________________________________________________________ config: default option: -SMTPservers mail.server option: -NNTPservers news.server option: -noESMTP option: -NewsPost option: -User hogehoge option: -Name Hoge Hoge option: -NameInComment option: -Org dokoka option: -FromDomain mydomain.or.jp option: -noMsgId option: -noDate option: -noNScmpl option: -noMIMEbcc option: -noNewsCheck option: -Lines 3000 option: -JustQueuing option: -ObeyHeader option: -h config: post option: -noVerbose option: -ProcessQueue ______________________________________________________________________ /usr/lib/news/inews を変更して、gninews の代わりに impost が起動される ようにしておきます。 ニュースリーダーとして mnews を利用している場合、メッセージに Path: ヘッダが付加されますが、impost は Path: のついているメッセージを invalid なものと見なします。これを回避するため、impost の275行目付近の ______________________________________________________________________ && !&header_value("Path") ______________________________________________________________________ という行をコメントアウトしておきます。 これで準備できたはずです。テスト投稿をしてみましょう。オフラインの状態 で投稿すると、/usr/lib/news/.imqueue/ というディレクトリに記事がスプー ルされます。その後、 ______________________________________________________________________ su news -c "/usr/lib/news/bin/impost -config post" ______________________________________________________________________ というコマンドを発行すると、実際に記事が送信されます。 上記の設定で impost を利用した場合、ヘッダは次のようになります。 ______________________________________________________________________ Newsgroups: test Subject: test From: someone@myhost.mydomain.or.jp (Someone) Path: someone X-Newsreader: mnews [version 1.19] 1995-07/21(Fri) Organization: dokoka Originator: hogehoge@mydomain.or.jp (Hoge Hoge) X-Dispatcher: impost version 0.99i (Apr. 6, 1997) Lines: 1 ______________________________________________________________________ この内、Organization:, Originator:, X-Dispatcher:, Lines: の各ヘッダが impost によって付加されたヘッダです。From: には記事で指定した From: が 使われ、Originator: によって投稿した人が確定されます。