<!doctype linuxdoc system>
<article>
<title>Offline-News-mini-HOWTO
<author>土屋 雅稔 &lt;tsuchiya@pine.kuee.kyoto-u.ac.jp&gt;
<date>v0.0.4, 24 September 1999

<abstract>
この文書は、gnspool と nntpd を組合わせ、足りない部分については自分でスクリプト
を書くことにより、簡単なニュースサーバーを構築しようとした試みについて記述した文
書です。
</abstract>



<sect>はじめに
<p>
gnspool を使ってニュースを取り込み、mnews の NSPL モードで記事を読む環境は大変快
適でした。ところが、黒船(もう1台のPC)がやってきて、俺にもニュースを読ませろと言
うのです。

<p>
INN+suck でそれが出来るのは知っていましたが、その少し前に fj.os.linux でニュース
の逆流事故を見ていたので、少し二の足を踏みました。また、INN は個人で使うにはオー
バースペックだと言うことも問題でした。

<p>
そこで、軽くて、簡単に設定が出来て、NNTP が扱えるシステムはないかと模索した結果、
gnspool+nntpd でそれが出来ることを発見しました。この文書はその設定の記録です。


<sect1>特徴
<p>
gnspool によって生成されるファイルは、基本的に C-News のサブセットになっています。
そして、nntpd は、もともと C-News と組み合わせて NNTP Server を実現するためのデー
モンです。そこで、この2つを組合せ、足りない部分は他のコマンドやスクリプトで補う
ことによって、簡単なニュースシステムを構成する。それがこの文書の基本方針です。

<p>
このニュースシステムの利点としては、
<itemize>
<item>設定が簡単
<item>逆流事故が極めて起こりにくい
</itemize>
欠点としては、
<itemize>
<item>ローカルニュースグループが作れない
<item>XOVER コマンドが動作しない
<item>自分でシェルスクリプトや Perl のスクリプトを書く必要がある
</itemize>
などでしょう。


<sect1>この文書の対象となる人
<p>
あなたのサイトで、ニュースを購読しようとする人が一人だけで、かつ、ニュースを購読
しようとするマシンも1台だけならば、オフラインでニュースを購読することに対応した
ニュースリーダーを使う方が簡単で便利な解決方法でしょう。そのようなニュースリーダー
としては、以下のようなものがあります。
<itemize>
<item><url url="http://www.omronsoft.co.jp/~yamasita/gn/" name="gn"> + gnspool
<item><url url="http://space.mit.edu/~davis/slrn.html" name="slrn"> + slrnpull
<item><url url="http://www.gnus.org/" name="Gnus"> + gnus-offline
</itemize>
また、各種のニュースリーダーと gnspool を組合わせる方法も有力です。そのような組
合わせとしては、
<itemize>
<item>mnews + gnspool
<item>Gnus + gnspool
</itemize>
などがあります。これらの方法については、gn の付属ドキュメントに詳細な情報が
記述されていますから、参考にして下さい。

<p>
間欠接続環境でニュースを読むことの出来るニュースリーダーについての簡潔なサマリーが<url
url="http://fjsearch.jaist.ac.jp:8000/cgi-bin/netnews?ckr6o6.upd.ln@sou.nerv.org"
name="ここ">にあります。

<p>
では、ニュースを購読する複数の人が存在する、または、ニュースを購読するマシンが複
数存在する場合にはどうするべきでしょうか。その場合は、第一に leafnode の利用を考
慮するべきです。参考になりそうな URL を以下に列挙しておきます。
<itemize>
<item><url url="http://wpxx02.toxi.uni-wuerzburg.de/~krasel/leafnode.html" name="Leafnode">
<item><url url="http://www.linux.or.jp/JF/JFdocs/News-Leafsite.html" name="News Leafsite mini HOWTO">
</itemize>

<p>
さて、本当にこの文書を読むべき人は、どのような人でしょうか。
<itemize>
<item>ニュースシステムの細部まで、自分好みに設定したい人。また、そのためには、スクリプトを書いたりして工夫する手間を惜しまない人。
<item>ニュースとメールの統合的な解決策が欲しい人。
</itemize>
このような条件に当てはまる人は、この文書を読む価値があるかも知れません。また、こ
れまで gnspool を使ってニュースを取り込んでいた人は、簡単にこのシステムに移行す
ることが出来るでしょう。


<sect1>無保証
<p>
なるべく、間違いのないように書いたつもりですが、この文書は完全に無保証です。(な
にしろ、筆者は C-News, INN どちらも運用したことがありません。とんでもない間違い
をしている可能性があります。) あなたの責任のもとで利用して下さい。

<p>
筆者の利用している OS は Linux-2.0.29 で、環境は Slackware-3.1 がベースになって
います。この文書中でも、その環境を前提とした書き方をしているかも知れません。その
ような部分は適宜読みかえて利用して下さい。

<p>
間違いの指摘、誤植の連絡、感想、質問などは大歓迎です。


<sect1>再配布について
<p>
この文書は、GNU一般公用許諾書の「バージョン2」或いはそれ以降の適当なバージョ
ンのいずれかを選択して再配布することが出来ます。


<sect1>更新履歴
<p>
この文書は、<url url="http://fjsearch.jaist.ac.jp:8000/cgi-bin/netnews?5iqtm4%2436m%40ns.h.kyoto-u.ac.jp" name="Message-ID: &lt;5iqtm4$36m@ns.h.kyoto-u.ac.jp&gt; の記事">に、頂いたアドバイスなどを加えて加筆訂正したものです。
<itemize>
<item>投稿時の From について加筆した
</itemize>

<p>
さらに、<url url="http://fjsearch.jaist.ac.jp:8000/cgi-bin/netnews?5l434n%24li6%242%40tetoron.imel.kyoto-u.ac.jp" name="Message-ID: &lt;5l434n$li6$2@tetoron.imel.kyoto-u.ac.jp&gt; の記事">に追加訂正しました。
<itemize>
<item>impost に関する記述を加えた
<item>環境変数による誤動作が起こりにくいようにした
</itemize>


<sect1>メンテナンスの放棄
<p>
この文書の最初のバージョンは、1997年5月に書かれました。その頃、私はまだ駆け出し
の Linux ユーザーでした。この2年の間に、Linux と INTERNET を取り巻く環境は劇的に
変化し、PPP などによる間欠接続環境で Linux を使うことはもはや普通になりました。
また、そのような環境でメールやニュースを利用するための Tips も豊富に蓄積されてい
ます。そのため、この文書の必要性はもはや殆んどなくなった、と筆者は考えています。

<p>
従って、筆者はこの文書のメンテナンスを、今後、原則的に放棄します。ただし、この文
書を読まれた方からの明らかな間違いの指摘や改良の提案については、反映を出来る限り
続けるつもりです。また、この文書のメンテナンスを引き継いでくださる方がいらっしゃ
れば、喜んでこの文書を提供したいと思います。



<sect>用意するもの
<p>
以下のソースが必要です。
<itemize>
<item>gn-1.35.tar.gz
<item>nntp-1.5.11tp-linux.tgz
</itemize>
gn のホームページは、<url url="http://www.omronsoft.co.jp/~yamasita/gn/"
name="http://www.omronsoft.co.jp/~yamasita/gn/">です。nntp-1.5.11tp は、sunsite 
の <tt>Linux/system/daemons</tt> で見つかるでしょう。日本国内では、<url
url="ftp://ftp.spin.ad.jp/pub/Linux/system/daemons/"
name="ftp://ftp.spin.ad.jp/pub/Linux/system/daemons/"> などでミラーされています。
<newline>
&lsqb;注. gn の最新バージョンは 1.40 になっています。この文書に記述されている方
法でインストールすることも、まだ出来るようですが、より簡易な方法が提供されていま
す。詳細については、付属ドキュメントを参照してください。&rsqb;



<sect>news ユーザーの作成
<p>
この文書で紹介するニュースシステムは、news ユーザーの権限で実行することを想定し
ています。ユーザー news が存在しない場合は作成するか、適当に読みかえて下さい。た
だし、環境変数 NNTPSERVER, NEWSLIB, NEWSSPOOL が全体の設定に矛盾しないよう気をつ
けて下さい。私の <tt>/etc/passwd</tt> では、次のようになっています。
<code>
news:*:9:13:news:/usr/lib/news:
</code>

<p>
特に、既に gnspool を使っている人は要注意です。gnspool を root 権限で実行してい
た場合は、スプールディレクトリや active, history といったファイルの所有者を
news.news に変更しておく必要があります。
<code>
chown -R news:news /usr/lib/news
</code>



<sect>gnspool
<p>
この章では、gnspool のインストール、記事の取り込みの設定について解説します。既に、
gnspool を使っている人は、適当に読み飛ばして下さい。


<sect1>インストール
<p>
適当なディレクトリに、gn-1.35 のソースを展開します。Linux 用の Makefile は、
<tt>gn-1.35/mkfiles/unix/linux</tt> という名前で用意されていますので、コピーして
下さい。

<p>
gn の config プログラムは、インストール先のディレクトリをチェックしますので、先
に必要なディレクトリを作っておきます。
<code>
mkdir /var/spool/news
mkdir /usr/lib/news
mkdir /usr/lib/news/bin
mkdir /usr/lib/news/man
</code>

<p>
次に、<tt>gn-1.35/src/</tt> に移動して <tt>configur</tt> を実行します。

<p>
<tt>configur</tt> の実行時にインストール先などの指定を求められます。私は次のよう
にしました。
<code>
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
</code>

<p>
また、これらの設定は <tt>site.def</tt> を変更することによっても変更できます。が、
<tt>site.def</tt> を変更した後は、必ず、<tt>configur</tt> を再実行しましょう。

<p>
この後、<tt>make ; make install</tt> すれば、必要なファイルがインストールされる
はずです。



<sect1>ニュースを取り込むための設定
<p>
次のような内容の <tt>/usr/lib/news/.gnrc</tt> を作成します。<tt>.gnrc</tt> の設
定法の詳細については、gn(1) を参照して下さい。
<code>
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
</code>
この指定は、fj.os.linux のみを取り込むという指定です。この指定によって、ニュース
サーバー上に存在する f.o.l の記事が全てスプールに取り込まれます。NAME,
DOMAINNAME, AUTHOR_COPY 等の指定は、ニュースに投稿する際に必要になります。初回の
起動時は、大量の記事を取り込むためかなり時間がかかるので、注意して下さい。設定が
終ったら、
<code>
su news -c "/usr/lib/news/bin/gnspool -g -h news.server"
</code>
とコマンドを入力します。このコマンドによって、<tt>/var/spool/news</tt> の下に記
事が取り込まれ、<tt>/usr/lib/news/active</tt> が生成されているはずです。

<p>
誤動作を避けるため、NNTP Server はコマンドラインで明示的に指定して下さい。
gnspool は、<tt>.gnrc</tt> の設定よりも環境変数 NNTPSERVER を優先します。さらに、
su コマンドは現在の環境変数を引き継ぎます。従って、環境変数 NNTPSERVER が設定され
ている状態で上記のコマンドを発行すると、意図しない NNTP Server に接続することがあ
り得ます。次のスクリプトを用いると gnspool に <tt>.gnrc</tt> の指定を強制させるこ
とができます。
<code>
#!/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
</code>
環境変数 NEWSLIB, NEWSSPOOL の設定も加えてありますが、これはおまじないみたいなも
のです。

<p>
<tt>/usr/lib/news/.gnrc</tt> に次の設定を加えると、上流のニュースサーバーでキャ
ンセルされた記事がローカルスプールに存在する場合、その記事を消去するようになりま
す。
<code>
REMOVE_CANCELED 1
</code>
すなわち、上流ニュースサーバーによってコントロールメッセージや Expire:,
Supersedes: などのヘッダが処理された結果に追随します。

<p>
ただし、上流ニュースサーバーの expire 期限が経過した後もローカルの記事を残してお
きたい場合には、この方法は使えません。

<p>
Message-ID による検索ができるようにするには、<tt>/usr/lib/news/.gnrc</tt> に、
<code>
USE_HISTORY     1
</code>
という行を加えて下さい。この行を加えると、<tt>/usr/lib/news/history</tt> が生成
されるようになります。




<sect>nntpd
<p>
この章では、nntpd のインストール、設定、gnspool, gninews との連係について解説し
ます。


<sect1>インストール
<p>
適当なディレクトリに nntpd のソースを展開します。

<p>
まず、<tt>nntp.1.5.11t/common/conf.h</tt> を編集します。特にディレクトリ関係の設
定は、gnspool での設定と矛盾しないようにしなければなりません。私は次のようにしま
した。
<code>
#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"
</code>

<p>
デフォルトでは dbz ライブラリを使うようになっているのを、dbm ライブラリを使うよ
うに変更しています。dbz ライブラリのある人は、そのままで構いません。変更した場合
は、<tt>Makefile</tt> も変更します。

<p>
デフォルトでは <tt>/etc/uucpname</tt> を参照してホストの名前を解決するようになっ
ていますから、gethostname() を使って解決するように変更しました。

<p>
編集が終ったら、<tt>make server</tt> を実行して nntpd を生成して下さい。私のとこ
ろでは <tt>nntp.1.5.11t/server/timer.c</tt> に変更が必要でした。124行目の 
select() 関数がおかしいといわれたので、
<code>
#if 1 /* Was EXECLAN */
    n = select(fileno(stdin) + 1,&amp;readfds, (fd_set*)0, (fd_set*)0, timeout);
#else
</code>
と変更しました。

<p>
次に、root になって <tt>/usr/sbin/</tt> に nntpd をコピーします。



<sect1>ニュースを読むための設定
<p>
<tt>/etc/inetd.conf</tt> を修正して、nntpd が起動されるようにします。次の1行を付
け加えるか、修正して下さい。
<code>
nntp    stream  tcp     nowait  news    /usr/sbin/tcpd  nntpd
</code>

<p>
次に、<tt>/usr/lib/news/nntp_access</tt> を作成します。このファイルで、nntp によ
るアクセスを許可するホストを設定しています。とりあえずは、次のような設定でよいで
しょう。
<code>
default      no    no
localhost    read  post
</code>

<p>
ここまでの設定でニュースを読めるようになっているはずです。環境変数 NNTPSERVER を 
localhost に設定して mnews などで読んでみましょう。

<p>
読めなかった場合は、<tt>telnet localhost nntp</tt>として、反応を見て下さい。
"Can't talk to you" といわれた場合は <tt>nntp_access</tt> の設定が間違っています。
<tt>/var/log/messages</tt> や <tt>/var/log/syslog</tt> にエラーの情報が残ってい
ると思いますので、参考にして下さい。



<sect1>ニュースを投稿するための設定
<p>
次のような内容のスクリプト <tt>/usr/lib/news/inews</tt> を作成します。
<code>
#!/bin/sh
/usr/lib/news/bin/gninews
</code>

<p>
これだけで、投稿できるようになっているはずです。ニュースリーダーから投稿のテスト
をして下さい。すると、<tt>/var/spool/news/news.out/gn??????</tt> というファイル
に投稿した記事がスプールされているはずです。次に、
<code>
su news -c "gnspool -py -h news.server"
</code>
を実行すれば、実際にニュースサーバーに記事が投稿されます。(この場合も、NNTP
Server は明示的に指定して下さい。)



<sect1>From: 行について
<p>
gnspool で記事を投稿する場合、スプール時の From: は無視され、.gnrc の設定
を用いて次のように変更されます。
<newline>
&lsqb;注. gn-1.40 からスプール時の From: を使うように gnspool に強制することが出
来るようになりました。gn(1) のオプション SUBSTITUTE_HEADER についての説明を参照
してください。このオプションを適切に設定すると、後述の impost に頼らずに From: 
を使い分けることができます。&rsqb;

<code>
From: news@mydomain.or.jp (Hoge Hoge)
</code>

<p>
名前とドメイン名は <tt>.gnrc</tt> の設定が使われ、gnspool を実行しているアカウン
ト (news) と組み合わせて、From: が生成されるようになっています。従って、送信者を
明示したい場合は、Sender: や Reply-To: などのヘッダを利用して下さい。

<p>
news@mydomain.or.jp が、自分とは関係ない人のメールアドレスとなって都合が悪い場合
には、環境変数 LOGINNAME が利用できます。例えば、次のようなスクリプトを用いると、
<code>
#!/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
</code>
アカウント名の代わりに環境変数 LOGINNAME が使われ、
<code>
From: hogehoge@mydomain.or.jp (Hoge Hoge)
</code>
とすることができます。



<sect1>impost の利用
<p>
どうしても From: を使い分けたい場合には、impost という Perl のスクリプトがありま
す。gnspool の代わりに投稿用のスクリプトとして使えば、スプールした時の From: を
使って投稿することが出来ます。最新バージョンは 0.99i で、<url
url="ftp://falcon.econ.kyoto-u.ac.jp/pub/dist/impost/"
name="ftp://falcon.econ.kyoto-u.ac.jp/pub/dist/impost/"> で手に入ります。
<newline>
&lsqb;
この項は fj.os.linux に投稿された次の記事を参考として書かれました。
<itemize>
<item>Message-ID: &lt;5lh4km$s68$1@horse.fsinet.or.jp&gt;
<item>Message-ID: &lt;5lid4e$gvj$1@horse.fsinet.or.jp&gt;
</itemize>
おおつかさんに感謝します。
&rsqb;

<p>
実際に impost を使う手順について解説します。impost を 
<tt>/usr/lib/news/bin/</tt> にコピーして下さい。その時、先頭行の perl のパスをシ
ステムに合わせて変更し、実行許可属性を与えておきます。次に、環境設定ファイル 
<tt>/usr/lib/news/.impostrc</tt> を用意します。私は次のような内容にしました。

<code>
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
</code>

<p>
<tt>/usr/lib/news/inews</tt> を変更して、gninews の代わりに impost が起動される
ようにしておきます。

<p>
ニュースリーダーとして mnews を利用している場合、メッセージに Path: ヘッダが付加
されますが、impost は Path: のついているメッセージを invalid なものと見なします。
これを回避するため、impost の275行目付近の
<code>
 &amp;&amp; !&amp;header_value("Path")
</code>
という行をコメントアウトしておきます。

<p>
これで準備できたはずです。テスト投稿をしてみましょう。オフラインの状態で投稿する
と、<tt>/usr/lib/news/.imqueue/</tt> というディレクトリに記事がスプールされます。
その後、
<code>
su news -c "/usr/lib/news/bin/impost -config post"
</code>
というコマンドを発行すると、実際に記事が送信されます。

<p>
上記の設定で impost を利用した場合、ヘッダは次のようになります。

<code>
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
</code>

<p>
この内、Organization:, Originator:, X-Dispatcher:, Lines: の各ヘッダが impost に
よって付加されたヘッダです。From: には記事で指定した From: が使われ、Originator: 
によって投稿した人が確定されます。

</article>
<!--
Local Variables:
mode: yasgml
coding: euc-jp
fill-column: 80
End:
-->