Rev 52 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
52 | daniel-mar | 1 | <?php /* <ViaThinkSoftSignature> |
53 | daniel-mar | 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 |
||
52 | daniel-mar | 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 = '/') { |
||
53 | daniel-mar | 63 | // Note: Requires root |
64 | exec('lsof -n', $lines, $ec); |
||
52 | daniel-mar | 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 | } |