#!/usr/bin/perl
# +----------------------------------------------------------------------------+
# |                                StackSys                                    |
# |                         ron.sweeney@gmail.com                              |
# |                        http://www.stacksys.com                             |
# |----------------------------------------------------------------------------|
# |                                                                            |
# |----------------------------------------------------------------------------|
# | FILE       : nagios2lcd.pl                                                 |
# | CLASS      : Toys                                                          |
# | PURPOSE    : Show nagios status on an lcdproc server.                      |
# | USAGE      : ./nagios2lcd.pl server port interval                          |
# | NOTE       : This script runs on versions 2.0 of Nagios (Tested on 2.01b)  |
# | RESOURCE   : Nagios(http://www.nagios.org) LCDPROC(http://www.lcdproc.org/)|
# +----------------------------------------------------------------------------+

use IO::Socket;

&usage if (! $ARGV[0]);



# create a tcp connection to the lcdproc server
print "nagios2lcd Attempting to connect to lcdproc server... \n";
if ($handle = IO::Socket::INET->new(Proto     => "tcp",
                                    PeerAddr  => "$ARGV[0]",
                                    PeerPort  => "$ARGV[1]"))
{ 
  print "Successfully connected to lcdproc server.\n"; 
  
  print $handle "hello\n";
  print $handle "client_set nagios\n";
  print $handle "screen_add sum\n";
  print $handle "screen_set sum\n";
  print $handle "widget_add sum title title\n";
  print $handle "widget_set sum title {nagios2lcd - stacksys.com}\n"; 
  print $handle "widget_add sum crit string\n";
  print $handle "widget_add sum majr string\n";
  print $handle "widget_add sum minr string\n";

}
else
{ 
  die "Failed to connect to lcdproc server ($!).  Are you sure it's running ?\n"; 
#socket enema
$handle->autoflush(1);
}
&message;

sub message {

 
@nagios = `/usr/local/nagios/bin/nagiostats`;
foreach $line (@nagios) {

        if ($line =~m/Hosts Up\/Down\/Unreach/ ) {
        @hosts = split(/  +/, $line);

        @hostsvalues = split(/\//, $hosts[1]);

        $hostup = $hostsvalues[0];
        $hostdown = $hostsvalues[1];
        $hostunreach = $hostsvalues[2];
        $hostup =~s/ //g;
        $hostdown =~s/ //g;
        $hostunreach =~s/ //g;
        chop($hostunreach);
}
        elsif ($line =~m/Services Ok\/Warn\/Unk\/Crit/ ) {
        @services = split(/  +/, $line);

        @servicevalues = split(/\//, $services[1]);

        $serviceok = $servicevalues[0];
        $servicewarn = $servicevalues[1];
        $serviceunk = $servicevalues[2];
        $servicecrit = $servicevalues[3];

        $serviceok =~s/ //g;
        $servicewarn =~s/ //g;
        $serviceunk =~s/ //g;
        $servicecrit =~s/ //g;

        chop($servicecrit);
        
	}
        elsif ($line =~m/Status File Age:/ ) {
        @version = split(/  +/, $line);

        #@versionvalues = split(/  +/, $version[1]);
	$nagiosversion = $version[1];
	chop($nagiosversion);
 }
}



sleep(5);



my $gar="N/A";

#write to the lcd display
print $handle "widget_set sum crit 1 2 {Host:U-$hostup D-$hostdown U-$hostunreach}\n" or die "Nope.";
print $handle "widget_set sum majr 1 3 {Serv:O-$serviceok W-$servicewarn U-$serviceunk C-$servicecrit}\n" or die "Nope.";
print $handle "widget_set sum minr 1 4 {Age : $nagiosversion}\n" or die "Nope.";
sleep($ARGV[2]);
&message;
}

sub usage {
print <<USAGE;

   nagios2lcd -  LCDproc Client for Nagios(tm) 
   Ron Sweeney <ron.sweeney\@gmail.com>

   Usage: ./nagios2lcd.pl server port interval 
                  	      ^     ^      ^       
                              |     |      |       
                              |     |      |       
                              |     |      /       
   #:	 ./nagios2lcd.pl 10.10.2.6 13666 60 

 
   server- IP address of LCD daemon
   port- Port number LCD daemon is running on
   interval- Refresh value of message summary in seconds 

USAGE
exit 1;
}


