#!/usr/bin/perl -w

use strict;
#use IO::Handle;

#open ERROR, '>>', "/dev/null" or die $!;
#STDERR->fdopen( \*ERROR, 'w' ) or die $!;

############################################################################################################
# Variablenbelegung
#
############################################################################################################

my $vm=$ARGV[0];
my $serv=$ARGV[1];
my $warning=$ARGV[2];
my $critical=$ARGV[3];
my $xentop=qx(/usr/bin/which xentop);
   chomp($xentop);
my $appname="check_xvmstat";
my $version="0.1";
my $author="Tim Harsdorf";
my $desc="Nagios Plugin in Perl zum auslesen der CPU- und Memload einer Xen VM.\nDieses Script gibt Nagios";
   $desc.=" Performacedaten zum Auswerten der CPU- und Memload aus.\n\n";
my $syntax="./check_xvmstat.pl <vm> <cpu|mem> <warn> <crit>\n\n";

my $load="initwert";
my $addinf="";
my $qosval="";

############################################################################################################
# QA Pruefung
#
############################################################################################################

# Uebergebene Argumente
if (!defined($ARGV[0]) or !defined($ARGV[1]) or !defined($ARGV[2]) or !defined($ARGV[3]))
   {
    usage();
    exit 3;
   }

# Eingaben auf Validitaet pruefen
if ($warning > $critical)
   {
    print "UNKNOWN: Input Error.";
    usage();
    exit 3;
   }

# hddtemp Pruefung
if($xentop =~ "xentop")
   {
    checkstat();
   }
   else
    {
     print "UNKNOWN: Kein xentop installiert!\n";
     exit 3;
    }

############################################################################################################
# Gebrauchsanweisung
#
############################################################################################################

sub usage
     {
      print "\n".$appname."-".$version." (".$author.")\n\n";
      print $desc;
      print $syntax;
     }

############################################################################################################
# Check durchfuehren
#
############################################################################################################

sub checkstat
        {
         # Messung durchfuehren
	 my @status=qx($xentop -b -i 2 -d 2 | grep $vm);
         my $messung = $status[1];

         # Letzter QOS Test
	 if (!defined($messung))
	    {
	     print "UNKNOWN: VM nicht gefunden.\n";
	     exit 3;
	    }

	 # Variablen belegen
         my $vcpu = substr($messung,76,5);
         $vcpu =~ s/ //g;

         my $cpuload = substr($messung,30,5);
         $cpuload =~ s/ //g;
         $cpuload = $cpuload/$vcpu;

         my $memload = substr($messung,48,5);
         $memload =~ s/ //g;

         my $vmem = substr($messung,56,9);
         $vmem =~ s/ //g;
         $vmem=$vmem/1024;


	 if ($serv eq "cpu")
	    {
	     $load=$cpuload;
             $addinf="(".$vcpu." CPU)";
             $qosval="cpuload";
	    }

	 if ($serv eq "mem")
	    {
	     $load=$memload;
             $addinf="(".$vmem." MB)";
             $qosval="memload";
	    }

	 if ($serv ne "mem" && $serv ne "cpu")
	    {
	     $load="";
             $addinf="";
             $qosval="";
	    }


         if ($load eq "")
            {
             print "UNKNOWN: Fehler bei der Datenbestimmung.\n";
             exit 3;
            }

	 if ($load ne "")
	    {
             if ($load < $warning)
                {
	         print "OK: ".$load."% ".$addinf;
                 #QOS-Data
                 print " | ".$qosval."=".$load.";".$warning.";".$critical.";0;".$critical."\n";
                 exit 0;
	        }

             if ($load >= $warning && $load < $critical) 
                {
	         print "WARNING: ".$load."% ".$addinf;
                 #QOS-Data
                 print " | ".$qosval."=".$load.";".$warning.";".$critical.";0;".$critical."\n";
                 exit 1;
	        }

             if ($load >= $critical) 
                {
	         print "CRITICAL: ".$load."% ".$addinf;
                 # QOS-Data
                 print " | ".$qosval."=".$load.";".$warning.";".$critical.";0;".$critical."\n";
                 exit 2;
	        }

	    }
	}

