Passed
Push — master ( 6a1f5a...b100fb )
by Patrick
02:54
created

StatusController::indexAction()   C

Complexity

Conditions 7
Paths 600

Size

Total Lines 59
Code Lines 33

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 7
eloc 33
c 0
b 0
f 0
nc 600
nop 0
dl 0
loc 59
rs 5.5697

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

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
				$this->view->snmptranslate='works fine';
176
				$this->view->snmptranslate_state='ok';
177
			}
178
			else
179
			{
180
				$this->view->snmptranslate='can execute but no resolution';
181
			}
182
		}
183
		else
184
		{
185
			$this->view->snmptranslate='cannot execute';
186
		}
187
	
188
		// mib database
189
		
190
		$this->view->mibDbCount=$this->getMIB()->countObjects();
191
		$this->view->mibDbCountTrap=$this->getMIB()->countObjects(null,21);
192
		
193
		// mib dirs
194
		$DirConf=$this->Config()->get('config', 'snmptranslate_dirs');
195
		$dirArray=explode(':',$DirConf);
196
197
		// Get base directories from net-snmp-config
198
		$output=$matches=array();
199
		$retVal=0;
200
		$sysDirs=exec('net-snmp-config --default-mibdirs',$output,$retVal);
201
		if ($retVal==0)
202
		{
203
			$dirArray=array_merge($dirArray,explode(':',$sysDirs));
204
		}
205
		else
206
		{
207
			$translateOut=exec($this->Config()->get('config', 'snmptranslate') . ' -Dinit_mib .1.3 2>&1 | grep MIBDIRS');
208
			if (preg_match('/MIBDIRS.*\'([^\']+)\'/',$translateOut,$matches))
209
			{
210
				$dirArray=array_merge($dirArray,explode(':',$matches[1]));
211
			}
212
			else
213
			{
214
				array_push($dirArray,'Install net-snmp-config to see system directories');
215
			}
216
		}
217
		
218
		$this->view->dirArray=$dirArray;
219
		
220
		$output=null;
221
		foreach (explode(':',$DirConf) as $mibdir)
222
		{
223
			exec('ls '.$mibdir.' | grep -v traplist.txt',$output);
224
		}
225
		//$i=0;$listFiles='';while (isset($output[$i])) $listFiles.=$output[$i++];
226
		//$this->view->fileList=explode(' ',$listFiles);
227
		$this->view->fileList=$output;
228
		
229
		// Zend form 
230
		$this->view->form= new UploadForm();
231
		//$this->view->form= new Form('upload-form');
232
		
233
		
234
	}
235
236
	/** Create services and templates
237
	 *  Create template for trap service
238
	 * 
239
	 */
240
	public function servicesAction()
241
	{
242
		$this->prepareTabs()->activate('services');
243
		
244
		/*if (!$this->isDirectorInstalled())
245
		{
246
			$this->displayExitError("Status -> Services","Director is not installed, template & services install are not available");
247
		}
248
		*/
249
		// Check if data was sent :
250
		$postData=$this->getRequest()->getPost();
251
		$this->view->templateForm_output='';
252
		if (isset($postData['template_name']) && isset($postData['template_revert_time']))
253
		{
254
			$template_create = 'icingacli director service create --json \'{ "check_command": "dummy", ';
255
			$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", ';
256
			$template_create .= '"object_name": "'.$postData['template_name'].'", "object_type": "template", "retry_interval": "'.$postData['template_revert_time'].'"}\'';
257
			$output=array();
258
			$ret_code=0;
259
			exec($template_create,$output,$ret_code);
260
			if ($ret_code != 0)
261
			{
262
				$this->displayExitError("Status -> Services","Error creating template : ".$output[0].'<br>Command was : '.$template_create);
263
			}
264
			exec('icingacli director config deploy',$output,$ret_code);
265
			$this->view->templateForm_output='Template '.$postData['template_name']. ' created';
266
		}
267
		
268
		// template creation form
269
		$this->view->templateForm_URL=Url::fromRequest()->__toString();
270
		$this->view->templateForm_name="trapdirector_main_template";
271
		$this->view->templateForm_interval="3600";
272
	}
273
    
274
	/**
275
	 * Plugins display and activation
276
	 */
277
	public function pluginsAction()
278
	{
279
	    $this->prepareTabs()->activate('plugins');
280
	    
281
	    require_once($this->Module()->getBaseDir() .'/bin/trap_class.php');
282
	    $icingaweb2_etc=$this->Config()->get('config', 'icingaweb2_etc');
283
	    $Trap = new Trap($icingaweb2_etc,4);
284
	    
285
	    $this->view->pluginLoaded = htmlentities($Trap->pluginClass->registerAllPlugins(false));
286
	    
287
	    $enabledPlugins = $Trap->pluginClass->getEnabledPlugins();
288
289
	    $pluginList = $Trap->pluginClass->pluginList();
290
	    
291
	    // Plugin list and fill function name list
292
	    $functionList=array();
293
	    $this->view->pluginArray=array();
294
	    foreach ($pluginList as $plugin)
295
	    {
296
	        $pluginDetails=$Trap->pluginClass->pluginDetails($plugin);
297
	        $pluginDetails->enabled =  (in_array($plugin, $enabledPlugins)) ? true : false;
298
	        $pluginDetails->catchAllTraps = ($pluginDetails->catchAllTraps === true )? 'Yes' : 'No';
299
	        $pluginDetails->processTraps = ($pluginDetails->processTraps === true )? 'Yes' : 'No';
300
	        $pluginDetails->description = htmlentities($pluginDetails->description);
301
	        $pluginDetails->description = preg_replace('/\n/','<br>',$pluginDetails->description);
302
	        array_push($this->view->pluginArray, $pluginDetails);
303
	        // Get functions for function details
304
	        foreach ($pluginDetails->funcArray as $function)
305
	        {
306
	            array_push($functionList,$function);
307
	        }
308
	    }
309
	    
310
	    // Function list with details
311
	    $this->view->functionList=array();
312
	    foreach ($functionList as $function)
313
	    {
314
	        $functionDetail = $Trap->pluginClass->getFunctionDetails($function);
315
	        $functionDetail->params = htmlentities($functionDetail->params);
316
	        $functionDetail->description = htmlentities($functionDetail->description);
317
	        $functionDetail->description = preg_replace('/\n/','<br>',$functionDetail->description);
318
	        array_push($this->view->functionList, $functionDetail);
319
	    }
320
321
	}
322
	
323
	protected function prepareTabs()
324
	{
325
		return $this->getTabs()->add('status', array(
326
			'label' => $this->translate('Status'),
327
			'url'   => $this->getModuleConfig()->urlPath() . '/status')
328
		)->add('mib', array(
329
			'label' => $this->translate('MIB Management'),
330
			'url'   => $this->getModuleConfig()->urlPath() . '/status/mib')
331
		)->add('services', array(
332
			'label' => $this->translate('Services management'),
333
			'url'   => $this->getModuleConfig()->urlPath() . '/status/services')
334
	    )->add('plugins', array(
335
	        'label' => $this->translate('Plugins management'),
336
	        'url'   => $this->getModuleConfig()->urlPath() . '/status/plugins')
337
	    );
338
	} 
339
}
340
341
// TODO : see if useless 
342
class UploadForm extends Form
343
{ 
344
    public function __construct($options = null) 
345
    {
346
        parent::__construct($options);
347
        $this->addElements2();
348
    }
349
350
    public function addElements2()
351
    {
352
        // File Input
353
        $file = new File('mib-file');
354
        $file->setLabel('Mib upload');
355
             //->setAttrib('multiple', null);
356
        $this->addElement($file);
357
		$button = new Submit("upload",array('ignore'=>false));
358
		$this->addElement($button);//->setIgnore(false);
359
    }
360
}
361