' . (int) $datelimit . ' AND utimestamp < ' . (int) $date . ' ORDER BY utimestamp ASC', true); if ($interval_data === false) $interval_data = array (); // Uncompressed module data if ($uncompressed_module) { $min_necessary = 1; // Compressed module data } else { // Get previous data $previous_data = get_previous_data ($id_agent_module, $datelimit); if ($previous_data !== false) { $previous_data['utimestamp'] = $datelimit; array_unshift ($interval_data, $previous_data); } // Get next data $next_data = get_next_data ($id_agent_module, $date); if ($next_data !== false) { $next_data['utimestamp'] = $date; array_push ($interval_data, $next_data); } else if (count ($interval_data) > 0) { // Propagate the last known data to the end of the interval $next_data = array_pop ($interval_data); array_push ($interval_data, $next_data); $next_data['utimestamp'] = $date; array_push ($interval_data, $next_data); } $min_necessary = 2; } if (count ($interval_data) < $min_necessary) { return false; } // Set initial conditions $total = 0; $count = 0; if (! $uncompressed_module) { $previous_data = array_shift ($interval_data); } foreach ($interval_data as $data) { if (! $uncompressed_module) { $total += $previous_data['datos'] * ($data['utimestamp'] - $previous_data['utimestamp']); $previous_data = $data; } else { $total += $data['datos']; $count++; } } // Compressed module data if (! $uncompressed_module) { if ($period == 0) { return 0; } return $total / $period; } // Uncompressed module data if ($count == 0) { return 0; } return $total / $count; } /** * Get the maximum value of an agent module in a period of time. * * @param int Agent module id to get the maximum value. * @param int Period of time to check (in seconds) * @param int Top date to check the values. Default current time. * * @return float The maximum module value in the interval. */ function get_agentmodule_data_max ($id_agent_module, $period, $date = 0) { global $config; // Initialize variables if (empty ($date)) $date = get_system_time (); if ((empty ($period)) OR ($period == 0)) $period = $config["sla_period"]; $datelimit = $date - $period; $id_module_type = get_agentmodule_type ($id_agent_module); $module_type = get_moduletype_name ($id_module_type); $uncompressed_module = is_module_uncompressed ($module_type); // Get module data $interval_data = get_db_all_rows_sql ('SELECT * FROM tagente_datos WHERE id_agente_modulo = ' . (int) $id_agent_module . ' AND utimestamp > ' . (int) $datelimit . ' AND utimestamp < ' . (int) $date . ' ORDER BY utimestamp ASC', true); if ($interval_data === false) $interval_data = array (); // Uncompressed module data if ($uncompressed_module) { // Compressed module data } else { // Get previous data $previous_data = get_previous_data ($id_agent_module, $datelimit); if ($previous_data !== false) { $previous_data['utimestamp'] = $datelimit; array_unshift ($interval_data, $previous_data); } // Get next data $next_data = get_next_data ($id_agent_module, $date); if ($next_data !== false) { $next_data['utimestamp'] = $date; array_push ($interval_data, $next_data); } else if (count ($interval_data) > 0) { // Propagate the last known data to the end of the interval $next_data = array_pop ($interval_data); array_push ($interval_data, $next_data); $next_data['utimestamp'] = $date; array_push ($interval_data, $next_data); } } // Set initial conditions if (empty($iterval_data)) { $max = 0; } else { if ($uncompressed_module || $interval_data[0]['utimestamp'] == $datelimit) { $max = $interval_data[0]['datos']; } else { $max = 0; } } foreach ($interval_data as $data) { if ($data['datos'] > $max) { $max = $data['datos']; } } return $max; } /** * Get the minimum value of an agent module in a period of time. * * @param int Agent module id to get the minimum value. * @param int Period of time to check (in seconds) * @param int Top date to check the values in Unix time. Default current time. * * @return float The minimum module value of the module */ function get_agentmodule_data_min ($id_agent_module, $period, $date = 0) { global $config; // Initialize variables if (empty ($date)) $date = get_system_time (); if ((empty ($period)) OR ($period == 0)) $period = $config["sla_period"]; $datelimit = $date - $period; $id_module_type = get_agentmodule_type ($id_agent_module); $module_type = get_moduletype_name ($id_module_type); $uncompressed_module = is_module_uncompressed ($module_type); // Get module data $interval_data = get_db_all_rows_sql ('SELECT * FROM tagente_datos WHERE id_agente_modulo = ' . (int) $id_agent_module . ' AND utimestamp > ' . (int) $datelimit . ' AND utimestamp < ' . (int) $date . ' ORDER BY utimestamp ASC', true); if ($interval_data === false) $interval_data = array (); // Uncompressed module data if ($uncompressed_module) { $min_necessary = 1; // Compressed module data } else { // Get previous data $previous_data = get_previous_data ($id_agent_module, $datelimit); if ($previous_data !== false) { $previous_data['utimestamp'] = $datelimit; array_unshift ($interval_data, $previous_data); } // Get next data $next_data = get_next_data ($id_agent_module, $date); if ($next_data !== false) { $next_data['utimestamp'] = $date; array_push ($interval_data, $next_data); } else if (count ($interval_data) > 0) { // Propagate the last known data to the end of the interval $next_data = array_pop ($interval_data); array_push ($interval_data, $next_data); $next_data['utimestamp'] = $date; array_push ($interval_data, $next_data); } } if (count ($interval_data) < 1) { return false; } // Set initial conditions $min = $interval_data[0]['datos']; foreach ($interval_data as $data) { if ($data['datos'] < $min) { $min = $data['datos']; } } return $min; } /** * Get the sum of values of an agent module in a period of time. * * @param int Agent module id to get the sumatory. * @param int Period of time to check (in seconds) * @param int Top date to check the values. Default current time. * * @return float The sumatory of the module values in the interval. */ function get_agentmodule_data_sum ($id_agent_module, $period, $date = 0) { // Initialize variables if (empty ($date)) $date = get_system_time (); if ((empty ($period)) OR ($period == 0)) $period = $config["sla_period"]; $datelimit = $date - $period; $id_module_type = get_db_value ('id_tipo_modulo', 'tagente_modulo','id_agente_modulo', $id_agent_module); $module_name = get_db_value ('nombre', 'ttipo_modulo', 'id_tipo', $id_module_type); $module_interval = get_module_interval ($id_agent_module); $uncompressed_module = is_module_uncompressed ($module_name); // Wrong module type if (is_module_data_string ($module_name)) { return 0; } // Incremental modules are treated differently $module_inc = is_module_inc ($module_name); // Get module data $interval_data = get_db_all_rows_sql ('SELECT * FROM tagente_datos WHERE id_agente_modulo = ' . (int) $id_agent_module . ' AND utimestamp > ' . (int) $datelimit . ' AND utimestamp < ' . (int) $date . ' ORDER BY utimestamp ASC', true); if ($interval_data === false) $interval_data = array (); // Uncompressed module data if ($uncompressed_module) { $min_necessary = 1; // Compressed module data } else { // Get previous data $previous_data = get_previous_data ($id_agent_module, $datelimit); if ($previous_data !== false) { $previous_data['utimestamp'] = $datelimit; array_unshift ($interval_data, $previous_data); } // Get next data $next_data = get_next_data ($id_agent_module, $date); if ($next_data !== false) { $next_data['utimestamp'] = $date; array_push ($interval_data, $next_data); } else if (count ($interval_data) > 0) { // Propagate the last known data to the end of the interval $next_data = array_pop ($interval_data); array_push ($interval_data, $next_data); $next_data['utimestamp'] = $date; array_push ($interval_data, $next_data); } $min_necessary = 2; } if (count ($interval_data) < $min_necessary) { return false; } // Set initial conditions $total = 0; if (! $uncompressed_module) { $previous_data = array_shift ($interval_data); } foreach ($interval_data as $data) { if ($uncompressed_module) { $total += $data['datos']; } else if ($module_inc) { $total += $previous_data['datos'] * ($data['utimestamp'] - $previous_data['utimestamp']); } else { $total += $previous_data['datos'] * ($data['utimestamp'] - $previous_data['utimestamp']) / $module_interval; } $previous_data = $data; } return $total; } /** * Get SLA of a module. * * @param int Agent module to calculate SLA * @param int Period to check the SLA compliance. * @param int Minimum data value the module in the right interval * @param int Maximum data value the module in the right interval. False will * ignore max value * @param int Beginning date of the report in UNIX time (current date by default). * @param array $dayWeek Array of days week to extract as array('monday' => false, 'tuesday' => true....), and by default is null. * @param string $timeFrom Time in the day to start to extract in mysql format, by default null. * @param string $timeTo Time in the day to end to extract in mysql format, by default null. * * @return float SLA percentage of the requested module. False if no data were * found */ function get_agentmodule_sla ($id_agent_module, $period = 0, $min_value = 1, $max_value = false, $date = 0, $daysWeek = null, $timeFrom = null, $timeTo = null) { global $config; // Initialize variables if (empty ($date)) { $date = get_system_time (); } if ((empty ($period)) OR ($period == 0)) { $period = $config["sla_period"]; } if ($daysWeek === null) { $daysWeek = array(); } // Limit date to start searching data $datelimit = $date - $period; // Get interval data $sql = sprintf ('SELECT * FROM tagente_datos WHERE id_agente_modulo = %d AND utimestamp > %d AND utimestamp <= %d', $id_agent_module, $datelimit, $date); //Add the working times (mon - tue - wed ...) and from time to time $days = array(); //Translate to mysql week days if ($daysWeek) { foreach ($daysWeek as $key => $value) { if (!$value) { if ($key == 'monday') { $days[] = 2; } if ($key == 'tuesday') { $days[] = 3; } if ($key == 'wednesday') { $days[] = 4; } if ($key == 'thursday') { $days[] = 5; } if ($key == 'friday') { $days[] = 6; } if ($key == 'saturday') { $days[] = 7; } if ($key == 'sunday') { $days[] = 1; } } } } if (count($days) > 0) { $sql .= ' AND DAYOFWEEK(FROM_UNIXTIME(utimestamp)) NOT IN (' . implode(',', $days) . ')'; } if (!empty($timeFrom)) { $sql .= ' AND TIME(FROM_UNIXTIME(utimestamp)) >= "' . $timeFrom . '"'; } if (!empty($timeTo)) { $sql .= ' AND TIME(FROM_UNIXTIME(utimestamp)) <= "' . $timeTo . '"'; } $sql .= ' ORDER BY utimestamp ASC'; $interval_data = get_db_all_rows_sql ($sql, true); if ($interval_data === false) { $interval_data = array (); } // Get previous data $previous_data = get_previous_data ($id_agent_module, $datelimit); if ($previous_data !== false) { $previous_data['utimestamp'] = $datelimit; array_unshift ($interval_data, $previous_data); } // Get next data $next_data = get_next_data ($id_agent_module, $date); if ($next_data !== false) { $next_data['utimestamp'] = $date; array_push ($interval_data, $next_data); } else if (count ($interval_data) > 0) { // Propagate the last known data to the end of the interval $next_data = array_pop ($interval_data); array_push ($interval_data, $next_data); $next_data['utimestamp'] = $date; array_push ($interval_data, $next_data); } if (count ($interval_data) < 2) { return false; } // Set initial conditions $bad_period = 0; $first_data = array_shift ($interval_data); $previous_utimestamp = $first_data['utimestamp']; if ((($max_value > $min_value AND ($first_data['datos'] > $max_value OR $first_data['datos'] < $min_value))) OR ($max_value <= $min_value AND $first_data['datos'] < $min_value)) { $previous_status = 1; } else { $previous_status = 0; } foreach ($interval_data as $data) { // Previous status was critical if ($previous_status == 1) { $bad_period += $data['utimestamp'] - $previous_utimestamp; } if (array_key_exists('datos', $data)) { // Re-calculate previous status for the next data if ((($max_value > $min_value AND ($data['datos'] > $max_value OR $data['datos'] < $min_value))) OR ($max_value <= $min_value AND $data['datos'] < $min_value)) { $previous_status = 1; } else { $previous_status = 0; } } $previous_utimestamp = $data['utimestamp']; } // Return the percentage of SLA compliance return (float) (100 - ($bad_period / $period) * 100); } /** * Get several SLA data for an agentmodule within a period divided on subperiods * * @param int Agent module to calculate SLA * @param int Period to check the SLA compliance. * @param int Minimum data value the module in the right interval * @param int Maximum data value the module in the right interval. False will * ignore max value * @param array $days Array of days week to extract as array('monday' => false, 'tuesday' => true....), and by default is null. * @param string $timeFrom Time in the day to start to extract in mysql format, by default null. * @param string $timeTo Time in the day to end to extract in mysql format, by default null. * * @return Array with values either 1, 2, 3 or 4 depending if the SLA percentage for this subperiod * is within the sla limits, on the edge, outside or with an unknown value. */ function get_agentmodule_sla_array ($id_agent_module, $period = 0, $min_value = 1, $max_value = false, $sla_limit = 0, $days = null, $timeFrom = null, $timeTo = null) { global $config; // Get date $date = (string) get_parameter ('date', date ('Y-m-j')); $time = (string) get_parameter ('time', date ('h:iA')); $datetime = strtotime ($date.' '.$time); //Get the module_interval $interval = get_module_interval ($id_agent_module); if ($period < 3600) { $k = 6; } elseif ($period < 86400) { $k = 24; } elseif ($period < 172800) { $k = 48; } else { $k = 100; } $slices = $config["graph_res"] * $k; $sub_period = $period / $slices; if ($sub_period < $interval) { $sub_period = $interval; } $final_time = $datetime - $period + $sub_period; $data = array(); $i = 0; while ($final_time <= $datetime) { $sla_value = get_agentmodule_sla ($id_agent_module, $sub_period, $min_value, $max_value, $final_time, $days, $timeFrom, $timeTo); if ($sla_value === false || $sla_value < 0) {// 4 for the Unknown value $data[$i] = 4; } elseif (($sla_value >= ($sla_limit - 10)) && ($sla_value <= ($sla_limit + 10))) {//2 when value is within the edges $data[$i] = 2; } elseif ($sla_value > ($sla_limit + 10)) { //1 when value is OK $data[$i] = 1; } elseif ($sla_value < ($sla_limit - 10)) { //3 when value is Wrong $data[$i] = 3; } $final_time += $sub_period; $i++; } return $data; } /** * Get general statistical info on a group * * @param int Group Id to get info from. 0 = all * * @return array Group statistics */ function get_group_stats ($id_group = 0) { global $config; $data = array (); $data["monitor_checks"] = 0; $data["monitor_not_init"] = 0; $data["monitor_unknown"] = 0; $data["monitor_ok"] = 0; $data["monitor_bad"] = 0; // Critical + Unknown + Warning $data["monitor_warning"] = 0; $data["monitor_critical"] = 0; $data["monitor_alerts"] = 0; $data["monitor_alerts_fired"] = 0; $data["monitor_alerts_fire_count"] = 0; $data["total_agents"] = 0; $data["total_alerts"] = 0; $data["total_checks"] = 0; $data["alerts"] = 0; $data["agents_unknown"] = 0; $data["monitor_health"] = 100; $data["alert_level"] = 100; $data["module_sanity"] = 100; $data["server_sanity"] = 100; $data["total_not_init"] = 0; $data["monitor_non_init"] = 0; $cur_time = get_system_time (); //Check for access credentials using check_acl. More overhead, much safer if (!check_acl ($config["id_user"], $id_group, "AR")) { return $data; } if ($id_group == 0) { $id_group = array_keys (get_user_groups ()); } // ------------------------------------------------------------------- // Server processed stats. NOT realtime (taken from tgroup_stat) // ------------------------------------------------------------------- if ($config["realtimestats"] == 0){ if (!is_array($id_group)){ $my_group = $id_group; $id_group = array(); $id_group[0] = $my_group; } foreach ($id_group as $group){ $group_stat = get_db_all_rows_sql ("SELECT * FROM tgroup_stat, tgrupo WHERE tgrupo.id_grupo = tgroup_stat.id_group AND tgroup_stat.id_group = $group ORDER BY nombre"); $data["monitor_checks"] += $group_stat[0]["modules"]; $data["monitor_not_init"] += $group_stat[0]["non-init"]; $data["monitor_unknown"] += $group_stat[0]["unknown"]; $data["monitor_ok"] += $group_stat[0]["normal"]; $data["monitor_warning"] += $group_stat[0]["warning"]; $data["monitor_critical"] += $group_stat[0]["critical"]; $data["monitor_alerts"] += $group_stat[0]["alerts"]; $data["monitor_alerts_fired"] += $group_stat[0]["alerts_fired"]; $data["monitor_alerts_fire_count"] += $group_stat[0]["alerts_fired"]; $data["total_checks"] += $group_stat[0]["modules"]; $data["total_alerts"] += $group_stat[0]["alerts"]; $data["total_agents"] += $group_stat[0]["agents"]; $data["agents_unknown"] += $group_stat[0]["agents_unknown"]; $data["utimestamp"] = $group_stat[0]["utimestamp"]; } // ------------------------------------------------------------------- // Realtime stats, done by PHP Console // ------------------------------------------------------------------- } else { if (!is_array($id_group)){ $my_group = $id_group; $id_group = array(); $id_group[0] = $my_group; } foreach ($id_group as $group){ switch ($config["dbtype"]) { case "mysql": $data["agents_unknown"] += get_db_sql ("SELECT COUNT(*) FROM tagente WHERE id_grupo = $group AND disabled = 0 AND ultimo_contacto < NOW() - (intervalo * 2)"); break; case "postgresql": $data["agents_unknown"] += get_db_sql ("SELECT COUNT(*) FROM tagente WHERE id_grupo = $group AND disabled = 0 AND ceil(date_part('epoch', ultimo_contacto)) < ceil(date_part('epoch', NOW())) - (intervalo * 2)"); break; case "oracle": $data["agents_unknown"] += get_db_sql ("SELECT COUNT(*) FROM tagente WHERE id_grupo = $group AND disabled = 0 AND ultimo_contacto < CURRENT_TIMESTAMP - (intervalo * 2)"); break; } $data["total_agents"] += get_db_sql ("SELECT COUNT(*) FROM tagente WHERE id_grupo = $group AND disabled = 0"); $data["monitor_checks"] += get_db_sql ("SELECT COUNT(tagente_estado.id_agente_estado) FROM tagente_estado, tagente, tagente_modulo WHERE tagente.id_grupo = $group AND tagente.disabled = 0 AND tagente_estado.id_agente = tagente.id_agente AND tagente_estado.id_agente_modulo = tagente_modulo.id_agente_modulo AND tagente_modulo.disabled = 0"); $data["total_not_init"] += get_db_sql ("SELECT COUNT(tagente_estado.id_agente_estado) FROM tagente_estado, tagente, tagente_modulo WHERE tagente.id_grupo = $group AND tagente.disabled = 0 AND tagente_estado.id_agente = tagente.id_agente AND tagente_estado.id_agente_modulo = tagente_modulo.id_agente_modulo AND tagente_modulo.disabled = 0 AND tagente_modulo.id_tipo_modulo NOT IN (21,22,23,24) AND tagente_estado.utimestamp = 0"); switch ($config["dbtype"]) { case "mysql": $data["monitor_ok"] += get_db_sql ("SELECT COUNT(tagente_estado.id_agente_estado) FROM tagente_estado, tagente, tagente_modulo WHERE tagente.id_grupo = $group AND tagente.disabled = 0 AND tagente_estado.id_agente = tagente.id_agente AND tagente_estado.id_agente_modulo = tagente_modulo.id_agente_modulo AND tagente_modulo.disabled = 0 AND estado = 0 AND ((UNIX_TIMESTAMP(NOW()) - tagente_estado.utimestamp) < (tagente_estado.current_interval * 2) OR (tagente_modulo.id_tipo_modulo IN(21,22,23,24,100))) AND (utimestamp > 0 OR (tagente_modulo.id_tipo_modulo IN(21,22,23,24)))"); break; case "postgresql": $data["monitor_ok"] += get_db_sql ("SELECT COUNT(tagente_estado.id_agente_estado) FROM tagente_estado, tagente, tagente_modulo WHERE tagente.id_grupo = $group AND tagente.disabled = 0 AND tagente_estado.id_agente = tagente.id_agente AND tagente_estado.id_agente_modulo = tagente_modulo.id_agente_modulo AND tagente_modulo.disabled = 0 AND estado = 0 AND ((ceil(date_part('epoch', CURRENT_TIMESTAMP)) - tagente_estado.utimestamp) < (tagente_estado.current_interval * 2) OR (tagente_modulo.id_tipo_modulo IN(21,22,23,24,100))) AND (utimestamp > 0 OR (tagente_modulo.id_tipo_modulo IN(21,22,23,24)))"); break; case "oracle": $data["monitor_ok"] += get_db_sql ("SELECT COUNT(tagente_estado.id_agente_estado) FROM tagente_estado, tagente, tagente_modulo WHERE tagente.id_grupo = $group AND tagente.disabled = 0 AND tagente_estado.id_agente = tagente.id_agente AND tagente_estado.id_agente_modulo = tagente_modulo.id_agente_modulo AND tagente_modulo.disabled = 0 AND estado = 0 AND ((ceil((sysdate - to_date('19700101000000','YYYYMMDDHH24MISS')) * (86400)) - tagente_estado.utimestamp) < (tagente_estado.current_interval * 2) OR (tagente_modulo.id_tipo_modulo IN(21,22,23,24,100))) AND (utimestamp > 0 OR (tagente_modulo.id_tipo_modulo IN(21,22,23,24)))"); break; } switch ($config["dbtype"]) { case "mysql": $data["monitor_critical"] += get_db_sql ("SELECT COUNT(tagente_estado.id_agente_estado) FROM tagente_estado, tagente, tagente_modulo WHERE tagente.id_grupo = $group AND tagente.disabled = 0 AND tagente_estado.id_agente = tagente.id_agente AND tagente_estado.id_agente_modulo = tagente_modulo.id_agente_modulo AND tagente_modulo.disabled = 0 AND estado = 1 AND ((UNIX_TIMESTAMP(NOW()) - tagente_estado.utimestamp) < (tagente_estado.current_interval * 2) OR (tagente_modulo.id_tipo_modulo IN(21,22,23,24,100))) AND utimestamp > 0"); break; case "postgresql": $data["monitor_critical"] += get_db_sql ("SELECT COUNT(tagente_estado.id_agente_estado) FROM tagente_estado, tagente, tagente_modulo WHERE tagente.id_grupo = $group AND tagente.disabled = 0 AND tagente_estado.id_agente = tagente.id_agente AND tagente_estado.id_agente_modulo = tagente_modulo.id_agente_modulo AND tagente_modulo.disabled = 0 AND estado = 1 AND ((ceil(date_part('epoch', CURRENT_TIMESTAMP)) - tagente_estado.utimestamp) < (tagente_estado.current_interval * 2) OR (tagente_modulo.id_tipo_modulo IN(21,22,23,24,100))) AND utimestamp > 0"); break; case "oracle": $data["monitor_critical"] += get_db_sql ("SELECT COUNT(tagente_estado.id_agente_estado) FROM tagente_estado, tagente, tagente_modulo WHERE tagente.id_grupo = $group AND tagente.disabled = 0 AND tagente_estado.id_agente = tagente.id_agente AND tagente_estado.id_agente_modulo = tagente_modulo.id_agente_modulo AND tagente_modulo.disabled = 0 AND estado = 1 AND ((ceil((sysdate - to_date('19700101000000','YYYYMMDDHH24MISS')) * (86400)) - tagente_estado.utimestamp) < (tagente_estado.current_interval * 2) OR (tagente_modulo.id_tipo_modulo IN(21,22,23,24,100))) AND utimestamp > 0"); break; } switch ($config["dbtype"]) { case "mysql": $data["monitor_warning"] += get_db_sql ("SELECT COUNT(tagente_estado.id_agente_estado) FROM tagente_estado, tagente, tagente_modulo WHERE tagente.id_grupo = $group AND tagente.disabled = 0 AND tagente_estado.id_agente = tagente.id_agente AND tagente_estado.id_agente_modulo = tagente_modulo.id_agente_modulo AND tagente_modulo.disabled = 0 AND estado = 2 AND ((UNIX_TIMESTAMP(NOW()) - tagente_estado.utimestamp) < (tagente_estado.current_interval * 2) OR (tagente_modulo.id_tipo_modulo IN(21,22,23,24,100))) AND utimestamp > 0"); break; case "postgresql": $data["monitor_warning"] += get_db_sql ("SELECT COUNT(tagente_estado.id_agente_estado) FROM tagente_estado, tagente, tagente_modulo WHERE tagente.id_grupo = $group AND tagente.disabled = 0 AND tagente_estado.id_agente = tagente.id_agente AND tagente_estado.id_agente_modulo = tagente_modulo.id_agente_modulo AND tagente_modulo.disabled = 0 AND estado = 2 AND ((ceil(date_part('epoch', CURRENT_TIMESTAMP)) - tagente_estado.utimestamp) < (tagente_estado.current_interval * 2) OR (tagente_modulo.id_tipo_modulo IN(21,22,23,24,100))) AND utimestamp > 0"); break; case "oracle": $data["monitor_warning"] += get_db_sql ("SELECT COUNT(tagente_estado.id_agente_estado) FROM tagente_estado, tagente, tagente_modulo WHERE tagente.id_grupo = $group AND tagente.disabled = 0 AND tagente_estado.id_agente = tagente.id_agente AND tagente_estado.id_agente_modulo = tagente_modulo.id_agente_modulo AND tagente_modulo.disabled = 0 AND estado = 2 AND ((ceil((sysdate - to_date('19700101000000','YYYYMMDDHH24MISS')) * (86400)) - tagente_estado.utimestamp) < (tagente_estado.current_interval * 2) OR (tagente_modulo.id_tipo_modulo IN(21,22,23,24,100))) AND utimestamp > 0"); break; } switch ($config["dbtype"]) { case "mysql": $data["monitor_unknown"] += get_db_sql ("SELECT COUNT(tagente_estado.id_agente_estado) FROM tagente_estado, tagente, tagente_modulo WHERE tagente.id_grupo = $group AND tagente.disabled = 0 AND tagente.id_agente = tagente_estado.id_agente AND tagente_estado.id_agente_modulo = tagente_modulo.id_agente_modulo AND tagente_modulo.disabled = 0 AND utimestamp > 0 AND tagente_modulo.id_tipo_modulo NOT IN(21,22,23,24,100) AND (UNIX_TIMESTAMP(NOW()) - tagente_estado.utimestamp) >= (tagente_estado.current_interval * 2)"); break; case "postgresql": $data["monitor_unknown"] += get_db_sql ("SELECT COUNT(tagente_estado.id_agente_estado) FROM tagente_estado, tagente, tagente_modulo WHERE tagente.id_grupo = $group AND tagente.disabled = 0 AND tagente.id_agente = tagente_estado.id_agente AND tagente_estado.id_agente_modulo = tagente_modulo.id_agente_modulo AND tagente_modulo.disabled = 0 AND utimestamp > 0 AND tagente_modulo.id_tipo_modulo NOT IN(21,22,23,24,100) AND (ceil(date_part('epoch', CURRENT_TIMESTAMP)) - tagente_estado.utimestamp) >= (tagente_estado.current_interval * 2)"); break; case "oracle": $data["monitor_unknown"] += get_db_sql ("SELECT COUNT(tagente_estado.id_agente_estado) FROM tagente_estado, tagente, tagente_modulo WHERE tagente.id_grupo = $group AND tagente.disabled = 0 AND tagente.id_agente = tagente_estado.id_agente AND tagente_estado.id_agente_modulo = tagente_modulo.id_agente_modulo AND tagente_modulo.disabled = 0 AND utimestamp > 0 AND tagente_modulo.id_tipo_modulo NOT IN(21,22,23,24,100) AND (ceil((sysdate - to_date('19700101000000','YYYYMMDDHH24MISS')) * (86400)) - tagente_estado.utimestamp) >= (tagente_estado.current_interval * 2)"); break; } $data["monitor_not_init"] += get_db_sql ("SELECT COUNT(tagente_estado.id_agente_estado) FROM tagente_estado, tagente, tagente_modulo WHERE tagente.id_grupo = $group AND tagente.disabled = 0 AND tagente.id_agente = tagente_estado.id_agente AND tagente_estado.id_agente_modulo = tagente_modulo.id_agente_modulo AND tagente_modulo.disabled = 0 AND tagente_modulo.id_tipo_modulo NOT IN (21,22,23,24) AND utimestamp = 0"); $data["monitor_alerts"] += get_db_sql ("SELECT COUNT(talert_template_modules.id) FROM talert_template_modules, tagente_modulo, tagente_estado, tagente WHERE tagente.id_grupo = $group AND tagente_modulo.id_agente = tagente.id_agente AND tagente_estado.id_agente_modulo = tagente_modulo.id_agente_modulo AND tagente_modulo.disabled = 0 AND tagente.disabled = 0 AND talert_template_modules.id_agent_module = tagente_modulo.id_agente_modulo"); $data["monitor_alerts_fired"] += get_db_sql ("SELECT COUNT(talert_template_modules.id) FROM talert_template_modules, tagente_modulo, tagente_estado, tagente WHERE tagente.id_grupo = $group AND tagente_modulo.id_agente = tagente.id_agente AND tagente_estado.id_agente_modulo = tagente_modulo.id_agente_modulo AND tagente_modulo.disabled = 0 AND tagente.disabled = 0 AND talert_template_modules.id_agent_module = tagente_modulo.id_agente_modulo AND times_fired > 0"); } /* Monitor health (percentage) Data health (percentage) Global health (percentage) Module sanity (percentage) Alert level (percentage) Server Sanity 0% Uninitialized modules */ } if ($data["monitor_unknown"] > 0 && $data["monitor_checks"] > 0) { $data["monitor_health"] = format_numeric (100 - ($data["monitor_unknown"] / ($data["monitor_checks"] / 100)), 1); } else { $data["monitor_health"] = 100; } if ($data["monitor_not_init"] > 0 && $data["monitor_checks"] > 0) { $data["module_sanity"] = format_numeric (100 - ($data["monitor_not_init"] / ($data["monitor_checks"] / 100)), 1); } else { $data["module_sanity"] = 100; } if (isset($data["alerts"])){ if ($data["monitor_alerts_fired"] > 0 && $data["alerts"] > 0) { $data["alert_level"] = format_numeric (100 - ($data ["monitor_alerts_fired"] / ($data["alerts"] / 100)), 1); } else { $data["alert_level"] = 100; } } else { $data["alert_level"] = 100; $data["alerts"] = 0; } $data["monitor_bad"] = $data["monitor_critical"] + $data["monitor_warning"]; if ($data["monitor_bad"] > 0 && $data["monitor_checks"] > 0) { $data["global_health"] = format_numeric (100 - ($data["monitor_bad"] / ($data["monitor_checks"] / 100)), 1); } else { $data["global_health"] = 100; } $data["server_sanity"] = format_numeric (100 - $data["module_sanity"], 1); return ($data); } /** * Get an event reporting table. * * It construct a table object with all the events happened in a group * during a period of time. * * @param int Group id to get the report. * @param int Period of time to get the report. * @param int Beginning date of the report * @param int Flag to return or echo the report table (echo by default). * * @return object A table object */ function event_reporting ($id_group, $period, $date = 0, $return = false) { if (empty ($date)) { $date = get_system_time (); } elseif (!is_numeric ($date)) { $date = strtotime ($date); } $table->data = array (); $table->head = array (); $table->head[0] = __('Status'); $table->head[1] = __('Event name'); $table->head[2] = __('User ID'); $table->head[3] = __('Timestamp'); $events = get_group_events ($id_group, $period, $date); if (empty ($events)) { $events = array (); } foreach ($events as $event) { $data = array (); if ($event["estado"] == 0) $data[0] = print_image("images/dot_red.png", true); else $data[0] = print_image("images/dot_green.png", true); $data[1] = $event['evento']; $data[2] = $event['id_usuario'] != '0' ? $event['id_usuario'] : ''; $data[3] = $event["timestamp"]; array_push ($table->data, $data); } if (empty ($return)) print_table ($table); return $table; } /** * Get a table report from a alerts fired array. * * @param array Alerts fired array. * @see function get_alerts_fired () * * @return object A table object with a report of the fired alerts. */ function get_fired_alerts_reporting_table ($alerts_fired) { $agents = array (); global $config; require_once ($config["homedir"].'/include/functions_alerts.php'); foreach (array_keys ($alerts_fired) as $id_alert) { $alert_module = alerts_get_alert_agent_module ($id_alert); $template = alerts_get_alert_template ($id_alert); /* Add alerts fired to $agents_fired_alerts indexed by id_agent */ $id_agent = get_db_value ('id_agente', 'tagente_modulo', 'id_agente_modulo', $alert_module['id_agent_module']); if (!isset ($agents[$id_agent])) { $agents[$id_agent] = array (); } array_push ($agents[$id_agent], array ($alert_module, $template)); } $table->data = array (); $table->head = array (); $table->head[0] = __('Agent'); $table->head[1] = __('Alert description'); $table->head[2] = __('Times fired'); $table->head[3] = __('Priority'); foreach ($agents as $id_agent => $alerts) { $data = array (); foreach ($alerts as $tuple) { $alert_module = $tuple[0]; $template = $tuple[1]; if (! isset ($data[0])) $data[0] = get_agent_name ($id_agent); else $data[0] = ''; $data[1] = $template['name']; $data[2] = $alerts_fired[$alert_module['id']]; $data[3] = get_alert_priority ($alert_module['priority']); array_push ($table->data, $data); } } return $table; } /** * Get a report for alerts of agent. * * It prints the numbers of alerts defined, fired and not fired of agent. * * @param int $id_agent Agent to get info of the alerts. * @param int $period Period of time of the desired alert report. * @param int $date Beggining date of the report (current date by default). * @param bool $return Flag to return or echo the report (echo by default). * @param bool Flag to return the html or table object, by default html. * * @return mixed A table object (XHTML) or object table is false the html. */ function alert_reporting_agent ($id_agent, $period = 0, $date = 0, $return = true, $html = true) { if (!is_numeric ($date)) { $date = strtotime ($date); } if (empty ($date)) { $date = get_system_time (); } if (empty ($period)) { global $config; $period = $config["sla_period"]; } $table->width = '99%'; $table->data = array (); $table->head = array (); $table->head[0] = __('Module'); $table->head[1] = __('Template'); $table->head[2] = __('Actions'); $table->head[3] = __('Fired'); $alerts = agents_get_alerts ($id_agent); if (isset($alerts['simple'])) { $i = 0; if ($alerts['simple'] === false) $alerts['simple'] = array(); foreach ($alerts['simple'] as $alert) { $data = array(); $data[0] = get_db_value_filter('nombre', 'tagente_modulo', array('id_agente_modulo' => $alert['id_agent_module'])); $data[1] = get_db_value_filter('name', 'talert_templates', array('id' => $alert['id_alert_template'])); $actions = get_db_all_rows_sql('SELECT name FROM talert_actions WHERE id IN (SELECT id_alert_action FROM talert_template_module_actions WHERE id_alert_template_module = ' . $alert['id'] . ');'); $data[2] = '
'; $data[0] .= $monitor_value.' % ' . print_image("images/b_green.png", true, array("height" => "32", "width" => "32")) . '
'; if ($monitor_value !== __('Unknown')) { $monitor_value = format_numeric (100 - $monitor_value, 2) ; } $data[1] = ''; $data[1] .= $monitor_value.' % ' . print_image("images/b_red.png", true, array("height" => "32", "width" => "32")) . '
'; array_push ($table->data, $data); break; case 7: case 'avg_value': //RUNNING $data = array (); $data[0] = $sizh.__('Avg. Value').$sizhfin; $data[1] = $sizh.printTruncateText($agent_name, 75, false).''.$value.'
'; array_push ($table->data, $data); break; case 8: case 'max_value': //RUNNING $data = array (); $data[0] = $sizh.__('Max. Value').$sizhfin; $data[1] = $sizh . ui_print_truncate_text($agent_name, 75, false).''.$value.'
'; array_push ($table->data, $data); break; case 9: case 'min_value': //RUNNING $data = array (); $data[0] = $sizh.__('Min. Value').$sizhfin; $data[1] = $sizh . ui_print_truncate_text($agent_name, 75, false).''.$value.'
'; array_push ($table->data, $data); break; case 10: case 'sumatory': //RUNNING $data = array (); $data[0] = $sizh.__('Summatory').$sizhfin; $data[1] = $sizh . ui_print_truncate_text($agent_name, 75, false).''.$value.'
'; array_push ($table->data, $data); break; case 'agent_detailed_event': case 'event_report_agent': //RUNNING $data = array (); $data[0] = $sizh.__('Agent detailed event').$sizhfin; $data[1] = $sizh . ui_print_truncate_text(get_agent_name($content['id_agent']), 75, false).$sizhfin; array_push ($table->data, $data); // Put description at the end of the module (if exists) $table->colspan[1][0] = 3; if ($content["description"] != ""){ $data_desc = array(); $data_desc[0] = $content["description"]; array_push ($table->data, $data_desc); } $data = array (); $table->colspan[2][0] = 3; $data[0] = get_agents_detailed_event_reporting ($content['id_agent'], $content['period'], $report["datetime"], true); array_push ($table->data, $data); break; case 'text': $data = array(); $data[0] = $sizh. __('Text') . $sizhfin; array_push ($table->data, $data); $table->colspan[0][0] = 2; // Put description at the end of the module (if exists) $table->colspan[0][0] = 2; if ($content["description"] != ""){ $data_desc = array(); $data_desc[0] = $content["description"]; array_push ($table->data, $data_desc); } $data[0] = html_entity_decode($content['text']); array_push($table->data, $data); $table->colspan[2][0] = 2; break; case 'sql': $data = array(); $data[0] = $sizh. __('SQL') . $sizhfin; array_push ($table->data, $data); $table->colspan[0][0] = 2; // Put description at the end of the module (if exists) $table->colspan[0][0] = 2; if ($content["description"] != ""){ $data_desc = array(); $data_desc[0] = $content["description"]; array_push ($table->data, $data_desc); } $table2->class = 'databox'; $table2->width = '100%'; //Create the head $table2->head = array(); if ($content['header_definition'] != '') { $table2->head = explode('|', $content['header_definition']); } if ($content['treport_custom_sql_id'] != 0) { switch ($config["dbtype"]) { case "mysql": $sql = safe_output_html (get_db_value_filter('`sql`', 'treport_custom_sql', array('id' => $content['treport_custom_sql_id']))); break; case "postgresql": $sql = safe_output_html (get_db_value_filter('"sql"', 'treport_custom_sql', array('id' => $content['treport_custom_sql_id']))); break; case "oracle": $sql = safe_output_html (get_db_value_filter('sql', 'treport_custom_sql', array('id' => $content['treport_custom_sql_id']))); break; } } else { $sql = safe_output_html ($content['external_source']); } // Do a security check on SQL coming from the user $sql = check_sql ($sql); if($sql != '') { $result = get_db_all_rows_sql($sql); if ($result === false) { $result = array(); } if (isset($result[0])) { if (count($result[0]) > count($table2->head)) { $table2->head = array_pad($table2->head, count($result[0]), ' '); } } $table2->data = array(); foreach ($result as $row) { array_push($table2->data, $row); } } else { $table2->data = array(); array_push($table2->data, array("id_user" => "'.$ttr.'
'; array_push ($table->data, $data); break; case 'TTO': $data = array (); $data[0] = $sizh. __('TTO') . $sizhfin; $data[1] = $sizh.ui_print_truncate_text($agent_name, 70, false).''.$tto.'
'; array_push ($table->data, $data); break; case 'MTBF': $data = array (); $data[0] = $sizh. __('MTBF') . $sizhfin; $data[1] = $sizh.ui_print_truncate_text($agent_name, 70, false).''.$mtbf.'
'; array_push ($table->data, $data); break; case 'MTTR': $data = array (); $data[0] = $sizh. __('MTTR') . $sizhfin; $data[1] = $sizh.ui_print_truncate_text($agent_name, 70, false).''.$mttr.'
'; array_push ($table->data, $data); break; case 'general': $group_by_agent = $content['group_by_agent']; $order_uptodown = $content['order_uptodown']; $table->style[1] = 'text-align: right'; $data = array (); $data[0] = $sizh.__('General').$sizhfin; $data[1] = $sizh.human_time_description_raw ($content['period']).$sizhfin; array_push ($table->data, $data); // Put description at the end of the module (if exists) $table->colspan[1][0] = 3; if ($content["description"] != ""){ $data_desc = array(); $data_desc[0] = $content["description"]; array_push ($table->data, $data_desc); } switch ($group_by_agent) { //0 means not group by agent case 0: $sql = sprintf("select a.id_agent_module, b.nombre as agent_name, c.nombre as module_name from treport_content_item as a, tagente as b, tagente_modulo as c where a.id_agent_module = c.id_agente_modulo and c.id_agente = b.id_agente and id_report_content = %d", $content['id_rc']); $generals = process_sql ($sql); if ($generals === false) { $data = array (); $table->colspan[2][0] = 3; $data[0] = __('There are no Agent/Modules defined'); array_push ($table->data, $data); break; } $table1->width = '99%'; $table1->data = array (); $table1->head = array (); $table1->head[0] = __('Agent'); $table1->head[1] = __('Module'); $table1->head[2] = __('Value'); $table1->style[0] = 'text-align: center'; $table1->style[1] = 'text-align: center'; $table1->style[2] = 'text-align: center'; $data_avg = array(); foreach ($generals as $key => $row) { $data_avg[$key] = get_agentmodule_data_average ($row['id_agent_module'], $content['period']); $id_agent_module[$key] = $row['id_agent_module']; $agent_name[$key] = $row['agent_name']; $module_name[$key] = $row['module_name']; } if ($order_uptodown == 0 || $order_uptodown == 1 || $order_uptodown == 2) { switch ($order_uptodown) { //Descending case 1: array_multisort($data_avg, SORT_DESC, $agent_name, SORT_ASC, $module_name, SORT_ASC, $id_agent_module, SORT_ASC); break; //Ascending case 2: array_multisort($data_avg, SORT_ASC, $agent_name, SORT_ASC, $module_name, SORT_ASC, $id_agent_module, SORT_ASC); break; } $i=0; foreach ($data_avg as $d) { $data = array(); $data[0] = printSmallFont($agent_name[$i]); $data[1] = printSmallFont($module_name[$i]); $d === false ? $data[2] = '--':$data[2] = $d; array_push ($table1->data, $data); $i++; } } elseif ($order_uptodown == 3) { array_multisort($agent_name, SORT_ASC, $data_avg, SORT_ASC, $module_name, SORT_ASC, $id_agent_module, SORT_ASC); $i=0; foreach ($agent_name as $a) { $data = array(); $data[0] = printSmallFont($agent_name[$i]); $data[1] = printSmallFont($module_name[$i]); $data_avg[$i] === false ? $data[2] = '--':$data[2] = $data_avg[$i]; array_push ($table1->data, $data); $i++; } } $table->colspan[2][0] = 3; $data = array(); $data[0] = print_table($table1, true); array_push ($table->data, $data); break; //1 means group by agent case 1: //Get the list of agents $sql_agents = sprintf ("select distinct ta.nombre from tagente as ta, tagente_modulo as tam, treport_content_item as trci where ta.id_agente = tam.id_agente and tam.id_agente_modulo = trci.id_agent_module and trci.id_report_content = %d", $content['id_rc']); $agent_list = process_sql ($sql_agents); //Get the list of modules $sql_modules = sprintf ("select distinct tam.nombre from tagente_modulo as tam, treport_content_item as trci where tam.id_agente_modulo = trci.id_agent_module and trci.id_report_content = %d", $content['id_rc']); $modules_list = process_sql ($sql_modules); //Get the data $sql_data = sprintf("select trci.id_agent_module, ta.nombre as agent_name, tam.nombre as module_name from treport_content_item as trci, tagente as ta, tagente_modulo as tam where ta.id_agente = tam.id_agente and tam.id_agente_modulo = trci.id_agent_module and id_report_content = %d", $content['id_rc']); $generals = process_sql ($sql_data); if ($generals === false) { $data = array (); $table->colspan[2][0] = 3; $data[0] = __('There are no Agent/Modules defined'); array_push ($table->data, $data); break; } $table2->width = '99%'; $table2->data = array (); $table2->head = array (); $table2->head[0] = __('Agent'); $table2->style[0] = 'text-align: center'; $i = 1; foreach ($modules_list as $m) { $table2->head[$i] = ui_print_truncate_text($m['nombre'], 20, false); $table2->style[$i] = 'text-align: center'; $i++; } foreach ($agent_list as $a) { $data = array(); $data[0] = printSmallFont($a['nombre']); $i = 1; foreach ($modules_list as $m) { foreach ($generals as $g) { $agent_name = $g['agent_name']; $module_name = $g['module_name']; $found = false; if (strcmp($a['nombre'], $agent_name) == 0 && strcmp($m['nombre'], $module_name) == 0) { if (get_agentmodule_data_average($g['id_agent_module'], $content['period']) === false) $data[$i] = '--'; else { $data[$i] = get_agentmodule_data_average($g['id_agent_module'], $content['period']); } $found = true; } else { $data[$i] = '--'; } if ($found == true) break; } $i++; } array_push($table2->data, $data); } $table->colspan[2][0] = 3; $data = array(); $data[0] = print_table($table2, true); array_push ($table->data, $data); break; } if ($content['show_resume'] && count($generals) > 0) { //Get the first valid value and assign it to $min & $max $min = false; $i=0; do { $min = get_agentmodule_data_average($generals[$i]['id_agent_module'], $content['period']); $i++; } while ($min === false && $i < count($generals)); $max = $min; $avg = 0; $length = 0; if ($generals === false) { $generals = array(); } foreach ($generals as $g) { $value = get_agentmodule_data_average ($g['id_agent_module'], $content['period']); if ($value !== false) { if ($value > $max) { $max = $value; } if ($value < $min ) { $min = $value; } $avg += $value; $length++; } } if ($length == 0) { $avg = 0; } else { $avg = $avg / $length; } $data_resume = array(); $data_resume[0] = "Max Value: ".$max; array_push ($table->data, $data_resume); $data_resume[0] = "Min Value: ".$min; array_push ($table->data, $data_resume); $data_resume[0] = "Average Value: ".$avg; array_push ($table->data, $data_resume); } break; case 'top_n': $order_uptodown = $content['order_uptodown']; $top_n = $content['top_n']; $top_n_value = $content['top_n_value']; $show_graph = $content['show_graph']; $table->style[1] = 'text-align: right'; $data = array (); $data[0] = $sizh.__('Top').' '.$content['top_n_value'].$sizhfin; $data[1] = $sizh.human_time_description_raw ($content['period']).$sizhfin; array_push ($table->data, $data); // Put description at the end of the module (if exists) $table->colspan[1][0] = 3; if ($content["description"] != ""){ $data_desc = array(); $data_desc[0] = $content["description"]; array_push ($table->data, $data_desc); } //Get all the related data $sql = sprintf("select a.id_agent_module, b.nombre as agent_name, c.nombre as module_name from treport_content_item as a, tagente as b, tagente_modulo as c where a.id_agent_module = c.id_agente_modulo and c.id_agente = b.id_agente and id_report_content = %d", $content['id_rc']); $tops = process_sql ($sql); if ($tops === false) { $data = array (); $table->colspan[2][0] = 3; $data[0] = __('There are no Agent/Modules defined'); array_push ($table->data, $data); break; } if ($show_graph == 0 || $show_graph == 1) { $table1->width = '99%'; $table1->data = array (); $table1->head = array (); $table1->head[0] = __('Agent'); $table1->head[1] = __('Module'); $table1->head[2] = __('Value'); $table1->style[0] = 'text-align: center'; $table1->style[1] = 'text-align: center'; $table1->style[2] = 'text-align: center'; } $data_top = array(); foreach ($tops as $key => $row) { switch ($top_n) { //Max case 1: $value = get_agentmodule_data_max ($row['id_agent_module'], $content['period']); break; //Min case 2: $value = get_agentmodule_data_min ($row['id_agent_module'], $content['period']); break; //Nothing or Average case 0: //If nothing is selected then it will be shown the average data case 3: $value = get_agentmodule_data_average ($row['id_agent_module'], $content['period']); break; } //If the returned value from get_agentmodule_data... is false it won't be stored. if ($value !== false) { $data_top[$key] = $value; $id_agent_module[$key] = $row['id_agent_module']; $agent_name[$key] = $row['agent_name']; $module_name[$key] = $row['module_name']; } } switch ($top_n) { //Max case 1: array_multisort($data_top, SORT_DESC, $agent_name, SORT_ASC, $module_name, SORT_ASC, $id_agent_module, SORT_ASC); break; //Min case 2: array_multisort($data_top, SORT_ASC, $agent_name, SORT_ASC, $module_name, SORT_ASC, $id_agent_module, SORT_ASC); break; //By agent name or without selection case 0: case 3: array_multisort($agent_name, SORT_ASC, $data_top, SORT_ASC, $module_name, SORT_ASC, $id_agent_module, SORT_ASC); break; } $data_top_values = array (); $data_top_values['data_top'] = $data_top; $data_top_values['agent_name'] = $agent_name; $data_top_values['module_name'] = $module_name; $data_top_values['id_agent_module'] = $id_agent_module; array_splice ($data_top, $top_n_value); array_splice ($agent_name, $top_n_value); array_splice ($module_name, $top_n_value); array_splice ($id_agent_module, $top_n_value); switch ($order_uptodown) { //Descending case 1: array_multisort($data_top, SORT_DESC, $agent_name, SORT_ASC, $module_name, SORT_ASC, $id_agent_module, SORT_ASC); break; //Ascending case 2: array_multisort($data_top, SORT_ASC, $agent_name, SORT_ASC, $module_name, SORT_ASC, $id_agent_module, SORT_ASC); break; //By agent name or without selection case 0: case 3: array_multisort($agent_name, SORT_ASC, $data_top, SORT_ASC, $module_name, SORT_ASC, $id_agent_module, SORT_ASC); break; } if ($order_uptodown == 1 || $order_uptodown == 2) { $i = 0; $data_pie_graph = array(); foreach ($data_top as $dt) { $data_pie_graph[$agent_name[$i]] = $dt; if ($show_graph == 0 || $show_graph == 1) { $data = array(); $data[0] = printSmallFont($agent_name[$i]); $data[1] = printSmallFont($module_name[$i]); $data[2] = $dt; array_push ($table1->data, $data); } $i++; if ($i >= $top_n_value) break; } } else if ($order_uptodown == 0 || $order_uptodown == 3) { $i = 0; $data_pie_graph = array(); $data_hbar = array(); foreach ($agent_name as $an) { $data_pie_graph[$an] = $data_top[$i]; $data_hbar[$an]['g'] = $data_top[$i]; if ($show_graph == 0 || $show_graph == 1) { $data = array(); $data[0] = printSmallFont($an); $data[1] = printSmallFont($module_name[$i]); $data[2] = $data_top[$i]; array_push ($table1->data, $data); } $i++; if ($i >= $top_n_value) break; } } $table->colspan[2][0] = 3; if ($show_graph == 0 || $show_graph == 1) { $data = array(); $data[0] = print_table($table1, true); array_push ($table->data, $data); } $table->colspan[3][0] = 3; $data = array(); if ($show_graph == 1 || $show_graph == 2) { $data[0] = pie3d_graph($config['flash_charts'], $data_pie_graph, 600, 150, __("other")); array_push ($table->data, $data); //Display bars graph $table->colspan[4][0] = 3; $height = count($data_pie_graph)*20+35; $data = array(); $data[0] = hbar_graph($config['flash_charts'], $data_hbar, 600, $height); array_push ($table->data, $data); } if ($content['show_resume'] && count($data_top_values) > 0) { //Get the very first not null value $i=0; do { $min = $data_top_values['data_top'][$i]; $i++; } while ($min === false && $i < count($data_top_values)); $max = $min; $avg = 0; $i=0; foreach ($data_top_values['data_top'] as $key => $dtv) { if ($dtv < $min) $min = $dtv; if ($dtv > $max) $max = $dtv; $avg += $dtv; $i++; } $avg = $avg / $i; $data_resume = array(); $data_resume[0] = __('Max Value').': '.$max; array_push ($table->data, $data_resume); $data_resume[0] = __('Min Value').': '.$min; array_push ($table->data, $data_resume); $data_resume[0] = __('Average Value').': '.$avg; array_push ($table->data, $data_resume); } break; case 'exception': $order_uptodown = $content['order_uptodown']; $exception_condition = $content['exception_condition']; $exception_condition_value = $content['exception_condition_value']; $show_graph = $content['show_graph']; $table->style[1] = 'text-align: right'; $data = array (); $data[0] = $sizh.__('Exception'); switch ($exception_condition) { case 0: $data[0] .= ' - '.__('Everything'); break; case 1: $data[0] .= ' - '.__('Modules over or equal to').' '.$exception_condition_value; break; case 2: $data[0] .= ' - '.__('Modules under').' '.$exception_condition_value; break; case 3: $data[0] .= ' - '.__('Modules at normal status'); break; case 4: $data[0] .= ' - '.__('Modules at critical or warning status'); break; } $data[0].=$sizhfin; $data[1] = $sizh.human_time_description_raw ($content['period']).$sizhfin; array_push ($table->data, $data); // Put description at the end of the module (if exists) $table->colspan[1][0] = 3; if ($content["description"] != ""){ $data_desc = array(); $data_desc[0] = $content["description"]; array_push ($table->data, $data_desc); } //Get all the related data $sql = sprintf("select a.id_agent_module, b.nombre as agent_name, c.nombre as module_name from treport_content_item as a, tagente as b, tagente_modulo as c where a.id_agent_module = c.id_agente_modulo and c.id_agente = b.id_agente and id_report_content = %d", $content['id_rc']); $exceptions = process_sql ($sql); if ($exceptions === false) { $data = array (); $table->colspan[2][0] = 3; $data[0] = __('There are no Agent/Modules defined'); array_push ($table->data, $data); break; } if ($show_graph == 0 || $show_graph == 1) { $table1->width = '99%'; $table1->data = array (); $table1->head = array (); $table1->head[0] = __('Agent'); $table1->head[1] = __('Module'); $table1->head[2] = __('Value'); $table1->style[0] = 'text-align: center'; $table1->style[1] = 'text-align: center'; $table1->style[2] = 'text-align: center'; } //Get the very first not null value $i=0; do { $min = get_agentmodule_data_average ($exceptions[$i]['id_agent_module'], $content['period']); $i++; } while ($min === false && $i < count($exceptions)); $max = $min; $avg = 0; $i=0; foreach ($exceptions as $exc) { $value = get_agentmodule_data_average ($exc['id_agent_module'], $content['period']); if ($value !== false) { if ($value > $max) $max = $value; if ($value < $min) $min = $value; $avg += $value; switch ($exception_condition) { //Display everything case 0: break; //Display modules over or equal to certain value case 1: //Skip modules under 'value' if ($value < $exception_condition_value) { continue 2; } break; //Display modules under a certain value case 2: //Skip modules over or equal to 'value' if ($value >= $exception_condition_value) { continue 2; } break; //Display modules at Normal status case 3: //Skip modules without normal status if (get_agentmodule_status($exc['id_agent_module']) != 0) { continue 2; } break; //Display modules at critical, warning or unknown status case 4: //Skip modules at normal status if (get_agentmodule_status($exc['id_agent_module']) == 0) { continue 2; } break; } $i++; $data_exceptions[] = $value; $id_agent_module[] = $exc['id_agent_module']; $agent_name[] = $exc['agent_name']; $module_name[] = $exc['module_name']; } } //$i <= 0 means that there are no rows on the table, therefore no modules under the conditions defined. if ($i<=0) { $data = array (); $table->colspan[2][0] = 3; $data[0] = __('There are no'); switch ($exception_condition) { case 1: $data[0] .= ' '.__('Modules over or equal to').' '.$exception_condition_value; break; case 2: $data[0] .= ' '.__('Modules under').' '.$exception_condition_value; break; case 3: $data[0] .= ' '.__('Modules at normal status'); break; case 4: $data[0] .= ' '.__('Modules at critial or warning status'); break; default: $data[0] .= ' '.__('Modules under those conditions'); break; } array_push ($table->data, $data); break; } //$i > 0 means that there is at least one row on the table elseif ($i > 0) { $avg = $avg / $i; switch ($order_uptodown) { //Descending case 1: array_multisort($data_exceptions, SORT_DESC, $agent_name, SORT_ASC, $module_name, SORT_ASC, $id_agent_module, SORT_ASC); break; //Ascending case 2: array_multisort($data_exceptions, SORT_ASC, $agent_name, SORT_ASC, $module_name, SORT_ASC, $id_agent_module, SORT_ASC); break; //By agent name or without selection case 0: case 3: array_multisort($agent_name, SORT_ASC, $data_exceptions, SORT_ASC, $module_name, SORT_ASC, $id_agent_module, SORT_ASC); break; } if ($order_uptodown == 1 || $order_uptodown == 2) { $j=0; $data_pie_graph = array(); foreach ($data_exceptions as $dex) { $data_pie_graph[$agent_name[$j]] = $dex; if ($show_graph == 0 || $show_graph == 1) { $data = array(); $data[0] = printSmallFont($agent_name[$j]); $data[1] = printSmallFont($module_name[$j]); $data[2] = $dex; array_push ($table1->data, $data); } $j++; } } else if ($order_uptodown == 0 || $order_uptodown == 3) { $j=0; $data_pie_graph = array(); foreach ($agent_name as $an) { $data_pie_graph[$an] = $data_exceptions[$j]; if ($show_graph == 0 || $show_graph == 1) { $data = array(); $data[0] = printSmallFont($an); $data[1] = printSmallFont($module_name[$j]); $data[2] = $data_exceptions[$j]; array_push ($table1->data, $data); } $j++; } } } $table->colspan[2][0] = 3; if ($show_graph == 0 || $show_graph == 1) { $data = array(); $data[0] = print_table($table1, true); array_push ($table->data, $data); } $table->colspan[3][0] = 3; $data = array(); if ($show_graph == 1 || $show_graph == 2) { $data[0] = pie3d_graph($config['flash_charts'], $data_graph, 600, 150, __("other")); array_push ($table->data, $data); //Display bars graph $table->colspan[4][0] = 3; $height = count($data_pie_graph)*20+35; $data = array(); $data[0] = hbar_graph($config['flash_charts'], $data_horin_graph, 600, $height); array_push ($table->data, $data); } if ($content['show_resume'] && $i>0) { $data_resume = array(); $data_resume[0] = __('Max Value').': '.$max; array_push ($table->data, $data_resume); $data_resume[0] = __('Min Value').': '.$min; array_push ($table->data, $data_resume); $data_resume[0] = __('Average Value').': '.$avg; array_push ($table->data, $data_resume); } break; case 'agent_module': $id_group = $content['id_group']; $id_module_group = $content['id_module_group']; $offset = get_parameter('offset', 0); $block = 20; //Maximun number of modules displayed on the table $modulegroup = get_parameter('modulegroup', 0); $table->style[1] = 'text-align: right'; $data = array (); $data[0] = $sizh.__('Agents/Modules').$sizhfin; $data[1] = $sizh.human_time_description_raw ($content['period']).$sizhfin; array_push ($table->data, $data); // Put description at the end of the module (if exists) $table->colspan[1][0] = 3; if ($content["description"] != ""){ $data_desc = array(); $data_desc[0] = $content["description"]; array_push ($table->data, $data_desc); } $agents = ''; if($id_group > 0) { $agents = get_group_agents($id_group); $agents = array_keys($agents); } $filter_module_groups = false; if($id_module_group > 0) { $filter_module_groups['id_module_group'] = $id_module_group; } $all_modules = get_agent_modules ($agents, false, $filter_module_groups, true, false); $modules_by_name = array(); $name = ''; $cont = 0; foreach($all_modules as $key => $module) { if($module == $name) { $modules_by_name[$cont-1]['id'][] = $key; } else { $name = $module; $modules_by_name[$cont]['name'] = $name; $modules_by_name[$cont]['id'][] = $key; $cont ++; } } if($config["pure"] == 1) { $block = count($modules_by_name); } $filter_groups = array ('offset' => (int) $offset, 'limit' => (int) $config['block_size']); if($id_group > 0) { $filter_groups['id_grupo'] = $id_group; } $agents = agents_get_agents ($filter_groups); $nagents = count($agents); if($all_modules == false || $agents == false) { $data = array (); $table->colspan[2][0] = 3; $data[0] = __('There are no agents with modules'); array_push ($table->data, $data); break; } $table_data = '".__("Agents")." / ".__("Modules")." | "; $nmodules = 0; foreach($modules_by_name as $module) { $nmodules++; if($nmodules > $block) { //Will show only the (block) first modules continue; } $file_name = string2image(ui_print_truncate_text($module['name'],15, false, true, false, '...'), 115, 13, 3, 270, '#9EAC8B', 'FFF', 4, 0); $table_data .= ''.print_image($file_name, true, array('title' => $module['name']))." | "; } if ($block < $nmodules) { $table_data .= "... | "; } $filter_agents = false; if($id_group > 0) { $filter_agents = array('id_grupo' => $id_group); } // Prepare pagination ui_pagination ((int)count(agents_get_agents ($filter_agents))); $table_data .= "
---|---|---|
".print_image($file_name, true, array('title' => $agent['nombre']))." | "; $agent_modules = get_agent_modules($agent['id_agente']); $nmodules = 0; foreach($modules_by_name as $module) { $nmodules++; if($nmodules > $block) { continue; } $match = false; foreach($module['id'] as $module_id){ if(!$match && array_key_exists($module_id,$agent_modules)) { $status = get_agentmodule_status($module_id); $table_data .= ""; $win_handle = dechex(crc32($module_id.$module["name"])); $graph_type = return_graphtype (get_agentmodule_type($module_id)); switch($status){ case 0: $table_data .= ui_print_status_image ('module_ok.png', $module['name']." in ".$agent['nombre'].": ".__('NORMAL'), true, array('width' => '20px', 'height' => '20px')); break; case 1: $table_data .= ui_print_status_image ('module_critical.png', $module['name']." in ".$agent['nombre'].": ".__('CRITICAL'), true, array('width' => '20px', 'height' => '20px')); break; case 2: $table_data .= ui_print_status_image ('module_warning.png', $module['name']." in ".$agent['nombre'].": ".__('WARNING'), true, array('width' => '20px', 'height' => '20px')); break; case 3: $table_data .= ui_print_status_image ('module_unknown.png', $module['name']." in ".$agent['nombre'].": ".__('UNKNOWN'), true, array('width' => '20px', 'height' => '20px')); break; case 4: $table_data .= ui_print_status_image ('module_alertsfired.png', $module['name']." in ".$agent['nombre'].": ".__('ALERTS FIRED'), true, array('width' => '20px', 'height' => '20px')); break; } $table_data .= " | "; $match = true; } } if(!$match) { $table_data .= ""; } } $table_data .= " |
" . __("The colours meaning:") . "