<?php
################################################
#
# PNP v0.6 Template for Plugin check_wmi.pl
#
# Thomas Sesselmann <t.sesselmann@dkfz.de> 2010
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
#
# Changelog:
# 0.9v  2010.10.22 (ts)
# 0.8v  2010.10.06 (ts)
#   Version at the OSMC2010
#
####



$type="";
if ( preg_match('/check_multi/',$this->MACRO['CHECK_COMMAND']) ) {
  if ( preg_match('/wmi_disk/',   $servicedesc) ) { $type="diskfree"; }
  if ( preg_match('/wmi_service/',$servicedesc) ) { $type="services"; }
  if ( preg_match('/wmi_cpu/',    $servicedesc) ) { $type="cpu"; }
  if ( preg_match('/wmi_mem/',    $servicedesc) ) { $type="mem"; }

} else {
  if ( preg_match('/[!\s](DISK|VOL)FREE(\s|$|!)/i',$this->MACRO['CHECK_COMMAND']) ) { $type="diskfree"; }
  if ( preg_match('/[!\s]SERVICE(\s|$|!)/i',$this->MACRO['CHECK_COMMAND']) ) { $type="services"; }
  if ( preg_match('/[!\s]CPULOAD(\s|$|!)/i',$this->MACRO['CHECK_COMMAND']) ) { $type="cpu"; }
  if ( preg_match('/[!\s]MEMFREE(\s|$|!)/i',$this->MACRO['CHECK_COMMAND']) ) { $type="mem"; }

}



if (!function_exists('printMinMax')) {
function printMinMax($rrdval, $unit="_",$percent="", $format="%4.3lg%s", $pformat="%3.2lg%%")
{
  $out = "";
  $pstring = "      ";
  if ( $percent ) {
    $unit .= "\\g";
  }

  $out .= rrd::gprint($rrdval,"MAX",'MAX\: '.$format.$unit);
  if ( $percent ) { 
    if ( $percent == 1 ) {
      $out .= rrd::comment($pstring);
    } else {
      $out .= rrd::gprint($percent,"MAX",'('.$pformat.')');
    }
  }
  $out .= rrd::gprint($rrdval,"MIN",'MIN\: '.$format.$unit);
  if ( $percent ) { 
    if ( $percent == 1 ) {
      $out .= rrd::comment($pstring);
    } else {
      $out .= rrd::gprint($percent,"MIN",'('.$pformat.')');
    }
  }
  $out .= rrd::gprint($rrdval,"AVERAGE",'AVG\: '.$format.$unit);
  if ( $percent ) { 
    if ( $percent == 1 ) {
      $out .= rrd::comment($pstring);
    } else {
      $out .= rrd::gprint($percent,"AVERAGE",'('.$pformat.')');
    }
  }
  $out .= rrd::gprint($rrdval,"LAST",'LAST\: '.$format.$unit);
  if ( $percent ) { 
    if ( $percent == 1 ) {
      $out .= rrd::comment($pstring);
    } else {
      $out .= rrd::gprint($percent,"LAST",'('.$pformat.')');
    }
  }
  $out .= rrd::comment("\\n");

  return $out;
}
}



## DISKFREE VOLFREE
if ( $type == "diskfree" ) {
  foreach ($this->DS as $k=>$v) {
  
    $max = $v['MAX'];
  
    $opt[$k] = "--vertical-label Bytes -l0 -u$max --title 'Free Diskspace $hostname / $servicedesc - ".$v['NAME']."' ";
    $ds_name[$k] = "Free Diskspace ".$v['NAME'];
    $def[$k] = "";
  
    $def[$k] .= rrd::def("free",$v['RRDFILE'],$v['DS'], "AVERAGE");
    $def[$k] .= rrd::cdef("free_p","free,100,*,$max,/ ");
    $UNIT[$k] = "B";
  
    $def[$k] .= rrd::area("free","#cec");
    #$def[$k] .= rrd::line2("free","#0e0",sprintf("Free Diskspace %-3s",$v['NAME']));
    $def[$k] .= rrd::line2("free","#0e0",sprintf("%-14s",$v['NAME']));
    $def[$k] .= rrd::gprint("free",   "MAX",     "MAX\: %5.1lf%s$UNIT[$k]\\g");
    $def[$k] .= rrd::gprint("free_p", "MAX",     "(%2.lf%%)");
    $def[$k] .= rrd::gprint("free",   "MIN",     "MIN\: %5.1lf%s$UNIT[$k]\\g");
    $def[$k] .= rrd::gprint("free_p", "MIN",     "(%2.lf%%)");
    $def[$k] .= rrd::gprint("free",   "AVERAGE", "AVG\: %5.1lf%s$UNIT[$k]\\g");
    $def[$k] .= rrd::gprint("free_p", "AVERAGE", "(%2.lf%%)");
    $def[$k] .= rrd::gprint("free",   "LAST",    "LAST\: %5.1lf%s$UNIT[$k]\\g");
    $def[$k] .= rrd::gprint("free_p", "LAST",    "(%2.lf%%)");
    $def[$k] .= rrd::comment("\\n");
  
  
    $def[$k] .= rrd::hrule($v['MAX'], "#444","Max Level");
    $def[$k] .= rrd::hrule($v['WARN'],"#db0","Warning Level");
    $def[$k] .= rrd::hrule($v['CRIT'],"#e00","Critical Level");
    $def[$k] .= rrd::comment("\\l");
  
  }


## SERVICES
} elseif ( $type == "services" ) {

  $opt[1] = "--vertical-label '#' -l0 --title 'Services $hostname / $servicedesc' ";
  $def[1] = "";

  $def[1] .= rrd::def("v0",$this->DS[0]['RRDFILE'], $this->DS[0]['DS'],"AVERAGE");
  $def[1] .= rrd::def("v1",$this->DS[1]['RRDFILE'], $this->DS[1]['DS'],"AVERAGE");
  $def[1] .= rrd::def("v2",$this->DS[2]['RRDFILE'], $this->DS[2]['DS'],"AVERAGE");

  $def[1] .= rrd::area("v0","#0e0",sprintf("%-20s",$this->DS[0]['NAME']));
  $def[1] .= rrd::gprint("v0","MAX",     "MAX\: %4.0lf");
  $def[1] .= rrd::gprint("v0","MIN",     "MIN\: %4.0lf");
  $def[1] .= rrd::gprint("v0","AVERAGE", "AVG\: %5.1lf");
  $def[1] .= rrd::gprint("v0","LAST",    "LAST\: %4.0lf");
  $def[1] .= rrd::comment("\\n");

  $def[1] .= rrd::area("v1","#e00",sprintf("%-20s",$this->DS[1]['NAME']),'STACK');
  $def[1] .= rrd::gprint("v1","MAX",     "MAX\: %4.0lf");
  $def[1] .= rrd::gprint("v1","MIN",     "MIN\: %4.0lf");
  $def[1] .= rrd::gprint("v1","AVERAGE", "AVG\: %5.1lf");
  $def[1] .= rrd::gprint("v1","LAST",    "LAST\: %4.0lf");
  $def[1] .= rrd::comment("\\n");

  $def[1] .= rrd::area("v2","#00e",sprintf("%-20s",$this->DS[2]['NAME']),'STACK');
  $def[1] .= rrd::gprint("v2","MAX",     "MAX\: %4.0lf");
  $def[1] .= rrd::gprint("v2","MIN",     "MIN\: %4.0lf");
  $def[1] .= rrd::gprint("v2","AVERAGE", "AVG\: %5.1lf");
  $def[1] .= rrd::gprint("v2","LAST",    "LAST\: %4.0lf");
  $def[1] .= rrd::comment("\\n");



## CPU
} elseif ( $type == "cpu" ) {

  $opt[1] = "--vertical-label '%' -l0 --title 'CPU-Load $hostname / $servicedesc' ";
  $def[1] = "";

  $smap = array(
    'idleTime' => array( 
    ),
    'privilegedTime' => array(
      'type'  => 'AREA',
      'color' => '#bbf',
      'name'  => 'Privileged',
      'unit'  => '%%',
    ),
    'userTime' => array(
      'type'  => 'SAREA',
      'color' => '#afa',
      'name'  => 'User',
      'unit'  => '%%',
    ),
    'processorTime' => array(
      'type'  => 'LINE2',
      'color' => '#00f',
      'name'  => 'Load (NotIdle)',
      'cdef'  => '100,idleTime,- ',
      'unit'  => '%%',
    ),
    'interruptTime' => array(
      'type'  => 'LINE2',
      'color' => '#0a0',
      'name'  => 'Interrupts',
      'unit'  => '%%',
    ),
    'processorQueueLength' => array(
      'type'  => 'LINE2',
      'color' => '#700',
      'name'  => 'ProcessorQueue',
      'unit'  => ' ',
    ),
  );

  foreach ($this->DS as $k=>$v) { # defs
    if ( array_key_exists($v['NAME'],$smap) ) {
      $def[1] .= rrd::def($v['NAME'],$v['RRDFILE'],$v['DS'],"AVERAGE");
    }
  }
  foreach ($smap as $k => $v ) { # cdefs
    if ( array_key_exists('cdef',$v) ) {
      $def[1] .= rrd::cdef("$k",$v['cdef']);
    }
  }

  foreach ($smap as $k=>$v) { # lines
    if ( array_key_exists('type',$v) and $v['type'] ) {
      if ( $v['type'] == "LINE1" ) {
        $def[1] .= rrd::line1("$k",$v['color'],sprintf("%-20s",$v['name']));
      }
      if ( $v['type'] == "SLINE1" ) {
        $def[1] .= rrd::line1("$k",$v['color'],sprintf("%-20s",$v['name']),1);
      }
      if ( $v['type'] == "LINE2" ) {
        $def[1] .= rrd::line2("$k",$v['color'],sprintf("%-20s",$v['name']));
      }
      if ( $v['type'] == "SLINE2" ) {
        $def[1] .= rrd::line2("$k",$v['color'],sprintf("%-20s",$v['name']),1);
      }
      if ( $v['type'] == "AREA" ) {
        $def[1] .= rrd::area("$k",$v['color'],sprintf("%-20s",$v['name']));
      }
      if ( $v['type'] == "SAREA" ) {
        $def[1] .= rrd::area("$k",$v['color'],sprintf("%-20s",$v['name']),1);
      }
      if ( $v['type'] == "C" ) {
        $def[1] .= rrd::comment(sprintf("  %-20s",$v['name']));
      }

      if ( $v['type'] != "" ) {
        $def[1] .= rrd::gprint("$k","MAX","MAX\: %4.1lf".$v['unit']);
        $def[1] .= rrd::gprint("$k","MIN","MIN\: %4.1lf".$v['unit']);
        $def[1] .= rrd::gprint("$k","AVERAGE","AVG\: %4.1lf".$v['unit']);
        $def[1] .= rrd::gprint("$k","LAST","LAST\: %4.1lf".$v['unit']);
        $def[1] .= rrd::comment("\\n");
      }
    }
  }
 
  $def[1] .= rrd::hrule(100-$this->DS[0]['WARN'],"#db0",sprintf("Warning Level %.0f%%",100-$this->DS[0]['WARN']));
  $def[1] .= rrd::hrule(100-$this->DS[0]['CRIT'],"#e00",sprintf("Critical Level %.0f%%",100-$this->DS[0]['CRIT']));
  $def[1] .= rrd::comment("\\l");


  
## MEM
} elseif ( $type == "mem" ) {

  $opt[1] = "--vertical-label 'Bytes' -l0 --title 'Memory Usage $hostname / $servicedesc' ";
  $opt[2] = "--vertical-label 'faults per seconds' -l0 --title 'Cache/Page Fauls $hostname / $servicedesc' ";
  $def[1] = "";
  $def[2] = "";
  $ds_name[1] = "Memory Usage";
  $ds_name[2] = "Cache/Page Faults";

#TODO umprogrammieren .. generischer ...

  foreach ($this->DS as $k=>$v) { # defs
    $def[1] .= rrd::def($v['NAME'],$v['RRDFILE'],$v['DS'],"AVERAGE");
    if ( $v['NAME'] == "pages" or $v['NAME'] == "cacheFaults" ) {
      $def[2] .= rrd::def($v['NAME'],$v['RRDFILE'],$v['DS'],"AVERAGE");
    }
    if ( $v['MAX'] > 0 ) {
      $def[1] .= rrd::cdef($v['NAME'].'_p',$v['NAME'].',100,*,'.$v['MAX'].',/');
    }
  }

  $def[1] .= rrd::area("memFree",'#0f0',sprintf("%-14s","Free Memory"));
  $def[1] .= printMinMax("memFree","B","memFree_p");

  $def[1] .= rrd::area("poolNonPaged",'#fcf',sprintf("%-14s","Pool NonPaged"),1);
  $def[1] .= printMinMax("poolNonPaged","B",1);

  $def[1] .= rrd::area("poolPaged",'#ffc',sprintf("%-14s","Pool Paged"),1);
  $def[1] .= printMinMax("poolPaged","B",1);

  $def[1] .= rrd::area("memCache",'#fda',sprintf("%-14s","Cache"),1);
  $def[1] .= printMinMax("memCache","B",1);
  
  $def[1] .= rrd::area("committed",'#ccf',sprintf("%-14s","Commited"),1);
  $def[1] .= printMinMax("committed","B",1);

  $def[1] .= rrd::line2("virtMemFree",'#00f',sprintf("%-14s","Free virt. Mem"));
  $def[1] .= printMinMax("virtMemFree","B","virtMemFree_p");

  $def[1] .= rrd::comment(sprintf("  %-14s","Cache Faults/s"));
  $def[1] .= printMinMax("cacheFaults","_",1);
  $def[2] .= rrd::line1("cacheFaults",'#f00',sprintf("%-18s","Cache Faults /s"));
  $def[2] .= printMinMax("cacheFaults","");

  $def[1] .= rrd::comment(sprintf("  %-14s","r/w Pages /s"));
  $def[1] .= printMinMax("pages","_",1);
  $def[2] .= rrd::line1("pages",'#a0f',sprintf("%-18s","Pages faults /s"));
  $def[2] .= printMinMax("pages","");

  $def[1] .= rrd::comment(sprintf("  %-14s","Free PageFile"));
  $def[1] .= printMinMax("freePageFile","B",1);
  

  $def[1] .= rrd::hrule($this->DS[0]['MAX'], "#444","Max Level");
  $def[1] .= rrd::hrule($this->DS[0]['WARN'],"#db0","Warning Level");
  $def[1] .= rrd::hrule($this->DS[0]['CRIT'],"#e00","Critical Level");
  $def[1] .= rrd::comment("\\l");





## Default
} else {

  foreach ($this->DS as $k=>$v) {
  
    $vlabel = "";
    $lower  = "";
    $upper  = "";
      
    if ($v['MIN'] != "") {
      $lower = " --lower=" . $v['MIN'];
    }
    if ($v['UNIT'] == "%%") {
      $vlabel = "%";
      $upper = " --upper=101 ";
      $lower = " --lower=0 ";
    } else {
      $vlabel = $v['UNIT'];
    }
  
    $opt[$k]  = "--vertical-label '$vlabel' $lower $upper ";
    $opt[$k] .= "--title '".$this->MACRO['DISP_HOSTNAME']." / ".$this->MACRO['DISP_SERVICEDESC']."' ";
    $ds_name[$k] = $v['LABEL'];
    $def[$k]  = rrd::def     ("v1", $v['RRDFILE'], $v['DS'], "AVERAGE");
    $def[$k] .= rrd::line2   ("v1", '#00f', sprintf("%-20s",$v['NAME']));
    $def[$k] .= printMinMax("v1",$v['UNIT']);

    if ( $v['MAX']  != "" ) { $def[$k] .= rrd::hrule($v['MAX'],  "#444", "Maximum" ); }
    if ( $v['WARN'] != "" ) { $def[$k] .= rrd::hrule($v['WARN'], "#db0", "Warning" ); }
    if ( $v['CRIT'] != "" ) { $def[$k] .= rrd::hrule($v['CRIT'], "#e00", "Critical"); }

    $def[$k] .= rrd::comment("\\n");


  }

}


?>
