pandorafms/pandora_console/mobile/operation/agents/view_agents.php

542 lines
19 KiB
PHP

<?php
// Pandora FMS - http://pandorafms.com
// ==================================================
// Copyright (c) 2005-2010 Artica Soluciones Tecnologicas
// Please see http://pandorafms.org for full contribution list
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation for version 2.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
require_once("../include/functions_agents.php");
require_once("../include/functions_reporting.php");
require_once("../include/functions_alerts.php");
require_once("../include/functions_modules.php");
require_once('../include/functions_users.php');
class ViewAgents {
private $user;
private $system;
private $filter;
private $filterGroup;
public function __construct() {
global $system;
global $user;
$this->user = $user;
$this->system = $system;
$this->filterText = $this->system->getRequest('filter_text', '');
$this->filterGroup = $this->system->getRequest('filter_group', 0);;
}
private function showForm() {
echo "<form>";
html_print_input_hidden('page', 'agents');
global $config;
$config['text_char_long'] = 12;
html_print_select_groups($this->user->getIdUser(), "AR", true, 'filter_group', $this->filterGroup);
html_print_input_text('filter_text', $this->filterText, __('Free text search'), 5, 20);
echo "<input type='submit' class='button_filter' name='submit_button' value='' alt='" . __('Filter') . "' title='" . __('Filter') . "' />";
echo "<form>";
}
public function show() {
$this->showForm();
// Show only selected groups
if ($this->filterGroup > 0) {
$groups = $this->filterGroup;
$agent_names = agents_get_group_agents ($this->filterGroup, array('string' => $this->filterText), "upper");
// Not selected any specific group
}
else {
$user_group = users_get_groups ($this->user->getIdUser(), "AR");
$groups = array_keys ($user_group);
$agent_names = agents_get_group_agents (array_keys ($user_group), array('string' => $this->filterText), "upper");
}
$total_agents = agents_get_agents (array('id_agente' => array_keys ($agent_names),
'order' => 'nombre ASC',
'disabled' => 0,
'id_grupo' => $groups),
array ('COUNT(*) as total'));
$total_agents = isset ($total_agents[0]['total']) ? $total_agents[0]['total'] : 0;
$agents = agents_get_agents(array('id_agente' => array_keys ($agent_names),
'order' => 'nombre ASC',
'id_grupo' => $groups,
'offset' => (int) get_parameter ('offset'),
'limit' => (int) $this->system->getPageSize()), array('id_agente', 'nombre', 'id_grupo'));
$table = null;
$table->width = '100%';
$table->align = array();
$table->align[0] = 'center';
$table->align[2] = 'center';
$table->align[3] = 'center';
$table->align[4] = 'center';
$table->head = array();
$table->head[0] = '<span title="' . __('Group') . '" alt="' . __('Group') . '">' . __('G') . '</span>';
$table->head[1] = __('Name');
$table->head[2] = '<span title="' . __('Modules') . '" alt="' . __('Modules') . '">' . __('M') . '</span>';
$table->head[3] = '<span title="' . __('Status') . '" alt="' . __('Status') . '">' . __('S') . '</span>';
$table->head[4] = '<span title="' . __('Alert') . '" alt="' . __('Alert') . '">' . __('A') . '</span>';
$table->data = array();
if ($agents === false) $agents = array();
$iterator = 0;
$rowPair = false;
foreach ($agents as $agent) {
if ($rowPair)
$table->rowclass[$iterator] = 'rowPair';
else
$table->rowclass[$iterator] = 'rowOdd';
$rowPair = !$rowPair;
$iterator++;
$agent_info = reporting_get_agent_module_info ($agent["id_agente"]); //$this->system->debug($agent_info);
$data = array();
$truncName = ui_print_truncate_text($agent['nombre'], 25, true, true);
$data[] = ui_print_group_icon_path($agent["id_grupo"], true, "../images/groups_small", '', false);
$data[] = '<a href="index.php?page=agent&id=' . $agent['id_agente'] . '">' . $truncName . '</a>';
$moduleInfo = '<b>';
$moduleInfo .= $agent_info["modules"];
if ($agent_info["monitor_alertsfired"] > 0)
$moduleInfo .= ' : <span class="orange">'.$agent_info["monitor_alertsfired"].'</span>';
if ($agent_info["monitor_critical"] > 0)
$moduleInfo .= ' : <span class="red">'.$agent_info["monitor_critical"].'</span>';
if ($agent_info["monitor_warning"] > 0)
$moduleInfo .= ' : <span class="yellow">'.$agent_info["monitor_warning"].'</span>';
if ($agent_info["monitor_unknown"] > 0)
$moduleInfo .= ' : <span class="grey">'.$agent_info["monitor_unknown"].'</span>';
if ($agent_info["monitor_normal"] > 0)
$moduleInfo .= ' : <span class="green">'.$agent_info["monitor_normal"].'</span>';
$moduleInfo .= '</b>';
$data[] = $moduleInfo;
$data[] = '<img width="12" height="12" src="../images/status_sets/default/' . $agent_info['status'] . '" />';
$data[] = '<img width="12" height="12" src="../images/status_sets/default/' . $agent_info['alert_value'] . '" />';
$table->data[] = $data;
}
html_print_table($table);
$pagination = pagination ($total_agents,
ui_get_url_refresh (array ('filter_group' => $this->filterGroup, 'filter_group' => $this->filterGroup)),
0, 0, true);
$pagination = str_replace('images/go_first.png', '../images/go_first.png', $pagination);
$pagination = str_replace('images/go_previous.png', '../images/go_previous.png', $pagination);
$pagination = str_replace('images/go_next.png', '../images/go_next.png', $pagination);
$pagination = str_replace('images/go_last.png', '../images/go_last.png', $pagination);
echo $pagination;
}
}
class ViewAgent {
private $idAgent;
private $sytem;
private $agent;
private $name;
private $os;
private $ips;
private $modules;
public function __construct() {
global $system;
$this->system = $system;
$this->idAgent = $this->system->getRequest('id', 0);
$this->agent = db_get_row_filter('tagente', array('id_agente' => $this->idAgent));
$this->ips = agents_get_addresses($this->idAgent);
}
public function show() {
$idGroup = $this->agent['id_grupo'];
if (! check_acl ($this->system->getConfig('id_user'), $idGroup, "AR")) {
db_pandora_audit("ACL Violation",
"Trying to access (read) to agent ".agents_get_name($this->idAgent));
include ("../general/noaccess.php");
return;
}
$table = null;
$table->width = '100%';
$table->style[0] = 'font-weight: bolder;';
$table->data[0][0] = __('Name:');
$table->data[0][1] = $this->agent['nombre'];
$table->data[1][0] = __('IP:');
$table->data[1][1] = implode(',', $this->ips);
$table->data[2][0] = __('OS:');
$table->data[2][1] = str_replace('images/os_icons/', '../images/os_icons/', ui_print_os_icon($this->agent['id_os'], true, true));
$table->data[3][0] = __('Last contact');
$table->data[3][1] = $this->agent['ultimo_contacto'];
html_print_table($table);
$sql = sprintf ("
SELECT *
FROM tagente_estado, tagente_modulo
LEFT JOIN tmodule_group
ON tmodule_group.id_mg = tagente_modulo.id_module_group
WHERE tagente_estado.id_agente_modulo = tagente_modulo.id_agente_modulo
AND tagente_modulo.id_agente = %d
AND tagente_modulo.disabled = 0
AND tagente_modulo.delete_pending = 0
AND tagente_estado.utimestamp != 0
ORDER BY tagente_modulo.id_module_group , tagente_modulo.nombre ASC
", $this->idAgent);
$modules = db_get_all_rows_sql ($sql);
if (empty ($modules)) {
$modules = array ();
}
echo "<h3 class='title_h3'>" . __('Modules') . "</h3>";
$table = null;
//$table->width = '100%';
$table->head = array();
$table->head[0] = __('Module');
$table->head[1] = '<span title="' . __('Status') . '" alt="' . __('Status') . '">' . __('S') . '</span>';
$table->head[2] = __('Data');
$table->head[3] = '<span title="' . __('Last contact') . '" alt="' . __('Last contact') . '">' . __('L') . '</span>';
$table->data = array();
$iterator = 0;
$rowPair = false;
foreach ($modules as $module) {
if ($rowPair)
$table->rowclass[$iterator] = 'rowPair';
else
$table->rowclass[$iterator] = 'rowOdd';
$rowPair = !$rowPair;
$iterator++;
$data = array();
$data[] = '<a href="index.php?page=agent&action=view_module_graph&id=' . $module['id_agente_modulo'] . '">' .
ui_print_truncate_text($module["nombre"], 20, true, true) . '</a>';
$status = STATUS_MODULE_WARNING;
$title = "";
if ($module["estado"] == 1) {
$status = STATUS_MODULE_CRITICAL;
$title = __('CRITICAL');
}
elseif ($module["estado"] == 2) {
$status = STATUS_MODULE_WARNING;
$title = __('WARNING');
}
elseif ($module["estado"] == 0) {
$status = STATUS_MODULE_OK;
$title = __('NORMAL');
}
elseif ($module["estado"] == 3) {
$last_status = modules_get_agentmodule_last_status($module['id_agente_modulo']);
switch($last_status) {
case 0:
$status = STATUS_MODULE_OK;
$title = __('UNKNOWN')." - ".__('Last status')." ".__('NORMAL');
break;
case 1:
$status = STATUS_MODULE_CRITICAL;
$title = __('UNKNOWN')." - ".__('Last status')." ".__('CRITICAL');
break;
case 2:
$status = STATUS_MODULE_WARNING;
$title = __('UNKNOWN')." - ".__('Last status')." ".__('WARNING');
break;
}
}
if (is_numeric($module["datos"])) {
$title .= ": " . format_for_graph($module["datos"]);
}
else {
$title .= ": " . substr(io_safe_output($module["datos"]),0,42);
}
$data[] = str_replace(array('images/status_sets', '<img'),
array('/images/status_sets', '<img height="15" width="15"') , ui_print_status_image($status, $title, true));
if ($module["id_tipo_modulo"] == 24) { // log4x
switch($module["datos"]) {
case 10: $salida = "TRACE"; $style="font-weight:bold; color:darkgreen;"; break;
case 20: $salida = "DEBUG"; $style="font-weight:bold; color:darkgreen;"; break;
case 30: $salida = "INFO"; $style="font-weight:bold; color:darkgreen;"; break;
case 40: $salida = "WARN"; $style="font-weight:bold; color:darkorange;"; break;
case 50: $salida = "ERROR"; $style="font-weight:bold; color:red;"; break;
case 60: $salida = "FATAL"; $style="font-weight:bold; color:red;"; break;
}
$salida = "<span style='$style'>$salida</span>";
}
else {
if (is_numeric($module["datos"])){
$salida = format_numeric($module["datos"]);
}
else {
$salida = "<span title='".$module['datos']."' style='white-space: nowrap;'>".substr(io_safe_output($module["datos"]),0,12)."</span>";
}
}
$data[] = $salida;
if ($module['estado'] == 3) {
$lastTime = '<span class="redb">';
}
else {
$lastTime = '<span>';
}
$lastTime .= ui_print_timestamp ($module["utimestamp"], true, array('units' => 'tiny'));
$lastTime .= '</span>';
$data[] = $lastTime;
$table->data[] = $data;
}
html_print_table($table);
$table->head = array();
$table->head[0] = __('Module');
$table->head[1] = __('Template');
$table->head[2] = '<span title="' . __('Last fired') . '" alt="' . __('Last fired') . '">' . __('Last') . '</span>';
$table->head[3] = '<span title="' . __('Status') . '" alt="' . __('Status') . '">' . __('S') . '</span>';
$table->align = array();
$table->align[3] = 'right';
$table->align[2] = 'center';
$table->data = array();
$table->rowclass = array();
echo "<h3 class='title_h3'>" . __('Alerts') . "</h3>";
$alertsSimple = agents_get_alerts_simple (array($this->idAgent));
$rowPair = false;
$iterator = 0;
foreach ($alertsSimple as $alert) {
if ($rowPair)
$table->rowclass[$iterator] = 'rowPair';
else
$table->rowclass[$iterator] = 'rowOdd';
$rowPair = !$rowPair;
$iterator++;
$data = array();
$data[] = ui_print_truncate_text(modules_get_agentmodule_name($alert["id_agent_module"]), 20, true, true);
$template = io_safe_output(alerts_get_alert_template ($alert['id_alert_template']));
$data[] = ui_print_truncate_text(io_safe_output($template['name']), 20, true, true);
$data[] = ui_print_timestamp ($alert["last_fired"], true, array('units' => 'tiny'));
$status = STATUS_ALERT_NOT_FIRED;
$title = "";
if ($alert["times_fired"] > 0) {
$status = STATUS_ALERT_FIRED;
$title = __('Alert fired').' '.$alert["times_fired"].' '.__('times');
}
elseif ($alert["disabled"] > 0) {
$status = STATUS_ALERT_DISABLED;
$title = __('Alert disabled');
}
else {
$status = STATUS_ALERT_NOT_FIRED;
$title = __('Alert not fired');
}
$data[] = str_replace(array('images/status_sets', '<img'),
array('/images/status_sets', '<img width="15" height="15"'), ui_print_status_image($status, $title, true));
$table->data[] = $data;
}
html_print_table($table);
}
}
class viewGraph {
private $system;
private $idAgentModule;
function __construct($idAgentModule = 0) {
global $system;
$this->system = $system;
$this->idAgentModule = $idAgentModule;
$this->agentModule = db_get_row_filter('tagente_modulo', array('id_agente_modulo' => $this->idAgentModule));
$this->period = $this->system->getRequest('period', 86400);
$this->offset = $this->system->getRequest("offset", 0);
$this->agent = db_get_row_filter('tagente', array('id_agente' => $this->agentModule['id_agente']));
}
function show() {
$idGroup = $this->agent['id_grupo'];
if (! check_acl ($this->system->getConfig('id_user'), $idGroup, "AR")) {
db_pandora_audit("ACL Violation",
"Trying to access (read) to agent ".agents_get_name($this->idAgent));
include ("../general/noaccess.php");
return;
}
echo "<h3 class='title_h3'><a href='index.php?page=agent&id=" . $this->agentModule['id_agente'] . "'>" . modules_get_agentmodule_agent_name($this->idAgentModule)."</a> / ".io_safe_output($this->agentModule['nombre']) . "</h3>";
echo "<h3 class='title_h3'>" . __('Graph') . "</h3>";
echo grafico_modulo_sparse($this->idAgentModule, $this->period, 0, 240,
200, io_safe_output($this->agentModule['nombre']), null, false,
false, true, 0, '', true, false, true, true, '../');
echo "<h3 class='title_h3'>" . __('Data') . "</h3>";
echo "<form method='post' action='index.php?page=agent&action=view_module_graph&id=" . $this->idAgentModule . "'>";
echo __("Choose period:");
$intervals = array ();
$intervals[3600] = human_time_description_raw (3600); // 1 hour
$intervals[86400] = human_time_description_raw (86400); // 1 day
$intervals[604800] = human_time_description_raw (604800); // 1 week
$intervals[2592000] = human_time_description_raw (2592000); // 1 month
echo html_print_extended_select_for_time ($intervals, 'period', $this->period, 'this.form.submit();', '', '0', 5) . __(" secs");
echo "</form><br />";
$moduletype_name = modules_get_moduletype_name (modules_get_agentmodule_type ($this->idAgentModule));
if ($moduletype_name == "log4x") {
$sql_body = sprintf ("FROM tagente_datos_log4x
WHERE id_agente_modulo = %d AND utimestamp > %d ORDER BY utimestamp DESC", $this->idAgentModule, (get_system_time () - $this->period));
$columns = array(
//"Timestamp" => array("utimestamp", "modules_format_timestamp", "align" => "center" ),
"Sev" => array("severity", "format_data", "align" => "center", "width" => "70px"),
"Message" => array("message", "modules_format_verbatim", "align" => "left", "width" => "45%"),
"StackTrace" => array("stacktrace", "modules_format_verbatim", "align" => "left", "width" => "50%")
);
}
else if (preg_match ("/string/", $moduletype_name)) {
$sql_body = sprintf (" FROM tagente_datos_string
WHERE id_agente_modulo = %d AND utimestamp > %d ORDER BY utimestamp DESC", $this->idAgentModule, (get_system_time () - $this->period));
$columns = array(
//"Timestamp" => array("utimestamp", "modules_format_timestamp", "align" => "center"),
"Data" => array("datos", "format_data", "align" => "center"),
"Time" => array("utimestamp", "modules_format_time", "align" => "center")
);
}
else {
$sql_body = sprintf (" FROM tagente_datos
WHERE id_agente_modulo = %d AND utimestamp > %d
ORDER BY utimestamp DESC", $this->idAgentModule, (get_system_time () - $this->period));
$columns = array(
"Data" => array("datos", "format_data", "align" => "center"),
"Time" => array("utimestamp", "modules_format_time", "align" => "center")
);
}
$sql_count = 'SELECT COUNT(*) ' . $sql_body;
$count = db_get_value_sql($sql_count);
switch ($config["dbtype"]) {
case "mysql":
$sql = 'SELECT * ' . $sql_body . ' LIMIT ' . $this->offset . ',' . $this->system->getPageSize();
break;
case "postgresql":
$sql = 'SELECT * ' . $sql_body . ' LIMIT ' . $this->system->getPageSize() . ' OFFSET ' . $this->offset;
break;
case "oracle":
$set = array();
$set['limit'] = $this->system->getPageSize();
$set['offset'] = $this->offset;
$sql = oracle_recode_query ('SELECT * ' . $sql_body, $set);
break;
}
$result = db_get_all_rows_sql ($sql);
if (($config["dbtype"] == 'oracle') && ($result !== false)) {
// Delete rnum row generated by oracle_recode_query() function
for ($i=0; $i < count($result); $i++) {
unset($result[$i]['rnum']);
}
}
$table = null;
$table->width = '100%';
$table->head = array();
$index = 0;
foreach($columns as $col => $attr) {
$table->head[$index] = $col;
if (isset($attr["align"]))
$table->align[$index] = $attr["align"];
if (isset($attr["width"]))
$table->size[$index] = $attr["width"];
$index++;
}
$table->data = array(); //$this->system->debug($result);
$rowPair = false;
$iterator = 0;
foreach ($result as $row) {
if ($rowPair)
$table->rowclass[$iterator] = 'rowPair';
else
$table->rowclass[$iterator] = 'rowOdd';
$rowPair = !$rowPair;
$iterator++;
$data = array ();
foreach($columns as $col => $attr){
$data[] = $attr[1] ($row[$attr[0]]);
}
array_push ($table->data, $data);
}
html_print_table($table);
$pagination = ui_pagination ($count,
ui_get_url_refresh (array ('period' => $this->period)),
0, 0, true);
$pagination = str_replace('images/go_first.png', '../images/go_first.png', $pagination);
$pagination = str_replace('images/go_previous.png', '../images/go_previous.png', $pagination);
$pagination = str_replace('images/go_next.png', '../images/go_next.png', $pagination);
$pagination = str_replace('images/go_last.png', '../images/go_last.png', $pagination);
echo $pagination;
}
}
?>