« 激突 Paragon NTFS for Mac OS X 9.0 vs. Tuxera NTFS for Mac | トップページ | もうやるつもりはなかったのですが、 »

2011年8月28日 (日)

Automatorを使って外付けドライブをFilevault 2でラクラク暗号化コンバート


少し前に同じことをやろうとして簡単にAppleScriptで書こうとしたら、けっこう色々な情報をコマンドで集めないとまともなのができないことがわかって断念していたのですが、今日ちょっと時間があったのでAutomatorのドロップレットのサンプルを書いてみました。本当はFilevault 2ではなくCoreStorageと書くべきなんでしょうが、まあそこまで細かくいかなくても良いでしょうということタイトルではFilevault 2にしておきました。ソースと説明は続きをどうぞ。



やっていることはすごく単純で、

1.CoreStorageで作られたボリュームがあるかどうかをチェック。

2.なかったらそのままドロップされたボリュームを暗号化コンバートするかどうか訊く。CoreStorageで作られたボリュームがあったら、その中にドロップされたボリュームがあるかどうかチェック。なかったら暗号化コンバートするかどうか訊く。

3.CoreStorageで作られたボリュームの中にドロップされたボリュームがあったら、ドロップされたボリュームの状況をチェック。状況はコンバート完了、コンバート中、リバート中、消去で作られたボリュームの四つに仕分け。コンバート完了とコンバート中の場合はリバートするか訊く。リバート中の場合はリバート終了までコンバートできないことを伝え、消去で作られたボリュームの場合はディスクユーティリティを使って処理するように伝える。


とこの三つだけで、このブログに相応しく外付けドライブのコンバートとリバートだけを扱うアプリです。本当はボリュームの消去とかもできないことはないのですが、ディスクユーティリティで安全かつ簡単にできることをわざわざAutomatorを処理する意味は全くないですから。

Automatorでのやり方ですが、

1)Automatorを立ち上げてアプリケーションを選択します。

Fv2c_1


2)Automatorのライブラリのユーティリティから⸢シェルスクリプトを実行⸥を選んで右側のウィンドウにドロップします。ドロップした後に入力の引き渡し方法を⸢引数として⸥に変更します。
Fv2c_2


3)その後に下の方にあるソースをコピーします。Automatorのウィンドウの中身を消して丸ごとコピーするか、必要な部分だけをコピーして、アプリに名称を付けて保存すれば出来上がりです。わたしはFV2Convという名称で保存しました。
Fv2c_3


ソースを見ていただいておわかりのように、シェルとperlとAppleScriptのキマイラです。ドロップレットですのでいくつもボリュームをまとめて落としても大丈夫ですけど、AppleScriptとシェルスクリプトの実行速度の差のせいでドロップしたボリュームの数だけウィンドウがちぐはぐに出てきてしまうかもしれません。コードをもっと効果的に書けるんでしょうけど、一通り書いた後に動作をチェックして、その後に一回手直ししただけのサンプルですのでこの程度でご堪忍を。今のところわたしの環境では何も問題が起きていません。同名のボリュームとかがあっても問題なく動きました。とは言ってもディスク関連を扱うのですから、ソースをいじる方は細心の注意を払ってください。

for f in "$@"
do
 volumecheck=$(echo -n $(diskutil cs list | head -1));
 mountpoint=$(basename "$f" | tr -d "\n");
 volumename=$(diskutil info "$f" | perl -ne 'if(/Volume Name:/){s/^.*Volume Name: +?(.*?)$/$1/;s/ +//;print;}' | tr -d '\n');
 volumeinfo=$(diskutil info "$f" | head -1 | perl -ne 'perl -ne 's/^.*Device Identifier: +(.*?)$/$1/;print;' | tr -d '\n');
 function conv(){
  q1="ボリューム$volumename($volumeinfo)を暗号化コンバートしますか?";
  osascript -e 'tell application "System Events"' -e "activate" -e 'display dialog "' -e "$q1" -e '" buttons {"暗号化しない", "暗号化する"} default button 2' -e 'set kotae to button returned of result' -e 'if kotae is "暗号化する" then' -e 'display dialog "パスワードを入力してください。" default answer ""' -e 'set passwd to text returned of result' -e 'display dialog "準備をします。次のメッセージが出るまでしばらくお待ちください。" buttons{"OK"} giving up after 2' -e 'do shell script "diskutil cs convert '$mountpoint' -passphrase " & passwd & ";"' -e 'display dialog "暗号化コンバートを開始しました。" buttons {"OK"}' -e 'else' -e 'return' -e 'end if' -e 'end tell';
 }

 function convre(){
  osascript -e 'tell application "System Events"' -e "activate" -e 'display dialog "' -e "$q2" -e '" buttons {"リバートしない", "リバートする"} default button 2' -e 'set kotae to button returned of result' -e 'if kotae is "リバートする" then' -e 'display dialog "パスワードを入力してください。" default answer ""' -e 'set passwd to text returned of result' -e 'display dialog "準備をします。次のメッセージが出るまでしばらくお待ちください。" buttons{"OK"} giving up after 2' -e 'do shell script "diskutil cs revert '$mountpoint' -passphrase " & passwd & ";"' -e 'display dialog "暗号化リバートを開始しました。リバートが終わるまでコンバートはできません。" buttons {"OK"}' -e 'else' -e 'return' -e 'end if' -e 'end tell';
 }



 if [ "$volumecheck" = "No CoreStorage logical volume groups found" ];
 then
  conv;
 else
  results=$(perl -e '($vname, $vinfo)=split(/:/, $ARGV[0]);$list=qx/diskutil cs list/;@volumes=split(/\n\+--/, $list);$sikibetu="";foreach $volume(@volumes){@lines=split(/\n/, $volume);if(($lines[2]=~/$vname/)&&($lines[25]=~/$vinfo/)){$kafuka=$lines[30];$kafuka=~s/^.*?Revertible: +?(.*?)$/$1/;$kafuka=~s/( |\n)//g;if($kafuka eq "No"){$sikibetu=$kafuka;}else{$sikibetu=$lines[19];$sikibetu=~s/^.*?Conversion Status: +?(.*?)$/$1/;$sikibetu=~s/( |\n)//g;if($sikibetu eq "Converting"){if($lines[17]=~/^.*?Encryption Type: +?None/){$sikibetu="Reverting"}}}}}if(!($sikibetu eq "")){print $sikibetu;}else{print "nonexist";}' "$volumename:$volumeinfo");


  case $results in
   nonexist)
    conv;;
   No)
    msg1="ボリューム$volumename($volumeinfo)は暗号化コンバートもリバートもできません。ディスクユーティリティを使って処理してください。";
    osascript -e 'tell application "System Events"' -e "activate" -e 'display dialog "' -e "$msg1" -e '" buttons {"OK"}' -e 'end tell';;
   Reverting)
    msg2="ボリューム$volumename($volumeinfo)は暗号化リバートの最中です。リバートが終わるまでコンバートはできません。";
    osascript -e 'tell application "System Events"' -e "activate" -e 'display dialog "' -e "$msg2" -e '" buttons {"OK"}' -e 'end tell';;
   Converting)
    q2="ボリューム$volumename($volumeinfo)は暗号化コンバートの最中です。リバートしますか?";
    convre;;
   Complete)
    q2="ボリューム$volumename($volumeinfo)は暗号化コンバートを完了しています。リバートしますか?";
    convre;;

  esac
 fi
done

« 激突 Paragon NTFS for Mac OS X 9.0 vs. Tuxera NTFS for Mac | トップページ | もうやるつもりはなかったのですが、 »

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック

« 激突 Paragon NTFS for Mac OS X 9.0 vs. Tuxera NTFS for Mac | トップページ | もうやるつもりはなかったのですが、 »

2019年9月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30          

最近のトラックバック