                コマンドについて

------------------------------------------------------------
I	overview

1	概要
1.1	コマンドの一覧
1.2	特定のコマンドだけを許す
1.3	特定のコマンドだけを使用不能にする
1.4	自分自身でカスタマイズしたコマンドを定義する
1.5	members 
1.6	ファイルを送る (makefml)
1.7	ファイルを送る (admin コマンド)

2	事例集
2.1	メンバーを問わずファイル uja を送り返す例
2.2	自動送り返しサーバの実装例
2.3	新しく『特定のファイルを送り返す』コマンドを作る
2.4	Get以外のCommandで MLとは別のファイルを取り出すようにするには
2.5	get 100 とコマンドを おくるとマルチパート形式で100番の記事がおくられる

3	コマンドの動作
3.1	一つのメールで使えるコマンドの数の上限
3.2	間違ったコマンドを送ってきた人への警告
3.3	もし有効なコマンドが一つもないメールが来たら？
3.4	コマンドの終り(シグニチャア対策)

II	内部構造他

4	内部構造
4.1	ＭＬで使えるコマンドを増やすor減らす
4.2	ハッシュ %Procedure の特殊なキー
4.3	コマンドの # syntax 

III	コマンド各論

5	library コマンド
5.1	library コマンド
5.2	メンバーリストファイルの拡張について (libmember_name.pl)
5.3	Traffic を調べる (libtraffic.pl)
5.4	traffic で 複数のアドレスを持つ人物を同一視してカウントする 技

6	whois (local whois-like database)
6.1	Introduction
6.2	Whois コマンド
6.3	Whois の変数
6.4	Whois と答えの日本語文字コード変換

7	その他
7.1	index コマンド
7.2	qmail でだけ使える拡張 (アドレス自体がコマンド名になる場合)
------------------------------------------------------------


I	overview
1	概要

コマンドとは「メールでfmlに何かをさせること」です。
	一般ユーザの使うコマンド
と、
	管理者だけが使えるコマンド (リモート管理 => remote_control 1)
というのがあります。

一般ユーザ向けの代表的な機能は

	メーリングリストに入る、抜ける
	あるファイルを見る (例:  サマリをみる )
	過去の記事を取り寄せる

のようなことを指します。

リモート管理: 管理者用のものについては => remote_control 1

1.1	コマンドの一覧

各HOMEディレクトリにある help ファイルを見て下さい:-)

elena ＭＬのヘルプファイルは /var/spool/ml/elena/help
このファイルは

	makefml newml elena 

を実行した時に /usr/local/fml/drafts/help.jp を元にして生成されます。

1.2	特定のコマンドだけを許す
See also: 4.1 

@PermitProcedure で定義を書きます。
@PermitProcedure を使うと自動的に 

	1. 全部のコマンドを使用不能にする
	2. @PermitProcedure で定義されたものコマンドだけを許す

例:
	@PermitProcedure = ('guide', 'summary');

1.3	特定のコマンドだけを使用不能にする
See also: 4.1 

@DenyPrecedure を使います。この配列で指定したコマンド以外は全部使用可
能のままです

例:
	@DenyProcedure = ('get', 'send', 'mget', 'msend');

1.4	自分自身でカスタマイズしたコマンドを定義する
See also: 4.1 

例: 自分で定義した hack コマンドを加える。

	sub myProcHack { なんとかかんとか… }
	%LocalProcedure = ('hack', 'myProcHack');

1.5	members 

Q: members コマンドの結果では # ではじまる行は見えませんか？

A: そうです。余計なものは見せないことになっています。
ちなみに admin members は生のファイルを送り返すのですべて見えます。

1.6	ファイルを送る (makefml)

一応メールを書くのが面倒という場合に makefml で fml.pl のコマンドメー
ルを実行するという技もあります。

	% makefml command ＭＬ名 送りたいメールアドレス fmlのコマンド

です。
例えば、そのメンバー( rudo@nuinui.net )に help を送るには

	% makefml command elena rudo@nuinui.net help

になります。
長ったらしいのであまり便利な気はしません;)
ちなみにこの時 makefml はあたかも
rudo@nuinui.net から help というコマンドメール
が来たかのように fml.pl を実行してメールを送っています。

1.7	ファイルを送る (admin コマンド)

リモート管理の場合は、次のようなコマンドが使えます。

	admin resend help rudo@nuinui.net

注意: これは単に『ファイルを送る』という命令です。
ユーザの使うコマンドのエミュレーションではありません。
変なもの(?)を送らないように注意しましょう。

2	事例集

2.1	メンバーを問わずファイル uja を送り返す例

例:
１	誰からのリクエストでもOK
２	本文にキーワード uja とかくこと

$START_HOOK = q#
    $UJA_FILE = "$DIR/uja";

    if ($Envelope{'Body'} =~ /^[\n\s]*\#\s*uja/) {
	&SendFile($Envelope{'Addr2Reply:'}, "UJA $ML_FN", $UJA_FILE);
	&Log("UJA");
	$DO_NOTHING = 1;
    }
#;

2.2	自動送り返しサーバの実装例

なんのことはない。ガイドファイルに適当なファイルを設定して、config.ph 
で強制的にガイド送り返ししかしないようにしてしまえば終わりですね。

ポイントは、“$START_HOOK にしかける”ってところです。

例:

1	適当なＭＬ(guide ML)を作成する (makefml newml guide)
2	普通に aliases を設定する
3	config.ph に $GUIDE_FILE (guide) の内容をを送り返すなら

	$START_HOOK = q#
		&SendFile($From_address, "Guide $ML_FN", $GUIDE_FILE);
		&Log("Guide request from $From_address");
		$DO_NOTHING = 1;
	#;

を guide ML の config.ph に付け加える。(おわり)

2.3	新しく『特定のファイルを送り返す』コマンドを作る
See also: 4.2 

例: コマンド news でニュースというファイルを送り返す。

config.ph に

%LocalProcedure = (
		    # help for usage of commands
		    'news',	'ProcFileSendBack',
		    '#news',	"$DIR/news",

		);

と書けば news という新しいコマンドのでき上がりです。

2.4	Get以外のCommandで MLとは別のファイルを取り出すようにするには

こんなんかな。"get-etc passwd" を elena-ctl におくると 
/var/spool/ml/elena/etc/passwd が返ってくる。
＃わかるとおり、チェックあまあまですが、まぁ prototype だから

%LocalProcedure = (
		   'get-spool',   'mySendFile',  # $DIR/spool
		   'get-archive', 'mySendFile',  # $DIR/archive
		   'get-etc',     'mySendFile',  # $DIR/etc
		   );

sub mySendFile
{
    local($proc, *Fld, *e, *misc) = @_;

    if ($proc =~ /^get-([a-z]+)$/io) {
	local($dir) = $1;
	if (-f "$dir/$Fld[2]") {
	    &SendFile($to, "Get $dir/$Fld[2] $ML_FN", "$dir/$Fld[2]");
	}
    }
}

2.5	get 100 とコマンドを おくるとマルチパート形式で100番の記事がおくられる

答え: get の時も呼び出す関数を mget の関数にしてしまう。

つまり
1. いつでもmget扱いにして
2. mgetのデフォールトをmpにする

そういうわけで、以下のperlの文をconfig.phへつけたしてみる。

   $MGET_MODE_DEFAULT = "mp";
   %LocalProcedure = ('get', 'ProcMgetMakeList');

(fml-support: 06997)

3	コマンドの動作

3.1	一つのメールで使えるコマンドの数の上限
See also: resource_control 3.1 

一回のメールで使えるコマンドの個数の上限は $MAXNUM_COMMAND_INPUT です。
もし未定義なら無限大です:)。デフォールトは未定義で何個でも書けます。

3.2	間違ったコマンドを送ってきた人への警告

デフォールトでは警告しません。

	$USE_INVALID_COMMAND_WARNING = 1; (default 0)

を設定すると間違ったコマンドへの警告メールをだします。これは signature 
を自動的に付ける設定をしている場合への対処です。一般には exit 等で明示
的にコマンド指定を終わらせるのを推奨するかMUAでシグニチャーを自動的に
つけないようにするのを推奨するのがよいでしょう。

3.3	もし有効なコマンドが一つもないメールが来たら？

ＭＬのメンバーからのリクエストであればヘルプファイルを送り返します。

ＭＬのメンバー以外からのリクエストであればガイドファイルを送り返します。

3.4	コマンドの終り(シグニチャア対策)

	exit 
	end
	quit

というコマンドの行でfmlは処理を中止します。signature があってもいいよ
うに、こうなっています。

II	内部構造他
4	内部構造

%Procedure というのが内部で使っているコマンド定義のハッシュテーブルで
す。このハッシュを操作する手段が以下の配列やハッシュです。

4.1	ＭＬで使えるコマンドを増やすor減らす
See also: remote_control 4.10 

config.ph でコントロールできます。いくつかの変数がありますが、次のよう
に作動します

   1	@PermitProcedure が定義してあるなら
	@PermitProcedure で許しているコマンドだけを設定します。
	もし、定義されていなければデフォールトのすべてのコマンドが
	利用可能になります。
	これらの設定はグローバル変数の %Procedure に定義されます。

   2	%LocalProcedure が定義されているなら
	1 で定義された %Procedure を %LocalProcedure で上書きします。

   3	@DenyProcedure が定義されているなら
	@DenyProcedure のコマンドだけを使えなくする

Example:

	○ guide と summary のみを使用可能、それ以外はすべて使用不可

	@PermitProcedure = ('guide', 'summary');

	○デフォールトに加え自分で定義した hack コマンドも使える

	%LocalProcedure = ('hack', 'ProcHack');

	もちろんこの場合はどこかで sub ProcHack { ...; } があって
	この関数を用意しておく必要がある。

	○デフォールトの中で get 関係は使えなくする

	@DenyProcedure = ('get', 'send', 'mget', 'msend');

	○ メンバーリストなどを取れないようにする

	@DenyProcedure = ('member', 'active', 'members', 'actives', 'status', 'stat');

4.2	ハッシュ %Procedure の特殊なキー

ハッシュ %Procedure には特別な書き方があります。通常は

	ハッシュのキー	値
	----------------------------------------
	コマンド名	関数名

ですが、

	ハッシュのキー	値
	----------------------------------------

	key		Function Name (e.g. ProcHoeHoe)
	#key		file name
	r#key		1 or 0
	r2a#key		1 or 0
	l#key		the maximum request for key in one mail

○ #key はファイルを送り返す関数でのファイル名です。実はファイルを送り
返す関数は共通なので、これを利用すると好きなファイルを送り返す新しいコ
マンドがほいほい作れます。

例: "help" コマンドは $HELP_FILE ("#help"の値) を送り返す。

		    # help for usage of commands
		    'help',	'ProcFileSendBack',
		    '#help',	$HELP_FILE,

Example: add your new command "news" to send back "$DIR/news" file.
See also: 2.3 

%LocalProcedure = ('news',	'ProcFileSendBack',
		   '#news',	"$DIR/news");

○ r#key はこのコマンドを実行したら実行のログをユーザーに送り返します。

例: "off" コマンドではログをユーザーに送り返す。

		    'off',    'ProcSetDeliveryMode',
		    'r#off', 1,

○ r2a#key はこのコマンドを実行したら実行のログを管理者に送り返します。
* If "r2a#key" is defined, FML sends the trace log of the command to
$MAINTAINER. 

例: "bye" や "unsubscribe" のコマンドの実行ログは管理者にも送る。

		    'bye',             'ProcSetMemberList',
		    'r#bye',           1,
		    'r2a#bye',         1,
		    'unsubscribe',     'ProcSetMemberList',
		    'r#unsubscribe',   1,
		    'r2a#unsubscribe', 1,

Ex 2: "chaddr" case.
		    'chaddr',         'ProcSetMemberList',
		    'r#chaddr', 1,

○ l#key

一通のメールの中のコマンド 'command' リクエストを最大でも
$Procedure{"l#command"} 個までに制限する。コマンドごとに制限は変えられ
る。$MAXNUM_COMMAND_INPUT は一つのメールの中のコマンドの合計への制限に
なっている(種別を問わず足し合わせた値)。

例: "get" は１メールで１０個まで

	             'l#get',      10,

4.3	コマンドの # syntax 

デフォールトではポストするＭＬとコマンド用のＭＬは別々に用意されます。
配送用のアドレスとコマンド用のアドレスが同じ場合($MAIL_LIST と
$CONTROL_ADDRESS が同じ場合)に問題となります。

この場合記事とコマンドを見わける必要があります。その切替えのキーワード
が"# syntax"です。これは最初の3行のどこかに "# command(英文字Only)" シ
ンタックスを見つけた場合にコマンドとして認識することで区別しています。

○ # でモードを切替えるのが不必要な場合

makefml が作る listname-ctl アドレスはコマンド専用なので要りません。も
ちろんあっても # 部分は勝手に解釈するのでどっちでも構いません。
Listserv 形式のシンタックスをうけつけるように拡張されたインターフェイ
ス(libexec/fmlserv.pl)を使う場合も無関係です。

“コマンド専用のアドレスにメールが来た場合”は必要がない場合には以下の
ような設定の場合がありえます。

	1. config.ph に $COMMAND_ONLY_SERVER = 1;
	2. fml.pl に --ctladdr がついている
	   (include-ctl はそうなっている)

コマンド専用のアドレスで"# command" も "command" も同じコマンドになり
ます。またコマンドのシンタックスで

	# get 1
	#get 1

は同じです。同様に

	# help
	#help

を同じものにみなします。

	$COMMAND_SYNTAX_EXTENSION = 1;

両方解釈するなら１、"# summary" みたいな形式だけなら０

コマンドはデフォールトで "# get 1" と "#get 1" は同じものとみなしてい
ます。# で始まるか否かだけで判定しています。--ctladdr で fml.pl を呼び
出している場合(例えば include-ctl を使っている場合)は # も必要ありませ
ん。

	$COMMAND_SYNTAX_EXTENSION = 1; (default 1)

がデフォールトです。

III	コマンド各論
5	library コマンド

5.1	library コマンド

library コマンドはＭＬの中に配送されないsubのＭＬを含んでいるような状
態です。次のようなコマンドがあります(help ファイルも見てね)
"library" commands are a sub-mailing list. This command has its own
summary file and archive directories. "put" file is stored in
$LIBRARY_ARCHIVE_DIR ($SPOOL_DIR for ML) and summary file is
$LIBRARY_DIR/summary. The system is closed under $LIBRARY_DIR.
This system uses the same routines as the usual ML. Hence the file
name is number. Also FML does not permit the freedom of file names to
put for security.

	library put	このコマンド以降の部分を記事として保存
	library get 	ファイル名(数字)
	library summary	
	library index	libraryとして蓄えられた記事の
			サマリ・ファイルを送り返します。
	library unlink [番号] 指定番号の記事をライブラリーから削除する
	library delete [番号] 同上
	library rm     [番号] 同上
	library put	put a file (after this line)
	library get 	file to get (number)
	library summary	
	library index	summary file (index file) in library 
	library unlink [number]	remove "number" file in library
	library delete [number]
	library rm [number]

等があります。 削除にあたっては From: のアドレスがそのファイルをかつて
突っ込んだ人と同じである必要があります。

ファイル名が数字なのは一つにはＭＬ本体と全く同じように実装しているから
です。そして security 上ファイル名をユーザが自由に選ぶことはさせません。
やるなら submit した後で管理者が後で名前の変更 rename(2) をするべきで
す。

$DIR の代わりに対応するものとして次のものがが定義されています。

	$LIBRARY_DIR		library コマンドの HOME ($DIRに相当)
	$LIBRARY_ARCHIVE_DIR	library コマンドの SPOOL($SPOOL_DIRに相当)

library コマンドの特定のコマンドを使えないようにするには 
@DenyLibraryProcedure に定義します。シンタックスと理屈は 
@DenyProcudure と同様です。
See also: 4.1 
See also: 4.1 

例: 'library put' を使えないようにする。

	@DenyLibraryProcedure = ('put');

5.2	メンバーリストファイルの拡張について (libmember_name.pl)

1998/01/09 AUTHOR: 福井 誠之 <fukui@sonic.nm.fujitsu.co.jp>

libmember_name.pl は members にメンバー各個人の名前を付加するモジュー
ルです。

この機能を有効にするには、config.ph にて、

      $USE_MEMBER_NAME = 1;

の一行を記述するだけで OK です。既に運用中の ML でも OK です。
makefml config のメニューでもできます。

[機能説明]

  これまでの fml では、メンバー一覧を 'members' コマンドで取り寄せると
メンバー全員のアドレスが返送されてきますが、アドレスだけでは誰が誰なのか
わかりにくい場合がありました。
  このモジュール libmember_name.pl は、その問題を解決するために、各メンバー
の名前 (基本的には、mail の From: ヘッダに書かれている名前(gecos)) を管理
する機能を付加します。
  このモジュールを有効にすることにより、機能が追加・変更される項目を以下
に記述します。

● 自動登録モード

    自動登録時 ('confirm','subscribe' コマンドによる登録も含む) に、
  mail の From: 行に書かれているアドレスが $MEMBER_LIST に追加されますが、
  その際に From: 行に書かれている名前 (gecos) も保存するようになります。

● 'members', 'member' コマンド

    'members', 'member' コマンドによるメンバー一覧の取り寄せで、メン
  バーのアドレスに対応する名前が登録されている場合には、その名前が付加さ
  れて返送されます。

  返送されるメンバー一覧の例 :

	#.FML HEADER
	# NEW FORMAT FOR FURTHER EXTENSION
	# e.g. fukachan@phys r=relayserver m=3u s=skip 
	# r= relayserver
	# m= matomeokuri parameter is time and option
	# s= skip. can post from this address but not delivered here.
	# the same obsolete format is compatible with new format and as follows:
	# e.g. fukachan@phys relayserver matome 3u
	#.endFML HEADER
	yoshio@aaa.co.jp (早乙女 好雄)
	yumi@bbb.ac.jp (Yumi SAOTOME)
	##BYE yuina@ccc.or.jp (Yuina HIMOO)
	・
	・
	・

● 'name' コマンド (新規)

  コマンド文法 : name [新しい名前]

    コマンドを送ってきた者の登録されている名前を [新しい名前] に変更します。
  古い名前が登録されていない場合は、新規に登録されます。
  また、[新しい名前] を省略すると、現在登録されている名前を削除します。

● 'admin name' コマンド (新規)

  コマンド文法 : admin name アドレス [新しい名前]

    リモート管理機能を使用している場合に有効になる、管理者用の名前変更コマ
  ンドです。アドレスを指定することにより、各メンバーの名前を変更することが
  できます。([新しい名前] の取り扱いについては、'name' コマンドと同様)

    この 'name' と 'admin name' コマンドを使用することにより、自動登録
  でない ML や、既に運用されている ML でも、名前の新規登録や変更ができるよ
  うになります。さらに、自動登録時には無条件に gecos が登録されるのとは違
  い、コマンドのオペランドにより自由な名前を登録することができますので、
  例えば、
      - 内輪の ML で、メンバーのニックネームを登録
      - 職場の ML で、名前だけでなく所属も付加して登録
  等の応用ができます。

[技術的補足]

● 名前の管理方法

    表面上は、members ファイル中に書かれている各行のメンバーのアドレスに
  名前が付加されるように見えますが、実際には members-name という別ファイル
  にて、'アドレス 名前' というエントリを記述して、アドレスと名前の対応付け
  をしています。('members' コマンドは members ファイルを返送するのではな
  く、members と members-name をマージしてテンポラリファイルを作成し、それ
  を返送しています)

    また、名前は日本語(2バイト文字) も OK で、途中に空白文字を含んでいても
  かまいません(改行までが名前と認識されるため)。管理ファイルには、強制的に
  JISコードに変換してから書き込まれます。さらに、From: や Subject: ヘッダ
  から名前を得たときには、 $USE_MIME = 1 なら MIME デコードの処理が行われ
  ます。

● 名前管理ファイル members-name のファイル名変更方法

  'members-name' という名前を変更したい場合には、config.ph にて

    $MEMBER_NAME_FILE = "$DIR/〜";

  と記述して変更してください。(〜 : 変更したいファイル名)

● メンバーの名前を得るための関数

  HOOK 処理等で、メンバーの名前を得たいときには、事前に

	&use('member_name');

  をした上で、

	&CheckMemberNameFile(アドレスの文字列)

  を呼び出してください。アドレスに対応する名前が返ってきます。
  名前が登録されていない場合には、'' が返ってきます。

  名前は members-name ファイルに書かれている文字コードがそのままで返って
  きます。基本的に JIS コードのはずですが、members-name を直接編集して
  JISコード以外の文字コードで記述した場合はその限りではありません。

● libmember_name.pl が OVERWRITE しているコマンド・処理

    上記のような方法で、アドレスと名前の対応付けを管理していますので、先の
  機能説明で記述したコマンドに加えて、さらに他のコマンドも libmember_name.pl
  内で追加処理が行われます。
    libmember_name.pl 内で追加処理が実行されるコマンド・処理の一覧を以下に
  記述します。

	- 自動登録処理 ('confirm','subscribe' コマンド含む)
	- 'members','member' コマンド
	- 'bye','unsubscribe' コマンド
	- 'chaddr','change-address','change' コマンド
	- 'admin bye','admin unsubscribe' コマンド
	- 'admin chaddr','admin change-address','admin change' コマンド
	- 'name' コマンド (新規)
	- 'admin name' コマンド (新規)

● 'name', 'admin name' コマンドの &SecureP() 処理のバイパスについて

  fml では、コマンドを処理する際にコマンドラインに不当な文字がないかどうかを
  &SecureP() という関数内でチェックして、不当な文字が含まれていればコマンド
  の実行を却下するようになっています。

  'name','admin name' コマンドで、オペランドに日本語(2バイト文字) を指定
  すると、そのままではこの 2バイト文字が「不当な文字」と認識されてコマンドが
  実行できません。そこで、'name','admin name' コマンドで &SecureP() 処理
  をバイパスするために、libmember_name.pl では %SECURE_REGEXP を定義していま
  す。

  %SECURE_REGEXP を定義して &SecureP() をバイパスしたときの副作用について、
  fukachan に質問してみたところ、

  "Ken'ichi Fukamachi" <fukachan@sapporo.iij.ad.jp> さん wrote:
  |うーん、どうだろ。SecureP とかは汎用なので、あまり緩くできないとおもっ
  |ています。でも特定のコマンドのフレーズを通してもそれが単なる string 操
  |作でしかないのであれば特に変なことはおこらないはずですけどね。だから大
  |丈夫だろうとおもってます。

  とのことです。

5.3	Traffic を調べる (libtraffic.pl)

AUTHOR: yuao@infonia.or.jp (Yuao Tanigawa)

    [libtraffic.pl の説明]
    
      メイルの投稿量の統計をとるコマンドです。
    
      使い方は、
    
    % libtraffic.pl [-n <best?>] [-m <mails>] [-d] [where is summary?]
    
    で、オプションを指定しないで、
    
    % libtraffic.pl
    
    とすると、デフォルトで、カレントディレクトリのsummaryを読んで、
    
    1. 月毎のメイル投稿量
    2. メイル投稿量毎の日数
    3. 時間帯別の投稿量
    4. １日２５通以上投稿があった日
    5. 投稿者ベストテン
    6. １日当たりの平均投稿量と最大投稿量
    
    を出力します。
    
      オプションで、-d を指定すると、さらに、
    
    0. 日毎の投稿量
    
    も得られます。デフォルトでは表示しません。
    
      オプション -n は、5.の投稿量の多い人のベスト何人まで表示するかを
    数字で指定します。デフォルトでは、-n 10 と同じです。
    
      オプション -m は、4.の何通以上あった日を表示するかを数字で指定し
    ます。デフォルトでは、-m 25 と同じです。

5.4	traffic で 複数のアドレスを持つ人物を同一視してカウントする 技

	Author: Yuao Tanigawa <yuao@infonia.or.jp>
	fml-support: 00736
	fml-support: 02578
    > $TRF_NAME_HOOK = q#
    >     $name =~ s/umura@solan\.chu/umura@nn.solan./oi;
    > #;
    > 
    > 　と設定しています。これは
    > 
    >    umura@solan.chu -> umura@nn.solan.
    > 
    > 　という書き換えを行うことになります。
    
      こんな感じで、$name にsummaryに書いてあるアドレスが入っている
    ので、config.ph の中で $TRF_NAME_HOOK にいちいちアドレスを置き
    換えるコードを書いて下さい。あとは、
    
    if ( $name eq 'yuao@drei.mech.' || $name eq 'XN9Y-TNGW@j.asa' ) {
    	$name = 'tanigawa@tribo.';
    }
    
    など、ほんとに、好きなように書いて下さい。同一人物データベースと
    かつくって自動的にやってくれるようなインテリジェントな作りには
    なっていないので、ごめんなさい。(_o_)
    ＃ ということで、メンバ全員、対応させようとすると、本当にシンドイ
    ＃ です。^_^;

6	whois (local whois-like database)

See also: internals 9.2 

whoisはMLローカルに持っているデータベースへのアクセスのことを指してい
ます。が、本もの?のwhoisサーバへリレーすることなどもオプションとして可
能です。コマンドは"whois", "iam", "who"です。コマンドについてはHELPファ
イル参照。

6.1	Introduction

FML の whois コマンドは

1. 本物の whois server とプロセス間通信して内容を送り返す
2. ＭＬローカルに持っているデータベースへのアクセス

の両方を行ないます。切替えはキーワードに -h host があれば 1、そうでな
いなら 2 です。ローカルなデータベースはvar/db/whoisdbです。よって 
whois サーバをあげる必要はありません。

6.2	Whois コマンド

	$USE_WHOIS = 0;	(default 0)

0 なら FML のデフォールト(whoisは使わない) 1 なら使うようになります。
これは基本的なポリシー「明示的に許さない限り機能は増やさない」に沿うも
のです。

ローカルデータベースの形式も本物の任意のwhois serverとの通信をする点に
ついてhmlのwhoisとは全く互換性はありません。
＃ hml は独自に自分だけの whois を抱えていた (なおかつ security hole 
＃ だった)

例1: ローカルなデータベースの中から fukachan を含むデータを探して送り返
す。

   % echo  "whois fukachan" | Mail Elena-ctl@phys.titech.ac.jp

例2: host の whois に聞きにいきます。

   % echo "whois -h host fukachan" | Mail Elena-ctl@phys.titech.ac.jp

6.3	Whois の変数

	$DEFAULT_WHOIS_SERVER (default "localhost")

で デフォールトの whois サーバを変更できます。コマンドの -h オプション
でも変更できます。その場合はコマンドの -h オプションが優先します。

	$WHOIS_DB (default "$FP_VARLOG_DIR/whoisdb")

ローカルにもっているデータベースです。

6.4	Whois と答えの日本語文字コード変換

	$WHOIS_JCODE_P	(default 0)

をセットすると日本語変換をしてから答えを返します。これが toggle flag 
として実装されているのは変な答えを変換しようとして落ちたりすることもあ
りうるようなので、たまにおちるかもしれないRISKを負う覚悟があるか否か？
を表現している toggle です;-)

7	その他

7.1	index コマンド

取り寄せられるファイルの一覧を返します。もし $DIR/index ($INDEX_FILE) 
が存在する場合はそれを使います。そうでない場合は$SPOOL_DIR
@ARCHIVE_DIR の内容を調べて返します。

$INDEX_SHOW_DIRNAME がセットされている時は ($DIR からの相対的な)
directory 階層も表示します。デフォールトではファイル名とそのサイズだけ
です。これ以上細かい制御を行なう場合は $INDEX_FILE を書く方が良いでしょ
う。

7.2	qmail でだけ使える拡張 (アドレス自体がコマンド名になる場合)

makefml が .listname-default というサンプルを作りますが、これを 
/var/qmail/alias に入れてさらに config.ph で

	$USE_DOT_QMAIL_EXT = 1;

を設定すると listname-command のようなシンタックスが使えるようになりま
す。

	send "get 100 " to elena-ctl@baycity.asia

は次のアドレスと同じにできます。

	send "" to elena-get-100@baycity.asia

単に qmail をいじくってるうちにできたのでそのままいれてあります。でも 
mget 100-110 とかはどうしよう:D (getだけは例外にしなきゃだめかのぉ）

またコマンドの - が使えないので

	elena-mget--1-3-mp@DOMAIN 

宛のメールを

	"mget 1-3 mp" 

コマンドと解釈するようにしてあります。


		INDEX

$COMMAND_SYNTAX_EXTENSION                  ...   4.3 
$DEFAULT_WHOIS_SERVER                      ...   6.3 
$INDEX_FILE                                ...   7.1 
$INDEX_SHOW_DIRNAME                        ...   7.1 
index コマンド                             ...   7.1 
$LIBRARY_ARCHIVE_DIR                       ...   5.1 
$LIBRARY_DIR                               ...   5.1 
library コマンド                           ...   5.1 
$MAXNUM_COMMAND_INPUT                      ...   3.1 
$MEMBER_NAME_FILE                          ...   5.2 
signature 対策                             ...   3.4 
traffic コマンド                           ...   5.3 
$USE_INVALID_COMMAND_WARNING               ...   3.2 
$USE_MEMBER_NAME                           ...   5.2 
USE_WARNING                                ...   3.2 
$USE_WHOIS                                 ...   6.2 
whois                                      ...   6 
$WHOIS_DB                                  ...   6.3 
$WHOIS_JCODE_P                             ...   6.4 
コマンドの一覧->helpファイル               ...   1.1 
# コマンド シンタックス                    ...   4.3 
自動送り返しサーバの実装例                 ...   2.2 
