2016年5月4日水曜日

"SleepWatcher"の導入にちょいと苦戦(その2)

前回"SleepWatcher"の設置とdaemon化まで完了したので、ここからは"SleepWatcher"に実行してもらうサーバーボリュームのマウント作業のお話。

いろんな先駆者さんのページを参照させてもらうと多分1番多いのは"Automator"で作った自動ワークフローをアプリ化して実行させるというもの。

自分も安易にAutomatorで作ってしまおうかと試みたのですが、うちのファイルサーバーにはボリュームが複数あって、サーバーに接続した時点でボリュームの選択画面(ダイアログ)が出て止まってしまいます。
"OK"ボタンを自動クリックするとか、キーボードの"リターン"を自動入力させるかなどいろいろ考えたのだけれど、いまいちスマートに処理されない。

そもそもシェルスクリプトを実行する環境まで整えておいて、わざわざ別にアプリを用意するってのもすごく遠回りな気がして"Automator"の利用はやめて普通にコマンドを使うことに切り替えました。

外付けHDDと違って "diskutil" コマンドではサーバーボリュームはマウントできないので、Macのボリュームをマウントするのに最適な "mount_afp" コマンドを使って実行。
manによると書式は以下のとおり。

mount_afp afp://[user[;AUTH=uamname][:password]@]host[:port]/volumename node.

わかりづらいけど、今回ウチの場合は
mount_afp afp://user_name:passwd@192.168.xxx.xxx/Data /Volumes/Data
って感じ。

"afp_url"の記述もmanによれば"IP Address"か"AppleTalk Name"どちらでも良い感じだったので、簡単だったIPで記述。
パスワードが平文ベタ書きだけど、お家ネットワークなのでこの際気にしない。

あと、マウントの前にマウントポイント(ディレクトリ)が存在しないとエラーになるので

mkdir /Volumes/Data

というコマンドも追加。
一つ悩んだのが、スリープ突入時に処理する ".sleep" のスクリプトを使うかどうか。

どうせスリープ復帰時にアンマウントされてしまうならわざわざ処理しなくても良いかとも思ったのだけれど、テストをしてみるとイマイチうまくいかない。

たぶん正常にアンマウントされていないと、復帰時にシステムがボリュームを探す動作と ".wakeup" のマウントスクリプトが実行されるタイミングが合わない様子。
ということで ".sleep" も利用してボリュームをきっちりアンマウントさせてからスリープに入るように

diskutil unmount /Volumes/Data

を記述して保存。
まとめると、

".sleep" の内容
#!/bin/sh
diskutil unmount /Volumes/Data

".wakeup" の内容
#!/bin/sh
mkdir /Volumes/Data
mount_afp afp://user_name:passwd@192.168.xxx.xxx/Data /Volumes/Data

という2つのファイルを作成。
"SleepWatcher"の動作テストをする前にスクリプト単体で動かして ".sleep" でアンマウント、".wakeup" で再マウントの動作が正常に出来ることを確認。

で、いよいよ"SleepWatcher"のテストコマンド
$ /usr/local/sbin/sleepwatcher --verbose --sleep ~/.sleep --wakeup ~/.wakeup
で動作確認をしてみると何やらエラーを吐いてボリュームが再マウントされない。

Unmount successful for /Volumes/Data
sleepwatcher: sleep: /Users/hogehoge/.sleep: 0
mkdir: /Volumes/Data: File exists
mount_afp: AFPMountURL returned error -1069, errno is -1069
sleepwatcher: wakeup: /Users/hogehoge/.wakeup: 54016

".wakeup"による再マウント動作ではなぜか"mount_afp"のエラーで失敗してしまう。
  Balun Software (Info)さんのサイトでエラー番号"error - 1069"を調べてみると

AFPMountURL returned error -1069, errno is -1069
・error -1069 = aspNoServers (No servers at that address)
・サーバー名を間違えていた。
との事らしい。

いやいや、それはおかしい。
ターミナルから".wakeup"を単独実行すれば100%問題なくマウントできる。
"afp_url"の記述にミスが有るとは思えない。

しばらくのたうち回ったけれど"SleepWatcher"からの実行がどうにも成功しないので、半ば諦めかけた最後にダメ元で"afp_url"をIPアドレスからサーバー名にしてみることに...。

出来ました。(^_^;
どんな理由でIPアドレスだとダメなのか全くわかりませんが、"afp_url"をマシン名にしたところあっさり成功するようになりました。 (逆のパターンはよくあるのですけどね...)

ちなみに"afp_url"の名前は一度接続したことのあるサーバーであれば、"Finder"の「移動」メニューから「サーバーへ接続...」を選択して出てくるウィンドウで確認できます。


ローカルネットワークで共有している"Time Capsule"の場合 afp://Time%20Capsule._afpovertcp._tcp.local
といったURLとなります。

最後の最後でかなり手間取りましたがなんとか希望の環境が実現できました。

【追伸】
"diskutil"による、アンマウントであれば、".wakeup"に記述した"mkdir"の行は必要ないかもしれませんね。 (Finderのイジェクト動作と違ってアンマウント時にマウントポイントを削除しないため)

0 件のコメント :

コメントを投稿