Subversion Repositories vnag

Rev

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

  1. <?php /* <ViaThinkSoftSignature>
  2. XyR9nLCgPCgA/djX7KyBDkN3ctAs85r+0zTj+wJq3olUBT/sweF8guKXx8jPYwPeW
  3. 6b+ziHmRb4uxyOWtFxZJ9sr4VPfnnIZSkIZAh6bp/NszggVtt9K6a2fUkyDZPZutl
  4. fNu04Kc21PSFTpBBAChQUOF7ULf+BFiSd9ZQtXmjcmzCBn//Ddlo3G+FaFgjxSRXU
  5. H+gJyPZRB9V24xA/YOEHW1RYjmpmA//tROgX6XPCOUYVCbmdSLj9M7e7Lq2BfPsP8
  6. nj25unakxtjj2jgUT53qyr8KO8RdtDfp7lo7TIF5/rY60qvU6J2ZfuyYGB9XpUiBl
  7. ZRX7exeXq5EnHQQZF4nRX98OhWFFelXNL4uCekpOxWxMj8knD9maYI1HJ3ATdBB88
  8. mpkb26vd8hi7OnSyj8EVLYMpwYHXxcptRr/4juNq87yyE2i4NDiXskSUL5tzTVVAA
  9. K0oLwSu427meESSRlTsC1on3RjuOKjk/uVtnR9vXGD9kwG8pP+h0/gtDe4eblRMvc
  10. wqDoZMgzF6IGUY3XgPtOMsguLYc1dmchV5MQg9GloTxTdRhaiBY7MBnpX7+ITGZLw
  11. WAnLEWgHJ2qVk6oXc+j1Cnj4hbE64SzgyNR65GdaHDQa4t9bq+MowbIPKly1PTCmM
  12. BNZjw+QaHNxrd62TIM/1bKDM+J/NkloxIL+V9qJtwKupQ2aLtU2wv5bAv2lzcBmYM
  13. 1GU624/V1oQtv9rKku5zInxps1oncD0oBRo19lxDYPavE/tc3hPT34n4HcZgNN/1q
  14. 3hYNBKPqQBvyhsvNzh5rPEpzVI9yLSdGYljNzExdWagugzyvlrUIssCxcsPCAIcQS
  15. IzyighR9JX3yyHpeJEOCyNN6ZG6zp6Tccz3xa35DTgV2dq3KV+d+jbiypKzp7NHdD
  16. 8lBkgqJPpeXVfbYsvqcI68uUU0BqoxqDNaaxZPdfBYqQUUJajdz+eC6mx51s0RYPl
  17. XxCtKAnBgVnXDrYAl8HhPyeaih1OQ6SpqNj4oMCcj72++B2inNLVFB6s8pVaHera7
  18. y2voNzHMIXSAWa63avVH6XKFWQroQvF6hOgYjJECK6azAK/ocqRqZHAe/DTbolndX
  19. yIlHSnR2sjiPaWJyGPsm4cAfCT73k+75npECLRzYl14btHSmB2z1iAEB4Y1CnjJpi
  20. wzEXh3irSvAxyvCchYrma30IUtIpAUhdmFiJ2AtoIrEg9fjE9WhfJnbtsbbpS26yv
  21. 3b9Jdr8KaX94itAuisnNVQytjvVu/NDczjV+PS0SVUXVoMVmmuyNvB/cpld3c+Ui2
  22. x1RKP9mBSvKJUIKDRYsCg9pb6j3UeVrVw8Lb61C+TzMjp6XKB5sSdCCOCAuSpv1CG
  23. w==
  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 2022-06-06
  33.  */
  34.  
  35. declare(ticks=1);
  36.  
  37. define('OUTPUT_UOM', 'MB');
  38. define('ROUND_TO', 0);
  39.  
  40. class OpenDeletedFilesCheck extends VNag {
  41.         protected $argDir = null;
  42.  
  43.         public function __construct() {
  44.                 parent::__construct();
  45.  
  46.                 $this->registerExpectedStandardArguments('Vhtwc');
  47.  
  48.                 $this->getHelpManager()->setPluginName('open_deleted_files');
  49.                 $this->getHelpManager()->setVersion('1.0');
  50.                 $this->getHelpManager()->setShortDescription('This plugin checks for open deleted files (which require space but are not visible/accessible anymore).');
  51.                 $this->getHelpManager()->setCopyright('Copyright (C) 2011-$CURYEAR$ Daniel Marschall, ViaThinkSoft.');
  52.                 $this->getHelpManager()->setSyntax('$SCRIPTNAME$ [-d directory] [-w warnSizeKB] [-c critSizeKB]');
  53.                 $this->getHelpManager()->setFootNotes('If you encounter bugs, please contact ViaThinkSoft at www.viathinksoft.com');
  54.  
  55. #               $this->warningSingleValueRangeBehaviors[0]  = self::SINGLEVALUE_RANGE_VAL_GT_X_BAD;
  56. #               $this->criticalSingleValueRangeBehaviors[0] = self::SINGLEVALUE_RANGE_VAL_GT_X_BAD;
  57.  
  58.                 // Individual (non-standard) arguments:
  59.                 $this->addExpectedArgument($this->argDir = new VNagArgument('d', 'directory', VNagArgument::VALUE_REQUIRED, 'directory', 'Directory to check (e.g. /tmp)Directory to check (e.g. /tmp)'));
  60.         }
  61.  
  62.         protected static function check_open_deleted_files($dir_to_check = '/') {
  63.                 // Note: Requires root
  64.                 exec('lsof -n', $lines, $ec);
  65.                 if ($ec != 0) return false;
  66.  
  67.                 /*
  68.                 $lines = explode("\n",
  69.                 'COMMAND     PID   TID TASKCMD               USER   FD      TYPE             DEVICE    SIZE/OFF       NODE NAME
  70.                 php-cgi     430                          oidplus    3u      REG               0,42           0 1502217042 /tmp/.ZendSem.uhCRtC (deleted)
  71.                 apache2     838                             root  150u      REG               0,42           0 1499023202 /tmp/.ZendSem.RFcTM9 (deleted)
  72.                 postgres   1060                      gitlab-psql  txt       REG                9,0     9291488   47189384 /opt/gitlab/embedded/postgresql/12/bin/postgres (deleted)
  73.                 php-cgi    1573                         owncloud    3u      REG               0,42           0 1499024339 /tmp/.ZendSem.2Qh70x (deleted)
  74.                 php-fpm7.  1738                             root    3u      REG               0,42           0  434907183 /tmp/.ZendSem.unGJqF
  75.                 php-fpm7.  1739                         www-data    3u      REG               0,42           0  434907183 /tmp/.ZendSem.unGJqF (deleted)
  76.                 php-fpm7.  1740                         www-data    3u      REG               0,42           0  434907183 /tmp/.ZendSem.unGJqF (deleted)
  77.                 runsvdir   1932                             root  txt       REG                9,0       27104   45351338 /opt/gitlab/embedded/bin/runsvdir (deleted)
  78.                 ');
  79.                 */
  80.  
  81.                 $line_desc = array_shift($lines);
  82.                 $p_name = strpos($line_desc, 'NAME');
  83.                 if ($p_name === false) return false;
  84.  
  85.                 $nodes = array();
  86.  
  87.                 foreach ($lines as $line) {
  88.                         if (trim($line) == '') continue;
  89.  
  90.                         $name = substr($line, $p_name);
  91.  
  92.                         preg_match('@.+\s(\d+)\$@ism', substr($line, 0, $p_name-1), $m);
  93.                         $tmp = rtrim(substr($line, 0, $p_name-1));
  94.                         $tmp = explode(" ", $tmp);
  95.                         $node = end($tmp);
  96.  
  97.                         $tmp = rtrim(substr($line, 0, $p_name-strlen($node)-1));
  98.                         $tmp = explode(" ", $tmp);
  99.                         $size = end($tmp);
  100.  
  101.                         if (substr($name, 0, strlen($dir_to_check)) !== $dir_to_check) continue;
  102.  
  103.                         if (strpos($name, ' (deleted)') === false) continue;
  104.                         if ($size == 0) continue;
  105.  
  106.                         $nodes[$node] = $size;
  107.                 }
  108.  
  109.                 $size_total = 0;
  110.                 foreach ($nodes as $node => $size) {
  111.                         $size_total += $size;
  112.                 }
  113.                 return $size_total;
  114.         }
  115.  
  116.         protected function cbRun($optional_args=array()) {
  117.                 $dir = $this->argDir->getValue();
  118.                 if (empty($dir)) $dir = '/';
  119.                 $dir = realpath($dir) === false ? $dir : realpath($dir);
  120.                 if (substr($dir,-1) !== '/') $dir .= '/';
  121.  
  122.                 $size = self::check_open_deleted_files($dir);
  123.                 if ($size === false) throw new Exception("Cannot get information from 'lsof'");
  124.  
  125.                 $this->checkAgainstWarningRange( array($size.'B'), false, true, 0);
  126.                 $this->checkAgainstCriticalRange(array($size.'B'), false, true, 0);
  127.  
  128.                 $m = (new VNagValueUomPair($size.'B'));
  129.                 $m->roundTo = ROUND_TO;
  130.                 $sizeOut = $m->normalize(OUTPUT_UOM);
  131.  
  132.                 $msg = "$sizeOut opened deleted files in $dir";
  133.                 $this->setHeadline($msg);
  134.         }
  135. }
  136.