Subversion Repositories vnag

Rev

Rev 77 | Go to most recent revision | Blame | Last modification | View Log | RSS feed

  1. <?php
  2.  
  3. /*
  4.  * VNag - Nagios Framework for PHP
  5.  * Developed by Daniel Marschall, ViaThinkSoft <www.viathinksoft.com>
  6.  * Licensed under the terms of the Apache 2.0 license
  7.  *
  8.  * Revision 2023-10-13
  9.  */
  10.  
  11. // TODO: Also let the user decide other parameters like -4/-6 and number of pings/timeout etc.
  12.  
  13. # ---
  14.  
  15. declare(ticks=1);
  16.  
  17. # ---
  18.  
  19. class PingCheck extends VNag {
  20.         protected $argHostname = null;
  21.  
  22.         public function __construct() {
  23.                 parent::__construct();
  24.  
  25.                 $this->registerExpectedStandardArguments('Vhtwc');
  26.  
  27.                 $this->getHelpManager()->setPluginName('check_ping');
  28.                 $this->getHelpManager()->setVersion('2023-10-13');
  29.                 $this->getHelpManager()->setShortDescription('This plugin performs a simple ping.');
  30.                 $this->getHelpManager()->setCopyright('Copyright (C) 2011-$CURYEAR$ Daniel Marschall, ViaThinkSoft.');
  31.                 $this->getHelpManager()->setSyntax('$SCRIPTNAME$ -H hostname');
  32.                 $this->getHelpManager()->setFootNotes('If you encounter bugs, please contact ViaThinkSoft at www.viathinksoft.com');
  33.  
  34.                 $this->addExpectedArgument($this->argHostname = new VNagArgument('H', 'hostname', VNagArgument::VALUE_REQUIRED, 'hostname', 'Hostname or IP address to be pinged', null));
  35.         }
  36.  
  37.         protected function cbRun($optional_args=array()) {
  38.                 $host = $this->argHostname->getValue();
  39.                 if (is_null($host)) throw new VNagException("Please enter a hostname");
  40.  
  41.                 $this->outputHTML("<h2>Host ".htmlentities($host)."</h2>\n\n", true);
  42.  
  43.                 if (self::is_ipv6($host)) {
  44.                         if (self::is_windows()) {
  45.                                 // Windows
  46.                                 exec("ping -6 -n 4 ".escapeshellarg($host), $outary, $code);
  47.                         } else {
  48.                                 // Linux / MAC OSX (uses bash)
  49.                                 exec("ping6 -c 4 -- ".escapeshellarg($host).' 2>&1', $outary, $code);
  50.                         }
  51.                 } else {
  52.                         if (self::is_windows()) {
  53.                                 // Windows
  54.                                 exec("ping -n 4 ".escapeshellarg($host), $outary, $code);
  55.                         } else {
  56.                                 // Linux / MAC OSX (uses bash)
  57.                                 exec("ping -c 4 -- ".escapeshellarg($host).' 2>&1', $outary, $code);
  58.                         }
  59.                 }
  60.                 $execresult = implode("\n", $outary);
  61.                 $execresult = trim($execresult);
  62.  
  63.                 // We could also work with $code, but it might not work under Windows then
  64.                 if ($execresult == '') {
  65.                         throw new VNagException('Could not launch ping executable.');
  66.                 }
  67.  
  68.                 if ($code != 0) {
  69.                         $this->setStatus(VNag::STATUS_WARNING);
  70.                         $this->setHeadline("Ping failed", true);
  71.                         $this->outputHTML('<p><font color="red" size="+2">Ping failed</font></p>', true);
  72.                 } else {
  73.                         $this->setStatus(VNag::STATUS_OK);
  74.                         $this->outputHTML('<p><font color="green" size="+2">Ping OK</font></p>', true);
  75.                 }
  76.  
  77.                 $this->outputHTML('<pre>'.htmlentities($execresult).'</pre>', true);
  78.         }
  79.  
  80.         private static function is_windows() {
  81.                 // There is a problem with this variant:
  82.                 // Windows 9x does not contain the %OS% environment variable
  83.                 if (strtolower(getenv('OS')) == 'windows_nt') return true;
  84.  
  85.                 if (defined('PHP_OS') && (PHP_OS == 'win')) return true;
  86.  
  87.                 if (getenv('windir') != '') return true;
  88.  
  89.                 return false;
  90.         }
  91.  
  92.         private static function is_ipv6($host) {
  93.                 // Quick'n'Dirty
  94.                 return strpos($host, ':') !== false;
  95.         }
  96.  
  97. }
  98.