Subversion Repositories vnag

Rev

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

  1. <?php /* <ViaThinkSoftSignature>
  2. PWwDKp/NSf/rrEh35zHyCMaO4gcZlVT+EjMyvCDND7VbDr2OfniffusJQ/+G/mPHZ
  3. v2dTvk6poY69nCYrUnsqeEdmeVhi5l++vvSAvpVUZiENZkyRUrTBkPVBhQcT8kviQ
  4. pfuBHklcTOhQqiN6MMKD1fS9MkG5jqelOSvMt3L35tTlQk0Fdkbu8WTp2kqWJ/gaA
  5. aZQzTXCserS7Y7SHpWoVvul7kfnpKWkspryM0l1Ih8fCFhYrB7/mMKTL9TqgKd9Ka
  6. f1VGax1Xm3H6z8OkJ8HfgbvbuvC+zruB9J7uYFCnnrtS5JqL660UV61zkTVLE0KBE
  7. Qd8T2cs8ROPsJpwO3StbG3ZU2rDChfpLVKV7VsEYnQpjyIACwIlu4E2kMTzOlIPaP
  8. hl/9HDuL7vfM8DYkUVvvMtxqvVVHYpIx/AFigxakY2HteLmfekxhL9uRJqX2e4SJH
  9. XWeu731yuH+0/c82rzLbEKadHYtV4XBXOxIlSxl4VYM17RCe0r2/R392aMQ4Ziy9j
  10. dhQo22vBJrtmIutBpH7KaecQUwT+hM8sWas68xwfIMWzFuwofsanyA2iJvRx5tR+s
  11. J0mhHQ08HszAqZ+G8byAuW6z8ncRieLhseu2g91OMHOiuDnxpDbGqqrluXDDGs7W+
  12. 0aHGPmIbPTYTP6LGyuqV/Q5gg0tgZh0ESFWLoRh1mzrJMBh6ZYMrsByfAruq9ewdB
  13. FZ8rE3a91IhpbFa76wfcN81lk6QMrrc0crd0Fp359xUacXAz6DEO4mQ/f5g06p6rz
  14. jPLfClhpm1Z5AhhaVZS8AhgHNrXSFchksoE+oruo+CO3QDhcZKygGXntMb0I0KIYR
  15. 8hsl0CYfkDD9oaMSXPE4g22WO48k6jKxt3MyCSta4vtnTeH6Quon6PEvSXkRs4ZCa
  16. aKYy8owaVxds+h0lGd4eNBgP/bZZb5nxeMuOlO9lhvEgxpXoksLB8Oh10BMj9EBQT
  17. T2TaEtY1GyIr0shBb/mD5BQO0v+qW3PHKbtDtWccKPxNo5Cx4CPf0AiHoqzj6Sa6C
  18. 7MdS57nQ9DQAnwhBPOJ5+tt1LF468AerjjdDjsWEYMmicZjOpPM/9APdJjUe312+9
  19. AkVN9Mz3mVQ8DGpI0wEfDdrHH9IWs1G/0RofVtQo23PxyFbX8S64Di7vwBrlrgrWg
  20. esBRLltyn9hSdqv+C1XEJltlunWo2yM/HggjK9mbq2pNLqgW2r/Ddfhbhg+UnHPk+
  21. 3XlC2nyPLzLt9Mpf/3IrfbTl3siOB1F6eQT2cQCa9pKrrE1TJu49oMmpiwmD3xT6P
  22. P1c6cVZn8g3N+MdZEJJknf492Zr1Y5oSx93ofxLFYrh5Mf3CDrHAPOTpPZ9J5Kh3s
  23. Q==
  24. </ViaThinkSoftSignature> */ ?>
  25. <?php
  26.  
  27. /*
  28.  * VNag - Nagios Framework for PHP
  29.  * Developed by Daniel Marschall, ViaThinkSoft <www.viathinksoft.com>
  30.  * Licensed under the terms of the Apache 2.0 license
  31.  *
  32.  * Revision 2023-10-13
  33.  */
  34.  
  35. // TODO: Anstelle "-d diskname[,diskname[,...]]" wäre es schöner ohne Komma, denn dann könnte man auch die Shell Erweiterung /dev/sd* nutzen
  36.  
  37. declare(ticks=1);
  38.  
  39. class DiskRunningCheck extends VNag {
  40.         // Currently, we do not accept wildcards ('sd*' and 'hd*') because this plugin should monitor if disks become offline, e.g. horribly fail or get disconnected.
  41.         // If that would happen, the disk might vanish from the device-folder and therefore would not be detected by the wildcard anymore.
  42.         protected $argDisks = null;
  43.  
  44.         public function __construct() {
  45.                 parent::__construct();
  46.  
  47.                 if ($this->is_http_mode()) {
  48.                         // Don't allow the standard arguments via $_REQUEST
  49.                         $this->registerExpectedStandardArguments('');
  50.                 } else {
  51.                         $this->registerExpectedStandardArguments('Vhtv');
  52.                 }
  53.  
  54.                 $this->getHelpManager()->setPluginName('vnag_disk_running');
  55.                 $this->getHelpManager()->setVersion('1.0');
  56.                 $this->getHelpManager()->setShortDescription('This plugin checks if a disk is running/online, even if no SMART functionality is available.');
  57.                 $this->getHelpManager()->setCopyright('Copyright (C) 2011-$CURYEAR$ Daniel Marschall, ViaThinkSoft.');
  58.                 $this->getHelpManager()->setSyntax('$SCRIPTNAME$ -d diskname[,diskname[,...]]');
  59.                 $this->getHelpManager()->setFootNotes('If you encounter bugs, please contact ViaThinkSoft at www.viathinksoft.com');
  60.  
  61.                 // Individual (non-standard) arguments:
  62.                 $this->addExpectedArgument($this->argDisks = new VNagArgument('d', 'disknames', VNagArgument::VALUE_REQUIRED, 'disks', 'Disks to be monitored, e.g. "sda,sdb"'));
  63.         }
  64.  
  65.         protected function cbRun() {
  66.                 $count_total = 0;
  67.                 $count_running = 0;
  68.                 $count_offline = 0;
  69.                 $count_warning = 0;
  70.                 $count_unknown = 0;
  71.  
  72.                 $disks = $this->argDisks->getValue();
  73.                 if (empty($disks)) {
  74.                         throw new VNagException("Please specify the disks you want to monitor.");
  75.                 }
  76.                 $disks = explode(',',$disks);
  77.  
  78.                 foreach ($disks as $disk) {
  79.                         $disk = preg_replace('@^/dev/@', '', $disk); // accept '/dev/' too
  80.  
  81.                         // We do not check the size, in case the user has more than 26 disks; https://rwmj.wordpress.com/2011/01/09/how-are-linux-drives-named-beyond-drive-26-devsdz/
  82.                         // But we check if everything is OK, and nothing nasty is done here
  83.                         $disk = preg_replace('@[^a-zA-Z0-9]@', '', $disk);
  84.  
  85.                         $disk = preg_replace('@^(...)\d+@', '\\1', $disk); // accept 'sdh1' too
  86.  
  87.                         $count_total++;
  88.                         if (!file_exists("/dev/$disk")) {
  89.                                 $this->addVerboseMessage("$disk : Drive does not exist", VNag::VERBOSITY_SUMMARY);
  90.                                 $this->setStatus(VNag::STATUS_CRITICAL);
  91.                                 $count_offline++;
  92.                         } else {
  93.                                 $state_file = "/sys/block/$disk/device/state";
  94.                                 if (!file_exists($state_file)) {
  95.                                         $this->addVerboseMessage("$disk : Cannot fetch state (Is this a valid block device?)", VNag::VERBOSITY_SUMMARY);
  96.                                         $this->setStatus(VNag::STATUS_CRITICAL);
  97.                                         $count_unknown++;
  98.                                 } else {
  99.                                         $cont = @file_get_contents($state_file);
  100.                                         if ($cont === false) throw new VNagException("Cannot read $state_file");
  101.                                         $state = trim($cont);
  102.                                         if ($state != 'running') {
  103.                                                 $this->addVerboseMessage("$disk : $state", VNag::VERBOSITY_SUMMARY);
  104.                                                 $this->setStatus(VNag::STATUS_CRITICAL);
  105.                                                 $count_offline++;
  106.                                         } else {
  107.                                                 #$ioerr_file = "/sys/block/$disk/device/ioerr_cnt";
  108.                                                 #if (file_exists($ioerr_file) && (($ioerr_cont = trim(file_get_contents($ioerr_file))) != '0x0')) {
  109.                                                 #       $this->addVerboseMessage("$disk : High IOERR count ($ioerr_cont), but state is reported as $state", VNag::VERBOSITY_SUMMARY);
  110.                                                 #       $this->setStatus(VNag::STATUS_WARNING);
  111.                                                 #       $count_warning++;
  112.                                                 #} else {
  113.                                                         $this->addVerboseMessage("$disk : $state", VNag::VERBOSITY_ADDITIONAL_INFORMATION);
  114.                                                         $this->setStatus(VNag::STATUS_OK); // Note: This won't unset a previously set critical state
  115.                                                         $count_running++;
  116.                                                 #}
  117.                                         }
  118.                                 }
  119.                         }
  120.                 }
  121.  
  122.                 $this->setHeadline(sprintf('Checked %d disks (%d running, %d offline, %d warnings, %d unknown)', $count_total, $count_running, $count_offline, $count_warning, $count_unknown));
  123.         }
  124. }
  125.