心魅 - cocoromi -

半角スペース時々全角

VMからホストOSのMacのgrowlにnotifyを送る

以前こんなエントリー 処理時間が一定以上かかったらGrowlで通知するzshrc - 心魅 〜 cocoromi 〜を書きましたが、現在の職業柄、コマンドの実行はVMで行っています。
なので、以前の仕組みではうまくいきません。

そこで、今度はGrowlのGrowlTalk over UDPプロトコルを使って遠隔からgrowlに通知を送ります。


目次

  1. 受信側(Mac)の設定
  2. 前フリ
  3. 送信側の準備
  4. 確認

1. 受信側(Mac)の設定

Growlに外部からの通知を許可する設定をします。

System PreferenceからGrowl>Networkタブへ遷移し、以下の項目を設定します

  • Listen for incoming notifications
  • Allow remote application registration
    • Optionalな気がしますが、検証してません。

コレで設定を行ったGrowlは前述のGToUで通知を受け取ることが出来るようになります。

2. 前フリ

次はVM側の設定をするわけですが、GToUで会話するためになんとかせにゃなりません。
慣れてる人は自分で作ったほうがいいかもしれませんが、ここは既存のライブラリでサクっと済ませてしまいましょう。

すでにいくつか出回っているのでリストしておきます。php以外は使ったことありません。

3. VM側の準備

以下は上記netgrowl.phpを使った場合の説明をします。

  • 1. netgrowl.phpを適当な場所に置く
    • 色々考えた結果 $HOME/binに置きました
  • 2. netgrowl.phpを少しラップする
    • 送信先やアプリケーション名およびパスワードなんかをハードコーディングしてしまったものでラップします。
    • これも$HOME/binに置きます。
    • ソースはこんな感じ
    • 適当にアレンジしてください
  • 3. 止めにzshrcを編集します。
local COMMAND=""
local COMMAND_TIME=""
precmd() { 
    if [ "$COMMAND_TIME" -ne "0" ] ; then 
        local d=`date +%s`
        d=`expr $d - $COMMAND_TIME`
        if [ "$d" -ge "2" ] ; then
            COMMAND="$COMMAND "
            php $HOME/bin/growl.shell.php "${${(s: :)COMMAND}[1]}" "$COMMAND" 
        fi  
    fi  
    COMMAND=""
    COMMAND_TIME="0"
}
preexec () {
    COMMAND="${1}"
    COMMAND_TIME=`date +%s`
}

4. 確認

準備ができたら sleep 3とかやってローカルのGrowlが反応するか確かめましょう。
うまくいくとGrowlの設定画面にアプリケーションとしてリストされます。

Configureからアプリケーション毎に個別に表示や、音を鳴らすなどの設定ができるので、ネット経由の通知だけ見た目を変えたりすることもできます。


まとめ

なんかSSHのポートフォワードを使って無理やり遠隔のホストから送ったりしてる人もいるみたいですが、なにかとコマンドの終了がわかると便利ですよ。
Growlをつかって外部ホストのイベントを手元の端末でキャッチ!
時間は大切に。


コレを使って他人のmacに通知を送って遊ぶの楽しそう。おきろーとか はらへったーとか こっそりおくれますね!