From c73d901873c3cdd2a11d018241c2d37f806d94a4 Mon Sep 17 00:00:00 2001 From: Alejandro Gallardo Escobar Date: Tue, 30 Sep 2014 15:56:24 +0200 Subject: [PATCH 1/2] Added a new report item which shows network interfaces information by agents of the selected group * pandora_console/godmode/reporting/reporting_builder.item_editor.php: Added the item 'network_interfaces_report'. * pandora_console/include/functions_agents.php: Added the function "agents_get_network_interfaces" to get a list of network interfaces information by agent. * pandora_console/include/functions_custom_graphs.php: Added the 'ttl' parameter to the function "custom_graphs_print". * pandora_console/include/functions_reporting.php: Added the item 'network_interfaces_report' to the function "reporting_render_report_html_item". Added the function "reporting_network_interfaces_table". * pandora_console/include/functions_reports.php: Added the item 'network_interfaces_report' to the function "reports_get_report_types". --- .../reporting_builder.item_editor.php | 11 ++ pandora_console/include/functions_agents.php | 155 ++++++++++++++++- .../include/functions_custom_graphs.php | 4 +- .../include/functions_reporting.php | 156 +++++++++++++++++- pandora_console/include/functions_reports.php | 2 + 5 files changed, 324 insertions(+), 4 deletions(-) diff --git a/pandora_console/godmode/reporting/reporting_builder.item_editor.php b/pandora_console/godmode/reporting/reporting_builder.item_editor.php index 9ddc186460..47be14041e 100644 --- a/pandora_console/godmode/reporting/reporting_builder.item_editor.php +++ b/pandora_console/godmode/reporting/reporting_builder.item_editor.php @@ -125,6 +125,7 @@ switch ($action) { case 'top_n': case 'exception': case 'general': + case 'network_interfaces_report': $get_data_editor = true; break; default: @@ -420,6 +421,11 @@ switch ($action) { $description = $item['description']; $group = $item['id_group']; break; + case 'network_interfaces_report': + $description = $item['description']; + $group = $item['id_group']; + $period = $item['period']; + break; case 'top_n': $description = $item['description']; $period = $item['period']; @@ -2147,6 +2153,11 @@ function chooseType() { $("#row_servers").show(); $("#row_description").show(); break; + case 'network_interfaces_report': + $("#row_group").show(); + $("#row_description").show(); + $("#row_period").show(); + break; case 'top_n': $("#row_description").show(); $("#row_period").show(); diff --git a/pandora_console/include/functions_agents.php b/pandora_console/include/functions_agents.php index 203a1aacfc..97dabbe645 100644 --- a/pandora_console/include/functions_agents.php +++ b/pandora_console/include/functions_agents.php @@ -2144,4 +2144,157 @@ function agents_update_gis($idAgente, $latitude, $longitude, $altitude, return (bool)$return; } -?> + +/** + * Returns a list with network interfaces data by agent + * + * @param array Agents with the columns 'id_agente', 'nombre' and 'id_grupo'. + * @param mixed A filter to search the agents if the first parameter is false. + * + * @return array A list of network interfaces information by agents. + */ +function agents_get_network_interfaces ($agents = false, $agents_filter = false) { + if ($agents === false) { + $filter = false; + if ($agents_filter !== false) { + $filter = $agents_filter; + } + $fields = array( + 'id_agente', + 'nombre', + 'id_grupo' + ); + $agents = agents_get_agents($filter, $fields); + } + + $ni_by_agents = array(); + + foreach ($agents as $agent) { + $agent_id = $agent['id_agente']; + $agent_group_id = $agent['id_grupo']; + $agent_name = $agent['nombre']; + $agent_interfaces = array(); + + $columns = array( + "id_agente_modulo", + "nombre", + "descripcion", + "ip_target" + ); + $filter = array( + "id_agente" => $agent_id, + "id_tipo_modulo" => (int) db_get_value("id_tipo", "ttipo_modulo", "nombre", "remote_snmp_proc"), + "disabled" => 0 + ); + $modules = agents_get_modules($agent_id, $columns, $filter, true, false); + + if (!empty($modules)) { + $interfaces = array(); + + foreach ($modules as $module) { + $module_name = (string) $module['nombre']; + + // Trying to get the interface name from the module name + if (preg_match ("/_(.+)$/", $module_name, $matches)) { + if ($matches[1]) { + $interface_name = $matches[1]; + $interface_name_escaped = str_replace("/", "\/", $interface_name); + + if (!isset($interfaces[$interface_name]) + || (isset($interfaces[$interface_name]) + && preg_match ("/^ifOperStatus_$interface_name_escaped$/i", $module_name, $matches))) { + $interfaces[$interface_name] = $module; + } + + } + } + } + unset($modules); + + foreach ($interfaces as $interface_name => $module) { + $interface_name_escaped = str_replace("/", "\/", $interface_name); + + $module_id = $module['id_agente_modulo']; + $module_name = $module['nombre']; + $module_description = $module['descripcion']; + $db_status = modules_get_agentmodule_status($module_id); + $module_value = modules_get_last_value ($module_id); + modules_get_status($module_id, $db_status, $module_value, $status, $title); + $status_image = ui_print_status_image($status, $title, true); + + $ip_target = ""; + if (isset($module['ip_target']) && !empty($module['ip_target'])) { + $ip_target = $module['ip_target']; + } + // Trying to get something like an IP from the description + else if (preg_match ("/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/", $module_description, $matches) + || preg_match ("/(((?=(?>.*?(::))(?!.+\3)))\3?|([\dA-F]{1,4}(\3|:?)|\2))(?4){5}((?4){2}|(25[0-5]| + (2[0-4]|1\d|[1-9])?\d)(\.(?7)){3})/i", $module_description, $matches)) { + if ($matches[0]) { + $ip_target = $matches[0]; + } + } + $mac = ""; + // Trying to get something like a mac from the description + if (preg_match ("/([0-9a-f]{1,2}[\.:-]){5}([0-9a-f]{1,2})/i", $module_description, $matches)) { + if ($matches[0]) { + $mac = $matches[0]; + } + } + + // Get the ifInOctets and ifOutOctets modules of the interface + $columns = array( + "id_agente_modulo", + "nombre" + ); + $interface_traffic_modules = agents_get_modules($agent_id, $columns, "nombre LIKE 'if%Octets_$interface_name'"); + if (!empty($interface_traffic_modules) && count($interface_traffic_modules) >= 2) { + $interface_traffic_modules_aux = array('in' => '', 'out' => ''); + foreach ($interface_traffic_modules as $interface_traffic_module) { + $interface_name_escaped = str_replace("/", "\/", $interface_name); + if (preg_match ("/^if(.+)Octets_$interface_name_escaped$/i", $interface_traffic_module['nombre'], $matches)) { + if (strtolower($matches[1]) == 'in') { + $interface_traffic_modules_aux['in'] = $interface_traffic_module['id_agente_modulo']; + } + elseif (strtolower($matches[1]) == 'out') { + $interface_traffic_modules_aux['out'] = $interface_traffic_module['id_agente_modulo']; + } + } + } + if (!empty($interface_traffic_modules_aux['in']) && !empty($interface_traffic_modules_aux['out'])) { + $interface_traffic_modules = $interface_traffic_modules_aux; + } + else { + $interface_traffic_modules = false; + } + } + else { + $interface_traffic_modules = false; + } + + $agent_interfaces[$interface_name] = array(); + $agent_interfaces[$interface_name]['status_image'] = $status_image; + $agent_interfaces[$interface_name]['status_module_id'] = $module_id; + $agent_interfaces[$interface_name]['status_module_name'] = $module_name; + $agent_interfaces[$interface_name]['ip'] = $ip_target; + $agent_interfaces[$interface_name]['mac'] = $mac; + + if ($interface_traffic_modules !== false) { + $agent_interfaces[$interface_name]['traffic'] = array(); + $agent_interfaces[$interface_name]['traffic']['in'] = $interface_traffic_modules['in']; + $agent_interfaces[$interface_name]['traffic']['out'] = $interface_traffic_modules['out']; + } + } + } + + if (!empty($agent_interfaces)) { + $ni_by_agents[$agent_id] = array(); + $ni_by_agents[$agent_id]['name'] = $agent_name; + $ni_by_agents[$agent_id]['group'] = $agent_group_id; + $ni_by_agents[$agent_id]['interfaces'] = $agent_interfaces; + } + } + + return $ni_by_agents; +} +?> \ No newline at end of file diff --git a/pandora_console/include/functions_custom_graphs.php b/pandora_console/include/functions_custom_graphs.php index f0e03d935a..039af0c502 100644 --- a/pandora_console/include/functions_custom_graphs.php +++ b/pandora_console/include/functions_custom_graphs.php @@ -163,7 +163,7 @@ function custom_graphs_print($id_graph, $height, $width, $period, $stacked = null, $return = false, $date = 0, $only_image = false, $background_color = 'white', $modules_param = array(), $homeurl = '', $name_list = array(), $unit_list = array(), $show_last = true, - $show_max = true, $show_min = true, $show_avg = true) { + $show_max = true, $show_min = true, $show_avg = true, $ttl = 1) { global $config; @@ -222,7 +222,7 @@ function custom_graphs_print($id_graph, $height, $width, $period, $date, $only_image, $homeurl, - 1, + $ttl, false, false, $background_color, diff --git a/pandora_console/include/functions_reporting.php b/pandora_console/include/functions_reporting.php index f8f8d5a2df..ecd0be2eb2 100644 --- a/pandora_console/include/functions_reporting.php +++ b/pandora_console/include/functions_reporting.php @@ -5051,6 +5051,9 @@ function reporting_render_report_html_item ($content, $table, $report, $mini = f "; + break; + case 'network_interfaces_report': + reporting_network_interfaces_table($content, $report, $mini, $item_title, $table); break; case 'general': if (empty($item_title)) { @@ -7567,4 +7570,155 @@ function reporting_tiny_stats ($counts_info, $return = false, $type = 'agent', $ echo $out; } } -?> + + +function reporting_network_interfaces_table ($content, $report, $mini, $item_title = "", &$table = null, &$pdf = null) { + global $config; + + include_once($config['homedir'] . "/include/functions_custom_graphs.php"); + + if (empty($item_title)) { + $group_name = groups_get_name($content['id_group']); + $item_title = __('Network interfaces') . " - " . sprintf(__('Group "%s"'), $group_name); + } + + $is_html = $table !== null; + $is_pdf = $pdf !== null; + + $ttl = $is_pdf ? 2 : 1; + + $graph_width = 600; + $graph_height = 200; + + $datetime = $report['datetime']; + $period = $content['period']; + + if ($is_pdf) { + pdf_header_content($pdf, $content, $report, $item_title, false, $content["description"]); + } + else if ($is_html) { + reporting_header_content($mini, $content, $report, $table, $item_title); + + //RUNNING + $table->style[1] = 'text-align: right'; + + // Put description at the end of the module (if exists) + $table->colspan[0][1] = 2; + $next_row = 1; + if ($content["description"] != "") { + $table->colspan[$next_row][0] = 3; + $next_row++; + $data_desc = array(); + $data_desc[0] = $content["description"]; + array_push ($table->data, $data_desc); + } + } + + $network_interfaces_by_agents = agents_get_network_interfaces(false, array('id_grupo' => $content['id_group'])); + + if (empty($network_interfaces_by_agents)) { + $data = array(); + $table->colspan[$next_row][0] = 3; + $next_row++; + $data[0] = __('The group has no agents or none of the agents has any network interface'); + array_push ($table->data, $data); + $slas = array(); + return; + } + else { + foreach ($network_interfaces_by_agents as $agent_id => $agent) { + + $table_agent = new StdCLass(); + $table_agent->width = '100%'; + $table_agent->data = array(); + $table_agent->head = array(); + $table_agent->head[0] = $agent['name']; + $table_agent->headstyle = array(); + $table_agent->headstyle[0] = 'font-size: 16px;'; + $table_agent->style[0] = 'text-align: center'; + + if ($is_pdf) { + $table_agent->class = 'table_sla table_beauty'; + $table_agent->headstyle[0] = 'background: #373737; color: #FFF; display: table-cell; font-size: 16px; border: 1px solid grey'; + } + + $table_agent->data['interfaces'] = ""; + + foreach ($agent['interfaces'] as $interface_name => $interface) { + $table_interface = new StdClass(); + $table_interface->width = '100%'; + $table_interface->data = array(); + $table_interface->rowstyle = array(); + $table_interface->head = array(); + $table_interface->cellstyle = array(); + $table_interface->title = $interface_name; + $table_interface->head['ip'] = __('IP'); + $table_interface->head['mac'] = __('Mac'); + $table_interface->head['status'] = __('Actual status'); + $table_interface->style['ip'] = 'text-align: left'; + $table_interface->style['mac'] = 'text-align: left'; + $table_interface->style['status'] = 'width: 150px; text-align: center'; + + if ($is_pdf) { + $table_interface->class = 'table_sla table_beauty'; + $table_interface->titlestyle = 'background: #373737; color: #FFF; display: table-cell; font-size: 12px; border: 1px solid grey'; + + $table_interface->headstyle['ip'] = 'text-align: left; background: #666; color: #FFF; display: table-cell; font-size: 11px; border: 1px solid grey'; + $table_interface->headstyle['mac'] = 'text-align: left; background: #666; color: #FFF; display: table-cell; font-size: 11px; border: 1px solid grey'; + $table_interface->headstyle['status'] = 'background: #666; color: #FFF; display: table-cell; font-size: 11px; border: 1px solid grey'; + + $table_interface->style['ip'] = 'text-align: left; display: table-cell; font-size: 10px;'; + $table_interface->style['mac'] = 'text-align: left; display: table-cell; font-size: 10px;'; + $table_interface->style['status'] = 'text-align: center; display: table-cell; font-size: 10px;'; + } + + $data = array(); + $data['ip'] = !empty($interface['ip']) ? $interface['ip'] : "--"; + $data['mac'] = !empty($interface['mac']) ? $interface['mac'] : "--"; + $data['status'] = $interface['status_image']; + $table_interface->data['data'] = $data; + + if (!empty($interface['traffic'])) { + + $only_image = !(bool)$config['flash_charts'] || $is_pdf ? true : false; + + $graph = custom_graphs_print(0, + $graph_height, + $graph_width, + $period, + null, + true, + $date, + $only_image, + 'white', + array_values($interface['traffic']), + $config['homeurl'], + array_keys($interface['traffic']), + array_fill(0, count($interface['traffic']),"bytes/s"), + false, + true, + true, + true, + $ttl); + + $table_interface->data['graph'] = $graph; + $table_interface->colspan['graph'][0] = count($table_interface->head); + $table_interface->cellstyle['graph'][0] = 'text-align: center;'; + } + + $table_agent->data['interfaces'] .= html_print_table($table_interface, true); + $table_agent->colspan[$interface_name][0] = 3; + } + + if ($is_html) { + $table->data[$agent_id] = html_print_table($table_agent, true); + $table->colspan[$agent_id][0] = 3; + } + else if ($is_pdf) { + $html = html_print_table($table_agent, true); + $pdf->addHTML($html); + } + } + } +} +?> \ No newline at end of file diff --git a/pandora_console/include/functions_reports.php b/pandora_console/include/functions_reports.php index f793255524..6209de8f5f 100644 --- a/pandora_console/include/functions_reports.php +++ b/pandora_console/include/functions_reports.php @@ -574,6 +574,8 @@ function reports_get_report_types ($template = false, $not_editor = false) { } $types['top_n'] = array('optgroup' => __('Grouped'), 'name' => __('Top n')); + $types['network_interfaces_report'] = array('optgroup' => __('Grouped'), + 'name' => __('Network interfaces')); From 18caec5590e2d8faf927dc52cd1b755fa4a1d931 Mon Sep 17 00:00:00 2001 From: Alejandro Gallardo Escobar Date: Tue, 30 Sep 2014 16:28:52 +0200 Subject: [PATCH 2/2] Minor update on the function "reporting_network_interfaces_table" --- pandora_console/include/functions_reporting.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandora_console/include/functions_reporting.php b/pandora_console/include/functions_reporting.php index ecd0be2eb2..0578a73612 100644 --- a/pandora_console/include/functions_reporting.php +++ b/pandora_console/include/functions_reporting.php @@ -7632,7 +7632,7 @@ function reporting_network_interfaces_table ($content, $report, $mini, $item_tit $table_agent->width = '100%'; $table_agent->data = array(); $table_agent->head = array(); - $table_agent->head[0] = $agent['name']; + $table_agent->head[0] = sprintf(__("Agent '%s'"), $agent['name']); $table_agent->headstyle = array(); $table_agent->headstyle[0] = 'font-size: 16px;'; $table_agent->style[0] = 'text-align: center'; @@ -7651,7 +7651,7 @@ function reporting_network_interfaces_table ($content, $report, $mini, $item_tit $table_interface->rowstyle = array(); $table_interface->head = array(); $table_interface->cellstyle = array(); - $table_interface->title = $interface_name; + $table_interface->title = sprintf(__("Interface '%s' throughput graph"), $interface_name); $table_interface->head['ip'] = __('IP'); $table_interface->head['mac'] = __('Mac'); $table_interface->head['status'] = __('Actual status');