diff --git a/pandora_console/godmode/reporting/visual_console_builder.editor.php b/pandora_console/godmode/reporting/visual_console_builder.editor.php index 9c16f9108c..a9cf7c1c15 100644 --- a/pandora_console/godmode/reporting/visual_console_builder.editor.php +++ b/pandora_console/godmode/reporting/visual_console_builder.editor.php @@ -71,6 +71,11 @@ echo "
"; diff --git a/pandora_console/include/constants.php b/pandora_console/include/constants.php index dc007d82ab..ba24e77458 100644 --- a/pandora_console/include/constants.php +++ b/pandora_console/include/constants.php @@ -299,19 +299,19 @@ define('PASSSWORD_POLICIES_FIRST_CHANGE', 1); define('PASSSWORD_POLICIES_EXPIRED', 2); /* SERVER TYPES */ -define ('SERVER_TYPE_DATA', 0); -define ('SERVER_TYPE_NETWORK', 1); -define ('SERVER_TYPE_SNMP', 2); -define ('SERVER_TYPE_RECON', 3); -define ('SERVER_TYPE_PLUGIN', 4); -define ('SERVER_TYPE_PREDICTION', 5); -define ('SERVER_TYPE_WMI', 6); -define ('SERVER_TYPE_EXPORT', 7); -define ('SERVER_TYPE_INVENTORY', 8); -define ('SERVER_TYPE_WEB', 9); -define ('SERVER_TYPE_EVENT', 10); -define ('SERVER_TYPE_ENTERPRISE_ICMP', 11); -define ('SERVER_TYPE_ENTERPRISE_SNMP', 12); +define('SERVER_TYPE_DATA', 0); +define('SERVER_TYPE_NETWORK', 1); +define('SERVER_TYPE_SNMP', 2); +define('SERVER_TYPE_RECON', 3); +define('SERVER_TYPE_PLUGIN', 4); +define('SERVER_TYPE_PREDICTION', 5); +define('SERVER_TYPE_WMI', 6); +define('SERVER_TYPE_EXPORT', 7); +define('SERVER_TYPE_INVENTORY', 8); +define('SERVER_TYPE_WEB', 9); +define('SERVER_TYPE_EVENT', 10); +define('SERVER_TYPE_ENTERPRISE_ICMP', 11); +define('SERVER_TYPE_ENTERPRISE_SNMP', 12); /* REPORTS */ define ('REPORT_TOP_N_MAX', 1); diff --git a/pandora_console/include/functions_groups.php b/pandora_console/include/functions_groups.php index 78aa6df80d..20a28f490d 100644 --- a/pandora_console/include/functions_groups.php +++ b/pandora_console/include/functions_groups.php @@ -15,6 +15,7 @@ // GNU General Public License for more details. require_once ($config['homedir'].'/include/functions_users.php'); +require_once ($config['homedir'].'/include/functions_reporting.php'); /** * Check if the group is in use in the Pandora DB. @@ -531,30 +532,18 @@ function groups_get_groups_tree_recursive($groups, $trash = 0, $trash2 = 0) { * @return int Status of the agents. */ function groups_get_status ($id_group = 0) { - $agents = agents_get_group_agents($id_group); + $data = reporting_get_group_stats($id_group); - $agents_status = array(); - foreach ($agents as $key => $agent) { - $agents_status[] = agents_get_status($key); - } - - $childrens = groups_get_childrens($id_group); - - foreach ($childrens as $key => $child) { - $agents_status[] = groups_get_status($key); - } - - // Status is 0 for normal, 1 for critical, 2 for warning and 3/-1 for unknown. 4 for fired alerts - if (is_int(array_search(AGENT_STATUS_ALERT_FIRED, $agents_status))) { + if ($data['monitor_alerts_fired'] > 0) { return AGENT_STATUS_ALERT_FIRED; } - elseif (is_int(array_search(AGENT_STATUS_CRITICAL, $agents_status))) { + elseif ($data['agent_critical'] > 0) { return AGENT_STATUS_CRITICAL; } - elseif (is_int(array_search(AGENT_STATUS_WARNING, $agents_status))) { + elseif ($data['agent_warning'] > 0) { return AGENT_STATUS_WARNING; } - elseif (is_int(array_search(AGENT_STATUS_UNKNOWN, $agents_status))) { + elseif ($data['agent_unknown'] > 0) { return AGENT_STATUS_UNKNOWN; } else { @@ -869,11 +858,12 @@ function groups_get_group_row($id_group, $group_all, $group, &$printed_groups) { // Get stats for this group $data = reporting_get_group_stats($id_group); + if ($data["total_agents"] == 0) { if (!empty($group['childs'])) { $group_childrens = groups_get_childrens($id_group, null, true); $group_childrens_agents = groups_total_agents(array_keys($group_childrens)); - + if (empty($group_childrens_agents)) { return; // Skip empty groups } diff --git a/pandora_console/include/functions_visual_map.php b/pandora_console/include/functions_visual_map.php index 182f309438..3a1060efd0 100644 --- a/pandora_console/include/functions_visual_map.php +++ b/pandora_console/include/functions_visual_map.php @@ -70,7 +70,7 @@ function visual_map_print_item($layoutData) { $text = '' . $label . ''; - $status = visual_map_get_status_element($layoutData); + $status = $layoutData['status_calculated']; switch ($status) { case VISUAL_MAP_STATUS_CRITICAL_BAD: @@ -100,7 +100,8 @@ function visual_map_print_item($layoutData) { switch ($type) { case STATIC_GRAPH: if ($layoutData['image'] != null) { - $img = visual_map_get_image_status_element($layoutData); + $img = visual_map_get_image_status_element($layoutData, + $layoutData['status_calculated']); if (substr($img,0,1) == '4') { $borderStyle ='border: 2px solid ' . COL_ALERTFIRED . ';'; $img = substr_replace($img, '', 0,1); @@ -127,7 +128,8 @@ function visual_map_print_item($layoutData) { case GROUP_ITEM: if ($layoutData['image'] != null) { - $img = visual_map_get_image_status_element($layoutData); + $img = visual_map_get_image_status_element($layoutData, + $layoutData['status_calculated']); if (substr($img,0,1) == '4') { $borderStyle ='border: 2px solid ' . COL_ALERTFIRED . ';'; $img = substr_replace($img, '', 0,1); @@ -294,7 +296,8 @@ function visual_map_print_item($layoutData) { break; case ICON: if ($layoutData['image'] != null) { - $img = visual_map_get_image_status_element($layoutData); + $img = visual_map_get_image_status_element($layoutData, + $layoutData['status_calculated']); } if (($width != 0) && ($height != 0)) { @@ -869,7 +872,7 @@ function visual_map_get_color_line_status($layoutData) { * * @return string The image with the relative path to pandora console directory. */ -function visual_map_get_image_status_element($layoutData) { +function visual_map_get_image_status_element($layoutData, $status = false) { $img = "images/console/icons/" . $layoutData["image"]; if ($layoutData['type'] == 5) { @@ -877,7 +880,11 @@ function visual_map_get_image_status_element($layoutData) { $img .= ".png"; } else { - switch (visual_map_get_status_element($layoutData)) { + if ($status === false) { + $status = visual_map_get_status_element($layoutData); + } + + switch ($status) { case 1: //Critical (BAD) $img .= "_bad.png"; diff --git a/pandora_console/operation/agentes/estado_generalagente.php b/pandora_console/operation/agentes/estado_generalagente.php index 5441cbdada..8a1a3c8902 100644 --- a/pandora_console/operation/agentes/estado_generalagente.php +++ b/pandora_console/operation/agentes/estado_generalagente.php @@ -377,116 +377,133 @@ $columns = array( ); $filter = array( "id_agente" => $id_agente, - "id_tipo_modulo" => (int)db_get_value("id_tipo", "ttipo_modulo", "nombre", "remote_snmp_proc") + "id_tipo_modulo" => (int)db_get_value("id_tipo", "ttipo_modulo", "nombre", "remote_snmp_proc"), + "disabled" => 0 ); -$modules = agents_get_modules($id_agente, $columns, $filter); +$modules = agents_get_modules($id_agente, $columns, $filter, true, false); +$interfaces = array(); -if (! empty($modules)) { - $table_interface = new stdClass(); - $table_interface->id = 'agent_interface_info'; - $table_interface->class = 'databox'; - $table_interface->width = '100%'; - $table_interface->style = array(); - $table_interface->style['interface_status'] = 'width: 30px;'; - $table_interface->style['interface_graph'] = 'width: 20px;'; - $table_interface->head = array(); - $options = array( - "class" => "closed", - "style" => "vertical-align:middle; cursor:pointer;" - ); - $table_interface->head[0] = html_print_image("images/go.png", true, $options) . "  "; - $table_interface->head[0] .= '' . __('Interface information') .' (SNMP)'; - $table_interface->head_colspan = array(); - $table_interface->head_colspan[0] = 5; - $table_interface->data = array(); - +if (!empty($modules)) { foreach ($modules as $key => $module) { - // Trying to get the interface name from the module name if (preg_match ("/_(.+)$/", (string)$module['nombre'], $matches)) { if ($matches[1]) { $interface_name = $matches[1]; + $interface_name_escaped = str_replace("/", "\/", $interface_name); - $module_id = $module['id_agente_modulo']; - $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 = ui_print_status_image($status, $title, true); - - $ip_target = "--"; - // Trying to get something like an IP from the description - if (preg_match ("/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/", (string)$module['descripcion'], $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", (string)$module['descripcion'], $matches)) { - if ($matches[0]) { - $ip_target = $matches[0]; - } - } - $description = "--"; - // 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", (string)$module['descripcion'], $matches)) { - if ($matches[0]) { - $description = $matches[0]; - } + if (!isset($interfaces[$interface_name]) + || (isset($interfaces[$interface_name]) + && preg_match ("/^ifOperStatus_$interface_name_escaped$/i", (string)$module['nombre'], $matches))) { + $interfaces[$interface_name] = $module; } - // Get the ifInOctets and ifOutOctets modules of the interface - $columns = array( - "id_agente_modulo", - "nombre" - ); - $interface_traffic_modules = agents_get_modules($id_agente, $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) { - if (preg_match ("/if(.+)Octets_$interface_name$/i", (string)$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; - } - - if ($interface_traffic_modules != false) { - $params = array( - 'interface_name' => $interface_name, - 'agent_id' => $id_agente, - 'traffic_module_in' => $interface_traffic_modules_aux['in'], - 'traffic_module_out' => $interface_traffic_modules_aux['out'] - ); - $params_json = json_encode($params); - $params_encoded = base64_encode($params_json); - $win_handle = dechex(crc32($module_id.$interface_name)); - $graph_link = "" . - html_print_image("images/chart_curve.png", true, array("title" => __('Interface traffic'))) . ""; - } - else { - $graph_link = ""; - } - - $data = array(); - $data['interface_name'] = "" . $interface_name . ""; - $data['interface_status'] = $status; - $data['interface_graph'] = $graph_link; - $data['interface_ip'] = $ip_target; - $data['interface_mac'] = $description; - $table_interface->data[] = $data; } } } unset($modules); + + if (!empty($interfaces)) { + + $table_interface = new stdClass(); + $table_interface->id = 'agent_interface_info'; + $table_interface->class = 'databox'; + $table_interface->width = '100%'; + $table_interface->style = array(); + $table_interface->style['interface_status'] = 'width: 30px;'; + $table_interface->style['interface_graph'] = 'width: 20px;'; + $table_interface->head = array(); + $options = array( + "class" => "closed", + "style" => "vertical-align:middle; cursor:pointer;" + ); + $table_interface->head[0] = html_print_image("images/go.png", true, $options) . "  "; + $table_interface->head[0] .= '' . __('Interface information') .' (SNMP)'; + $table_interface->head_colspan = array(); + $table_interface->head_colspan[0] = 5; + $table_interface->data = array(); + + foreach ($interfaces as $interface_name => $module) { + $interface_name_escaped = str_replace("/", "\/", $interface_name); + + $module_id = $module['id_agente_modulo']; + $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 = ui_print_status_image($status, $title, true); + + $ip_target = "--"; + // Trying to get something like an IP from the description + if (preg_match ("/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/", (string)$module['descripcion'], $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", (string)$module['descripcion'], $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", (string)$module['descripcion'], $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($id_agente, $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; + } + + if ($interface_traffic_modules != false) { + $params = array( + 'interface_name' => $interface_name, + 'agent_id' => $id_agente, + 'traffic_module_in' => $interface_traffic_modules_aux['in'], + 'traffic_module_out' => $interface_traffic_modules_aux['out'] + ); + $params_json = json_encode($params); + $params_encoded = base64_encode($params_json); + $win_handle = dechex(crc32($module_id.$interface_name)); + $graph_link = "" . + html_print_image("images/chart_curve.png", true, array("title" => __('Interface traffic'))) . ""; + } + else { + $graph_link = ""; + } + + $data = array(); + $data['interface_name'] = "" . $interface_name . ""; + $data['interface_status'] = $status; + $data['interface_graph'] = $graph_link; + $data['interface_ip'] = $ip_target; + $data['interface_mac'] = $mac; + $table_interface->data[] = $data; + } + } // This javascript piece of code is used to make expandible the body of the table ?> diff --git a/pandora_console/operation/agentes/status_monitor.php b/pandora_console/operation/agentes/status_monitor.php index 4ac53e2901..5cccb4f17b 100644 --- a/pandora_console/operation/agentes/status_monitor.php +++ b/pandora_console/operation/agentes/status_monitor.php @@ -844,7 +844,7 @@ else { $result = array(); $count_modules = 0; - foreach($servers as $server) { + foreach ($servers as $server) { // If connection was good then retrieve all data server if (metaconsole_connect($server) == NOERR) { $connection = true; @@ -1068,18 +1068,39 @@ foreach ($result as $row) { } $data[2] = html_print_image("images/" . modules_show_icon_type ($row["module_type"]), true); - if (check_acl ($config['id_user'], $row['id_group'], "AW")) - $data[2] .= '' . + 'edit_module=1' . + '&loginhash=auto&loginhash_data=' . $row["hashdata"] . '&loginhash_user=' . $row["user"]; + } + else { + $url_edit_module = 'index.php?' . + 'sec=gagente&' . + 'sec2=godmode/agentes/configurar_agente&' . + 'id_agente=' . $row['id_agent'] . '&' . + 'tab=module&' . + 'id_agent_module=' . $row["id_agente_modulo"] . '&' . + 'edit_module=1'; + } + + if ($show_edit_icon) { + $data[2] .= '' . html_print_image("images/config.png", true, array("alt" => '0', "border" => "", "title" => __('Edit'))) . - ''; + ''; + } + } $data[3] = ui_print_truncate_text($row["module_name"], 'agent_small', false, true, true); if ($row["extended_info"] != "") { @@ -1322,14 +1343,14 @@ ui_require_javascript_file('pandora_modules'); } function refresh_pagination_callback (module_id, id_agent, server_name) { - + $(".binary_dialog").click( function() { var classes = $(this).attr('class'); classes = classes.split(' '); var offset_class = classes[2]; offset_class = offset_class.split('_'); var offset = offset_class[1]; - + var period = $('#period').val(); show_module_detail_dialog(module_id, id_agent, server_name, offset, period); diff --git a/pandora_console/operation/visual_console/public_console.php b/pandora_console/operation/visual_console/public_console.php index fd3e5f9a0e..694476542e 100644 --- a/pandora_console/operation/visual_console/public_console.php +++ b/pandora_console/operation/visual_console/public_console.php @@ -51,7 +51,7 @@ $layout = db_get_row ('tlayout', 'id', $id_layout); if (! $layout) { db_pandora_audit("ACL Violation","Trying to access visual console without id layout"); - include ("../../general/noaccess.php"); + include ($config['homedir'] . "/general/noaccess.php"); exit; } diff --git a/pandora_server/lib/PandoraFMS/Core.pm b/pandora_server/lib/PandoraFMS/Core.pm index 7a238c91ac..7405274f9e 100644 --- a/pandora_server/lib/PandoraFMS/Core.pm +++ b/pandora_server/lib/PandoraFMS/Core.pm @@ -1146,15 +1146,10 @@ sub pandora_process_module ($$$$$$$$$;$) { $min_ff_event = $module->{'min_ff_event_warning'} if ($new_status == 2); } - # replace $new_status with $last_known_status when recovering from 'unknown' - if ($status == 3) { - $new_status = $last_known_status; - } - if ($last_status == $new_status) { # Avoid overflows - $status_changes = $min_ff_event if ($status_changes > $module->{'min_ff_event'}); + $status_changes = $min_ff_event if ($status_changes > $min_ff_event); $status_changes++; if ($module_type =~ m/async/ && $min_ff_event != 0 && $ff_timeout != 0 && ($utimestamp - $ff_start_utimestamp) > $ff_timeout) { @@ -1173,9 +1168,10 @@ sub pandora_process_module ($$$$$$$$$;$) { } # Change status - if ($status_changes == $min_ff_event && $status != $new_status) { + if ($status_changes >= $min_ff_event && $status != $new_status) { generate_status_event ($pa_config, $processed_data, $agent, $module, $new_status, $status, $last_known_status, $dbh); $status = $new_status; + $last_status = $new_status; # Update module status count pandora_mark_agent_for_module_update ($dbh, $agent->{'id_agente'}); @@ -1185,20 +1181,23 @@ sub pandora_process_module ($$$$$$$$$;$) { elsif ($status == 4) { generate_status_event ($pa_config, $processed_data, $agent, $module, 0, $status, $last_known_status, $dbh); $status = 0; + $last_status = $new_status; # Update module status count pandora_mark_agent_for_module_update ($dbh, $agent->{'id_agente'}); } # If unknown modules receive data, restore status even if min_ff_event is not matched. elsif ($status == 3) { + $last_status = $new_status; # Set last_status before forcing the module's new status to its last known status. + $new_status = $last_known_status; # Set the module to its last known status. generate_status_event ($pa_config, $processed_data, $agent, $module, $new_status, $status, $last_known_status, $dbh); $status = $new_status; # Update module status count pandora_mark_agent_for_module_update ($dbh, $agent->{'id_agente'}); + } else { + $last_status = $new_status; } - - $last_status = $new_status; # tagente_estado.last_try defaults to NULL, should default to '1970-01-01 00:00:00' $agent_status->{'last_try'} = '1970-01-01 00:00:00' unless defined ($agent_status->{'last_try'}); @@ -3563,18 +3562,15 @@ sub generate_status_event ($$$$$$$$) { # Warning } elsif ($status == 2) { - # From normal - if ($last_known_status == 0 || $last_known_status == 4) { - ($event_type, $severity) = ('going_up_warning', 3); - $description = $pa_config->{"text_going_up_warning"}; - # From critical - } elsif ($last_known_status == 1) { + if ($last_known_status == 1) { ($event_type, $severity) = ('going_down_warning', 3); $description = $pa_config->{"text_going_down_warning"}; - } else { - # Unknown last_status - return; + } + # From normal or warning (after becoming unknown) + else { + ($event_type, $severity) = ('going_up_warning', 3); + $description = $pa_config->{"text_going_up_warning"}; } } else { # Unknown status diff --git a/pandora_server/lib/PandoraFMS/SNMPServer.pm b/pandora_server/lib/PandoraFMS/SNMPServer.pm index f1f9064e17..f874fc3d42 100644 --- a/pandora_server/lib/PandoraFMS/SNMPServer.pm +++ b/pandora_server/lib/PandoraFMS/SNMPServer.pm @@ -219,7 +219,7 @@ sub pandora_snmptrapd { if (!defined($oid)) { logger($pa_config, "[W] snmpTrapOID not found (Illegal SNMPv2 trap?)", 1); - next; + return; } $oid =~ s/.* = OID: //; $data = join("\t", @data);