At the hotel, our 'net connection goes up and down constantly. Rather than keep switching over to a terminal to ping something, I wanted to be alerted whenever the 'net was back. Searching for tools for OS X to do this for me was problematic because, well, the 'net kept going down. Now I get Growl alerts.
#!/usr/bin/perl use strict; use warnings; use Mac::Growl ':all'; use Net::Ping; use Getopt::Long; # set up options my ( $sleep, $sticky ) = ( 60, 1 ); GetOptions( "sleep=i" => \$sleep, # number of seconds "sticky!" => \$sticky, # sticky growl notifications? ); # set up MacGrowl RegisterNotifications( $0, [qw/ping/], [qw/ping/], ); my ($image) = grep { -e } ( '/Applications/Utilities/Installer.app/Contents/Resources/Caut.tiff', '/Applications/Utilities/Installer.app/Contents/Plugins/TargetSelect.bundle/Contents/Resources/Caut.tiff' ); # set up ping my $host = shift || 'www.google.com'; my $p = Net::Ping->new( "tcp", 3 ); $p->{port_num} = ( getservbyname( "http", "tcp" ) || 80 ); # do that first ping my $HOST_LAST_STATUS = !!( $p->ping($host) ); show_status( $host, $HOST_LAST_STATUS, $sticky, $image ); while (1) { my $host_status = !!( $p->ping($host) ); if ( !$host_status ) { $host_status = retry( $p, $host ); } if ( $host_status ne $HOST_LAST_STATUS ) { show_status( $host, $host_status, $sticky, $image ); } $HOST_LAST_STATUS = $host_status; sleep $sleep; } sub retry { # because it might just be a flaky, intermittant connection my ( $p, $host ) = @_; for ( 1 .. 3 ) { if ( $p->ping($host) ) { return 1; } } return ''; } END { $p->close() } sub show_status { my ( $host, $status, $sticky, $image ) = @_; $status = $status ? 'up' : 'down'; PostNotification( $0, 'ping', "$host status", "$host is $status", $sticky, -1, $image ); }
Holy crap, that rocks!
Doesn't this already handle what you want? It's in the Extras included with Growl.
Re:HardwareGrowler?
Ovid on 2008-08-13T00:29:41
I've no idea if that handles that or not. Until today, I've never touched Growl aside from third-party software which uses it. I'll look into that though. Thanks for the tip
:)