CTM(1)

名称
ctm - ソースコードをミラーするプログラム

書式
ctm [-cFklquv] [-b basedir] [-B backup-file] [-e include-regex] [-t tar-command] [-T tmpdir] [-V level] [-x exclude-regex] file ...

解説
ctm は、元々 “Cvs Through eMail” でしたが、今は代わりに “Current Through eMail” と呼ぶのがふさわしいようです。

ctm は、今や 2 つのバージョンのディレクトリツリーの間でデルタを作成して 適用するための最も信頼できる方法を意味します。

これにはデルタの作成と適用という 2 つの部分があります。2 つは 全く異なるものです。

  使用例
CTM デルタを適用するには、それを ctm コマンドに渡します。CTM デルタを標準入力、またはファイル名を引数として 渡すことができます。後者の方法を取ると、とても簡単に することができます。なぜなら このプログラムは gzip で圧縮された ファイルを受け付けて、ファイルの一時的なコピーを作る必要が無いからです。 複数のデルタを一度に指定でき、それらは一度にひとつずつ処理されます。 すでに適用されているデルタは無視されます。

ctm コマンドの実行はたくさんのパスにわかれています。 次のパスを始める前に、それぞれのパスで入力ファイルの全体が処理されます。

name で指定されたファイルを処理する前に ctm は まず name.ctm というファイルが存在するかどうかをチェックします。 存在すれば、 ctm は、かわりにそちらを処理します。

パス 1 では、入力ファイルが正常かどうかを確認します。 文法、データ、全体の MD5 によるチェックサムがチェックされます。 いずれか 1 つでも異常があれば、 ctm は単純に入力ファイルを拒否します。

パス 2 ではディレクトリツリーが CTM デルタの期待している状態に なっているかどうかを確認します。これは存在する/しないはずの ファイルとディレクトリを捜して ファイルの MD5 によるチェックサムをチェックすることで行われます。

もし backup-file が -B オプションで指定されていると、その ctm の呼び出しで変更されるファイルが -t オプションで指定されたアーカイバコマンドを使って、そのファイルに バックアップされます。デフォルトのアーカイバコマンドは tar -rf %s -T - です。

パス 3 では実際にデルタが適用されます。

ctm によって変更されるファイルのリストは、 -e と -x オプションで指定された正規表現によるフィルタの対象になります。 -e と -x オプションは、コマンドラインで指定された順に適用されます。 与えられたファイル名に最後にマッチしたフィルタが、そのファイルを ctm の適用対象とするかどうかを決定します。

ctm は、その作業ディレクトリ下にファイルの階層を展開します。 絶対パスや ‘~’. と ‘..’ の参照を含むファイル名は、セキュリティのために明確に禁止されています。

  オプション

-b basedir
    各ファイル名に basedir で指定されたパスを前置します。

-B backup-file
    この CTM の実行で変更されるすべてのファイルを backup-file にバックアップします。 -e と -x オプションで何らかのフィルタが指定されると、 CTM の実行時にフィルタが適用され、変更されたファイルが、 最終的にバックアップされるファイルのセットとなります。

-c  確認だけを行ない、他には何もしません。

-e regular_expression
    CTM ファイル中の各ファイル名が regular_expression にマッチするかどうかを調べ、マッチすればそのファイルを処理し、 マッチしなければ何もせずそのまま残します。 このオプションは何個でも指定できます。このオプションを指定すると .ctm_status のシーケンス番号のチェックが行なわれません。 例えば、 ^usr.sbin/ctm と指定すると、 usr.sbin/ctm というソースディレクトリと、その下のすべてのパス名を指定した事に なります。

    CTM の処理対象からパス名を外すには -x オプションを使います。

-F  強行します。

-k  ファイルとディレクトリを保存し、CTM ファイルで削除するように 指定されているものでも削除しません。 -B オプションが指定されると、そのファイルとディレクトリは バックアップされません。

-l  その CTM の実行で変更されるはずのファイルと、それに対して 行われるアクションをリストします。 -l オプションを使うと .ctm_status のチェックと作業対象のソースツリーの正当性チェックが行なわれません。 -l オプションは、 -e と -x オプションを組み合わせることで、与えるコマンドラインオプションで どのファイルが変更されるかを見定めることができます。

-q  表示を減らします。

-t tar-command
    デフォルトのアーカイバである tar の代わりに tar-command を使います。 このオプションは、バックアップファイルが -B オプションで指定された場合にのみ効果があります。 tar command 中には一つだけ %s を置くことができ、 バックアップファイルの名前に置き換えられます。

-T tmpdir
    一時ファイルを tmpdir に置きます。

-u  作成、変更されるファイルの更新時刻を CTM デルタが作成された 時刻に設定します。

-v  表示を増やします。

-V level
    表示を増やします。 level は饒舌さの程度です。

-x regular_expression
    CTM ファイル中の各ファイル名を regular_expression とマッチするかどうかを調べ、マッチすればそのファイルを除外します。 このオプションは何個でも指定できます。このオプションを指定すると .ctm_status のシーケンス番号のチェックが行なわれません。

    CTM の処理対象にパス名を加えるには -e オプションを使います。

セキュリティ
CTM 自身、 安全ではないプロトコルです - ソースコードへ加えられた修正が信頼できるところから送られたことを 認証しませんので、 通常の電子メール等の信頼できない媒体から CTM デルタを得た場合には注意が必要です。 CTM デルタを偽造して、正当なものを交換または上書きし、 悪意あるコードをあなたのソースツリーに挿入することは、 攻撃者にとって比較的簡単です。 正当なデルタの到着がなんらかの方法で妨げられた場合、 これを感知できるのは、後のデルタが同じファイルを触ろうとする時点です。 この時点で、MD チェックサムが失敗します。

これを回避して安全なものにするために、 FreeBSD.org が作った CTM 部品には、 GNU Privacy Guard ユーティリティ互換なフォーマットで暗号的に署名しています。 このユーティリティは /usr/ports/security/gpg および Pretty Good Privacy v5 ユーティリティ /usr/ports/security/pgp5 から入手できます。 適切な公開鍵は ctm@FreeBSD.org を finger することで得られます。

このように署名された CTM デルタは、 検知されることなく攻撃者が改変することはできません。 それゆえ、CTM デルタを電子メールで受信する場合には、 GPG または PGP5 を使用して署名を確認することを勧めます。

環境変数
TMPDIR にパス名がセットされていると、ctm は一時ファイルの置き場所として そのパス名を使います。 これに関しての詳細は tempnam(3) を参照して下さい。 同じ効果は -T フラグでも得られます。

関連ファイル
.ctm_status には、最後に適用した CTM デルタのシーケンス番号が含まれます。 このファイルを変更したり削除したりすると、 ctm は、とても混乱します。

-e と -x オプションを使うとソースツリーの一部分を更新することができ、 ソースを一貫性のない状態にすることになります。 これらのオプションを使うときには、何をしているのかを理解していることが 仮定されています。

使用例

    cd ~cvs
    /usr/sbin/ctm ~ctm/cvs-*

`lib' 以下のすべてのソースを取り出してパッチを当てるには 以下のようにします。

    cd ~/lib-srcs
    /usr/sbin/ctm -e '^lib' ~ctm/src-cur*

診断
充分に説明的であるはずの沢山のメッセージが出力されます。 “ノイズレベル” は -q, -v, -V オプションで調整できます。

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

歴史
最初の試みは FreeBSD 1.1.5 の作業中に行われました。そして、たくさんの バグと手法について徹底的に議論されました。

ctm コマンドは FreeBSD 2.1 から登場しました。

作者
CTM システムは Poul-Henning Kamp <phk@FreeBSD.org> によってデザインされ実装されました。

このマニュアルページは Joerg Wunsch <joerg@FreeBSD.org> が書きました。

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