Passed
Push — master ( 84c1e8...225d38 )
by Patrick
02:08
created
library/Trapdirector/TrapsProcess/Plugins.php 1 patch
Indentation   +457 added lines, -457 removed lines patch added patch discarded remove patch
@@ -17,519 +17,519 @@
 block discarded – undo
17 17
  */
18 18
 class Plugins
19 19
 {
20
-    /** Array of plugin objects. Keys ar plugin name
21
-     * @var PluginTemplate[] $pluginsList Plugins array with name as index
22
-     * $pluginsList[plugin name]['object']  : plugin object (NULL of not loaded)
23
-     * $pluginsList[plugin name]['allOID']  : bool true if plugin catches all oid
24
-     * $pluginsList[plugin name]['target']  : bool true if plugin can be trap processing target
25
-     * $pluginsList[plugin name]['enabled'] : bool true if plugin is in enabled list 
26
-     **/
27
-    protected $pluginsList = array();
20
+	/** Array of plugin objects. Keys ar plugin name
21
+	 * @var PluginTemplate[] $pluginsList Plugins array with name as index
22
+	 * $pluginsList[plugin name]['object']  : plugin object (NULL of not loaded)
23
+	 * $pluginsList[plugin name]['allOID']  : bool true if plugin catches all oid
24
+	 * $pluginsList[plugin name]['target']  : bool true if plugin can be trap processing target
25
+	 * $pluginsList[plugin name]['enabled'] : bool true if plugin is in enabled list 
26
+	 **/
27
+	protected $pluginsList = array();
28 28
 
29
-    /** Array of functions names
30
-     * @var array $functionList 
31
-     * $functionList[name]['plugin'] : Plugin name
32
-     * $functionList[name]['function'] : Plugin function to call (null if plugin not loaded)
33
-    */
34
-    protected $functionList=array();
29
+	/** Array of functions names
30
+	 * @var array $functionList 
31
+	 * $functionList[name]['plugin'] : Plugin name
32
+	 * $functionList[name]['function'] : Plugin function to call (null if plugin not loaded)
33
+	 */
34
+	protected $functionList=array();
35 35
     
36
-    /** @var string[] $enabledPlugins list of enabled plugins */
37
-    //public $enabledPlugins = array();
36
+	/** @var string[] $enabledPlugins list of enabled plugins */
37
+	//public $enabledPlugins = array();
38 38
 
39 39
     
40
-    /** @var Logging $logClass */
41
-    protected $logClass;
40
+	/** @var Logging $logClass */
41
+	protected $logClass;
42 42
 
43
-    /** @var Trap $trapClass */
44
-    protected $trapClass;
43
+	/** @var Trap $trapClass */
44
+	protected $trapClass;
45 45
     
46
-    /** @var string $pluginDir */
47
-    protected $pluginDir;
46
+	/** @var string $pluginDir */
47
+	protected $pluginDir;
48 48
     
49
-    /** Setup class
50
-     * @param Trap $logClass  the top trap class
51
-     * @param string $plugin_dir optional plugin directory
52
-     * @throws \Exception
53
-     */
54
-    function __construct(Trap $trapClass,string $pluginDir='')
55
-    {
56
-        if ($pluginDir == '')
57
-        {
58
-            $this->pluginDir=dirname(__DIR__).'/Plugins';
59
-        }
60
-        else 
61
-        {
62
-            $this->pluginDir=$pluginDir;
63
-        }
64
-        // Set and check Logging class
65
-        $this->trapClass=$trapClass;
66
-        if ($this->trapClass === null)
67
-        {
68
-            throw new Exception('Log class not loaded into trap class');
69
-        }
70
-        $this->logClass=$trapClass->logging;
71
-        if ($this->logClass === null)
72
-        {
73
-            throw new Exception('Log class not loaded into trap class');
74
-        }
75
-        // check DB class and get plugins list.
76
-        if ($this->trapClass->trapsDB === null)
77
-        {
78
-            throw new Exception('Database class not loaded into trap class');
79
-        }
80
-        $this->loadEnabledPlugins();
81
-    }
49
+	/** Setup class
50
+	 * @param Trap $logClass  the top trap class
51
+	 * @param string $plugin_dir optional plugin directory
52
+	 * @throws \Exception
53
+	 */
54
+	function __construct(Trap $trapClass,string $pluginDir='')
55
+	{
56
+		if ($pluginDir == '')
57
+		{
58
+			$this->pluginDir=dirname(__DIR__).'/Plugins';
59
+		}
60
+		else 
61
+		{
62
+			$this->pluginDir=$pluginDir;
63
+		}
64
+		// Set and check Logging class
65
+		$this->trapClass=$trapClass;
66
+		if ($this->trapClass === null)
67
+		{
68
+			throw new Exception('Log class not loaded into trap class');
69
+		}
70
+		$this->logClass=$trapClass->logging;
71
+		if ($this->logClass === null)
72
+		{
73
+			throw new Exception('Log class not loaded into trap class');
74
+		}
75
+		// check DB class and get plugins list.
76
+		if ($this->trapClass->trapsDB === null)
77
+		{
78
+			throw new Exception('Database class not loaded into trap class');
79
+		}
80
+		$this->loadEnabledPlugins();
81
+	}
82 82
     
83 83
     
84
-    /**
85
-     * Load enabled plugins from database config table.
86
-     * Fills enabledPlugins and functionList properties
87
-     * @throws \Exception
88
-     */
89
-    private function loadEnabledPlugins()
90
-    {
91
-        $PluginList = $this->trapClass->trapsDB->getDBConfig('enabled_plugins');
84
+	/**
85
+	 * Load enabled plugins from database config table.
86
+	 * Fills enabledPlugins and functionList properties
87
+	 * @throws \Exception
88
+	 */
89
+	private function loadEnabledPlugins()
90
+	{
91
+		$PluginList = $this->trapClass->trapsDB->getDBConfig('enabled_plugins');
92 92
                
93
-        if ($PluginList === null || $PluginList == '')
94
-        {
95
-            $this->logClass->log('No enabled plugins',DEBUG);
96
-            return;
97
-        }
98
-        else
99
-        {   // Saved config : <plugin name>;<Catch all OID ? 1|0>;<Trap target ? 1|0>;<func 1 name>|<func 2 name>... ,<plugin2 name>....
100
-            $this->logClass->log('Enabled plugins = '.$PluginList,DEBUG);
93
+		if ($PluginList === null || $PluginList == '')
94
+		{
95
+			$this->logClass->log('No enabled plugins',DEBUG);
96
+			return;
97
+		}
98
+		else
99
+		{   // Saved config : <plugin name>;<Catch all OID ? 1|0>;<Trap target ? 1|0>;<func 1 name>|<func 2 name>... ,<plugin2 name>....
100
+			$this->logClass->log('Enabled plugins = '.$PluginList,DEBUG);
101 101
             
102
-            $pluginArray = explode(',', $PluginList);
103
-            foreach ($pluginArray as $pluginElmt)
104
-            {
105
-                $pluginElmt = explode(';',$pluginElmt);
106
-                if ($pluginElmt === false || count($pluginElmt) != 4)
107
-                {
108
-                    throw new \Exception('Invalid plugin configuration : '. $PluginList );
109
-                }
110
-                $pluginName=$pluginElmt[0];
102
+			$pluginArray = explode(',', $PluginList);
103
+			foreach ($pluginArray as $pluginElmt)
104
+			{
105
+				$pluginElmt = explode(';',$pluginElmt);
106
+				if ($pluginElmt === false || count($pluginElmt) != 4)
107
+				{
108
+					throw new \Exception('Invalid plugin configuration : '. $PluginList );
109
+				}
110
+				$pluginName=$pluginElmt[0];
111 111
                 
112
-                $pluginListElmt = array();
113
-                $pluginListElmt['object'] = null; // class not loaded
114
-                $pluginListElmt['allOID'] = ($pluginElmt[1]=='1') ? true : false;
115
-                $pluginListElmt['target'] = ($pluginElmt[2]=='1') ? true : false;
116
-                $pluginListElmt['enabled'] = true;
112
+				$pluginListElmt = array();
113
+				$pluginListElmt['object'] = null; // class not loaded
114
+				$pluginListElmt['allOID'] = ($pluginElmt[1]=='1') ? true : false;
115
+				$pluginListElmt['target'] = ($pluginElmt[2]=='1') ? true : false;
116
+				$pluginListElmt['enabled'] = true;
117 117
                 
118
-                $this->pluginsList[$pluginName] = $pluginListElmt;
118
+				$this->pluginsList[$pluginName] = $pluginListElmt;
119 119
                 
120
-                // deal with plugin functions
121
-                $pluginFunctions = explode('|',$pluginElmt[3]);
122
-                if ($pluginFunctions !== false)
123
-                {
124
-                    foreach ($pluginFunctions as $function)
125
-                    {
126
-                        $this->functionList[$function] = array(
127
-                            'plugin'    =>   $pluginName,
128
-                            'function'  =>  null
129
-                        );
130
-                    }
131
-                }
132
-            }
120
+				// deal with plugin functions
121
+				$pluginFunctions = explode('|',$pluginElmt[3]);
122
+				if ($pluginFunctions !== false)
123
+				{
124
+					foreach ($pluginFunctions as $function)
125
+					{
126
+						$this->functionList[$function] = array(
127
+							'plugin'    =>   $pluginName,
128
+							'function'  =>  null
129
+						);
130
+					}
131
+				}
132
+			}
133 133
 
134
-        }
134
+		}
135 135
         
136
-    }
136
+	}
137 137
 
138
-    /**
139
-     * Save enabled plugin array in DB config
140
-     * @return bool true if OK, or false (error logged by DB Class)
141
-     */
142
-    private function saveEnabledPlugins()
143
-    {
144
-        $saveString='';
145
-        foreach ($this->pluginsList as $name => $value)
146
-        {
147
-            if ($value['enabled'] == false)
148
-            {
149
-                continue;
150
-            }
151
-            $functionString='';
152
-            foreach ($this->functionList as $fName => $fvalue)
153
-            {
154
-                if ($fvalue['plugin'] != $name)
155
-                {
156
-                    continue;
157
-                }
158
-                $functionString .= ($functionString == '') ? '' : '|'; // add separator if not empty
159
-                $functionString .= $fName;
160
-            }
161
-            $saveString .= ($saveString == '')?'':',' ;
138
+	/**
139
+	 * Save enabled plugin array in DB config
140
+	 * @return bool true if OK, or false (error logged by DB Class)
141
+	 */
142
+	private function saveEnabledPlugins()
143
+	{
144
+		$saveString='';
145
+		foreach ($this->pluginsList as $name => $value)
146
+		{
147
+			if ($value['enabled'] == false)
148
+			{
149
+				continue;
150
+			}
151
+			$functionString='';
152
+			foreach ($this->functionList as $fName => $fvalue)
153
+			{
154
+				if ($fvalue['plugin'] != $name)
155
+				{
156
+					continue;
157
+				}
158
+				$functionString .= ($functionString == '') ? '' : '|'; // add separator if not empty
159
+				$functionString .= $fName;
160
+			}
161
+			$saveString .= ($saveString == '')?'':',' ;
162 162
             
163
-            $allOID = ($value['allOID'] === true) ? 1 : 0;
164
-            $target = ($value['target'] === true) ? 1 : 0;
165
-            $saveString .= $name . ';' . $allOID . ';' . $target . ';' . $functionString ;
166
-        }
167
-        $this->logClass->log('Saving : ' . $saveString,DEBUG);
168
-        return $this->trapClass->trapsDB->setDBConfig('enabled_plugins', $saveString);
169
-    }
163
+			$allOID = ($value['allOID'] === true) ? 1 : 0;
164
+			$target = ($value['target'] === true) ? 1 : 0;
165
+			$saveString .= $name . ';' . $allOID . ';' . $target . ';' . $functionString ;
166
+		}
167
+		$this->logClass->log('Saving : ' . $saveString,DEBUG);
168
+		return $this->trapClass->trapsDB->setDBConfig('enabled_plugins', $saveString);
169
+	}
170 170
     
171
-    /** Get enabled plugin list by name
172
-     * @return array
173
-     */
174
-    public function getEnabledPlugins() : array
175
-    {
176
-        $retArray=array();
177
-        foreach ($this->pluginsList as $name => $value)
178
-        {
179
-            if ($value['enabled'] == true)
180
-            {
181
-                array_push($retArray,$name);
182
-            }
183
-        }
184
-        return $retArray;
185
-    }
171
+	/** Get enabled plugin list by name
172
+	 * @return array
173
+	 */
174
+	public function getEnabledPlugins() : array
175
+	{
176
+		$retArray=array();
177
+		foreach ($this->pluginsList as $name => $value)
178
+		{
179
+			if ($value['enabled'] == true)
180
+			{
181
+				array_push($retArray,$name);
182
+			}
183
+		}
184
+		return $retArray;
185
+	}
186 186
 
187
-    /** Enable plugin (enabling an enabled plugin is OK, same for disabled).
188
-     *  and save in DB config
189
-     * @param string $pluginName
190
-     * @param bool $enabled true to enable, false to disable
191
-     * @return bool true if OK, or false (error logged)
192
-     */
193
-    public function enablePlugin(string $pluginName,bool $enabled)
194
-    {
195
-        if ($enabled === false)
196
-        {
197
-            // If plugin is defined set to disable
198
-            if ( isset($this->pluginsList[$pluginName]))
199
-            {
200
-                $this->pluginsList[$pluginName]['enabled'] = false;
201
-            }            
202
-            return $this->saveEnabledPlugins();
203
-        }
204
-        // Check if plugin is loaded / exists
205
-        if ( ! isset($this->pluginsList[$pluginName]) || 
206
-                $this->pluginsList[$pluginName]['object'] === null)
207
-        {
208
-            try {
209
-                $this->registerPlugin($pluginName);
210
-            } catch (Exception $e) {
211
-                $this->logClass->log('Cannot enable plugin : ' . $e->getMessage(),WARN);
212
-                return false;
213
-            }
214
-        }
215
-        $this->pluginsList[$pluginName]['enabled'] = true;
216
-        // save in DB and return 
217
-        return $this->saveEnabledPlugins();
218
-    }
187
+	/** Enable plugin (enabling an enabled plugin is OK, same for disabled).
188
+	 *  and save in DB config
189
+	 * @param string $pluginName
190
+	 * @param bool $enabled true to enable, false to disable
191
+	 * @return bool true if OK, or false (error logged)
192
+	 */
193
+	public function enablePlugin(string $pluginName,bool $enabled)
194
+	{
195
+		if ($enabled === false)
196
+		{
197
+			// If plugin is defined set to disable
198
+			if ( isset($this->pluginsList[$pluginName]))
199
+			{
200
+				$this->pluginsList[$pluginName]['enabled'] = false;
201
+			}            
202
+			return $this->saveEnabledPlugins();
203
+		}
204
+		// Check if plugin is loaded / exists
205
+		if ( ! isset($this->pluginsList[$pluginName]) || 
206
+				$this->pluginsList[$pluginName]['object'] === null)
207
+		{
208
+			try {
209
+				$this->registerPlugin($pluginName);
210
+			} catch (Exception $e) {
211
+				$this->logClass->log('Cannot enable plugin : ' . $e->getMessage(),WARN);
212
+				return false;
213
+			}
214
+		}
215
+		$this->pluginsList[$pluginName]['enabled'] = true;
216
+		// save in DB and return 
217
+		return $this->saveEnabledPlugins();
218
+	}
219 219
    
220
-    /**
221
-     * Destroy plugin objects and reload them with new enabled list.
222
-     * TODO : Code this function (ref DAEMON_MODE)
223
-     */
224
-    public function reloadAllPlugins()
225
-    {
226
-        return;
227
-    }
220
+	/**
221
+	 * Destroy plugin objects and reload them with new enabled list.
222
+	 * TODO : Code this function (ref DAEMON_MODE)
223
+	 */
224
+	public function reloadAllPlugins()
225
+	{
226
+		return;
227
+	}
228 228
  
229
-    /** Load plugin by name. Create entry if not in $pluginsList
230
-     * @param string $pluginName Plugin name to load
231
-     * @return bool true if created, false if already loaded
232
-     * @throws Exception on error loading plugin
233
-     */
234
-    public function registerPlugin(string $pluginName)
235
-    {
236
-        if ( ! isset($this->pluginsList[$pluginName]) ) // Plugin isn't enable, create entry
237
-        {
238
-            $pluginListElmt = array();
239
-            $pluginListElmt['object'] = null; // class not loaded
240
-            $pluginListElmt['enabled'] = false;
241
-            $this->pluginsList[$pluginName] = $pluginListElmt;
242
-        }
229
+	/** Load plugin by name. Create entry if not in $pluginsList
230
+	 * @param string $pluginName Plugin name to load
231
+	 * @return bool true if created, false if already loaded
232
+	 * @throws Exception on error loading plugin
233
+	 */
234
+	public function registerPlugin(string $pluginName)
235
+	{
236
+		if ( ! isset($this->pluginsList[$pluginName]) ) // Plugin isn't enable, create entry
237
+		{
238
+			$pluginListElmt = array();
239
+			$pluginListElmt['object'] = null; // class not loaded
240
+			$pluginListElmt['enabled'] = false;
241
+			$this->pluginsList[$pluginName] = $pluginListElmt;
242
+		}
243 243
         
244
-        if ($this->pluginsList[$pluginName]['object'] !== null)
245
-        {
246
-            return false;
247
-        }
248
-        try {
249
-            // Include plugin file
250
-            include_once($this->pluginDir.'/' . $pluginName . '.php');
244
+		if ($this->pluginsList[$pluginName]['object'] !== null)
245
+		{
246
+			return false;
247
+		}
248
+		try {
249
+			// Include plugin file
250
+			include_once($this->pluginDir.'/' . $pluginName . '.php');
251 251
             
252
-            // Create full class name with namespace
253
-            $pluginClassName = __NAMESPACE__ . '\\Plugins\\' . $pluginName;
252
+			// Create full class name with namespace
253
+			$pluginClassName = __NAMESPACE__ . '\\Plugins\\' . $pluginName;
254 254
             
255
-            // Create class
256
-            $newClass = new $pluginClassName();
255
+			// Create class
256
+			$newClass = new $pluginClassName();
257 257
             
258
-            // Set logging
259
-            $newClass->setLoggingClass($this->logClass);
258
+			// Set logging
259
+			$newClass->setLoggingClass($this->logClass);
260 260
             
261
-            // Add in plugin array
262
-            $this->pluginsList[$pluginName]['object']=$newClass;
263
-            $this->pluginsList[$pluginName]['allOID']=$newClass->catchAllTraps;
264
-            $this->pluginsList[$pluginName]['target']=$newClass->processTraps;
261
+			// Add in plugin array
262
+			$this->pluginsList[$pluginName]['object']=$newClass;
263
+			$this->pluginsList[$pluginName]['allOID']=$newClass->catchAllTraps;
264
+			$this->pluginsList[$pluginName]['target']=$newClass->processTraps;
265 265
             
266
-            // Delete old functions
267
-            foreach ($this->functionList as $fname => $fvalue)
268
-            {
269
-                if ($fvalue['plugin'] == $pluginName)
270
-                {
271
-                    unset($this->functionList[$fname]);
272
-                }
273
-            }
274
-            // Add functions
275
-            foreach ($newClass->functions as $fname => $function)
276
-            {
277
-                if (isset($this->functionList[$fname]))
278
-                {
279
-                    if ($this->functionList[$fname]['plugin'] != $pluginName )
280
-                    {
281
-                        throw new Exception('Duplicate function name '.$fname . ' in ' 
282
-                            . $pluginName . ' and ' . $this->functionList[$fname]['plugin']);
283
-                    }
266
+			// Delete old functions
267
+			foreach ($this->functionList as $fname => $fvalue)
268
+			{
269
+				if ($fvalue['plugin'] == $pluginName)
270
+				{
271
+					unset($this->functionList[$fname]);
272
+				}
273
+			}
274
+			// Add functions
275
+			foreach ($newClass->functions as $fname => $function)
276
+			{
277
+				if (isset($this->functionList[$fname]))
278
+				{
279
+					if ($this->functionList[$fname]['plugin'] != $pluginName )
280
+					{
281
+						throw new Exception('Duplicate function name '.$fname . ' in ' 
282
+							. $pluginName . ' and ' . $this->functionList[$fname]['plugin']);
283
+					}
284 284
                     
285
-                }
286
-                else
287
-                {
288
-                    $this->functionList[$fname]=array();
289
-                    $this->functionList[$fname]['plugin'] = $pluginName;
290
-                }
291
-                $this->functionList[$fname]['function']=$function['function'];
292
-            }
293
-            $this->logClass->log('Registered plugin '.$pluginName,DEBUG);
285
+				}
286
+				else
287
+				{
288
+					$this->functionList[$fname]=array();
289
+					$this->functionList[$fname]['plugin'] = $pluginName;
290
+				}
291
+				$this->functionList[$fname]['function']=$function['function'];
292
+			}
293
+			$this->logClass->log('Registered plugin '.$pluginName,DEBUG);
294 294
             
295
-        } catch (Exception $e) {
296
-            unset($this->pluginsList[$pluginName]);
297
-            $errorMessage = "Error registering plugin $pluginName : ".$e->getMessage();
298
-            $this->logClass->log($errorMessage,WARN);
299
-            // Disable the plugin
300
-            $this->enablePlugin($pluginName, false);
301
-            throw new \Exception($errorMessage);
302
-        } catch (Throwable $t) {
303
-            unset($this->pluginsList[$pluginName]);
304
-            $errorMessage = $t->getMessage() . ' in file ' . $t->getFile() . ' line ' . $t->getLine();
305
-            $this->logClass->log($errorMessage,WARN);
306
-            // Disable the plugin
307
-            $this->enablePlugin($pluginName, false);
308
-            throw new \Exception($errorMessage);
309
-        }
310
-        return true;
311
-    }
295
+		} catch (Exception $e) {
296
+			unset($this->pluginsList[$pluginName]);
297
+			$errorMessage = "Error registering plugin $pluginName : ".$e->getMessage();
298
+			$this->logClass->log($errorMessage,WARN);
299
+			// Disable the plugin
300
+			$this->enablePlugin($pluginName, false);
301
+			throw new \Exception($errorMessage);
302
+		} catch (Throwable $t) {
303
+			unset($this->pluginsList[$pluginName]);
304
+			$errorMessage = $t->getMessage() . ' in file ' . $t->getFile() . ' line ' . $t->getLine();
305
+			$this->logClass->log($errorMessage,WARN);
306
+			// Disable the plugin
307
+			$this->enablePlugin($pluginName, false);
308
+			throw new \Exception($errorMessage);
309
+		}
310
+		return true;
311
+	}
312 312
     
313
-    /** Registers all plugins (check=false) or only those with name present in array (check=true)
314
-     * @param bool $checkEnabled Check if plugin is enabled before loading it
315
-     * @return string Errors encountered while registering plugins
316
-     */
317
-    public function registerAllPlugins(bool $checkEnabled=true)
318
-    {
319
-        $retDisplay='';
320
-        // First load enabled plugins
321
-        foreach (array_keys($this->pluginsList) as $pluginName)
322
-        {
323
-            try {
324
-                $this->registerPlugin($pluginName);
325
-            } catch (Exception $e) {
326
-                $retDisplay .= $e->getMessage() . ' / ';
327
-            }
328
-        }
329
-        if ($checkEnabled === false) // Load all php files in plugin dir
330
-        {
331
-            foreach (glob($this->pluginDir."/*.php") as $filename)
332
-            {             
333
-                $pluginName=basename($filename,'.php');
334
-                if (!preg_match('/^[a-zA-Z0-9]+$/',$pluginName))
335
-                {
336
-                    $this->logClass->log("Invalid plugin name : ".$pluginName, WARN);
337
-                    $retDisplay .= "Invalid plugin name : ".$pluginName . " / ";
338
-                    break;
339
-                }
340
-                try { // Already registerd plugin will simply return false
341
-                    $this->registerPlugin($pluginName);               
342
-                } catch (Exception $e) {
343
-                    $retDisplay .= $e->getMessage() . ' / ';
344
-                }
345
-            }
346
-        }
313
+	/** Registers all plugins (check=false) or only those with name present in array (check=true)
314
+	 * @param bool $checkEnabled Check if plugin is enabled before loading it
315
+	 * @return string Errors encountered while registering plugins
316
+	 */
317
+	public function registerAllPlugins(bool $checkEnabled=true)
318
+	{
319
+		$retDisplay='';
320
+		// First load enabled plugins
321
+		foreach (array_keys($this->pluginsList) as $pluginName)
322
+		{
323
+			try {
324
+				$this->registerPlugin($pluginName);
325
+			} catch (Exception $e) {
326
+				$retDisplay .= $e->getMessage() . ' / ';
327
+			}
328
+		}
329
+		if ($checkEnabled === false) // Load all php files in plugin dir
330
+		{
331
+			foreach (glob($this->pluginDir."/*.php") as $filename)
332
+			{             
333
+				$pluginName=basename($filename,'.php');
334
+				if (!preg_match('/^[a-zA-Z0-9]+$/',$pluginName))
335
+				{
336
+					$this->logClass->log("Invalid plugin name : ".$pluginName, WARN);
337
+					$retDisplay .= "Invalid plugin name : ".$pluginName . " / ";
338
+					break;
339
+				}
340
+				try { // Already registerd plugin will simply return false
341
+					$this->registerPlugin($pluginName);               
342
+				} catch (Exception $e) {
343
+					$retDisplay .= $e->getMessage() . ' / ';
344
+				}
345
+			}
346
+		}
347 347
         
348
-        if ($retDisplay == '')
349
-        {
350
-            return 'All plugins loaded OK';
351
-        }
352
-        else
353
-        {
354
-            return $retDisplay;
355
-        }
356
-    }
348
+		if ($retDisplay == '')
349
+		{
350
+			return 'All plugins loaded OK';
351
+		}
352
+		else
353
+		{
354
+			return $retDisplay;
355
+		}
356
+	}
357 357
     
358
-    /**
359
-     * Returns array of name of loaded plugins
360
-     * @return array
361
-     */
362
-    public function pluginList() : array
363
-    {
364
-        return array_keys($this->pluginsList);    
365
-    }
358
+	/**
359
+	 * Returns array of name of loaded plugins
360
+	 * @return array
361
+	 */
362
+	public function pluginList() : array
363
+	{
364
+		return array_keys($this->pluginsList);    
365
+	}
366 366
 
367
-    /**
368
-     * Get plugin details
369
-     * @param string $name name of plugins
370
-     * @return boolean|stdClass result as stdClass or false if plugin not found.
371
-     * @throws \Exception if registering is not possible
372
-     */
373
-    public function pluginDetails(string $name)
374
-    {
375
-        if (!array_key_exists($name, $this->pluginsList))
376
-        {
377
-            return false;
378
-        }
379
-        if ($this->pluginsList[$name]['object'] === null)
380
-        {
381
-            $this->registerPlugin($name); // can throw exception handled by caller
382
-        }
383
-        $retObj = new stdClass();
384
-        $retObj->name           = $name;
385
-        $retObj->catchAllTraps  = $this->pluginsList[$name]['allOID'];
386
-        $retObj->processTraps   = $this->pluginsList[$name]['target'];
387
-        $retObj->description    = $this->pluginsList[$name]['object']->description;
388
-        $functions=array();
389
-        foreach ($this->functionList as $fName => $func)
390
-        {
391
-            if ($func['plugin'] == $name)
392
-            {
393
-                array_push($functions,$fName);
394
-            }
395
-        }
396
-        $retObj->funcArray=$functions;
397
-        return $retObj;
398
-    }
367
+	/**
368
+	 * Get plugin details
369
+	 * @param string $name name of plugins
370
+	 * @return boolean|stdClass result as stdClass or false if plugin not found.
371
+	 * @throws \Exception if registering is not possible
372
+	 */
373
+	public function pluginDetails(string $name)
374
+	{
375
+		if (!array_key_exists($name, $this->pluginsList))
376
+		{
377
+			return false;
378
+		}
379
+		if ($this->pluginsList[$name]['object'] === null)
380
+		{
381
+			$this->registerPlugin($name); // can throw exception handled by caller
382
+		}
383
+		$retObj = new stdClass();
384
+		$retObj->name           = $name;
385
+		$retObj->catchAllTraps  = $this->pluginsList[$name]['allOID'];
386
+		$retObj->processTraps   = $this->pluginsList[$name]['target'];
387
+		$retObj->description    = $this->pluginsList[$name]['object']->description;
388
+		$functions=array();
389
+		foreach ($this->functionList as $fName => $func)
390
+		{
391
+			if ($func['plugin'] == $name)
392
+			{
393
+				array_push($functions,$fName);
394
+			}
395
+		}
396
+		$retObj->funcArray=$functions;
397
+		return $retObj;
398
+	}
399 399
        
400
-    /**
401
-     * Get plugin name from function name
402
-     * @param string $funcName
403
-     * @param string $pluginName
404
-     * @return boolean returns plugin object of false;
405
-     */
406
-    public function getFunction($funcName,&$pluginName)
407
-    {
408
-        if (! isset($this->functionList[$funcName]) )
409
-        {
410
-            return false;
411
-        }
412
-        $pluginName = $this->functionList[$funcName]['plugin'];
413
-        return true;
414
-    }
400
+	/**
401
+	 * Get plugin name from function name
402
+	 * @param string $funcName
403
+	 * @param string $pluginName
404
+	 * @return boolean returns plugin object of false;
405
+	 */
406
+	public function getFunction($funcName,&$pluginName)
407
+	{
408
+		if (! isset($this->functionList[$funcName]) )
409
+		{
410
+			return false;
411
+		}
412
+		$pluginName = $this->functionList[$funcName]['plugin'];
413
+		return true;
414
+	}
415 415
     
416
-    /**
417
-     * Get functions params and description
418
-     * @param string $funcName
419
-     * @return boolean|stdClass false if not found or object (name,params,description)
420
-     * @throws \Exception if registering is not possible
421
-     */
422
-    public function getFunctionDetails($funcName)
423
-    {
424
-        if (! isset($this->functionList[$funcName]) )
425
-        {
426
-            return false;
427
-        }
428
-        $pluginName = $this->functionList[$funcName]['plugin']; // plugin name
429
-        $plugin = $this->pluginsList[$pluginName]['object']; // plugin object
430
-        if ($plugin === null)
431
-        {
432
-            $this->registerPlugin($pluginName); // can throw exception handled by caller
433
-        }
434
-        $retObj = new stdClass();
435
-        $retObj->name           = $funcName;
436
-        $retObj->plugin         = $pluginName;
437
-        $retObj->params         = $plugin->functions[$funcName]['params'];
438
-        $retObj->description    = $plugin->functions[$funcName]['description'];
439
-        return $retObj;
440
-    }
416
+	/**
417
+	 * Get functions params and description
418
+	 * @param string $funcName
419
+	 * @return boolean|stdClass false if not found or object (name,params,description)
420
+	 * @throws \Exception if registering is not possible
421
+	 */
422
+	public function getFunctionDetails($funcName)
423
+	{
424
+		if (! isset($this->functionList[$funcName]) )
425
+		{
426
+			return false;
427
+		}
428
+		$pluginName = $this->functionList[$funcName]['plugin']; // plugin name
429
+		$plugin = $this->pluginsList[$pluginName]['object']; // plugin object
430
+		if ($plugin === null)
431
+		{
432
+			$this->registerPlugin($pluginName); // can throw exception handled by caller
433
+		}
434
+		$retObj = new stdClass();
435
+		$retObj->name           = $funcName;
436
+		$retObj->plugin         = $pluginName;
437
+		$retObj->params         = $plugin->functions[$funcName]['params'];
438
+		$retObj->description    = $plugin->functions[$funcName]['description'];
439
+		return $retObj;
440
+	}
441 441
     
442
-    /**
443
-     * Evaluate function with parameters
444
-     * @param string $funcName
445
-     * @param mixed $params
446
-     * @throws Exception
447
-     * @return bool
448
-     */
449
-    public function getFunctionEval(string $funcName,$params) : bool
450
-    {
451
-        if (! isset($this->functionList[$funcName]) )
452
-        {
453
-            throw new Exception($funcName . ' not found.');
454
-        }
455
-        $pluginName = $this->functionList[$funcName]['plugin']; // plugin name
456
-        $plugin = $this->pluginsList[$pluginName]['object']; // plugin object
442
+	/**
443
+	 * Evaluate function with parameters
444
+	 * @param string $funcName
445
+	 * @param mixed $params
446
+	 * @throws Exception
447
+	 * @return bool
448
+	 */
449
+	public function getFunctionEval(string $funcName,$params) : bool
450
+	{
451
+		if (! isset($this->functionList[$funcName]) )
452
+		{
453
+			throw new Exception($funcName . ' not found.');
454
+		}
455
+		$pluginName = $this->functionList[$funcName]['plugin']; // plugin name
456
+		$plugin = $this->pluginsList[$pluginName]['object']; // plugin object
457 457
 
458
-        if ($plugin === null)
459
-        {
460
-            $this->registerPlugin($pluginName); // can throw exception handled by caller
461
-            $plugin = $this->pluginsList[$pluginName]['object'];
462
-        }
458
+		if ($plugin === null)
459
+		{
460
+			$this->registerPlugin($pluginName); // can throw exception handled by caller
461
+			$plugin = $this->pluginsList[$pluginName]['object'];
462
+		}
463 463
         
464
-        $propertyName = $this->functionList[$funcName]['function'];
465
-        $this->logClass->log('Using property '. $propertyName . ' of class : '.$pluginName,DEBUG);
464
+		$propertyName = $this->functionList[$funcName]['function'];
465
+		$this->logClass->log('Using property '. $propertyName . ' of class : '.$pluginName,DEBUG);
466 466
         
467
-        return $plugin->{$propertyName}($params);        
468
-    }
467
+		return $plugin->{$propertyName}($params);        
468
+	}
469 469
     
470
-    public function evaluateFunctionString(string $functionString) : bool
471
-    {
472
-        $matches=array();
473
-        // Cleanup spaces
474
-        //$functionString = $this->trapClass->ruleClass->eval_cleanup($functionString);
475
-        //$this->logClass->log('eval cleanup : '.$functionString,DEBUG);
470
+	public function evaluateFunctionString(string $functionString) : bool
471
+	{
472
+		$matches=array();
473
+		// Cleanup spaces
474
+		//$functionString = $this->trapClass->ruleClass->eval_cleanup($functionString);
475
+		//$this->logClass->log('eval cleanup : '.$functionString,DEBUG);
476 476
         
477
-        // Match function call
478
-        $num=preg_match('/^__([a-zA-Z0-9]+)\((.+)\)$/', $functionString , $matches);
479
-        if ($num !=1)
480
-        {
481
-            throw new \ErrorException('Function syntax error : ' . $functionString );
482
-        }
483
-        $this->logClass->log('Got function : '. $matches[1] . ', params : '.$matches[2],DEBUG);
484
-        $funcName=$matches[1];
477
+		// Match function call
478
+		$num=preg_match('/^__([a-zA-Z0-9]+)\((.+)\)$/', $functionString , $matches);
479
+		if ($num !=1)
480
+		{
481
+			throw new \ErrorException('Function syntax error : ' . $functionString );
482
+		}
483
+		$this->logClass->log('Got function : '. $matches[1] . ', params : '.$matches[2],DEBUG);
484
+		$funcName=$matches[1];
485 485
         
486
-        // Get parameters comma separated
487
-        $funcParams=str_getcsv($matches[2],',','"',"\\");
488
-        $this->logClass->log('Function params : ' . print_r($funcParams,true),DEBUG);
486
+		// Get parameters comma separated
487
+		$funcParams=str_getcsv($matches[2],',','"',"\\");
488
+		$this->logClass->log('Function params : ' . print_r($funcParams,true),DEBUG);
489 489
         
490
-        // return evaluation
491
-        return $this->getFunctionEval($funcName, $funcParams);        
490
+		// return evaluation
491
+		return $this->getFunctionEval($funcName, $funcParams);        
492 492
         
493
-    }
493
+	}
494 494
     
495 495
 }
496 496
 
497 497
 abstract class PluginTemplate
498 498
 {
499 499
     
500
-    /** @var Logging $loggingClass */
501
-    private $loggingClass;
500
+	/** @var Logging $loggingClass */
501
+	private $loggingClass;
502 502
     
503
-    /** @var string $name Name of plugin */
504
-    public $name;
503
+	/** @var string $name Name of plugin */
504
+	public $name;
505 505
     
506
-    /** @var string $description Description of plugin */
507
-    public $description='Default plugin description';
506
+	/** @var string $description Description of plugin */
507
+	public $description='Default plugin description';
508 508
     
509
-    /** @var array[string] $functions Functions of this plugin for rule eval*/
510
-    public $functions=array();
509
+	/** @var array[string] $functions Functions of this plugin for rule eval*/
510
+	public $functions=array();
511 511
     
512
-    /** @var boolean $catchAllTraps Set to true if all traps will be sent to the plugin */
513
-    public $catchAllTraps=false;
512
+	/** @var boolean $catchAllTraps Set to true if all traps will be sent to the plugin */
513
+	public $catchAllTraps=false;
514 514
     
515
-    /** @var boolean $processTraps Set to true if plugins can handle traps */
516
-    public $processTraps=false;
515
+	/** @var boolean $processTraps Set to true if plugins can handle traps */
516
+	public $processTraps=false;
517 517
     
518
-    /**
519
-     * @param \Trapdirector\Logging $loggingClass
520
-     */
521
-    public function setLoggingClass($loggingClass)
522
-    {
523
-        $this->loggingClass = $loggingClass;
524
-    }
518
+	/**
519
+	 * @param \Trapdirector\Logging $loggingClass
520
+	 */
521
+	public function setLoggingClass($loggingClass)
522
+	{
523
+		$this->loggingClass = $loggingClass;
524
+	}
525 525
     
526
-    /**
527
-     * 
528
-     * @param string $message
529
-     * @param int $level DEBUG/INFO/WARN/CRIT
530
-     */
531
-    public function log($message,$level)
532
-    {
533
-        $this->loggingClass->log('[ '.get_class($this).'] '. $message, $level);
534
-    }
526
+	/**
527
+	 * 
528
+	 * @param string $message
529
+	 * @param int $level DEBUG/INFO/WARN/CRIT
530
+	 */
531
+	public function log($message,$level)
532
+	{
533
+		$this->loggingClass->log('[ '.get_class($this).'] '. $message, $level);
534
+	}
535 535
 }
536 536
\ No newline at end of file
Please login to merge, or discard this patch.
library/Trapdirector/TrapsProcess/Rule.php 1 patch
Indentation   +331 added lines, -331 removed lines patch added patch discarded remove patch
@@ -7,382 +7,382 @@
 block discarded – undo
7 7
 class Rule
8 8
 {
9 9
     
10
-    /** @var Logging $logging logging class*/
11
-    protected $logging;
10
+	/** @var Logging $logging logging class*/
11
+	protected $logging;
12 12
     
13
-    /** @var Trap $trapClass */
14
-    protected $trapClass;
13
+	/** @var Trap $trapClass */
14
+	protected $trapClass;
15 15
     
16
-    /**
17
-     * Setup Rule Class
18
-     * @param Trap $trapClass : To get logging class & plugin class
19
-     */
20
-    function __construct($trapClass)
21
-    {
22
-        $this->trapClass=$trapClass;
23
-        $this->logging=$trapClass->logging;
24
-    }
16
+	/**
17
+	 * Setup Rule Class
18
+	 * @param Trap $trapClass : To get logging class & plugin class
19
+	 */
20
+	function __construct($trapClass)
21
+	{
22
+		$this->trapClass=$trapClass;
23
+		$this->logging=$trapClass->logging;
24
+	}
25 25
 
26 26
 /**
27 27
  * Get full number 
28 28
  * @return array<number,string>
29 29
  */
30
-    private function get_number($rule,&$item)
31
-    {
32
-        $item2=$item+1;
33
-        while (
34
-            ($item2!=strlen($rule)) 
35
-            && (preg_match('/[\-0-9\.]/',$rule[$item2]))) 
36
-        { 
37
-            $item2++ ;
38
-        }
39
-        $val=substr($rule,$item,$item2-$item);
40
-        $item=$item2;
41
-        //echo "number ".$val."\n";
30
+	private function get_number($rule,&$item)
31
+	{
32
+		$item2=$item+1;
33
+		while (
34
+			($item2!=strlen($rule)) 
35
+			&& (preg_match('/[\-0-9\.]/',$rule[$item2]))) 
36
+		{ 
37
+			$item2++ ;
38
+		}
39
+		$val=substr($rule,$item,$item2-$item);
40
+		$item=$item2;
41
+		//echo "number ".$val."\n";
42 42
         
43
-        return array(0,$val);
44
-    }
43
+		return array(0,$val);
44
+	}
45 45
 
46
-    private function get_string($rule,&$item)
47
-    {
48
-        $item++;
49
-        $item2=$this->eval_getNext($rule,$item,'"');
50
-        $val=substr($rule,$item,$item2-$item-1);
51
-        $item=$item2;
52
-        //echo "string : ".$val."\n";
53
-        return array(1,$val);
46
+	private function get_string($rule,&$item)
47
+	{
48
+		$item++;
49
+		$item2=$this->eval_getNext($rule,$item,'"');
50
+		$val=substr($rule,$item,$item2-$item-1);
51
+		$item=$item2;
52
+		//echo "string : ".$val."\n";
53
+		return array(1,$val);
54 54
         
55
-    }
55
+	}
56 56
     
57
-    /**
58
-     * Parse elements inside () : jumps over "" and count parenthesis.
59
-     * Ex : ( "test" != ")test" & (1==2) ) will return "test" != ")test" & (1==2)
60
-     * @param string $rule : the current rule
61
-     * @param int $item : actual position in rule
62
-     * @throws Exception
63
-     * @return string : everything inside parenthesis
64
-     */
65
-    private function parse_parenthesis(string $rule,int &$item) : string
66
-    {
67
-        $item++;
68
-        $start=$item;
69
-        $parenthesis_count=0;
70
-        while (($item < strlen($rule)) // Not end of string AND
71
-            && ( ($rule[$item] != ')' ) || $parenthesis_count > 0) ) // Closing ')' or embeded ()
72
-        {
73
-            if ($rule[$item] == '"' )
74
-            { // pass through string
75
-                $item++;
76
-                $item=$this->eval_getNext($rule,$item,'"');
77
-            }
78
-            else{
79
-                if ($rule[$item] == '(')
80
-                {
81
-                    $parenthesis_count++;
82
-                }
83
-                if ($rule[$item] == ')')
84
-                {
85
-                    $parenthesis_count--;
86
-                }
87
-                $item++;
88
-            }
89
-        }
57
+	/**
58
+	 * Parse elements inside () : jumps over "" and count parenthesis.
59
+	 * Ex : ( "test" != ")test" & (1==2) ) will return "test" != ")test" & (1==2)
60
+	 * @param string $rule : the current rule
61
+	 * @param int $item : actual position in rule
62
+	 * @throws Exception
63
+	 * @return string : everything inside parenthesis
64
+	 */
65
+	private function parse_parenthesis(string $rule,int &$item) : string
66
+	{
67
+		$item++;
68
+		$start=$item;
69
+		$parenthesis_count=0;
70
+		while (($item < strlen($rule)) // Not end of string AND
71
+			&& ( ($rule[$item] != ')' ) || $parenthesis_count > 0) ) // Closing ')' or embeded ()
72
+		{
73
+			if ($rule[$item] == '"' )
74
+			{ // pass through string
75
+				$item++;
76
+				$item=$this->eval_getNext($rule,$item,'"');
77
+			}
78
+			else{
79
+				if ($rule[$item] == '(')
80
+				{
81
+					$parenthesis_count++;
82
+				}
83
+				if ($rule[$item] == ')')
84
+				{
85
+					$parenthesis_count--;
86
+				}
87
+				$item++;
88
+			}
89
+		}
90 90
         
91
-        if ($item==strlen($rule)) {throw new Exception("no closing () in ".$rule ." at " .$item);}
92
-        $val=substr($rule,$start,$item-$start);
93
-        $item++;
94
-        return $val;
95
-    }
91
+		if ($item==strlen($rule)) {throw new Exception("no closing () in ".$rule ." at " .$item);}
92
+		$val=substr($rule,$start,$item-$start);
93
+		$item++;
94
+		return $val;
95
+	}
96 96
 
97 97
     
98
-    /**
99
-     * Get and eval a grouped condition - ex : (1==1)
100
-     * @param string $rule
101
-     * @param int $item
102
-     * @return array
103
-     */
104
-    private function get_group(string $rule,int &$item) : array
105
-    {
106
-        // gets eveything inside parenthesis
107
-        $val=$this->parse_parenthesis($rule, $item);
108
-        // Returns boolean with evaluation of all inside parenthesis
109
-        $start=0;
110
-        return array(2,$this->evaluation($val,$start));
111
-    }
98
+	/**
99
+	 * Get and eval a grouped condition - ex : (1==1)
100
+	 * @param string $rule
101
+	 * @param int $item
102
+	 * @return array
103
+	 */
104
+	private function get_group(string $rule,int &$item) : array
105
+	{
106
+		// gets eveything inside parenthesis
107
+		$val=$this->parse_parenthesis($rule, $item);
108
+		// Returns boolean with evaluation of all inside parenthesis
109
+		$start=0;
110
+		return array(2,$this->evaluation($val,$start));
111
+	}
112 112
 
113
-    private function get_function(string $rule,int &$item) : array
114
-    {
115
-        // function is : __function(param1,param2...)
116
-        $start=$item; 
117
-        while (($item < strlen($rule)) && ($rule[$item] != '(' )) // Not end of string AND not opening '('
118
-        {
119
-            $item++;
120
-        }        
121
-        if ($item==strlen($rule)) {throw new Exception("no opening () for function in ".$rule ." at " .$item);}
113
+	private function get_function(string $rule,int &$item) : array
114
+	{
115
+		// function is : __function(param1,param2...)
116
+		$start=$item; 
117
+		while (($item < strlen($rule)) && ($rule[$item] != '(' )) // Not end of string AND not opening '('
118
+		{
119
+			$item++;
120
+		}        
121
+		if ($item==strlen($rule)) {throw new Exception("no opening () for function in ".$rule ." at " .$item);}
122 122
         
123
-        // get parameters between parenthesis
123
+		// get parameters between parenthesis
124 124
         
125
-        $this->parse_parenthesis($rule, $item);
125
+		$this->parse_parenthesis($rule, $item);
126 126
         
127
-        $val=substr($rule,$start,$item-$start);
127
+		$val=substr($rule,$start,$item-$start);
128 128
         
129
-        $this->logging->log('got function ' . $val,DEBUG);
129
+		$this->logging->log('got function ' . $val,DEBUG);
130 130
         
131
-        return array(2,$this->trapClass->pluginClass->evaluateFunctionString($val));
131
+		return array(2,$this->trapClass->pluginClass->evaluateFunctionString($val));
132 132
         
133
-    }
133
+	}
134 134
     
135
-    protected function eval_getElement($rule,&$item)
136
-    {
137
-        if ($item >= strlen($rule))
138
-        {
139
-            throw new Exception("Early end of string ".$rule ." at " .$item );
140
-        }
141
-        while ($rule[$item]==' ') $item++;
142
-        if (preg_match('/[\-0-9\.]/',$rule[$item]))
143
-        { // number
144
-            return $this->get_number($rule, $item);
145
-        }
146
-        if ($rule[$item] == '"')
147
-        { // string
148
-            return $this->get_string($rule, $item);
149
-        }
135
+	protected function eval_getElement($rule,&$item)
136
+	{
137
+		if ($item >= strlen($rule))
138
+		{
139
+			throw new Exception("Early end of string ".$rule ." at " .$item );
140
+		}
141
+		while ($rule[$item]==' ') $item++;
142
+		if (preg_match('/[\-0-9\.]/',$rule[$item]))
143
+		{ // number
144
+			return $this->get_number($rule, $item);
145
+		}
146
+		if ($rule[$item] == '"')
147
+		{ // string
148
+			return $this->get_string($rule, $item);
149
+		}
150 150
         
151
-        if ($rule[$item] == '(')
152
-        { // grouping
153
-            return $this->get_group($rule, $item);
154
-        }
155
-        if ($rule[$item] == '_')
156
-        { // function
157
-            return $this->get_function($rule, $item);
158
-        }
159
-        throw new Exception("number/string not found in ".$rule ." at " .$item . ' : ' .$rule[$item]);
151
+		if ($rule[$item] == '(')
152
+		{ // grouping
153
+			return $this->get_group($rule, $item);
154
+		}
155
+		if ($rule[$item] == '_')
156
+		{ // function
157
+			return $this->get_function($rule, $item);
158
+		}
159
+		throw new Exception("number/string not found in ".$rule ." at " .$item . ' : ' .$rule[$item]);
160 160
         
161
-    }
161
+	}
162 162
     
163
-    protected function eval_getNext($rule,$item,$tok)
164
-    {
165
-        while (
166
-            ($rule[$item] != $tok ) 
167
-            && ($item < strlen($rule))) 
168
-        { 
169
-            $item++;
170
-        }
171
-        if ($item==strlen($rule)) {
172
-            throw new Exception("closing '".$tok."' not found in ".$rule ." at " .$item);
173
-        }
174
-        return $item+1;
175
-    }
163
+	protected function eval_getNext($rule,$item,$tok)
164
+	{
165
+		while (
166
+			($rule[$item] != $tok ) 
167
+			&& ($item < strlen($rule))) 
168
+		{ 
169
+			$item++;
170
+		}
171
+		if ($item==strlen($rule)) {
172
+			throw new Exception("closing '".$tok."' not found in ".$rule ." at " .$item);
173
+		}
174
+		return $item+1;
175
+	}
176 176
     
177
-    protected function eval_getOper($rule,&$item)
178
-    {
179
-        while ($rule[$item]==' ') $item++;
180
-        switch ($rule[$item])
181
-        {
182
-            case '<':
183
-                if ($rule[$item+1]=='=') { $item+=2; return array(0,"<=");}
184
-                $item++; return array(0,"<");
185
-            case '>':
186
-                if ($rule[$item+1]=='=') { $item+=2; return array(0,">=");}
187
-                $item++; return array(0,">");
188
-            case '=':
189
-                $item++; return array(0,"=");
190
-            case '!':
191
-                if ($rule[$item+1]=='=') { $item+=2; return array(0,"!=");}
192
-                throw new Exception("Erreur in expr - incorrect operator '!'  found in ".$rule ." at " .$item);
193
-            case '~':
194
-                $item++; return array(0,"~");
195
-            case '|':
196
-                $item++; return array(1,"|");
197
-            case '&':
198
-                $item++; return array(1,"&");
199
-            default	:
200
-                throw new Exception("Erreur in expr - operator not found in ".$rule ." at " .$item);
201
-        }
202
-    }
177
+	protected function eval_getOper($rule,&$item)
178
+	{
179
+		while ($rule[$item]==' ') $item++;
180
+		switch ($rule[$item])
181
+		{
182
+			case '<':
183
+				if ($rule[$item+1]=='=') { $item+=2; return array(0,"<=");}
184
+				$item++; return array(0,"<");
185
+			case '>':
186
+				if ($rule[$item+1]=='=') { $item+=2; return array(0,">=");}
187
+				$item++; return array(0,">");
188
+			case '=':
189
+				$item++; return array(0,"=");
190
+			case '!':
191
+				if ($rule[$item+1]=='=') { $item+=2; return array(0,"!=");}
192
+				throw new Exception("Erreur in expr - incorrect operator '!'  found in ".$rule ." at " .$item);
193
+			case '~':
194
+				$item++; return array(0,"~");
195
+			case '|':
196
+				$item++; return array(1,"|");
197
+			case '&':
198
+				$item++; return array(1,"&");
199
+			default	:
200
+				throw new Exception("Erreur in expr - operator not found in ".$rule ." at " .$item);
201
+		}
202
+	}
203 203
     
204
-    private function check_negate_first($rule,&$item)
205
-    {
206
-        if ( $rule[$item] == '!') // If '!' found, negate next expression.
207
-        {
208
-            $item++;
209
-            return true;
210
-        }
211
-        else
212
-        {
213
-            return false;
214
-        }
215
-    }
204
+	private function check_negate_first($rule,&$item)
205
+	{
206
+		if ( $rule[$item] == '!') // If '!' found, negate next expression.
207
+		{
208
+			$item++;
209
+			return true;
210
+		}
211
+		else
212
+		{
213
+			return false;
214
+		}
215
+	}
216 216
 
217
-    private function do_compare($val1,$val2,$comp,$negate)
218
-    {
219
-        switch ($comp){
220
-            case '<':	$retVal= ($val1 < $val2); break;
221
-            case '<=':	$retVal= ($val1 <= $val2); break;
222
-            case '>':	$retVal= ($val1 > $val2); break;
223
-            case '>=':	$retVal= ($val1 >= $val2); break;
224
-            case '=':	$retVal= ($val1 == $val2); break;
225
-            case '!=':	$retVal= ($val1 != $val2); break;
226
-            case '~':	$retVal= (preg_match('/'.preg_replace('/"/','',$val2).'/',$val1)); break;
227
-            case '|':	$retVal= ($val1 || $val2); break;
228
-            case '&':	$retVal= ($val1 && $val2); break;
229
-            default:  throw new Exception("Error in expression - unknown comp : ".$comp);
230
-        }
231
-        if ($negate === true) $retVal = ! $retVal; // Inverse result if negate before expression
217
+	private function do_compare($val1,$val2,$comp,$negate)
218
+	{
219
+		switch ($comp){
220
+			case '<':	$retVal= ($val1 < $val2); break;
221
+			case '<=':	$retVal= ($val1 <= $val2); break;
222
+			case '>':	$retVal= ($val1 > $val2); break;
223
+			case '>=':	$retVal= ($val1 >= $val2); break;
224
+			case '=':	$retVal= ($val1 == $val2); break;
225
+			case '!=':	$retVal= ($val1 != $val2); break;
226
+			case '~':	$retVal= (preg_match('/'.preg_replace('/"/','',$val2).'/',$val1)); break;
227
+			case '|':	$retVal= ($val1 || $val2); break;
228
+			case '&':	$retVal= ($val1 && $val2); break;
229
+			default:  throw new Exception("Error in expression - unknown comp : ".$comp);
230
+		}
231
+		if ($negate === true) $retVal = ! $retVal; // Inverse result if negate before expression
232 232
         
233
-        return $retVal;
234
-    }
233
+		return $retVal;
234
+	}
235 235
     
236
-    /** Evaluation : makes token and evaluate.
237
-     *	Public function for expressions testing
238
-     *	accepts : < > = <= >= !=  (typec = 0)
239
-     *	operators : & | (typec=1)
240
-     *	with : integers/float  (type 0) or strings "" (type 1) or results (type 2)
241
-     *   comparison int vs strings will return null (error)
242
-     *	return : bool or null on error
243
-     */
244
-    public function evaluation($rule,&$item)
245
-    {
246
-        //echo "Evaluation of ".substr($rule,$item)."\n";
247
-        $negate=$this->check_negate_first($rule, $item);
248
-        // First element : number, string or ()
249
-        list($type1,$val1) = $this->eval_getElement($rule,$item);
250
-        //echo "Elmt1: ".$val1."/".$type1." : ".substr($rule,$item)."\n";
236
+	/** Evaluation : makes token and evaluate.
237
+	 *	Public function for expressions testing
238
+	 *	accepts : < > = <= >= !=  (typec = 0)
239
+	 *	operators : & | (typec=1)
240
+	 *	with : integers/float  (type 0) or strings "" (type 1) or results (type 2)
241
+	 *   comparison int vs strings will return null (error)
242
+	 *	return : bool or null on error
243
+	 */
244
+	public function evaluation($rule,&$item)
245
+	{
246
+		//echo "Evaluation of ".substr($rule,$item)."\n";
247
+		$negate=$this->check_negate_first($rule, $item);
248
+		// First element : number, string or ()
249
+		list($type1,$val1) = $this->eval_getElement($rule,$item);
250
+		//echo "Elmt1: ".$val1."/".$type1." : ".substr($rule,$item)."\n";
251 251
         
252
-        if ($item==strlen($rule)) // If only element, return value, but only boolean
253
-        {
254
-            if ($type1 != 2) throw new Exception("Cannot use num/string as boolean : ".$rule);
255
-            if ($negate === true) $val1= ! $val1;
256
-            return $val1;
257
-        }
252
+		if ($item==strlen($rule)) // If only element, return value, but only boolean
253
+		{
254
+			if ($type1 != 2) throw new Exception("Cannot use num/string as boolean : ".$rule);
255
+			if ($negate === true) $val1= ! $val1;
256
+			return $val1;
257
+		}
258 258
         
259
-        // Second element : operator
260
-        list($typec,$comp) = $this->eval_getOper($rule,$item);
261
-        //echo "Comp : ".$comp." : ".substr($rule,$item)."\n";
259
+		// Second element : operator
260
+		list($typec,$comp) = $this->eval_getOper($rule,$item);
261
+		//echo "Comp : ".$comp." : ".substr($rule,$item)."\n";
262 262
         
263
-        // Third element : number, string or ()
264
-        if ( $rule[$item] == '!') // starts with a ! so evaluate whats next
265
-        {
266
-            $item++;
267
-            if ($typec != 1) throw new Exception("Mixing boolean and comparison : ".$rule);
268
-            $val2= ! $this->evaluation($rule,$item);
269
-            $type2=2; // result is a boolean
270
-        }
271
-        else
272
-        {
273
-            list($type2,$val2) = $this->eval_getElement($rule,$item);
274
-        }
275
-        //echo "Elmt2: ".$val2."/".$type2." : ".substr($rule,$item)."\n";
263
+		// Third element : number, string or ()
264
+		if ( $rule[$item] == '!') // starts with a ! so evaluate whats next
265
+		{
266
+			$item++;
267
+			if ($typec != 1) throw new Exception("Mixing boolean and comparison : ".$rule);
268
+			$val2= ! $this->evaluation($rule,$item);
269
+			$type2=2; // result is a boolean
270
+		}
271
+		else
272
+		{
273
+			list($type2,$val2) = $this->eval_getElement($rule,$item);
274
+		}
275
+		//echo "Elmt2: ".$val2."/".$type2." : ".substr($rule,$item)."\n";
276 276
         
277
-        if ($type1!=$type2)  // cannot compare different types
278
-        {
279
-            throw new Exception("Cannot compare string & number : ".$rule);
280
-        }
281
-        if ($typec==1 && $type1 !=2) // cannot use & or | with string/number
282
-        {
283
-            throw new Exception("Cannot use boolean operators with string & number : ".$rule);
284
-        }
277
+		if ($type1!=$type2)  // cannot compare different types
278
+		{
279
+			throw new Exception("Cannot compare string & number : ".$rule);
280
+		}
281
+		if ($typec==1 && $type1 !=2) // cannot use & or | with string/number
282
+		{
283
+			throw new Exception("Cannot use boolean operators with string & number : ".$rule);
284
+		}
285 285
         
286
-        $retVal = $this->do_compare($val1, $val2, $comp, $negate);
286
+		$retVal = $this->do_compare($val1, $val2, $comp, $negate);
287 287
         
288
-        if ($item==strlen($rule)) return $retVal; // End of string : return evaluation
289
-        // check for logical operator :
290
-        switch ($rule[$item])
291
-        {
292
-            case '|':	$item++; return ($retVal || $this->evaluation($rule,$item) );
293
-            case '&':	$item++; return ($retVal && $this->evaluation($rule,$item) );
288
+		if ($item==strlen($rule)) return $retVal; // End of string : return evaluation
289
+		// check for logical operator :
290
+		switch ($rule[$item])
291
+		{
292
+			case '|':	$item++; return ($retVal || $this->evaluation($rule,$item) );
293
+			case '&':	$item++; return ($retVal && $this->evaluation($rule,$item) );
294 294
             
295
-            default:  throw new Exception("Erreur in expr - garbadge at end of expression : ".$rule[$item]);
296
-        }
297
-    }
295
+			default:  throw new Exception("Erreur in expr - garbadge at end of expression : ".$rule[$item]);
296
+		}
297
+	}
298 298
     
299
-    // Remove all whitespaces (when not quoted)
300
-    public function eval_cleanup($rule)
301
-    {
302
-        $item=0;
303
-        $rule2='';
304
-        while ($item < strlen($rule))
305
-        {
306
-            if ($rule[$item]==' ') { $item++; continue; }
307
-            if ($rule[$item]=='"')
308
-            {
309
-                $rule2.=$rule[$item];
310
-                $item++;
311
-                while (($item < strlen($rule)) && ($rule[$item]!='"') )
312
-                {
313
-                    $rule2.=$rule[$item];
314
-                    $item++;
315
-                }
316
-                if ($item == strlen ($rule)) throw new Exception("closing '\"' not found in ".$rule ." at " .$item);
317
-                $rule2.=$rule[$item];
318
-                $item++;
319
-                continue;
320
-            }
299
+	// Remove all whitespaces (when not quoted)
300
+	public function eval_cleanup($rule)
301
+	{
302
+		$item=0;
303
+		$rule2='';
304
+		while ($item < strlen($rule))
305
+		{
306
+			if ($rule[$item]==' ') { $item++; continue; }
307
+			if ($rule[$item]=='"')
308
+			{
309
+				$rule2.=$rule[$item];
310
+				$item++;
311
+				while (($item < strlen($rule)) && ($rule[$item]!='"') )
312
+				{
313
+					$rule2.=$rule[$item];
314
+					$item++;
315
+				}
316
+				if ($item == strlen ($rule)) throw new Exception("closing '\"' not found in ".$rule ." at " .$item);
317
+				$rule2.=$rule[$item];
318
+				$item++;
319
+				continue;
320
+			}
321 321
             
322
-            $rule2.=$rule[$item];
323
-            $item++;
324
-        }
322
+			$rule2.=$rule[$item];
323
+			$item++;
324
+		}
325 325
         
326
-        return $rule2;
327
-    }
326
+		return $rule2;
327
+	}
328 328
     
329
-    /** Evaluation rule (uses eval_* functions recursively)
330
-     *	@param string $rule : rule ( _OID(.1.3.6.1.4.1.8072.2.3.2.1)=_OID(.1.3.6.1.2.1.1.3.0) )
331
-     *  @param array $oidList : OIDs values to sustitute.
332
-     *	@return bool : true : rule match, false : rule don't match , throw exception on error.
333
-     */
329
+	/** Evaluation rule (uses eval_* functions recursively)
330
+	 *	@param string $rule : rule ( _OID(.1.3.6.1.4.1.8072.2.3.2.1)=_OID(.1.3.6.1.2.1.1.3.0) )
331
+	 *  @param array $oidList : OIDs values to sustitute.
332
+	 *	@return bool : true : rule match, false : rule don't match , throw exception on error.
333
+	 */
334 334
     
335
-    public function eval_rule($rule,$oidList)
336
-    {
337
-        if ($rule==null || $rule == '') // Empty rule is always true
338
-        {
339
-            return true;
340
-        }
341
-        $matches=array();
342
-        while (preg_match('/_OID\(([0-9\.\*]+)\)/',$rule,$matches) == 1)
343
-        {
344
-            $oid=$matches[1];
345
-            $found=0;
346
-            // ** replaced by .*
347
-            $oidR=preg_replace('/\*\*/', '.*', $oid);
348
-            // * replaced by [0-9]+ 
349
-            $oidR=preg_replace('/\*/', '[0-9]+', $oidR);
335
+	public function eval_rule($rule,$oidList)
336
+	{
337
+		if ($rule==null || $rule == '') // Empty rule is always true
338
+		{
339
+			return true;
340
+		}
341
+		$matches=array();
342
+		while (preg_match('/_OID\(([0-9\.\*]+)\)/',$rule,$matches) == 1)
343
+		{
344
+			$oid=$matches[1];
345
+			$found=0;
346
+			// ** replaced by .*
347
+			$oidR=preg_replace('/\*\*/', '.*', $oid);
348
+			// * replaced by [0-9]+ 
349
+			$oidR=preg_replace('/\*/', '[0-9]+', $oidR);
350 350
             
351
-            // replace * with \* in oid for preg_replace
352
-            $oid=preg_replace('/\*/', '\*', $oid);
351
+			// replace * with \* in oid for preg_replace
352
+			$oid=preg_replace('/\*/', '\*', $oid);
353 353
             
354
-            $this->logging->log('OID in rule : '.$oid.' / '.$oidR,DEBUG );
354
+			$this->logging->log('OID in rule : '.$oid.' / '.$oidR,DEBUG );
355 355
             
356
-            foreach($oidList as $val)
357
-            {
358
-                if (preg_match("/^$oidR$/",$val->oid) == 1)
359
-                {
360
-                    if (!preg_match('/^-?[0-9]*\.?[0-9]+$/',$val->value))
361
-                    { // If not a number, change " to ' and put " around it
362
-                        $val->value=preg_replace('/"/',"'",$val->value);
363
-                        $val->value='"'.$val->value.'"';
364
-                    }
365
-                    $rep=0;
366
-                    $rule=preg_replace('/_OID\('.$oid.'\)/',$val->value,$rule,-1,$rep);
367
-                    if ($rep==0)
368
-                    {
369
-                        $this->logging->log("Error in rule_eval",WARN,'');
370
-                        return false;
371
-                    }
372
-                    $found=1;
373
-                    break;
374
-                }
375
-            }
376
-            if ($found==0)
377
-            {	// OID not found : throw error
378
-                throw new Exception('OID '.$oid.' not found in trap');
379
-            }
380
-        }
381
-        $item=0;
382
-        $rule=$this->eval_cleanup($rule);
383
-        $this->logging->log('Rule after clenup: '.$rule,INFO );
356
+			foreach($oidList as $val)
357
+			{
358
+				if (preg_match("/^$oidR$/",$val->oid) == 1)
359
+				{
360
+					if (!preg_match('/^-?[0-9]*\.?[0-9]+$/',$val->value))
361
+					{ // If not a number, change " to ' and put " around it
362
+						$val->value=preg_replace('/"/',"'",$val->value);
363
+						$val->value='"'.$val->value.'"';
364
+					}
365
+					$rep=0;
366
+					$rule=preg_replace('/_OID\('.$oid.'\)/',$val->value,$rule,-1,$rep);
367
+					if ($rep==0)
368
+					{
369
+						$this->logging->log("Error in rule_eval",WARN,'');
370
+						return false;
371
+					}
372
+					$found=1;
373
+					break;
374
+				}
375
+			}
376
+			if ($found==0)
377
+			{	// OID not found : throw error
378
+				throw new Exception('OID '.$oid.' not found in trap');
379
+			}
380
+		}
381
+		$item=0;
382
+		$rule=$this->eval_cleanup($rule);
383
+		$this->logging->log('Rule after clenup: '.$rule,INFO );
384 384
         
385
-        return  $this->evaluation($rule,$item);
386
-    }
385
+		return  $this->evaluation($rule,$item);
386
+	}
387 387
     
388 388
 }
389 389
\ No newline at end of file
Please login to merge, or discard this patch.
library/Trapdirector/TrapsProcess/Trap.php 1 patch
Indentation   +967 added lines, -967 removed lines patch added patch discarded remove patch
@@ -16,957 +16,957 @@  discard block
 block discarded – undo
16 16
  */
17 17
 class Trap
18 18
 {
19
-    // Configuration files and dirs
20
-    /** @var string Icinga etc path */
21
-    protected $icingaweb2Etc;
22
-    /** @var string $trapModuleConfig config.ini of module */
23
-    protected $trapModuleConfig;
24
-    /** @var string $icingaweb2Ressources resources.ini of icingaweb2 */
25
-    protected $icingaweb2Ressources;
26
-    // Options from config.ini (default values)
27
-    /** @var string $snmptranslate */
28
-    protected $snmptranslate='/usr/bin/snmptranslate';
29
-    /** @var string $snmptranslate_dirs */
30
-    protected $snmptranslate_dirs='/usr/share/icingaweb2/modules/trapdirector/mibs';
31
-    /** @var string $icinga2cmd */
32
-    protected $icinga2cmd='/var/run/icinga2/cmd/icinga2.cmd';
33
-    /** @var string $dbPrefix */
34
-    protected $dbPrefix='traps_';
35
-    
36
-    // API
37
-    /** @var boolean $apiUse */
38
-    protected $apiUse=false;
39
-    /** @var Icinga2API $icinga2api */
40
-    protected $icinga2api=null;
41
-    /** @var string $apiHostname */
42
-    protected $apiHostname='';
43
-    /** @var integer $apiPort */
44
-    protected $apiPort=0;
45
-    /** @var string $apiUsername */
46
-    protected $apiUsername='';
47
-    /** @var string $apiPassword */
48
-    protected $apiPassword='';
49
-    
50
-    // Logs
51
-    /** @var Logging Logging class. */
52
-    public $logging;    //< Logging class.
53
-    /** @var bool true if log was setup in constructor */
54
-    protected $logSetup;   //< bool true if log was setup in constructor
55
-    
56
-    // Databases
57
-    /** @var Database $trapsDB  Database class*/
58
-    public $trapsDB = null;
59
-    
60
-    // Trap received data
61
-    protected $receivingHost;
62
-    /** @var array	Main trap data (oid, source...) */
63
-    public $trapData=array();
64
-    /** @var array $trapDataExt Additional trap data objects (oid/value).*/
65
-    public $trapDataExt=array(); 
66
-    /** @var int $trapId trap_id after sql insert*/
67
-    public $trapId=null;
68
-    /** @var string $trapAction trap action for final write*/
69
-    public $trapAction=null;
70
-    /** @var boolean $trapToDb log trap to DB */
71
-    protected $trapToDb=true;
72
-    
73
-    /** @var Mib mib class */
74
-    public $mibClass = null;
75
-    
76
-    /** @var Rule rule class */
77
-    public $ruleClass = null;
78
-    
79
-    /** @var Plugins plugins manager **/
80
-    public $pluginClass = null;
81
-    
82
-    function __construct($etcDir='/etc/icingaweb2',$baseLogLevel=null,$baseLogMode='syslog',$baseLogFile='')
83
-    {
84
-        // Paths of ini files
85
-        $this->icingaweb2Etc=$etcDir;
86
-        $this->trapModuleConfig=$this->icingaweb2Etc."/modules/trapdirector/config.ini";
87
-        $this->icingaweb2Ressources=$this->icingaweb2Etc."/resources.ini";
88
-        
89
-        //************* Setup logging
90
-        $this->logging = new Logging();
91
-        if ($baseLogLevel != null)
92
-        {
93
-            $this->logging->setLogging($baseLogLevel, $baseLogMode,$baseLogFile);
94
-            $this->logSetup=true;
95
-        }
96
-        else
97
-        {
98
-            $this->logSetup=false;
99
-        }
100
-        $this->logging->log('Loggin started', INFO);
101
-        
102
-        //*************** Get options from ini files
103
-        if (! is_file($this->trapModuleConfig))
104
-        {
105
-            throw new Exception("Ini file ".$this->trapModuleConfig." does not exists");
106
-        }
107
-        $trapConfig=parse_ini_file($this->trapModuleConfig,true);
108
-        if ($trapConfig == false)
109
-        {
110
-            $this->logging->log("Error reading ini file : ".$this->trapModuleConfig,ERROR,'syslog');
111
-            throw new Exception("Error reading ini file : ".$this->trapModuleConfig);
112
-        }
113
-        $this->getMainOptions($trapConfig); // Get main options from ini file
114
-        
115
-        //*************** Setup database class & get options
116
-        $this->setupDatabase($trapConfig);
117
-        
118
-        $this->getDatabaseOptions(); // Get options in database
119
-        
120
-        //*************** Setup API
121
-        if ($this->apiUse === true) $this->getAPI(); // Setup API
122
-        
123
-        //*************** Setup MIB
124
-        $this->mibClass = new Mib($this->logging,$this->trapsDB,$this->snmptranslate,$this->snmptranslate_dirs); // Create Mib class
125
-        
126
-        //*************** Setup Rule
127
-        $this->ruleClass = new Rule($this); //< Create Rule class
128
-        
129
-        $this->trapData=array(  // TODO : put this in a reset function (DAEMON_MODE)
130
-            'source_ip'	=> 'unknown',
131
-            'source_port'	=> 'unknown',
132
-            'destination_ip'	=> 'unknown',
133
-            'destination_port'	=> 'unknown',
134
-            'trap_oid'	=> 'unknown'
135
-        );
136
-        
137
-        //*************** Setup Plugins
138
-        //Create plugin class. Plugins are not loaded here, but by calling registerAllPlugins
139
-        $this->pluginClass = new Plugins($this);
19
+	// Configuration files and dirs
20
+	/** @var string Icinga etc path */
21
+	protected $icingaweb2Etc;
22
+	/** @var string $trapModuleConfig config.ini of module */
23
+	protected $trapModuleConfig;
24
+	/** @var string $icingaweb2Ressources resources.ini of icingaweb2 */
25
+	protected $icingaweb2Ressources;
26
+	// Options from config.ini (default values)
27
+	/** @var string $snmptranslate */
28
+	protected $snmptranslate='/usr/bin/snmptranslate';
29
+	/** @var string $snmptranslate_dirs */
30
+	protected $snmptranslate_dirs='/usr/share/icingaweb2/modules/trapdirector/mibs';
31
+	/** @var string $icinga2cmd */
32
+	protected $icinga2cmd='/var/run/icinga2/cmd/icinga2.cmd';
33
+	/** @var string $dbPrefix */
34
+	protected $dbPrefix='traps_';
35
+    
36
+	// API
37
+	/** @var boolean $apiUse */
38
+	protected $apiUse=false;
39
+	/** @var Icinga2API $icinga2api */
40
+	protected $icinga2api=null;
41
+	/** @var string $apiHostname */
42
+	protected $apiHostname='';
43
+	/** @var integer $apiPort */
44
+	protected $apiPort=0;
45
+	/** @var string $apiUsername */
46
+	protected $apiUsername='';
47
+	/** @var string $apiPassword */
48
+	protected $apiPassword='';
49
+    
50
+	// Logs
51
+	/** @var Logging Logging class. */
52
+	public $logging;    //< Logging class.
53
+	/** @var bool true if log was setup in constructor */
54
+	protected $logSetup;   //< bool true if log was setup in constructor
55
+    
56
+	// Databases
57
+	/** @var Database $trapsDB  Database class*/
58
+	public $trapsDB = null;
59
+    
60
+	// Trap received data
61
+	protected $receivingHost;
62
+	/** @var array	Main trap data (oid, source...) */
63
+	public $trapData=array();
64
+	/** @var array $trapDataExt Additional trap data objects (oid/value).*/
65
+	public $trapDataExt=array(); 
66
+	/** @var int $trapId trap_id after sql insert*/
67
+	public $trapId=null;
68
+	/** @var string $trapAction trap action for final write*/
69
+	public $trapAction=null;
70
+	/** @var boolean $trapToDb log trap to DB */
71
+	protected $trapToDb=true;
72
+    
73
+	/** @var Mib mib class */
74
+	public $mibClass = null;
75
+    
76
+	/** @var Rule rule class */
77
+	public $ruleClass = null;
78
+    
79
+	/** @var Plugins plugins manager **/
80
+	public $pluginClass = null;
81
+    
82
+	function __construct($etcDir='/etc/icingaweb2',$baseLogLevel=null,$baseLogMode='syslog',$baseLogFile='')
83
+	{
84
+		// Paths of ini files
85
+		$this->icingaweb2Etc=$etcDir;
86
+		$this->trapModuleConfig=$this->icingaweb2Etc."/modules/trapdirector/config.ini";
87
+		$this->icingaweb2Ressources=$this->icingaweb2Etc."/resources.ini";
88
+        
89
+		//************* Setup logging
90
+		$this->logging = new Logging();
91
+		if ($baseLogLevel != null)
92
+		{
93
+			$this->logging->setLogging($baseLogLevel, $baseLogMode,$baseLogFile);
94
+			$this->logSetup=true;
95
+		}
96
+		else
97
+		{
98
+			$this->logSetup=false;
99
+		}
100
+		$this->logging->log('Loggin started', INFO);
101
+        
102
+		//*************** Get options from ini files
103
+		if (! is_file($this->trapModuleConfig))
104
+		{
105
+			throw new Exception("Ini file ".$this->trapModuleConfig." does not exists");
106
+		}
107
+		$trapConfig=parse_ini_file($this->trapModuleConfig,true);
108
+		if ($trapConfig == false)
109
+		{
110
+			$this->logging->log("Error reading ini file : ".$this->trapModuleConfig,ERROR,'syslog');
111
+			throw new Exception("Error reading ini file : ".$this->trapModuleConfig);
112
+		}
113
+		$this->getMainOptions($trapConfig); // Get main options from ini file
114
+        
115
+		//*************** Setup database class & get options
116
+		$this->setupDatabase($trapConfig);
117
+        
118
+		$this->getDatabaseOptions(); // Get options in database
119
+        
120
+		//*************** Setup API
121
+		if ($this->apiUse === true) $this->getAPI(); // Setup API
122
+        
123
+		//*************** Setup MIB
124
+		$this->mibClass = new Mib($this->logging,$this->trapsDB,$this->snmptranslate,$this->snmptranslate_dirs); // Create Mib class
125
+        
126
+		//*************** Setup Rule
127
+		$this->ruleClass = new Rule($this); //< Create Rule class
128
+        
129
+		$this->trapData=array(  // TODO : put this in a reset function (DAEMON_MODE)
130
+			'source_ip'	=> 'unknown',
131
+			'source_port'	=> 'unknown',
132
+			'destination_ip'	=> 'unknown',
133
+			'destination_port'	=> 'unknown',
134
+			'trap_oid'	=> 'unknown'
135
+		);
136
+        
137
+		//*************** Setup Plugins
138
+		//Create plugin class. Plugins are not loaded here, but by calling registerAllPlugins
139
+		$this->pluginClass = new Plugins($this);
140 140
             
141 141
             
142
-    }
143
-    
144
-    /**
145
-     * Get option from array of ini file, send message if empty
146
-     * @param string $option_array Array of ini file
147
-     * @param string $option_category category in ini file
148
-     * @param string $option_name name of option in category
149
-     * @param mixed $option_var variable to fill if found, left untouched if not found
150
-     * @param integer $log_level default 2 (warning)
151
-     * @param string $message warning message if not found
152
-     * @return boolean true if found, or false
153
-     */
154
-    protected function getOptionIfSet($option_array,$option_category,$option_name, &$option_var, $log_level = 2, $message = null)
155
-    {
156
-        if (!isset($option_array[$option_category][$option_name]))
157
-        {
158
-            if ($message === null)
159
-            {
160
-                $message='No ' . $option_name . ' in config file: '. $this->trapModuleConfig;
161
-            }
162
-            $this->logging->log($message,$log_level);
163
-            return false;
164
-        }
165
-        else
166
-        {
167
-            $option_var=$option_array[$option_category][$option_name];
168
-            return true;
169
-        }
170
-    }
171
-    
172
-    /**
173
-     * Get options from ini file
174
-     * @param array $trap_config : ini file array
175
-     */
176
-    protected function getMainOptions($trapConfig)
177
-    {
178
-        
179
-        // Snmptranslate binary path
180
-        $this->getOptionIfSet($trapConfig,'config','snmptranslate', $this->snmptranslate);
181
-        
182
-        // mibs path
183
-        $this->getOptionIfSet($trapConfig,'config','snmptranslate_dirs', $this->snmptranslate_dirs);
184
-        
185
-        // icinga2cmd path
186
-        $this->getOptionIfSet($trapConfig,'config','icingacmd', $this->icinga2cmd);
187
-        
188
-        // table prefix
189
-        $this->getOptionIfSet($trapConfig,'config','database_prefix', $this->dbPrefix);
190
-        
191
-        // API options
192
-        if ($this->getOptionIfSet($trapConfig,'config','icingaAPI_host', $this->apiHostname))
193
-        {
194
-            $this->apiUse=true;
195
-            $this->getOptionIfSet($trapConfig,'config','icingaAPI_port', $this->apiPort);
196
-            $this->getOptionIfSet($trapConfig,'config','icingaAPI_user', $this->apiUsername);
197
-            $this->getOptionIfSet($trapConfig,'config','icingaAPI_password', $this->apiPassword);
198
-        }
199
-    }
200
-    
201
-    /**
202
-     * Create and setup database class for trap & ido (if no api) db
203
-     * @param array $trap_config : ini file array
204
-     */
205
-    protected function setupDatabase($trapConfig)
206
-    {
207
-        // Trap database
208
-        if (!array_key_exists('database',$trapConfig['config']))
209
-        {
210
-            $this->logging->log("No database in config file: ".$this->trapModuleConfig,ERROR,'');
211
-            return;
212
-        }
213
-        $dbTrapName=$trapConfig['config']['database'];
214
-        $this->logging->log("Found database in config file: ".$dbTrapName,INFO );
215
-        
216
-        if ( ($dbConfig=parse_ini_file($this->icingaweb2Ressources,true)) === false)
217
-        {
218
-            $this->logging->log("Error reading ini file : ".$this->icingaweb2Ressources,ERROR,'');
219
-            return;
220
-        }
221
-        if (!array_key_exists($dbTrapName,$dbConfig))
222
-        {
223
-            $this->logging->log("No database '.$dbTrapName.' in config file: ".$this->icingaweb2Ressources,ERROR,'');
224
-            return;
225
-        }
226
-        
227
-        $this->trapsDB = new Database($this->logging,$dbConfig[$dbTrapName],$this->dbPrefix);
228
-        
229
-        if ($this->apiUse === true) return; // In case of API use, no IDO is necessary
230
-        
231
-        // IDO Database
232
-        if (!array_key_exists('IDOdatabase',$trapConfig['config']))
233
-        {
234
-            $this->logging->log("No IDOdatabase in config file: ".$this->trapModuleConfig,ERROR,'');
235
-        }
236
-        $dbIdoName=$trapConfig['config']['IDOdatabase'];
237
-        
238
-        $this->logging->log("Found IDO database in config file: ".$dbIdoName,INFO );
239
-        if (!array_key_exists($dbIdoName,$dbConfig))
240
-        {
241
-            $this->logging->log("No database '.$dbIdoName.' in config file: ".$this->icingaweb2Ressources,ERROR,'');
242
-            return;
243
-        }
244
-        
245
-        $this->trapsDB->setupIDO($dbConfig[$dbIdoName]);
246
-    }
247
-    
248
-    /**
249
-     * Get options in database
250
-     */
251
-    protected function getDatabaseOptions()
252
-    {
253
-        // Database options
254
-        if ($this->logSetup === false) // Only if logging was no setup in constructor
255
-        {
256
-            $this->getDBConfigIfSet('log_level',$this->logging->debugLevel);
257
-            $this->getDBConfigIfSet('log_destination',$this->logging->outputMode);
258
-            $this->getDBConfigIfSet('log_file',$this->logging->outputFile);
259
-        }
260
-    }
261
-    
262
-    /** Set $variable to value if $element found in database config table
263
-     * @param string $element
264
-     * @param string $variable
265
-     */
266
-    protected function getDBConfigIfSet($element,&$variable)
267
-    {
268
-        $value=$this->getDBConfig($element);
269
-        if ($value != null) $variable=$value;
270
-    }
271
-    
272
-    /**
273
-     *   Get data from db_config
274
-     *	@param $element string name of param
275
-     *	@return mixed : value (or null)
276
-     */
277
-    protected function getDBConfig($element)  // TODO : put this in DB class
278
-    {
279
-        $db_conn=$this->trapsDB->db_connect_trap();
280
-        $sql='SELECT value from '.$this->dbPrefix.'db_config WHERE ( name=\''.$element.'\' )';
281
-        if (($ret_code=$db_conn->query($sql)) === false) {
282
-            $this->logging->log('No result in query : ' . $sql,WARN,'');
283
-            return null;
284
-        }
285
-        $value=$ret_code->fetch();
286
-        if ($value != null && isset($value['value']))
287
-        {
288
-            return $value['value'];
289
-        }
290
-        return null;
291
-    }
292
-    
293
-    /** OBSOLETE Send log. Throws exception on critical error
294
-     *	@param	string $message Message to log
295
-     *	@param	int $level 1=critical 2=warning 3=trace 4=debug
296
-     *	@param  string $destination file/syslog/display
297
-     *	@return void
298
-     **/
299
-    public function trapLog( $message, $level, $destination ='') // OBSOLETE
300
-    {
301
-        // TODO : replace ref with $this->logging->log
302
-        $this->logging->log($message, $level, $destination);
303
-    }
304
-    
305
-    public function setLogging($debugLvl,$outputType,$outputOption=null)  // OBSOLETE
306
-    {
307
-        $this->logging->setLogging($debugLvl, $outputType,$outputOption);
308
-    }
309
-    
310
-    /**
311
-     * Returns or create new IcingaAPI object
312
-     * @return \Icinga\Module\Trapdirector\Icinga2API
313
-     */
314
-    protected function getAPI()
315
-    {
316
-        if ($this->icinga2api == null)
317
-        {
318
-            $this->icinga2api = new Icinga2API($this->apiHostname,$this->apiPort);
319
-        }
320
-        return $this->icinga2api;
321
-    }
322
-    
323
-    
324
-    /**
325
-     * read data from stream
326
-     *	@param $stream string input stream, defaults to "php://stdin"
327
-     *	@return mixed array trap data or exception with error
328
-     */
329
-    public function read_trap($stream='php://stdin')
330
-    {
331
-        //Read data from snmptrapd from stdin
332
-        $input_stream=fopen($stream, 'r');
333
-        
334
-        if ($input_stream === false)
335
-        {
336
-            $this->writeTrapErrorToDB("Error reading trap (code 1/Stdin)");
337
-            $this->logging->log("Error reading stdin !",ERROR,'');
338
-            return null; // note : exception thrown by logging
339
-        }
340
-        
341
-        // line 1 : host
342
-        $this->receivingHost=chop(fgets($input_stream));
343
-        if ($this->receivingHost === false)
344
-        {
345
-            $this->writeTrapErrorToDB("Error reading trap (code 1/Line Host)");
346
-            $this->logging->log("Error reading Host !",ERROR,'');
347
-        }
348
-        // line 2 IP:port=>IP:port
349
-        $IP=chop(fgets($input_stream));
350
-        if ($IP === false)
351
-        {
352
-            $this->writeTrapErrorToDB("Error reading trap (code 1/Line IP)");
353
-            $this->logging->log("Error reading IP !",ERROR,'');
354
-        }
355
-        $matches=array();
356
-        $ret_code=preg_match('/.DP: \[(.*)\]:(.*)->\[(.*)\]:(.*)/',$IP,$matches);
357
-        if ($ret_code===0 || $ret_code===false)
358
-        {
359
-            $this->writeTrapErrorToDB("Error parsing trap (code 2/IP)");
360
-            $this->logging->log('Error parsing IP : '.$IP,ERROR,'');
361
-        }
362
-        else
363
-        {
364
-            $this->trapData['source_ip']=$matches[1];
365
-            $this->trapData['destination_ip']=$matches[3];
366
-            $this->trapData['source_port']=$matches[2];
367
-            $this->trapData['destination_port']=$matches[4];
368
-        }
369
-        
370
-        while (($vars=fgets($input_stream)) !==false)
371
-        {
372
-            $vars=chop($vars);
373
-            $ret_code=preg_match('/^([^ ]+) (.*)$/',$vars,$matches);
374
-            if ($ret_code===0 || $ret_code===false)
375
-            {
376
-                $this->logging->log('No match on trap data : '.$vars,WARN,'');
377
-            }
378
-            else
379
-            {
380
-                if (($matches[1]=='.1.3.6.1.6.3.1.1.4.1.0') || ($matches[1]=='.1.3.6.1.6.3.1.1.4.1'))
381
-                {
382
-                    $this->trapData['trap_oid']=$matches[2];
383
-                }
384
-                else
385
-                {
386
-                    $object= new stdClass;
387
-                    $object->oid =$matches[1];
388
-                    $object->value = $matches[2];
389
-                    array_push($this->trapDataExt,$object);
390
-                }
391
-            }
392
-        }
393
-        
394
-        if ($this->trapData['trap_oid']=='unknown')
395
-        {
396
-            $this->writeTrapErrorToDB("No trap oid found : check snmptrapd configuration (code 3/OID)",$this->trapData['source_ip']);
397
-            $this->logging->log('no trap oid found',ERROR,'');
398
-        }
399
-        
400
-        // Translate oids.
401
-        
402
-        $retArray=$this->translateOID($this->trapData['trap_oid']);
403
-        if ($retArray != null)
404
-        {
405
-            $this->trapData['trap_name']=$retArray['trap_name'];
406
-            $this->trapData['trap_name_mib']=$retArray['trap_name_mib'];
407
-        }
408
-        foreach ($this->trapDataExt as $key => $val)
409
-        {
410
-            $retArray=$this->translateOID($val->oid);
411
-            if ($retArray != null)
412
-            {
413
-                $this->trapDataExt[$key]->oid_name=$retArray['trap_name'];
414
-                $this->trapDataExt[$key]->oid_name_mib=$retArray['trap_name_mib'];
415
-            }
416
-        }
417
-        
418
-        
419
-        $this->trapData['status']= 'waiting';
420
-        
421
-        return $this->trapData;
422
-    }
423
-    
424
-    /**
425
-     * Translate oid into array(MIB,Name)
426
-     * @param $oid string oid to translate
427
-     * @return mixed : null if not found or array(MIB,Name)
428
-     */
429
-    public function translateOID($oid)
430
-    {
431
-        // try from database
432
-        $db_conn=$this->trapsDB->db_connect_trap();
433
-        
434
-        $sql='SELECT mib,name from '.$this->dbPrefix.'mib_cache WHERE oid=\''.$oid.'\';';
435
-        $this->logging->log('SQL query : '.$sql,DEBUG );
436
-        if (($ret_code=$db_conn->query($sql)) === false) {
437
-            $this->logging->log('No result in query : ' . $sql,ERROR,'');
438
-        }
439
-        $name=$ret_code->fetch();
440
-        if ($name['name'] != null)
441
-        {
442
-            return array('trap_name_mib'=>$name['mib'],'trap_name'=>$name['name']);
443
-        }
444
-        
445
-        // Also check if it is an instance of OID
446
-        $oid_instance=preg_replace('/\.[0-9]+$/','',$oid);
447
-        
448
-        $sql='SELECT mib,name from '.$this->dbPrefix.'mib_cache WHERE oid=\''.$oid_instance.'\';';
449
-        $this->logging->log('SQL query : '.$sql,DEBUG );
450
-        if (($ret_code=$db_conn->query($sql)) === false) {
451
-            $this->logging->log('No result in query : ' . $sql,ERROR,'');
452
-        }
453
-        $name=$ret_code->fetch();
454
-        if ($name['name'] != null)
455
-        {
456
-            return array('trap_name_mib'=>$name['mib'],'trap_name'=>$name['name']);
457
-        }
458
-        
459
-        // Try to get oid name from snmptranslate
460
-        $translate=exec($this->snmptranslate . ' -m ALL -M +'.$this->snmptranslate_dirs.
461
-            ' '.$oid);
462
-        $matches=array();
463
-        $ret_code=preg_match('/(.*)::(.*)/',$translate,$matches);
464
-        if ($ret_code===0 || $ret_code === false) {
465
-            return NULL;
466
-        } else {
467
-            $this->logging->log('Found name with snmptrapd and not in DB for oid='.$oid,INFO);
468
-            return array('trap_name_mib'=>$matches[1],'trap_name'=>$matches[2]);
469
-        }
470
-    }
471
-    
472
-    /**
473
-     * Erase old trap records
474
-     *	@param integer $days : erase traps when more than $days old
475
-     *	@return integer : number of lines deleted
476
-     **/
477
-    public function eraseOldTraps($days=0)
478
-    {
479
-        if ($days==0)
480
-        {
481
-            if (($days=$this->getDBConfig('db_remove_days')) == null)
482
-            {
483
-                $this->logging->log('No days specified & no db value : no tap erase' ,WARN,'');
484
-                return;
485
-            }
486
-        }
487
-        $db_conn=$this->trapsDB->db_connect_trap();
488
-        $daysago = strtotime("-".$days." day");
489
-        $sql= 'delete from '.$this->dbPrefix.'received where date_received < \''.date("Y-m-d H:i:s",$daysago).'\';';
490
-        if ($db_conn->query($sql) === false) {
491
-            $this->logging->log('Error erasing traps : '.$sql,ERROR,'');
492
-        }
493
-        $this->logging->log('Erased traps older than '.$days.' day(s) : '.$sql,INFO);
494
-    }
495
-    
496
-    /** Write error to received trap database
497
-     */
498
-    public function writeTrapErrorToDB($message,$sourceIP=null,$trapoid=null)
499
-    {
500
-        
501
-        $db_conn=$this->trapsDB->db_connect_trap();
502
-        
503
-        // add date time
504
-        $insert_col ='date_received,status';
505
-        $insert_val = "'" . date("Y-m-d H:i:s")."','error'";
506
-        
507
-        if ($sourceIP !=null)
508
-        {
509
-            $insert_col .=',source_ip';
510
-            $insert_val .=",'". $sourceIP ."'";
511
-        }
512
-        if ($trapoid !=null)
513
-        {
514
-            $insert_col .=',trap_oid';
515
-            $insert_val .=",'". $trapoid ."'";
516
-        }
517
-        $insert_col .=',status_detail';
518
-        $insert_val .=",'". $message ."'";
519
-        
520
-        $sql= 'INSERT INTO '.$this->dbPrefix.'received (' . $insert_col . ') VALUES ('.$insert_val.')';
521
-        
522
-        switch ($this->trapsDB->trapDBType)
523
-        {
524
-            case 'pgsql':
525
-                $sql .= ' RETURNING id;';
526
-                $this->logging->log('sql : '.$sql,INFO);
527
-                if (($ret_code=$db_conn->query($sql)) === false) {
528
-                    $this->logging->log('Error SQL insert : '.$sql,1,'');
529
-                }
530
-                $this->logging->log('SQL insertion OK',INFO );
531
-                // Get last id to insert oid/values in secondary table
532
-                if (($inserted_id_ret=$ret_code->fetch(PDO::FETCH_ASSOC)) === false) {
142
+	}
143
+    
144
+	/**
145
+	 * Get option from array of ini file, send message if empty
146
+	 * @param string $option_array Array of ini file
147
+	 * @param string $option_category category in ini file
148
+	 * @param string $option_name name of option in category
149
+	 * @param mixed $option_var variable to fill if found, left untouched if not found
150
+	 * @param integer $log_level default 2 (warning)
151
+	 * @param string $message warning message if not found
152
+	 * @return boolean true if found, or false
153
+	 */
154
+	protected function getOptionIfSet($option_array,$option_category,$option_name, &$option_var, $log_level = 2, $message = null)
155
+	{
156
+		if (!isset($option_array[$option_category][$option_name]))
157
+		{
158
+			if ($message === null)
159
+			{
160
+				$message='No ' . $option_name . ' in config file: '. $this->trapModuleConfig;
161
+			}
162
+			$this->logging->log($message,$log_level);
163
+			return false;
164
+		}
165
+		else
166
+		{
167
+			$option_var=$option_array[$option_category][$option_name];
168
+			return true;
169
+		}
170
+	}
171
+    
172
+	/**
173
+	 * Get options from ini file
174
+	 * @param array $trap_config : ini file array
175
+	 */
176
+	protected function getMainOptions($trapConfig)
177
+	{
178
+        
179
+		// Snmptranslate binary path
180
+		$this->getOptionIfSet($trapConfig,'config','snmptranslate', $this->snmptranslate);
181
+        
182
+		// mibs path
183
+		$this->getOptionIfSet($trapConfig,'config','snmptranslate_dirs', $this->snmptranslate_dirs);
184
+        
185
+		// icinga2cmd path
186
+		$this->getOptionIfSet($trapConfig,'config','icingacmd', $this->icinga2cmd);
187
+        
188
+		// table prefix
189
+		$this->getOptionIfSet($trapConfig,'config','database_prefix', $this->dbPrefix);
190
+        
191
+		// API options
192
+		if ($this->getOptionIfSet($trapConfig,'config','icingaAPI_host', $this->apiHostname))
193
+		{
194
+			$this->apiUse=true;
195
+			$this->getOptionIfSet($trapConfig,'config','icingaAPI_port', $this->apiPort);
196
+			$this->getOptionIfSet($trapConfig,'config','icingaAPI_user', $this->apiUsername);
197
+			$this->getOptionIfSet($trapConfig,'config','icingaAPI_password', $this->apiPassword);
198
+		}
199
+	}
200
+    
201
+	/**
202
+	 * Create and setup database class for trap & ido (if no api) db
203
+	 * @param array $trap_config : ini file array
204
+	 */
205
+	protected function setupDatabase($trapConfig)
206
+	{
207
+		// Trap database
208
+		if (!array_key_exists('database',$trapConfig['config']))
209
+		{
210
+			$this->logging->log("No database in config file: ".$this->trapModuleConfig,ERROR,'');
211
+			return;
212
+		}
213
+		$dbTrapName=$trapConfig['config']['database'];
214
+		$this->logging->log("Found database in config file: ".$dbTrapName,INFO );
215
+        
216
+		if ( ($dbConfig=parse_ini_file($this->icingaweb2Ressources,true)) === false)
217
+		{
218
+			$this->logging->log("Error reading ini file : ".$this->icingaweb2Ressources,ERROR,'');
219
+			return;
220
+		}
221
+		if (!array_key_exists($dbTrapName,$dbConfig))
222
+		{
223
+			$this->logging->log("No database '.$dbTrapName.' in config file: ".$this->icingaweb2Ressources,ERROR,'');
224
+			return;
225
+		}
226
+        
227
+		$this->trapsDB = new Database($this->logging,$dbConfig[$dbTrapName],$this->dbPrefix);
228
+        
229
+		if ($this->apiUse === true) return; // In case of API use, no IDO is necessary
230
+        
231
+		// IDO Database
232
+		if (!array_key_exists('IDOdatabase',$trapConfig['config']))
233
+		{
234
+			$this->logging->log("No IDOdatabase in config file: ".$this->trapModuleConfig,ERROR,'');
235
+		}
236
+		$dbIdoName=$trapConfig['config']['IDOdatabase'];
237
+        
238
+		$this->logging->log("Found IDO database in config file: ".$dbIdoName,INFO );
239
+		if (!array_key_exists($dbIdoName,$dbConfig))
240
+		{
241
+			$this->logging->log("No database '.$dbIdoName.' in config file: ".$this->icingaweb2Ressources,ERROR,'');
242
+			return;
243
+		}
244
+        
245
+		$this->trapsDB->setupIDO($dbConfig[$dbIdoName]);
246
+	}
247
+    
248
+	/**
249
+	 * Get options in database
250
+	 */
251
+	protected function getDatabaseOptions()
252
+	{
253
+		// Database options
254
+		if ($this->logSetup === false) // Only if logging was no setup in constructor
255
+		{
256
+			$this->getDBConfigIfSet('log_level',$this->logging->debugLevel);
257
+			$this->getDBConfigIfSet('log_destination',$this->logging->outputMode);
258
+			$this->getDBConfigIfSet('log_file',$this->logging->outputFile);
259
+		}
260
+	}
261
+    
262
+	/** Set $variable to value if $element found in database config table
263
+	 * @param string $element
264
+	 * @param string $variable
265
+	 */
266
+	protected function getDBConfigIfSet($element,&$variable)
267
+	{
268
+		$value=$this->getDBConfig($element);
269
+		if ($value != null) $variable=$value;
270
+	}
271
+    
272
+	/**
273
+	 *   Get data from db_config
274
+	 *	@param $element string name of param
275
+	 *	@return mixed : value (or null)
276
+	 */
277
+	protected function getDBConfig($element)  // TODO : put this in DB class
278
+	{
279
+		$db_conn=$this->trapsDB->db_connect_trap();
280
+		$sql='SELECT value from '.$this->dbPrefix.'db_config WHERE ( name=\''.$element.'\' )';
281
+		if (($ret_code=$db_conn->query($sql)) === false) {
282
+			$this->logging->log('No result in query : ' . $sql,WARN,'');
283
+			return null;
284
+		}
285
+		$value=$ret_code->fetch();
286
+		if ($value != null && isset($value['value']))
287
+		{
288
+			return $value['value'];
289
+		}
290
+		return null;
291
+	}
292
+    
293
+	/** OBSOLETE Send log. Throws exception on critical error
294
+	 *	@param	string $message Message to log
295
+	 *	@param	int $level 1=critical 2=warning 3=trace 4=debug
296
+	 *	@param  string $destination file/syslog/display
297
+	 *	@return void
298
+	 **/
299
+	public function trapLog( $message, $level, $destination ='') // OBSOLETE
300
+	{
301
+		// TODO : replace ref with $this->logging->log
302
+		$this->logging->log($message, $level, $destination);
303
+	}
304
+    
305
+	public function setLogging($debugLvl,$outputType,$outputOption=null)  // OBSOLETE
306
+	{
307
+		$this->logging->setLogging($debugLvl, $outputType,$outputOption);
308
+	}
309
+    
310
+	/**
311
+	 * Returns or create new IcingaAPI object
312
+	 * @return \Icinga\Module\Trapdirector\Icinga2API
313
+	 */
314
+	protected function getAPI()
315
+	{
316
+		if ($this->icinga2api == null)
317
+		{
318
+			$this->icinga2api = new Icinga2API($this->apiHostname,$this->apiPort);
319
+		}
320
+		return $this->icinga2api;
321
+	}
322
+    
323
+    
324
+	/**
325
+	 * read data from stream
326
+	 *	@param $stream string input stream, defaults to "php://stdin"
327
+	 *	@return mixed array trap data or exception with error
328
+	 */
329
+	public function read_trap($stream='php://stdin')
330
+	{
331
+		//Read data from snmptrapd from stdin
332
+		$input_stream=fopen($stream, 'r');
333
+        
334
+		if ($input_stream === false)
335
+		{
336
+			$this->writeTrapErrorToDB("Error reading trap (code 1/Stdin)");
337
+			$this->logging->log("Error reading stdin !",ERROR,'');
338
+			return null; // note : exception thrown by logging
339
+		}
340
+        
341
+		// line 1 : host
342
+		$this->receivingHost=chop(fgets($input_stream));
343
+		if ($this->receivingHost === false)
344
+		{
345
+			$this->writeTrapErrorToDB("Error reading trap (code 1/Line Host)");
346
+			$this->logging->log("Error reading Host !",ERROR,'');
347
+		}
348
+		// line 2 IP:port=>IP:port
349
+		$IP=chop(fgets($input_stream));
350
+		if ($IP === false)
351
+		{
352
+			$this->writeTrapErrorToDB("Error reading trap (code 1/Line IP)");
353
+			$this->logging->log("Error reading IP !",ERROR,'');
354
+		}
355
+		$matches=array();
356
+		$ret_code=preg_match('/.DP: \[(.*)\]:(.*)->\[(.*)\]:(.*)/',$IP,$matches);
357
+		if ($ret_code===0 || $ret_code===false)
358
+		{
359
+			$this->writeTrapErrorToDB("Error parsing trap (code 2/IP)");
360
+			$this->logging->log('Error parsing IP : '.$IP,ERROR,'');
361
+		}
362
+		else
363
+		{
364
+			$this->trapData['source_ip']=$matches[1];
365
+			$this->trapData['destination_ip']=$matches[3];
366
+			$this->trapData['source_port']=$matches[2];
367
+			$this->trapData['destination_port']=$matches[4];
368
+		}
369
+        
370
+		while (($vars=fgets($input_stream)) !==false)
371
+		{
372
+			$vars=chop($vars);
373
+			$ret_code=preg_match('/^([^ ]+) (.*)$/',$vars,$matches);
374
+			if ($ret_code===0 || $ret_code===false)
375
+			{
376
+				$this->logging->log('No match on trap data : '.$vars,WARN,'');
377
+			}
378
+			else
379
+			{
380
+				if (($matches[1]=='.1.3.6.1.6.3.1.1.4.1.0') || ($matches[1]=='.1.3.6.1.6.3.1.1.4.1'))
381
+				{
382
+					$this->trapData['trap_oid']=$matches[2];
383
+				}
384
+				else
385
+				{
386
+					$object= new stdClass;
387
+					$object->oid =$matches[1];
388
+					$object->value = $matches[2];
389
+					array_push($this->trapDataExt,$object);
390
+				}
391
+			}
392
+		}
393
+        
394
+		if ($this->trapData['trap_oid']=='unknown')
395
+		{
396
+			$this->writeTrapErrorToDB("No trap oid found : check snmptrapd configuration (code 3/OID)",$this->trapData['source_ip']);
397
+			$this->logging->log('no trap oid found',ERROR,'');
398
+		}
399
+        
400
+		// Translate oids.
401
+        
402
+		$retArray=$this->translateOID($this->trapData['trap_oid']);
403
+		if ($retArray != null)
404
+		{
405
+			$this->trapData['trap_name']=$retArray['trap_name'];
406
+			$this->trapData['trap_name_mib']=$retArray['trap_name_mib'];
407
+		}
408
+		foreach ($this->trapDataExt as $key => $val)
409
+		{
410
+			$retArray=$this->translateOID($val->oid);
411
+			if ($retArray != null)
412
+			{
413
+				$this->trapDataExt[$key]->oid_name=$retArray['trap_name'];
414
+				$this->trapDataExt[$key]->oid_name_mib=$retArray['trap_name_mib'];
415
+			}
416
+		}
417
+        
418
+        
419
+		$this->trapData['status']= 'waiting';
420
+        
421
+		return $this->trapData;
422
+	}
423
+    
424
+	/**
425
+	 * Translate oid into array(MIB,Name)
426
+	 * @param $oid string oid to translate
427
+	 * @return mixed : null if not found or array(MIB,Name)
428
+	 */
429
+	public function translateOID($oid)
430
+	{
431
+		// try from database
432
+		$db_conn=$this->trapsDB->db_connect_trap();
433
+        
434
+		$sql='SELECT mib,name from '.$this->dbPrefix.'mib_cache WHERE oid=\''.$oid.'\';';
435
+		$this->logging->log('SQL query : '.$sql,DEBUG );
436
+		if (($ret_code=$db_conn->query($sql)) === false) {
437
+			$this->logging->log('No result in query : ' . $sql,ERROR,'');
438
+		}
439
+		$name=$ret_code->fetch();
440
+		if ($name['name'] != null)
441
+		{
442
+			return array('trap_name_mib'=>$name['mib'],'trap_name'=>$name['name']);
443
+		}
444
+        
445
+		// Also check if it is an instance of OID
446
+		$oid_instance=preg_replace('/\.[0-9]+$/','',$oid);
447
+        
448
+		$sql='SELECT mib,name from '.$this->dbPrefix.'mib_cache WHERE oid=\''.$oid_instance.'\';';
449
+		$this->logging->log('SQL query : '.$sql,DEBUG );
450
+		if (($ret_code=$db_conn->query($sql)) === false) {
451
+			$this->logging->log('No result in query : ' . $sql,ERROR,'');
452
+		}
453
+		$name=$ret_code->fetch();
454
+		if ($name['name'] != null)
455
+		{
456
+			return array('trap_name_mib'=>$name['mib'],'trap_name'=>$name['name']);
457
+		}
458
+        
459
+		// Try to get oid name from snmptranslate
460
+		$translate=exec($this->snmptranslate . ' -m ALL -M +'.$this->snmptranslate_dirs.
461
+			' '.$oid);
462
+		$matches=array();
463
+		$ret_code=preg_match('/(.*)::(.*)/',$translate,$matches);
464
+		if ($ret_code===0 || $ret_code === false) {
465
+			return NULL;
466
+		} else {
467
+			$this->logging->log('Found name with snmptrapd and not in DB for oid='.$oid,INFO);
468
+			return array('trap_name_mib'=>$matches[1],'trap_name'=>$matches[2]);
469
+		}
470
+	}
471
+    
472
+	/**
473
+	 * Erase old trap records
474
+	 *	@param integer $days : erase traps when more than $days old
475
+	 *	@return integer : number of lines deleted
476
+	 **/
477
+	public function eraseOldTraps($days=0)
478
+	{
479
+		if ($days==0)
480
+		{
481
+			if (($days=$this->getDBConfig('db_remove_days')) == null)
482
+			{
483
+				$this->logging->log('No days specified & no db value : no tap erase' ,WARN,'');
484
+				return;
485
+			}
486
+		}
487
+		$db_conn=$this->trapsDB->db_connect_trap();
488
+		$daysago = strtotime("-".$days." day");
489
+		$sql= 'delete from '.$this->dbPrefix.'received where date_received < \''.date("Y-m-d H:i:s",$daysago).'\';';
490
+		if ($db_conn->query($sql) === false) {
491
+			$this->logging->log('Error erasing traps : '.$sql,ERROR,'');
492
+		}
493
+		$this->logging->log('Erased traps older than '.$days.' day(s) : '.$sql,INFO);
494
+	}
495
+    
496
+	/** Write error to received trap database
497
+	 */
498
+	public function writeTrapErrorToDB($message,$sourceIP=null,$trapoid=null)
499
+	{
500
+        
501
+		$db_conn=$this->trapsDB->db_connect_trap();
502
+        
503
+		// add date time
504
+		$insert_col ='date_received,status';
505
+		$insert_val = "'" . date("Y-m-d H:i:s")."','error'";
506
+        
507
+		if ($sourceIP !=null)
508
+		{
509
+			$insert_col .=',source_ip';
510
+			$insert_val .=",'". $sourceIP ."'";
511
+		}
512
+		if ($trapoid !=null)
513
+		{
514
+			$insert_col .=',trap_oid';
515
+			$insert_val .=",'". $trapoid ."'";
516
+		}
517
+		$insert_col .=',status_detail';
518
+		$insert_val .=",'". $message ."'";
519
+        
520
+		$sql= 'INSERT INTO '.$this->dbPrefix.'received (' . $insert_col . ') VALUES ('.$insert_val.')';
521
+        
522
+		switch ($this->trapsDB->trapDBType)
523
+		{
524
+			case 'pgsql':
525
+				$sql .= ' RETURNING id;';
526
+				$this->logging->log('sql : '.$sql,INFO);
527
+				if (($ret_code=$db_conn->query($sql)) === false) {
528
+					$this->logging->log('Error SQL insert : '.$sql,1,'');
529
+				}
530
+				$this->logging->log('SQL insertion OK',INFO );
531
+				// Get last id to insert oid/values in secondary table
532
+				if (($inserted_id_ret=$ret_code->fetch(PDO::FETCH_ASSOC)) === false) {
533 533
                     
534
-                    $this->logging->log('Erreur recuperation id',1,'');
535
-                }
536
-                if (! isset($inserted_id_ret['id'])) {
537
-                    $this->logging->log('Error getting id',1,'');
538
-                }
539
-                $this->trapId=$inserted_id_ret['id'];
540
-                break;
541
-            case 'mysql':
542
-                $sql .= ';';
543
-                $this->logging->log('sql : '.$sql,INFO );
544
-                if ($db_conn->query($sql) === false) {
545
-                    $this->logging->log('Error SQL insert : '.$sql,1,'');
546
-                }
547
-                $this->logging->log('SQL insertion OK',INFO );
548
-                // Get last id to insert oid/values in secondary table
549
-                $sql='SELECT LAST_INSERT_ID();';
550
-                if (($ret_code=$db_conn->query($sql)) === false) {
551
-                    $this->logging->log('Erreur recuperation id',1,'');
552
-                }
534
+					$this->logging->log('Erreur recuperation id',1,'');
535
+				}
536
+				if (! isset($inserted_id_ret['id'])) {
537
+					$this->logging->log('Error getting id',1,'');
538
+				}
539
+				$this->trapId=$inserted_id_ret['id'];
540
+				break;
541
+			case 'mysql':
542
+				$sql .= ';';
543
+				$this->logging->log('sql : '.$sql,INFO );
544
+				if ($db_conn->query($sql) === false) {
545
+					$this->logging->log('Error SQL insert : '.$sql,1,'');
546
+				}
547
+				$this->logging->log('SQL insertion OK',INFO );
548
+				// Get last id to insert oid/values in secondary table
549
+				$sql='SELECT LAST_INSERT_ID();';
550
+				if (($ret_code=$db_conn->query($sql)) === false) {
551
+					$this->logging->log('Erreur recuperation id',1,'');
552
+				}
553 553
                 
554
-                $inserted_id=$ret_code->fetch(PDO::FETCH_ASSOC)['LAST_INSERT_ID()'];
555
-                if ($inserted_id==false) throw new Exception("Weird SQL error : last_insert_id returned false : open issue");
556
-                $this->trapId=$inserted_id;
557
-                break;
558
-            default:
559
-                $this->logging->log('Error SQL type unknown  : '.$this->trapsDB->trapDBType,1,'');
560
-        }
561
-        
562
-        $this->logging->log('id found: '. $this->trapId,INFO );
563
-    }
564
-    
565
-    /** Write trap data to trap database
566
-     */
567
-    public function writeTrapToDB()
568
-    {
569
-        
570
-        // If action is ignore -> don't send t DB
571
-        if ($this->trapToDb === false) return;
572
-        
573
-        
574
-        $db_conn=$this->trapsDB->db_connect_trap();
575
-        
576
-        $insert_col='';
577
-        $insert_val='';
578
-        // add date time
579
-        $this->trapData['date_received'] = date("Y-m-d H:i:s");
580
-        
581
-        $firstcol=1;
582
-        foreach ($this->trapData as $col => $val)
583
-        {
584
-            if ($firstcol==0)
585
-            {
586
-                $insert_col .=',';
587
-                $insert_val .=',';
588
-            }
589
-            $insert_col .= $col ;
590
-            $insert_val .= ($val==null)? 'NULL' : $db_conn->quote($val);
591
-            $firstcol=0;
592
-        }
593
-        
594
-        $sql= 'INSERT INTO '.$this->dbPrefix.'received (' . $insert_col . ') VALUES ('.$insert_val.')';
595
-        switch ($this->trapsDB->trapDBType)
596
-        {
597
-            case 'pgsql':
598
-                $sql .= ' RETURNING id;';
599
-                $this->logging->log('sql : '.$sql,INFO );
600
-                if (($ret_code=$db_conn->query($sql)) === false) {
601
-                    $this->logging->log('Error SQL insert : '.$sql,ERROR,'');
602
-                }
603
-                $this->logging->log('SQL insertion OK',INFO );
604
-                // Get last id to insert oid/values in secondary table
605
-                if (($inserted_id_ret=$ret_code->fetch(PDO::FETCH_ASSOC)) === false) {
554
+				$inserted_id=$ret_code->fetch(PDO::FETCH_ASSOC)['LAST_INSERT_ID()'];
555
+				if ($inserted_id==false) throw new Exception("Weird SQL error : last_insert_id returned false : open issue");
556
+				$this->trapId=$inserted_id;
557
+				break;
558
+			default:
559
+				$this->logging->log('Error SQL type unknown  : '.$this->trapsDB->trapDBType,1,'');
560
+		}
561
+        
562
+		$this->logging->log('id found: '. $this->trapId,INFO );
563
+	}
564
+    
565
+	/** Write trap data to trap database
566
+	 */
567
+	public function writeTrapToDB()
568
+	{
569
+        
570
+		// If action is ignore -> don't send t DB
571
+		if ($this->trapToDb === false) return;
572
+        
573
+        
574
+		$db_conn=$this->trapsDB->db_connect_trap();
575
+        
576
+		$insert_col='';
577
+		$insert_val='';
578
+		// add date time
579
+		$this->trapData['date_received'] = date("Y-m-d H:i:s");
580
+        
581
+		$firstcol=1;
582
+		foreach ($this->trapData as $col => $val)
583
+		{
584
+			if ($firstcol==0)
585
+			{
586
+				$insert_col .=',';
587
+				$insert_val .=',';
588
+			}
589
+			$insert_col .= $col ;
590
+			$insert_val .= ($val==null)? 'NULL' : $db_conn->quote($val);
591
+			$firstcol=0;
592
+		}
593
+        
594
+		$sql= 'INSERT INTO '.$this->dbPrefix.'received (' . $insert_col . ') VALUES ('.$insert_val.')';
595
+		switch ($this->trapsDB->trapDBType)
596
+		{
597
+			case 'pgsql':
598
+				$sql .= ' RETURNING id;';
599
+				$this->logging->log('sql : '.$sql,INFO );
600
+				if (($ret_code=$db_conn->query($sql)) === false) {
601
+					$this->logging->log('Error SQL insert : '.$sql,ERROR,'');
602
+				}
603
+				$this->logging->log('SQL insertion OK',INFO );
604
+				// Get last id to insert oid/values in secondary table
605
+				if (($inserted_id_ret=$ret_code->fetch(PDO::FETCH_ASSOC)) === false) {
606 606
                     
607
-                    $this->logging->log('Erreur recuperation id',ERROR,'');
608
-                }
609
-                if (! isset($inserted_id_ret['id'])) {
610
-                    $this->logging->log('Error getting id',ERROR,'');
611
-                }
612
-                $this->trapId=$inserted_id_ret['id'];
613
-                break;
614
-            case 'mysql':
615
-                $sql .= ';';
616
-                $this->logging->log('sql : '.$sql,INFO );
617
-                if ($db_conn->query($sql) === false) {
618
-                    $this->logging->log('Error SQL insert : '.$sql,ERROR,'');
619
-                }
620
-                $this->logging->log('SQL insertion OK',INFO );
621
-                // Get last id to insert oid/values in secondary table
622
-                $sql='SELECT LAST_INSERT_ID();';
623
-                if (($ret_code=$db_conn->query($sql)) === false) {
624
-                    $this->logging->log('Erreur recuperation id',ERROR,'');
625
-                }
607
+					$this->logging->log('Erreur recuperation id',ERROR,'');
608
+				}
609
+				if (! isset($inserted_id_ret['id'])) {
610
+					$this->logging->log('Error getting id',ERROR,'');
611
+				}
612
+				$this->trapId=$inserted_id_ret['id'];
613
+				break;
614
+			case 'mysql':
615
+				$sql .= ';';
616
+				$this->logging->log('sql : '.$sql,INFO );
617
+				if ($db_conn->query($sql) === false) {
618
+					$this->logging->log('Error SQL insert : '.$sql,ERROR,'');
619
+				}
620
+				$this->logging->log('SQL insertion OK',INFO );
621
+				// Get last id to insert oid/values in secondary table
622
+				$sql='SELECT LAST_INSERT_ID();';
623
+				if (($ret_code=$db_conn->query($sql)) === false) {
624
+					$this->logging->log('Erreur recuperation id',ERROR,'');
625
+				}
626 626
                 
627
-                $inserted_id=$ret_code->fetch(PDO::FETCH_ASSOC)['LAST_INSERT_ID()'];
628
-                if ($inserted_id==false) throw new Exception("Weird SQL error : last_insert_id returned false : open issue");
629
-                $this->trapId=$inserted_id;
630
-                break;
631
-            default:
632
-                $this->logging->log('Error SQL type unknown : '.$this->trapsDB->trapDBType,ERROR,'');
633
-        }
634
-        $this->logging->log('id found: '.$this->trapId,INFO );
635
-        
636
-        // Fill trap extended data table
637
-        foreach ($this->trapDataExt as $value) {
638
-            // TODO : detect if trap value is encoded and decode it to UTF-8 for database
639
-            $firstcol=1;
640
-            $value->trap_id = $this->trapId;
641
-            $insert_col='';
642
-            $insert_val='';
643
-            foreach ($value as $col => $val)
644
-            {
645
-                if ($firstcol==0)
646
-                {
647
-                    $insert_col .=',';
648
-                    $insert_val .=',';
649
-                }
650
-                $insert_col .= $col;
651
-                $insert_val .= ($val==null)? 'NULL' : $db_conn->quote($val);
652
-                $firstcol=0;
653
-            }
627
+				$inserted_id=$ret_code->fetch(PDO::FETCH_ASSOC)['LAST_INSERT_ID()'];
628
+				if ($inserted_id==false) throw new Exception("Weird SQL error : last_insert_id returned false : open issue");
629
+				$this->trapId=$inserted_id;
630
+				break;
631
+			default:
632
+				$this->logging->log('Error SQL type unknown : '.$this->trapsDB->trapDBType,ERROR,'');
633
+		}
634
+		$this->logging->log('id found: '.$this->trapId,INFO );
635
+        
636
+		// Fill trap extended data table
637
+		foreach ($this->trapDataExt as $value) {
638
+			// TODO : detect if trap value is encoded and decode it to UTF-8 for database
639
+			$firstcol=1;
640
+			$value->trap_id = $this->trapId;
641
+			$insert_col='';
642
+			$insert_val='';
643
+			foreach ($value as $col => $val)
644
+			{
645
+				if ($firstcol==0)
646
+				{
647
+					$insert_col .=',';
648
+					$insert_val .=',';
649
+				}
650
+				$insert_col .= $col;
651
+				$insert_val .= ($val==null)? 'NULL' : $db_conn->quote($val);
652
+				$firstcol=0;
653
+			}
654 654
             
655
-            $sql= 'INSERT INTO '.$this->dbPrefix.'received_data (' . $insert_col . ') VALUES ('.$insert_val.');';
655
+			$sql= 'INSERT INTO '.$this->dbPrefix.'received_data (' . $insert_col . ') VALUES ('.$insert_val.');';
656 656
             
657
-            if ($db_conn->query($sql) === false) {
658
-                $this->logging->log('Erreur insertion data : ' . $sql,WARN,'');
659
-            }
660
-        }
661
-    }
662
-    
663
-    /** Get rules from rule database with ip and oid
664
-     *	@param $ip string ipv4 or ipv6
665
-     *	@param $oid string oid in numeric
666
-     *	@return mixed|boolean : PDO object or false
667
-     */
668
-    protected function getRules($ip,$oid)
669
-    {
670
-        $db_conn=$this->trapsDB->db_connect_trap();
671
-        // fetch rules based on IP in rule and OID
672
-        $sql='SELECT * from '.$this->dbPrefix.'rules WHERE trap_oid=\''.$oid.'\' ';
673
-        $this->logging->log('SQL query : '.$sql,DEBUG );
674
-        if (($ret_code=$db_conn->query($sql)) === false) {
675
-            $this->logging->log('No result in query : ' . $sql,WARN,'');
676
-            return false;
677
-        }
678
-        $rules_all=$ret_code->fetchAll();
679
-        //echo "rule all :\n";print_r($rules_all);echo "\n";
680
-        $rules_ret=array();
681
-        $rule_ret_key=0;
682
-        foreach ($rules_all as $key => $rule)
683
-        {
684
-            if ($rule['ip4']==$ip || $rule['ip6']==$ip)
685
-            {
686
-                $rules_ret[$rule_ret_key]=$rules_all[$key];
687
-                //TODO : get host name by API (and check if correct in rule).
688
-                $rule_ret_key++;
689
-                continue;
690
-            }
691
-            // TODO : get hosts IP by API
692
-            if (isset($rule['host_group_name']) && $rule['host_group_name']!=null)
693
-            { // get ips of group members by oid
694
-                $db_conn2=$this->trapsDB->db_connect_ido();
695
-                $sql="SELECT m.host_object_id, a.address as ip4, a.address6 as ip6, b.name1 as host_name
657
+			if ($db_conn->query($sql) === false) {
658
+				$this->logging->log('Erreur insertion data : ' . $sql,WARN,'');
659
+			}
660
+		}
661
+	}
662
+    
663
+	/** Get rules from rule database with ip and oid
664
+	 *	@param $ip string ipv4 or ipv6
665
+	 *	@param $oid string oid in numeric
666
+	 *	@return mixed|boolean : PDO object or false
667
+	 */
668
+	protected function getRules($ip,$oid)
669
+	{
670
+		$db_conn=$this->trapsDB->db_connect_trap();
671
+		// fetch rules based on IP in rule and OID
672
+		$sql='SELECT * from '.$this->dbPrefix.'rules WHERE trap_oid=\''.$oid.'\' ';
673
+		$this->logging->log('SQL query : '.$sql,DEBUG );
674
+		if (($ret_code=$db_conn->query($sql)) === false) {
675
+			$this->logging->log('No result in query : ' . $sql,WARN,'');
676
+			return false;
677
+		}
678
+		$rules_all=$ret_code->fetchAll();
679
+		//echo "rule all :\n";print_r($rules_all);echo "\n";
680
+		$rules_ret=array();
681
+		$rule_ret_key=0;
682
+		foreach ($rules_all as $key => $rule)
683
+		{
684
+			if ($rule['ip4']==$ip || $rule['ip6']==$ip)
685
+			{
686
+				$rules_ret[$rule_ret_key]=$rules_all[$key];
687
+				//TODO : get host name by API (and check if correct in rule).
688
+				$rule_ret_key++;
689
+				continue;
690
+			}
691
+			// TODO : get hosts IP by API
692
+			if (isset($rule['host_group_name']) && $rule['host_group_name']!=null)
693
+			{ // get ips of group members by oid
694
+				$db_conn2=$this->trapsDB->db_connect_ido();
695
+				$sql="SELECT m.host_object_id, a.address as ip4, a.address6 as ip6, b.name1 as host_name
696 696
 						FROM icinga_objects as o
697 697
 						LEFT JOIN icinga_hostgroups as h ON o.object_id=h.hostgroup_object_id
698 698
 						LEFT JOIN icinga_hostgroup_members as m ON h.hostgroup_id=m.hostgroup_id
699 699
 						LEFT JOIN icinga_hosts as a ON a.host_object_id = m.host_object_id
700 700
 						LEFT JOIN icinga_objects as b ON b.object_id = a.host_object_id
701 701
 						WHERE o.name1='".$rule['host_group_name']."';";
702
-                if (($ret_code2=$db_conn2->query($sql)) === false) {
703
-                    $this->logging->log('No result in query : ' . $sql,WARN,'');
704
-                    continue;
705
-                }
706
-                $grouphosts=$ret_code2->fetchAll();
707
-                //echo "rule grp :\n";print_r($grouphosts);echo "\n";
708
-                foreach ( $grouphosts as $host)
709
-                {
710
-                    //echo $host['ip4']."\n";
711
-                    if ($host['ip4']==$ip || $host['ip6']==$ip)
712
-                    {
713
-                        //echo "Rule added \n";
714
-                        $rules_ret[$rule_ret_key]=$rules_all[$key];
715
-                        $rules_ret[$rule_ret_key]['host_name']=$host['host_name'];
716
-                        $rule_ret_key++;
717
-                    }
718
-                }
719
-            }
720
-        }
721
-        //echo "rule rest :\n";print_r($rules_ret);echo "\n";exit(0);
722
-        return $rules_ret;
723
-    }
724
-    
725
-    /** Add rule match to rule
726
-     *	@param id int : rule id
727
-     *   @param set int : value to set
728
-     */
729
-    protected function add_rule_match($id, $set)
730
-    {
731
-        $db_conn=$this->trapsDB->db_connect_trap();
732
-        $sql="UPDATE ".$this->dbPrefix."rules SET num_match = '".$set."' WHERE (id = '".$id."');";
733
-        if ($db_conn->query($sql) === false) {
734
-            $this->logging->log('Error in update query : ' . $sql,WARN,'');
735
-        }
736
-    }
737
-    
738
-    /** Send SERVICE_CHECK_RESULT with icinga2cmd or API
739
-     *
740
-     * @param string $host
741
-     * @param string $service
742
-     * @param integer $state numerical staus
743
-     * @param string $display
744
-     * @returnn bool true is service check was sent without error
745
-     */
746
-    public function serviceCheckResult($host,$service,$state,$display)
747
-    {
748
-        if ($this->apiUse === false)
749
-        {
750
-            $send = '[' . date('U') .'] PROCESS_SERVICE_CHECK_RESULT;' .
751
-                $host.';' .$service .';' . $state . ';'.$display;
752
-                $this->logging->log( $send." : to : " .$this->icinga2cmd,INFO );
702
+				if (($ret_code2=$db_conn2->query($sql)) === false) {
703
+					$this->logging->log('No result in query : ' . $sql,WARN,'');
704
+					continue;
705
+				}
706
+				$grouphosts=$ret_code2->fetchAll();
707
+				//echo "rule grp :\n";print_r($grouphosts);echo "\n";
708
+				foreach ( $grouphosts as $host)
709
+				{
710
+					//echo $host['ip4']."\n";
711
+					if ($host['ip4']==$ip || $host['ip6']==$ip)
712
+					{
713
+						//echo "Rule added \n";
714
+						$rules_ret[$rule_ret_key]=$rules_all[$key];
715
+						$rules_ret[$rule_ret_key]['host_name']=$host['host_name'];
716
+						$rule_ret_key++;
717
+					}
718
+				}
719
+			}
720
+		}
721
+		//echo "rule rest :\n";print_r($rules_ret);echo "\n";exit(0);
722
+		return $rules_ret;
723
+	}
724
+    
725
+	/** Add rule match to rule
726
+	 *	@param id int : rule id
727
+	 *   @param set int : value to set
728
+	 */
729
+	protected function add_rule_match($id, $set)
730
+	{
731
+		$db_conn=$this->trapsDB->db_connect_trap();
732
+		$sql="UPDATE ".$this->dbPrefix."rules SET num_match = '".$set."' WHERE (id = '".$id."');";
733
+		if ($db_conn->query($sql) === false) {
734
+			$this->logging->log('Error in update query : ' . $sql,WARN,'');
735
+		}
736
+	}
737
+    
738
+	/** Send SERVICE_CHECK_RESULT with icinga2cmd or API
739
+	 *
740
+	 * @param string $host
741
+	 * @param string $service
742
+	 * @param integer $state numerical staus
743
+	 * @param string $display
744
+	 * @returnn bool true is service check was sent without error
745
+	 */
746
+	public function serviceCheckResult($host,$service,$state,$display)
747
+	{
748
+		if ($this->apiUse === false)
749
+		{
750
+			$send = '[' . date('U') .'] PROCESS_SERVICE_CHECK_RESULT;' .
751
+				$host.';' .$service .';' . $state . ';'.$display;
752
+				$this->logging->log( $send." : to : " .$this->icinga2cmd,INFO );
753 753
                 
754
-                // TODO : file_put_contents & fopen (,'w' or 'a') does not work. See why. Or not as using API will be by default....
755
-                exec('echo "'.$send.'" > ' .$this->icinga2cmd);
756
-                return true;
757
-        }
758
-        else
759
-        {
760
-            // Get perfdata if found
761
-            $matches=array();
762
-            if (preg_match('/(.*)\|(.*)/',$display,$matches) == 1)
763
-            {
764
-                $display=$matches[1];
765
-                $perfdata=$matches[2];
766
-            }
767
-            else
768
-            {
769
-                $perfdata='';
770
-            }
754
+				// TODO : file_put_contents & fopen (,'w' or 'a') does not work. See why. Or not as using API will be by default....
755
+				exec('echo "'.$send.'" > ' .$this->icinga2cmd);
756
+				return true;
757
+		}
758
+		else
759
+		{
760
+			// Get perfdata if found
761
+			$matches=array();
762
+			if (preg_match('/(.*)\|(.*)/',$display,$matches) == 1)
763
+			{
764
+				$display=$matches[1];
765
+				$perfdata=$matches[2];
766
+			}
767
+			else
768
+			{
769
+				$perfdata='';
770
+			}
771 771
             
772
-            $api = $this->getAPI();
773
-            $api->setCredentials($this->apiUsername, $this->apiPassword);
774
-            list($retcode,$retmessage)=$api->serviceCheckResult($host,$service,$state,$display,$perfdata);
775
-            if ($retcode == false)
776
-            {
777
-                $this->logging->log( "Error sending result : " .$retmessage,WARN,'');
778
-                return false;
779
-            }
780
-            else
781
-            {
782
-                $this->logging->log( "Sent result : " .$retmessage,INFO );
783
-                return true;
784
-            }
785
-        }
786
-    }
787
-    
788
-    public function getHostByIP($ip)
789
-    {
790
-        $api = $this->getAPI();
791
-        $api->setCredentials($this->apiUsername, $this->apiPassword);
792
-        return $api->getHostByIP($ip);
793
-    }
794
-    
795
-    /** Resolve display.
796
-     *	Changes _OID(<oid>) to value if found or text "<not in trap>"
797
-     *	@param $display string
798
-     *	@return string display
799
-     */
800
-    protected function applyDisplay($display)
801
-    {
802
-        $matches=array();
803
-        while (preg_match('/_OID\(([0-9\.]+)\)/',$display,$matches) == 1)
804
-        {
805
-            $oid=$matches[1];
806
-            $found=0;
807
-            foreach($this->trapDataExt as $val)
808
-            {
809
-                if ($oid == $val->oid)
810
-                {
811
-                    $val->value=preg_replace('/"/','',$val->value);
812
-                    $rep=0;
813
-                    $display=preg_replace('/_OID\('.$oid.'\)/',$val->value,$display,-1,$rep);
814
-                    if ($rep==0)
815
-                    {
816
-                        $this->logging->log("Error in display",WARN,'');
817
-                        return $display;
818
-                    }
819
-                    $found=1;
820
-                    break;
821
-                }
822
-            }
823
-            if ($found==0)
824
-            {
825
-                $display=preg_replace('/_OID\('.$oid.'\)/','<not in trap>',$display,-1,$rep);
826
-                if ($rep==0)
827
-                {
828
-                    $this->logging->log("Error in display",WARN,'');
829
-                    return $display;
830
-                }
831
-            }
832
-        }
833
-        return $display;
834
-    }
835
-    
836
-    /** Match rules for current trap and do action
837
-     */
838
-    public function applyRules()
839
-    {
840
-        $rules = $this->getRules($this->trapData['source_ip'],$this->trapData['trap_oid']);
841
-        
842
-        if ($rules===false || count($rules)==0)
843
-        {
844
-            $this->logging->log('No rules found for this trap',INFO );
845
-            $this->trapData['status']='unknown';
846
-            $this->trapToDb=true;
847
-            return;
848
-        }
849
-        //print_r($rules);
850
-        // Evaluate all rules in sequence
851
-        $this->trapAction=null;
852
-        foreach ($rules as $rule)
853
-        {
772
+			$api = $this->getAPI();
773
+			$api->setCredentials($this->apiUsername, $this->apiPassword);
774
+			list($retcode,$retmessage)=$api->serviceCheckResult($host,$service,$state,$display,$perfdata);
775
+			if ($retcode == false)
776
+			{
777
+				$this->logging->log( "Error sending result : " .$retmessage,WARN,'');
778
+				return false;
779
+			}
780
+			else
781
+			{
782
+				$this->logging->log( "Sent result : " .$retmessage,INFO );
783
+				return true;
784
+			}
785
+		}
786
+	}
787
+    
788
+	public function getHostByIP($ip)
789
+	{
790
+		$api = $this->getAPI();
791
+		$api->setCredentials($this->apiUsername, $this->apiPassword);
792
+		return $api->getHostByIP($ip);
793
+	}
794
+    
795
+	/** Resolve display.
796
+	 *	Changes _OID(<oid>) to value if found or text "<not in trap>"
797
+	 *	@param $display string
798
+	 *	@return string display
799
+	 */
800
+	protected function applyDisplay($display)
801
+	{
802
+		$matches=array();
803
+		while (preg_match('/_OID\(([0-9\.]+)\)/',$display,$matches) == 1)
804
+		{
805
+			$oid=$matches[1];
806
+			$found=0;
807
+			foreach($this->trapDataExt as $val)
808
+			{
809
+				if ($oid == $val->oid)
810
+				{
811
+					$val->value=preg_replace('/"/','',$val->value);
812
+					$rep=0;
813
+					$display=preg_replace('/_OID\('.$oid.'\)/',$val->value,$display,-1,$rep);
814
+					if ($rep==0)
815
+					{
816
+						$this->logging->log("Error in display",WARN,'');
817
+						return $display;
818
+					}
819
+					$found=1;
820
+					break;
821
+				}
822
+			}
823
+			if ($found==0)
824
+			{
825
+				$display=preg_replace('/_OID\('.$oid.'\)/','<not in trap>',$display,-1,$rep);
826
+				if ($rep==0)
827
+				{
828
+					$this->logging->log("Error in display",WARN,'');
829
+					return $display;
830
+				}
831
+			}
832
+		}
833
+		return $display;
834
+	}
835
+    
836
+	/** Match rules for current trap and do action
837
+	 */
838
+	public function applyRules()
839
+	{
840
+		$rules = $this->getRules($this->trapData['source_ip'],$this->trapData['trap_oid']);
841
+        
842
+		if ($rules===false || count($rules)==0)
843
+		{
844
+			$this->logging->log('No rules found for this trap',INFO );
845
+			$this->trapData['status']='unknown';
846
+			$this->trapToDb=true;
847
+			return;
848
+		}
849
+		//print_r($rules);
850
+		// Evaluate all rules in sequence
851
+		$this->trapAction=null;
852
+		foreach ($rules as $rule)
853
+		{
854 854
             
855
-            $host_name=$rule['host_name'];
856
-            $service_name=$rule['service_name'];
855
+			$host_name=$rule['host_name'];
856
+			$service_name=$rule['service_name'];
857 857
             
858
-            $display=$this->applyDisplay($rule['display']);
859
-            $this->trapAction = ($this->trapAction==null)? '' : $this->trapAction . ', ';
860
-            try
861
-            {
862
-                $this->logging->log('Rule to eval : '.$rule['rule'],INFO );
863
-                $evalr=$this->ruleClass->eval_rule($rule['rule'], $this->trapDataExt) ;
864
-                //->eval_rule($rule['rule']);
858
+			$display=$this->applyDisplay($rule['display']);
859
+			$this->trapAction = ($this->trapAction==null)? '' : $this->trapAction . ', ';
860
+			try
861
+			{
862
+				$this->logging->log('Rule to eval : '.$rule['rule'],INFO );
863
+				$evalr=$this->ruleClass->eval_rule($rule['rule'], $this->trapDataExt) ;
864
+				//->eval_rule($rule['rule']);
865 865
                 
866
-                if ($evalr == true)
867
-                {
868
-                    //$this->logging->log('rules OOK: '.print_r($rule),INFO );
869
-                    $action=$rule['action_match'];
870
-                    $this->logging->log('action OK : '.$action,INFO );
871
-                    if ($action >= 0)
872
-                    {
873
-                        if ($this->serviceCheckResult($host_name,$service_name,$action,$display) == false)
874
-                        {
875
-                            $this->trapAction.='Error sending status : check cmd/API';
876
-                        }
877
-                        else
878
-                        {
879
-                            $this->add_rule_match($rule['id'],$rule['num_match']+1);
880
-                            $this->trapAction.='Status '.$action.' to '.$host_name.'/'.$service_name;
881
-                        }
882
-                    }
883
-                    else
884
-                    {
885
-                        $this->add_rule_match($rule['id'],$rule['num_match']+1);
886
-                    }
887
-                    $this->trapToDb=($action==-2)?false:true;
888
-                }
889
-                else
890
-                {
891
-                    //$this->logging->log('rules KOO : '.print_r($rule),INFO );
866
+				if ($evalr == true)
867
+				{
868
+					//$this->logging->log('rules OOK: '.print_r($rule),INFO );
869
+					$action=$rule['action_match'];
870
+					$this->logging->log('action OK : '.$action,INFO );
871
+					if ($action >= 0)
872
+					{
873
+						if ($this->serviceCheckResult($host_name,$service_name,$action,$display) == false)
874
+						{
875
+							$this->trapAction.='Error sending status : check cmd/API';
876
+						}
877
+						else
878
+						{
879
+							$this->add_rule_match($rule['id'],$rule['num_match']+1);
880
+							$this->trapAction.='Status '.$action.' to '.$host_name.'/'.$service_name;
881
+						}
882
+					}
883
+					else
884
+					{
885
+						$this->add_rule_match($rule['id'],$rule['num_match']+1);
886
+					}
887
+					$this->trapToDb=($action==-2)?false:true;
888
+				}
889
+				else
890
+				{
891
+					//$this->logging->log('rules KOO : '.print_r($rule),INFO );
892 892
                     
893
-                    $action=$rule['action_nomatch'];
894
-                    $this->logging->log('action NOK : '.$action,INFO );
895
-                    if ($action >= 0)
896
-                    {
897
-                        if ($this->serviceCheckResult($host_name,$service_name,$action,$display)==false)
898
-                        {
899
-                            $this->trapAction.='Error sending status : check cmd/API';
900
-                        }
901
-                        else
902
-                        {
903
-                            $this->add_rule_match($rule['id'],$rule['num_match']+1);
904
-                            $this->trapAction.='Status '.$action.' to '.$host_name.'/'.$service_name;
905
-                        }
906
-                    }
907
-                    else
908
-                    {
909
-                        $this->add_rule_match($rule['id'],$rule['num_match']+1);
910
-                    }
911
-                    $this->trapToDb=($action==-2)?false:true;
912
-                }
913
-                // Put name in source_name
914
-                if (!isset($this->trapData['source_name']))
915
-                {
916
-                    $this->trapData['source_name']=$rule['host_name'];
917
-                }
918
-                else
919
-                {
920
-                    if (!preg_match('/'.$rule['host_name'].'/',$this->trapData['source_name']))
921
-                    { // only add if not present
922
-                        $this->trapData['source_name'].=','.$rule['host_name'];
923
-                    }
924
-                }
925
-            }
926
-            catch (Exception $e)
927
-            {
928
-                $this->logging->log('Error in rule eval : '.$e->getMessage(),WARN,'');
929
-                $this->trapAction.=' ERR : '.$e->getMessage();
930
-                $this->trapData['status']='error';
931
-            }
893
+					$action=$rule['action_nomatch'];
894
+					$this->logging->log('action NOK : '.$action,INFO );
895
+					if ($action >= 0)
896
+					{
897
+						if ($this->serviceCheckResult($host_name,$service_name,$action,$display)==false)
898
+						{
899
+							$this->trapAction.='Error sending status : check cmd/API';
900
+						}
901
+						else
902
+						{
903
+							$this->add_rule_match($rule['id'],$rule['num_match']+1);
904
+							$this->trapAction.='Status '.$action.' to '.$host_name.'/'.$service_name;
905
+						}
906
+					}
907
+					else
908
+					{
909
+						$this->add_rule_match($rule['id'],$rule['num_match']+1);
910
+					}
911
+					$this->trapToDb=($action==-2)?false:true;
912
+				}
913
+				// Put name in source_name
914
+				if (!isset($this->trapData['source_name']))
915
+				{
916
+					$this->trapData['source_name']=$rule['host_name'];
917
+				}
918
+				else
919
+				{
920
+					if (!preg_match('/'.$rule['host_name'].'/',$this->trapData['source_name']))
921
+					{ // only add if not present
922
+						$this->trapData['source_name'].=','.$rule['host_name'];
923
+					}
924
+				}
925
+			}
926
+			catch (Exception $e)
927
+			{
928
+				$this->logging->log('Error in rule eval : '.$e->getMessage(),WARN,'');
929
+				$this->trapAction.=' ERR : '.$e->getMessage();
930
+				$this->trapData['status']='error';
931
+			}
932 932
             
933
-        }
934
-        if ($this->trapData['status']=='error')
935
-        {
936
-            $this->trapToDb=true; // Always put errors in DB for the use can see
937
-        }
938
-        else
939
-        {
940
-            $this->trapData['status']='done';
941
-        }
942
-    }
943
-    
944
-    /** Add Time a action to rule
945
-     *	@param string $time : time to process to insert in SQL
946
-     */
947
-    public function add_rule_final($time)
948
-    {
949
-        $db_conn=$this->trapsDB->db_connect_trap();
950
-        if ($this->trapAction==null)
951
-        {
952
-            $this->trapAction='No action';
953
-        }
954
-        $sql="UPDATE ".$this->dbPrefix."received SET process_time = '".$time."' , status_detail='".$this->trapAction."'  WHERE (id = '".$this->trapId."');";
955
-        if ($db_conn->query($sql) === false) {
956
-            $this->logging->log('Error in update query : ' . $sql,WARN,'');
957
-        }
958
-    }
959
-    
960
-    /*********** UTILITIES *********************/
961
-    
962
-    /** reset service to OK after time defined in rule
963
-     *	TODO logic is : get all service in error + all rules, see if getting all rules then select services is better
964
-     *	@return integer : not in use
965
-     **/
966
-    public function reset_services()
967
-    {
968
-        // Get all services not in 'ok' state
969
-        $sql_query="SELECT s.service_object_id,
933
+		}
934
+		if ($this->trapData['status']=='error')
935
+		{
936
+			$this->trapToDb=true; // Always put errors in DB for the use can see
937
+		}
938
+		else
939
+		{
940
+			$this->trapData['status']='done';
941
+		}
942
+	}
943
+    
944
+	/** Add Time a action to rule
945
+	 *	@param string $time : time to process to insert in SQL
946
+	 */
947
+	public function add_rule_final($time)
948
+	{
949
+		$db_conn=$this->trapsDB->db_connect_trap();
950
+		if ($this->trapAction==null)
951
+		{
952
+			$this->trapAction='No action';
953
+		}
954
+		$sql="UPDATE ".$this->dbPrefix."received SET process_time = '".$time."' , status_detail='".$this->trapAction."'  WHERE (id = '".$this->trapId."');";
955
+		if ($db_conn->query($sql) === false) {
956
+			$this->logging->log('Error in update query : ' . $sql,WARN,'');
957
+		}
958
+	}
959
+    
960
+	/*********** UTILITIES *********************/
961
+    
962
+	/** reset service to OK after time defined in rule
963
+	 *	TODO logic is : get all service in error + all rules, see if getting all rules then select services is better
964
+	 *	@return integer : not in use
965
+	 **/
966
+	public function reset_services()
967
+	{
968
+		// Get all services not in 'ok' state
969
+		$sql_query="SELECT s.service_object_id,
970 970
 	 UNIX_TIMESTAMP(s.last_check) AS last_check,
971 971
 	s.current_state as state,
972 972
 	v.name1 as host_name,
@@ -974,43 +974,43 @@  discard block
 block discarded – undo
974 974
 	FROM icinga_servicestatus AS s
975 975
     LEFT JOIN icinga_objects as v ON s.service_object_id=v.object_id
976 976
     WHERE s.current_state != 0;";
977
-        $db_conn=$this->trapsDB->db_connect_ido();
978
-        if (($services_db=$db_conn->query($sql_query)) === false) { // set err to 1 to throw exception.
979
-            $this->logging->log('No result in query : ' . $sql_query,ERROR,'');
980
-            return 0;
981
-        }
982
-        $services=$services_db->fetchAll();
983
-        
984
-        // Get all rules
985
-        $sql_query="SELECT host_name, service_name, revert_ok FROM ".$this->dbPrefix."rules where revert_ok != 0;";
986
-        $db_conn2=$this->trapsDB->db_connect_trap();
987
-        if (($rules_db=$db_conn2->query($sql_query)) === false) {
988
-            $this->logging->log('No result in query : ' . $sql_query,ERROR,'');
989
-            return 0;
990
-        }
991
-        $rules=$rules_db->fetchAll();
992
-        
993
-        $now=date('U');
994
-        
995
-        $numreset=0;
996
-        foreach ($rules as $rule)
997
-        {
998
-            foreach ($services as $service)
999
-            {
1000
-                if ($service['service_name'] == $rule['service_name'] &&
1001
-                    $service['host_name'] == $rule['host_name'] &&
1002
-                    ($service['last_check'] + $rule['revert_ok']) < $now)
1003
-                {
1004
-                    $this->serviceCheckResult($service['host_name'],$service['service_name'],0,'Reset service to OK after '.$rule['revert_ok'].' seconds');
1005
-                    $numreset++;
1006
-                }
1007
-            }
1008
-        }
1009
-        echo "\n";
1010
-        echo $numreset . " service(s) reset to OK\n";
1011
-        return 0;
1012
-        
1013
-    }
977
+		$db_conn=$this->trapsDB->db_connect_ido();
978
+		if (($services_db=$db_conn->query($sql_query)) === false) { // set err to 1 to throw exception.
979
+			$this->logging->log('No result in query : ' . $sql_query,ERROR,'');
980
+			return 0;
981
+		}
982
+		$services=$services_db->fetchAll();
983
+        
984
+		// Get all rules
985
+		$sql_query="SELECT host_name, service_name, revert_ok FROM ".$this->dbPrefix."rules where revert_ok != 0;";
986
+		$db_conn2=$this->trapsDB->db_connect_trap();
987
+		if (($rules_db=$db_conn2->query($sql_query)) === false) {
988
+			$this->logging->log('No result in query : ' . $sql_query,ERROR,'');
989
+			return 0;
990
+		}
991
+		$rules=$rules_db->fetchAll();
992
+        
993
+		$now=date('U');
994
+        
995
+		$numreset=0;
996
+		foreach ($rules as $rule)
997
+		{
998
+			foreach ($services as $service)
999
+			{
1000
+				if ($service['service_name'] == $rule['service_name'] &&
1001
+					$service['host_name'] == $rule['host_name'] &&
1002
+					($service['last_check'] + $rule['revert_ok']) < $now)
1003
+				{
1004
+					$this->serviceCheckResult($service['host_name'],$service['service_name'],0,'Reset service to OK after '.$rule['revert_ok'].' seconds');
1005
+					$numreset++;
1006
+				}
1007
+			}
1008
+		}
1009
+		echo "\n";
1010
+		echo $numreset . " service(s) reset to OK\n";
1011
+		return 0;
1012
+        
1013
+	}
1014 1014
     
1015 1015
     
1016 1016
 }
1017 1017
\ No newline at end of file
Please login to merge, or discard this patch.
library/Trapdirector/Plugins/NetworkRule.php 1 patch
Indentation   +83 added lines, -83 removed lines patch added patch discarded remove patch
@@ -21,104 +21,104 @@
 block discarded – undo
21 21
  */
22 22
 class NetworkRule extends PluginTemplate
23 23
 {        
24
-    /** @var string $description Description of plugin */
25
-    public $description='Network functions to use into rules
24
+	/** @var string $description Description of plugin */
25
+	public $description='Network functions to use into rules
26 26
 test test test';
27 27
     
28
-    /** @var array[] $functions Functions of this plugin for rule eval. 
29
-     * If no functions are declared, set to empty array
30
-     * $functions[<name>]['function'] : Name of the function to be called in this class
31
-     * $functions[<name>]['params'] : Description of input parameters of function.
32
-     * $functions[<name>]['description'] : Description. Can be multiline.
33
-    */
34
-    public $functions=array(
35
-        'inNetwork' => array( // The name of the function in rules
36
-            'function'      =>  'isInNetwork', // Name of the function 
37
-            'params'        =>  '<IP to test>,<Network IP>,<Network mask (CIDR)>', // parameters description
38
-            'description'   =>  'Test if IP is in network, ex : __inNetwork(192.168.123.5,192.168.123.0,24) returns true
28
+	/** @var array[] $functions Functions of this plugin for rule eval. 
29
+	 * If no functions are declared, set to empty array
30
+	 * $functions[<name>]['function'] : Name of the function to be called in this class
31
+	 * $functions[<name>]['params'] : Description of input parameters of function.
32
+	 * $functions[<name>]['description'] : Description. Can be multiline.
33
+	 */
34
+	public $functions=array(
35
+		'inNetwork' => array( // The name of the function in rules
36
+			'function'      =>  'isInNetwork', // Name of the function 
37
+			'params'        =>  '<IP to test>,<Network IP>,<Network mask (CIDR)>', // parameters description
38
+			'description'   =>  'Test if IP is in network, ex : __inNetwork(192.168.123.5,192.168.123.0,24) returns true
39 39
 Does not work with IPV6' // Description (can be multiline).
40
-        ),
41
-        'test' => array( // The name of the function in rules
42
-            'function'      =>  'testParam', // Name of the function
43
-            'params'        =>  '<boolean to return as string>', // parameters description
44
-            'description'   =>  'Returns value passed as argument' // Description (can be multiline).
45
-        )
46
-    );
40
+		),
41
+		'test' => array( // The name of the function in rules
42
+			'function'      =>  'testParam', // Name of the function
43
+			'params'        =>  '<boolean to return as string>', // parameters description
44
+			'description'   =>  'Returns value passed as argument' // Description (can be multiline).
45
+		)
46
+	);
47 47
     
48
-    /** @var boolean $catchAllTraps Set to true if all traps will be sent to the plugin NOT IMPLEMENTED */
49
-    public $catchAllTraps=false;
48
+	/** @var boolean $catchAllTraps Set to true if all traps will be sent to the plugin NOT IMPLEMENTED */
49
+	public $catchAllTraps=false;
50 50
     
51
-    /** @var boolean $processTraps Set to true if plugins can handle traps NOT IMPLEMENTED */
52
-    public $processTraps=false;
51
+	/** @var boolean $processTraps Set to true if plugins can handle traps NOT IMPLEMENTED */
52
+	public $processTraps=false;
53 53
     
54
-    /**
55
-     * Constructor. Can throw exceptions on error, but no logging at this point.
56
-     * @throws \Exception
57
-     * @return \Trapdirector\Plugins\NetworkRule
58
-     */
59
-    function __construct()
60
-    {
61
-        $this->name=basename(__FILE__,'.php');
62
-        return $this;
63
-    }
54
+	/**
55
+	 * Constructor. Can throw exceptions on error, but no logging at this point.
56
+	 * @throws \Exception
57
+	 * @return \Trapdirector\Plugins\NetworkRule
58
+	 */
59
+	function __construct()
60
+	{
61
+		$this->name=basename(__FILE__,'.php');
62
+		return $this;
63
+	}
64 64
     
65
-    /**
66
-     * Function called by trapdirector if found in rules
67
-     * Parameters check has to be done in function.
68
-     * @param array $params Function parameters
69
-     * @throws Exception
70
-     * @return bool Evaluation 
71
-     */
72
-    public function isInNetwork(array $params) : bool
73
-    {
74
-        // Check param numbers and thrown exception if not correct.
75
-        if (count($params)!=3)
76
-        {
77
-            throw new Exception('Invalid number of parameters : ' . count($params));
78
-        }
65
+	/**
66
+	 * Function called by trapdirector if found in rules
67
+	 * Parameters check has to be done in function.
68
+	 * @param array $params Function parameters
69
+	 * @throws Exception
70
+	 * @return bool Evaluation 
71
+	 */
72
+	public function isInNetwork(array $params) : bool
73
+	{
74
+		// Check param numbers and thrown exception if not correct.
75
+		if (count($params)!=3)
76
+		{
77
+			throw new Exception('Invalid number of parameters : ' . count($params));
78
+		}
79 79
         
80
-        $ip = $params[0];
81
-        $net = $params[1];
82
-        $masq = $params[2];
80
+		$ip = $params[0];
81
+		$net = $params[1];
82
+		$masq = $params[2];
83 83
         
84 84
         
85
-        $this->log('#'. $ip . '# / #' . $net . '# / #' . $masq,DEBUG);
85
+		$this->log('#'. $ip . '# / #' . $net . '# / #' . $masq,DEBUG);
86 86
         
87
-        $ip2 = ip2long($ip);
88
-        $net2 = ip2long($net);
87
+		$ip2 = ip2long($ip);
88
+		$net2 = ip2long($net);
89 89
         
90
-        if ($ip2 === false )
91
-        {
92
-            $this->log('Invalid IP : #' . $ip.'#',WARN);
93
-            throw new Exception('Invalid IP');
94
-        }
95
-        if ($net2 === false)
96
-        {
97
-            $this->log('Invalid network',WARN);
98
-            throw new Exception('Invalid net');
99
-        }
100
-        if ($masq<1 || $masq > 32)
101
-        {
102
-            $this->log('Invalid masq',WARN);
103
-            throw new Exception('Invalid net masq');
104
-        }
105
-        // $range is in IP/CIDR format eg 127.0.0.1/24
90
+		if ($ip2 === false )
91
+		{
92
+			$this->log('Invalid IP : #' . $ip.'#',WARN);
93
+			throw new Exception('Invalid IP');
94
+		}
95
+		if ($net2 === false)
96
+		{
97
+			$this->log('Invalid network',WARN);
98
+			throw new Exception('Invalid net');
99
+		}
100
+		if ($masq<1 || $masq > 32)
101
+		{
102
+			$this->log('Invalid masq',WARN);
103
+			throw new Exception('Invalid net masq');
104
+		}
105
+		// $range is in IP/CIDR format eg 127.0.0.1/24
106 106
 
107
-        $masq = pow( 2, ( 32 - $masq ) ) - 1;
108
-        $masq = ~ $masq;
109
-        return ( ( $ip2 & $masq ) == ( $net2 & $masq ) );
107
+		$masq = pow( 2, ( 32 - $masq ) ) - 1;
108
+		$masq = ~ $masq;
109
+		return ( ( $ip2 & $masq ) == ( $net2 & $masq ) );
110 110
         
111
-    }
111
+	}
112 112
     
113
-    public function testParam(array $param)
114
-    {
115
-        if (count($param)!=1)
116
-        {
117
-            throw new Exception('Invalid number of parameters : ' . count($param));
118
-        }
119
-        if ($param[0] == 'true') return true;
120
-        return false;
121
-    }
113
+	public function testParam(array $param)
114
+	{
115
+		if (count($param)!=1)
116
+		{
117
+			throw new Exception('Invalid number of parameters : ' . count($param));
118
+		}
119
+		if ($param[0] == 'true') return true;
120
+		return false;
121
+	}
122 122
 }
123 123
 
124 124
 
Please login to merge, or discard this patch.
application/controllers/HelperController.php 1 patch
Indentation   +124 added lines, -124 removed lines patch added patch discarded remove patch
@@ -12,8 +12,8 @@  discard block
 block discarded – undo
12 12
 {
13 13
 	
14 14
 	/** Get host list with filter (IP or name) : host=<filter>
15
-	*	returns in JSON : status=>OK/NOK  hosts=>array of hosts
16
-	*/
15
+	 *	returns in JSON : status=>OK/NOK  hosts=>array of hosts
16
+	 */
17 17
 	public function gethostsAction()
18 18
 	{
19 19
 		$postData=$this->getRequest()->getPost();
@@ -32,8 +32,8 @@  discard block
 block discarded – undo
32 32
 	}
33 33
 	
34 34
 	/** Get hostgroup list with filter (name) : hostgroup=<hostFilter>
35
-	*	returns in JSON : status=>OK/NOK  hosts=>array of hosts
36
-	*/
35
+	 *	returns in JSON : status=>OK/NOK  hosts=>array of hosts
36
+	 */
37 37
 	public function gethostgroupsAction()
38 38
 	{
39 39
 		$postData=$this->getRequest()->getPost();
@@ -52,11 +52,11 @@  discard block
 block discarded – undo
52 52
 	}
53 53
 	
54 54
 	/** Get service list by host name ( host=<host> )
55
-	*	returns in JSON : 
56
-	*		status=>OK/No services found/More than one host matches
57
-	*		services=>array of services (name)
58
-	*		hostid = host object id or -1 if not found.
59
-	*/
55
+	 *	returns in JSON : 
56
+	 *		status=>OK/No services found/More than one host matches
57
+	 *		services=>array of services (name)
58
+	 *		hostid = host object id or -1 if not found.
59
+	 */
60 60
 	public function getservicesAction()
61 61
 	{
62 62
 		$postData=$this->getRequest()->getPost();
@@ -98,11 +98,11 @@  discard block
 block discarded – undo
98 98
 	}
99 99
 	
100 100
 	/** Get service list by host group ( name=<host> )
101
-	*	returns in JSON : 
102
-	*		status=>OK/No services found/More than one host matches
103
-	*		services=>array of services (name)
104
-	*		groupid = group object id or -1 if not found.
105
-	*/
101
+	 *	returns in JSON : 
102
+	 *		status=>OK/No services found/More than one host matches
103
+	 *		services=>array of services (name)
104
+	 *		groupid = group object id or -1 if not found.
105
+	 */
106 106
 	public function gethostgroupservicesAction()
107 107
 	{
108 108
 		$postData=$this->getRequest()->getPost();
@@ -132,10 +132,10 @@  discard block
 block discarded – undo
132 132
 	}
133 133
 
134 134
 	/** Get traps from mib  : entry : mib=<mib>
135
-	*	returns in JSON : 
136
-	*		status=>OK/No mib/Error getting mibs
137
-	*		traps=>array of array( oid -> name)
138
-	*/
135
+	 *	returns in JSON : 
136
+	 *		status=>OK/No mib/Error getting mibs
137
+	 *		traps=>array of array( oid -> name)
138
+	 */
139 139
 	public function gettrapsAction()
140 140
 	{
141 141
 		$postData=$this->getRequest()->getPost();
@@ -155,10 +155,10 @@  discard block
 block discarded – undo
155 155
 	}	
156 156
 
157 157
 	/** Get trap objects from mib  : entry : trap=<oid>
158
-	*	returns in JSON : 
159
-	*		status=>OK/no trap/not found
160
-	*		objects=>array of array( oid -> name, oid->mib)
161
-	*/
158
+	 *	returns in JSON : 
159
+	 *		status=>OK/no trap/not found
160
+	 *		objects=>array of array( oid -> name, oid->mib)
161
+	 */
162 162
 	public function gettrapobjectsAction()
163 163
 	{
164 164
 		$postData=$this->getRequest()->getPost();
@@ -178,8 +178,8 @@  discard block
 block discarded – undo
178 178
 	}	
179 179
 	
180 180
 	/** Get list of all loaded mibs : entry : none
181
-	*	return : array of strings.
182
-	*/
181
+	 *	return : array of strings.
182
+	 */
183 183
 	public function getmiblistAction()
184 184
 	{
185 185
 		try
@@ -194,10 +194,10 @@  discard block
 block discarded – undo
194 194
 	}
195 195
 	
196 196
 	/** Get MIB::Name from OID : entry : oid
197
-	*		status=>OK/No oid/not found
198
-	*		mib=>string
199
-	*		name=>string
200
-	*/	
197
+	 *		status=>OK/No oid/not found
198
+	 *		mib=>string
199
+	 *		name=>string
200
+	 */	
201 201
 	public function translateoidAction()
202 202
 	{
203 203
 		$postData=$this->getRequest()->getPost();
@@ -218,7 +218,7 @@  discard block
 block discarded – undo
218 218
 					'name' => $object['name'],
219 219
 					'type' => $object['type'],
220 220
 					'type_enum' => $object['type_enum'],
221
-				    'description' => $object['description']
221
+					'description' => $object['description']
222 222
 				)
223 223
 			);
224 224
 		}
@@ -226,10 +226,10 @@  discard block
 block discarded – undo
226 226
 	}
227 227
 	
228 228
 	/** Save or execute database purge of <n> days
229
-	*	days=>int 
230
-	*	action=>save/execute
231
-	*	return : status=>OK/Message error
232
-	*/
229
+	 *	days=>int 
230
+	 *	action=>save/execute
231
+	 *	return : status=>OK/Message error
232
+	 */
233 233
 	public function dbmaintenanceAction()
234 234
 	{
235 235
 		
@@ -275,11 +275,11 @@  discard block
 block discarded – undo
275 275
 	}	
276 276
 
277 277
 	/** Save log output to db
278
-	*	destination=>log destination 
279
-	*	file=>file name
280
-	*	level => int 
281
-	*	return : status=>OK/Message error
282
-	*/
278
+	 *	destination=>log destination 
279
+	 *	file=>file name
280
+	 *	level => int 
281
+	 *	return : status=>OK/Message error
282
+	 */
283 283
 	public function logdestinationAction()
284 284
 	{
285 285
 		$postData=$this->getRequest()->getPost();
@@ -298,8 +298,8 @@  discard block
 block discarded – undo
298 298
 			$fileHandler=@fopen($file,'w');
299 299
 			if ($fileHandler == false)
300 300
 			{   // File os note writabe / cannot create
301
-			    $this->_helper->json(array('status'=>'File not writable :  '.$file));
302
-			    return;
301
+				$this->_helper->json(array('status'=>'File not writable :  '.$file));
302
+				return;
303 303
 			}
304 304
 		}
305 305
 		else
@@ -341,33 +341,33 @@  discard block
 block discarded – undo
341 341
 	public function testruleAction()
342 342
 	{
343 343
 	    
344
-	    $postData=$this->getRequest()->getPost();
344
+		$postData=$this->getRequest()->getPost();
345 345
 	   
346
-	    $rule = $this->checkPostVar($postData, 'rule', '.*');
346
+		$rule = $this->checkPostVar($postData, 'rule', '.*');
347 347
 
348
-	    $action = $this->checkPostVar($postData, 'action', 'evaluate');
348
+		$action = $this->checkPostVar($postData, 'action', 'evaluate');
349 349
 
350
-	    if ($action == 'evaluate')
351
-	    {
352
-	        try
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);
357
-	            // Cleanup spaces before eval
358
-	            $rule=$trap->ruleClass->eval_cleanup($rule);
359
-	            // Eval
360
-	            $item=0;
361
-	            $rule=$trap->ruleClass->evaluation($rule,$item);
362
-	        }
363
-	        catch (Exception $e)
364
-	        {
365
-	            $this->_helper->json(array('status'=>'Evaluation error : '.$e->getMessage() ));
366
-	            return;
367
-	        }
368
-	        $return=($rule==true)?'true':'false';
369
-	        $this->_helper->json(array('status'=>'OK', 'message' => $return));
370
-	    }
350
+		if ($action == 'evaluate')
351
+		{
352
+			try
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);
357
+				// Cleanup spaces before eval
358
+				$rule=$trap->ruleClass->eval_cleanup($rule);
359
+				// Eval
360
+				$item=0;
361
+				$rule=$trap->ruleClass->evaluation($rule,$item);
362
+			}
363
+			catch (Exception $e)
364
+			{
365
+				$this->_helper->json(array('status'=>'Evaluation error : '.$e->getMessage() ));
366
+				return;
367
+			}
368
+			$return=($rule==true)?'true':'false';
369
+			$this->_helper->json(array('status'=>'OK', 'message' => $return));
370
+		}
371 371
 	    
372 372
 	}	
373 373
 
@@ -378,35 +378,35 @@  discard block
 block discarded – undo
378 378
 	 */
379 379
 	public function pluginAction()
380 380
 	{
381
-	    $postData=$this->getRequest()->getPost();
381
+		$postData=$this->getRequest()->getPost();
382 382
 	    
383
-	    $pluginName = $this->checkPostVar($postData, 'name', '.*');
383
+		$pluginName = $this->checkPostVar($postData, 'name', '.*');
384 384
 	    
385
-	    $action = $this->checkPostVar($postData, 'action', 'enable|disable');
385
+		$action = $this->checkPostVar($postData, 'action', 'enable|disable');
386 386
 	    
387
-        try
388
-        {
389
-            require_once($this->Module()->getBaseDir() .'/bin/trap_class.php');
390
-            $icingaweb2_etc=$this->Config()->get('config', 'icingaweb2_etc');
391
-            $trap = new Trap($icingaweb2_etc);
392
-            // Enable plugin.
393
-            $action=($action == 'enable') ? true : false;
394
-            $retVal=$trap->pluginClass->enablePlugin($pluginName, $action);
387
+		try
388
+		{
389
+			require_once($this->Module()->getBaseDir() .'/bin/trap_class.php');
390
+			$icingaweb2_etc=$this->Config()->get('config', 'icingaweb2_etc');
391
+			$trap = new Trap($icingaweb2_etc);
392
+			// Enable plugin.
393
+			$action=($action == 'enable') ? true : false;
394
+			$retVal=$trap->pluginClass->enablePlugin($pluginName, $action);
395 395
             
396
-        }
397
-        catch (Exception $e)
398
-        {
399
-            $this->_helper->json(array('status'=>'Action error : '.$e->getMessage() ));
400
-            return;
401
-        }
402
-        if ($retVal === true)
403
-        {
404
-            $this->_helper->json(array('status'=>'OK'));
405
-        }
406
-        else
407
-        {
408
-            $this->_helper->json(array('status'=>'Error, see logs'));
409
-        }
396
+		}
397
+		catch (Exception $e)
398
+		{
399
+			$this->_helper->json(array('status'=>'Action error : '.$e->getMessage() ));
400
+			return;
401
+		}
402
+		if ($retVal === true)
403
+		{
404
+			$this->_helper->json(array('status'=>'OK'));
405
+		}
406
+		else
407
+		{
408
+			$this->_helper->json(array('status'=>'Error, see logs'));
409
+		}
410 410
 	}
411 411
 	
412 412
 	/** Function evaluation
@@ -416,49 +416,49 @@  discard block
 block discarded – undo
416 416
 	 */
417 417
 	public function functionAction()
418 418
 	{
419
-	    $postData=$this->getRequest()->getPost();
419
+		$postData=$this->getRequest()->getPost();
420 420
 	    
421
-	    $functionString = $this->checkPostVar($postData, 'function', '.*');
421
+		$functionString = $this->checkPostVar($postData, 'function', '.*');
422 422
 	    
423
-	    $this->checkPostVar($postData, 'action', 'evaluate');
423
+		$this->checkPostVar($postData, 'action', 'evaluate');
424 424
 	    
425
-	    // Only one action possible for now, no tests on action.
426
-	    try
427
-	    {
428
-	        require_once($this->Module()->getBaseDir() .'/bin/trap_class.php');
429
-	        $icingaweb2Etc=$this->Config()->get('config', 'icingaweb2_etc');
430
-	        $trap = new Trap($icingaweb2Etc);
431
-	        // load all plugins in case tested function is not enabled.
432
-	        $trap->pluginClass->registerAllPlugins(false);
433
-	        // Clean all spaces
434
-	        $functionString = $trap->ruleClass->eval_cleanup($functionString);
435
-	        // Eval functions
436
-	        $result = $trap->pluginClass->evaluateFunctionString($functionString);	        
437
-	    }
438
-	    catch (Exception $e)
439
-	    {
440
-	        $this->_helper->json(array('status'=>'Action error : '.$e->getMessage() ));
441
-	        return;
442
-	    }
425
+		// Only one action possible for now, no tests on action.
426
+		try
427
+		{
428
+			require_once($this->Module()->getBaseDir() .'/bin/trap_class.php');
429
+			$icingaweb2Etc=$this->Config()->get('config', 'icingaweb2_etc');
430
+			$trap = new Trap($icingaweb2Etc);
431
+			// load all plugins in case tested function is not enabled.
432
+			$trap->pluginClass->registerAllPlugins(false);
433
+			// Clean all spaces
434
+			$functionString = $trap->ruleClass->eval_cleanup($functionString);
435
+			// Eval functions
436
+			$result = $trap->pluginClass->evaluateFunctionString($functionString);	        
437
+		}
438
+		catch (Exception $e)
439
+		{
440
+			$this->_helper->json(array('status'=>'Action error : '.$e->getMessage() ));
441
+			return;
442
+		}
443 443
 	    
444
-        $result = ($result === true)?'True':'False';
445
-        $this->_helper->json(array('status'=>'OK','message' => $result));
444
+		$result = ($result === true)?'True':'False';
445
+		$this->_helper->json(array('status'=>'OK','message' => $result));
446 446
 	}
447 447
 
448
-    /**************   Utilities **********************/
448
+	/**************   Utilities **********************/
449 449
 
450 450
 	private function checkPostVar(array $postData,string $postVar, string $validRegexp) : string
451 451
 	{
452
-	    if (!isset ($postData[$postVar]))
453
-	    {
454
-	        $this->_helper->json(array('status'=>'No ' . $postVar));
455
-	        return '';
456
-	    }
457
-	    if (preg_match('/'.$validRegexp.'/', $postData[$postVar]) != 1)
458
-	    {
459
-	        $this->_helper->json(array('status'=>'Unknown ' . $postVar . ' value '.$postData[$postVar]));
460
-	        return '';
461
-	    }
462
-	    return $postData[$postVar];
452
+		if (!isset ($postData[$postVar]))
453
+		{
454
+			$this->_helper->json(array('status'=>'No ' . $postVar));
455
+			return '';
456
+		}
457
+		if (preg_match('/'.$validRegexp.'/', $postData[$postVar]) != 1)
458
+		{
459
+			$this->_helper->json(array('status'=>'Unknown ' . $postVar . ' value '.$postData[$postVar]));
460
+			return '';
461
+		}
462
+		return $postData[$postVar];
463 463
 	}
464 464
 }
Please login to merge, or discard this patch.