  Offline-News-mini-HOWTO
  土屋 雅稔 <tsuchiya@pine.kuee.kyoto-u.ac.jp>
  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 <http://www.omronsoft.co.jp/~yamasita/gn/> + gnspool

  o  slrn <http://space.mit.edu/~davis/slrn.html> + slrnpull

  o  Gnus <http://www.gnus.org/> + gnus-offline

     また、各種のニュースリーダーと gnspool を組合わせる方法も有力です。
     そのような組合わせとしては、

  o  mnews + gnspool

  o  Gnus + gnspool

     などがあります。これらの方法については、gn の付属ドキュメントに詳細
     な情報が記述されていますから、参考にして下さい。

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

  では、ニュースを購読する複数の人が存在する、または、ニュースを購読する
  マシンが複数存在する場合にはどうするべきでしょうか。その場合は、第一に
  leafnode の利用を考慮するべきです。参考になりそうな URL を以下に列挙し
  ておきます。

  o  Leafnode <http://wpxx02.toxi.uni-
     wuerzburg.de/~krasel/leafnode.html>

  o  News Leafsite mini HOWTO <http://www.linux.or.jp/JF/JFdocs/News-
     Leafsite.html>

  さて、本当にこの文書を読むべき人は、どのような人でしょうか。

  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> の記事
  <http://fjsearch.jaist.ac.jp:8000/cgi-bin/netnews?5iqtm4%2436m%40ns.h.kyoto-u.ac.jp>に、
  頂いたアドバイスなどを加えて加筆訂正したものです。

  o  投稿時の From について加筆した

  さらに、Message-ID: <5l434n$li6$2@tetoron.imel.kyoto-u.ac.jp> の記事
  <http://fjsearch.jaist.ac.jp:8000/cgi-bin/netnews?5l434n%24li6%242%40tetoron.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/
     <http://www.omronsoft.co.jp/~yamasita/gn/>です。nntp-1.5.11tp
     は、sunsite の Linux/system/daemons で見つかるでしょう。日本国内で
     は、ftp://ftp.spin.ad.jp/pub/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/
  <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: によって投稿した人が確定されます。

