
		RFC: ドメイン(default + virtual)の操作の統合

[ビジョン]

	利点:
		MLを用意するのに必要な操作のほぼ全部をコマンド
		操作にすることで自動チェックが効く。

		誤操作相談が減る(かも)。

		ひっこしが楽になる(はず)。

		/etc/fml/ と/var/spool/ml/$ml_name/ 以下のファイルについて
		この構成がminimumと言えるか?がこれを実装してみると分かる。

	欠点:	ツールを作る時(最初)だけは気合いが要るねぇ;-)


[重要な変更]

   1. /etc/fml を group writable にしたい(group は fml)。

	root でオペレーションすればいいんだけど、でも、CGIやCUIなどツー
	ル類のことをかんがえると group writable にしておいたほうが楽。
		
   2. ml_home_prefix のディレクトリ群を入れ子にしてはいけない


[使い方]

   0. ml_home_prefix のディレクトリ群を入れ子にしてはいけない
	入れ子にしてしまうとchange*コマンドが使えない

	例: 禁止
		/var/spool/ml			(fml.org)
		/var/spool/ml/nuinui.net	(nuinui.net)	

	例: だから、
		/var/spool/ml/domain_01/
		/var/spool/ml/domain_02/
	    とか
		/var/spool/ml_virtual/domain_01/
		/var/spool/ml_virtual/domain_02/
	    みたいな使い方をして欲しい。

	また、ツールのことを考えると /var/spool/ml_virtual
	(ml_home_prefix の更に親)はユーザ fml グループ fml にしておく
	方が良いとおもう（前述の[重要な変更]の部分にならっている）。

   1. デフォルトドメインしか使わない人

	いままで通りなので、気にしないで〜
	＃ principle of least surprise

   1.1 デフォルトドメインしか使わないが、/var/spool/ml 以外を使いたい
	1.1.1	configure で指定する。
	1.1.2	インストール後、makefml newdomain で設定する。

   2. 複数ドメインを使う可能性を考えている人

	一連の作業がこのように変更される（と予想している）。
	ＭＬの作成は、「ドメインの宣言」＋「ＭＬの作成」の二段階にする。
	＃もちろん「ドメインの宣言」は最初の一回だけです。

	% makefml newdomain fml.org (デフォルトドメインの場合は省略可)
	% makefml newml elena もしくは makefml newml elena@fml.org
	
	ＭＬの削除は今までどおり
	% makefml rmml elena

	一つのドメインの削除 == そのドメインの全ＭＬを削除
	% makefml rmdomain fml.org

[作業]

I. あらたに「makefml newdomain」コマンドを創設する。

	% makefml newdomain ドメイン ディレクトリ

	このコマンドは、ディレクトリを用意し、さらに 
	/etc/fml/ml_home_prefix ファイルに「ドメイン ディレクトリ」の
	行を付け加える。

	/etc/fml/main.cf では、次のように定義を修正する。
	＃ virtual 部分は互換性を取るためだけ。
	＃ ml_home_prefix ファイルが一応、正式。
	＃ 中身は「ドメインと$ml_home_prefixの対応関係」を記している。

	ml_home_prefix_maps	=	$config_dir/ml_home_prefix
					$virtual_maps

	virtual_maps		=	$config_dir/virtual

	注意:	/var/spool/ml および ml_home_prefix ファイルに 
		writable permission がないとエラーになる。


  例: 各ドメインごとに使うディレクトリを用意する

	% makefml newdomain fml.org    /var/spool/ml/fml.org
	% makefml newdomain nuinui.net /var/spool/ml/nuinui.net
		...

  例: デフォルトドメイン(fml.org)について fml4 との互換性を保つ

	% makefml newdomain fml.org /var/spool/ml


	注意:	同じディレクトリに複数のドメインをマップすることが可能。

  例: 
	ドメインＡ	ディレクトリＡ
	ドメインＢ	ディレクトリＢ

	という定義をした場合、つまり次のようなコマンド列を打った場合を
	考える。

	% makefml newdomain example.org /var/spool/ml/example.org
	% makefml newdomain example.jp  /var/spool/ml/example.org
	% makefml newml info@example.org
	(この後 makefml newml info@example.jp を実行するとエラー)

	この場合、info@example.jp は example.org の include ファイルを
	叩くようにすると思います。To: とか Cc: は素通りなので、まぁい
	いですが、List-* は .org の方になってるという具合いでしょう。
	まぁ、それはしょうがない。

	TODO: makefml newml がよろしく newdomain も呼ぶケースがある？
		まぁ、ありえるのはわかるけど、
		permission の問題が解決できるかなぁ？


II. あらたに「makefml rmdomain」コマンドを創設する。

	% makefml rmdomain ドメイン

	このコマンドは、/etc/fml/ml_home_prefix ファイルから該当するド
	メイン行を削除する。

	ディレクトリには何もしない。
	オプションで、ＭＬのホームディレクトリ群も消す(-r?)。

	~fml/.qmail-ドメイン-* ファイル群を消す。


III. では、引越しのために、「makefml changemlhomeprefix」は作れるか？

	- ん〜難しいかな?;-)
	- こんな長いコマンド名はちょっと…良い案募集
	- めったに使うものでもないので、長い名前でも良いとも思える。
	- 諸般の事情により、ディレクトリパス名を変更したい場合
	- 容量がなくなって/var/mlから/home/user/ml/以下に移したい場合

	% makefml changemlhomeprefix ドメイン 旧ディレクトリ 新ディレクトリ

  例: （たぶん、こういう操作が必要のはずで、それを自動化する)

	% makefml changemlhomeprefix fml.org

	(0. MTA を停止)

	1. ディレクトリを変更する。

		旧ディレクトリ -> 新ディレクトリ

	2. fml8 が作る MTA 用の設定を変更する。

		/var/spool/ml/etc 以下のファイル
		(例: /var/spool/ml/etc/mail/aliases)
		の中に埋め込まれているディレクトリ名を変更して回り、
		.db などを再生成する。

	3. MTA の設定を変更する。内容は MTA 依存。

		postfix の場合、virtual_maps と alias_maps 

	(4. MTA リスタート)


IV. では、ドメイン名を変更したい場合は？

	- ん〜難しいかな?;-)
	- こんなコマンド名では曖昧かなぁ。良い案募集

	% makefml changedomain 旧ドメイン 新ドメイン

  例: （たぶん、こういう操作が必要のはずで、それを自動化する)

	(0. MTA を停止)

	1. 全ＭＬの MTA 用設定ファイルを変更して回る。

		例：
		/var/spool/ml/elena/include-ctl
		/var/spool/ml/elena/include
		/var/spool/ml/elena/include-error

	2. fml8 が用意する MTA 用設定ファイルを変更する

		/var/spool/ml/etc/mail/aliases
		/var/spool/ml/etc/procmail/procmailrc
		~fml/.qmail-$ml_domain-$ml_name

		/etc/fml/ 以下のファイル
			main.cf

	3. MTA の設定を変更する。内容は MTA 依存。

		postfix の場合、virtual_maps と alias_maps 

	4. *.cgi を再生成する
		ドメイン名などは .cgi 内にハードコードされているため。

	(5. MTA リスタート)


	TODO: 
		map の中も頑張って書き換える？
		やりすぎの予感もあるが、それよりも map に書き込めない
		場合も考えないといけないのが難しい。


V.	ドメインとディレクトリ両方を変更したい場合

	% makefml changedomain 旧ドメイン 新ドメイン
	% makefml changemlhomeprefix 新ドメイン 旧ディレクトリ 新ディレクトリ

	とせずとも、これに相当することを一発で行なえるコマンドにしておく。

	この真意は、ディレクトリのマップは ml_home_prefix_maps に書い
	てあるはずなので、明示的にコマンドラインで指定されなくても可能
	なはずであるということにある。その方がミスが減るだろう。


VI.	ml_home_prefix_maps を表示するコマンドを用意

	% fml $ml_name list ml_home_prefix

[ケーススタディ]

Q: ＭＬ名もディレクトリ名も変更しない。
A: 作業は不要。
	例: 単に物理的に引っ越す場合
	例: IP アドレスが変わるだけ

Q: ドメイン名の変更をするが、ディレクトリ名は変わらない。
A: changedomain コマンド一発


Q: ドメイン名は変更せず、ディレクトリは変更する。
A: changemlhomeprefix コマンド一発

Q: 両方やる場合
A: うーん… コマンドが頑張るしかないわねぇ


[その他、雑多な考察]

Q: これ以上、小さな仕様になるか？
	
	include ファイルや aliaes にはディレクトリかＭＬ名が現れるが、
	これ以上設定項目を減らすことは無理だろう。


Q: ＭＬ名はプライマリキー？

	yes

	aliases や virtual ファイルで定義の固まりを示している。
	include ファイルは「プログラム ＭＬ名」という使い方をしている。


Q: IPアドレスの変更は?

	無関係


[リファレンス]

	fml-devel の 2003/10末、600 番台あたりの議論を読もう。

------------------------------------------------
$FML: 01_RFC_DOMAIN_OP.txt,v 1.5 2003/11/16 14:36:30 fukachan Exp $
