Nagios utils.php script for PHP plugins

I couldn't find a "utils.php" script for making it easier to write nagios plugins in PHP so I thought I'd whip one up.  This is a combination of the utils.php from CVS I found laying around the web and a port of Nagios::Plugin::Range perl module.  It seems to pass all the tests that I found for the nagios plugins range documentation.

<?php
/*
 * Created on Sep 14, (c) 2006 by Marcel K�hn
 * GPL licensed, marcel@kuehns.org
 *
 * Ported nagios range checking from Nagios::Plugin::Range
 * by Doug Warner <doug@warner.fm>
 */

#Configuration

define('STATE_OK',0);
define('STATE_WARNING',1);
define('STATE_CRITICAL',2);
define('STATE_UNKNOWN',3);
define('STATE_DEPENDENT',4);

define('SNMPWALK','/usr/bin/snmpwalk');

function detectOS(){
    $arr    =   posix_uname();
    return strtolower($arr["sysname"]);
}

function verifyOS($supportedOSarray){
    $runningOS  =   detectOS();
    if(in_array($runningOS,$supportedOSarray)){
        return TRUE;
    }
    else{
        return FALSE;
    }
}

function machineName(){
    $arr    =   posix_uname();
    return strtolower($arr["nodename"]);
}

class Nagios_Plugin_Range {
    const INSIDE = 1;
    const OUTSIDE = 0;
    protected $range;
    protected $start = 0;
    protected $end = 0;
    protected $start_infinity = false;
    protected $end_infinity = false;
    protected $alert_on;

    public function __construct($range) {
        $this->range = $range;
        $this->parse_range_string($range);
    }

    public function valid() {
        return isset($this->alert_on);
    }

    public function check_range($value) {
        $false = false;
        $true = true;
        if ($this->alert_on == self::INSIDE) {
            $false = true;
            $true = false;
        }

        /* DEBUG
        echo "  R:$this->range; V:$value; S:$this->start, E:$this->end, ".
            "SI: " . ( $this->start_infinity ? 'T' : 'F') . ', ' .
            "EI: " . ( $this->end_infinity ? 'T' : 'F') . ', ' .
            "InOut: " . ( $this->alert_on == self::INSIDE ? 'I' : 'O') . '; ' .
            "\n";
        */
        if (!$this->end_infinity && !$this->start_infinity ) {
            if ($this->start <= $value && $value <= $this->end) {
                return $false;
            } else {
                return $true;
            }
        }
        elseif (!$this->start_infinity && $this->end_infinity) {
            if ( $value >= $this->start ) {
                return $false;
            } else {
                return $true;
            }
        }
        elseif ($this->start_infinity && !$this->end_infinity) {
            if ($value <= $this->end) {
                return $false;
            } else {
                return $true;
            }
        }
        else {
            return $false;
        }
    }

    # Returns a N::P::Range object if the string is a conforms to a Nagios Plugin range string, otherwise null
    protected function parse_range_string($string) {
        $valid = 0;
        $alert_on = self::OUTSIDE;

        $string = preg_replace('/\s/', '', $string);

        $value = "[-+]?[\d\.]+";
        $value_re = "${value}(?:e${value})?";

        # check for valid range definition
        if ( !preg_match('/[\d~]/', $string)
            || !preg_match("/^\@?(${value_re}|~)?(:(${value_re})?)?$/", $string)) {
            echo "invalid range definition '$string'";
            exit(STATE_UNKNOWN);
        }

        if (preg_match('/^\@/', $string)) {
            $string = preg_replace('/^\@/', '', $string);
            $alert_on = self::INSIDE;
        }

         # '~:x'
        if (preg_match('/^~/', $string)) {
            $string = preg_replace('/^~/', '', $string);
            $this->start_infinity = true;
        }

        # '10:'
        if (preg_match("/^(${value_re})?:/", $string, $matches)) {
            if (!empty($matches[1])) {
                $this->set_range_start($matches[1]);
            }
            $this->end_infinity = true;  # overridden below if there's an end specified
            $string = preg_replace("/^(${value_re})?:/", '', $string);
            $valid++;
        }

        # 'x:10' or '10'
        if (preg_match("/^(${value_re})$/", $string)) {
            $this->set_range_end($string);
            $valid++;
        }

        if ($valid
            && ($this->start_infinity || $this->end_infinity || $this->start <= $this->end)) {
            $this->alert_on = $alert_on;
        }
    }

    protected function set_range_start($value) {
        $this->start = (integer) $value;
        if (empty($this->start)) {
            $this->start = 0;
        }
        $this->start_infinity = false;
    }

    protected function set_range_end($value) {
        $this->end = (integer) $value;
        if (empty($this->end)) {
            $this->end = 0;
        }
        $this->end_infinity = false;
    }
}

links

social