Subscribed unsubscribe Subscribe Subscribe

GNTPとRemoteForwardを使ってGrowl 1.3にリモートマシンから通知する

Mac Perl

今更ながらMac OS X Lionを使い始めていて(マウススクロールが逆になったのはあまり問題なく慣れた)、そういえば10.7向けのGrowl 1.3以降ではGNTPがサポートされているから以前にチャレンジしようとして失敗したリモートマシンからの通知も簡単にできるようになったはず、と思って試してみた。
簡単にGNTPを使えるGrowl::GNTPを使用。
Yasuhiro Matsumoto / Growl-GNTP - search.cpan.org
まずはちゃんとコレを使って通知ができるか試してみる。

#!/usr/bin/env perl
use strict;
use warnings;
use Growl::GNTP;

my $growl = Growl::GNTP->new;
$growl->register([
    { Name => 'hoge' },
]);
$growl->notify(
    Event => 'hoge',
    Title => 'title',
    Message => 'message',
);


ちゃんと通知される。

このGrowl 1.3はデフォルトで23053ポートでGNTPの通知を待ち受けている。

local $ netstat -a | grep 23053
tcp46      0      0  *.23053                *.*                    LISTEN
tcp4       0      0  *.23053                *.*                    LISTEN

ので、ここに向かってGNTPで叩くことさえ出来れば良いわけで、sshログインしたリモートサーバからでも良い。
sshログインする際に

local $ ssh -R 23053:127.0.0.1:23053 [user@]hostname]

と"-R"オプションでRemoteForward指定して繋ぐか、もしくは$HOME/.ssh/config

Host ****
     HostName   ***.***.***.***
     User       username
     RemoteForward      23053   127.0.0.1:23053

のように指定しておく。こうすれば、リモートマシンでの23053ポートへの接続がローカルマシンの23053にそのまま繋がる(…という理解で良いのかな?)。

remote $ netstat -anp | grep 23053
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp        0      0 127.0.0.1:23053             0.0.0.0:*                   LISTEN      -                   
tcp        0      0 ::1:23053                   :::*                        LISTEN      -   

この状態で、このリモートマシンで上記と同じスクリプトを実行しても、ローカルで実行したときと同じように自分のローカルマシンのGrowlに通知が来るようになる。


つまり、sshログインする際にRemoteForward指定してログインするようにしていれば、どんなリモートマシンからでも「GNTPで127.0.0.1:23053にメッセージ送る」ことさえ出来ればローカルマシンのGrowlに通知が可能となる。上記の例だとPerlでGNTPモジュールが無いといけないけど、最小限の処理だけまとめた一つのスクリプトにするとか無理矢理詰め込んだワンライナーでaliasにするとか出来れば、"汎用的かつ簡単に"どのリモートマシンからでもローカルマシンのGrowlに通知できるようになるんじゃないでしょうか。
どうするのが一番簡単かな。