CPAN::Mini って便利ですね。
CPAN::Mini って何をするモジュールかというと、CPAN に登録されているモジュールの最新版をまるごと取ってくる便利なモジュールです。(CPAN::Mini について詳しくは、富田さんの use CPAN::Mini; - 今日のCPANモジュール をごらんください)
CPAN のデイリースナップショットがほしい
日頃使っている CPAN モジュール群に大きな変更が入るとしたら、確実に動くことが分かっている現時点でのアーカイブがほしいです。欲しいと思ったときにミラーを取るのでもいいのですが、できれば、デイリースナップショットを自動的に生成したいですね。Debian Linux の場合は、snapshot.debian.net という神サイトがあります。今回は CPAN の配布物で同じようなものを作りたいと思います。
デイリースナップショットを作るソフトウェア
こういうデイリースナップショットを作る場合、まず思い浮かぶのが ruby で書かれた pdumpfs というバックアップソフトではないでしょうか。pdumpfs は、まず、初回動作時に丸ごとコピーを取ります。次回からは増加分のみをコピーし、変更のない部分はハードリンクをはるという素晴らしいソフトウェアです。snapshot.debian.net では pdumpfs を使っているようですね。
今回は、pdumpfs と同趣旨で、perl でかかれたバックアップソフト glastree (配布先) を少し hack してデイリーアーカイブを作ることにします。
glastree を hack
基本的に、minicpan で取ってきたファイルをさらにコピーしてバックアップする必要ないと思います。というのも、毎日のスナップショットに /archive/200806/09/CPAN/ などというディレクトリでアクセスできることが今回の目的だからです。この目的に合うように glastree の初回動作を少し変更したいと思います。
glastree は、初回動作時にコピー動作をしていますが、これをハードリンク動作に変更します。
glastree の変更点は以下のようになります。ハードリンクを作ってみて、だめならコピーという動作にします。
--- glastree.orig 2003-01-27 09:26:26.000000000 +0900
+++ glastree 2008-06-09 00:54:56.980871566 +0900
@@ -193,7 +193,10 @@
{
my ($frompath, $topath, $stat) = @_;
- copy ($frompath, $topath);
+ my $res = link ($frompath, $topath);
+ unless ($res) {
+ copy ($frompath, $topath);
+ }
chown ($stat->uid, $stat->gid, $topath) if $EUID == 0;
chmod ($stat->mode, $topath);
utime ($stat->mtime, $stat->mtime, $topath);
cron に登録しての運用
glastree にパッチを当てたら、以下のようにスクリプトを書いておいて、一日一回実行されるように cron に登録しておきましょう。
cd ~/cpanmirror minicpan -r http://your/favorite/mirror/of/CPAN/ -l CPAN mkdir -p archive glastree CPAN archive
これで、~/cpanmirror/archive/200806/09/CPAN/ などの日付ディレクトリで過去の CPAN にアクセスできるようになります。
会社の LAN 内サーバなどで apache から見える場所に置いておくといいかもしれませんね!
ディスク消費量
初回実行分で 850MB 消費していました。
次回実行時からは、日々追加されるモジュールの分程度の消費なので、ディスクが CPAN のミラーでいっぱいであたまを抱えるようなこともなくていいですね!
デイリースナップショットを作っておけば、備えあれば憂いなしですね!



Leave a comment