年末年始に今まで自宅に設置していた MacMini (Serverではなくデスクトップマシン) を実家に移設したのですが、Eye-Fiを使っているコンパクトデジカメで写真を撮影しながら「あ、Eye-Fiのファイル転送先設定が実家に移設したMacMiniのままだ…」という事に今更気がつきました。
最も簡単な解決方法は自宅に残っているMacBook ProかMacBook AirにEye-Fi CenterとEye-Fi Helperをインストールして転送先を変更すれば良いのですが、もう少し難しく解決してみようと思い、VPN接続で実家のネットワークに接続しrsyncコマンドを使って自宅のLANに接続されているAirMac Extremeに繋がっている外付けHDDへファイルを転送する方法を試してみました。
条件としては次の通り。
- 自宅はCATVでインターネットへ常時接続。
- 実家はFTTHでインターネットへ常時接続。
- VPN接続は自宅のMacBook Pro (MBP)から実家のMac mini server (MacMiniとは別のMac OS X Server搭載のサーバー)間で行う。Mac mini serverはVPN接続クライアントと実家のLAN内に設置しているMacMini間でルーティングを行う。
- Eye-Fiのファイルは実家のMacMini上で共有されているフォルダに保存されている。
- これらのファイルを自宅のAirMac Extremeに接続されたHDDへコピーする。
Applescriptに作業させたい内容は次の通り。
- 予め[システム環境設定] – [ネットワーク] で設定しておいたVPN接続先に自動的に接続する。
- 実家のMacMiniの共有フォルダにafpで接続(マウント)する。
- 自宅のAirMac Extremeに接続のHDDにafpで接続(マウント)する。
- rsyncコマンドを走らせ、MacMini側の変更をAirMac Extreme側へコピーする。
ということで、エラー処理などを全く考慮していませんが紹介しちゃいます。
tell application “System Events”tell current location of network preferencesset VPNservice to service “<<VPN接続名>>” –事前に設定しておいたVPN接続先を指定set isConnected to connected of current configuration of VPNservice –接続済みかどうかを確認if isConnected = false then –接続済みでなければif exists VPNservice then connect VPNservice –接続するdelay 30 –接続が完了するまで30秒程度掛かった事があるので長めに待機end ifset isConnected to connected of current configuration of VPNservice –接続済みかどうかを再度確認if isConnected then –接続済みであればtell application “Finder”mount volume “afp://192.168.0.100/Share/” as user name “<<User Name>>” with password “<<Password>>” –MacMiniの共有フォルダをマウントmount volume “afp://10.0.3.1/Temp/” as user name “<<User Name>>” with password “<<Password>>” –AirMac ExtremeのHDDをマウントset SyncCommand to “rsync -avz –exclude=.DS_Store /Volumes/Share/Eye-Fi /Volumes/Temp/” –rsyncのコマンドを定義do shell script SyncCommand –rsyncのコマンドを実行end tellend ifend tellend tell
ポイントは、afpでマウントした共有フォルダは /Volumes 以下にディレクトリとして見えるという事を利用して、同期元と同期先の2つのネットワーク上の共有フォルダをあたかもローカルフォルダの様に扱っています。rsyncコマンドはssh転送にも対応しているのでそれを使っても良いのですが、事前に鍵の生成や転送をするのが面倒だったのでまずは簡単に実現できる方法で試してみました。その反面、VPNや共有フォルダがネットワークの不調などで切断されると途中でファイル転送が中断されてしまう場合があります。
また、rsyncのオプションとして ‘–exclude=.DS_Store’ を指定しました。.DS_Storeが含まれたディレクトリの同期を行うと.DS_Storeで始まるファイル/ディレクトリが大量に転送される場合があるので除外しました。
エラー発生時の処理やtellコマンドとend tellコマンドの位置も調整しなければなりませんし、ファイル転送終了後に切断も出来ていない状態なのでまだまだ改善の余地がありますが、同じ様な事をお考えの方の参考になれば幸いです。より良い方法があれば是非共有して頂ければ助かります。
#想定していない動きをする事も考えられますので、流用される場合は自己責任でお願いします。意味の分からない場合は試さない方が安全だと思います。