INND(8)

名前
innd, inndstart - InterNetNews デーモン

形式
innd [ -a ] [ -c days ] [ -d ] [ -f ] [ -i count ] [ -o count ] [ -l size ] [ -m mode ] [ -n flag ] [ -p port ] [ -r ] [ -s ] [ -S host ] [ -t timeout ] [ -u ] [ -x ] [ -L ] [ -H count ] [ -T count ] [ -X seconds ] inndstart [ flags ]

機能説明
InterNetNews デーモンである innd はすべての NNTP の接続要求を処理します。 innd は active(5)、 newsfeeds(5)、 hosts.nntp(5) ファイルをメモリ内に読み込みます。 innd は他サイトから記事を受け取るために NNTP ポート(``-p'' オプションを参照してください)と、 nnrpd(8) や rnews(1) で使用する UNIX ドメインのストリーム型のソケットと、 サーバにいくつかの処理を行わせるための ctlinnd(8) で使用する UNIX ドメインのデータグラム型のソケット をオープンします。 また、 history(5) データベースや標準出力と標準エラー出力を置き換えるために二つのログファイルもオープンします。

ファイルやソケットをオープンすると、 innd は select(2) やノンブロッキング I/O を使用して接続やデータが来るのを待ちます。 データが無ければ、メモリ上のデータをフラッシュします。 フラッシュまでのデフォルトのタイムアウトの時間は、 300 秒 です。

active ファイル、記事ファイル、あるいは history データベースを書き込もうとして、 innd が ENOSPC のエラー( intro(2) を参照してください)を受けると、自分自身に対して ``throttle'' コマンドを送ります。 これは、ファイルを書き込もうとして非常に多くの I/O エラーを受けても同様です。

サーバはサブプロセスを 値 4 の nice(2) で起動します。

オプション

-p  ``-p'' オプションを使用すると、指定したファイルディスクリプタを NNTP ポートとします。 (このオプションを使用すると、 innd は適切な権限で起動しているものとしているため作成するファイルやディレクトリに対して chown(2) することはありません。)

-t  flush までのタイマの期間を timeout秒 にします。

-i  入力の NNTP の接続数を制限するためには、``-i'' オプションを使用します。 0 の値を指定すると、この制限はなくなります。 デフォルトでは 50 です。

-o  配送出力用に同時にオープンできる上限のファイル数を制限するためには、``-o'' オプションを使用します。 デフォルトでは利用可能なディスクリプタのうちあらかじめ内部で使用するディスクリプタ数を除いた数です。

-l  記事の大きさを制限するには、``-l'' オプションを使用します。 このオプションを使用すると、 size バイトより大きい記事は拒否されます。 0 を使用した場合、チェックは行いません。

-c  innd は記事があまりにも古ければその記事は拒否します。 この処理は history データベースで制御することもできますが、 非常に古い記事をネットワーク上に吐き出すようなサイトも時にはあります。 ``-c'' オプションを使用すればこのためのカットオフを指定することができます。 例えば、``-c 21'' では 21 日より前にポストされた記事は拒否します。 0 の値を指定すると、この制限はなくなります。 デフォルトでは 14 日です。

-d -f
    innd は通常、標準出力と標準エラー出力をログファイルに設定し、ターミナルから切り離して、 バックグラウンドで動作します。 ``-d'' オプションを使用するとログファイルへの設定やターミナルからの切り離しをするようなことはしなくなり、 ``-f'' オプションではサーバは単にフォアグラウンドで動作するようになります。

-u  通常、ログはバッファリングされます。 ``-u'' オプションを使用するとバッファリングしないようになります。

-m  サーバを pause あるいは throttle 状態( ctlinnd(8) を参照してください)で起動するには ``-m'' オプションを使用して起動初期のモードを指定してください。 引数は、 g 、 p 、 t のいずれか一文字で、それぞれ ``go''、``pause''、``throttle'' コマンドになります。

-r  ``-r'' オプションを使用すると、``renumber'' コマンドを受けた場合のようにサーバは起動時に active ファイルのリナンバリングを行います。

-s  ``-s'' オプションを使用すると、 innd は newsfeeds ファイルのシンタックスをチェックする以外何も行いません。 エラーがある場合にはエラーステータスとともに終了します。 具体的なエラーは syslog(3) 経由で報告されます。

-n  ``-n'' オプションを使用すると、サーバが pause あるいは throttle した場合に、 それ以後ニュースリーダプロセスを起動するかどうかを指定します。 ``y'' という値ではサーバが正常な状態にのみニュースリーダプロセスを起動しますが、 ``n'' という値ではサーバの状態にかかわらずニュースリーダプロセスを起動します。 デフォルトではサーバの状態にかかわらずニュースリーダを起動します。

-S  ``-S'' オプションを使用すると、 innd は ``slave'' モードで起動します。 slave で起動すると、サーバは指定した host からのみ記事を受け取り、この場合後で説明する NNTP での共通拡張の ``xreplic'' を使用しなければいけません。 この host は hosts.nntp ファイルにあるか、``-a'' オプションでサーバを起動する必要があることに留意してください。

-a  デフォルトでは、host が hosts.nntp ファイルになければ、入力コネクションは nnrpd に渡されます。 ``-a'' オプションを使用すると、どのホストも接続でき、記事の配送ができます。

-L  ``-L'' オプションを使用すると、 innd はクロスポストされた記事に対するリンクは作成しません。 配送のみ行うサイトではパフォーマンスを向上させるためにこのオプションを使用することができます。 あるいは、innd での処理からリンクの作成に関する遅延を少なくするために、 crosspost(8) への channel feed と組み合わせることもできます。

-C  ``-C'' オプションを使用すると、 innd はキャンセルや Supersedes の記事を受け取り、伝搬はしますが、実際には処理しません。 これは不正なキャンセルを注視したり、 より優れた他の認証によるキャンセル機構を使用したいサイトのためのものです。

-H -T -X
    ``-H''、``-T''、``-X'' オプションを使用すると、 一分間に許可するコネクション数を制御します。 この機能はサーバに一分間に非常に大量にコネクションをするようなニュースリーダからサーバを保護するためのものです。 この問題に遭遇するまでこの機能を使用する必要はおそらくないでしょう。 これをチェックするために使用するテーブルは 128 エントリに固定されていて、リング状に使用します。 この大きさはインデックスの計算を容易にし、 領域を使い果たすことはまずないように選択されています。 実際、どのような場合でもテーブルの半分も使うようなことがあるのかは疑問です。

    ``-H'' オプションは、あるニュースリーダからサーバへの ``-X'' で指定した秒数間に許可するコネクション数を制限します。 デフォルトでは 2 です。

    ``-T'' オプションは、すべてのニュースリーダからの innd への ``-X'' で指定した秒数間に許可するコネクション数の総計を制限します。 最大数は 128 です。 デフォルトでは 60 です。

    ``-X'' オプションは ``-H'' と ``-T'' オプションで使用する秒数を指定します。 0 を指定するとこれらのオプションでのチェックは行いません。 デフォルトでは 0 です。

inndstart は NNTP ポートをオープンし、ユーザ ID とグループ ID をニュース管理者に設定し、 innd を ``-p'' オプションと安全な最低限の環境を設定して起動する小さなフロントエンドプログラムです。 このプログラムは小さく、理解が容易なフロントエンドプログラムとなっていて、 innd を root 権限で起動したくないサイトで使用することができます。

コントロールメッセージ
受け取った記事で、Control ヘッダあるいは、``cmsg '' の 5 文字で始まる Subject ヘッダは コントロールメッセージ と呼ばれます。 キャンセル以外のコントロールメッセージの処理は /usr/news/bin/control ディレクトリにある外部プログラムにより実装されています。 (キャンセルは history データベースを更新するため内部的に処理されなければいけません。 外部で処理を行うとすれば、多くのキャンセルを受け取ると、sync、ロック、 アンロックに必要なコストが非常にかかることになります。)

コントロールメッセージを受け取ると、cancel 以外のヘッダの最初のキーワードを小文字に変換し、 実行すべきプログラム名として使用します。 実行すべきプログラムが存在していなければ、 default が実行されます。

すべてのコントロールメッセージは四つの引数とともに実行されます。 第一引数はコントロールメッセージをポストした人の E-mail アドレスです。 これは Sender ヘッダの内容を使用します。 このヘッダが無い場合、From ヘッダの内容を使用します。 第二引数はリプライを送る場合の E-mail アドレスです。 これは Reply-To ヘッダの内容を使用します。 このヘッダが無い場合、ポストした人の E-mail アドレス(From ヘッダの内容)を使用します。 第三引数は記事のニューススプールからの相対パスのファイル名です。 第四引数は Path ヘッダに表れている記事を送ってきたホスト名です。

コントロールメッセージの配布をどこに配送するのかは通常の記事とは異なります。

コントロールメッセージは通常 control というニュースグループのファイルとしてスプールされます。 これはコントロールメッセージのコマンドをもとにサブグループにスプールすることもできます。 例えば、newgroup のコントロールメッセージは control.newgroup というニュースグループが存在すればそこにスプールされ、存在しなければ control にスプールされます。

明示的に ``control'' ニュースグループを配送ニュースグループリストに指定する かもれしれませんが、通常はこれを除外するのがベストです。 ニュースグループ名の最後の 4 文字が ``.ctl'' となっているコントロールメッセージがポストされると、 そのサフィックスが除外されたものがニュースグループ名として使用されます。 例えば、``news.admin.ctl'' にポストされたキャンセルは ``control'' あるいは ``news.admin'' を配送ニュースグループとしてあるすべてのサイトに送られます。 newgroup や rmgroup のコントロールメッセージはさらに特殊に扱われます。 コントロールメッセージに Approved ヘッダが付いていて、 作成あるいは削除されるニュースグループに投稿されていれば、 そのニュースグループが配送ニュースグループとなっているすべてのサイトに送られます。

プロトコルの差異
innd では RFC 977 で定義されている NNTP コマンドを実装していますが、次のような差異があります。

1.  ``list'' にはオプションで ``active'' 、 ``active.times'' 、 ``newsgroups'' あるいは ``subscription'' という引数を続けることができます。 しかし、この NNTP での共通拡張はニュースリーダでは十分なサポートはできていません。 これについては、 nnrpd(8) も参照してください。

2.  ``authinfo user'' と ``authinfo pass'' コマンドが実装されています。 これは UNIX でのリファレンス実装がもとになっています。 詳細は、internet-draft-barbar-nntp-07.txt を参照してください。

3.  ``mode reader'' という新たなコマンドが提供されています。 このコマンドはコネクションをサーバから nnrpd に引き渡します。 ``mode query'' というコマンドは将来使用されることを意図していますが、現状では同じように扱われます。

4.  ``xreplic news.group/art[,news.group/art]'' という新たなコマンドが提供されています。 これは、コマンドにデータが続く以外は ``ihave'' コマンドと同じ(レスポンスコードも同じものが使用されます)です。 データは一つのコンマで区切られるエントリから構成されています。 各エントリはニュースグループ名、スラッシュ、記事番号で構成されます。 このデータが処理される場合、記事がコマンドで指定されるニュースグループと記事番号でスプールされます。

5.  ``xpath messageid'' という新たなコマンドが提供されています。 サーバは、223 のレスポンスコードとスペースで区切られた、 記事がスプールされているファイル名で応答します。

6.  その他実装されているコマンドは、 ``head'' 、 ``help'' 、 ``ihave'' 、 ``quit'' 、 ``stat'' 、 ``xbatch'' 、 ``check'' 、 ``takethis'' です。

ヘッダの変更
innd は記事のヘッダの変更については、変更した方がよい場合以外はできるかぎり行いません。

次のヘッダが付いていれば削除します。
    Date-Received
    Posted
    Posting-Version
    Received
    Relay-Version
空のヘッダやホワイトスペースだけのヘッダも削除されます。

( inn.conf(5) の ``pathhost'' で決まる)ローカルサイト名と ``!'' が Path ヘッダの先頭に付け加えられます。

Xref ヘッダは削除されます。 記事がクロスポストされていれば新たにヘッダが生成されます。

Lines ヘッダがなければ追加します。

innd は正しくないヘッダを書き換えることはしません。 例えば、正しくない Lines ヘッダを書き換えることはしませんが、その記事は拒否します。

ログ
innd はログファイルにすべての入力記事についてのログを出力します。 これはスペースで区切られた可変フィールドを持つ、 次のフォーマットのうちのいずれかのテキストファイルです。
    mon dd hh:mm:ss.mmm + feed <Message-ID> site...
    mon dd hh:mm:ss.mmm j feed <Message-ID> site...
    mon dd hh:mm:ss.mmm c feed <Message-ID> site...
    mon dd hh:mm:ss.mmm - feed <Message-ID> reason...
最初の三つのフィールドは記事を受け取ったミリ秒単位の日時です。 第五フィールドは記事を送ってきた(Path ヘッダから得た)サイトで、 第六フィールドは記事の Message-ID です。 この二つはその情報が得られなければ ``?'' となります。

第四フィールドは記事が受け取ったかどうかを示します。 ``+'' の場合、記事は受け取られています。 ``j'' という文字の場合、記事は受け取られていますが、記事のニュースグループのすべてが active の flags で ``j'' となっていて、そのため記事は ``junk'' というニュースグループにスプールされます。 第四フィールドが ``c'' という文字の場合、 キャンセルする記事が到着する前にキャンセルを受け取っています。 先頭からの三行については、記事は受け取っていて、 記事はスペースで区切られるサイトから構成される ``site...'' の各サイトに送られます。

第四フィールドが ``-'' の場合、記事は拒否されています。 拒否の理由は次のうちのいずれかとなっています。
    "%s" header too long
    "%s" wants to cancel <%s> by "%s"
    Article exceeds local limit of %s bytes
    Article posted in the future -- "%s"
    Bad "%s" header
    Can't write history
    Duplicate
    Duplicate "%s" header
    EOF in headers
    Linecount %s != %s +- %s
    Missing %s header
    No body
    No colon-space in "%s" header
    No space
    Space before colon in "%s" header
    Too old -- "%s"
    Unapproved for "%s"
    Unwanted newsgroup "%s"
    Unwanted distribution "%s"
    Whitespace in "Newsgroups" header -- "%s"
上記の ``%s'' は、より詳細な情報に置き換わります。

innd では syslog により、広範囲に渡るログを行います。 (``connected'' のように)ログがサイト固有の場合、ログの最初のキーワードはサイト名になります。 read エラーが起きた場合のようにログがサーバ自身に関したものの場合、最初のキーワードは ``SERVER'' になります。

二番目のキーワードが ``cant'' の 4 文字の場合は、エラーログです。 この場合、その次の二つのキーワードはエラーとなったシステムコールあるいはライブラリと処理が行われた対象になります。 残りのキーワードには、その他の情報が含まれます。

これ以外の場合ログは、二番目のキーワードはその状況の内容をまとめたものとなり、 残りのキーワードには詳細な情報が含まれます。 ``internal'' というキーワードは通常、内部の論理的なエラーを示しています。

履歴
InterNetNews 用に Rich $alz <rsalz@uunet.uu.net> により記述されました。

関連項目
active(5)、 ctlinnd(8)、 crosspost(8)、 dbz(3)、 history(5)、 hosts.nntp(5)、 inn.conf(5)、 newsfeeds(5)、 nnrpd(8)、 rnews(1)、 syslog(8)