NEWSFEEDS(5)

名前
newsfeeds - 記事の配送の決定

機能説明
/var/news/etc/newsfeeds というファイルにより、受け取った記事をどのように他のサイトに配送するかを指定します。 これは、InterNetNews サーバである innd(8) により、起動時あるいは ctlinnd(8) で指定された場合に解析されます。

このファイルは次のようなルールにしたがった一連の行として解釈されます。 行末がバックスラッシュの場合、 そのバックスラッシュと改行と次の行の行頭の複数のホワイトスペースは削除されます。 これはエントリとして``論理的な''行が構成されるまで繰り返されます。 論理的な行が空行あるいは ``#'' で始まる行は無視されます。

その他の行は配送エントリとして解釈されます。 エントリはコロンで区切られた四つのフィールドで構成されていなければいけません。 そのうちの二つのフィールドはオプションでスラッシュで区切られるサブフィールドを持つことができます。 複数のパラメータを持つフィールドやサブフィールドはコンマで区切られていなければいけません。 ホワイトスペースが入ると問題となるでしょう。 サイト名を除いて、大文字小文字は区別されます。 エントリのフォーマットは次のようになります。
    sitename[/exclude,exclude,...]\
    	:pattern,pattern...[/distrib,distrib...]\
    	:flag,flag...\
    	:param
各フィールドについて次に説明します。

sitename は記事を送ることになるサイト名です。 この名前はログのエントリや記事をサイトにフォワードすべきかどうかを決めるために使用されます。 sitename が記事の Path ヘッダにすでに存在していれば、記事はそのサイトには送られません。 この名前は通常相手サイトを識別するために Path ヘッダで使用していますが、 意味のあるなんらかの名前とすることができます。 (archive や gateway というような名前のように)ローカルな特別なエントリは、 実際のサイト名と同じにならないようにするために ``!'' で終る名前とするべきでしょう。 例えば、``gateway'' はメーリングリストにフォワードするためのローカルなエントリのための名前であるとします。 ``gateway'' という名前のサイトで記事をポストした場合、 ローカルでその記事を受けると、Path ヘッダにその名前を見つけてしまい、自身の ``gateway'' というエントリに記事を送ることはありません。 なお、これについては先で説明する ``Ap'' についても参照してください。 エントリに exclude のサブフィールドがある場合、 exclude で指定する名前が Path ヘッダにある記事はそのサイトには送られません。 exclude には、同じ sitename を複数使用することができます — その名前にかかわらず記事を受け取ることになるサイトのエントリでは適切な処理が行われます — しかし、これは混乱を生じない配送プログラムでのみの使用に推奨されます。 サイト名の大文字小文字は区別されません。

pattern はそのサイトに配送すべきニュースグループを指定するパターンで、そのサイトの ``購読ニュースグループのリスト''を作成するために解析されます。 デフォルトの購読ニュースグループはすべてのニュースグループとなります。 ニュースグループのパターンは、 wildmat(3) 形式のパターンで、 ローカルに受け取ったニュースグループのリストに対して順番に一致させていきます。 パターンの最初の文字が ``!'' の場合、 そのパターンに一致するニュースグループは購読リストから除外され、 そうでなければ一致するニュースグループが購読リストに追加されます。 例えば、すべての ``comp'' と、そのうちの sources では comp.sources.unix のみを配送するためには、 次のような一連のパターンを使用することができます。
    comp.*,!comp.sources.*,comp.sources.unix
この例には三つの留意すべきことがあります。 一つ目は、パターンの最後に ``.*'' が必要であるということです。 二つ目は、繰り返しますが、パターンのうちで最後に一致したものにしたがうということです。 三つ目は、``comp.sources.*'' は ``comp.sources*'' とも記述できますが、 ``comp.sources-only'' というニュースグループの場合には一致しません。

また、購読するニュースグループを禁止する方法もあります。 すなわち、記事が購読するニュースグループにクロスポストされていてもこのニュースグループは配送しないということです。 パターンの最初の文字が ``@'' の場合、そのパターンに一致するニュースグループは クロスポストされたニュースグループが購読することになる記事であっても、 配送されません。 ここでも、パターンのうちで最後に一致した場合にしたがうという同じ処理ルールが適用されます。 例えば、"alt.binaries.warez" というニュースグループに投稿されたすべての記事が他の "alt" のニュースグループや他のニュースグループにもクロスポストされていても配送されないようにするには、 次のような一連のパターンを使用することができます。
    alt.*,@alt.binaries.warez.*,misc.*
alt.* と alt.binaries.warez.* のパターンを逆にすると、``@'' は無効となります。 これは、パターンのうちで最後に一致するものが意味を持つためです。 上記例を使用すれば、一つ以上の alt.binaries.warez.* というニュースグループと misc.test にクロスポストされていても記事は配送されません。

コントロールメッセージの配送の詳細については innd(8) を参照してください。

購読リストはさらに ``distrib'' を指定することによりそのサイトに記事を配送すべきかどうかを変更することができます。 デフォルトではすべての記事をポストされたニュースグループを購読するサイトに配送します。 しかし、記事に Distribution ヘッダがついていて distrib が指定されていれば、次のルールにしたがってチェックされます。

1.  Distribution ヘッダがサブフィールドの値のいずれかに一致すれば、その記事は配送されます。

2.  distrib が ``!'' で始まっていて、Distribution ヘッダに一致すればその記事は配送されません。

3.  Distribution ヘッダがいずれの distrib にも一致せず、``!'' が使用されていなければ、 その記事は配送されません。

4.  Distribution ヘッダがいずれの distrib にも一致せず、distrib が ``!'' で始まっていれば、 その記事は配送されます。

記事の Distribution ヘッダに複数の値を持っていれば、それぞれに上記ルールが適用されます。 指定されている Distribution ヘッダのいずれかの値が記事は配送すべきとした場合は配送されます。 配送すべきでないとした場合、配送されません — 上記ルールは``論理和''として使用されます。 あるサイトへの配送で、``!'' で始まっている distrib とともにそうでないものとを指定するのはほとんどの場合まず間違った設定でしょう。

distrib はテキスト文字であってパターンではなく、 ``*'' あるいは ``all'' のようなものは特別な意味は持ちません。

flag によりさまざまなパラメータを指定します。 これは順番に関係無く指定でき、値を持つ flag にはホワイトスペース無しで flag の直後に値がなければいけません。 flag の値は次のとおりです。

<size
    size バイトより小さい記事のみ、そのサイトに配送されます。 デフォルトでは制限はありません。

>size
    size バイトより大きい記事のみ、そのサイトに配送されます。 デフォルトでは制限はありません。

Achecks
    checks, で指定される条件に一致する記事のみ、そのサイトに配送されます。 この条件はつぎのうちから選択しなければいけません。
    	d	Distribution が存在している
    	p	配送前に Path ヘッダのサイト名を確認しない
    		(exclude のチェックは行います)

Bhigh/low
    サイトへの配送が file、channel あるいは exploder (それぞれこの後の説明を参照してください)の場合、 サーバは通常、できるかぎりすみやかに情報を出力しようとします。 大量の記事が流れ込んできた場合、バッファを使用することで、 システムのパフォーマンスをより向上させ、全体の負荷を均等とさせることができるかもしれません。 この flag の値はスラッシュで区切られた二つの数字でなければいけません。 最初の数字は配送用の I/O バッファの内容を出力し始めることができる値を指定し、 二つ目の数字は出力を停止し、再びバッファリングを開始する値を指定します。 単位はバイトです。 デフォルトではバッファリングを行わず、可能な限りすぐに出力します。

Fname
    この flag により、 サイトへの配送をスプールし始める必要がある場合(この後の説明を参照してください)に使用するファイル名を指定します。 name が絶対パス名で無ければ、 /var/news/spool/out.going からの相対パスとします。 指定したファイル名がディレクトリの場合、そのディレクトリ中の togo というファイル名を使用します。

Gcount
    この flag を指定すると、 count 以下のニュースグループにクロスポストされた記事のみサイトに配送されます。

Hcount
    この flag を指定すると、Path ヘッダでのサイト数が count 以下の記事のみサイトに配送されます。 投稿者の名前をヘッダに入れるサイトもあったり、ヘッダに投稿したホストの名前 を入れるために論理的に一つとされるサイトも二つとなる等、 Path ヘッダの解釈が不正確であるため、 この flag はおおまかな指針としてのみ使用すべきです。 count を指定していない場合のデフォルトの値は 1 です。

Isize
    この flag は file feed の内部バッファの大きさを指定します。 システムで使用可能なファイル数より多くの file feed がある場合、 一番古く使用された順番で内部的にバッファリングされます。 内部バッファが size バイトより大きくなれば、データが適切なファイルに出力されます。 デフォルトの値は (16 * 1024) バイトです。

Nmodifiers
    サイトが受け取るニュースグループを modifiers にしたがって制限し、これは次のうちのいずれかでなければいけません。
    	m	moderated なニュースグループのみ
    	u	moderated でないニュースグループのみ

Ssize
    サイトにキューイングされたデータの量が size バイト以上になると、``F'' flag で指定したファイルあるいは、``F'' flag が指定 していなければ、 /var/news/spool/out.going/ sitename にサーバはスプールしはじめます。 スプールは通常、channel あるいは exlpoder feed でのみ発生します。

Ttype
    この flag はサイトへの feed のタイプを指定します。 type は次のうちのいずれかの文字でなければいけません。
    	c	channel
    	f	file
    	l	log のみ
    	m	funnel (複数の feed エントリを一つにまとめる)
    	p	program
    	x	exploder
    各 feed についての説明は次の feed タイプ のセクションで行います。 デフォルトは Tf です。

Witem
    サイトへの配送が file、channel あるいは exploder の場合、この flag により出力する情報を制御します。 サイトへの配送が program の場合、アスタリスク(``*'')のみ有効です。 item は次のものから構成されます。
    	b	記事のバイト数
    	f	記事のフルパス名
    	g	記事のニュースグループ名:
    		クロスポストされていれば、サイトが受け取る
    		ニュースグループでの最初のニュースグループ名
    	m	記事の Message-ID
    	n	記事のスプールディレクトリからの相対パス名
    	p	記事が投稿された時刻の 1970 年 1 月 1 日
    		00:00:00 UTC からの経過秒数
    s	記事を送ってきたサイトの IP アドレス
    	t	記事を受け取った時刻の 1970 年 1 月 1 日
    		00:00:00 UTC からの経過秒数
    	*	funnel へのそれぞれのエントリ名:
    		あるいは記事を受け取ることになるすべてのサイト名
    	D	Distribution ヘッダの値:
    		存在していなければ ``?''
    	H	すべてのヘッダ
    	N	Newsgroups ヘッダの値
    	O	overview データ
    	R	xreplic で必要な情報
    複数の文字を使用することができこの場合、出力データはスペースで区切られ、 指定された順番となります。 デフォルトでは Wn となります。

    ``H'' および ``O'' item はニュースの overview データベースを作成するプログラムのために使用されます。 ``H'' がある場合、記事のすべてのヘッダが空行に続いて出力されます。 (記事ファイルに無くても) Xref ヘッダおよび、記事の大きさを示す Bytes ヘッダもヘッダとされます。 この item を使用する場合は、単独でのみ使用しなければいけません。 ただし、他の item が前にある場合は、ヘッダの前に改行が出力されます。 ``O'' は overchan(8) への入力を生成します。 この item も単独でのみ使用しなければいけません。

    アスタリスクには特別な意味があります。 この場合、カレントの記事を受け取るすべてのサイトのリストをスペースで区切ったものとなります。 ただし、サイトへのエントリが funnel のターゲット(すなわち、他のサイトのエントリで ``Tm'' flag での funnel の名前)となっていれば、アスタリスクは記事を受け取った 個々の funnel feed のサイト名のリストになります。 program feed のサイトの場合、 param フィールドでのアスタリスクは記事を受け取った個々の funnel feed のサイト名のリストになります。 ``Tm'' による feed でのターゲットとなっていなければ、program feed のサイトではサイト名のリストを受け取ることはできません。

param フィールドの解釈は feed のタイプにより変わり、次の feed タイプ で説明しています。 このフィールドは省略することもできます。

ME という名前のサイト名は特別です。 このエントリは一つのみ存在し、ファイル中の最初でなければいけません。 ME に購読リストがある場合、 このリストは自動的にすべての他のエントリの購読リストの最初に付けられます。 例えば、あるサイトの購読リスト中で明示的に ``foo.*'' を指定しないかぎりローカルの投稿が配送されないようにするために、 ``*,!control,!junk,!foo.*'' をすべてのサイトの初期購読リストに設定することができます。 ほとんどのサイトの購読リストのパターンには ``!junk,!control'' を設定すべきであることに留意してください。 innd(8) の``コントロールメッセージ''での説明を参照してください。 (他のニュースソフトウェアとは違い、このパターンの解釈は受け取った記事のニュースグループとは関係無く、 active(5) ファイルにより行われます。)

ME エントリに distrib のサブフィールドがある場合、distrib リストに一致する記事のみ受け取り、 その他の記事は拒否されます。 例えば、商用ニュースサーバでは、他の誤った設定がされているサイトでのローカルなポストを拒否するために ``/!local'' が設定されるかもしれません。

  FEED タイプ
innd では log、file、program および channel の四つの基本的な feed タイプを提供しています。 exploder は特殊な channel feed タイプです。 さらに、いくつかのエントリを同じ feed にまとめることができます。 これは funnel feed で他のタイプのうちのいずれかの feed となります。 サイトに配送すべき記事の情報を出力しているだけで、 サーバ自身が実際に記事を配送をすることは無いため、 ``feed'' という言葉は技術的には間違っているということに留意してください。

最も簡単な feed タイプは log feed です。 この feed では /var/log/news/news 以外にはデータは出力されません。 これは、ファイルをオープンしない以外は ``Tf'' エントリで /dev/null に出力するのに相当します。

file feed は簡単な feed タイプです。 サイトが記事を受け取ることになる場合、 param フィールドのファイルに一行出力されます。 param が絶対パス名でなければ、 /var/news/spool/out.going からの相対パス名とします。 何も指定されていなければ、ファイル名はデフォルトで /var/news/spool/out.going/sitename となります。 この名前は唯一でなければいけません。

file feed のサイトが flush されると( ctlinnd を参照してください)、次のような順序で処理されます。 flush を行うスクリプトは最初にファイルをリネームしておかなければいけません。 サーバはバッファリングされたデータを出力し、ファイルをクローズします。 リネームされたファイルはこの時点で利用できるようになります。 サーバはオリジナルのファイル名で再びオープンしますが、 これはこの場合にはあらたに作成されることになります。

program feed ではサイトに記事を送る毎にプロセスが起動されます。 param フィールドは sprintf(3) 形式の文字列となっていて、記事のスプールディレクトリからの相対パス名を示す %s というパラメータを一つのみ使用できます。 フルパス名は param フィールドで記事のスプールディレクトリを %s の前に記述することにより取得することができます。 標準入力には記事の内容が設定され、何らかの理由で記事がオープンできなければ、 /dev/null が設定されます。 標準出力と標準エラー出力は /var/log/news/errlog に出力されます。 プロセスは /var/news/run ディレクトリのユーザとグループ ID で起動されます。 innd はコマンドにシェルのメタ文字が含まれていなければ、シェルの起動をしようとはしません。 ただし、コマンドの最後にセミコロンを追加することによってシェルを起動します。 起動するプログラムは絶対パス名で指定しなければいけません。 セキュリティ上、環境変数 PATH はサーチされません。

エントリが funnel のターゲットで、``W*'' flag が使用されていれば、 param フィールドでアスタリスクを一つのみ使用でき、これは funnel feed のサイト名に置き換わります。 エントリが funnel feed でないあるいは、``W*'' flag が使用されていなければ、 アスタリスクは特別な意味を持ちません。

program feed の flush では何も行いません。

channel あるいは exploder feed の場合、 param フィールドは起動するプロセス名になります。 同様に、起動するプロセスは絶対パス名でなければいけません。 サイトに記事を送る場合、プロセスは標準入力から記事に関する情報の一行を読み込みます。 標準出力と標準エラー出力、すべてのサブプロセスのユーザとグループ ID は上記 program feed と同様に設定されます。 プロセスが終了すれば、プロセスは再起動されます。 プロセスが起動できなければ、 /var/news/spool/out.going/sitename というファイルに入力データをスプールします。 そしてしばらく後にプロセスを起動しようとします。

channel あるいは exploder feed が flush されると、サーバはプロセスへのパイプを終了します。 出力されていない待機中のデータはスプールされます。 上記の ``S'' flag の説明を参照してください。 シグナルが送られることはありません。 これは、プログラムが標準入力から EOF を読み込んで、終了するようにしなければいけないためです。 サーバはこの後あらたにプロセスを起動します。

exploder は channel feed のスーパセットです。 channel feed での処理に加えて、exploder ではコマンドラインを送ることができます。 このコマンドラインは ``!'' で始まりますが、その解釈は exploder で行わなければいけません。 次のメッセージはサーバから自動的に生成されます。
    newgroup group
    rmgroup group
    flush
    flush site
このメッセージは ctlinnd による上記と同じコマンドをサーバが受けると送られます。 さらに、任意のコマンドラインを exploder に送るために ``send'' コマンドを使用することもできます。 主要な exploder には buffchan(8) があります。

funnel feed ではいくつかのサイトエントリを単一の出力にマージする方式を提供しています。 funnel feed するサイトでの、 param フィールドは実際に feed を行うエントリの名前となります。

さまざまなタイプの feed の設定の詳細は INN 設定マニュアル Install.ms を参照してください。

設定例
    ##  初期購読リストおよびローカル Distribution の指定
    ME:*,!junk,!foo.*/world,usa,na,ne,foo,ddn,gnu,inet\
    	::
    ##  すべての moderated な source ニュースグループへの
    ##  記事をアーカイブする
    source-archive!:!*,*sources*,!*wanted*,!*.d\
    	:Tc,Wn:/usr/news/bin/archive -f -i \
    	    /usr/spool/news.archive/INDEX
    ##  大きな記事の監視
    watcher!:*\
    	:Tc,Wbnm\
    	:exec awk '$1 > 1000000 { print "BIG", $2, $3 }' >/dev/console
    ##  4K バイトから 1K バイトの大きさの"バッチ"とするための
    ##  UUCP feed
    ihnp4:/world,usa,na,ddn,gnu\
    	:Tf,Wnb,B4096/1024:
    ##  記事をメールで送る: Path ヘッダと重複しないように ! が
    ##  funnel に付けてある
    ##  UUCP アドレスと似ているため、"fred" に ! は使用できない
    fred:!*,comp.sources.unix,comp.sources.bugs\
    	:Tm:mailer!
    barney@bar.com:!*,news.software.nntp,comp.sources.bugs\
    	:Tm:mailer!
    mailer!:!*\
    	:W*,Tp:/usr/ucb/Mail -s "News article" *
    ##  nntpsend あるいは相当するものによる NNTP feed
    feed1::Tf,Wnm:feed1.domain.name
    peer.foo.com:foo.*:Tf,Wnm:peer.foo.com
    ##  リアルタイム配送
    mit.edu:/world,usa,na,ne,ddn,gnu,inet\
    	:Tc,Wnm:/usr/news/bin/nntplink -i stdin mit.edu
    ##  仮想的な NNTP 出力プログラム fanout への feed
    nic.near.net:\
    	:Tm:nntpfunnel1
    uunet.uu.net/uunet:!ne.*/world,usa,na,foo,ddn,gnu,inet\
    	:Tm:nntpfunnel1
    nntpfunnel1:!*\
    	:Tc,Wmn*:/usr/news/bin/nntpfanout
    ##  comp.* と moderated な soc ニュースグループを配送する
    ##  UUCP サイト
    uucpsite!comp:!*,comp.*/world,usa,na,gnu\
    	:Tm:uucpsite
    uucpsite!soc:!*,soc.*/world,usa,na,gnu\
    	:Tm,Nm:uucpsite
    uucpsite:!*\
    	:Tf,Wnb:/usr/spool/batch/uucpsite

最後の二つの組み合わせは funnel feed がどのように使用できるのかを示しています。 例えば、 nntpfanout プログラムは次のような行を標準入力から読み込みます。
    <123@litchi.foo.com> comp/sources/unix/888 nic.near.net uunet.uu.net
    <124@litchi.foo.com> ne/general/1003 nic.near.net
UUCP funnel は一つのみのサイト宛のため、アスタリスクは不要で、 次のようなエントリがファイルに出力されます。
    <qwe#37x@snark.uu.net> comp/society/folklore/3
    <123@litchi.foo.com> comp/sources/unix/888

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

関連項目
active(5)、 buffchan(8)、 ctlinnd(8)、 innd(8)、 wildmat(3)