From c2f812db16fafafd421913d8712912999e7dbc73 Mon Sep 17 00:00:00 2001
From: Alejandro Gallardo Escobar <alex@artica.es>
Date: Tue, 23 Sep 2014 18:05:44 +0200
Subject: [PATCH] Big improvement on the SNMP statistics section

* pandora_console/operation/snmpconsole/snmp_view.php: Removed the code of
	the statistics section.

* pandora_console/operation/snmpconsole/snmp_statistics.php: Added file.
	Statistics section for SNMP.
---
 .../operation/snmpconsole/snmp_statistics.php | 209 +++++
 .../operation/snmpconsole/snmp_view.php       | 789 ++++++++----------
 2 files changed, 563 insertions(+), 435 deletions(-)
 create mode 100644 pandora_console/operation/snmpconsole/snmp_statistics.php

diff --git a/pandora_console/operation/snmpconsole/snmp_statistics.php b/pandora_console/operation/snmpconsole/snmp_statistics.php
new file mode 100644
index 0000000000..d5d6cc8500
--- /dev/null
+++ b/pandora_console/operation/snmpconsole/snmp_statistics.php
@@ -0,0 +1,209 @@
+<?php
+
+// Pandora FMS - http://pandorafms.com
+// ==================================================
+// Copyright (c) 2005-2010 Artica Soluciones Tecnologicas
+// Please see http://pandorafms.org for full contribution list
+
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// as published by the Free Software Foundation for version 2.
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+
+// Load global vars
+global $config;
+
+enterprise_include ("operation/snmpconsole/snmp_view.php");
+include_once($config['homedir'] . '/include/functions_graph.php');
+require_once($config['homedir'] . "/include/functions_agents.php");
+require_once($config['homedir'] . "/include/functions_snmp.php");
+
+check_login ();
+
+// ACL
+if (! check_acl ($config['id_user'], 0, "AR")) {
+	db_pandora_audit("ACL Violation",
+		"Trying to access SNMP Console");
+	require ("general/noaccess.php");
+	exit;
+}
+
+// Read parameters
+$refr = (int)get_parameter("refr", 0);
+
+
+// Page header and tabs
+
+// Fullscreen
+$fullscreen = array();
+if ($config["pure"]) {
+	$fullscreen['text'] = '<a target="_top" href="index.php?sec=estado&sec2=operation/snmpconsole/snmp_statistics&pure=0&refr=' . $refr . '">' .
+		html_print_image("images/normal_screen.png", true, array("title" => __('Normal screen')))  . '</a>';
+}
+else {
+	$fullscreen['text'] = '<a target="_top" href="index.php?sec=estado&sec2=operation/snmpconsole/snmp_statistics&pure=1&refr=' . $refr . '">' .
+		html_print_image("images/full_screen.png", true, array("title" => __('Full screen'))) . '</a>';
+}
+
+// List
+$list = array();
+$list['text'] = '<a href="index.php?sec=estado&sec2=operation/snmpconsole/snmp_view&pure=' . $config["pure"] . '&refr=' . $refr . '">' . 
+	html_print_image("images/op_snmp.png", true, array ("title" => __('List'))) .'</a>';
+
+// Statistics (This file)
+$statistics = array();
+$statistics['active'] = true;
+$statistics['text'] = '<a href="index.php?sec=estado&sec2=operation/snmpconsole/snmp_statistics&pure=' . $config["pure"] . '&refr=' . $refr . '">' . 
+	html_print_image("images/op_reporting.png", true, array ("title" => __('Statistics'))) .'</a>';
+
+// Header
+ui_print_page_header(__("SNMP Console"), "images/op_snmp.png", false,
+	"", false, array($fullscreen, $list, $statistics));
+
+// Retrieving the data
+
+$user_groups = users_get_groups($config['id_user'], "AR", false);
+$user_groups_str = '0';
+if (!empty($user_groups)) {
+	$user_groups_str = implode(",", array_keys($user_groups));
+}
+
+$last_month_timestamp = date("Y-m-d H:i:s", time() - SECONDS_1MONTH);
+
+$sql_traps_generated = "SELECT %s, COUNT(id_trap) AS num
+						FROM ttrap
+						WHERE timestamp >= '%s'
+							AND (source = ''
+								OR source NOT IN (SELECT direccion FROM tagente)
+								OR source IN (SELECT direccion
+											  FROM tagente
+											  WHERE id_grupo IN (%s)))
+						GROUP BY %s
+						ORDER BY num DESC, timestamp DESC
+						LIMIT 25";
+
+$sql_traps_generated_by_source = sprintf($sql_traps_generated, "source", $last_month_timestamp, $user_groups_str, "source");
+$sql_traps_generated_by_oid = sprintf($sql_traps_generated, "oid", $last_month_timestamp, $user_groups_str, "oid");
+
+$traps_generated_by_source = db_get_all_rows_sql($sql_traps_generated_by_source);
+$traps_generated_by_oid = db_get_all_rows_sql($sql_traps_generated_by_oid);
+
+// No traps 
+if (empty($traps_generated_by_source) || empty($traps_generated_by_oid)) {
+	echo '<div class="nf">'.__('There are no SNMP traps in database').'</div>';
+	return;
+}
+
+$water_mark = array('file' => $config['homedir'] .  "/images/logo_vertical_water.png",
+		'url' => ui_get_full_url("/images/logo_vertical_water.png"));
+
+// By SOURCE
+$table_source = new StdClass();
+$table_source->width = '100%';
+$table_source->head[] = __("Traps received by source") . " - " . sprintf(__('Top %d'), 25);
+$table_source->head_colspan[] = 2;
+$table_source->headstyle[] = "background-color: #82b92e";
+$table_source->size = array();
+$table_source->size['table'] = '50%';
+$table_source->size['graph'] = '50%';
+$table_source->data = array();
+
+$table_source_row = array();
+
+$table_source_data = new StdClass();
+$table_source_data->width = '100%';
+$table_source_data->head = array();
+$table_source_data->head['source'] = __('Source IP');
+$table_source_data->head['num'] = __('Number');
+$table_source_data->data = array();
+
+$table_source_graph_data = array();
+
+foreach ($traps_generated_by_source as $trap) {
+	$row = array();
+
+	$agent = agents_get_agent_with_ip($trap['source']);
+	if ($agent === false) {
+		$row['source'] = '<a href="index.php?sec=estado&sec2=godmode/agentes/configurar_agente&new_agent=1&direccion='.$trap["source"].'" title="'.__('Create agent').'">'.$trap["source"].'</a>';
+	}
+	else {
+		$agent_id = $agent["id_agente"];
+		$agent_name = ui_print_truncate_text($agent["nombre"], "agent_medium", true, true, true, '[&hellip;]', '');
+		$row['source'] = "<a href=\"index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente=$agent_id\" title=\"".__('View agent details')."\">";
+		$row['source'] .= "<strong>$agent_name</strong></a>";
+	}
+	$row['num'] = (int) $trap['num'];
+
+	$table_source_data->data[] = $row;
+
+	$table_source_graph_data[$trap["source"]] = (int) $trap["num"];
+}
+
+$table_source_row['table'] = html_print_table($table_source_data, true);
+unset($table_source_data);
+
+if (empty($table_source_graph_data))
+	$table_source_graph = graph_nodata_image();
+else
+	$table_source_graph = pie3d_graph($config['flash_charts'], $table_source_graph_data, 400, 550, __("Other"),
+		'', $water_mark, $config['fontpath'], $config['font_size'], 1);
+
+$table_source_row['graph'] = $table_source_graph;
+
+$table_source->data[] = $table_source_row;
+
+html_print_table($table_source);
+unset($table_source);
+
+// By OID
+$table_oid = new StdClass();
+$table_oid->width = '100%';
+$table_oid->head[] = __("Traps received by OID") . " - " . sprintf(__('Top %d'), 25);
+$table_oid->head_colspan[] = 2;
+$table_oid->headstyle[] = "background-color: #82b92e";
+$table_oid->size = array();
+$table_oid->size['table'] = '50%';
+$table_oid->size['graph'] = '50%';
+$table_oid->data = array();
+
+$table_oid_row = array();
+
+$table_oid_data = new StdClass();
+$table_oid_data->width = '100%';
+$table_oid_data->head = array();
+$table_oid_data->head['oid'] = __('Trap OID');
+$table_oid_data->head['num'] = __('Number');
+$table_oid_data->data = array();
+
+$table_oid_graph_data = array();
+
+foreach ($traps_generated_by_oid as $trap) {
+	$table_oid_data->data[] = array(
+			'oid' => $trap['oid'],
+			'num' => (int) $trap['num']
+		);
+
+	$table_oid_graph_data[$trap["oid"]] = (int) $trap["num"];
+}
+
+$table_oid_row['table'] = html_print_table($table_oid_data, true);
+unset($table_oid_data);
+
+if (empty($table_oid_graph_data))
+	$table_oid_graph = graph_nodata_image();
+else
+	$table_oid_graph = pie3d_graph($config['flash_charts'], $table_oid_graph_data, 400, 550, __("Other"),
+		'', $water_mark, $config['fontpath'], $config['font_size'], 1);
+
+$table_oid_row['graph'] = $table_oid_graph;
+
+$table_oid->data[] = $table_oid_row;
+
+html_print_table($table_oid);
+unset($table_oid);
+
+?>
\ No newline at end of file
diff --git a/pandora_console/operation/snmpconsole/snmp_view.php b/pandora_console/operation/snmpconsole/snmp_view.php
index 8e16bd4993..c2372746ce 100644
--- a/pandora_console/operation/snmpconsole/snmp_view.php
+++ b/pandora_console/operation/snmpconsole/snmp_view.php
@@ -40,7 +40,6 @@ $offset = (int) get_parameter ('offset',0);
 $trap_type = (int) get_parameter ('trap_type', -1);
 $group_by = (int)get_parameter('group_by', 0);
 $refr = (int)get_parameter("refr", 0);
-$tab = (string) get_parameter("tab");
 
 $user_groups = users_get_groups ($config['id_user'],"AR", false);
 $str_user_groups = '';
@@ -65,22 +64,11 @@ $url = "index.php?sec=estado&" .
 	"trap_type=" . $trap_type . "&" .
 	"group_by=" .$group_by;
 
-switch ($tab) {
-	case 'statistics':
-		$statistics['active'] = true;
-		break;
-	
-	default:
-		$list['active'] = true;
-		break;
-}
-$statistics['text'] = '<a href="' . $url . '&pure=' . $config["pure"] . '&refr=' . $refr . '&tab=statistics">' . 
+$statistics['text'] = '<a href="index.php?sec=estado&sec2=operation/snmpconsole/snmp_statistics&pure=' . $config["pure"] . '&refr=' . $refr . '">' . 
 	html_print_image("images/op_reporting.png", true, array ("title" => __('Statistics'))) .'</a>';
 $list['text'] = '<a href="' . $url . '&pure=' . $config["pure"] . '&refr=' . $refr . '">' . 
 	html_print_image("images/op_snmp.png", true, array ("title" => __('List'))) .'</a>';
-
-if ($tab)
-	$url .= "&tab=$tab";
+$list['active'] = true;
 
 if ($config["pure"]) {
 	$fullscreen['text'] = '<a target="_top" href="'.$url.'&pure=0&refr=' . $refr . '">' . html_print_image("images/normal_screen.png", true, array("title" => __('Normal screen')))  . '</a>';
@@ -354,441 +342,372 @@ ui_toggle($filter, __('Toggle filter(s)'));
 
 unset ($table);
 
-if ($tab == '') {
-
-	$traps = db_get_all_rows_sql($sql);
-	$trapcount = (int) db_get_value_sql($sql_count);
-
-	// No traps 
-	if (empty ($traps)) {
-		echo '<div class="nf">'.__('There are no SNMP traps in database').'</div>';
-		return;
-	}
-
-	if (($config['dbtype'] == 'oracle') && ($traps !== false)) {
-		for ($i=0; $i < count($traps); $i++) {
-			unset($traps[$i]['rnum']);
-		}
-	}
-
-	$url_snmp = "index.php?" .
-		"sec=snmpconsole&" .
-		"sec2=operation/snmpconsole/snmp_view&" .
-		"filter_severity=" . $filter_severity . "&" .
-		"filter_fired=" . $filter_fired . "&" .
-		"filter_status=" . $filter_status . "&" .
-		"refr=" . ((int)get_parameter('refr', 0)) . "&" .
-		"pure=" . $config["pure"] . "&" .
-		"group_by=" . $group_by . "&" .
-		"free_search_string=" . $free_search_string;
-
-	$urlPagination = $url_snmp . "&pagination=" . $pagination . "&offset=" . $offset;
-
-	ui_pagination ($trapcount, $urlPagination, $offset, $pagination);
-
-	echo '<form name="eventtable" method="POST" action="' . $url_snmp . '">';
-
-	$table->cellpadding = 4;
-	$table->cellspacing = 4;
-	$table->width = '99%';
-	$table->class = "databox";
-	$table->head = array ();
-	$table->size = array ();
-	$table->data = array ();
-	$table->align = array ();
-
-	$table->head[0] = __('Status');
-	$table->align[0] = "center";
-	$table->size[0] = '5%';
-
-	$table->head[1] = __('SNMP Agent');
-	$table->align[1] = "center";
-	$table->size[1] = '15%';
-
-	$table->head[2] = __('OID');
-	$table->align[2] = "center";
-	$table->size[2] = '18%';
-
-	if ($group_by) {
-		$table->head[3] = __('Count');
-		$table->align[3] = "center";
-		$table->size[3] = '5%';
-	}
-
-	$table->head[4] = __('Value');
-	$table->align[4] = "center";
-	$table->size[4] = '10%';
-
-	$table->head[5] = __('User ID');
-	$table->align[5] = "center";
-	$table->size[5] = '10%';
-
-	$table->head[6] = __('Timestamp');
-	$table->align[6] = "center";
-	$table->size[6] = '10%';
-
-	$table->head[7] = __('Alert');
-	$table->align[7] = "center";
-	$table->size[7] = '5%';
-
-	$table->head[8] = __('Action');
-	$table->align[8] = "center";
-	$table->size[8] = '10%';
-
-	$table->head[9] = html_print_checkbox_extended ("allbox", 1, false, false, "javascript:CheckAll();", 'class="chk" title="'.__('All').'"', true);
-	$table->align[9] = "center";
-	$table->size[9] = '5%';
-
-	$table->style[8] = "background: #F3F3F3; color: #111 !important;";
-
-	// Skip offset records
-	$idx = 0;
-	if ($traps !== false) {
-
-		foreach ($traps as $trap) {
-			$data = array ();
-			if (empty($trap["description"])){
-				$trap["description"]="";
-			}
-			$severity = enterprise_hook ('get_severity', array ($trap));
-			if ($severity === ENTERPRISE_NOT_HOOK) {
-				$severity = $trap["alerted"] == 1 ? $trap["priority"] : 1;
-			}
-			
-			//Status
-			if ($trap["status"] == 0) {
-				$data[0] = html_print_image("images/pixel_red.png", true, array("title" => __('Not validated'), "width" => "20", "height" => "20"));
-			}
-			else {
-				$data[0] = html_print_image("images/pixel_green.png", true, array("title" => __('Validated'), "width" => "20", "height" => "20"));
-			}
-			
-			// Agent matching source address
-			$table->cellclass[$idx][1] = get_priority_class ($severity);
-			$agent = agents_get_agent_with_ip ($trap['source']);
-			if ($agent === false) {
-				if (! check_acl ($config["id_user"], 0, "AR")) {
-					continue;
-				}
-				$data[1] = '<a href="index.php?sec=estado&sec2=godmode/agentes/configurar_agente&new_agent=1&direccion='.$trap["source"].'" title="'.__('Create agent').'">'.$trap["source"].'</a>';
-			}
-			else {
-				if (! check_acl ($config["id_user"], $agent["id_grupo"], "AR")) {
-					continue;
-				}
-				$data[1] = '<a href="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente='.$agent["id_agente"].'" title="'.__('View agent details').'">';
-				$data[1] .= '<strong>'.$agent["nombre"].'</strong></a>';
-			}
-			
-			//OID
-			$table->cellclass[$idx][2] = get_priority_class ($severity);
-			$data[2] = '<a href="javascript: toggleVisibleExtendedInfo(' . $trap["id_trap"] . ');">' . (empty($trap["oid"]) ? __('N/A') : $trap["oid"]) .'</a>';
-			
-			//Count
-			if ($group_by) {
-				$sql = "SELECT * FROM ttrap WHERE 1=1 
-						$where_without_group
-						AND oid='".$trap['oid']."' 
-						AND source='".$trap['source']."'";
-				$group_traps = db_get_all_rows_sql($sql);
-				$count_group_traps = count($group_traps);
-				$table->cellclass[$idx][3] = get_priority_class ($severity);
-				$data[3] = '<strong>'.$count_group_traps.'</strong></a>';
-			}
-			//Value
-			$table->cellclass[$idx][4] = get_priority_class ($severity);
-			if (empty ($trap["value"])) {
-				$data[4] = __('N/A');
-			}
-			else {
-				$data[4] = ui_print_truncate_text($trap["value"], GENERIC_SIZE_TEXT, false);
-			}
-			
-			//User
-			$table->cellclass[$idx][5] = get_priority_class ($severity);
-			if (!empty ($trap["status"])) {
-				$data[5] = '<a href="index.php?sec=workspace&sec2=operation/users/user_edit&ver='.$trap["id_usuario"].'">'.substr ($trap["id_usuario"], 0, 8).'</a>';
-				if (!empty($trap["id_usuario"]))
-					$data[5] .= ui_print_help_tip(get_user_fullname($trap["id_usuario"]), true);
-			}
-			else {
-				$data[5] = '--';
-			}
-			
-			// Timestamp
-			$table->cellclass[$idx][6] = get_priority_class ($severity);
-			$data[6] = '<span title="'.$trap["timestamp"].'">';
-			$data[6] .= ui_print_timestamp ($trap["timestamp"], true);
-			$data[6] .= '</span>';
-			
-			// Use alert severity if fired
-			if (!empty ($trap["alerted"])) {
-				$data[7] = html_print_image("images/pixel_yellow.png", true, array("width" => "20", "height" => "20", "border" => "0", "title" => __('Alert fired'))); 		
-			}
-			else {
-				$data[7] = html_print_image("images/pixel_gray.png", true, array("width" => "20", "height" => "20", "border" => "0", "title" => __('Alert not fired')));
-			}
-			
-			//Actions
-			$data[8] = "";
-			
-			if (empty ($trap["status"]) && check_acl ($config["id_user"], 0, "IW")) {
-				$data[8] .= '<a href="' . $url_snmp . '&check='.$trap["id_trap"].'">' . html_print_image("images/ok.png", true, array("border" => '0', "title" => __('Validate'))) . '</a> ';
-			}
-			if ($trap['source'] == '') {
-				$is_admin = db_get_value('is_admin', 'tusuario', 'id_user',$config['id_user']);
-				if ($is_admin) {
-					$data[8] .= '<a href="' . $url_snmp . '&delete='.$trap["id_trap"].'&offset='.$offset.'" onClick="javascript:return confirm(\''.__('Are you sure?').'\')">' . html_print_image("images/cross.png", true, array("border" => "0", "title" => __('Delete'))) . '</a> ';
-				}
-			} else {
-				$agent_trap_group = db_get_value('id_grupo', 'tagente', 'nombre', $trap['source']);
-				if ((check_acl ($config["id_user"], $agent_trap_group, "AW"))) {
-					$data[8] .= '<a href="' . $url_snmp . '&delete='.$trap["id_trap"].'&offset='.$offset.'" onClick="javascript:return confirm(\''.__('Are you sure?').'\')">' . html_print_image("images/cross.png", true, array("border" => "0", "title" => __('Delete'))) . '</a> ';
-				}
-			}
-
-			$data[8] .= '<a href="javascript: toggleVisibleExtendedInfo(' . $trap["id_trap"] . ');">' . html_print_image("images/eye.png", true, array("alt" => __('Show more'), "title" => __('Show more'))) .'</a>';
-	                $data[8] .= enterprise_hook ('editor_link', array ($trap));
-
-			
-			$data[9] = html_print_checkbox_extended ("snmptrapid[]", $trap["id_trap"], false, false, '', 'class="chk"', true);
-			
-			array_push ($table->data, $data);
-			
-			//Hiden file for description
-			$string = '<table style="border:solid 1px #D3D3D3;" width="90%" class="toggle">
-				<tr>
-					<td align="left" valign="top" width="15%" ><b>' . __('Custom data:') . '</b></td>
-					<td align="left" >';
-			
-			if ($group_by) {
-				$new_url = "index.php?sec=snmpconsole&sec2=operation/snmpconsole/snmp_view&" .
-				"filter_severity=" . $filter_severity . "&" .
-				"filter_fired=" . $filter_fired . "&" .
-				"filter_status=" . $filter_status . "&" .
-				"refr=" . ((int)get_parameter('refr', 0)) . "&" .
-				"pure=" . $config["pure"] . "&" .
-				"group_by=0&" .
-				"free_search_string=" . $free_search_string;
-				
-				$string .= '<a href='.$new_url.'>'.__('See more details').'</a>';
-			} else {	
-				// Print binding vars separately
-				$binding_vars = explode ("\t", $trap['oid_custom']);
-				foreach ($binding_vars as $var) {
-					$string .= $var . "<br/>";
-				}
-			}
-			
-			$string .= '</td>
-				</tr>
-				<tr>
-					<td align="left" valign="top">' . '<b>' . __('OID:') . '</td>
-					<td align="left"> ' . $trap['oid'] . '</td>
-				</tr>';
-			
-			if ($trap["description"] != "") {
-				$string .= '<tr>
-						<td align="left" valign="top">' . '<b>' . __('Description:') . '</td>
-						<td align="left">' . $trap['description'] . '</td>
-					</tr>';
-			}
-			
-			if ($trap["type"] != "") {
-				$trap_types = array(-1 => __('None'), 0 => __('Cold start (0)'), 1 => __('Warm start (1)'), 2 => __('Link down (2)'), 3 => __('Link up (3)'), 4 => __('Authentication failure (4)'), 5 => __('Other'));
-				
-				switch ($trap["type"]) {
-					case -1:
-						$desc_trap_type = __('None');
-						break;
-					case 0:
-						$desc_trap_type = __('Cold start (0)');
-						break;
-					case 1:
-						$desc_trap_type = __('Warm start (1)');
-						break;
-					case 2:
-						$desc_trap_type = __('Link down (2)');
-						break;
-					case 3:
-						$desc_trap_type = __('Link up (3)');
-						break;
-					case 4:
-						$desc_trap_type = __('Authentication failure (4)');
-						break;
-					default:
-						$desc_trap_type = __('Other');
-						break;
-				}
-				$string .= '<tr><td align="left" valign="top">' . '<b>' . __('Type:') . '</td><td align="left">' . $desc_trap_type . '</td></tr>';
-			}
-			
-			if ($group_by) {
-				$sql = "SELECT * FROM ttrap WHERE 1=1 
-						$where_without_group
-						AND oid='".$trap['oid']."' 
-						AND source='".$trap['source']."'";
-				$group_traps = db_get_all_rows_sql($sql);
-				$count_group_traps = count($group_traps);
-				
-				$sql = "SELECT timestamp FROM ttrap WHERE 1=1 
-						$where_without_group
-						AND oid='".$trap['oid']."' 
-						AND source='".$trap['source']."'
-						ORDER BY `timestamp` DESC";		
-				$last_trap = db_get_value_sql($sql);
-				
-				$sql = "SELECT timestamp FROM ttrap WHERE 1=1
-						$where_without_group
-						AND oid='".$trap['oid']."' 
-						AND source='".$trap['source']."'
-						ORDER BY `timestamp` ASC";
-				$first_trap = db_get_value_sql($sql);
-				
-				$string .= '<tr>
-						<td align="left" valign="top">' . '<b>' . __('Count:') . '</td>
-						<td align="left">' . $count_group_traps . '</td>
-					</tr>';
-				$string .= '<tr>
-						<td align="left" valign="top">' . '<b>' . __('First trap:') . '</td>
-						<td align="left">' . $first_trap . '</td>
-					</tr>';
-				$string .= '<tr>
-						<td align="left" valign="top">' . '<b>' . __('Last trap:') . '</td>
-						<td align="left">' . $last_trap . '</td>
-					</tr>';
-
-			}
-			$string .=  '</table>';
-			
-			$data = array($string); //$data = array($trap['description']);
-			$idx++;
-			$table->rowclass[$idx] = 'trap_info_' . $trap['id_trap'];
-			$table->colspan[$idx][0] = 10;
-			$table->rowstyle[$idx] = 'display: none;';
-			array_push ($table->data, $data);
-			
-			$idx++;
-		}
-	}
-
-	// No matching traps
-	if ($idx == 0) {
-		echo '<div class="nf">' . __('No matching traps found') . '</div>';
-	}
-	else {
-		html_print_table ($table);
-	}
-
-	unset ($table);
-
-	echo '<div style="width:98%; text-align:right;">';
-	if (check_acl ($config["id_user"], 0, "IW")) {
-		html_print_submit_button (__('Validate'), "updatebt", false, 'class="sub ok"');
-	}
-
-	if (check_acl ($config['id_user'], 0, "IM")) {
-		echo "&nbsp;";
-		html_print_submit_button (__('Delete'), "deletebt", false, 'class="sub delete" onClick="javascript:return confirm(\''.__('Are you sure?').'\')"');
-	}
-	echo "</div></form>";
-
-
-	echo '<div style="float:left; padding-left:30px; line-height: 17px; vertical-align: top; width:120px;">';
-	echo '<h3>' . __('Status') . '</h3>';
-	echo html_print_image("images/pixel_green.png", true, array("width" => "20", "height" => "20")) . ' - ' . __('Validated');
-	echo '<br />';
-	echo html_print_image("images/pixel_red.png", true, array("width" => "20", "height" => "20")) . ' - ' . __('Not validated');
-	echo '</div>';
-	echo '<div style="float:left; padding-left:30px; line-height: 17px; vertical-align: top; width:120px;">';
-	echo '<h3>' . __('Alert') . '</h3>';
-	echo html_print_image("images/pixel_yellow.png", true, array("width" => "20", "height" => "20")) . ' - ' .__('Fired');
-	echo '<br />';
-	echo html_print_image("images/pixel_gray.png", true, array("width" => "20", "height" => "20")) . ' - ' . __('Not fired');
-	echo '</div>';
-	echo '<div style="float:left; padding-left:30px; line-height: 19px; vertical-align: top; width:120px;">';
-	echo '<h3>' . __('Action') . '</h3>';
-	echo html_print_image("images/ok.png", true) . ' - ' .__('Validate');
-	echo '<br />';
-	echo html_print_image("images/cross.png", true) . ' - ' . __('Delete');
-	echo '</div>';
-	echo '<div style="float:left; padding-left:30px; line-height: 17px; vertical-align: top; width:120px;">';
-	echo '<h3>'.__('Legend').'</h3>';
-	foreach (get_priorities () as $num => $name) {
-		echo '<span class="'.get_priority_class ($num).'">'.$name.'</span>';
-		echo '<br />';
-	}
-	echo '</div>';
-	echo '<div style="clear:both;">&nbsp;</div>';
+$traps = db_get_all_rows_sql($sql);
+$trapcount = (int) db_get_value_sql($sql_count);
 
+// No traps 
+if (empty ($traps)) {
+	echo '<div class="nf">'.__('There are no SNMP traps in database').'</div>';
+	return;
 }
-else {
 
-	$traps = db_get_all_rows_sql($sql_all);
-	$trapcount = (int) db_get_value_sql($sql_count);
-
-	// No traps 
-	if (empty ($traps)) {
-		echo '<div class="nf">'.__('There are no SNMP traps in database').'</div>';
-		return;
+if (($config['dbtype'] == 'oracle') && ($traps !== false)) {
+	for ($i=0; $i < count($traps); $i++) {
+		unset($traps[$i]['rnum']);
 	}
+}
 
-	if (($config['dbtype'] == 'oracle') && ($traps !== false)) {
-		for ($i=0; $i < count($traps); $i++) {
-			unset($traps[$i]['rnum']);
-		}
-	}
+$url_snmp = "index.php?" .
+	"sec=snmpconsole&" .
+	"sec2=operation/snmpconsole/snmp_view&" .
+	"filter_severity=" . $filter_severity . "&" .
+	"filter_fired=" . $filter_fired . "&" .
+	"filter_status=" . $filter_status . "&" .
+	"refr=" . ((int)get_parameter('refr', 0)) . "&" .
+	"pure=" . $config["pure"] . "&" .
+	"group_by=" . $group_by . "&" .
+	"free_search_string=" . $free_search_string;
 
-	include_once($config['homedir'] . '/include/functions_graph.php');
+$urlPagination = $url_snmp . "&pagination=" . $pagination . "&offset=" . $offset;
+
+ui_pagination ($trapcount, $urlPagination, $offset, $pagination);
+
+echo '<form name="eventtable" method="POST" action="' . $url_snmp . '">';
+
+$table->cellpadding = 4;
+$table->cellspacing = 4;
+$table->width = '99%';
+$table->class = "databox";
+$table->head = array ();
+$table->size = array ();
+$table->data = array ();
+$table->align = array ();
+
+$table->head[0] = __('Status');
+$table->align[0] = "center";
+$table->size[0] = '5%';
+
+$table->head[1] = __('SNMP Agent');
+$table->align[1] = "center";
+$table->size[1] = '15%';
+
+$table->head[2] = __('OID');
+$table->align[2] = "center";
+$table->size[2] = '18%';
+
+if ($group_by) {
+	$table->head[3] = __('Count');
+	$table->align[3] = "center";
+	$table->size[3] = '5%';
+}
+
+$table->head[4] = __('Value');
+$table->align[4] = "center";
+$table->size[4] = '10%';
+
+$table->head[5] = __('User ID');
+$table->align[5] = "center";
+$table->size[5] = '10%';
+
+$table->head[6] = __('Timestamp');
+$table->align[6] = "center";
+$table->size[6] = '10%';
+
+$table->head[7] = __('Alert');
+$table->align[7] = "center";
+$table->size[7] = '5%';
+
+$table->head[8] = __('Action');
+$table->align[8] = "center";
+$table->size[8] = '10%';
+
+$table->head[9] = html_print_checkbox_extended ("allbox", 1, false, false, "javascript:CheckAll();", 'class="chk" title="'.__('All').'"', true);
+$table->align[9] = "center";
+$table->size[9] = '5%';
+
+$table->style[8] = "background: #F3F3F3; color: #111 !important;";
+
+// Skip offset records
+$idx = 0;
+if ($traps !== false) {
 
-	$data_aux = array();
 	foreach ($traps as $trap) {
-		$source = $trap['source'];
-		$oid = $trap['oid'];
-
-		if (!isset($data_aux[$source]))
-			$data_aux[$source] = array();
-
-		if (!isset($data_aux[$source][$oid]))
-			$data_aux[$source][$oid] = array('num' => 1, 'text' => '');
-		else {
-			$data_aux[$source][$oid]['num']++;
-			if (empty($data_aux[$source][$oid]['text']))
-				$data_aux[$source][$oid]['text'] = $trap['text'];
+		$data = array ();
+		if (empty($trap["description"])){
+			$trap["description"]="";
+		}
+		$severity = enterprise_hook ('get_severity', array ($trap));
+		if ($severity === ENTERPRISE_NOT_HOOK) {
+			$severity = $trap["alerted"] == 1 ? $trap["priority"] : 1;
 		}
 		
-	}
-
-	$id = -1;
-	$data = array();
-
-	if (!empty($traps)) {
-		$data['name'] = __("Traps received by source");
-		$data['children'] = array();
-
-		foreach ($data_aux as $source => $oid_data) {
-			$children = array();
-			$children['id'] = $id++;
-			$children['name'] = $source;
-			$children['children'] = array();
-			foreach ($oid_data as $oid => $values) {
-				$children_data = array();
-				$children_data['id'] = $id++;
-				$children_data['name'] = $oid;
-				$children_data['value'] = $values['num'];
-				$children_data['tooltip_content'] = '';
-				if (!empty($values['text']))
-					$children_data['tooltip_content'] .= "<b>" . $values['text'] . "</b><br>";
-				$children_data['tooltip_content'] .= sprintf(__('%d traps received from this source with this oid'), $values['num']);
-				$children['children'][] = $children_data;
-			}
-			$data['children'][] = $children;
+		//Status
+		if ($trap["status"] == 0) {
+			$data[0] = html_print_image("images/pixel_red.png", true, array("title" => __('Not validated'), "width" => "20", "height" => "20"));
 		}
+		else {
+			$data[0] = html_print_image("images/pixel_green.png", true, array("title" => __('Validated'), "width" => "20", "height" => "20"));
+		}
+		
+		// Agent matching source address
+		$table->cellclass[$idx][1] = get_priority_class ($severity);
+		$agent = agents_get_agent_with_ip ($trap['source']);
+		if ($agent === false) {
+			if (! check_acl ($config["id_user"], 0, "AR")) {
+				continue;
+			}
+			$data[1] = '<a href="index.php?sec=estado&sec2=godmode/agentes/configurar_agente&new_agent=1&direccion='.$trap["source"].'" title="'.__('Create agent').'">'.$trap["source"].'</a>';
+		}
+		else {
+			if (! check_acl ($config["id_user"], $agent["id_grupo"], "AR")) {
+				continue;
+			}
+			$data[1] = '<a href="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente='.$agent["id_agente"].'" title="'.__('View agent details').'">';
+			$data[1] .= '<strong>'.$agent["nombre"].'</strong></a>';
+		}
+		
+		//OID
+		$table->cellclass[$idx][2] = get_priority_class ($severity);
+		$data[2] = '<a href="javascript: toggleVisibleExtendedInfo(' . $trap["id_trap"] . ');">' . (empty($trap["oid"]) ? __('N/A') : $trap["oid"]) .'</a>';
+		
+		//Count
+		if ($group_by) {
+			$sql = "SELECT * FROM ttrap WHERE 1=1 
+					$where_without_group
+					AND oid='".$trap['oid']."' 
+					AND source='".$trap['source']."'";
+			$group_traps = db_get_all_rows_sql($sql);
+			$count_group_traps = count($group_traps);
+			$table->cellclass[$idx][3] = get_priority_class ($severity);
+			$data[3] = '<strong>'.$count_group_traps.'</strong></a>';
+		}
+		//Value
+		$table->cellclass[$idx][4] = get_priority_class ($severity);
+		if (empty ($trap["value"])) {
+			$data[4] = __('N/A');
+		}
+		else {
+			$data[4] = ui_print_truncate_text($trap["value"], GENERIC_SIZE_TEXT, false);
+		}
+		
+		//User
+		$table->cellclass[$idx][5] = get_priority_class ($severity);
+		if (!empty ($trap["status"])) {
+			$data[5] = '<a href="index.php?sec=workspace&sec2=operation/users/user_edit&ver='.$trap["id_usuario"].'">'.substr ($trap["id_usuario"], 0, 8).'</a>';
+			if (!empty($trap["id_usuario"]))
+				$data[5] .= ui_print_help_tip(get_user_fullname($trap["id_usuario"]), true);
+		}
+		else {
+			$data[5] = '--';
+		}
+		
+		// Timestamp
+		$table->cellclass[$idx][6] = get_priority_class ($severity);
+		$data[6] = '<span title="'.$trap["timestamp"].'">';
+		$data[6] .= ui_print_timestamp ($trap["timestamp"], true);
+		$data[6] .= '</span>';
+		
+		// Use alert severity if fired
+		if (!empty ($trap["alerted"])) {
+			$data[7] = html_print_image("images/pixel_yellow.png", true, array("width" => "20", "height" => "20", "border" => "0", "title" => __('Alert fired'))); 		
+		}
+		else {
+			$data[7] = html_print_image("images/pixel_gray.png", true, array("width" => "20", "height" => "20", "border" => "0", "title" => __('Alert not fired')));
+		}
+		
+		//Actions
+		$data[8] = "";
+		
+		if (empty ($trap["status"]) && check_acl ($config["id_user"], 0, "IW")) {
+			$data[8] .= '<a href="' . $url_snmp . '&check='.$trap["id_trap"].'">' . html_print_image("images/ok.png", true, array("border" => '0', "title" => __('Validate'))) . '</a> ';
+		}
+		if ($trap['source'] == '') {
+			$is_admin = db_get_value('is_admin', 'tusuario', 'id_user',$config['id_user']);
+			if ($is_admin) {
+				$data[8] .= '<a href="' . $url_snmp . '&delete='.$trap["id_trap"].'&offset='.$offset.'" onClick="javascript:return confirm(\''.__('Are you sure?').'\')">' . html_print_image("images/cross.png", true, array("border" => "0", "title" => __('Delete'))) . '</a> ';
+			}
+		} else {
+			$agent_trap_group = db_get_value('id_grupo', 'tagente', 'nombre', $trap['source']);
+			if ((check_acl ($config["id_user"], $agent_trap_group, "AW"))) {
+				$data[8] .= '<a href="' . $url_snmp . '&delete='.$trap["id_trap"].'&offset='.$offset.'" onClick="javascript:return confirm(\''.__('Are you sure?').'\')">' . html_print_image("images/cross.png", true, array("border" => "0", "title" => __('Delete'))) . '</a> ';
+			}
+		}
+
+		$data[8] .= '<a href="javascript: toggleVisibleExtendedInfo(' . $trap["id_trap"] . ');">' . html_print_image("images/eye.png", true, array("alt" => __('Show more'), "title" => __('Show more'))) .'</a>';
+                $data[8] .= enterprise_hook ('editor_link', array ($trap));
+
+		
+		$data[9] = html_print_checkbox_extended ("snmptrapid[]", $trap["id_trap"], false, false, '', 'class="chk"', true);
+		
+		array_push ($table->data, $data);
+		
+		//Hiden file for description
+		$string = '<table style="border:solid 1px #D3D3D3;" width="90%" class="toggle">
+			<tr>
+				<td align="left" valign="top" width="15%" ><b>' . __('Custom data:') . '</b></td>
+				<td align="left" >';
+		
+		if ($group_by) {
+			$new_url = "index.php?sec=snmpconsole&sec2=operation/snmpconsole/snmp_view&" .
+			"filter_severity=" . $filter_severity . "&" .
+			"filter_fired=" . $filter_fired . "&" .
+			"filter_status=" . $filter_status . "&" .
+			"refr=" . ((int)get_parameter('refr', 0)) . "&" .
+			"pure=" . $config["pure"] . "&" .
+			"group_by=0&" .
+			"free_search_string=" . $free_search_string;
+			
+			$string .= '<a href='.$new_url.'>'.__('See more details').'</a>';
+		} else {	
+			// Print binding vars separately
+			$binding_vars = explode ("\t", $trap['oid_custom']);
+			foreach ($binding_vars as $var) {
+				$string .= $var . "<br/>";
+			}
+		}
+		
+		$string .= '</td>
+			</tr>
+			<tr>
+				<td align="left" valign="top">' . '<b>' . __('OID:') . '</td>
+				<td align="left"> ' . $trap['oid'] . '</td>
+			</tr>';
+		
+		if ($trap["description"] != "") {
+			$string .= '<tr>
+					<td align="left" valign="top">' . '<b>' . __('Description:') . '</td>
+					<td align="left">' . $trap['description'] . '</td>
+				</tr>';
+		}
+		
+		if ($trap["type"] != "") {
+			$trap_types = array(-1 => __('None'), 0 => __('Cold start (0)'), 1 => __('Warm start (1)'), 2 => __('Link down (2)'), 3 => __('Link up (3)'), 4 => __('Authentication failure (4)'), 5 => __('Other'));
+			
+			switch ($trap["type"]) {
+				case -1:
+					$desc_trap_type = __('None');
+					break;
+				case 0:
+					$desc_trap_type = __('Cold start (0)');
+					break;
+				case 1:
+					$desc_trap_type = __('Warm start (1)');
+					break;
+				case 2:
+					$desc_trap_type = __('Link down (2)');
+					break;
+				case 3:
+					$desc_trap_type = __('Link up (3)');
+					break;
+				case 4:
+					$desc_trap_type = __('Authentication failure (4)');
+					break;
+				default:
+					$desc_trap_type = __('Other');
+					break;
+			}
+			$string .= '<tr><td align="left" valign="top">' . '<b>' . __('Type:') . '</td><td align="left">' . $desc_trap_type . '</td></tr>';
+		}
+		
+		if ($group_by) {
+			$sql = "SELECT * FROM ttrap WHERE 1=1 
+					$where_without_group
+					AND oid='".$trap['oid']."' 
+					AND source='".$trap['source']."'";
+			$group_traps = db_get_all_rows_sql($sql);
+			$count_group_traps = count($group_traps);
+			
+			$sql = "SELECT timestamp FROM ttrap WHERE 1=1 
+					$where_without_group
+					AND oid='".$trap['oid']."' 
+					AND source='".$trap['source']."'
+					ORDER BY `timestamp` DESC";		
+			$last_trap = db_get_value_sql($sql);
+			
+			$sql = "SELECT timestamp FROM ttrap WHERE 1=1
+					$where_without_group
+					AND oid='".$trap['oid']."' 
+					AND source='".$trap['source']."'
+					ORDER BY `timestamp` ASC";
+			$first_trap = db_get_value_sql($sql);
+			
+			$string .= '<tr>
+					<td align="left" valign="top">' . '<b>' . __('Count:') . '</td>
+					<td align="left">' . $count_group_traps . '</td>
+				</tr>';
+			$string .= '<tr>
+					<td align="left" valign="top">' . '<b>' . __('First trap:') . '</td>
+					<td align="left">' . $first_trap . '</td>
+				</tr>';
+			$string .= '<tr>
+					<td align="left" valign="top">' . '<b>' . __('Last trap:') . '</td>
+					<td align="left">' . $last_trap . '</td>
+				</tr>';
+
+		}
+		$string .=  '</table>';
+		
+		$data = array($string); //$data = array($trap['description']);
+		$idx++;
+		$table->rowclass[$idx] = 'trap_info_' . $trap['id_trap'];
+		$table->colspan[$idx][0] = 10;
+		$table->rowstyle[$idx] = 'display: none;';
+		array_push ($table->data, $data);
+		
+		$idx++;
 	}
-	
-	echo graph_snmp_traps_treemap($data, 'auto', 500);
 }
 
+// No matching traps
+if ($idx == 0) {
+	echo '<div class="nf">' . __('No matching traps found') . '</div>';
+}
+else {
+	html_print_table ($table);
+}
+
+unset ($table);
+
+echo '<div style="width:98%; text-align:right;">';
+if (check_acl ($config["id_user"], 0, "IW")) {
+	html_print_submit_button (__('Validate'), "updatebt", false, 'class="sub ok"');
+}
+
+if (check_acl ($config['id_user'], 0, "IM")) {
+	echo "&nbsp;";
+	html_print_submit_button (__('Delete'), "deletebt", false, 'class="sub delete" onClick="javascript:return confirm(\''.__('Are you sure?').'\')"');
+}
+echo "</div></form>";
+
+
+echo '<div style="float:left; padding-left:30px; line-height: 17px; vertical-align: top; width:120px;">';
+echo '<h3>' . __('Status') . '</h3>';
+echo html_print_image("images/pixel_green.png", true, array("width" => "20", "height" => "20")) . ' - ' . __('Validated');
+echo '<br />';
+echo html_print_image("images/pixel_red.png", true, array("width" => "20", "height" => "20")) . ' - ' . __('Not validated');
+echo '</div>';
+echo '<div style="float:left; padding-left:30px; line-height: 17px; vertical-align: top; width:120px;">';
+echo '<h3>' . __('Alert') . '</h3>';
+echo html_print_image("images/pixel_yellow.png", true, array("width" => "20", "height" => "20")) . ' - ' .__('Fired');
+echo '<br />';
+echo html_print_image("images/pixel_gray.png", true, array("width" => "20", "height" => "20")) . ' - ' . __('Not fired');
+echo '</div>';
+echo '<div style="float:left; padding-left:30px; line-height: 19px; vertical-align: top; width:120px;">';
+echo '<h3>' . __('Action') . '</h3>';
+echo html_print_image("images/ok.png", true) . ' - ' .__('Validate');
+echo '<br />';
+echo html_print_image("images/cross.png", true) . ' - ' . __('Delete');
+echo '</div>';
+echo '<div style="float:left; padding-left:30px; line-height: 17px; vertical-align: top; width:120px;">';
+echo '<h3>'.__('Legend').'</h3>';
+foreach (get_priorities () as $num => $name) {
+	echo '<span class="'.get_priority_class ($num).'">'.$name.'</span>';
+	echo '<br />';
+}
+echo '</div>';
+echo '<div style="clear:both;">&nbsp;</div>';
+
+
 ?>
 
 <script language="JavaScript" type="text/javascript">