#!/usr/bin/perl -w
#
# check_nagios_db.pl:	check_nagios for nagios-mysql and nagios-pgsql

use strict;
$|++;

use vars qw/$opt_e $opt_c $opt_D/;

$ENV{"PATH"} = "/usr/bin:/usr/sbin:/bin";

use Getopt::Std;
use DBI;
use lib '/usr/lib/nagios/plugins';
use utils qw/%ERRORS/;

my $CFG_DEF = "/etc/nagios/cgi.cfg";
my $EXPIRE_DEF = 5; ## expressed in minutes
my $STATE = $ERRORS{WARN};

sub usage {
        print STDERR "\n";
        print STDERR "$0 -D <mysql|Pg> [-e <expire time in minutes>] [-c <cgi.cfg location>]\n";
        print STDERR "\n";
        exit $ERRORS{UNKNOWN};
}

getopt("e:c:D:");

my $EXPIRE = $opt_e || $EXPIRE_DEF;
my $CFG = $opt_c || $CFG_DEF;
my $driver = $opt_D;

if( (!defined($driver)) || ($driver ne "Pg" && $driver ne "mysql") ){
	if(defined($driver) && $driver eq "pgsql") { $driver="Pg"; }
	else {
		print STDERR "error: driver must be 'mysql' or 'Pg'!\n";
		usage();
	}
}

my $QUERY;
if ($driver eq "Pg"){
	$QUERY = "select *, round(date_part('epoch',last_update)) as ut from programstatus;";
} elsif ($driver eq "mysql"){
	$QUERY = "select *, UNIX_TIMESTAMP(last_update) as ut from programstatus;";
} 

( -f $CFG ) or die "Can't open config file '$CFG': $!\n";

my ($dbhost, $dbport, $dbuser, $dbpass, $dbname);

open(F, "< $CFG") || die("can not open $CFG: $!");
while ( <F> ) {
        if (/^xsddb_host=(.+)/) { $dbhost = $1; next; };
        if (/^xsddb_port=(.+)/) { $dbport = $1; next; };
        if (/^xsddb_database=(.+)/) { $dbname = $1; next; };
        if (/^xsddb_username=(.+)/) { $dbuser = $1; next; };
        if (/^xsddb_password=(.+)/) { $dbpass = $1; next; };
}
close(F);

my $dsn = "DBI:$driver:dbname=$dbname";
if(defined($dbhost)) { $dsn .= ";host=$dbhost"; } else { $dbhost=""; }
if(defined($dbport)) { $dsn .= ";port=$dbport"; } else { $dbport=""; }
if(!defined($dbuser)) { $dbuser=""; }
if(!defined($dbpass)) { $dbpass=""; }

#print "connecting host=$dbhost,port=$dbport,user=$dbuser,pass=$dbpass,db=$dbname)\n";

my $dbh = DBI->connect($dsn, $dbuser, $dbpass, {'RaiseError' => 1});

my $sth = $dbh->prepare($QUERY);
if (!$sth) { die "Error:" . $dbh->errstr . "\n"; }
if (!$sth->execute) { die "Error:" . $sth->errstr . "\n"; }

my %status = ();

my $names = $sth->{'NAME'};
my $numFields = $sth->{'NUM_OF_FIELDS'};
my $ref = $sth->fetchrow_arrayref;
for (my $i = 0;  $i < $numFields;  $i++) {
        $status{"$$names[$i]"} = $$ref[$i];
}

#foreach (keys(%status)) {
#       print "$_: $status{$_}\n";
#}

my $lastupdated=undef;
if(defined($status{ut})){
	$lastupdated = time() - $status{"ut"};
}

if ( !defined($lastupdated)){
	print "Nagios db CRITICAL: can not determine program status\n";
	exit $ERRORS{CRITICAL};
} elsif (! ($lastupdated < $EXPIRE*60)) {
	print "Nagios WARNING: program status updated $lastupdated (>= ".($EXPIRE*60).") seconds ago\n";
	exit $ERRORS{WARNING};
} else {
	print "Nagios OK: program status updated $lastupdated seconds ago\n";
	exit $ERRORS{OK};
}
