CTM_MAIL(1)

名称
ctm_smail, ctm_rmail - メールを介しての ctm デルタの送受信

書式
ctm_smail [-l log] [-m maxmsgsize] [-c maxctmsize] [-q queue-dir] ctm-delta mail-alias ctm_dequeue [-l log] [-n numchunks] queue-dir ctm_rmail [-Dfuv] [-l log] [-p piecedir] [-d deltadir] [-b basedir] [file ...]

解説
ctm_smail, ctm_dequeue, ctm_rmail は ctm(1) コマンドと組み合わせて、 ソースツリーへの変更を電子メールで配布するために使われます。 ctm_smail には圧縮した ctm のデルタとそれを送るメーリングリストを与えます。 するとデルタを送信できる大きさに切り分けて、メールメッセージとして エンコードしたものをメーリングリストに送ります (メールの負荷を分散させるためにキューに入れるように選択できます)。 各受信者は ctm_rmail を使い (手動または自動で) デルタのデコードと再組み立てを行い、 それをソースツリーに適用するために ctm を呼び出すようにも指定できます。 現在、 いくつかのソースツリーが、いくつかのサイトによって配布されています。 その中には freefall.FreeBSD.org が配布している FreeBSD-current のソースと CVS のツリーもあります。

ctm_smail のコマンドラインの引数には以下があります:

-l log
    stderr に出力する代わりに、 (コマンドラインのエラー以外の) エラー診断と情報メッセージ にタイムスタンプを付けた物がファイル log に書き込まれます。

-m maxmsgsize
    ctm_smail が送信できるメールメッセージの最大サイズを制限します。 メールヘッダとその他の細かい物をこの制限に入れていないため およその値となります。 指定されないとデフォルトは、メールの限界と噂される 64k に対して ヘッダのための 1535 バイトを残した 64000 バイトです。

-c maxctmsize
    送信されるデルタの最大サイズを制限します。この制限より大きいデルタは 謝罪メールをメーリングリストに送り出します。 これは大幅な変更でユーザのメールボックスを圧迫してしまうのを 避けるためです。これはエンコードする前のサイズなので注意して下さい。 エンコードされるとメールヘッダを付ける前でサイズは 4/3 倍になります。 指定されないと無制限になります。

-q queue-dir
    デルタのかけらをメールする代わりに、後で ctm_dequeue を使ってメールされるように指定されたディレクトリに格納します。 この機能によって、巨大なデルタを数時間または数日にも渡って分散させ、 ネットワークのバンド幅が狭かったりメールのスプール領域が小さい 受信者へのインパクトを押えることが可能です。

ctm-delta は送信されるデルタで、 mail-alias はデルタを送信するメーリングリストです。 メールメッセージは sendmail(8) を使って送信されます。

ctm_dequeue のコマンドラインの引数には以下があります:

-l log
    stderr に出力する代わりに、 (コマンドラインのエラー以外の) エラー診断と情報メッセージ にタイムスタンプを付けた物がファイル log に書き込まれます。

-n numchunks
    1 回の ctm_dequeue の実行で送信するメールメッセージの数を制限します。 デフォルトでは、 ctm_dequeue は 1 回の実行で 1 つのメールメッセージを送信します。

queuedir は ctm_smail が格納したメールメッセージのあるディレクトリです。 numchunks 個までのメールメッセージが実行ごとに送信されます。 受信者のメーリングリストは、溜められたファイルに すでにエンコードされています。

ctm_smail がキューにエントリを追加している最中や、複数の ctm_smail を並行に実行している最中でも ctm_dequeue を安全に実行できますが、配布される各ツリーごとに独立した キューのディレクトリを使うべきです。 これはエントリがアルファベット順に処理されるので、デルタの 作成時刻ではなく、デルタ名に従って 1 つのツリーが他の物より 前に処理されて不公平になるからです。

ctm_rmail のコマンドラインの引数には以下があります:

-l log
    stderr に出力する代わりに、 (コマンドラインのエラー以外の) エラー診断と情報メッセージ にタイムスタンプを付けた物がファイル log に書き込まれます。

-p piecedir
    デルタのかけらをこのディレクトリに集めます。 それぞれのかけらは 1 つのメールメッセージに対応します。 かけらは完全なデルタが出来上がると削除されます。 もし このフラグが指定されないと、入力ファイルは読まれませんが、 -b フラグが指定されていれば完成しているデルタは ctm を使って適用されるかもしれません。

-d deltadir
    このディレクトリ内の完成したデルタを集めます。デルタは、すべてのかけらが 揃っている時に 1 つ以上のかけらから組み立てられます。

-b basedir
    完成しているデルタを このソースツリーに適用します。このフラグが 指定されていない場合、デルタは格納されますが適用はされません。 ユーザは手動、または ctm_rmail を -p フラグ無しで使ってデルタを適用できます。 もしデルタが basedir の .ctm_status ファイルとマッチしない場合 (もしくは .ctm_status が存在しない場合) には、デルタは適用されません。

-D  ctm による適用が成功した後でデルタを削除します。 ctm はデルタのフルセットからファイルの小グループを回復する機能を 持つので、このフラグを避けて (そしてすべてのデルタを取って) おくのが 良いでしょう。

-f  fork して ctm でのデルタの適用をバックグラウンドで実行します。 これは sendmail から ctm_rmail を自動的に呼び出す場合に有効です。なぜなら ctm は終了までに、とても長い時間を要し、それによって他の人のメールを 遅らせる原因になり、理論的にはリモート側の sendmail のタイムアウトによるメールの不要な再送信や、 MH の slocal のようなメールフィルタによる ctm_rmail の強制終了を引き起こす可能性があるからです。 膨大な数のバックグラウンドの ctm プロセスでマシンに負荷がかかる心配はありません。同時に 2 つ以上の ctm が起動されないようにロックが行われているからです。

-u  完成したデルタを適用する時に -u フラグを ctm コマンドに渡します。これによって作成、変更されたファイルの 変更時刻が CTM デルタの作成時刻にセットされます。

-v  完成したデルタを適用する時に -v フラグを ctm コマンドに渡します。これによってより多くの情報出力が得られます。 すべての ctm からの出力は ctm_rmail のログファイルに記録されます。

引数のファイル (もし無ければ 標準入力 ) がデルタのかけらとしてスキャンされます。 1 つのファイルから複数のデルタのかけらを読む事ができるので、 メールドロップ全体を 1 回のコマンドでスキャンして処理できます。

ctm_rmail を並行に (異なる入力ファイルで) 複数回起動しても安全です。 sendmail がメールを非同期に配送した時にこのようなことが起こり得ます。 これは処理を順序通りに保つためにロックが行われているからです。

ファイルフォーマット
以下は実際の (とても小さい) デルタのかけらの重要部分です:

    From: owner-src-cur
    To: src-cur
    Subject: ctm-mail src-cur.0003.gz 1/4
    CTM_MAIL BEGIN src-cur.0003.gz 1 4
    H4sIAAAAAAACA3VU72/bNhD9bP0VByQoEiyRSZEUSQP9kKTeYCR2gDTdsGFAwB/HRogtG5K8NCj6
    v4+UZSdtUQh6Rz0eee/xaF/dzx8up3/MFlDkBNrGnbttAwyo1pxoRgoiBNX/QJ5d3c9/X8DcPGGo
    lggkPiXngE4W1gUjKPJCYyk5MZRbIqmNW/ASglIFcdwIzTUxaAqhnCPcBqloKEkJVNDMF0Azk+Bo
    dDzzk0Ods/+A5gXv9YyJHjMCtJwQNeESNma7hOmXDRxn
    CTM_MAIL END 61065

メッセージのサブジェクトは常に “ctm-mail” で始まりデルタの名前、いくつ目のかけらか、そして全部でいくつの かけらがあるのかが続きます。データは “CTM_MAIL BEGIN” と “CTM_MAIL END” という行で囲まれており、サブジェクト行の情報の複製、加えて単純な チェックサムが付きます。

デルタが maxctmsize を超えると、代わりに以下のようなメッセージが送られます:

    From: owner-src-cur
    To: src-cur
    Subject: ctm-notice src-cur.0999.gz
    src-cur.0999.gz is 792843 bytes.  The limit is 300000 bytes.
    このデルタは ftpmail か、または大学の仲良しから得られます。

これでもうあなたのものです!

使用例
src-cur の 32 番目のデルタを src-guys として sendmail に登録されている素晴らしいコードハッカーのグループに、 メールのサイズをおよそ 60000 バイトに制限して送るためには 以下のように出来ます:

    ctm_smail -m 60000 /wherever/it/is/src-cur.0032.gz src-guys

メールボックスの各 ctm-mail メッセージをデコードして、それらを完全なデルタに組み立て、そして 出来上がったデルタやそこらに転がっているデルタはどれも、 以下のように適用出来ます:

    ctm_rmail -p ~/pieces -d ~/deltas -b /usr/ctm-src-cur $MAIL

( ctm_rmail はメッセージを削除しないので注意して下さい。 削除には どんなメールリーダでも使用できます。)

receiver-dude という名前の自動的にデコードとデルタの組み立てを行うけれども、 それらの適用は行わないようなメールエイリアスは、以下の行を /etc/aliases ファイルに入れる事で作成可能です ( /ctm/tmp と /ctm/deltas ディレクトリ そして /ctm/log ファイルが daemon ユーザか wheel グループで書き込み可能な事を仮定しています) :

    receiver-dude: "|ctm_rmail -p /ctm/tmp -d /ctm/deltas -l /ctm/log"
    owner-receiver-dude: real_dude@wherever.you.like

2 行目は、失敗した場合にそれを通常のメールボックスか、または どこか好きな所へ転送するためにあります。

集められた全デルタを適用して、適用したものを削除するには以下のように します:

    ctm_rmail -D -d /ctm/deltas -b /ctm/src-cur -l /ctm/apply.log

柔軟性を最大限生かすためには、この procmail スクリプトからの引用の利用を考えてみて下さい:

    PATH=$HOME/bin:$PATH
    :0 w
    * ^Subject: ctm-mail cvs-cur
    | ctm_incoming

以下のシェルスクリプト ~/bin/ctm_incoming と一緒に使います:

    #! /bin/sh
    PATH="$HOME/bin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin"
    export PATH
    cd $HOME/ctm && ctm_rmail -f -p pieces -d deltas -l log -b /ctm

これは全部の ctm デルタを ~/ctm/deltas に置き、それらを /ctm 内のツリーに適用し、失敗したものは、すべてあなたの通常の メールボックスに落します。 ctm_incoming での PATH の操作は、このサンプルを取って来た (FreeBSD でない) マシンで ctm_rmail から ctm の実行を可能にするためのものです。

セキュリティ
自動的にメールを取ってファイルツリーへのパッチプログラムに 渡している場合、あなたのシステムへの鍵をクラッカーに手渡していると 考えるかも知れません。幸い、損害を起こす窓はとても小さいのです。 ctm_rmail は、 (デルタ名中の いかなる “/” 文字も信用しないことによって) 与えられたディレクトリのみにしか書き込まないように注意しています。 そして最新の ctm では操作するファイルに絶対パス名と “..” を許可していないので、最悪でも失われる可能性のあるのは (デルタから復元できる) 二、三のソースツリーのファイルだけなのです。 ctm はファイルにさわる前に md5 によるチェックサムが合致する事を要求するので、ソースの受信者だけが 偽造したデルタを生成できる可能性を持ち、そして そういう人達が そんなことを考えるはずもありません! :-)

この可能性さえも暗号化された署名で取り除く事が可能です。 将来の強化の可能性は、 PGP を使った安全なラッパの提供があります。

環境変数
デルタを適用するのならば ctm(1) と gunzip(1) が PATH に含まれていなければなりません。

関連ファイル

QUEUEDIR/*
    メールメッセージとしてエンコードされて、メーリングリストに 送信されるのを待っているデルタのかけら。

PIECEDIR/*
    残りのかけらの到着を待っているデルタのかけら。

DELTADIR/*
    完成したデルタ。

BASEDIR/.ctm_status
    このソースツリーに次に適用されるべきデルタの名前と番号を含むファイル。

診断
ctm_smail, ctm_dequeue, ctm_rmail は正常に終了するとステータスとして 0 を、何らかの障害が あった場合は 1 を返します。 ctm_rmail は、メールの配送プログラムから呼ばれる事を想定しています。そして そのため入力されたメールメッセージが (送信者にではなく、 なるべく あなたの通常のメールドロップに) 返送されるべき状態に なった時にのみ障害を通知するようになっています。 いいかえれば、完成したデルタを ctm で適用する際に発生した障害はメールを返送する程に重要なエラーでは ないと判断されて、 ctm_rmail は終了ステータスとして 0 を返すということです。

通常の操作では、 ctm_smail は以下のようなメッセージで報告します:

    ctm_smail: src-cur.0250.gz 1/2 sent to src-guys

または、キューに入れたなら、

    ctm_smail: src-cur.0250.gz 1/2 queued for src-guys

ctm_dequeue は以下のようなメッセージで報告します:

    ctm_dequeue: src-cur.0250.gz 1/2 sent

ctm_rmail は以下のようなメッセージで報告します:

    ctm_rmail: src-cur.0250.gz 1/2 stored
    ctm_rmail: src-cur.0250.gz 2/2 stored
    ctm_rmail: src-cur.0250.gz complete

もし入力ファイルのいずれもが正しいデルタのかけらを含んでいないと、 ctm_rmail は以下のように報告します:

    ctm_rmail: message contains no delta

そして終了ステータスとして 1 を返します。もしメールフィルタが 当てにならないのなら、これを使って気まぐれなメッセージを リダイレクトして本当のメールボックスに入れる事ができます。

これらのメッセージは stderr かログファイルに出力されます。 ctm からのメッセージも同様にここに現れます。 エラーメッセージは それ自身が説明的であるべきです。

関連項目
ctm(1), ctm(5)

作者
Stephen McKay <mckay@FreeBSD.org>

日本語訳
野首 寛高(h-nokubi@nmit.mt.nec.co.jp): FreeBSD 用に翻訳