■mirrorで自動アップロード
2つのディスクを使ったバックアップも出来るようになると、とことんズボラな私は、ついでにこのバックアップファイルをホームページ用のディレクトリとミラーリングができたらいいな… などと考えてしまう。
なにかいい方法は無いかと調べていたら、
というスクリプトが手に入った。
これは、2つのホスト、たとえばプロバイダに借りているホームページ用のサーバディレクトリの内容とローカルディレクトリとを同期してくれるスクリプトだ。アップロードだけでも、ダウンロードだけでも、新しい方を優先してピタリとミラーリングということも出来るらしい。これを実行すれば、文字通り鏡のようにリモート、ローカル2つのディレクトリの同一性を保つことができるのだ。もちろん、アップロードするだけでもタイムスタンプを元に更新されていないものは手を付けないからすべてを書き換えるより数段時間も短くなるはずだ。
私の場合は複数のプロバイダにサーバスペースを借りているので、手動だと一度のそのすべての面倒をみるのは大変だが、これもpackageファイルと呼ばれる「初期設定」ファイルを記述すると、事細かに設定が出来るので一つのコマンドで一度に出来てしまうと言うではないか!
「のろまなPB使いにとっては、願ったり叶ったりだ…」
mirrorはPerlスクリプトで書かれている。圧縮ファイルをダウンロードして、適当なディレクトリの中(mirror-2.Xなどと言う名前にするとわかりやすい)に展開する。そのディレクトリにcd移動して、
# perl install.pl here
とやると、perlのディレクトリとmirrorそのものをインストールするパスを聞かれるので、/usr/local/bin/perlもしくは、/usr/bib/perlと、/usr/local/binなどと適切なパスを答えておこう。もちろんこれは、システムにPerlがインストールしてなくてはならない。
再起動後に、
# mirror -v
とやって、
$Id: mirror.pl,v 2.9 1998/05/29 19:01:07 lmjm Exp lmjm $
のようなバージョンが返ってきたらインストールはほぼ成功だ。
mirrorは起動するときにmirror.defaultというファイルをさがす。普通はインストールを行ったディレクトリにあるものを使うが、無い場合にはユーザのホーム、perlのライブライパスなどを探すらしい。見つからなければエラーを返すので、適当な場所に移動する。またユーザの好みに応じて自分のホームディレクトリにコピーして書きなおすことも出来る。最低限以下の項目は書き換えなければ適切に動作しない。
hostname= [ホスト名、私の場合はNetBSDの載っているPBだ。] local_dir= [ローカルファイルのディレクトリ] remote_password= [ログインパスワード] mail_to=hogehoge@xxx.com これは別にどうでもいいかもしれないが…
これに、自分専用の設定ファイルを書き加えるか、新しくファイルを作る。私は後者を選んだ。
自分のホームディレクトリにmirror.txtというファイルを作って以下の用に書き加えた。
package=MySITE 一応この設定の名前をつけてほかのと区別する site= [FTPサーバのアドレス] remote_dir=/htdocs 環境によって違うと思う remote_user= [FTPのログインネーム] local_dir= [ローカルファイルのディレクトリ] remote_password= [ログインパスワード] 丸裸になるので書きたくはないが… local_ignore+|cgi-bin|TheVolumeSettingsFolder|TheFindByContentFolder (~一行で書く~)|\.AppleDouble|\.Parent|\.xvpics|(^|/)(\:|ノ|Icon) file_mode=0644 ファイル属性の初期値は0444なので変えておく。 user= [ユーザ名]ダウンロードしたファイルに設定するらしい。 group= [グループ名] 同上。 get_file=false ダウンロードはしない設定(だと、↑は意味無いかも…)
local_ignoreは、転送したくないローカルファイルを選別するために、ファイル名に「+」以降の「|」で分けた文字列(正規表現)のいずれかが含まれた場合無視される設定だ。私の場合はnetatalkでMacのファイルを扱うのでこんなにたくさん設定しなくてはならなかったが、Winネットワークだけの環境なら、これほど必要無いだろう。また、CGIなどのアクセス権が特殊なものはそれなりのKnowHowがあるらしいので、説明書を参考にして別のpackageに個別に設定したほうがいいだろう。設定はひとつのファイル上に別個の設定が出来るので、ディレクトリごとに別の設定にすることも出来る。その場合はpackage=××を別の名前にして以降の行を必要に応じて続けて書きこめばいいだけだ。
とにかく、ひとつでも設定ファイル(package)が準備できたら、そのパスをコマンドにつけて入力すれば動作する。はじめは実際のファイルの転送を行わず、
# mirror -n [packageファイル名]
とやると、どのファイルがどう扱われるかを表示してくれる。普通は同名ファイルは新しいほうで上書き、見当たらないファイルはリモート、ローカルでPut、またはGetで補い合うのだが、get_file=falseの設定では、ローカル側にリモート側と同名のファイルが見当たらなければShould Delete ~と表示され、実際の転送時にはそのリモート側のファイルは消去される。これは、ローカル側でファイル名を変更したり、ファイルを消去した場合はそれに対応してくれる便利な機能なのだが、もしも必要なファイルが消去されてしまっては取り返しがつかないので注意が必要だ。他におかしな動作をするようならば適当に設定を書きなおさなくてはならないかもしれない。少なくともローカル側にファイルが存在していなくてはミラーリングは出来ないので、ファイルの位置関係や属性などもチェックする。ファイルの関連に間違いが無ければ、オプションの-nを-dとして実行すると、実際にファイルが移動する。
。-dオプションはデバッグ情報を表示するためのものだが、うっとうしければ無くてもいい。一応、ディレクトリはフルパスで書く。
上手く動作することが確認できたら、コマンドひとつで動くように、ウェブページの保存してあるディレクトリを書いて、ファイルとして保存した。(echoの部分はご愛嬌…)
echo -n 'start upload...' /usr/local/bin/mirror -d /home/mirror.rc echo 'done.'
このファイルをdupload.shと言う名前で/etc/以下に保存しておく。(もちろん名前は何でもいい。)
これを
# chmod 755 dupload.sh
実行可能なアクセス権に変更すれば、
# /etc/dupload.sh
と、やるだけで実行できる。
これもsyncdirと同じようにcronで定期的に実行させておこう。
# vi /var/cron/tabs/root
とやって、内容を一行、
35 0,12 * * * /etc/dupload.sh
と、書き加えて保存しておいた。もちろん複数のpackageファイルが無いならばdupload.shなどというシェルスクリプトを作らずとも、ここに直接コマンドを書きこんでもいいだろう。一日一度のアップロードなら「時」のところを好きな時間にすればいいのだが、わたしは一応一日に二度動作させるために上記の設定にした。これで定期的にミラーリングがされるはずだ。分単位の数値は/ver/cron/tabs/rootにかかれた他の実行コマンドと時間的に重ならないように適当に設定すればいいだろう。
■FTP転送にバグがある
これでコーヒーでもすすっているうちにアップロードが完了という夢の生活が待ってる(?)と思いきや、残念だがmirrorにはバグがあったのだった…
ファイルをFTP転送するときにリモートサーバのディレクトリリストを得るところあたりでストップしてしまうのだ。しばらく我慢強くまっているとタイムアウトと表示され何も出来ずに終了してしまう。私はこれがバグとは気づかずに丸1日設定をああでもない、こうでもないと、イジリ倒すはめになった。
幸いなことにこのバグを修正するパッチが配布されていたのでこれを使うことにした。wu-ftpd-2.6.0-mirror-2.9.patch.txtというのがそれ。と、言ってもパッチの当て方すらわからない私は、そのテキストを開いて、/usr/local/bin/以下にインストールされたftp.plファイルの内容を手作業で修正した。以下がその修正部分だ。
--- 587行目付近 return 0; } + # shut down our end of the socket + &close_data_socket; + # read the close # $ret = &expect($timeout, --- 596行目付近 $ret = 0; } - # shut down our end of the socket - &close_data_socket; - if( ! $ret ){ return 0; }
要は、587行あたりの行頭に「+」印のある行を追加し、596行あたりの行頭に「-」印のある行を削除して保存すればいいのだ。(もちろん+-記号は削除する)これで、めでたくFTP経由のミラーリングが動作する。
追記:このバグは最新バージョンでは修正されているらしい。詳しくは公式ページを参照してください。