Subversion Repositories vnag

Rev

Rev 53 | 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>
77 daniel-mar 2
ov1A3foRlP41hBwRN4BzfkjAUtw/l65GSzEXcnHvp6VksQhlnnu9K2bOFKHbtKCGl
3
jncDxUM94n/4eK/vFoLrswNBNyZrld5BMp2Ux0bsrai6HrLgHX9+WzaGYbhVBInTk
4
EwycIrYdmjotlz6TwhS3XAE3DFyrNJIQnSG4GCQAajyM/LNuJ5FGFomDuqFHGV0YU
5
EYZetxkW6Y5fpoqGrYN9UawLju0lqNOLrCdDyPIQjB8P9X22CD4HtS51NSm0l7oMV
6
X2wxoabhKJnM+GaMJCzuDbToDKa7bGuh4OBe2WQIsyjzgq3eCCrkF1/FgZ4csjAl8
7
8qC5prdzhRehHPF0++O1Hx1c6E/x6FbV7RnfAXMexPP3oFRjgsuWF5ssAGx51qtk1
8
klYvGiG6XU4Rd9vN4Hb8ldvOrPEUSzzzYcGymOje8Q7kKL0QvHYKTN8vrIZ4XxbX5
9
/RDSQYfudTKK89ymAPfa/57lqDwUrBkGr573tlQlEUDc1LX3ep9MLDyL5+wZoS1pF
10
l/j9ynVygkZlLLNxwSYmzYJSudwrLKfGqsCUJuFaCa2Uqm8Pv8U3oJALr0+gVAKoP
11
h5tIi+rWc6Mq8I3MYRrskL1lPbf2OYFhudA/7XGpaNUhzhKWXK1KOTN1SruyZGDTs
12
+rxjQuz2+gNJnjnvVzPCAvoIZREC5NzuAsm5Ccmetm26fP8Gq21bIGPhfrEcq2rNE
13
VrtyXNqvTTLJLhYBX2Vf+bIhRfLF8xFZV0tZc5Rk2Ulb0qlb6UdrA7DJ5dX3EvVAm
14
/89K7I15C0IJ1moskcRemWPpnLG6FVEUkOFJRTqnir9hb2CbmHd3nnd55yQwiE3Vk
15
xz5k9+cOcc045Lp+BcMNmxDTCfJnS7oUWoy8RZuP2r1gVrOmxm76/8dUT+NHj2Bfw
16
peuELFf+DXm8mJDSiIcOUE+eEi6+31N6m9qBt7ewMSCIr/eyGwZltXHpEmCjjT+vy
17
MV4ce7PLko0Rlk8IjXYKR6z3k5NP2NfYpe+IxTgTZ7/ZaGQjLhny4OuyjnftZ5IDe
18
Nk212bKQjjxW4YiZRwCFDRdQqFUj5d93AAsKnYqeRKdvTMyAv637PemfZx91K4Be4
19
oBgVmfIYW+OImf5ACkRaTchVLq30Bh3yDrMNitLBIXgYlB+FRyB4GPChBOQtX2xDQ
20
/orZ39Hvr5a11BOPpIHm3+zG+EejRQzD0h9QheCUaTD+P3G1ugkXYaXOFDXgN9XMC
21
jmRPhvilNhUx271eaTDgGF/p6uazjC4NwN/Zek+mEfDP0ZI59OiNaCZDrYi0eVvrz
22
i9AExoFTPfS3lx/DTEL+0SzmZ1/1LXIlVxwdfkx3t+3VEhLvQ3ro4Kt/fuE+D43vh
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
 *
77 daniel-mar 32
 * Revision 2023-10-13
52 daniel-mar 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);
77 daniel-mar 123
                if ($size === false) throw new VNagException("Cannot get information from 'lsof'");
52 daniel-mar 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
}