Subversion Repositories vnag

Rev

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
}