AppleScript で VPN の常時接続を実現

ウチは以前からシンガポールに置いてあるMac miniと日本の実家に置いてあるMac mini server間でVPN接続を張り、ファイル転送やサーバーの管理を行っています。

引っ越す前は時々CATVインターネット接続が不安定で数日に一度程度、そして引っ越し後はCATVモデム(WiFiアクセスポイント)からウチの部屋に設置したLinksys RE1000までの接続がまだ時々不安定で時々、VPN接続が切れてしまいます。必ず常時接続されていないと困る訳でもないのですが比較的大きなファイルのやり取りをしている為、転送中にVPNが切断されるとやり直しになったり、期待していたファイルが同期されていなかったりと些か不便を感じていました。

という事で少し調べてみたところ、AppleScriptを使って常にVPNの接続状態を監視、接続されていなかった場合は接続するというスクリプトがありましたので試してみました。紹介してみます。

スクリプト本体

on idle
tell application "System Events"
tell current location of network preferences
set myConnection to the service "VPN_Connection"
if myConnection is not null then
if current configuration of myConnection is not connected then
connect myConnection
end if
end if
end tell
return 30
end tell
end idle

AppleScript Editorを起動してスクリプトを記述します。
なお、4行目の”VPN_Connection”の部分の””でくくられた中は、その環境に設定したVPN接続の名称で置き換えます。
そして最後から3行目のreturn 30は、何秒毎に接続状態を監視するかの設定です。

保存する際はFile FormatをApplication、そしてOptionのStay open after run handlerのチェックを入れておきます。
こうする事で、保存されたファイルをダブルクリックするとアプリケーションとして動作し且つ常に動作し続ける様になります。

VPN connection AppleScriptVPN connection AppleScript

早速起動してみるとVPN接続が切断されていれば自動的に再接続する事が分かります。
意図的にVPN接続を切断してみると約30秒以内に再接続が始まります。

VPN connection AppleScript VPN connection AppleScript

 

このままだとDockにアプリケーションアイコンが表示されてしまい少し邪魔と感じるかもしれません。
そんな場合は保存したアプリケーションアイコンを右クリック、Show Package ContentsをクリックしContentsフォルダ内のInfo.plistをXcode等で開きます。

VPN connection AppleScript VPN connection AppleScript

 

そしてXcodeのEditorメニューからAddを選択して「Application is agent (UIElement)」Keyを追加した上で値をYESに設定します。

VPN connection AppleScript VPN connection AppleScript

 

この設定を済ませる事でアプリケーションが起動していてもDockにアイコンが表示されなくなります。
後はログイン時の起動項目にこのアプリケーションを追加しておけば、Mac OS Xの起動とともにVPNに自動的に接続され、その接続状態を監視、切断時には自動的に再接続してくれる様になります。

参考リンク:

Mac: iTunesライブラリへビデオファイルを自動追加するApplescript

第2世代Apple TVを使っているのですが、Macに保存している音楽や動画を再生する為にはそれらがiTunesライブラリに入っている必要があります。

しかし、iTunesが動いているのがMac miniで、動画ファイルはMacBook Airからネットワーク越しでMac miniへコピーしていると、わざわざMac miniを操作してiTunesライブラリへそれらを転送するのを思わず忘れてしまったりします。

そこで特定のフォルダとその中のサブフォルダに入っているファイルを検索し、それらをiTunesライブラリに追加するApplescriptを作ってみました。

iTunesはデフォルトで追加するファイルをライブラリフォルダにコピーしてしまうので大きな動画ファイルを扱う場合は、予めiTunesの設定でライブラリフォルダへファイルをコピーしない様に設定した方が良いかもしれません。

次の様な動作をします。

  • 変数strRootPathで設定したフォルダ内に存在するサブフォルダを検索し、それら全てに入っているファイルを見つけ、iTunesライブラリへ追加。
  • 過去にこのスクリプトで追加したファイルを除外する為、変数strLogFullNameで定義されたログファイルに書き込まれているファイル名は処理しない。

という事で、スクリプト本体はこんな感じです。

かなり遠回りな処理をしている気もしますし、まともなエラー処理を行っていないので、利用される際は自己責任でお願いします。

set strRootPath to “USB HDD:Movie” — 検索する親フォルダ。

set LogFullName to “USB HDD:AddedFile.txt” –ログファイル。予め存在している必要有り。

 

— ログファイルを開き、含まれる内容を変数へ代入、ファイルを閉じる。

set FileHanderLog to open for access LogFullName

try

set ConvertedFiles to read FileHanderLog as string

end try

close access FileHanderLog

 

try

— 親フォルダに入っているサブフォルダを検索。

tell application “Finder”

tell folder strRootPath

set strSubFolderList to a reference to (every folder)

end tell

end tell

— 各サブフォルダを処理する為のループを開始。

set strSubFolderNameList to name of strSubFolderList

repeat with i from 1 to count of strSubFolderList

set strSubFolderName to (item i of strSubFolderNameList) as string

set strSubFolderPath to strRootPath & “:” & strSubFolderName

— サブフォルダ内に入っているファイルを検索。

tell application “Finder”

tell folder strSubFolderPath

set strFileList to (a reference to (every file))

end tell

end tell

— 処理中のサブフォルダに入っている各ファイルを処理する為のループを開始。

set strFileNameList to name of strFileList

repeat with j from 1 to count of strFileNameList

set strFileName to (item j of strFileNameList) as string

set strVideoFile to strSubFolderPath & “:” & strFileName

— ログファイルの内容を保持した変数内に現在処理中のファイル名があるか判断。

if (offset in ConvertedFiles of strFileName) ≤ 0 then

— iTunesに処理中のファイルを追加。

tell application “iTunes”

add strVideoFile

— ログファイルを開き、処理したファイル名を追加書き込みし、ファイルを閉じる。

set FileHanderLog to open for access LogFullName with write permission

set aEOF to get eof of FileHanderLog

try

write (strFileName & return) starting at (aEOF + 1) to FileHanderLog

end try

close access FileHanderLog

end tell

end if

end repeat

end repeat

end try

 

自動化するのであれば、これをアプリケーションとして保存してcrontab等で実行すれば決めた時刻や曜日に自動で処理をさせる事が出来ます。

 

Mac: rsyncによる2点間のファイルコピー (rsync, vpn, afp, applescript使用)

年末年始に今まで自宅に設置していた 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に作業させたい内容は次の通り。

  1. 予め[システム環境設定] – [ネットワーク] で設定しておいたVPN接続先に自動的に接続する。
  2. 実家のMacMiniの共有フォルダにafpで接続(マウント)する。
  3. 自宅のAirMac Extremeに接続のHDDにafpで接続(マウント)する。
  4. rsyncコマンドを走らせ、MacMini側の変更をAirMac Extreme側へコピーする。

ということで、エラー処理などを全く考慮していませんが紹介しちゃいます。

tell application “System Events”
tell current location of network preferences
set 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 if
set 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 tell
end if
end tell
end tell
前述の通り全くエラー処理はしていませんのであしからず。目的は達成できていると思っています。

ポイントは、afpでマウントした共有フォルダは /Volumes 以下にディレクトリとして見えるという事を利用して、同期元と同期先の2つのネットワーク上の共有フォルダをあたかもローカルフォルダの様に扱っています。rsyncコマンドはssh転送にも対応しているのでそれを使っても良いのですが、事前に鍵の生成や転送をするのが面倒だったのでまずは簡単に実現できる方法で試してみました。その反面、VPNや共有フォルダがネットワークの不調などで切断されると途中でファイル転送が中断されてしまう場合があります。

また、rsyncのオプションとして ‘–exclude=.DS_Store’ を指定しました。.DS_Storeが含まれたディレクトリの同期を行うと.DS_Storeで始まるファイル/ディレクトリが大量に転送される場合があるので除外しました。

エラー発生時の処理やtellコマンドとend tellコマンドの位置も調整しなければなりませんし、ファイル転送終了後に切断も出来ていない状態なのでまだまだ改善の余地がありますが、同じ様な事をお考えの方の参考になれば幸いです。より良い方法があれば是非共有して頂ければ助かります。

#想定していない動きをする事も考えられますので、流用される場合は自己責任でお願いします。意味の分からない場合は試さない方が安全だと思います。

AppleScriptメニューについて

Macの様々な作業を自動化するAppleScript。便利なのですが、よく使うスクリプトを手軽に実行する為の方法を考えたとき、このAppleScriptメニューは便利です。

MacのFinder上部にあるメニューバーに新しいアイコンが追加され、クリックする事でスクリプトを選んで実行できます。

ウチはiPhoneで既読にしてしまうと、Mail起動時にルールが適用されない受信ボックスのメールに対して、ルールを適用する為のスクリプトを作り、それを呼び出すのに良く利用しています。

このAppleScriptメニューはデフォルトでは表示されておらず、設定を変更しなければ現れません。

ということで、表示させるまでを説明してみます。

AppleScriptメニューとは

色々なアイコンが並んでいますが、一番左側のアイコン。これです。

システムに最初から組み込まれているスクリプトや、ユーザーが作成したスクリプトを簡単に実行する為のメニューです。

どうやって表示させるのか

「アプリケーション」-「ユーティリティ」-「AppleScriptエディタ」を起動します。

さらにAppleScriptエディタの「環境設定」を開きます。

一般タブにある「メニューバーにスクリプトメニューを表示」にチェックをつける事で、AppleScriptメニューが表示されるようになります。

さらに、「コンピュータスクリプトを表示」のチェックは、Mac OS Xに最初から含まれているスクリプトを表示するかどうかの設定です。チェックを付けた時と、付けていない時の見た目の違いはこんな感じです。

自作のスクリプトをメニューに追加するには?

上記スクリーンショットもそうですが、自作の良く使うスクリプトをメニューへ追加しなければ意味がありません。その為の方法です。

[AppleScriptメニュー」-「スクリプトフォルダを開く」-「ユーザ・スクリプト・フォルダを開く」をクリックします。すると、Finderでユーザ・スクリプト・フォルダが開かれるので、そのフォルダにAppleScriptメニューに表示したいスクリプトをコピーします。

もちろん、サブフォルダを作る事でAppleScriptメニューにもサブフォルダが表示されるので、スクリプトの種類によって分類したい場合などに便利です。

friio で地デジ録画

Windows用の地上デジタルチューナーですが、Macでも使えそうな情報が沢山あったので、先月、friioを購入しました。注文から3日で手元に届き、有志の方々が作ったMac用ドライバーや録画アプリケーションを入れて早速動作チェック。思ったよりもすんなり動きました。

従来は、NECのPK-AX10(アナログチューナーHDDレコーダー)でTV番組の録画予約を行っていましたが、今後friioで同様の事を実現する為、iPhoneを使って外出先からでも録画予約をしたくなり、自分でAppleScriptを作ってみました。色々なリソースを参考にしながら、ONTVサービスからのMAIL録画予約メールをMailで受け取り、その内容を自動で処理してiCalにアラーム付きイベントを追加する動作をするスクリプトです。

必要な物は

  • Mac OS X (Leopardで動作検証しました)
  • Mail (ONTVのMAIL録画予約を受信するために設定しておく)
  • iCal (当然Leopardに入っていますが…)
  • friio
  • Mac用friioドライバー
  • recfriio
  • Growl (通知が不要な方はスクリプトを解読して修正してください)
  • ONTVのユーザ登録とMAIL録画予約設定

といったところです。

詳しくはBlueDiamond Web.に掲載していますのでご覧下さい。

約1ヶ月、このAppleScriptで録画予約しながら使っていますが、順調に動いているようです。まだ修正の余地はありますが、もしfriioをMacで使われている方で使えそうであればどうぞ。