implemented services treeview

Former-commit-id: d5d71442d0c6122ba91b160647559cdf03f55625
This commit is contained in:
alejandro-campos 2019-02-22 13:07:47 +01:00
parent cd83f324a1
commit eb56fd566c
11 changed files with 2973 additions and 2787 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 329 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 401 B

View File

@ -3,173 +3,163 @@
// ==================================================
// Copyright (c) 2005-2012 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 Lesser General Public License
// as published by the Free Software Foundation; 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.
// Only accesible by ajax
if (is_ajax()) {
global $config;
if (is_ajax ()) {
global $config;
enterprise_include_once("include/functions_dashboard.php");
enterprise_include_once('include/functions_dashboard.php');
$public_hash = get_parameter('hash', 0);
$public_hash = get_parameter('hash', 0);
// Try to authenticate by hash on public dashboards
if ($public_hash == 0) {
// Login check
check_login();
} else {
$validate_hash = enterprise_hook(
'dasboard_validate_public_hash',
array($public_hash, 'tree_view')
);
if ($validate_hash === false || $validate_hash === ENTERPRISE_NOT_HOOK) {
db_pandora_audit("Invalid public hash", "Trying to access report builder");
require ("general/noaccess.php");
exit;
}
}
require_once($config['homedir'] . "/include/class/Tree.class.php");
require_once($config['homedir'] . "/include/class/TreeOS.class.php");
require_once($config['homedir'] . "/include/class/TreeModuleGroup.class.php");
require_once($config['homedir'] . "/include/class/TreeModule.class.php");
require_once($config['homedir'] . "/include/class/TreeTag.class.php");
require_once($config['homedir'] . "/include/class/TreeGroup.class.php");
require_once($config['homedir'] . "/include/class/TreeService.class.php");
require_once($config['homedir'] . "/include/class/TreeGroupEdition.class.php");
enterprise_include_once("include/class/TreePolicies.class.php");
enterprise_include_once("include/class/TreeGroupMeta.class.php");
require_once($config['homedir'] . "/include/functions_reporting.php");
require_once($config['homedir'] . "/include/functions_os.php");
$getChildren = (bool) get_parameter('getChildren', 0);
$getGroupStatus = (bool) get_parameter('getGroupStatus', 0);
$getDetail = (bool) get_parameter('getDetail');
if ($getChildren) {
$type = get_parameter('type', 'group');
$rootType = get_parameter('rootType', '');
$id = get_parameter('id', -1);
$rootID = get_parameter('rootID', -1);
$serverID = get_parameter('serverID', false);
$childrenMethod = get_parameter('childrenMethod', 'on_demand');
$hash = get_parameter('hash', false);
if ($hash !== false) {
enterprise_hook('dasboard_validate_public_hash', array($hash, 'tree_view'));
}
// Try to authenticate by hash on public dashboards
if ($public_hash == 0) {
// Login check
check_login();
} else {
$validate_hash = enterprise_hook(
'dasboard_validate_public_hash',
[
$public_hash,
'tree_view',
]
);
if ($validate_hash === false || $validate_hash === ENTERPRISE_NOT_HOOK) {
db_pandora_audit('Invalid public hash', 'Trying to access report builder');
include 'general/noaccess.php';
exit;
}
}
$default_filters = array(
'searchAgent' => '',
'statusAgent' => AGENT_STATUS_ALL,
'searchModule' => '',
'statusModule' => -1,
'groupID' => 0,
'tagID' => 0,
);
$filter = get_parameter('filter', $default_filters);
include_once $config['homedir'].'/include/class/Tree.class.php';
include_once $config['homedir'].'/include/class/TreeOS.class.php';
include_once $config['homedir'].'/include/class/TreeModuleGroup.class.php';
include_once $config['homedir'].'/include/class/TreeModule.class.php';
include_once $config['homedir'].'/include/class/TreeTag.class.php';
include_once $config['homedir'].'/include/class/TreeGroup.class.php';
include_once $config['homedir'].'/include/class/TreeGroupEdition.class.php';
enterprise_include_once('include/class/TreePolicies.class.php');
enterprise_include_once('include/class/TreeGroupMeta.class.php');
include_once $config['homedir'].'/include/functions_reporting.php';
include_once $config['homedir'].'/include/functions_os.php';
$agent_a = check_acl ($config['id_user'], 0, "AR");
$agent_w = check_acl ($config['id_user'], 0, "AW");
$access = ($agent_a == true) ? 'AR' : (($agent_w == true) ? 'AW' : 'AR');
$switch_type = !empty($rootType) ? $rootType : $type;
switch ($switch_type) {
case 'os':
$tree = new TreeOS($type, $rootType, $id, $rootID, $serverID, $childrenMethod, $access);
break;
case 'module_group':
$tree = new TreeModuleGroup($type, $rootType, $id, $rootID, $serverID, $childrenMethod, $access);
break;
case 'module':
$tree = new TreeModule($type, $rootType, $id, $rootID, $serverID, $childrenMethod, $access);
break;
case 'tag':
$tree = new TreeTag($type, $rootType, $id, $rootID, $serverID, $childrenMethod, $access);
break;
case 'group':
if(is_metaconsole()){
if (!class_exists('TreeGroupMeta')) break;
$tree = new TreeGroupMeta($type, $rootType, $id, $rootID, $serverID, $childrenMethod, $access);
}
else{
$tree = new TreeGroup($type, $rootType, $id, $rootID, $serverID, $childrenMethod, $access);
}
break;
case 'policies':
if (!class_exists('TreePolicies')) break;
$tree = new TreePolicies($type, $rootType, $id, $rootID, $serverID, $childrenMethod, $access);
break;
case 'group_edition':
$tree = new TreeGroupEdition($type, $rootType, $id, $rootID, $serverID, $childrenMethod, $access);
break;
case 'services':
$tree = new TreeService($type, $rootType, $id, $rootID, $serverID, $childrenMethod, $access);
break;
default:
// FIXME. No error handler
return;
}
$getChildren = (bool) get_parameter('getChildren', 0);
$getGroupStatus = (bool) get_parameter('getGroupStatus', 0);
$getDetail = (bool) get_parameter('getDetail');
$tree->setFilter($filter);
ob_clean();
if ($getChildren) {
$type = get_parameter('type', 'group');
$rootType = get_parameter('rootType', '');
$id = get_parameter('id', -1);
$rootID = get_parameter('rootID', -1);
$serverID = get_parameter('serverID', false);
$childrenMethod = get_parameter('childrenMethod', 'on_demand');
$hash = get_parameter('hash', false);
if ($hash !== false) {
enterprise_hook('dasboard_validate_public_hash', [$hash, 'tree_view']);
}
$default_filters = [
'searchAgent' => '',
'statusAgent' => AGENT_STATUS_ALL,
'searchModule' => '',
'statusModule' => -1,
'groupID' => 0,
'tagID' => 0,
];
$filter = get_parameter('filter', $default_filters);
$agent_a = check_acl($config['id_user'], 0, 'AR');
$agent_w = check_acl($config['id_user'], 0, 'AW');
$access = ($agent_a == true) ? 'AR' : (($agent_w == true) ? 'AW' : 'AR');
$switch_type = !empty($rootType) ? $rootType : $type;
switch ($switch_type) {
case 'os':
$tree = new TreeOS($type, $rootType, $id, $rootID, $serverID, $childrenMethod, $access);
break;
case 'module_group':
$tree = new TreeModuleGroup($type, $rootType, $id, $rootID, $serverID, $childrenMethod, $access);
break;
case 'module':
$tree = new TreeModule($type, $rootType, $id, $rootID, $serverID, $childrenMethod, $access);
break;
case 'tag':
$tree = new TreeTag($type, $rootType, $id, $rootID, $serverID, $childrenMethod, $access);
break;
case 'group':
if (is_metaconsole()) {
if (!class_exists('TreeGroupMeta')) {
break;
}
$tree = new TreeGroupMeta($type, $rootType, $id, $rootID, $serverID, $childrenMethod, $access);
} else {
$tree = new TreeGroup($type, $rootType, $id, $rootID, $serverID, $childrenMethod, $access);
}
break;
case 'policies':
if (!class_exists('TreePolicies')) {
break;
}
$tree = new TreePolicies($type, $rootType, $id, $rootID, $serverID, $childrenMethod, $access);
break;
case 'group_edition':
$tree = new TreeGroupEdition($type, $rootType, $id, $rootID, $serverID, $childrenMethod, $access);
break;
default:
// FIXME. No error handler
return;
}
$tree->setFilter($filter);
ob_clean();
echo json_encode(['success' => 1, 'tree' => $tree->getArray()]);
return;
}
if ($getDetail) {
include_once $config['homedir'].'/include/functions_treeview.php';
$id = (int) get_parameter('id');
$type = (string) get_parameter('type');
$server = [];
if (is_metaconsole()) {
$server_id = (int) get_parameter('serverID');
$server = metaconsole_get_servers($server_id);
}
ob_clean();
echo '<div class="left_align">';
if (!empty($id) && !empty($type)) {
switch ($type) {
case 'agent':
treeview_printTable($id, $server, true);
break;
case 'module':
treeview_printModuleTable($id, $server, true);
break;
case 'alert':
treeview_printAlertsTable($id, $server, true);
break;
default:
// Nothing
break;
}
}
echo '<br></div>';
return;
}
return;
echo json_encode(array('success' => 1, 'tree' => $tree->getArray()));
return;
}
if ($getDetail) {
require_once($config['homedir']."/include/functions_treeview.php");
$id = (int) get_parameter('id');
$type = (string) get_parameter('type');
$server = array();
if (is_metaconsole()) {
$server_id = (int) get_parameter('serverID');
$server = metaconsole_get_servers($server_id);
}
ob_clean();
echo '<div class="left_align">';
if (!empty($id) && !empty($type)) {
switch ($type) {
case 'agent':
treeview_printTable($id, $server, true);
break;
case 'module':
treeview_printModuleTable($id, $server, true);
break;
case 'alert':
treeview_printAlertsTable($id, $server, true);
break;
default:
// Nothing
break;
}
}
echo '<br></div>';
return;
}
return;
}
?>

File diff suppressed because it is too large Load Diff

View File

@ -1,215 +1,193 @@
<?php
// Pandora FMS- http://pandorafms.com
//Pandora FMS- http://pandorafms.com
// ==================================================
// Copyright (c) 2005-2018 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 Lesser General Public License
// as published by the Free Software Foundation; 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.
global $config;
require_once $config['homedir'].'/include/class/Tree.class.php';
require_once($config['homedir']."/include/class/Tree.class.php");
class TreeGroup extends Tree
{
class TreeGroup extends Tree {
protected $propagateCounters = true;
protected $propagateCounters = true;
protected $displayAllGroups = false;
protected $displayAllGroups = false;
public function __construct($type, $rootType = '', $id = -1, $rootID = -1, $serverID = false, $childrenMethod = "on_demand", $access = 'AR') {
global $config;
public function __construct($type, $rootType='', $id=-1, $rootID=-1, $serverID=false, $childrenMethod='on_demand', $access='AR')
{
global $config;
parent::__construct($type, $rootType, $id, $rootID, $serverID, $childrenMethod, $access);
parent::__construct($type, $rootType, $id, $rootID, $serverID, $childrenMethod, $access);
$this->L1fieldName = "id_group";
$this->L1extraFields = array(
"tg.nombre AS `name`",
"tg.icon",
"tg.id_grupo AS gid"
);
$this->L1fieldName = 'id_group';
$this->L1extraFields = [
'tg.nombre AS `name`',
'tg.icon',
'tg.id_grupo AS gid',
];
$this->L2conditionInside = "AND (
ta.id_grupo = " . $this->id . "
OR tasg.id_group = " . $this->id . "
)";
}
$this->L2conditionInside = 'AND (
ta.id_grupo = '.$this->id.'
OR tasg.id_group = '.$this->id.'
)';
}
public function setPropagateCounters($value) {
$this->propagateCounters = (bool)$value;
}
public function setDisplayAllGroups($value) {
$this->displayAllGroups = (bool)$value;
}
public function setPropagateCounters($value)
{
$this->propagateCounters = (bool) $value;
}
protected function getData() {
if ($this->id == -1) {
$this->getFirstLevel();
public function setDisplayAllGroups($value)
{
$this->displayAllGroups = (bool) $value;
}
} elseif ($this->type == 'group') {
$this->getSecondLevel();
} elseif ($this->type == 'agent') {
$this->getThirdLevel();
}
}
protected function getGroupSearchFilter() {
return "";
}
protected function getData()
{
if ($this->id == -1) {
$this->getFirstLevel();
} else if ($this->type == 'group') {
$this->getSecondLevel();
} else if ($this->type == 'agent') {
$this->getThirdLevel();
}
}
protected function getFirstLevel() {
$processed_items = $this->getProcessedGroups();
if (!empty($processed_items)) {
// Filter by group name. This should be done after rerieving the items cause we need the possible items descendants
if (!empty($this->filter['searchGroup'])) {
// Save the groups which intersect with the user groups
$groups = db_get_all_rows_filter('tgrupo', array('nombre' => '%' . $this->filter['searchGroup'] . '%'));
if ($groups == false) $groups = array();
$userGroupsACL = $this->userGroupsACL;
$ids_hash = array_reduce($groups, function ($userGroups, $group) use ($userGroupsACL) {
$group_id = $group['id_grupo'];
if (isset($userGroupsACL[$group_id])) {
$userGroups[$group_id] = $userGroupsACL[$group_id];
}
protected function getGroupSearchFilter()
{
return '';
}
return $userGroups;
}, array());
$result = self::extractGroupsWithIDs($processed_items, $ids_hash);
protected function getFirstLevel()
{
$processed_items = $this->getProcessedGroups();
$processed_items = ($result === false) ? array() : $result;
}
if (!empty($processed_items)) {
// Filter by group name. This should be done after rerieving the items cause we need the possible items descendants
if (!empty($this->filter['searchGroup'])) {
// Save the groups which intersect with the user groups
$groups = db_get_all_rows_filter('tgrupo', ['nombre' => '%'.$this->filter['searchGroup'].'%']);
if ($groups == false) {
$groups = [];
}
// groupID filter. To access the view from tactical views f.e.
if (!empty($this->filter['groupID'])) {
$result = self::extractItemWithID($processed_items, $this->filter['groupID'], "group", $this->strictACL);
$userGroupsACL = $this->userGroupsACL;
$ids_hash = array_reduce(
$groups,
function ($userGroups, $group) use ($userGroupsACL) {
$group_id = $group['id_grupo'];
if (isset($userGroupsACL[$group_id])) {
$userGroups[$group_id] = $userGroupsACL[$group_id];
}
$processed_items = ($result === false) ? array() : array($result);
}
}
hd("G-GETFIRSTLEVELGETFIRSTLEVELGETFIRSTLEVELGETFIRSTLEVELGETFIRSTLEVELGETFIRSTLEVELGETFIRSTLEVELGETFIRSTLEVEL", true);
hd($processed_items, true);
$this->tree = $processed_items;
}
return $userGroups;
},
[]
);
protected function getProcessedGroups () {
$processed_groups = array();
// Index and process the groups
$groups = $this->getGroupCounters();
$result = self::extractGroupsWithIDs($processed_items, $ids_hash);
// If user have not permissions in parent, set parent node to 0 (all)
// Avoid to do foreach for admins
if (!users_can_manage_group_all("AR")) {
foreach ($groups as $id => $group) {
if (!isset($this->userGroups[$groups[$id]['parent']])) {
$groups[$id]['parent'] = 0;
}
}
}
// Build the group hierarchy
foreach ($groups as $id => $group) {
if (isset($groups[$id]['parent']) && ($groups[$id]['parent'] != 0)) {
$parent = $groups[$id]['parent'];
// Parent exists
if (!isset($groups[$parent]['children'])) {
$groups[$parent]['children'] = array();
}
// Store a reference to the group into the parent
$groups[$parent]['children'][] = &$groups[$id];
// This group was introduced into a parent
$groups[$id]['have_parent'] = true;
}
}
// Sort the children groups
foreach ($groups as $id => $group) {
if (isset($groups[$id]['children'])) {
usort($groups[$id]['children'], array("Tree", "cmpSortNames"));
}
}
//Filter groups and eliminates the reference to children groups out of her parent
$groups = array_filter($groups, function ($group) {
return !$group['have_parent'];
});
// Propagate child counters to her parents
$processed_items = ($result === false) ? [] : $result;
}
if ($this->propagateCounters) {
TreeGroup::processCounters($groups);
// Filter groups and eliminates the reference to empty groups
$groups = $this->deleteEmptyGroups($groups);
} else {
$groups = $this->deleteEmptyGroupsNotPropagate($groups);
}
// groupID filter. To access the view from tactical views f.e.
if (!empty($this->filter['groupID'])) {
$result = self::extractItemWithID($processed_items, $this->filter['groupID'], 'group', $this->strictACL);
usort($groups, array("Tree", "cmpSortNames"));
$processed_items = ($result === false) ? [] : [$result];
}
}
return $groups;
}
$this->tree = $processed_items;
}
protected function getGroupCounters() {
$fields = $this->getFirstLevelFields();
$inside_fields = $this->getFirstLevelFieldsInside();
$group_acl = "";
$secondary_group_acl = "";
if (!users_can_manage_group_all("AR")) {
$user_groups_str = implode(",", $this->userGroupsArray);
$group_acl = " AND ta.id_grupo IN ($user_groups_str)";
$secondary_group_acl = " AND tasg.id_group IN ($user_groups_str)";
}
$agent_search_filter = $this->getAgentSearchFilter();
$agent_search_filter = preg_replace("/%/", "%%", $agent_search_filter);
$agent_status_filter = $this->getAgentStatusFilter();
$module_status_filter = $this->getModuleStatusFilter();
protected function getProcessedGroups()
{
$processed_groups = [];
// Index and process the groups
$groups = $this->getGroupCounters();
// If user have not permissions in parent, set parent node to 0 (all)
// Avoid to do foreach for admins
if (!users_can_manage_group_all('AR')) {
foreach ($groups as $id => $group) {
if (!isset($this->userGroups[$groups[$id]['parent']])) {
$groups[$id]['parent'] = 0;
}
}
}
// Build the group hierarchy
foreach ($groups as $id => $group) {
if (isset($groups[$id]['parent']) && ($groups[$id]['parent'] != 0)) {
$parent = $groups[$id]['parent'];
// Parent exists
if (!isset($groups[$parent]['children'])) {
$groups[$parent]['children'] = [];
}
// Store a reference to the group into the parent
$groups[$parent]['children'][] = &$groups[$id];
// This group was introduced into a parent
$groups[$id]['have_parent'] = true;
}
}
// Sort the children groups
foreach ($groups as $id => $group) {
if (isset($groups[$id]['children'])) {
usort($groups[$id]['children'], ['Tree', 'cmpSortNames']);
}
}
// Filter groups and eliminates the reference to children groups out of her parent
$groups = array_filter(
$groups,
function ($group) {
return !$group['have_parent'];
}
);
// Propagate child counters to her parents
if ($this->propagateCounters) {
self::processCounters($groups);
// Filter groups and eliminates the reference to empty groups
$groups = $this->deleteEmptyGroups($groups);
} else {
$groups = $this->deleteEmptyGroupsNotPropagate($groups);
}
usort($groups, ['Tree', 'cmpSortNames']);
return $groups;
}
protected function getGroupCounters()
{
$fields = $this->getFirstLevelFields();
$inside_fields = $this->getFirstLevelFieldsInside();
$group_acl = '';
$secondary_group_acl = '';
if (!users_can_manage_group_all('AR')) {
$user_groups_str = implode(',', $this->userGroupsArray);
$group_acl = " AND ta.id_grupo IN ($user_groups_str)";
$secondary_group_acl = " AND tasg.id_group IN ($user_groups_str)";
}
$agent_search_filter = $this->getAgentSearchFilter();
$agent_search_filter = preg_replace('/%/', '%%', $agent_search_filter);
$agent_status_filter = $this->getAgentStatusFilter();
$module_status_filter = $this->getModuleStatusFilter();
$module_search_inner = '';
$module_search_filter = '';
if (!empty($this->filter['searchModule'])) {
$module_search_inner = '
$module_search_inner = "";
$module_search_filter = "";
if (!empty($this->filter['searchModule'])) {
$module_search_inner = "
INNER JOIN tagente_modulo tam
ON ta.id_agente = tam.id_agente
INNER JOIN tagente_estado tae
ON tae.id_agente_modulo = tam.id_agente_modulo';
$module_search_filter = "AND tam.disabled = 0
AND tam.nombre LIKE '%%".$this->filter['searchModule']."%%' ".$this->getModuleStatusFilterFromTestado();
}
ON tae.id_agente_modulo = tam.id_agente_modulo";
$module_search_filter = "AND tam.disabled = 0
AND tam.nombre LIKE '%%" . $this->filter['searchModule'] . "%%' " .
$this->getModuleStatusFilterFromTestado()
;
}
$table = is_metaconsole() ? 'tmetaconsole_agent' : 'tagente';
$table_sec = is_metaconsole() ? 'tmetaconsole_agent_secondary_group' : 'tagent_secondary_group';
$table = is_metaconsole() ? "tmetaconsole_agent" : "tagente";
$table_sec = is_metaconsole() ? "tmetaconsole_agent_secondary_group" : "tagent_secondary_group";
$sql_model = "SELECT %s FROM
$sql_model = "SELECT %s FROM
(
SELECT COUNT(DISTINCT(ta.id_agente)) AS total, id_grupo AS g
FROM $table ta
@ -236,294 +214,254 @@ class TreeGroup extends Tree
$secondary_group_acl
GROUP BY id_group
) x GROUP BY g";
$sql_array = [];
foreach ($inside_fields as $inside_field) {
$sql_array[] = sprintf(
$sql_model,
$inside_field['header'],
$inside_field['condition'],
$inside_field['condition']
);
}
$sql = "SELECT $fields FROM (".implode(' UNION ALL ', $sql_array).') x2
$sql_array = array();
foreach ($inside_fields as $inside_field) {
$sql_array[] = sprintf(
$sql_model,
$inside_field['header'],
$inside_field['condition'],
$inside_field['condition']
);
}
$sql = "SELECT $fields FROM (" . implode(" UNION ALL ", $sql_array) . ") x2
RIGHT JOIN tgrupo tg
ON x2.g = tg.id_grupo
GROUP BY tg.id_grupo';
$stats = db_get_all_rows_sql($sql);
GROUP BY tg.id_grupo";
$stats = db_get_all_rows_sql($sql);
$group_stats = [];
foreach ($stats as $group) {
$group_stats[$group['gid']]['total_count'] = (int) $group['total_count'];
$group_stats[$group['gid']]['total_critical_count'] = (int) $group['total_critical_count'];
$group_stats[$group['gid']]['total_unknown_count'] = (int) $group['total_unknown_count'];
$group_stats[$group['gid']]['total_warning_count'] = (int) $group['total_warning_count'];
$group_stats[$group['gid']]['total_not_init_count'] = (int) $group['total_not_init_count'];
$group_stats[$group['gid']]['total_normal_count'] = (int) $group['total_normal_count'];
$group_stats[$group['gid']]['total_fired_count'] = (int) $group['total_alerts_count'];
$group_stats[$group['gid']]['name'] = $group['name'];
$group_stats[$group['gid']]['parent'] = $group['parent'];
$group_stats[$group['gid']]['icon'] = $group['icon'];
$group_stats[$group['gid']]['id'] = $group['gid'];
$group_stats[$group['gid']] = $this->getProcessedItem($group_stats[$group['gid']]);
}
$group_stats = array();
return $group_stats;
}
hd("STATS STATS STATS STATS STATS STATS STATS STATS STATS STATS STATS STATS STATS STATS STATS STATS STATS STATS STATS STATS STATS STATS STATS STATS STATS STATS STATS STATS STATS STATS STATS STATS STATS STATS STATS STATS STATS STATS ", true);
hd($stats, true);
foreach ($stats as $group) {
$group_stats[$group['gid']]['total_count'] = (int)$group['total_count'];
$group_stats[$group['gid']]['total_critical_count'] = (int)$group['total_critical_count'];
$group_stats[$group['gid']]['total_unknown_count'] = (int)$group['total_unknown_count'];
$group_stats[$group['gid']]['total_warning_count'] = (int)$group['total_warning_count'];
$group_stats[$group['gid']]['total_not_init_count'] = (int)$group['total_not_init_count'];
$group_stats[$group['gid']]['total_normal_count'] = (int)$group['total_normal_count'];
$group_stats[$group['gid']]['total_fired_count'] = (int)$group['total_alerts_count'];
$group_stats[$group['gid']]['name'] = $group['name'];
$group_stats[$group['gid']]['parent'] = $group['parent'];
$group_stats[$group['gid']]['icon'] = $group['icon'];
$group_stats[$group['gid']]['id'] = $group['gid'];
$group_stats[$group['gid']] = $this->getProcessedItem($group_stats[$group['gid']]);
}
protected function getFirstLevelFields()
{
$fields = parent::getFirstLevelFields();
$parent = $this->getDisplayHierarchy() ? 'tg.parent' : '0 as parent';
return "$fields, $parent";
}
return $group_stats;
}
protected function getProcessedModules($modules_tree)
{
$groups = [];
foreach ($modules_tree as $group) {
$groups[$group['id']] = $group;
}
protected function getFirstLevelFields() {
$fields = parent::getFirstLevelFields();
$parent = $this->getDisplayHierarchy() ? 'tg.parent' : '0 as parent';
return "$fields, $parent";
}
// Build the module hierarchy
foreach ($groups as $id => $group) {
if (isset($groups[$id]['parent']) && ($groups[$id]['parent'] != 0)) {
$parent = $groups[$id]['parent'];
// Parent exists
if (!isset($groups[$parent]['children'])) {
$groups[$parent]['children'] = [];
}
protected function getProcessedModules($modules_tree) {
// Store a reference to the group into the parent
$groups[$parent]['children'][] = &$groups[$id];
// This group was introduced into a parent
$groups[$id]['have_parent'] = true;
}
}
$groups = array();
foreach ($modules_tree as $group) {
$groups[$group["id"]] = $group;
}
// Sort the children groups
foreach ($groups as $id => $group) {
if (isset($groups[$id]['children'])) {
usort($groups[$id]['children'], ['Tree', 'cmpSortNames']);
}
}
// Build the module hierarchy
foreach ($groups as $id => $group) {
if (isset($groups[$id]['parent']) && ($groups[$id]['parent'] != 0)) {
$parent = $groups[$id]['parent'];
// Parent exists
if (!isset($groups[$parent]['children'])) {
$groups[$parent]['children'] = array();
}
// Store a reference to the group into the parent
$groups[$parent]['children'][] = &$groups[$id];
// This group was introduced into a parent
$groups[$id]['have_parent'] = true;
}
}
// Filter groups and eliminates the reference to children groups out of her parent
$groups = array_filter(
$groups,
function ($group) {
return !$group['have_parent'];
}
);
// Sort the children groups
foreach ($groups as $id => $group) {
if (isset($groups[$id]['children'])) {
usort($groups[$id]['children'], array("Tree", "cmpSortNames"));
}
}
//Filter groups and eliminates the reference to children groups out of her parent
$groups = array_filter($groups, function ($group) {
return !$group['have_parent'];
});
return array_values($groups);
}
return array_values($groups);
}
// FIXME: Hierarchy lops is broken
protected function getProcessedModules_old($modules_tree) {
// FIXME: Hierarchy lops is broken
protected function getProcessedModules_old($modules_tree)
{
$tree_modules = [];
$new_modules_root = array_filter(
$modules_tree,
function ($module) {
return (isset($module['parent']) && ($module['parent'] == 0));
}
);
$tree_modules = array();
$new_modules_root = array_filter($modules_tree, function ($module) {
return (isset($module['parent']) && ($module['parent'] == 0));
});
$new_modules_child = array_filter(
$modules_tree,
function ($module) {
return (isset($module['parent']) && ($module['parent'] != 0));
}
);
$new_modules_child = array_filter($modules_tree, function ($module) {
return (isset($module['parent']) && ($module['parent'] != 0));
});
$i = 0;
while (!empty($new_modules_child)) {
foreach ($new_modules_child as $i => $child) {
self::recursive_modules_tree_view($new_modules_root, $new_modules_child, $i, $child);
}
}
$i = 0;
while (!empty($new_modules_child)) {
foreach ($new_modules_child as $i => $child) {
TreeGroup::recursive_modules_tree_view($new_modules_root, $new_modules_child, $i, $child);
}
}
foreach ($new_modules_root as $m) {
$tree_modules[] = $m;
}
foreach ($new_modules_root as $m) {
$tree_modules[] = $m;
}
return $tree_modules;
}
return $tree_modules;
}
// FIXME with getProcessedModules_old
static function recursive_modules_tree_view (&$new_modules, &$new_modules_child, $i, $child) {
foreach ($new_modules as $index => $module) {
if ($module['id'] == $child['parent']) {
$new_modules[$index]['children'][] = $child;
unset($new_modules_child[$i]);
break;
}
else if (isset($new_modules[$index]['children'])) {
TreeGroup::recursive_modules_tree_view ($new_modules[$index]['children'], $new_modules_child, $i, $child);
}
}
}
static function processCounters(&$groups) {
$all_counters = array();
foreach ($groups as $id => $group) {
$child_counters = array();
if (!empty($groups[$id]['children'])) {
$child_counters = TreeGroup::processCounters($groups[$id]['children']);
}
if (!empty($child_counters)) {
foreach($child_counters as $type => $value) {
$groups[$id]['counters'][$type] += $value;
}
}
foreach($groups[$id]['counters'] as $type => $value) {
$all_counters[$type] += $value;
}
}
return $all_counters;
}
// FIXME with getProcessedModules_old
static function recursive_modules_tree_view(&$new_modules, &$new_modules_child, $i, $child)
{
foreach ($new_modules as $index => $module) {
if ($module['id'] == $child['parent']) {
$new_modules[$index]['children'][] = $child;
unset($new_modules_child[$i]);
break;
} else if (isset($new_modules[$index]['children'])) {
self::recursive_modules_tree_view($new_modules[$index]['children'], $new_modules_child, $i, $child);
}
}
}
/**
* @brief Recursive function to remove the empty groups
*
* @param groups All groups structure
*
* @return new_groups A new groups structure without empty groups
*/
protected function deleteEmptyGroups ($groups) {
if($this->displayAllGroups) return $groups;
$new_groups = array();
foreach ($groups as $group) {
// If a group is empty, do not add to new_groups.
if (!isset($group['counters']['total']) || $group['counters']['total'] == 0) {
continue;
}
// Tray to remove the children groups
if (!empty($group['children'])) {
$children = $this->deleteEmptyGroups ($group['children']);
if (empty($children)) unset($group['children']);
else $group['children'] = $children;
}
$new_groups[] = $group;
}
return $new_groups;
}
protected function deleteEmptyGroupsNotPropagate ($groups) {
if($this->displayAllGroups) return $groups;
$new_groups = array();
foreach ($groups as $group) {
// Tray to remove the children groups
if (!empty($group['children'])) {
$children = $this->deleteEmptyGroupsNotPropagate ($group['children']);
if (empty($children)) {
unset($group['children']);
// If a group is empty, do not add to new_groups.
if (isset($group['counters']['total']) && $group['counters']['total'] != 0) {
$new_groups[] = $group;
}
} else {
$group['children'] = $children;
$new_groups[] = $group;
}
} else {
// If a group is empty, do not add to new_groups.
if (isset($group['counters']['total']) && $group['counters']['total'] != 0) {
$new_groups[] = $group;
}
}
}
return $new_groups;
}
static function processCounters(&$groups)
{
$all_counters = [];
foreach ($groups as $id => $group) {
$child_counters = [];
if (!empty($groups[$id]['children'])) {
$child_counters = self::processCounters($groups[$id]['children']);
}
private static function extractGroupsWithIDs ($groups, $ids_hash) {
$result_groups = array();
foreach ($groups as $group) {
if (isset($ids_hash[$group['id']])) {
$result_groups[] = $group;
}
else if (!empty($group['children'])) {
$result = self::extractGroupsWithIDs($group['children'], $ids_hash);
if (!empty($child_counters)) {
foreach ($child_counters as $type => $value) {
$groups[$id]['counters'][$type] += $value;
}
}
// Item found on children
if (!empty($result)) {
$result_groups = array_merge($result_groups, $result);
}
}
}
foreach ($groups[$id]['counters'] as $type => $value) {
$all_counters[$type] += $value;
}
}
return $result_groups;
}
return $all_counters;
}
private static function extractItemWithID ($items, $item_id, $item_type = "group", $strictACL = false) {
foreach ($items as $item) {
if ($item["type"] != $item_type)
continue;
// Item found
if ($strictACL && is_metaconsole()) {
foreach ($item["id"] as $server_id => $id) {
if ($id == $item_id)
return $item;
}
}
else {
if ($item["id"] == $item_id)
return $item;
}
/**
* @brief Recursive function to remove the empty groups
*
* @param groups All groups structure
*
* @return new_groups A new groups structure without empty groups
*/
protected function deleteEmptyGroups($groups)
{
if ($this->displayAllGroups) {
return $groups;
}
if ($item["type"] == "group" && !empty($item["children"])) {
$result = self::extractItemWithID($item["children"], $item_id, $item_type, $strictACL);
$new_groups = [];
foreach ($groups as $group) {
// If a group is empty, do not add to new_groups.
if (!isset($group['counters']['total']) || $group['counters']['total'] == 0) {
continue;
}
// Item found on children
if ($result !== false)
return $result;
}
}
// Tray to remove the children groups
if (!empty($group['children'])) {
$children = $this->deleteEmptyGroups($group['children']);
if (empty($children)) {
unset($group['children']);
} else {
$group['children'] = $children;
}
}
$new_groups[] = $group;
}
return $new_groups;
}
protected function deleteEmptyGroupsNotPropagate($groups)
{
if ($this->displayAllGroups) {
return $groups;
}
$new_groups = [];
foreach ($groups as $group) {
// Tray to remove the children groups
if (!empty($group['children'])) {
$children = $this->deleteEmptyGroupsNotPropagate($group['children']);
if (empty($children)) {
unset($group['children']);
// If a group is empty, do not add to new_groups.
if (isset($group['counters']['total']) && $group['counters']['total'] != 0) {
$new_groups[] = $group;
}
} else {
$group['children'] = $children;
$new_groups[] = $group;
}
} else {
// If a group is empty, do not add to new_groups.
if (isset($group['counters']['total']) && $group['counters']['total'] != 0) {
$new_groups[] = $group;
}
}
}
return $new_groups;
}
private static function extractGroupsWithIDs($groups, $ids_hash)
{
$result_groups = [];
foreach ($groups as $group) {
if (isset($ids_hash[$group['id']])) {
$result_groups[] = $group;
} else if (!empty($group['children'])) {
$result = self::extractGroupsWithIDs($group['children'], $ids_hash);
// Item found on children
if (!empty($result)) {
$result_groups = array_merge($result_groups, $result);
}
}
}
return $result_groups;
}
private static function extractItemWithID($items, $item_id, $item_type='group', $strictACL=false)
{
foreach ($items as $item) {
if ($item['type'] != $item_type) {
continue;
}
// Item found
if ($strictACL && is_metaconsole()) {
foreach ($item['id'] as $server_id => $id) {
if ($id == $item_id) {
return $item;
}
}
} else {
if ($item['id'] == $item_id) {
return $item;
}
}
if ($item['type'] == 'group' && !empty($item['children'])) {
$result = self::extractItemWithID($item['children'], $item_id, $item_type, $strictACL);
// Item found on children
if ($result !== false) {
return $result;
}
}
}
// Item not found
return false;
}
protected function getDisplayHierarchy()
{
return $this->filter['searchHirearchy'] ||
(empty($this->filter['searchAgent']) && empty($this->filter['searchModule']));
}
// Item not found
return false;
}
protected function getDisplayHierarchy() {
return $this->filter['searchHirearchy'] ||
(empty($this->filter['searchAgent']) && empty($this->filter['searchModule']));
}
}
?>

View File

@ -1,120 +1,108 @@
<?php
// Pandora FMS- http://pandorafms.com
//Pandora FMS- http://pandorafms.com
// ==================================================
// Copyright (c) 2005-2018 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 Lesser General Public License
// as published by the Free Software Foundation; 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.
global $config;
require_once $config['homedir'].'/include/class/Tree.class.php';
require_once($config['homedir']."/include/class/Tree.class.php");
class TreeGroupEdition extends TreeGroup
{
class TreeGroupEdition extends TreeGroup {
public function __construct($type, $rootType = '', $id = -1, $rootID = -1, $serverID = false, $childrenMethod = "on_demand", $access = 'AR') {
global $config;
parent::__construct($type, $rootType, $id, $rootID, $serverID, $childrenMethod, $access);
}
protected function getData() {
if ($this->id == -1) {
$this->getFirstLevel();
}
}
protected function getProcessedGroups () {
$processed_groups = array();
// Index and process the groups
$groups = $this->getGroupCounters();
// If user have not permissions in parent, set parent node to 0 (all)
// Avoid to do foreach for admins
if (!users_can_manage_group_all("AR")) {
foreach ($groups as $id => $group) {
if (!isset($this->userGroups[$groups[$id]['parent']])) {
$groups[$id]['parent'] = 0;
}
}
}
// Build the group hierarchy
foreach ($groups as $id => $group) {
if (isset($groups[$id]['parent']) && ($groups[$id]['parent'] != 0)) {
$parent = $groups[$id]['parent'];
// Parent exists
if (!isset($groups[$parent]['children'])) {
$groups[$parent]['children'] = array();
}
// Store a reference to the group into the parent
$groups[$parent]['children'][] = &$groups[$id];
// This group was introduced into a parent
$groups[$id]['have_parent'] = true;
}
}
// Sort the children groups
foreach ($groups as $id => $group) {
if (isset($groups[$id]['children'])) {
usort($groups[$id]['children'], array("Tree", "cmpSortNames"));
}
}
//Filter groups and eliminates the reference to children groups out of her parent
$groups = array_filter($groups, function ($group) {
return !$group['have_parent'];
});
usort($groups, array("Tree", "cmpSortNames"));
return $groups;
}
public function __construct($type, $rootType='', $id=-1, $rootID=-1, $serverID=false, $childrenMethod='on_demand', $access='AR')
{
global $config;
parent::__construct($type, $rootType, $id, $rootID, $serverID, $childrenMethod, $access);
}
protected function getData()
{
if ($this->id == -1) {
$this->getFirstLevel();
}
}
protected function getProcessedGroups()
{
$processed_groups = [];
// Index and process the groups
$groups = $this->getGroupCounters();
// If user have not permissions in parent, set parent node to 0 (all)
// Avoid to do foreach for admins
if (!users_can_manage_group_all('AR')) {
foreach ($groups as $id => $group) {
if (!isset($this->userGroups[$groups[$id]['parent']])) {
$groups[$id]['parent'] = 0;
}
}
}
// Build the group hierarchy
foreach ($groups as $id => $group) {
if (isset($groups[$id]['parent']) && ($groups[$id]['parent'] != 0)) {
$parent = $groups[$id]['parent'];
// Parent exists
if (!isset($groups[$parent]['children'])) {
$groups[$parent]['children'] = [];
}
// Store a reference to the group into the parent
$groups[$parent]['children'][] = &$groups[$id];
// This group was introduced into a parent
$groups[$id]['have_parent'] = true;
}
}
// Sort the children groups
foreach ($groups as $id => $group) {
if (isset($groups[$id]['children'])) {
usort($groups[$id]['children'], ['Tree', 'cmpSortNames']);
}
}
// Filter groups and eliminates the reference to children groups out of her parent
$groups = array_filter(
$groups,
function ($group) {
return !$group['have_parent'];
}
);
usort($groups, ['Tree', 'cmpSortNames']);
return $groups;
}
protected function getGroupCounters()
{
$messages = [
'confirm' => __('Confirm'),
'cancel' => __('Cancel'),
'messg' => __('Are you sure?'),
];
$sql = 'SELECT id_grupo AS gid,
protected function getGroupCounters() {
$messages = array(
'confirm' => __('Confirm'),
'cancel' => __('Cancel'),
'messg' => __('Are you sure?')
);
$sql = "SELECT id_grupo AS gid,
nombre as name, parent, icon
FROM tgrupo
';
";
$stats = db_get_all_rows_sql($sql);
$group_stats = [];
foreach ($stats as $group) {
$group_stats[$group['gid']]['name'] = $group['name'];
$group_stats[$group['gid']]['parent'] = $group['parent'];
$group_stats[$group['gid']]['icon'] = $group['icon'];
$group_stats[$group['gid']]['id'] = $group['gid'];
$group_stats[$group['gid']]['type'] = 'group';
$group_stats[$group['gid']] = $this->getProcessedItem($group_stats[$group['gid']]);
$group_stats[$group['gid']]['delete']['messages'] = $messages;
$group_stats[$group['gid']]['edit'] = 1;
$group_stats[$group['gid']]['alerts'] = '';
}
return $group_stats;
}
$stats = db_get_all_rows_sql($sql);
$group_stats = array();
foreach ($stats as $group) {
$group_stats[$group['gid']]['name'] = $group['name'];
$group_stats[$group['gid']]['parent'] = $group['parent'];
$group_stats[$group['gid']]['icon'] = $group['icon'];
$group_stats[$group['gid']]['id'] = $group['gid'];
$group_stats[$group['gid']]['type'] = 'group';
$group_stats[$group['gid']] = $this->getProcessedItem($group_stats[$group['gid']]);
$group_stats[$group['gid']]['delete']['messages'] = $messages;
$group_stats[$group['gid']]['edit'] = 1;
$group_stats[$group['gid']]['alerts'] = '';
}
return $group_stats;
}
}
?>

View File

@ -0,0 +1,342 @@
<?php
//Pandora FMS- http://pandorafms.com
// ==================================================
// Copyright (c) 2005-2018 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 Lesser General Public License
// as published by the Free Software Foundation; 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.
global $config;
require_once($config['homedir']."/include/class/Tree.class.php");
class TreeService extends Tree {
protected $propagateCounters = true;
protected $displayAllGroups = false;
public function __construct($type, $rootType = '', $id = -1, $rootID = -1, $serverID = false, $childrenMethod = "on_demand", $access = 'AR') {
global $config;
parent::__construct($type, $rootType, $id, $rootID, $serverID, $childrenMethod, $access);
$this->L1fieldName = "id_group";
$this->L1extraFields = array(
"ts.name AS `name`",
"ts.id AS `sid`"
);
$this->filter['statusAgent'] = AGENT_STATUS_ALL;
$this->avoid_condition = true;
$this->L2inner = 'LEFT JOIN tservice_element tse
ON tse.id_agent = ta.id_agente';
$this->L2condition = 'AND tse.id_service='.$this->id;
}
public function setPropagateCounters($value) {
$this->propagateCounters = (bool)$value;
}
public function setDisplayAllGroups($value) {
$this->displayAllGroups = (bool)$value;
}
protected function getData() {
if ($this->id == -1) {
$this->getFirstLevel();
} elseif ($this->type == 'services') {
$this->getSecondLevel();
} elseif ($this->type == 'agent') {
$this->getThirdLevel();
}
}
protected function getFirstLevel() {
$processed_items = $this->getProcessedServices();
$ids = array_keys($processed_items);
$filter=array('id'=>$ids);
$own_info = get_user_info($config['id_user']);
if ($own_info['is_admin'] || check_acl($config['id_user'], 0, 'PM')) {
$display_all_services = true;
} else {
$display_all_services = false;
}
$this->tree = [];
$services = services_get_services($filter, false, $display_all_services);
foreach ($services as $row) {
$status = services_get_status($row, true);
switch ($status) {
case SERVICE_STATUS_NORMAL:
$processed_items[$row['id']]['statusImageHTML']='<img src="http://localhost/pandora_console/images/status_sets/default/agent_ok_ball.png" data-title="NORMAL status." data-use_title_for_force_title="1" class="forced_title" alt="NORMAL status." />';
break;
case SERVICE_STATUS_CRITICAL:
$processed_items[$row['id']]['statusImageHTML']='<img src="http://localhost/pandora_console/images/status_sets/default/agent_critical_ball.png" data-title="CRITICAL status." data-use_title_for_force_title="1" class="forced_title" alt="CRITICAL status." />';
break;
case SERVICE_STATUS_WARNING:
$processed_items[$row['id']][$key]['statusImageHTML']='<img src="http://localhost/pandora_console/images/status_sets/default/agent_warning_ball.png" data-title="WARNING status." data-use_title_for_force_title="1" class="forced_title" alt="WARNING status." />';
break;
case SERVICE_STATUS_UNKNOWN:
default:
$processed_items[$row['id']]['statusImageHTML']='<img src="http://localhost/pandora_console/images/status_sets/default/agent_no_data_ball.png" data-title="UNKNOWN status." data-use_title_for_force_title="1" class="forced_title" alt="UNKNOWN status." />';
break;
}
}
$this->tree = $processed_items;
}
protected function getProcessedServices () {
$fields = $this->getFirstLevelFields();
//hd($this->userGroupsArray, true);
if (users_can_manage_group_all("AR")){
$groups_acl = "";
}
else{
$groups_acl = "AND ts.id_group IN (".implode(',', $this->userGroupsArray).")";
}
$sql = sprintf("SELECT t1.*
FROM tservice_element tss
RIGHT JOIN
(SELECT ts.id, ts.id_agent_module, ts.name, ts.name AS `alias`, ts.id AS `rootID`,
'services' AS rootType, 'services' AS type,
0 AS quiet,
SUM(if((tse.id_agent<>0), 1, 0)) AS `total_agents`,
SUM(if((tse.id_agente_modulo<>0), 1, 0)) AS `total_modules`,
SUM(if((tse.id_service_child<>0), 1, 0)) AS `total_services`
FROM tservice ts
LEFT JOIN tservice_element tse
ON ts.id=tse.id_service
GROUP BY id
) as t1
ON tss.id_service_child = t1.id
WHERE tss.id_service_child IS NULL
%s
",
$groups_acl
);
$stats = db_get_all_rows_sql($sql);
$services = array();
foreach ($stats as $service) {
$services[$service['id']] = $this->getProcessedItem($services[$service['id']]);
if ($service['total_services']+$service['total_agents']+$service['total_modules'] > 0)
$services[$service['id']]['searchChildren'] = 1;
else
$services[$service['id']]['searchChildren'] = 0;
$services[$service['id']]['counters'] = array('total_services'=>$service['total_services'], 'total_agents'=>$service['total_agents'], 'total_modules'=>$service['total_modules']);
$services[$service['id']]['name'] = $service['name'];
$services[$service['id']]['id'] = $service['id'];
$services[$service['id']]['serviceDetail']='http://localhost/pandora_console/index.php?sec=network&sec2=enterprise/operation/services/services&tab=service_map&id_service='.(int)$service['id'];
}
hd("STATS:::::::::::::::::::::::::::::: ", true);
hd($services, true);
return $services;
}
protected function getFirstLevelFields() {
$fields = array();
return implode(",", array_merge($fields, $this->L1extraFields));
}
protected function getSecondLevel() {
$data = array();
$data_agents = array();
$data_modules = array();
$data_services = array();
$sql = $this->getSecondLevelSql();
$data_agents = db_process_sql($sql);
if (empty($data_agents))
$data_agents = array();
$this->processAgents($data_agents);
foreach ($data_agents as $key => $agent) {
$data_agents[$key]['showEventsBtn'] = 1;
$data_agents[$key]['eventAgent'] = $agent['id'];
}
$sql = $this->getSecondLevelModulesSql();
$data_modules = db_process_sql($sql);
if (empty($data_modules))
$data_modules = array();
else {
foreach ($data_modules as $key => $module) {
switch ($module['estado']) {
case '0':
$data_modules[$key]['statusImageHTML'] = '<img src="http://localhost/pandora_console/images/status_sets/default/agent_ok_ball.png" data-title="NORMAL status." data-use_title_for_force_title="1" class="forced_title" alt="NORMAL status." />';
break;
case '1':
$data_modules[$key]['statusImageHTML'] = '<img src="http://localhost/pandora_console/images/status_sets/default/agent_critical_ball.png" data-title="NORMAL status." data-use_title_for_force_title="1" class="forced_title" alt="CRITICAL status." />';
break;
case '2':
$data_modules[$key]['statusImageHTML'] = '<img src="http://localhost/pandora_console/images/status_sets/default/agent_warning_ball.png" data-title="NORMAL status." data-use_title_for_force_title="1" class="forced_title" alt="WARNING status." />';
break;
case '4':
$data_modules[$key]['statusImageHTML'] = '<img src="http://localhost/pandora_console/images/status_sets/default/agent_no_data_ball.png" data-title="NORMAL status." data-use_title_for_force_title="1" class="forced_title" alt="UNKNOWN status." />';
break;
default:
# code...
break;
}
$data_modules[$key]['showEventsBtn'] = 1;
$data_modules[$key]['eventModule'] = $module['id_agente_modulo'];
}
}
hd("MODULESSSS::", true);
hd($data_modules, true);
$sql = $this->getSecondLevelServicesSql();
$data_services = db_process_sql($sql);
$service_stats = array();
foreach ($data_services as $service) {
$service_stats[$service['id']]['id'] = (int)$service['id'];
$service_stats[$service['id']]['name'] = $service['name'];
$service_stats[$service['id']]['alias'] = $service['name'];
if ($service['total_services']+$service['total_agents']+$service['total_modules'] > 0)
$service_stats[$service['id']]['searchChildren'] = 1;
else
$services[$service['id']]['searchChildren'] = 0;
$service_stats[$service['id']]['rootID'] = $service['rootID'];
$service_stats[$service['id']]['rootType'] = $service['rootType'];
$service_stats[$service['id']]['type'] = 'services';
$service_stats[$service['id']]['children']=array();
$service_stats[$service['id']]['serviceDetail']='http://localhost/pandora_console/index.php?sec=network&sec2=enterprise/operation/services/services&tab=service_map&id_service='.(int)$service['id'];
$service_stats[$service['id']]['counters']=array('total_services'=>$service['total_services'], 'total_agents'=>$service['total_agents'], 'total_modules'=>$service['total_modules']);
}
$own_info = get_user_info($config['id_user']);
if ($own_info['is_admin'] || check_acl($config['id_user'], 0, 'PM')) {
$display_all_services = true;
} else {
$display_all_services = false;
}
$services = services_get_services($filter, false, $display_all_services);
foreach ($services as $row) {
if (!array_key_exists($row['id'], $service_stats))
continue;
$status = services_get_status($row, true);
switch ($status) {
case SERVICE_STATUS_NORMAL:
$service_stats[$row['id']]['statusImageHTML']='<img src="http://localhost/pandora_console/images/status_sets/default/agent_ok_ball.png" data-title="NORMAL status." data-use_title_for_force_title="1" class="forced_title" alt="NORMAL status." />';
break;
case SERVICE_STATUS_CRITICAL:
$service_stats[$row['id']]['statusImageHTML']='<img src="http://localhost/pandora_console/images/status_sets/default/agent_critical_ball.png" data-title="CRITICAL status." data-use_title_for_force_title="1" class="forced_title" alt="CRITICAL status." />';
break;
case SERVICE_STATUS_WARNING:
$service_stats[$row['id']][$key]['statusImageHTML']='<img src="http://localhost/pandora_console/images/status_sets/default/agent_warning_ball.png" data-title="WARNING status." data-use_title_for_force_title="1" class="forced_title" alt="WARNING status." />';
break;
case SERVICE_STATUS_UNKNOWN:
default:
$service_stats[$row['id']]['statusImageHTML']='<img src="http://localhost/pandora_console/images/status_sets/default/agent_no_data_ball.png" data-title="UNKNOWN status." data-use_title_for_force_title="1" class="forced_title" alt="UNKNOWN status." />';
break;
}
}
$data_services = array_values($service_stats);
$data = array_merge($data_services, $data_agents, $data_modules);
if (empty($data)) {
$this->tree = array();
return;
}
$this->tree = $data;
}
protected function getSecondLevelServicesSql() {
$group_acl = $this->getGroupAclCondition();
$sql = "SELECT ts.id, ts.name, tse1.id_service AS `rootID`, 'services' AS rootType, 'services' AS type, 0 AS quiet, SUM(if((tse2.id_agent<>0), 1, 0)) AS `total_agents`, SUM(if((tse2.id_agente_modulo<>0), 1, 0)) AS `total_modules`, SUM(if((tse2.id_service_child<>0), 1, 0)) AS `total_services`, 0 AS fired_count, 0 AS normal_count, 0 AS warning_count, 0 AS critical_count, 0 AS unknown_count, 0 AS notinit_count, 0 AS state_critical, 0 AS state_warning, 0 AS state_unknown, 0 AS state_notinit, 0 AS state_normal, 0 AS state_total, '' AS statusImageHTML, '' AS alertImageHTML
FROM tservice_element tse1
LEFT JOIN tservice_element tse2 ON tse1.id_service_child=tse2.id_service
LEFT JOIN tservice ts ON tse1.id_service_child=ts.id
WHERE tse1.id_service=$this->id AND tse1.id_service_child<>0
GROUP BY tse1.id_service_child
";
return $sql;
}
protected function getSecondLevelModulesSql() {
$sql = "SELECT tse.id_agente_modulo, nombre AS `name`, nombre AS `alias`, tse.id_service AS `rootID`, 'services' AS `rootType`, 'modules' AS `type`, estado
FROM tservice_element tse
INNER JOIN tagente_modulo tam ON tse.id_agente_modulo=tam.id_agente_modulo
INNER JOIN tagente_estado tae ON tam.id_agente_modulo=tae.id_agente_estado
WHERE tse.id_service=$this->id AND tse.id_agente_modulo<>0
";
return $sql;
}
protected function getAgentStatusFilter ($status = self::TV_DEFAULT_AGENT_STATUS) {
return '';
}
}
?>

File diff suppressed because it is too large Load Diff

View File

@ -21,8 +21,8 @@ Description: The default Pandora FMS theme layout
*/
/* Tree view styles */
/*@import url(tree.css);
@import url(fixed-bottom-box.css);*/
@import url(tree.css);
@import url(fixed-bottom-box.css);
/*
* ---------------------------------------------------------------------

View File

@ -314,6 +314,7 @@ if ($id_agent != 0) {
$text_module = (string) get_parameter('module_search', '');
$id_agent_module = get_parameter('module_search_hidden', get_parameter('id_agent_module', 0));
hd("------------------------------------>>>>>>> ".$id_agent_module." y id_agent: ".$id_agent, true);
if ($id_agent_module != 0) {
$text_module = db_get_value('nombre', 'tagente_modulo', 'id_agente_modulo', $id_agent_module);
if ($text_module == false) {

View File

@ -278,226 +278,228 @@ enterprise_hook('close_meta_frame');
<?php } ?>
<script type="text/javascript">
var treeController = TreeController.getController();
processTreeSearch();
$("form#tree_search").submit(function(e) {
e.preventDefault();
processTreeSearch();
});
function processTreeSearch () {
// Clear the tree
if (typeof treeController.recipient != 'undefined' && treeController.recipient.length > 0)
treeController.recipient.empty();
$(".loading_tree").show();
var parameters = {};
parameters['page'] = "include/ajax/tree.ajax";
parameters['getChildren'] = 1;
parameters['type'] = "<?php echo $tab; ?>";
parameters['filter'] = {};
parameters['filter']['searchGroup'] = $("input#text-search_group").val();
parameters['filter']['searchAgent'] = $("input#text-search_agent").val();
parameters['filter']['statusAgent'] = $("select#status_agent").val();
parameters['filter']['searchModule'] = $("input#text-search_module").val();
parameters['filter']['statusModule'] = $("select#status_module").val();
parameters['filter']['groupID'] = $("input#hidden-group-id").val();
parameters['filter']['tagID'] = $("input#hidden-tag-id").val();
if($("#checkbox-serach_hirearchy").is(':checked')){
parameters['filter']['searchHirearchy'] = 1;
}
else{
parameters['filter']['searchHirearchy'] = 0;
}
if($("#checkbox-show_not_init_agents").is(':checked')){
parameters['filter']['show_not_init_agents'] = 1;
}
else{
parameters['filter']['show_not_init_agents'] = 0;
}
if($("#checkbox-show_not_init_modules").is(':checked')){
parameters['filter']['show_not_init_modules'] = 1;
$('#hidden-show_not_init_modules_hidden').val(1);
}
else{
parameters['filter']['show_not_init_modules'] = 0;
$('#hidden-show_not_init_modules_hidden').val(0);
}
var treeController = TreeController.getController();
processTreeSearch();
$("form#tree_search").submit(function(e) {
e.preventDefault();
processTreeSearch();
});
function processTreeSearch () {
// Clear the tree
if (typeof treeController.recipient != 'undefined' && treeController.recipient.length > 0)
treeController.recipient.empty();
$(".loading_tree").show();
$.ajax({
type: "POST",
url: "<?php echo ui_get_full_url('ajax.php', false, false, false); ?>",
data: parameters,
success: function(data) {
if (data.success) {
$(".loading_tree").hide();
treeController.init({
recipient: $("div#tree-controller-recipient"),
detailRecipient: $.fixedBottomBox({ width: 400, height: window.innerHeight * 0.9 }),
page: parameters['page'],
emptyMessage: "<?php echo __('No data found'); ?>",
foundMessage: "<?php echo __('Found groups'); ?>",
tree: data.tree,
baseURL: "<?php echo ui_get_full_url(false, false, false, is_metaconsole()); ?>",
ajaxURL: "<?php echo ui_get_full_url('ajax.php', false, false, false); ?>",
filter: parameters['filter'],
counterTitles: {
total: {
agents: "<?php echo __('Total agents'); ?>",
modules: "<?php echo __('Total modules'); ?>",
none: "<?php echo __('Total'); ?>"
},
alerts: {
agents: "<?php echo __('Fired alerts'); ?>",
modules: "<?php echo __('Fired alerts'); ?>",
none: "<?php echo __('Fired alerts'); ?>"
},
critical: {
agents: "<?php echo __('Critical agents'); ?>",
modules: "<?php echo __('Critical modules'); ?>",
none: "<?php echo __('Critical'); ?>"
},
warning: {
agents: "<?php echo __('Warning agents'); ?>",
modules: "<?php echo __('Warning modules'); ?>",
none: "<?php echo __('Warning'); ?>"
},
unknown: {
agents: "<?php echo __('Unknown agents'); ?>",
modules: "<?php echo __('Unknown modules'); ?>",
none: "<?php echo __('Unknown'); ?>"
},
not_init: {
agents: "<?php echo __('Not init agents'); ?>",
modules: "<?php echo __('Not init modules'); ?>",
none: "<?php echo __('Not init'); ?>"
},
ok: {
agents: "<?php echo __('Normal agents'); ?>",
modules: "<?php echo __('Normal modules'); ?>",
none: "<?php echo __('Normal'); ?>"
}
}
});
}
},
dataType: "json"
});
}
// Show the modal window of an module
var moduleDetailsWindow = $("<div></div>");
moduleDetailsWindow
.hide()
.prop("id", "module_details_window")
.appendTo('body');
function show_module_detail_dialog(module_id, id_agent, server_name, offset, period, module_name) {
var params = {};
var f = new Date();
period = $('#period').val();
params.selection_mode = $('input[name=selection_mode]:checked').val();
if (!params.selection_mode) {
params.selection_mode='fromnow';
}
params.date_from = $('#text-date_from').val();
if (!params.date_from) {
params.date_from = f.getFullYear() + "/" + (f.getMonth() +1) + "/" + f.getDate();
}
params.time_from = $('#text-time_from').val();
if (!params.time_from) {
params.time_from = f.getHours() + ":" + f.getMinutes();
}
params.date_to = $('#text-date_to').val();
if (!params.date_to) {
params.date_to =f.getFullYear() + "/" + (f.getMonth() +1) + "/" + f.getDate();
}
params.time_to = $('#text-time_to').val();
if (!params.time_to) {
params.time_to = f.getHours() + ":" + f.getMinutes();
}
params.page = "include/ajax/module";
params.get_module_detail = 1;
params.server_name = server_name;
params.id_agent = id_agent;
params.id_module = module_id;
params.offset = offset;
params.period = period;
title = <?php echo "'".__('Module: ')."'"; ?> ;
$.ajax({
type: "POST",
url: "<?php echo ui_get_full_url('ajax.php', false, false, false); ?>",
data: params,
dataType: "html",
success: function(data) {
$("#module_details_window").hide ()
.empty ()
.append (data)
.dialog ({
resizable: true,
draggable: true,
modal: true,
title: title + module_name,
overlay: {
opacity: 0.5,
background: "black"
},
width: 650,
height: 500
})
.show ();
refresh_pagination_callback(module_id, id_agent, server_name, module_name);
datetime_picker_callback();
forced_title_callback();
}
});
}
function datetime_picker_callback() {
$("#text-time_from, #text-time_to").timepicker({
showSecond: true,
timeFormat: '<?php echo TIME_FORMAT_JS; ?>',
timeOnlyTitle: '<?php echo __('Choose time'); ?>',
timeText: '<?php echo __('Time'); ?>',
hourText: '<?php echo __('Hour'); ?>',
minuteText: '<?php echo __('Minute'); ?>',
secondText: '<?php echo __('Second'); ?>',
currentText: '<?php echo __('Now'); ?>',
closeText: '<?php echo __('Close'); ?>'});
$.datepicker.setDefaults($.datepicker.regional[ "<?php echo get_user_language(); ?>"]);
$("#text-date_from, #text-date_to").datepicker({dateFormat: "<?php echo DATE_FORMAT_JS; ?>"});
}
function refresh_pagination_callback (module_id, id_agent, server_name,module_name) {
$(".binary_dialog").click( function() {
var classes = $(this).attr('class');
classes = classes.split(' ');
var offset_class = classes[2];
offset_class = offset_class.split('_');
var offset = offset_class[1];
var period = $('#period').val();
show_module_detail_dialog(module_id, id_agent, server_name, offset, period,module_name);
return false;
});
}
var parameters = {};
parameters['page'] = "include/ajax/tree.ajax";
parameters['getChildren'] = 1;
parameters['type'] = "<?php echo $tab; ?>";
parameters['filter'] = {};
parameters['filter']['searchGroup'] = $("input#text-search_group").val();
parameters['filter']['searchAgent'] = $("input#text-search_agent").val();
parameters['filter']['statusAgent'] = $("select#status_agent").val();
parameters['filter']['searchModule'] = $("input#text-search_module").val();
parameters['filter']['statusModule'] = $("select#status_module").val();
parameters['filter']['groupID'] = $("input#hidden-group-id").val();
parameters['filter']['tagID'] = $("input#hidden-tag-id").val();
if($("#checkbox-serach_hirearchy").is(':checked')){
parameters['filter']['searchHirearchy'] = 1;
}
else{
parameters['filter']['searchHirearchy'] = 0;
}
if($("#checkbox-show_not_init_agents").is(':checked')){
parameters['filter']['show_not_init_agents'] = 1;
}
else{
parameters['filter']['show_not_init_agents'] = 0;
}
if($("#checkbox-show_not_init_modules").is(':checked')){
parameters['filter']['show_not_init_modules'] = 1;
$('#hidden-show_not_init_modules_hidden').val(1);
}
else{
parameters['filter']['show_not_init_modules'] = 0;
$('#hidden-show_not_init_modules_hidden').val(0);
}
$.ajax({
type: "POST",
url: "<?php echo ui_get_full_url('ajax.php', false, false, false); ?>",
data: parameters,
success: function(data) {
if (data.success) {
$(".loading_tree").hide();
treeController.init({
recipient: $("div#tree-controller-recipient"),
detailRecipient: $.fixedBottomBox({ width: 400, height: window.innerHeight * 0.9 }),
page: parameters['page'],
emptyMessage: "<?php echo __('No data found'); ?>",
foundMessage: "<?php echo __('Found groups'); ?>",
tree: data.tree,
baseURL: "<?php echo ui_get_full_url(false, false, false, is_metaconsole()); ?>",
ajaxURL: "<?php echo ui_get_full_url('ajax.php', false, false, false); ?>",
filter: parameters['filter'],
counterTitles: {
total: {
agents: "<?php echo __('Total agents'); ?>",
modules: "<?php echo __('Total modules'); ?>",
none: "<?php echo __('Total'); ?>"
},
alerts: {
agents: "<?php echo __('Fired alerts'); ?>",
modules: "<?php echo __('Fired alerts'); ?>",
none: "<?php echo __('Fired alerts'); ?>"
},
critical: {
agents: "<?php echo __('Critical agents'); ?>",
modules: "<?php echo __('Critical modules'); ?>",
none: "<?php echo __('Critical'); ?>"
},
warning: {
agents: "<?php echo __('Warning agents'); ?>",
modules: "<?php echo __('Warning modules'); ?>",
none: "<?php echo __('Warning'); ?>"
},
unknown: {
agents: "<?php echo __('Unknown agents'); ?>",
modules: "<?php echo __('Unknown modules'); ?>",
none: "<?php echo __('Unknown'); ?>"
},
not_init: {
agents: "<?php echo __('Not init agents'); ?>",
modules: "<?php echo __('Not init modules'); ?>",
none: "<?php echo __('Not init'); ?>"
},
ok: {
agents: "<?php echo __('Normal agents'); ?>",
modules: "<?php echo __('Normal modules'); ?>",
none: "<?php echo __('Normal'); ?>"
}
}
});
}
},
dataType: "json"
});
}
// Show the modal window of an module
var moduleDetailsWindow = $("<div></div>");
moduleDetailsWindow
.hide()
.prop("id", "module_details_window")
.appendTo('body');
function show_module_detail_dialog(module_id, id_agent, server_name, offset, period, module_name) {
var params = {};
var f = new Date();
period = $('#period').val();
params.selection_mode = $('input[name=selection_mode]:checked').val();
if (!params.selection_mode) {
params.selection_mode='fromnow';
}
params.date_from = $('#text-date_from').val();
if (!params.date_from) {
params.date_from = f.getFullYear() + "/" + (f.getMonth() +1) + "/" + f.getDate();
}
params.time_from = $('#text-time_from').val();
if (!params.time_from) {
params.time_from = f.getHours() + ":" + f.getMinutes();
}
params.date_to = $('#text-date_to').val();
if (!params.date_to) {
params.date_to =f.getFullYear() + "/" + (f.getMonth() +1) + "/" + f.getDate();
}
params.time_to = $('#text-time_to').val();
if (!params.time_to) {
params.time_to = f.getHours() + ":" + f.getMinutes();
}
params.page = "include/ajax/module";
params.get_module_detail = 1;
params.server_name = server_name;
params.id_agent = id_agent;
params.id_module = module_id;
params.offset = offset;
params.period = period;
title = <?php echo "'" . __("Module: ") . "'" ?> ;
$.ajax({
type: "POST",
url: "<?php echo ui_get_full_url('ajax.php', false, false, false); ?>",
data: params,
dataType: "html",
success: function(data) {
$("#module_details_window").hide ()
.empty ()
.append (data)
.dialog ({
resizable: true,
draggable: true,
modal: true,
title: title + module_name,
overlay: {
opacity: 0.5,
background: "black"
},
width: 650,
height: 500
})
.show ();
refresh_pagination_callback(module_id, id_agent, server_name, module_name);
datetime_picker_callback();
forced_title_callback();
}
});
}
function datetime_picker_callback() {
$("#text-time_from, #text-time_to").timepicker({
showSecond: true,
timeFormat: '<?php echo TIME_FORMAT_JS; ?>',
timeOnlyTitle: '<?php echo __('Choose time');?>',
timeText: '<?php echo __('Time');?>',
hourText: '<?php echo __('Hour');?>',
minuteText: '<?php echo __('Minute');?>',
secondText: '<?php echo __('Second');?>',
currentText: '<?php echo __('Now');?>',
closeText: '<?php echo __('Close');?>'});
$.datepicker.setDefaults($.datepicker.regional[ "<?php echo get_user_language(); ?>"]);
$("#text-date_from, #text-date_to").datepicker({dateFormat: "<?php echo DATE_FORMAT_JS; ?>"});
}
function refresh_pagination_callback (module_id, id_agent, server_name,module_name) {
$(".binary_dialog").click( function() {
var classes = $(this).attr('class');
classes = classes.split(' ');
var offset_class = classes[2];
offset_class = offset_class.split('_');
var offset = offset_class[1];
var period = $('#period').val();
show_module_detail_dialog(module_id, id_agent, server_name, offset, period,module_name);
return false;
});
}
</script>