diff --git a/galanga/nagios-irc-bot.pl b/galanga/nagios-irc-bot.pl index a85449a..ddb4d28 100755 --- a/galanga/nagios-irc-bot.pl +++ b/galanga/nagios-irc-bot.pl @@ -24,6 +24,7 @@ use strict; use Net::IRC; use POSIX "sys_wait_h"; use Term::ANSIColor qw/ :constants /; +use Data::Dumper; # # Create the IRC and Connection objects @@ -31,6 +32,7 @@ use Term::ANSIColor qw/ :constants /; my $version = "BZBot v1.3 - Modified for use with Nagios."; my $irc = new Net::IRC; +my $channel = '#april-admin'; #open IPADDR, "; @@ -80,16 +82,16 @@ sub on_connect { my $self = shift; $identified_to_nickserv = 1; - print "Joining #april-admin...\n"; - + print "Joining $channel...\n"; # FIXME: this is broken right now. when this is re-added, it has to happen # before we try to join channels. #print "Identifying to NickServ...\n"; #$self->privmsg('nickserv',"identify xxx"); # CONFIG: channels you want us to announce to ... - $self->join("#april-admin"); + $self->join($channel); #$self->join("#status"); + &refresh (); } # Handles some messages you get when you connect @@ -231,7 +233,7 @@ sub on_public { } } elsif ($arg =~ /^(?:$mynick[,: ]|!)\s*help/i) { $self->privmsg([ @to ], "$nick: You're right, I need help!"); - $self->privmsg([ @to ], "$nick: supported commands: ignore, unignore, ack, unack, ta gueule, help"); + $self->privmsg([ @to ], "$nick: supported commands: ignore, unignore, ack, unack, chut, list, refresh, recheck, help"); } elsif ($arg =~ /(?:hey|hi|hello|yo)(?:\.|,|\!|\s_)/i) { $self->privmsg([ @to ], "Yo, $nick!"); } elsif ($arg =~ /(?:$mynick[,: ]|!)\s*ta\s*g(:?ueu|o)le/i || @@ -248,8 +250,34 @@ sub on_public { $::tagueule = 0; &adjust_nick ( $conn ); } + } elsif ($arg =~ /^(?:$mynick[,: ]|!)\s*list\s*$/) { + my $id = 0; + foreach ( @ACKS ) + { + my ( $host, $svc, $state, $content ) = @$_; + my $msg = sprintf ( "[%02d] %s:%s is %s: %s", + ($id++), $host, $svc, $state, $content ); + $conn->privmsg([ @to ], $msg); + } + } elsif ($arg =~ /^(?:$mynick[,: ]|!)\s*refresh\s*$/) { + &refresh (); + $conn->privmsg([ @to ], sprintf ( "%d problemes enregistres", ( scalar @ACKS )) ); + } elsif ($arg =~ /^(?:$mynick[,: ]|!)\s*recheck:?\s*(\d*)$/) { + if ( $ACKS[$1] ) + { + my ( $host, $svc ) = @{ $ACKS[$1] || [ undef, undef ] }; + open CMDPIPE,">",$nagioscmd; + printf CMDPIPE "[%lu] SCHEDULE_FORCED_SVC_CHECK;%s;%s;%lu\n",time(),$host,$svc,time(); + printf "[%lu] SCHEDULE_FORCED_SVC_CHECK;%s;%s;%lu\n",time(),$host,$svc,time(); + close CMDPIPE; + $conn->privmsg([ @to ], sprintf ( "Recheck forcé pour %s: %s", $host, $svc ) ); + } + else + { + $conn->privmsg([ @to ], sprintf ( "ID inconnu: %d", $1 ) ); + } } else { - # $self->privmsg([ @to ], "Yo!"); + $self->privmsg([ @to ], "Yo!"); } } } @@ -354,7 +382,7 @@ sub on_notice { print "Joining channels...\n"; # CONFIG: channels that should be joined go here. - $self->join("#april-admin"); + $self->join($channel); } } @@ -367,6 +395,30 @@ sub ackable { return sprintf( '[%02d] ', $id ); } +sub refresh { + $ACKCT=0; + @ACKS=(); + open FILE, '/var/lib/icinga/status.dat' or die $!; + while ( ) + { + if ( /^servicestatus/ ) + { + my %keys; + do + { + $_ = ; + chomp; + $keys{$1} = $2 if ( /\s*([^=]*)=([^=]*)/ ); + } + while ( $_ && ! /^}/ ); + my @states = ( 'OK', 'WARNING', 'CRITICAL', 'UNKNOWN' ); + $ACKS[$ACKCT++] = [ $keys{'host_name'}, $keys{'service_description'}, $states[$keys{'current_state'}], $keys{'plugin_output'} ] if $keys{'current_state'} > 0; + } + } + close FILE; +} + + print "Installing handler routines..."; $conn->add_global_handler('ping', \&on_ping); @@ -417,7 +469,7 @@ while (1) { if ($identified_to_nickserv) { # CONFIG: change where we announce stuff here - my @channels = ('#april-admin'); + my @channels = ($channel); while (defined (my $line = )) { print $line; chomp($line);