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 | } |