' . (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 = modules_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 = modules_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); // Do not count the empty start of an interval as 0 if ($previous_data['utimestamp'] != $datelimit) { $period = $date - $previous_data['utimestamp']; } } 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 reporting_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 = modules_get_agentmodule_type ($id_agent_module); $module_type = modules_get_moduletype_name ($id_module_type); $uncompressed_module = is_module_uncompressed ($module_type); // Get module data $interval_data = db_get_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 = modules_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 = modules_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 reporting_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 = modules_get_agentmodule_type ($id_agent_module); $module_type = modules_get_moduletype_name ($id_module_type); $uncompressed_module = is_module_uncompressed ($module_type); // Get module data $interval_data = db_get_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 = modules_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 = modules_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 reporting_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 = db_get_value ('id_tipo_modulo', 'tagente_modulo','id_agente_modulo', $id_agent_module); $module_name = db_get_value ('nombre', 'ttipo_modulo', 'id_tipo', $id_module_type); $module_interval = modules_get_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 = db_get_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 = modules_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 = modules_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 reporting_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 ($timeFrom < $timeTo) { $sql .= ' AND (TIME(FROM_UNIXTIME(utimestamp)) >= "' . $timeFrom . '" AND TIME(FROM_UNIXTIME(utimestamp)) <= "'. $timeTo . '")'; } elseif ($timeFrom > $timeTo) { $sql .= ' AND (TIME(FROM_UNIXTIME(utimestamp)) >= "' . $timeFrom . '" OR TIME(FROM_UNIXTIME(utimestamp)) <= "'. $timeTo . '")'; } $sql .= ' ORDER BY utimestamp ASC'; $interval_data = db_get_all_rows_sql ($sql, true); if ($interval_data === false) { $interval_data = array (); } // Get previous data $previous_data = modules_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 = modules_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); // Do not count the empty start of an interval as 0 if ($first_data['utimestamp'] != $datelimit) { $period = $date - $first_data['utimestamp']; } $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 reporting_get_agentmodule_sla_array ($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 ($timeFrom != $timeTo) { if ($timeFrom < $timeTo) { $sql .= ' AND (TIME(FROM_UNIXTIME(utimestamp)) >= "' . $timeFrom . '" AND TIME(FROM_UNIXTIME(utimestamp)) <= "'. $timeTo . '")'; } elseif ($timeFrom > $timeTo) { $sql .= ' AND (TIME(FROM_UNIXTIME(utimestamp)) >= "' . $timeFrom . '" OR TIME(FROM_UNIXTIME(utimestamp)) <= "'. $timeTo . '")'; } } $sql .= ' ORDER BY utimestamp ASC'; $interval_data = db_get_all_rows_sql ($sql, true); if ($interval_data === false) { $interval_data = array (); } // Get previous data $previous_data = modules_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 = modules_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; } //Get the percentage for the limits $diff = $max_value - $min_value; //Getting 10% of $diff --> $percent = ($diff/100)*10, so... $percent = $diff / 10; //Set initial conditions $first_data = array_shift ($interval_data); $previous_utimestamp = $date - $period; if ($previous_utimestamp == $first_data['utimestamp']) { $previous_value = $first_data ['datos']; $previous_status = 0; if ($previous_value < 0) {// 4 for the Unknown value $previous_status = 4; } elseif ((($previous_value >= ($min_value - $percent)) && ($previous_value <= ($min_value + $percent))) || (($previous_value >= ($max_value - $percent)) && ($previous_value <= ($max_value + $percent)))) {//2 when value is within the edges $previous_status = 2; } elseif (($previous_value > ($min_value + $percent)) && ($previous_value < ($max_value - $percent))) { //1 when value is OK $previous_status = 1; } elseif (($previous_value < ($min_value - $percent)) || ($previous_value > ($max_value + $percent))) { //3 when value is Wrong $previous_status = 3; } } else { $previous_status = 1; } $data_colors = array(); $i = 0; foreach ($interval_data as $data) { $change = false; $value = $data['datos']; if ($value < 0) {// 4 for the Unknown value $status = 4; } elseif ((($value >= ($min_value - $percent)) && ($value <= ($min_value + $percent))) || (($value >= ($max_value - $percent)) && ($value <= ($max_value + $percent)))) {//2 when value is within the edges $status = 2; } elseif (($value > ($min_value + $percent)) && ($value < ($max_value - $percent))) { //1 when value is OK $status = 1; } elseif (($value < ($min_value - $percent)) || ($value > ($max_value + $percent))) { //3 when value is Wrong $status = 3; } if ($status != $previous_status) { $change = true; $data_colors[$i]['data'] = $previous_status; $data_colors[$i]['utimestamp'] = $data['utimestamp'] - $previous_utimestamp; $i++; $previous_status = $status; $previous_utimestamp = $data['utimestamp']; } } if ($change == false) { $data_colors[$i]['data'] = $previous_status; $data_colors[$i]['utimestamp'] = $data['utimestamp'] - $previous_utimestamp; } return $data_colors; } /** * Get general statistical info on a group * * @param int Group Id to get info from. 0 = all * * @return array Group statistics */ function reporting_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 (users_get_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 = db_get_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"] += db_get_sql ("SELECT COUNT(*) FROM tagente WHERE id_grupo = $group AND disabled = 0 AND ultimo_contacto < NOW() - (intervalo * 2)"); break; case "postgresql": $data["agents_unknown"] += db_get_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"] += db_get_sql ("SELECT COUNT(*) FROM tagente WHERE id_grupo = $group AND disabled = 0 AND ultimo_contacto < CURRENT_TIMESTAMP - (intervalo * 2)"); break; } $data["total_agents"] += db_get_sql ("SELECT COUNT(*) FROM tagente WHERE id_grupo = $group AND disabled = 0"); $data["monitor_checks"] += db_get_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"] += db_get_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"] += db_get_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"] += db_get_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"] += db_get_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"] += db_get_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"] += db_get_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"] += db_get_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"] += db_get_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"] += db_get_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"] += db_get_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"] += db_get_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"] += db_get_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"] += db_get_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"] += db_get_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"] += db_get_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"] += db_get_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 reporting_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 = 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] = html_print_image("images/dot_red.png", true); else $data[0] = html_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)) html_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 reporting_get_fired_alerts_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 = db_get_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] = agents_get_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 reporting_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] = db_get_value_filter('nombre', 'tagente_modulo', array('id_agente_modulo' => $alert['id_agent_module'])); $data[1] = db_get_value_filter('name', 'talert_templates', array('id' => $alert['id_alert_template'])); $actions = db_get_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[3] = ''; if ($alert['disabled']) { $table->rowstyle[$i] = 'color: grey; font-style: italic;'; } $i++; array_push ($table->data, $data); } } if ($html) { return html_print_table ($table, $return); } else { return $table; } } /** * Get a report for alerts of module. * * It prints the numbers of alerts defined, fired and not fired of agent. * * @param int $id_agent_module Module 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 reporting_alert_reporting_module ($id_agent_module, $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[1] = __('Template'); $table->head[2] = __('Actions'); $table->head[3] = __('Fired'); $alerts = db_get_all_rows_sql('SELECT * FROM talert_template_modules AS t1 INNER JOIN talert_templates AS t2 ON t1.id = t2.id WHERE id_agent_module = ' . $id_agent_module); if ($alerts === false) { $alerts = array(); } $i = 0; foreach ($alerts as $alert) { $data = array(); $data[1] = db_get_value_filter('name', 'talert_templates', array('id' => $alert['id_alert_template'])); $actions = db_get_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[3] = ''; if ($alert['disabled']) { $table->rowstyle[$i] = 'color: grey; font-style: italic;'; } $i++; array_push ($table->data, $data); } if ($html) { return html_print_table ($table, $return); } else { return $table; } } /** * Get a report for alerts in a group of agents. * * It prints the numbers of alerts defined, fired and not fired in a group. * It also prints all the alerts that were fired grouped by agents. * * @param int $id_group Group 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). * * @return string */ function reporting_alert_reporting ($id_group, $period = 0, $date = 0, $return = false) { global $config; $output = ''; $alerts = get_group_alerts ($id_group); $alerts_fired = get_alerts_fired ($alerts, $period, $date); $fired_percentage = 0; if (sizeof ($alerts) > 0) $fired_percentage = round (sizeof ($alerts_fired) / sizeof ($alerts) * 100, 2); $not_fired_percentage = 100 - $fired_percentage; $data = array (); $data[__('Alerts fired')] = $fired_percentage; $data[__('Alerts not fired')] = $not_fired_percentage; $output .= pie3d_graph($config['flash_charts'], $data, 280, 150, __("other"), "", $config['homedir'] . "/images/logo_vertical_water.png", $config['fontpath'], $config['font_size']); $output .= ''.__('Alerts fired').': '.sizeof ($alerts_fired).'
'; $output .= ''.__('Total alerts monitored').': '.sizeof ($alerts).'
'; if (! sizeof ($alerts_fired)) { if (!$return) echo $output; return $output; } $table = reporting_get_fired_alerts_table ($alerts_fired); $table->width = '100%'; $table->class = 'databox'; $table->size = array (); $table->size[0] = '100px'; $table->style = array (); $table->style[0] = 'font-weight: bold'; $output .= html_print_table ($table, true); if (!$return) echo $output; return $output; } /** * Get a report for monitors modules in a group of agents. * * It prints the numbers of monitors defined, showing those which went up and down, in a group. * It also prints all the down monitors in the group. * * @param int $id_group Group to get info of the monitors. * @param int $period Period of time of the desired monitor report. * @param int $date Beginning date of the report in UNIX time (current date by default). * @param bool $return Flag to return or echo the report (by default). * * @return string */ function reporting_monitor_health ($id_group, $period = 0, $date = 0, $return = false) { if (empty ($date)) //If date is 0, false or empty $date = get_system_time (); $datelimit = $date - $period; $output = ''; $monitors = modules_get_monitors_in_group ($id_group); if (empty ($monitors)) //If monitors has returned false or an empty array return; $monitors_down = modules_get_monitors_down ($monitors, $period, $date); $down_percentage = round (count ($monitors_down) / count ($monitors) * 100, 2); $not_down_percentage = 100 - $down_percentage; $output .= ''.__('Total monitors').': '.count ($monitors).'
'; $output .= ''.__('Monitors down on period').': '.count ($monitors_down).'
'; $table = reporting_get_monitors_down_table ($monitors_down); $table->width = '100%'; $table->class = 'databox'; $table->size = array (); $table->size[0] = '100px'; $table->style = array (); $table->style[0] = 'font-weight: bold'; $table->size = array (); $table->size[0] = '100px'; $output .= html_print_table ($table, true); $data = array(); $data[__('Monitors OK')] = $down_percentage; $data[__('Monitors BAD')] = $not_down_percentage; $output .= pie3d_graph($config['flash_charts'], $data, 280, 150, __("other"), "", $config['homedir'] . "/images/logo_vertical_water.png", $config['fontpath'], $config['font_size']); if (!$return) echo $output; return $output; } /** * Get a report table with all the monitors down. * * @param array An array with all the monitors down * @see function modules_get_monitors_down() * * @return object A table object with a monitors down report. */ function reporting_get_monitors_down_table ($monitors_down) { $table->data = array (); $table->head = array (); $table->head[0] = __('Agent'); $table->head[1] = __('Monitor'); $agents = array (); if ($monitors_down){ foreach ($monitors_down as $monitor) { /* Add monitors fired to $agents_fired_alerts indexed by id_agent */ $id_agent = $monitor['id_agente']; if (!isset ($agents[$id_agent])) { $agents[$id_agent] = array (); } array_push ($agents[$id_agent], $monitor); $monitors_down++; } foreach ($agents as $id_agent => $monitors) { $data = array (); foreach ($monitors as $monitor) { if (! isset ($data[0])) $data[0] = agents_get_name ($id_agent); else $data[0] = ''; if ($monitor['descripcion'] != '') { $data[1] = $monitor['descripcion']; } else { $data[1] = $monitor['nombre']; } array_push ($table->data, $data); } } } return $table; } /** * Get a general report of a group of agents. * * It shows the number of agents and no more things right now. * * @param int Group to get the report * @param bool Flag to return or echo the report (by default). * * @return HTML string with group report */ function reporting_print_group_reporting ($id_group, $return = false) { $agents = agents_get_group_agents ($id_group, false, "none"); $output = ''.__('Agents in group').': '.count ($agents).'
'; if ($return === false) echo $output; return $output; } /** * Get a report table of the fired alerts group by agents. * * @param int Agent id to generate the report. * @param int Period of time of the report. * @param int Beginning date of the report in UNIX time (current date by default). * * @return object A table object with the alert reporting.. */ function reporting_get_agent_alerts_table ($id_agent, $period = 0, $date = 0) { global $config; $table->data = array (); $table->head = array (); $table->head[0] = __('Type'); $table->head[1] = __('Description'); $table->head[2] = __('Value'); $table->head[3] = __('Threshold'); $table->head[4] = __('Last fired'); $table->head[5] = __('Times fired'); require_once ($config["homedir"].'/include/functions_alerts.php'); $alerts = agents_get_alerts ($id_agent); /* FIXME: Add compound alerts to the report. Some extra code is needed here */ foreach ($alerts['simple'] as $alert) { $fires = get_alert_fires_in_period ($alert['id'], $period, $date); if (! $fires) { continue; } $template = alerts_get_alert_template ($alert['id_alert_template']); $data = array (); $data[0] = alerts_get_alert_templates_type_name ($template['type']); $data[1] = $template['name']; switch ($template['type']) { case 'regex': if ($template['matches_value']) $data[2] = '≃ "'.$template['value'].'"'; else $data[2] = '≄ "'.$template['value'].'"'; break; case 'equal': case 'not_equal': $data[2] = $template['value']; break; case 'max-min': $data[2] = __('Min.').': '.$template['min_value']. ' '; $data[2] .= __('Max.').': '.$template['max_value']. ' '; break; case 'max': $data[2] = $template['max_value']; break; case 'min': $data[2] = $template['min_value']; break; } $data[3] = $template['time_threshold']; $data[4] = ui_print_timestamp (get_alert_last_fire_timestamp_in_period ($alert['id'], $period, $date), true); $data[5] = $fires; array_push ($table->data, $data); } return $table; } /** * Get a report of monitors in an agent. * * @param int Agent id to get the report * @param int Period of time of the report. * @param int Beginning date of the report in UNIX time (current date by default). * * @return object A table object with the report. */ function reporting_get_agent_monitors_table ($id_agent, $period = 0, $date = 0) { $n_a_string = __('N/A').'(*)'; $table->head = array (); $table->head[0] = __('Monitor'); $table->head[1] = __('Last failure'); $table->data = array (); $monitors = modules_get_monitors_in_agent ($id_agent); if ($monitors === false) { return $table; } foreach ($monitors as $monitor) { $downs = modules_get_monitor_downs_in_period ($monitor['id_agente_modulo'], $period, $date); if (! $downs) { continue; } $data = array (); if ($monitor['descripcion'] != $n_a_string && $monitor['descripcion'] != '') $data[0] = $monitor['descripcion']; else $data[0] = $monitor['nombre']; $data[1] = modules_get_last_down_timestamp_in_period ($monitor['id_agente_modulo'], $period, $date); array_push ($table->data, $data); } return $table; } /** * Get a report of all the modules in an agent. * * @param int Agent id to get the report. * @param int Period of time of the report * @param int Beginning date of the report in UNIX time (current date by default). * * @return object */ function reporting_get_agent_modules_table ($id_agent, $period = 0, $date = 0) { $table->data = array (); $n_a_string = __('N/A').'(*)'; $modules = agents_get_modules ($id_agent, array ("nombre", "descripcion")); if ($modules === false) $modules = array(); $data = array (); foreach ($modules as $module) { if ($module['descripcion'] != $n_a_string && $module['descripcion'] != '') $data[0] = $module['descripcion']; else $data[0] = $module['nombre']; array_push ($table->data, $data); } return $table; } /** * Get a detailed report of an agent * * @param int Agent to get the report. * @param int Period of time of the desired report. * @param int Beginning date of the report in UNIX time (current date by default). * @param bool Flag to return or echo the report (by default). * * @return string */ function reporting_get_agent_detailed ($id_agent, $period = 0, $date = 0, $return = false) { $output = ''; $n_a_string = __('N/A').'(*)'; /* Show modules in agent */ $output .= '
'; $output .= '

'.__('Agent').' - '.agents_get_name ($id_agent).'

'; $output .= '

'.__('Modules').'

'; $table_modules = reporting_get_agent_modules_table ($id_agent, $period, $date); $table_modules->width = '99%'; $output .= html_print_table ($table_modules, true); /* Show alerts in agent */ $table_alerts = reporting_get_agent_alerts_table ($id_agent, $period, $date); $table_alerts->width = '99%'; if (sizeof ($table_alerts->data)) { $output .= '

'.__('Alerts').'

'; $output .= html_print_table ($table_alerts, true); } /* Show monitor status in agent (if any) */ $table_monitors = reporting_get_agent_monitors_table ($id_agent, $period, $date); if (sizeof ($table_monitors->data) == 0) { $output .= '
'; if (! $return) echo $output; return $output; } $table_monitors->width = '99%'; $table_monitors->align = array (); $table_monitors->align[1] = 'right'; $table_monitors->size = array (); $table_monitors->align[1] = '10%'; $output .= '

'.__('Monitors').'

'; $output .= html_print_table ($table_monitors, true); $output .= ''; if (! $return) echo $output; return $output; } /** * Get a detailed report of agents in a group. * * @param mixed Group(s) to get the report * @param int Period * @param int Timestamp to start from * @param bool Flag to return or echo the report (by default). * * @return string */ function reporting_agents_get_group_agents_detailed ($id_group, $period = 0, $date = 0, $return = false) { $agents = agents_get_group_agents ($id_group, false, "none"); $output = ''; foreach ($agents as $agent_id => $agent_name) { $output .= reporting_get_agent_detailed ($agent_id, $period, $date, true); } if ($return === false) echo $output; return $output; } /** * Get a detailed report of summarized events per agent * * It construct a table object with all the grouped events happened in an agent * during a period of time. * * @param mixed Agent id(s) to get the report from. * @param int Period of time (in seconds) to get the report. * @param int Beginning date (unixtime) of the report * @param bool Flag to return or echo the report table (echo by default). * * @return A table object (XHTML) */ function reporting_get_agents_detailed_event ($id_agents, $period = 0, $date = 0, $return = false) { $id_agents = (array)safe_int ($id_agents, 1); 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] = __('Event name'); $table->head[1] = __('Event type'); $table->head[2] = __('Criticity'); $table->head[3] = __('Count'); $table->head[4] = __('Timestamp'); $events = array (); foreach ($id_agents as $id_agent) { $event = events_get_agent ($id_agent, (int) $period, (int) $date); if (!empty ($event)) { array_push ($events, $event); } } if ($events) foreach ($events as $eventRow) { foreach ($eventRow as $event) { $data = array (); $data[0] = io_safe_output($event['evento']); $data[1] = $event['event_type']; $data[2] = get_priority_name ($event['criticity']); $data[3] = $event['count_rep']; $data[4] = $event['time2']; array_push ($table->data, $data); } } if ($events) return html_print_table ($table, $return); } /** * Gets a detailed reporting of groups's events. * * @param unknown_type $id_group Id of the group. * @param unknown_type $period Time period of the report. * @param unknown_type $date Date of the report. * @param unknown_type $return Whether to return or not. * @param unknown_type $html Whether to return HTML code or not. * * @return string Report of groups's events */ function reporting_get_group_detailed_event ($id_group, $period = 0, $date = 0, $return = false, $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] = __('Event name'); $table->head[1] = __('Event type'); $table->head[2] = __('Criticity'); $table->head[3] = __('Timestamp'); $events = events_get_group_events($id_group, $period, $date); if ($events) { foreach ($events as $event) { $data = array (); $data[0] = io_safe_output($event['evento']); $data[1] = $event['event_type']; $data[2] = get_priority_name ($event['criticity']); $data[3] = $event['timestamp']; array_push ($table->data, $data); } if ($html) { return html_print_table ($table, $return); } else { return $table; } } else { return false; } } /** * Get a detailed report of summarized events per agent * * It construct a table object with all the grouped events happened in an agent * during a period of time. * * @param mixed Module id to get the report from. * @param int Period of time (in seconds) to get the report. * @param int Beginning date (unixtime) of the report * @param bool Flag to return or echo the report table (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 reporting_get_module_detailed_event ($id_modules, $period = 0, $date = 0, $return = false, $html = true) { $id_modules = (array)safe_int ($id_modules, 1); 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] = __('Event name'); $table->head[1] = __('Event type'); $table->head[2] = __('Criticity'); $table->head[3] = __('Count'); $table->head[4] = __('Timestamp'); $events = array (); foreach ($id_modules as $id_module) { $event = events_get_module ($id_module, (int) $period, (int) $date); if (!empty ($event)) { array_push ($events, $event); } } if ($events) { foreach ($events as $eventRow) { foreach ($eventRow as $event) { $data = array (); $data[0] = io_safe_output($event['evento']); $data[1] = $event['event_type']; $data[2] = get_priority_name ($event['criticity']); $data[3] = $event['count_rep']; $data[4] = $event['time2']; array_push ($table->data, $data); } } if ($html) { return html_print_table ($table, $return); } else { return $table; } } else { return false; } } /** * Get a detailed report of the modules of the agent * * @param int $id_agent Agent id to get the report for. * @param string $filter filter for get partial modules. * * @return array An array */ function reporting_get_agent_module_info ($id_agent, $filter = false) { global $config; $return = array (); $return["modules"] = 0; //Number of modules $return["monitor_normal"] = 0; //Number of 'good' monitors $return["monitor_warning"] = 0; //Number of 'warning' monitors $return["monitor_critical"] = 0; //Number of 'critical' monitors $return["monitor_unknown"] = 0; //Number of 'unknown' monitors $return["monitor_alertsfired"] = 0; //Number of monitors with fired alerts $return["last_contact"] = 0; //Last agent contact $return["status"] = STATUS_AGENT_NO_DATA; $return["status_img"] = ui_print_status_image (STATUS_AGENT_NO_DATA, __('Agent without data'), true); $return["alert_status"] = "notfired"; $return["alert_value"] = STATUS_ALERT_NOT_FIRED; $return["alert_img"] = ui_print_status_image (STATUS_ALERT_NOT_FIRED, __('Alert not fired'), true); $return["agent_group"] = agents_get_agent_group ($id_agent); if (!check_acl ($config["id_user"], $return["agent_group"], "AR")) { return $return; } if($filter != ''){ $filter = 'AND '; } $filter = 'disabled = 0'; $modules = agents_get_modules($id_agent, false, $filter, true, false); if ($modules === false) { return $return; } $now = get_system_time (); // Calculate modules for this agent foreach ($modules as $key => $module) { $return["modules"]++; $alert_status = modules_get_agentmodule_status($key, false); $module_status = modules_get_agentmodule_status($key, true); switch ($module_status) { case 0: $return["monitor_normal"]++; break; case 1: $return["monitor_critical"]++; break; case 2: $return["monitor_warning"]++; break; case 3: $return["monitor_unknown"]++; break; } if ($alert_status == 4) { $return["monitor_alertsfired"]++; } } if ($return["modules"] > 0) { if ($return["monitor_critical"] > 0) { $return["status"] = STATUS_AGENT_CRITICAL; $return["status_img"] = ui_print_status_image (STATUS_AGENT_CRITICAL, __('At least one module in CRITICAL status'), true); } else if ($return["monitor_warning"] > 0) { $return["status"] = STATUS_AGENT_WARNING; $return["status_img"] = ui_print_status_image (STATUS_AGENT_WARNING, __('At least one module in WARNING status'), true); } else if ($return["monitor_unknown"] > 0) { $return["status"] = STATUS_AGENT_DOWN; $return["status_img"] = ui_print_status_image (STATUS_AGENT_DOWN, __('At least one module is in UKNOWN status'), true); } else { $return["status"] = STATUS_AGENT_OK; $return["status_img"] = ui_print_status_image (STATUS_AGENT_OK, __('All Monitors OK'), true); } } //Alert not fired is by default if ($return["monitor_alertsfired"] > 0) { $return["alert_status"] = "fired"; $return["alert_img"] = ui_print_status_image (STATUS_ALERT_FIRED, __('Alert fired'), true); $return["alert_value"] = STATUS_ALERT_FIRED; } elseif (groups_give_disabled_group ($return["agent_group"])) { $return["alert_status"] = "disabled"; $return["alert_value"] = STATUS_ALERT_DISABLED; $return["alert_img"] = ui_print_status_image (STATUS_ALERT_DISABLED, __('Alert disabled'), true); } return $return; } /** * This is the callback sorting function for SLA values descending * * @param array $a Array element 1 to compare * @param array $b Array element 2 to compare * */ function sla_value_desc_cmp($a, $b) { // This makes 'Unknown' values the lastest if (preg_match('/^(.)*Unknown(.)*$/', $a[5])) $a[6] = -1; if (preg_match('/^(.)*Unknown(.)*$/', $b[5])) $b[6] = -1; return ($a[6] < $b[6])? 1 : 0; } /** * This is the callback sorting function for SLA values ascending * * @param array $a Array element 1 to compare * @param array $b Array element 2 to compare * */ function sla_value_asc_cmp($a, $b) { // This makes 'Unknown' values the lastest if (preg_match('/^(.)*Unknown(.)*$/', $a[5])) $a[6] = -1; if (preg_match('/^(.)*Unknown(.)*$/', $b[5])) $b[6] = -1; return ($a[6] > $b[6])? 1 : 0; } /** * This function is used once, in reporting_viewer.php, the HTML report render * file. This function proccess each report item and write the render in the * table record. * * @param array $content Record of treport_content table for current item * @param array $table HTML Table row * @param array $report Report contents, with some added fields. * @param array $mini Mini flag for reduce the size. * */ function reporting_render_report_html_item ($content, $table, $report, $mini = false) { global $config; global $graphic_type; if($mini){ $sizh = ''; $sizhfin = ''; $sizem = '1.5'; $sizgraph_w = '350'; $sizgraph_h = '100'; } else{ $sizh = '

'; $sizhfin = '

'; $sizem = '3'; $sizgraph_w = '750'; $sizgraph_h = '230'; } $server_name = $content ['server_name']; if (($config ['metaconsole'] == 1) && $server_name != '') { $connection = metaconsole_get_connection($server_name); if (!metaconsole_load_external_db($connection)){ //ui_print_error_message ("Error connecting to ".$server_name); } } $module_name = db_get_value ('nombre', 'tagente_modulo', 'id_agente_modulo', $content['id_agent_module']); if ($content['id_agent_module'] != 0) { $agent_name = modules_get_agentmodule_agent_name ($content['id_agent_module']); } else { $agent_name = agents_get_name($content['id_agent']); } switch ($content["type"]) { case 1: case 'simple_graph': //RUNNING $table->colspan[1][0] = 4; $data = array (); $data[0] = $sizh.__('Simple graph').$sizhfin; $data[1] = $sizh . ui_print_truncate_text($agent_name, 75, false).'
' . ui_print_truncate_text($module_name, 75, false).$sizhfin; $data[2] = $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[2][0] = 4; if ($content["description"] != ""){ $data_desc = array(); $data_desc[0] = $content["description"]; array_push ($table->data, $data_desc); } $data = array (); $data[0] = grafico_modulo_sparse($content['id_agent_module'], $content['period'], false, $sizgraph_w, $sizgraph_h, '', '', false, true, true, $report["datetime"], '', 0, 0, true, true); array_push ($table->data, $data); break; case 'projection_graph': //RUNNING $table->colspan[1][0] = 4; $data = array (); $data[0] = $sizh.__('Projection graph').$sizhfin; $data[1] = $sizh . ui_print_truncate_text($agent_name, 75, false).'
' . ui_print_truncate_text($module_name, 75, false).$sizhfin; $data[2] = $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[2][0] = 4; if ($content["description"] != ""){ $data_desc = array(); $data_desc[0] = $content["description"]; array_push ($table->data, $data_desc); } $data = array (); $output_projection = forecast_projection_graph($content['id_agent_module'], $content['period'], $content['top_n_value']); // If projection doesn't have data then don't draw graph if ($output_projection == NULL){ $output_projection = false; } $modules = array($content['id_agent_module']); $weights = array(); $data[0] = graphic_combined_module( $modules, $weights, $content['period'], $sizgraph_w, $sizgraph_h, 'Projection%20Sample%20Graph', '', 0, 0, 0, 0, $report["datetime"], true, '', 1, // Important parameter, this tell to graphic_combined_module function that is a projection graph $output_projection ); array_push ($table->data, $data); break; case 'prediction_date': //RUNNING $table->colspan[1][0] = 4; $data = array (); $data[0] = $sizh.__('Prediction date').$sizhfin; $data[1] = $sizh . ui_print_truncate_text($agent_name, 75, false).'
' . ui_print_truncate_text($module_name, 75, false).$sizhfin; $data[2] = $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[2][0] = 4; if ($content["description"] != ""){ $data_desc = array(); $data_desc[0] = $content["description"]; array_push ($table->data, $data_desc); } $data = array (); $table->colspan[2][0] = 3; $intervals_text = $content['text']; $max_interval = substr($intervals_text, 0, strpos($intervals_text, ';')); $min_interval = substr($intervals_text, strpos($intervals_text, ';') + 1); $value = forecast_prediction_date ($content['id_agent_module'], $content['period'], $max_interval, $min_interval); if ($value === false) { $value = __('Unknown'); } else { $value = date ('d M Y H:i:s', $value); } $data[0] = '

'.$value.'

'; array_push ($table->data, $data); break; case 'simple_baseline_graph': //RUNNING $table->colspan[1][0] = 4; $data = array (); $data[0] = $sizh.__('Simple baseline graph').$sizhfin; $data[1] = $sizh . ui_print_truncate_text($agent_name, 65, false).'
' . ui_print_truncate_text($module_name, 65, false).$sizhfin; $data[2] = $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[2][0] = 4; if ($content["description"] != "") { $data_desc = array(); $data_desc[0] = $content["description"]; array_push ($table->data, $data_desc); } $data = array (); $data[0] = grafico_modulo_sparse($content['id_agent_module'], $content['period'], false, $sizgraph_w, $sizgraph_h, '', '', false, true, true, $report["datetime"], '', true, 0, true, true); /*$data[0] = graphic_combined_module( $modules, $weights, $content['period'], $sizgraph_w, $sizgraph_h, 'Combined%20Sample%20Graph', '', 0, 0, 0, $graph["stacked"], $report["datetime"]); */ array_push ($table->data, $data); break; case 2: case 'custom_graph': //RUNNING $graph = db_get_row ("tgraph", "id_graph", $content['id_gs']); $data = array (); $data[0] = $sizh.__('Custom graph').$sizhfin; $data[1] = $sizh . ui_print_truncate_text($graph['name'], 25, false).$sizhfin; $data[2] = $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[2][0] = 3; if ($content["description"] != ""){ $data_desc = array(); $data_desc[0] = $content["description"]; array_push ($table->data, $data_desc); } $result = db_get_all_rows_field_filter ("tgraph_source", "id_graph", $content['id_gs']); $modules = array (); $weights = array (); if ($result === false) $result = array(); foreach ($result as $content2) { array_push ($modules, $content2['id_agent_module']); array_push ($weights, $content2["weight"]); } // Increase the height to fix the leyend rise $sizgraph_h += count($modules) * 15; $table->colspan[1][0] = 3; $data = array (); $urlImage = 'http://'; if ($config['https']) { $urlImage = 'https://'; } $urlImage .= $_SERVER['SERVER_NAME'] . $config['homeurl'] . '/'; require_once ($config["homedir"] . '/include/functions_graph.php'); $data[0] = graphic_combined_module( $modules, $weights, $content['period'], $sizgraph_w, $sizgraph_h, 'Combined%20Sample%20Graph', '', 0, 0, 0, $graph["stacked"], $report["datetime"], true, $urlImage); array_push ($table->data, $data); break; case 3: case 'SLA': $show_graph = $content['show_graph']; //RUNNING $table->style[1] = 'text-align: right'; $data = array (); $data[0] = $sizh . __('S.L.A.').$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); } $slas = db_get_all_rows_field_filter ('treport_content_sla_combined', 'id_report_content', $content['id_rc']); if ($slas === false) { $data = array (); $table->colspan[2][0] = 3; $data[0] = __('There are no SLAs defined'); array_push ($table->data, $data); $slas = array (); break; } elseif ($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] = __('Max/Min Values'); $table1->head[3] = __('SLA Limit'); $table1->head[4] = __('Value'); $table1->head[5] = __('Status'); $table1->style[0] = 'text-align: center'; $table1->style[1] = 'text-align: center'; $table1->style[2] = 'text-align: center'; $table1->style[3] = 'text-align: center'; $table1->style[4] = 'text-align: center'; $table1->style[5] = 'text-align: center'; } $data_graph = array (); $data_graph[__('Inside limits')] = 0; $data_graph[__('Out of limits')] = 0; $data_graph[__('On the edge')] = 0; $data_graph[__('Unknown')] = 0; $data_horin_graph = array (); $data_horin_graph[__('Inside limits')]['g'] = 0; $data_horin_graph[__('Out of limits')]['g'] = 0; $data_horin_graph[__('On the edge')]['g'] = 0; $data_horin_graph[__('Unknown')]['g'] = 0; $sla_failed = false; foreach ($slas as $sla) { $server_name = $sla ['server_name']; //Metaconsole connection if (($config ['metaconsole'] == 1) && $server_name != '') { $connection = metaconsole_get_connection($server_name); if (!metaconsole_load_external_db($connection)) { //ui_print_error_message ("Error connecting to ".$server_name); continue; } } //Get the sla_value in % and store it on $sla_value $sla_value = reporting_get_agentmodule_sla ($sla['id_agent_module'], $content['period'], $sla['sla_min'], $sla['sla_max'], $report["datetime"], $content, $content['time_from'], $content['time_to']); //Fill the array data_graph for the pie graph if ($sla_value === false) { $data_graph[__('Unknown')]++; $data_horin_graph[__('Unknown')]['g']++; } else if ($sla_value <= ($sla['sla_limit']+10) && $sla_value >= ($sla['sla_limit']-10)) { $data_graph[__('On the edge')]++; $data_horin_graph[__('On the edge')]['g']++; } else if ($sla_value > ($sla['sla_limit']+10)) { $data_graph[__('Inside limits')]++; $data_horin_graph[__('Inside limits')]['g']++; } else if ($sla_value < ($sla['sla_limit']-10)) { $data_graph[__('Out of limits')]++; $data_horin_graph[__('Out of limits')]['g']++; } //Do not show right modules if 'only_display_wrong' is active if ($content['only_display_wrong'] == 1 && $sla_value >= $sla['sla_limit']) continue; if ($show_graph == 0 || $show_graph == 1) { $data = array (); $data[0] = printSmallFont(modules_get_agentmodule_agent_name ($sla['id_agent_module'])); $data[1] = printSmallFont(modules_get_agentmodule_name ($sla['id_agent_module'])); $data[2] = $sla['sla_max'].'/'; $data[2] .= $sla['sla_min']; $data[3] = $sla['sla_limit']; if ($sla_value === false) { $data[4] = ''; $data[5] = ''.__('Unknown').''; } else { if ($sla_value >= $sla['sla_limit']) { $data[4] = ''; $data[5] = ''.__('OK').''; } else { $sla_failed = true; $data[4] = ''; $data[5] = ''.__('Fail').''; } $data[4] .= format_numeric ($sla_value, 2). "%"; } $data[4] .= ""; // This column will be used temporary for sort data $data[6] = format_numeric ($sla_value, 2); array_push ($table1->data, $data); } if ($config ['metaconsole'] == 1) { //Restore db connection metaconsole_restore_db(); } } // SLA items sorted descending () if ($content['top_n'] == 2){ usort($table1->data, "sla_value_desc_cmp"); } // SLA items sorted ascending else if ($content['top_n'] == 1){ usort($table1->data, "sla_value_asc_cmp"); } // Delete temporary column used to sort SLA data for ($i=0; $i < count($table1->data); $i++) { unset($table1->data[$i][6]); } $table->colspan[2][0] = 3; if ($show_graph == 0 || $show_graph == 1) { $data = array(); $data[0] = html_print_table($table1, true); array_push ($table->data, $data); } $table->colspan[3][0] = 3; $data = array(); $data_pie_graph = json_encode ($data_graph); if (($show_graph == 1 || $show_graph == 2) && !empty($slas)) { $data[0] = pie3d_graph($config['flash_charts'], $data_graph, 500, 150, __("other"), "", $config['homedir'] . "/images/logo_vertical_water.png", $config['fontpath'], $config['font_size']); array_push ($table->data, $data); //Display horizontal bar graphs $days = array ('monday' => $content['monday'], 'tuesday' => $content['tuesday'], 'wednesday' => $content['wednesday'], 'thursday' => $content['thursday'], 'friday' => $content['friday'], 'saturday' => $content['saturday'], 'sunday' => $content['sunday']); $daysWeek = json_encode ($days); $table2->width = '99%'; $table2->style[0] = 'text-align: right'; $table2->data = array (); foreach ($slas as $sla) { $data = array(); $data[0] = printSmallFont(modules_get_agentmodule_agent_name ($sla['id_agent_module'])); $data[0] .= "
"; $data[0] .= printSmallFont(modules_get_agentmodule_name ($sla['id_agent_module'])); $data[1] = graph_sla_slicebar ($sla['id_agent_module'], $content['period'], $sla['sla_min'], $sla['sla_max'], $report["datetime"], $content, $content['time_from'], $content['time_to'], 550, 25,''); array_push ($table2->data, $data); } $table->colspan[4][0] = 3; $data = array(); $data[0] = html_print_table($table2, true); array_push ($table->data, $data); } break; case 6: case 'monitor_report': //RUNNING $data = array (); $data[0] = $sizh.__('Monitor report').$sizhfin; $data[1] = $sizh . ui_print_truncate_text($agent_name, 70, false).'
'.ui_print_truncate_text($module_name, 70, false).$sizhfin; $data[2] = $sizh.human_time_description_raw ($content['period']).$sizhfin; array_push ($table->data, $data); // Put description at the end of the module (if exists) if ($content["description"] != ""){ $table->colspan[1][0] = 3; $data_desc = array(); $data_desc[0] = $content["description"]; array_push ($table->data, $data_desc); } $data = array (); $monitor_value = reporting_get_agentmodule_sla ($content['id_agent_module'], $content['period'], 1, false, $report["datetime"]); if ($monitor_value === false) { $monitor_value = __('Unknown'); } else { $monitor_value = format_numeric ($monitor_value); } $data[0] = '

'; $data[0] .= $monitor_value.' % ' . html_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.' % ' . html_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.ui_print_truncate_text($agent_name, 75, false).'
'.ui_print_truncate_text($module_name, 75, false).$sizhfin; $data[2] = $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); } $data = array (); $table->colspan[2][0] = 3; $value = reporting_get_agentmodule_data_average ($content['id_agent_module'], $content['period'], $report["datetime"]); if ($value === false) { $value = __('Unknown'); } else { $value = format_numeric ($value); } $data[0] = '

'.$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).'
' . ui_print_truncate_text($module_name, 75, false).$sizhfin; $data[2] = $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); } $data = array (); $table->colspan[2][0] = 3; $value = format_numeric (reporting_get_agentmodule_data_max ($content['id_agent_module'], $content['period'], $report["datetime"])); $data[0] = '

'.$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).'
'.ui_print_truncate_text($module_name, 75, false).$sizhfin; $data[2] = $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[0][0] = 2; if ($content["description"] != ""){ $data_desc = array(); $data_desc[0] = $content["description"]; array_push ($table->data, $data_desc); } $data = array (); $table->colspan[1][0] = 2; $value = reporting_get_agentmodule_data_min ($content['id_agent_module'], $content['period'], $report["datetime"]); if ($value === false) { $value = __('Unknown'); } else { $value = format_numeric ($value); } $data[0] = '

'.$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).'
'.ui_print_truncate_text($module_name, 75, false).$sizhfin; $data[2] = $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[0][0] = 2; if ($content["description"] != ""){ $data_desc = array(); $data_desc[0] = $content["description"]; array_push ($table->data, $data_desc); } $data = array (); $table->colspan[1][0] = 2; $value = reporting_get_agentmodule_data_sum ($content['id_agent_module'], $content['period'], $report["datetime"]); if ($value === false) { $value = __('Unknown'); } else { $value = format_numeric ($value); } $data[0] = '

'.$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(agents_get_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] = reporting_get_agents_detailed_event ($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 = io_safe_output (db_get_value_filter('`sql`', 'treport_custom_sql', array('id' => $content['treport_custom_sql_id']))); break; case "postgresql": $sql = io_safe_output (db_get_value_filter('"sql"', 'treport_custom_sql', array('id' => $content['treport_custom_sql_id']))); break; case "oracle": $sql = io_safe_output (db_get_value_filter('sql', 'treport_custom_sql', array('id' => $content['treport_custom_sql_id']))); break; } } else { $sql = io_safe_output ($content['external_source']); } // Do a security check on SQL coming from the user $sql = check_sql ($sql); if($sql != '') { $result = db_get_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" => "
[".__('Illegal query')."]
". __('Due security restrictions, there are some tokens or words you cannot use'). ': *, delete, drop, alter, modify, union, password, pass, insert '.__('or')." update.
")); } $cellContent = html_print_table($table2, true); array_push($table->data, array($cellContent)); break; case 'sql_graph_pie': case 'sql_graph_vbar': case 'sql_graph_hbar': $data = array(); $data[0] = $sizh. __('User defined graph') . " (".__($content["type"]) .")". $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']); } $data = array (); $data[0] = graph_custom_sql_graph($content["id_rc"], $sizgraph_w, 200, $content["type"], true); array_push($table->data, $data); break; case 'event_report_group': $data = array (); $data[0] = $sizh . __('Group detailed event') . $sizhfin; $data[1] = $sizh . ui_print_truncate_text(groups_get_name($content['id_group']), 60, 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] = reporting_get_group_detailed_event($content['id_group'], $content['period'], $report["datetime"], true); array_push ($table->data, $data); break; case 'event_report_module': $data = array (); $data[0] = $sizh. __('Module detailed event') . $sizhfin; $data[1] = $sizh . ui_print_truncate_text($agent_name, 70, false).'
' . ui_print_truncate_text($module_name, 70, 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] = reporting_get_module_detailed_event($content['id_agent_module'], $content['period'], $report["datetime"], true); array_push ($table->data, $data); break; case 'alert_report_module': $data = array (); $data[0] = $sizh. __('Alert report module') . $sizhfin; $data[1] = $sizh . ui_print_truncate_text($agent_name, 70, false).'
'.ui_print_truncate_text($module_name, 70, 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] = reporting_alert_reporting_module ($content['id_agent_module'], $content['period'], $report["datetime"], true); array_push ($table->data, $data); break; case 'alert_report_agent': $data = array (); $data[0] = $sizh. __('Alert report agent') . $sizhfin; $data[1] = $sizh.ui_print_truncate_text($agent_name, 70, 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] = reporting_alert_reporting_agent ($content['id_agent'], $content['period'], $report["datetime"], true); array_push ($table->data, $data); break; case 'url': $table->colspan[1][0] = 2; $data = array (); $data[0] = $sizh. __('Import text from URL') . $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] = ''; $data[0] .= ''; array_push ($table->data, $data); break; case 'database_serialized': $data = array (); $data[0] = $sizh. __('Serialize data') . $sizhfin; $data[1] = $sizh.ui_print_truncate_text($agent_name, 75, false).'
'.ui_print_truncate_text($module_name, 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); } $table2->class = 'databox'; $table2->width = '100%'; //Create the head $table2->head = array(); if ($content['header_definition'] != '') { $table2->head = explode('|', $content['header_definition']); } array_unshift($table2->head, __('Date')); $datelimit = $report["datetime"] - $content['period']; $result = db_get_all_rows_sql('SELECT * FROM tagente_datos WHERE id_agente_modulo = ' . $content['id_agent_module'] . ' AND utimestamp > ' . $datelimit . ' AND utimestamp <= ' . $report["datetime"]); // Adds string data if there is no numeric data if ((count($result) < 0) or (!$result)){ $result = db_get_all_rows_sql('SELECT * FROM tagente_datos_string WHERE id_agente_modulo = ' . $content['id_agent_module'] . ' AND utimestamp > ' . $datelimit . ' AND utimestamp <= ' . $report["datetime"]); } if ($result === false) { $result = array(); } $table2->data = array(); foreach ($result as $row) { $date = date ($config["date_format"], $row['utimestamp']); $serialized = $row['datos']; $rowsUnserialize = explode($content['line_separator'], $serialized); foreach ($rowsUnserialize as $rowUnser) { $columnsUnserialize = explode($content['column_separator'], $rowUnser); array_unshift($columnsUnserialize, $date); array_push($table2->data, $columnsUnserialize); } } $cellContent = html_print_table($table2, true); array_push($table->data, array($cellContent)); $table->colspan[1][0] = 2; break; case 'TTRT': $data = array (); $data[0] = $sizh. __('TTRT') . $sizhfin; $data[1] = $sizh.ui_print_truncate_text($agent_name, 70, false).'
'.ui_print_truncate_text($module_name, 70, 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; $ttr = reporting_get_agentmodule_ttr ($content['id_agent_module'], $content['period'], $report["datetime"]); if ($ttr === false) { $ttr = __('Unknown'); } else if ($ttr != 0) { $ttr = human_time_description_raw ($ttr); } $data = array (); $table->colspan[2][0] = 3; $data[0] = '

'.$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).'
'.ui_print_truncate_text($module_name, 70, 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; $tto = reporting_get_agentmodule_tto ($content['id_agent_module'], $content['period'], $report["datetime"]); if ($tto === false) { $tto = __('Unknown'); } else if ($tto != 0) { $tto = human_time_description_raw ($tto); } $data = array (); $table->colspan[2][0] = 3; $data[0] = '

'.$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).'
'.ui_print_truncate_text($module_name, 70, 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; $mtbf = reporting_get_agentmodule_mtbf ($content['id_agent_module'], $content['period'], $report["datetime"]); if ($mtbf === false) { $mtbf = __('Unknown'); } else if ($mtbf != 0) { $mtbf = human_time_description_raw ($mtbf); } $data = array (); $table->colspan[2][0] = 3; $data[0] = '

'.$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).'
'.ui_print_truncate_text($module_name, 70, 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; $mttr = reporting_get_agentmodule_mttr ($content['id_agent_module'], $content['period'], $report["datetime"]); if ($mttr === false) { $mttr = __('Unknown'); } else if ($mttr != 0) { $mttr = human_time_description_raw ($mttr); } $data = array (); $table->colspan[2][0] = 3; $data[0] = '

'.$mttr.'

'; array_push ($table->data, $data); break; case 'group_report': $group_name = groups_get_name($content['id_group']); $group_stats = reporting_get_group_stats($content['id_group']); // Get events of the last 8 hours $events = events_get_group_events ($content['id_group'], 28800, $report['datetime']); $data = array (); $table->colspan[0][0] = 7; $table->colspan[1][1] = 3; $table->colspan[1][4] = 3; $table->colspan[2][1] = 3; $table->colspan[2][4] = 3; $table->colspan[5][1] = 3; $table->colspan[5][4] = 3; $table->colspan[6][1] = 3; $table->colspan[6][4] = 3; $table->colspan[7][1] = 6; $table->colspan[8][1] = 6; $data[0] = $sizh. __('Group report').': "'.$group_name.'"' . $sizhfin; array_push ($table->data, $data); $data = array(); $data[0] = ''; $data[1] = "
".__('Total')."
"; $data[4] = "
".__('Unknown')."
"; array_push ($table->data, $data); $data = array(); $data[0] = "
".__('Agents')."
"; $data[1] = "
".$group_stats['total_agents']."
"; $data[4] = "
".$group_stats['agents_unknown']."
"; array_push ($table->data, $data); $data = array(); $data[0] = ''; $data[1] = "
".__('Total')."
"; $data[2] = "
".__('Normal')."
"; $data[3] = "
".__('Critical')."
"; $data[4] = "
".__('Warning')."
"; $data[5] = "
".__('Unknown')."
"; $data[6] = "
".__('Not init')."
"; array_push ($table->data, $data); $data = array(); $data[0] = "
".__('Monitors')."
"; $data[1] = "
".$group_stats['monitor_checks']."
"; $data[2] = "
".$group_stats['monitor_ok']."
"; $data[3] = "
".$group_stats['monitor_critical']."
"; $data[4] = "
".$group_stats['monitor_warning']."
"; $data[5] = "
".$group_stats['monitor_unknown']."
"; $data[6] = "
".$group_stats['monitor_not_init']."
"; array_push ($table->data, $data); $data = array(); $data[0] = ''; $data[1] = "
".__('Defined')."
"; $data[4] = "
".__('Fired')."
"; array_push ($table->data, $data); $data = array(); $data[0] = "
".__('Alerts')."
"; $data[1] = "
".$group_stats['monitor_alerts']."
"; $data[4] = "
".$group_stats['monitor_alerts_fired']."
"; array_push ($table->data, $data); $data = array(); $data[0] = ''; $data[1] = "
".__('Last 8 hours')."
"; array_push ($table->data, $data); $data = array(); $data[0] = "
".__('Events')."
"; $data[1] = "
".count($events)."
"; 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 id_agent_module, server_name from treport_content_item where id_report_content = %d", $content['id_rc']); $generals = db_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) { //Metaconsole connection $server_name = $row ['server_name']; if (($config ['metaconsole'] == 1) && $server_name != '') { $connection = metaconsole_get_connection($server_name); if (!metaconsole_load_external_db($connection)) { //ui_print_error_message ("Error connecting to ".$server_name); continue; } } $mod_name = modules_get_agentmodule_name ($row['id_agent_module']); $ag_name = modules_get_agentmodule_agent_name ($row['id_agent_module']); $data_avg[$key] = reporting_get_agentmodule_data_average ($row['id_agent_module'], $content['period']); $id_agent_module[$key] = $row['id_agent_module']; $agent_name[$key] = $ag_name; $module_name[$key] = $mod_name; //Restore dbconnection if (($config ['metaconsole'] == 1) && $server_name != '') { metaconsole_restore_db(); } } //Order by data descending, ascending or without order 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++; } } //Order by agent name 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] = html_print_table($table1, true); array_push ($table->data, $data); break; //1 means group by agent case 1: //Get the data $sql_data = sprintf("select id_agent_module, server_name from treport_content_item where id_report_content = %d", $content['id_rc']); $generals = db_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; } $agent_list = array(); $modules_list = array(); foreach ($generals as $general) { //Metaconsole connection $server_name = $general ['server_name']; if (($config ['metaconsole'] == 1) && $server_name != '') { $connection = metaconsole_get_connection($server_name); if (!metaconsole_load_external_db($connection)) { //ui_print_error_message ("Error connecting to ".$server_name); continue; } } $ag_name = modules_get_agentmodule_agent_name ($general ['id_agent_module']); if (!in_array ($ag_name, $agent_list)) { array_push ($agent_list, $ag_name); } $mod_name = modules_get_agentmodule_name ($general ['id_agent_module']); if (!in_array ($mod_name, $modules_list)) { array_push ($modules_list, $mod_name); } //Restore dbconnection if (($config ['metaconsole'] == 1) && $server_name != '') { metaconsole_restore_db(); } } $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, 20, false); $table2->style[$i] = 'text-align: center'; $i++; } foreach ($agent_list as $a) { $data = array(); $data[0] = printSmallFont($a); $i = 1; foreach ($modules_list as $m) { foreach ($generals as $g) { //Metaconsole connection $server_name = $g ['server_name']; if (($config ['metaconsole'] == 1) && $server_name != '') { $connection = metaconsole_get_connection($server_name); if (!metaconsole_load_external_db($connection)) { //ui_print_error_message ("Error connecting to ".$server_name); continue; } } $agent_name = modules_get_agentmodule_agent_name ($g['id_agent_module']); $module_name = modules_get_agentmodule_name ($g['id_agent_module']); $found = false; if (strcmp($a, $agent_name) == 0 && strcmp($m, $module_name) == 0) { $value_avg = reporting_get_agentmodule_data_average($g['id_agent_module'], $content['period']); if ($value_avg === false) { $data[$i] = '--'; } else { $data[$i] = $value_avg; } $found = true; } else { $data[$i] = '--'; } if ($found == true) break; //Restore dbconnection if (($config ['metaconsole'] == 1) && $server_name != '') { metaconsole_restore_db(); } } $i++; } array_push($table2->data, $data); } $table->colspan[2][0] = 3; $data = array(); $data[0] = html_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 { //Metaconsole connection $server_name = $generals[$i]['server_name']; if (($config ['metaconsole'] == 1) && $server_name != '') { $connection = metaconsole_get_connection($server_name); if (!metaconsole_load_external_db($connection)) { //ui_print_error_message ("Error connecting to ".$server_name); continue; } } $min = reporting_get_agentmodule_data_average($generals[$i]['id_agent_module'], $content['period']); $i++; //Restore dbconnection if (($config ['metaconsole'] == 1) && $server_name != '') { metaconsole_restore_db(); } } while ($min === false && $i < count($generals)); $max = $min; $avg = 0; $length = 0; if ($generals === false) { $generals = array(); } foreach ($generals as $g) { //Metaconsole connection $server_name = $g['server_name']; if (($config ['metaconsole'] == 1) && $server_name != '') { $connection = metaconsole_get_connection($server_name); if (!metaconsole_load_external_db($connection)) { //ui_print_error_message ("Error connecting to ".$server_name); continue; } } $value = reporting_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++; } //Restore dbconnection if (($config ['metaconsole'] == 1) && $server_name != '') { metaconsole_restore_db(); } } 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 id_agent_module, server_name from treport_content_item where id_report_content = %d", $content['id_rc']); $tops = db_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) { //Metaconsole connection $server_name = $row['server_name']; if (($config ['metaconsole'] == 1) && $server_name != '') { $connection = metaconsole_get_connection($server_name); if (!metaconsole_load_external_db($connection)) { //ui_print_error_message ("Error connecting to ".$server_name); continue; } } $ag_name = modules_get_agentmodule_agent_name($row ['id_agent_module']); $mod_name = modules_get_agentmodule_name ($row ['id_agent_module']); switch ($top_n) { //Max case 1: $value = reporting_get_agentmodule_data_max ($row['id_agent_module'], $content['period']); break; //Min case 2: $value = reporting_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 = reporting_get_agentmodule_data_average ($row['id_agent_module'], $content['period']); break; } //If the returned value from modules_get_agentmodule_data_max/min/avg 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] = $ag_name; $module_name[$key] = $mod_name; } //Restore dbconnection if (($config ['metaconsole'] == 1) && $server_name != '') { metaconsole_restore_db(); } } 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(); $data_hbar = array(); foreach ($data_top as $dt) { $data_hbar[$agent_name[$i]]['g'] = $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] = html_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"),"", $config['homedir'] . "/images/logo_vertical_water.png", $config['fontpath'], $config['font_size']); 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(), array(), "", "", true, "", $config['homedir'] . "/images/logo_vertical_water.png", '', '', true, 1, true); 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 id_agent_module, server_name from treport_content_item where id_report_content = %d", $content['id_rc']); $exceptions = db_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 { //Metaconsole connection $server_name = $exceptions[$i]['server_name']; if (($config ['metaconsole'] == 1) && $server_name != '') { $connection = metaconsole_get_connection($server_name); if (!metaconsole_load_external_db($connection)) { //ui_print_error_message ("Error connecting to ".$server_name); continue; } } $min = reporting_get_agentmodule_data_average ($exceptions[$i]['id_agent_module'], $content['period']); $i++; //Restore dbconnection if (($config ['metaconsole'] == 1) && $server_name != '') { metaconsole_restore_db(); } } while ($min === false && $i < count($exceptions)); $max = $min; $avg = 0; $i=0; foreach ($exceptions as $exc) { //Metaconsole connection $server_name = $exc['server_name']; if (($config ['metaconsole'] == 1) && $server_name != '') { $connection = metaconsole_get_connection($server_name); if (!metaconsole_load_external_db($connection)) { //ui_print_error_message ("Error connecting to ".$server_name); continue; } } $ag_name = modules_get_agentmodule_agent_name ($exc ['id_agent_module']); $mod_name = modules_get_agentmodule_name ($exc ['id_agent_module']); $value = reporting_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 (modules_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 (modules_get_agentmodule_status($exc['id_agent_module']) == 0) { continue 2; } break; } $i++; $data_exceptions[] = $value; $id_agent_module[] = $exc['id_agent_module']; $agent_name[] = $ag_name; $module_name[] = $mod_name; } //Restore dbconnection if (($config ['metaconsole'] == 1) && $server_name != '') { metaconsole_restore_db(); } } //$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) { //Order descending case 1: array_multisort($data_exceptions, SORT_DESC, $agent_name, SORT_ASC, $module_name, SORT_ASC, $id_agent_module, SORT_ASC); break; //Order ascending case 2: array_multisort($data_exceptions, SORT_ASC, $agent_name, SORT_ASC, $module_name, SORT_ASC, $id_agent_module, SORT_ASC); break; //Order 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(); $data_hbar = array(); foreach ($data_exceptions as $dex) { $data_hbar[$agent_name[$j]]['g'] = $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(); $data_hbar = array(); foreach ($agent_name as $an) { $data_hbar[$an]['g'] = $data_exceptions[$j]; $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] = html_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"), "", $config['homedir'] . "/images/logo_vertical_water.png", $config['fontpath'], $config['font_size']); 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(), array(), "", "", true, "", $config['homedir'] . "/images/logo_vertical_water.png", '', '', true, 1, true); 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 = 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 = agents_get_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 = ''; $table_data .= ""; $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 .= '"; } 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 .= "
"; foreach ($agents as $agent) { // Get stats for this group $agent_status = agents_get_status($agent['id_agente']); switch($agent_status) { case 4: // Alert fired status $rowcolor = '#ffa300'; $textcolor = '#000'; break; case 1: // Critical status $rowcolor = '#bc0000'; $textcolor = '#FFF'; break; case 2: // Warning status $rowcolor = '#f2ef00'; $textcolor = '#000'; break; case 0: // Normal status $rowcolor = '#8ae234'; $textcolor = '#000'; break; case 3: case -1: default: // Unknown status $rowcolor = '#babdb6'; $textcolor = '#000'; break; } $table_data .= ""; $file_name = string2image(ui_print_truncate_text($agent['nombre'],19, false, true, false, '...'), 140, 15, 3, 0, $rowcolor, $textcolor, 4, 0); $table_data .= ""; $agent_modules = agents_get_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 = modules_get_agentmodule_status($module_id); $table_data .= ""; $match = true; } } if(!$match) { $table_data .= ""; } } $table_data .= ""; } $table_data .= "
".__("Agents")." / ".__("Modules")."'.html_print_image($file_name, true, array('title' => $module['name']))."...
".html_print_image($file_name, true, array('title' => $agent['nombre'])).""; $win_handle = dechex(crc32($module_id.$module["name"])); $graph_type = return_graphtype (modules_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 .= "
"; $table_data .= "

" . __("The colours meaning:") . "

" . "

"; $data = array (); $table->colspan[2][0] = 3; $data[0] = $table_data; array_push ($table->data, $data); break; } //Restore dbconnection if (($config ['metaconsole'] == 1) && $server_name != '') { metaconsole_restore_db(); } } /** * Get the MTBF value of an agent module in a period of time. See * http://en.wikipedia.org/wiki/Mean_time_between_failures * * @param int Agent module id * @param int Period of time to check (in seconds) * @param int Top date to check the values. Default current time. * * @return float The MTBF value in the interval. */ function reporting_get_agentmodule_mtbf ($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"]; // Read module configuration $datelimit = $date - $period; $module = db_get_row_sql ('SELECT max_critical, min_critical, id_tipo_modulo FROM tagente_modulo WHERE id_agente_modulo = ' . (int) $id_agent_module); if ($module === false) { return false; } $critical_min = $module['min_critical']; $critical_max = $module['max_critical']; $module_type = $module['id_tipo_modulo']; // Set critical_min and critical for proc modules $module_type_str = modules_get_type_name ($module_type); if (strstr ($module_type_str, 'proc') !== false && ($critical_min == 0 && $critical_max == 0)) { $critical_min = 1; } // Get module data $interval_data = db_get_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 (); // Get previous data $previous_data = modules_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 = modules_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 $critical_period = 0; $first_data = array_shift ($interval_data); $previous_utimestamp = $first_data['utimestamp']; if ((($critical_max > $critical_min AND ($first_data['datos'] > $critical_max OR $first_data['datos'] < $critical_min))) OR ($critical_max <= $critical_min AND $first_data['datos'] < $critical_min)) { $previous_status = 1; $critical_count = 1; } else { $previous_status = 0; $critical_count = 0; } foreach ($interval_data as $data) { // Previous status was critical if ($previous_status == 1) { $critical_period += $data['utimestamp'] - $previous_utimestamp; } // Re-calculate previous status for the next data if ((($critical_max > $critical_min AND ($data['datos'] > $critical_max OR $data['datos'] < $critical_min))) OR ($critical_max <= $critical_min AND $data['datos'] < $critical_min)) { if ($previous_status == 0) { $critical_count++; } $previous_status = 1; } else { $previous_status = 0; } $previous_utimestamp = $data['utimestamp']; } if ($critical_count == 0) { return 0; } return ($period - $critical_period) / $critical_count; } /** * Get the MTTR value of an agent module in a period of time. See * http://en.wikipedia.org/wiki/Mean_time_to_recovery * * @param int Agent module id * @param int Period of time to check (in seconds) * @param int Top date to check the values. Default current time. * * @return float The MTTR value in the interval. */ function reporting_get_agentmodule_mttr ($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"]; // Read module configuration $datelimit = $date - $period; $module = db_get_row_sql ('SELECT max_critical, min_critical, id_tipo_modulo FROM tagente_modulo WHERE id_agente_modulo = ' . (int) $id_agent_module); if ($module === false) { return false; } $critical_min = $module['min_critical']; $critical_max = $module['max_critical']; $module_type = $module['id_tipo_modulo']; // Set critical_min and critical for proc modules $module_type_str = modules_get_type_name ($module_type); if (strstr ($module_type_str, 'proc') !== false && ($critical_min == 0 && $critical_max == 0)) { $critical_min = 1; } // Get module data $interval_data = db_get_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 (); // Get previous data $previous_data = modules_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 = modules_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 $critical_period = 0; $first_data = array_shift ($interval_data); $previous_utimestamp = $first_data['utimestamp']; if ((($critical_max > $critical_min AND ($first_data['datos'] > $critical_max OR $first_data['datos'] < $critical_min))) OR ($critical_max <= $critical_min AND $first_data['datos'] < $critical_min)) { $previous_status = 1; $critical_count = 1; } else { $previous_status = 0; $critical_count = 0; } foreach ($interval_data as $data) { // Previous status was critical if ($previous_status == 1) { $critical_period += $data['utimestamp'] - $previous_utimestamp; } // Re-calculate previous status for the next data if ((($critical_max > $critical_min AND ($data['datos'] > $critical_max OR $data['datos'] < $critical_min))) OR ($critical_max <= $critical_min AND $data['datos'] < $critical_min)) { if ($previous_status == 0) { $critical_count++; } $previous_status = 1; } else { $previous_status = 0; } $previous_utimestamp = $data['utimestamp']; } if ($critical_count == 0) { return 0; } return $critical_period / $critical_count; } /** * Get the TTO value of an agent module in a period of time. * * @param int Agent module id * @param int Period of time to check (in seconds) * @param int Top date to check the values. Default current time. * * @return float The TTO value in the interval. */ function reporting_get_agentmodule_tto ($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"]; // Read module configuration $datelimit = $date - $period; $module = db_get_row_sql ('SELECT max_critical, min_critical, id_tipo_modulo FROM tagente_modulo WHERE id_agente_modulo = ' . (int) $id_agent_module); if ($module === false) { return false; } $critical_min = $module['min_critical']; $critical_max = $module['max_critical']; $module_type = $module['id_tipo_modulo']; // Set critical_min and critical for proc modules $module_type_str = modules_get_type_name ($module_type); if (strstr ($module_type_str, 'proc') !== false && ($critical_min == 0 && $critical_max == 0)) { $critical_min = 1; } // Get module data $interval_data = db_get_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 (); // Get previous data $previous_data = modules_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 = modules_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 $critical_period = 0; $first_data = array_shift ($interval_data); $previous_utimestamp = $first_data['utimestamp']; if ((($critical_max > $critical_min AND ($first_data['datos'] > $critical_max OR $first_data['datos'] < $critical_min))) OR ($critical_max <= $critical_min AND $first_data['datos'] < $critical_min)) { $previous_status = 1; } else { $previous_status = 0; } foreach ($interval_data as $data) { // Previous status was critical if ($previous_status == 1) { $critical_period += $data['utimestamp'] - $previous_utimestamp; } // Re-calculate previous status for the next data if ((($critical_max > $critical_min AND ($data['datos'] > $critical_max OR $data['datos'] < $critical_min))) OR ($critical_max <= $critical_min AND $data['datos'] < $critical_min)) { $previous_status = 1; } else { $previous_status = 0; } $previous_utimestamp = $data['utimestamp']; } return $period - $critical_period; } /** * Get the TTR value of an agent module in a period of time. * * @param int Agent module id * @param int Period of time to check (in seconds) * @param int Top date to check the values. Default current time. * * @return float The TTR value in the interval. */ function reporting_get_agentmodule_ttr ($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"]; // Read module configuration $datelimit = $date - $period; $module = db_get_row_sql ('SELECT max_critical, min_critical, id_tipo_modulo FROM tagente_modulo WHERE id_agente_modulo = ' . (int) $id_agent_module); if ($module === false) { return false; } $critical_min = $module['min_critical']; $critical_max = $module['max_critical']; $module_type = $module['id_tipo_modulo']; // Set critical_min and critical for proc modules $module_type_str = modules_get_type_name ($module_type); if (strstr ($module_type_str, 'proc') !== false && ($critical_min == 0 && $critical_max == 0)) { $critical_min = 1; } // Get module data $interval_data = db_get_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 (); // Get previous data $previous_data = modules_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 = modules_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 $critical_period = 0; $first_data = array_shift ($interval_data); $previous_utimestamp = $first_data['utimestamp']; if ((($critical_max > $critical_min AND ($first_data['datos'] > $critical_max OR $first_data['datos'] < $critical_min))) OR ($critical_max <= $critical_min AND $first_data['datos'] < $critical_min)) { $previous_status = 1; } else { $previous_status = 0; } foreach ($interval_data as $data) { // Previous status was critical if ($previous_status == 1) { $critical_period += $data['utimestamp'] - $previous_utimestamp; } // Re-calculate previous status for the next data if ((($critical_max > $critical_min AND ($data['datos'] > $critical_max OR $data['datos'] < $critical_min))) OR ($critical_max <= $critical_min AND $data['datos'] < $critical_min)) { $previous_status = 1; } else { $previous_status = 0; } $previous_utimestamp = $data['utimestamp']; } return $critical_period; } ?>