#!/usr/bin/perl

use strict;
use lib "/usr/lib/nagios/plugins";
use utils qw($TIMEOUT %ERRORS &print_revision &support);
use vars qw($PROGNAME);

use Getopt::Long qw(:config no_ignore_case bundling);
use Pod::Usage;
use IO::Socket::INET;

my ($warn_max, $crit_max, $warn_min, $crit_min);
my ($opt_h, $opt_V);

$PROGNAME = "check_pcmeasure";
sub print_help ();
sub print_usage ();

$ENV{'PATH'}='';
$ENV{'BASH_ENV'}='';
$ENV{'ENV'}='';

my $TIMEOUT = 10.0;
my $perfdatastring = '';# for performance data
my $ERR;		# RRD error string

my $remote_host	= '';	# server running pcmeasure
my $remote_port	= 4000;	# default tcp port
my $sensor	= '';	# i.e. com1.1, lpt2.4
my $verbose    	= 0;	#
my $help	= 0;	# 
my $printversion = 0;	#

my $version	= '$Revision: 1.7 $ / $Date: 2006/06/09 16:42:00 $ / wob ';

GetOptions(
   "H|host=s"		=> \$remote_host,
   "p|port=s"		=> \$remote_port,
   "W|warn-max=s"	=> \$warn_max,
   "C|crit-max=s"	=> \$crit_max,
   "w|warn-min=s"	=> \$warn_min,
   "c|crit-min=s"	=> \$crit_min,
   "S|sensor=s"		=> \$sensor,
   "h|help"		=> \$opt_h,
   "V|version"		=> \$opt_V);

if ($opt_h) {
     print_help();
     exit $ERRORS{'OK'};
}

if ($opt_V) {
  print_revision($PROGNAME,'$Revision: 1.8 $'); #'
  exit $ERRORS{'OK'};
}

my $socket = IO::Socket::INET->new(PeerAddr => $remote_host,
				   PeerPort => $remote_port,
				   Proto    => "tcp",
				   Type     => SOCK_STREAM,
				   Timeout  => $TIMEOUT,
				  );

if ($@) {
   print STDERR "Can't open Socket to host $remote_host\n";
   exit $ERRORS{'UNKNOWN'};
};

print $socket "pcmeasure.$sensor\r\n";
my $answer = <$socket>;
close($socket);

$answer =~ s/[\r][\n]//;

if ($verbose) {
   print STDERR "$answer\n";
}

if ( $answer =~ m/valid=(\d+)/) {
   my $valid = $1;
   if ($valid != 1 ) {
      print STDOUT "WARNING: answer not valid: $answer\n";
      exit $ERRORS{'WARNING'};
   }
} else {
   print STDOUT "UNKNOWN: no valid tag found: $answer\n";
   exit $ERRORS{'UNKNOWN'};
}
   
if ( $answer =~ m/value=\s*([+-]{0,1}[.\d]+)/) {
   my $value = $1;

   my $perfcrit = 0;
   my $perfwarn = 0;
 
   $perfcrit = $crit_max if (defined($crit_max));
   $perfwarn = $warn_max if (defined($warn_max));

   $perfdatastring = "|value=$value;$perfwarn;$perfcrit;";

   if ( defined($crit_max) && $value > $crit_max ) {
      print STDOUT "CRITICAL Value $sensor: $value > $crit_max $perfdatastring\n";
      exit $ERRORS{'CRITICAL'};
   }
   if ( defined($warn_max) && $value > $warn_max ) {
      print STDOUT "WARNING: Value $sensor: $value > $warn_max $perfdatastring\n";
      exit $ERRORS{'WARNING'};
   }

   if ( defined($crit_min) && $value < $crit_min ) {
      print STDOUT "CRITICAL Value $sensor: $value < $crit_min $perfdatastring\n";
      exit $ERRORS{'CRITICAL'};
   }
   if ( defined($warn_min) && $value < $warn_min ) {
      print STDOUT "WARNING: Value $sensor: $value < $warn_min $perfdatastring\n";
      exit $ERRORS{'WARNING'};
   }

   print STDOUT "OK: Value $sensor: $value $perfdatastring\n";
   exit $ERRORS{'OK'};

} else {
   print STDOUT "UNKNOWN: $answer\n";
   exit $ERRORS{'UNKNOWN'};
}

sub print_usage () {
  print "Usage: $PROGNAME -H <host> -S <sensor> [-p <port>] [-w <warn_min>]\n";
  print "                       [-c <crit_min>] [-W <warn_max>] [-C <crit_max>]\n";
}

sub print_help () {
  print_revision($PROGNAME,'$Revision 1.8 $');
  print "Copyright (c) 2007 Wolfgang Barth\n";
  print "              2008 Christian Heim\n";
  print "\n";
  print_usage();
  print "\n";
  print "<sensor>      = The sensor you want to check.\n";
  print "<port>        = The port where the program 'pcmeasure' is listening.\n";
  print "<warn_min>    = Return status 'WARN' if value < warn.\n";
  print "<crit_min>    = Return status 'CRITICAL' if value < crit.\n";
  print "<warn_max>    = Return status 'WARN' if value > warn.\n";
  print "<crit_max>    = Return status 'CRITICAL' if value > crit.\n";
  print "\n";
}
