1 | <?php |
||||||
2 | |||||||
3 | namespace Icinga\Module\Trapdirector\Controllers; |
||||||
4 | |||||||
5 | use Icinga\Web\Url; |
||||||
6 | use Icinga\Web\Form; |
||||||
7 | use Zend_Form_Element_File as File; |
||||||
8 | use Zend_Form_Element_Submit as Submit; |
||||||
9 | |||||||
10 | use Exception; |
||||||
11 | |||||||
12 | use Icinga\Module\Trapdirector\TrapsController; |
||||||
13 | use Trapdirector\Trap; |
||||||
14 | |||||||
15 | class StatusController extends TrapsController |
||||||
16 | { |
||||||
17 | public function indexAction() |
||||||
18 | { |
||||||
19 | $this->prepareTabs()->activate('status'); |
||||||
20 | |||||||
21 | /************ Trapdb ***********/ |
||||||
22 | try |
||||||
23 | { |
||||||
24 | $dbConn = $this->getUIDatabase()->getDbConn(); |
||||||
25 | if ($dbConn === null) throw new \ErrorException('uncatched db error'); |
||||||
26 | $query = $dbConn->select()->from( |
||||||
27 | $this->getModuleConfig()->getTrapTableName(), |
||||||
28 | array('COUNT(*)') |
||||||
29 | ); |
||||||
30 | $this->view->trap_count=$dbConn->fetchOne($query); |
||||||
31 | $query = $dbConn->select()->from( |
||||||
32 | $this->getModuleConfig()->getTrapDataTableName(), |
||||||
33 | array('COUNT(*)') |
||||||
34 | ); |
||||||
35 | $this->view->trap_object_count=$dbConn->fetchOne($query); |
||||||
36 | $query = $dbConn->select()->from( |
||||||
37 | $this->getModuleConfig()->getTrapRuleName(), |
||||||
38 | array('COUNT(*)') |
||||||
39 | ); |
||||||
40 | $this->view->rule_count=$dbConn->fetchOne($query); |
||||||
41 | |||||||
42 | $this->view->trap_days_delete=$this->getUIDatabase()->getDBConfigValue('db_remove_days'); |
||||||
43 | |||||||
44 | } |
||||||
45 | catch (Exception $e) |
||||||
46 | { |
||||||
47 | $this->displayExitError('status',$e->getMessage()); |
||||||
48 | } |
||||||
49 | |||||||
50 | /*************** Log destination *******************/ |
||||||
51 | |||||||
52 | try |
||||||
53 | { |
||||||
54 | $this->view->currentLogDestination=$this->getUIDatabase()->getDBConfigValue('log_destination'); |
||||||
55 | $this->view->logDestinations=$this->getModuleConfig()->getLogDestinations(); |
||||||
56 | $this->view->currentLogFile=$this->getUIDatabase()->getDBConfigValue('log_file'); |
||||||
57 | $this->view->logLevels=$this->getModuleConfig()->getlogLevels(); |
||||||
58 | $this->view->currentLogLevel=$this->getUIDatabase()->getDBConfigValue('log_level'); |
||||||
59 | } |
||||||
60 | catch (Exception $e) |
||||||
61 | { |
||||||
62 | $this->displayExitError('status',$e->getMessage()); |
||||||
63 | } |
||||||
64 | |||||||
65 | /*************** SNMP configuration ****************/ |
||||||
66 | try |
||||||
67 | { |
||||||
68 | $this->view->useSnmpTrapAddess= ( $this->getUIDatabase()->getDBConfigValue('use_SnmpTrapAddess') == 1 ) ? TRUE : FALSE; |
||||||
69 | $this->view->SnmpTrapAddressOID=$this->getUIDatabase()->getDBConfigValue('SnmpTrapAddess_oid'); |
||||||
70 | $this->view->SnmpTrapAddressOIDDefault = ($this->view->SnmpTrapAddressOID == $this->getModuleConfig()->getDBConfigDefaults()['SnmpTrapAddess_oid'] ) ? TRUE : FALSE; |
||||||
71 | |||||||
72 | } |
||||||
73 | catch (Exception $e) |
||||||
74 | { |
||||||
75 | $this->displayExitError('status',$e->getMessage()); |
||||||
76 | } |
||||||
77 | |||||||
78 | } |
||||||
79 | |||||||
80 | /** Mib management |
||||||
81 | * Post param : action=update_mib_db : update mib database |
||||||
82 | * Post param : ation=check_update : check if mib update is finished |
||||||
83 | * File post : mibfile -> save mib file |
||||||
84 | */ |
||||||
85 | public function mibAction() |
||||||
86 | { |
||||||
87 | $this->prepareTabs()->activate('mib'); |
||||||
88 | |||||||
89 | $this->view->uploadStatus=null; |
||||||
90 | // check if it is an ajax query |
||||||
91 | if ($this->getRequest()->isPost()) |
||||||
92 | { |
||||||
93 | $postData=$this->getRequest()->getPost(); |
||||||
94 | /** Check for action update or check update */ |
||||||
95 | if (isset($postData['action'])) |
||||||
96 | { |
||||||
97 | $action=$postData['action']; |
||||||
98 | if ($action == 'update_mib_db') |
||||||
99 | { // Do the update in background |
||||||
100 | $return=exec('icingacli trapdirector mib update --pid /tmp/trapdirector_update.pid'); |
||||||
101 | if (preg_match('/OK/',$return)) |
||||||
102 | { |
||||||
103 | $this->_helper->json(array('status'=>'OK')); |
||||||
104 | } |
||||||
105 | // Error |
||||||
106 | $this->_helper->json(array('status'=>$return)); |
||||||
107 | } |
||||||
108 | if ($action == 'check_update') |
||||||
109 | { |
||||||
110 | $file=@fopen('/tmp/trapdirector_update.pid','r'); |
||||||
111 | if ($file == false) |
||||||
112 | { // process is dead |
||||||
113 | $this->_helper->json(array('status'=>'tu quoque fili','err'=>'Cannot open file')); |
||||||
114 | return; |
||||||
115 | } |
||||||
116 | $pid=fgets($file); |
||||||
117 | $output=array(); |
||||||
118 | $retVal=0; |
||||||
119 | exec('ps '.$pid,$output,$retVal); |
||||||
120 | if ($retVal == 0) |
||||||
121 | { // process is alive |
||||||
122 | $this->_helper->json(array('status'=>'Alive and kicking')); |
||||||
123 | } |
||||||
124 | else |
||||||
125 | { // process is dead |
||||||
126 | $this->_helper->json(array('status'=>'tu quoque fili','err'=>'no proc'.$pid)); |
||||||
127 | } |
||||||
128 | } |
||||||
129 | $this->_helper->json(array('status'=>'ERR : no '.$action.' action possible' )); |
||||||
130 | } |
||||||
131 | /** Check for mib file UPLOAD */ |
||||||
132 | if (isset($_FILES['mibfile'])) |
||||||
133 | { |
||||||
134 | $name=filter_var($_FILES['mibfile']['name'],FILTER_SANITIZE_STRING); |
||||||
135 | $DirConf=explode(':',$this->Config()->get('config', 'snmptranslate_dirs')); |
||||||
136 | $destDir=array_shift($DirConf); |
||||||
137 | if (!is_dir($destDir)) |
||||||
138 | { |
||||||
139 | $this->view->uploadStatus="ERROR : no $destDir directory, check module configuration"; |
||||||
140 | } |
||||||
141 | else |
||||||
142 | { |
||||||
143 | if (!is_writable($destDir)) |
||||||
144 | { |
||||||
145 | $this->view->uploadStatus="ERROR : $destDir directory is not writable"; |
||||||
146 | } |
||||||
147 | else |
||||||
148 | { |
||||||
149 | $destination = $destDir .'/'.$name; //$this->Module()->getBaseDir() . "/mibs/$name"; |
||||||
150 | $sourceTmpNam=filter_var($_FILES['mibfile']['tmp_name'],FILTER_SANITIZE_STRING); |
||||||
151 | if (move_uploaded_file($sourceTmpNam,$destination)===false) |
||||||
152 | { |
||||||
153 | $this->view->uploadStatus="ERROR, file $destination not loaded. Check file and path name or selinux violations"; |
||||||
154 | } |
||||||
155 | else |
||||||
156 | { |
||||||
157 | $this->view->uploadStatus="File $name uploaded in $destDir"; |
||||||
158 | } |
||||||
159 | } |
||||||
160 | } |
||||||
161 | |||||||
162 | } |
||||||
163 | |||||||
164 | } |
||||||
165 | |||||||
166 | // snmptranslate tests |
||||||
167 | $snmptranslate = $this->Config()->get('config', 'snmptranslate'); |
||||||
168 | $this->view->snmptranslate_bin=$snmptranslate; |
||||||
169 | $this->view->snmptranslate_state='warn'; |
||||||
170 | if (is_executable ( $snmptranslate )) |
||||||
171 | { |
||||||
172 | $translate=exec($snmptranslate . ' 1'); |
||||||
173 | if (preg_match('/iso/',$translate)) |
||||||
174 | { |
||||||
175 | $translate=exec($snmptranslate . ' 1.3.6.1.4'); |
||||||
176 | if (preg_match('/private/',$translate)) |
||||||
177 | { |
||||||
178 | $this->view->snmptranslate='works fine'; |
||||||
179 | $this->view->snmptranslate_state='ok'; |
||||||
180 | } |
||||||
181 | else |
||||||
182 | { |
||||||
183 | $this->view->snmptranslate='works fine but missing basic MIBs'; |
||||||
184 | } |
||||||
185 | } |
||||||
186 | else |
||||||
187 | { |
||||||
188 | $this->view->snmptranslate='Can execute but no OID to name resolution'; |
||||||
189 | } |
||||||
190 | } |
||||||
191 | else |
||||||
192 | { |
||||||
193 | $this->view->snmptranslate='Cannot execute'; |
||||||
194 | } |
||||||
195 | |||||||
196 | // mib database |
||||||
197 | |||||||
198 | $this->view->mibDbCount=$this->getMIB()->countObjects(); |
||||||
199 | $this->view->mibDbCountTrap=$this->getMIB()->countObjects(null,21); |
||||||
200 | |||||||
201 | // mib dirs |
||||||
202 | $DirConf=$this->Config()->get('config', 'snmptranslate_dirs'); |
||||||
203 | $dirArray=explode(':',$DirConf); |
||||||
204 | |||||||
205 | // Get base directories from net-snmp-config |
||||||
206 | $output=$matches=array(); |
||||||
207 | $retVal=0; |
||||||
208 | $sysDirs=exec('net-snmp-config --default-mibdirs',$output,$retVal); |
||||||
209 | if ($retVal==0) |
||||||
210 | { |
||||||
211 | $dirArray=array_merge($dirArray,explode(':',$sysDirs)); |
||||||
212 | } |
||||||
213 | else |
||||||
214 | { |
||||||
215 | $translateOut=exec($this->Config()->get('config', 'snmptranslate') . ' -Dinit_mib .1.3 2>&1 | grep MIBDIRS'); |
||||||
216 | if (preg_match('/MIBDIRS.*\'([^\']+)\'/',$translateOut,$matches)) |
||||||
217 | { |
||||||
218 | $dirArray=array_merge($dirArray,explode(':',$matches[1])); |
||||||
219 | } |
||||||
220 | else |
||||||
221 | { |
||||||
222 | array_push($dirArray,'Install net-snmp-config to see system directories'); |
||||||
223 | } |
||||||
224 | } |
||||||
225 | |||||||
226 | $this->view->dirArray=$dirArray; |
||||||
227 | |||||||
228 | $output=null; |
||||||
229 | foreach (explode(':',$DirConf) as $mibdir) |
||||||
230 | { |
||||||
231 | exec('ls '.$mibdir.' | grep -v traplist.txt',$output); |
||||||
232 | } |
||||||
233 | //$i=0;$listFiles='';while (isset($output[$i])) $listFiles.=$output[$i++]; |
||||||
234 | //$this->view->fileList=explode(' ',$listFiles); |
||||||
235 | $this->view->fileList=$output; |
||||||
236 | |||||||
237 | // Zend form |
||||||
238 | $this->view->form= new UploadForm(); |
||||||
239 | //$this->view->form= new Form('upload-form'); |
||||||
240 | |||||||
241 | |||||||
242 | } |
||||||
243 | |||||||
244 | /** UI options */ |
||||||
245 | public function uimgtAction() |
||||||
246 | { |
||||||
247 | $this->prepareTabs()->activate('uimgt'); |
||||||
248 | |||||||
249 | $this->view->setError=''; |
||||||
250 | $this->view->setOKMsg=''; |
||||||
251 | |||||||
252 | //max_rows=25&row_update=update |
||||||
253 | if ( $this->getRequest()->getParam('max_rows',NULL) !== NULL ) |
||||||
254 | { |
||||||
255 | $maxRows = $this->getRequest()->getParam('max_rows'); |
||||||
256 | if (!preg_match('/^[0-9]+$/', $maxRows) || $maxRows < 1) |
||||||
257 | { |
||||||
258 | $this->view->setError='Max rows must be a number'; |
||||||
259 | } |
||||||
260 | else |
||||||
261 | { |
||||||
262 | $this->setitemListDisplay($maxRows); |
||||||
263 | $this->view->setOKMsg='Set max rows to ' . $maxRows; |
||||||
264 | } |
||||||
265 | } |
||||||
266 | |||||||
267 | if ( $this->getRequest()->getParam('add_category',NULL) !== NULL ) |
||||||
268 | { |
||||||
269 | $addCat = $this->getRequest()->getParam('add_category'); |
||||||
270 | $this->addHandlersCategory($addCat); |
||||||
271 | } |
||||||
272 | |||||||
273 | if ( $this->getRequest()->getPost('type',NULL) !== NULL ) |
||||||
274 | { |
||||||
275 | $type = $this->getRequest()->getPost('type',NULL); |
||||||
276 | $index = $this->getRequest()->getPost('index',NULL); |
||||||
277 | $newname = $this->getRequest()->getPost('newname',NULL); |
||||||
278 | |||||||
279 | if (!preg_match('/^[0-9]+$/', $index) || $index < 1) |
||||||
280 | $this->_helper->json(array('status'=>'Bad index')); |
||||||
281 | |||||||
282 | switch ($type) |
||||||
283 | { |
||||||
284 | case 'delete': |
||||||
285 | $this->delHandlersCategory($index); |
||||||
286 | $this->_helper->json(array('status'=>'OK')); |
||||||
287 | return; |
||||||
288 | break; |
||||||
289 | case 'rename': |
||||||
290 | $this->renameHandlersCategory($index, $newname); |
||||||
291 | $this->_helper->json(array('status'=>'OK')); |
||||||
292 | return; |
||||||
293 | break; |
||||||
294 | default: |
||||||
295 | $this->_helper->json(array('status'=>'Unknwon command')); |
||||||
296 | return; |
||||||
297 | break; |
||||||
298 | } |
||||||
299 | } |
||||||
300 | |||||||
301 | $this->view->maxRows = $this->itemListDisplay(); |
||||||
302 | |||||||
303 | $this->view->categories = $this->getHandlersCategory(); |
||||||
304 | |||||||
305 | |||||||
306 | |||||||
307 | } |
||||||
308 | |||||||
309 | /** Create services and templates |
||||||
310 | * Create template for trap service |
||||||
311 | * |
||||||
312 | */ |
||||||
313 | public function servicesAction() |
||||||
314 | { |
||||||
315 | $this->prepareTabs()->activate('services'); |
||||||
316 | |||||||
317 | /*if (!$this->isDirectorInstalled()) |
||||||
318 | { |
||||||
319 | $this->displayExitError("Status -> Services","Director is not installed, template & services install are not available"); |
||||||
320 | } |
||||||
321 | */ |
||||||
322 | // Check if data was sent : |
||||||
323 | $postData=$this->getRequest()->getPost(); |
||||||
324 | $this->view->templateForm_output=''; |
||||||
325 | if (isset($postData['template_name']) && isset($postData['template_revert_time'])) |
||||||
326 | { |
||||||
327 | $template_create = 'icingacli director service create --json \'{ "check_command": "dummy", '; |
||||||
328 | $template_create .= '"check_interval": "' .$postData['template_revert_time']. '", "check_timeout": "20", "disabled": false, "enable_active_checks": true, "enable_event_handler": true, "enable_notifications": true, "enable_passive_checks": true, "enable_perfdata": true, "max_check_attempts": "1", '; |
||||||
329 | $template_create .= '"object_name": "'.$postData['template_name'].'", "object_type": "template", "retry_interval": "'.$postData['template_revert_time'].'"}\''; |
||||||
330 | $output=array(); |
||||||
331 | $ret_code=0; |
||||||
332 | exec($template_create,$output,$ret_code); |
||||||
333 | if ($ret_code != 0) |
||||||
334 | { |
||||||
335 | $this->displayExitError("Status -> Services","Error creating template : ".$output[0].'<br>Command was : '.$template_create); |
||||||
336 | } |
||||||
337 | exec('icingacli director config deploy',$output,$ret_code); |
||||||
338 | $this->view->templateForm_output='Template '.$postData['template_name']. ' created'; |
||||||
339 | } |
||||||
340 | |||||||
341 | // template creation form |
||||||
342 | $this->view->templateForm_URL=Url::fromRequest()->__toString(); |
||||||
343 | $this->view->templateForm_name="trapdirector_main_template"; |
||||||
344 | $this->view->templateForm_interval="3600"; |
||||||
345 | } |
||||||
346 | |||||||
347 | /** |
||||||
348 | * Plugins display and activation |
||||||
349 | */ |
||||||
350 | public function pluginsAction() |
||||||
351 | { |
||||||
352 | $this->prepareTabs()->activate('plugins'); |
||||||
353 | |||||||
354 | require_once($this->Module()->getBaseDir() .'/bin/trap_class.php'); |
||||||
355 | $icingaweb2_etc=$this->Config()->get('config', 'icingaweb2_etc'); |
||||||
356 | $Trap = new Trap($icingaweb2_etc,4); |
||||||
357 | |||||||
358 | $this->view->pluginLoaded = htmlentities($Trap->pluginClass->registerAllPlugins(false)); |
||||||
359 | |||||||
360 | $enabledPlugins = $Trap->pluginClass->getEnabledPlugins(); |
||||||
361 | |||||||
362 | $pluginList = $Trap->pluginClass->pluginList(); |
||||||
363 | |||||||
364 | // Plugin list and fill function name list |
||||||
365 | $functionList=array(); |
||||||
366 | $this->view->pluginArray=array(); |
||||||
367 | foreach ($pluginList as $plugin) |
||||||
368 | { |
||||||
369 | $pluginDetails=$Trap->pluginClass->pluginDetails($plugin); |
||||||
370 | $pluginDetails->enabled = (in_array($plugin, $enabledPlugins)) ? true : false; |
||||||
371 | $pluginDetails->catchAllTraps = ($pluginDetails->catchAllTraps === true )? 'Yes' : 'No'; |
||||||
372 | $pluginDetails->processTraps = ($pluginDetails->processTraps === true )? 'Yes' : 'No'; |
||||||
373 | $pluginDetails->description = htmlentities($pluginDetails->description); |
||||||
374 | $pluginDetails->description = preg_replace('/\n/','<br>',$pluginDetails->description); |
||||||
375 | array_push($this->view->pluginArray, $pluginDetails); |
||||||
376 | // Get functions for function details |
||||||
377 | foreach ($pluginDetails->funcArray as $function) |
||||||
378 | { |
||||||
379 | array_push($functionList,$function); |
||||||
380 | } |
||||||
381 | } |
||||||
382 | |||||||
383 | // Function list with details |
||||||
384 | $this->view->functionList=array(); |
||||||
385 | foreach ($functionList as $function) |
||||||
386 | { |
||||||
387 | $functionDetail = $Trap->pluginClass->getFunctionDetails($function); |
||||||
388 | $functionDetail->params = htmlentities($functionDetail->params); |
||||||
389 | $functionDetail->description = htmlentities($functionDetail->description); |
||||||
390 | $functionDetail->description = preg_replace('/\n/','<br>',$functionDetail->description); |
||||||
391 | array_push($this->view->functionList, $functionDetail); |
||||||
392 | } |
||||||
393 | |||||||
394 | } |
||||||
395 | |||||||
396 | /** |
||||||
397 | * For testing functions |
||||||
398 | */ |
||||||
399 | public function debugAction() |
||||||
400 | { |
||||||
401 | $this->view->answer='No answer'; |
||||||
402 | |||||||
403 | $postData=$this->getRequest()->getPost(); |
||||||
404 | if (isset($postData['input1'])) |
||||||
405 | { |
||||||
406 | $input1 = $postData['input1']; |
||||||
407 | $input2 = $postData['input2']; |
||||||
408 | $input3 = $postData['input3']; |
||||||
0 ignored issues
–
show
Unused Code
introduced
by
Loading history...
|
|||||||
409 | |||||||
410 | //$this->view->answer=$input1 . '/' . $input2 . '/' . $input3; |
||||||
411 | try { |
||||||
412 | $API = $this->getIdoConn(); |
||||||
413 | //$hosts = $API->getHostByIP($input1); |
||||||
414 | $hosts = $API->getHostsIPByHostGroup($input1); |
||||||
0 ignored issues
–
show
The method
getHostsIPByHostGroup() does not exist on Icinga\Module\Trapdirector\TrapsActions\UIDatabase .
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed.
Loading history...
|
|||||||
415 | $this->view->answer = print_r($hosts,true); |
||||||
416 | |||||||
417 | } catch (Exception $e) |
||||||
418 | { |
||||||
419 | $this->view->answer = "Exception : " . print_r($e->getMessage()); |
||||||
420 | } |
||||||
421 | |||||||
422 | } |
||||||
423 | |||||||
424 | } |
||||||
425 | |||||||
426 | protected function prepareTabs() |
||||||
427 | { |
||||||
428 | return $this->getTabs()->add('status', array( |
||||||
429 | 'label' => $this->translate('Status'), |
||||||
430 | 'url' => $this->getModuleConfig()->urlPath() . '/status') |
||||||
431 | )->add('mib', array( |
||||||
432 | 'label' => $this->translate('MIB Management'), |
||||||
433 | 'url' => $this->getModuleConfig()->urlPath() . '/status/mib') |
||||||
434 | )->add('uimgt', array( |
||||||
435 | 'label' => $this->translate('UI Configuration'), |
||||||
436 | 'url' => $this->getModuleConfig()->urlPath() . '/status/uimgt') |
||||||
437 | )->add('services', array( |
||||||
438 | 'label' => $this->translate('Services management'), |
||||||
439 | 'url' => $this->getModuleConfig()->urlPath() . '/status/services') |
||||||
440 | )->add('plugins', array( |
||||||
441 | 'label' => $this->translate('Plugins management'), |
||||||
442 | 'url' => $this->getModuleConfig()->urlPath() . '/status/plugins') |
||||||
443 | ); |
||||||
444 | } |
||||||
445 | } |
||||||
446 | |||||||
447 | // TODO : see if useless |
||||||
448 | class UploadForm extends Form |
||||||
449 | { |
||||||
450 | public function __construct($options = null) |
||||||
451 | { |
||||||
452 | parent::__construct($options); |
||||||
453 | $this->addElements2(); |
||||||
454 | } |
||||||
455 | |||||||
456 | public function addElements2() |
||||||
457 | { |
||||||
458 | // File Input |
||||||
459 | $file = new File('mib-file'); |
||||||
460 | $file->setLabel('Mib upload'); |
||||||
461 | //->setAttrib('multiple', null); |
||||||
462 | $this->addElement($file); |
||||||
463 | $button = new Submit("upload",array('ignore'=>false)); |
||||||
464 | $this->addElement($button);//->setIgnore(false); |
||||||
465 | } |
||||||
466 | } |
||||||
467 |