[PREVIOUS CHAPTER] [NEXT CHAPTER]

4 内部構造

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

    4.1	ＭＬで使えるコマンドを増やすor減らす
    ../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.
    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 コマンド各論

[PREVIOUS CHAPTER] [NEXT CHAPTER]