code up

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

QNAPの世代管理 - SVNコマンドで日次の自動同期

ファイルサーバーにQNAPのNASを使用しているのだが、このサーバー、バックアップの世代管理ができない。そこでSVNと組み合わせてバックアップを行うことに。

Windows環境の話。

構成

前提となる基本的な構成を。

  • QNAPはファイルサーバーとしてWindows共有でアクセスしている
  • 普段使っているクライアントはWindows 7 Professional 64bit
  • SVNサーバー(Apache + Win32Svn)はWindows XP 32bitにHDDをいっぱい積んで動かしている

このQNAPにあるファイル達を日次でSVNサーバーにバックアップをして版管理ができるようにする。

QNAPの共有フォルダをSVNサーバー(Windows XP)にてネットワークドライブとしてマウントし、QNAPのファイル達をSVNサーバーに既にimport済みの状態。

Ant

最初build.xmlでも書いてAntとスケジューラーの組み合わせで行こうとしたのだが、ディレクトリ構成を1.7ベース(WC-NG; Working Copy - Next Generation)に変えてしまったためか、SvnAnt(リリース版はないのでリポジトリからコンパイル)+SVNKitが動かなくなってしまった。

正確には、追加やコミットはできるのだが、SVN外で削除したファイルの同期(missingなファイルのSVN側の削除)がいずれの方法でもできなかった。

Google先生に聞いてsvntaskというのも試してみたけど、missingなファイルの削除の方法は見つからなかった。

コマンドスクリプト

レガシーな方法だが結局svnコマンドを実行するバッチスクリプトを書き、それをタスクスケジューラーに登録することで自動同期ができるようになった。for文の書き方はstackoverflowを参考にした。

@echo on
@REM 環境変数が設定されていない場合に備えて
@set APR_ICONV_PATH=C:\Program Files\Subversion\iconv

@REM 前回失敗していた場合用
svn cleanup . --username foo --password foo
@if errorlevel 1 exit /b 1

@REM 管理されていないファイルも含めて追加
svn add . --force --username foo --password foo
@if errorlevel 1 exit /b 1

@REM missingなファイルをSVNから削除
for /f "usebackq tokens=1,*" %%i in (`svn st ^| findstr /R "^!"`) do svn del "%%j" --username foo --password foo
@if errorlevel 1 exit /b 1

@REM 他のユーザーによってリポジトリが更新されている場合にupdateが必要
svn update . --force --username foo --password foo
@if errorlevel 1 exit /b 1

@REM コミット。--config-option以下は昨日の記事にある巨大なファイルを送信しようとすると413 Request Entity Too Largeが出るため
svn commit . -m "" --username foo --password foo --config-option servers:global:http-library=serf
@if errorlevel 1 exit /b 1

@exit /b 0

:svndel
svn del %1 --username nightly --password nightly
@if errorlevel 1 exit /b 1

このファイルを適当な名前(sync.batとか)で同期したいワーキングフォルダに置く。

後はこのバッチファイルをタスクスケジューラーあたりに登録すれば完了。翌日あたりにLogを確認してきちんと動作していれば成功。

テスト

バッチスクリプト自体の確認は、Windows 7 64bit(TortoiseSVN 64bitに付属するsvn(1.7.4))とWindows XP 32bit(Win32Svnに付属するsvn(1.7.4))で確認した。

巨大なファイルのテストをする場合はWindowsであればfsutil file createnew 3gb.dat 3000000000とかで作成できる。

関連記事
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。