Nagios jabber notification

From GridPP Wiki
Jump to: navigation, search

Nagios can be configured to send notifications by various means, including Jabber, which these days includes Google talk's XMPP service.

See the ScotGrid Blog entry for an overview. Configuration for nagios was as follows:

appended into commands.cfg (where I keep the notification methods)

# 'host-notify-by-jabber' command definition
define command{
        command_name    host-notify-by-jabber
        command_line    /usr/local/bin/notify_via_jabber $CONTACTPAGER$ "Host '$HOSTALIAS$' is $HOSTSTATE$ - Info
: $HOSTOUTPUT$"
        }

# 'notify-by-jabber' command definition
define command{
        command_name    notify-by-jabber
        command_line    /usr/local/bin/notify_via_jabber $CONTACTPAGER$ "$NOTIFICATIONTYPE$ $HOSTNAME$ $SERVICED
ESC$ $SERVICESTATE$ $SERVICEOUTPUT$ $LONGDATETIME$"
        }

The notify_via_jabber script is as follows:

#!/usr/bin/perl -w
#
# script for nagios notify via Jabber / Google Talk Instant Messaging
#   using XMPP protocol and SASL PLAIN authentication.
#
# author: Andrew Elwell <A.Elwell@physics.gla.ac.uk>
# based on work by Thus0 <Thus0@free.fr> and  David Cox
#
# released under the terms of the GNU General Public License v2
# Copyright 2007 Andrew Elwell.

use strict;
use Net::XMPP;

## Configuration
my $username = "your.google.username";
my $password = "your.google.password";
my $resource = "nagios";
## End of configuration


my $len = scalar @ARGV;
if ($len ne 2) {
   die "Usage...\n $0 [jabberid] [message]\n";
}
my @field=split(/,/,$ARGV[0]);
#------------------------------------

# Google Talk & Jabber parameters :

my $hostname = 'talk.google.com';
my $port = 5222;
my $componentname = 'gmail.com';
my $connectiontype = 'tcpip';
my $tls = 1;

#------------------------------------

my $Connection = new Net::XMPP::Client();

# Connect to talk.google.com
my $status = $Connection->Connect(
       hostname => $hostname, port => $port,
       componentname => $componentname,
       connectiontype => $connectiontype, tls => $tls);

if (!(defined($status))) {
   print "ERROR:  XMPP connection failed.\n";
   print "        ($!)\n";
   exit(0);
}

# Change hostname
my $sid = $Connection->{SESSION}->{id};
$Connection->{STREAM}->{SIDS}->{$sid}->{hostname} = $componentname;

# Authenticate
my @result = $Connection->AuthSend(
       username => $username, password => $password,
       resource => $resource);

if ($result[0] ne "ok") {
   print "ERROR: Authorization failed: $result[0] - $result[1]\n";
   exit(0);
}

# Send messages
foreach ( @field ) {
$Connection->MessageSend(
        to       => "$_\@$componentname", 
        resource => $resource,
        subject  => "Notification",
        type     => "chat",
        body     => $ARGV[1]);
}