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,18 +3,21 @@
// ==================================================
// 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()) {
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);
@ -25,29 +28,27 @@ if (is_ajax()) {
} else {
$validate_hash = enterprise_hook(
'dasboard_validate_public_hash',
[
$public_hash,
'tree_view',
]
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');
include 'general/noaccess.php';
db_pandora_audit("Invalid public hash", "Trying to access report builder");
require ("general/noaccess.php");
exit;
}
}
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';
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);
@ -62,64 +63,55 @@ if (is_ajax()) {
$childrenMethod = get_parameter('childrenMethod', 'on_demand');
$hash = get_parameter('hash', false);
if ($hash !== false) {
enterprise_hook('dasboard_validate_public_hash', [$hash, 'tree_view']);
enterprise_hook('dasboard_validate_public_hash', array($hash, 'tree_view'));
}
$default_filters = [
$default_filters = array(
'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');
$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;
}
if(is_metaconsole()){
if (!class_exists('TreeGroupMeta')) break;
$tree = new TreeGroupMeta($type, $rootType, $id, $rootID, $serverID, $childrenMethod, $access);
} else {
}
else{
$tree = new TreeGroup($type, $rootType, $id, $rootID, $serverID, $childrenMethod, $access);
}
break;
case 'policies':
if (!class_exists('TreePolicies')) {
break;
}
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;
@ -127,17 +119,18 @@ if (is_ajax()) {
$tree->setFilter($filter);
ob_clean();
echo json_encode(['success' => 1, 'tree' => $tree->getArray()]);
echo json_encode(array('success' => 1, 'tree' => $tree->getArray()));
return;
}
if ($getDetail) {
include_once $config['homedir'].'/include/functions_treeview.php';
require_once($config['homedir']."/include/functions_treeview.php");
$id = (int) get_parameter('id');
$type = (string) get_parameter('type');
$server = [];
$server = array();
if (is_metaconsole()) {
$server_id = (int) get_parameter('serverID');
$server = metaconsole_get_servers($server_id);
@ -151,21 +144,17 @@ if (is_ajax()) {
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;
@ -173,3 +162,4 @@ if (is_ajax()) {
return;
}
?>

File diff suppressed because it is too large Load Diff

View File

@ -1,213 +1,191 @@
<?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 $displayAllGroups = false;
public function __construct($type, $rootType = '', $id = -1, $rootID = -1, $serverID = false, $childrenMethod = "on_demand", $access = 'AR') {
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 = [
'tg.nombre AS `name`',
'tg.icon',
'tg.id_grupo AS gid',
];
$this->L1fieldName = "id_group";
$this->L1extraFields = array(
"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 setPropagateCounters($value) {
$this->propagateCounters = (bool)$value;
}
public function setDisplayAllGroups($value)
{
$this->displayAllGroups = (bool) $value;
public function setDisplayAllGroups($value) {
$this->displayAllGroups = (bool)$value;
}
protected function getData()
{
protected function getData() {
if ($this->id == -1) {
$this->getFirstLevel();
} else if ($this->type == 'group') {
} elseif ($this->type == 'group') {
$this->getSecondLevel();
} else if ($this->type == 'agent') {
} elseif ($this->type == 'agent') {
$this->getThirdLevel();
}
}
protected function getGroupSearchFilter()
{
return '';
protected function getGroupSearchFilter() {
return "";
}
protected function getFirstLevel()
{
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', ['nombre' => '%'.$this->filter['searchGroup'].'%']);
if ($groups == false) {
$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) {
$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];
}
return $userGroups;
},
[]
);
}, array());
$result = self::extractGroupsWithIDs($processed_items, $ids_hash);
$processed_items = ($result === false) ? [] : $result;
$processed_items = ($result === false) ? array() : $result;
}
// 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);
$result = self::extractItemWithID($processed_items, $this->filter['groupID'], "group", $this->strictACL);
$processed_items = ($result === false) ? [] : [$result];
$processed_items = ($result === false) ? array() : array($result);
}
}
hd("G-GETFIRSTLEVELGETFIRSTLEVELGETFIRSTLEVELGETFIRSTLEVELGETFIRSTLEVELGETFIRSTLEVELGETFIRSTLEVELGETFIRSTLEVEL", true);
hd($processed_items, true);
$this->tree = $processed_items;
}
protected function getProcessedGroups()
{
$processed_groups = [];
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')) {
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'] = [];
$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'], ['Tree', 'cmpSortNames']);
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) {
//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);
TreeGroup::processCounters($groups);
// Filter groups and eliminates the reference to empty groups
$groups = $this->deleteEmptyGroups($groups);
} else {
$groups = $this->deleteEmptyGroupsNotPropagate($groups);
}
usort($groups, ['Tree', 'cmpSortNames']);
usort($groups, array("Tree", "cmpSortNames"));
return $groups;
}
protected function getGroupCounters()
{
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 = "";
$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_search_filter = preg_replace("/%/", "%%", $agent_search_filter);
$agent_status_filter = $this->getAgentStatusFilter();
$module_status_filter = $this->getModuleStatusFilter();
$module_search_inner = '';
$module_search_filter = '';
$module_search_inner = "";
$module_search_filter = "";
if (!empty($this->filter['searchModule'])) {
$module_search_inner = '
$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';
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();
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
(
@ -236,7 +214,7 @@ class TreeGroup extends Tree
$secondary_group_acl
GROUP BY id_group
) x GROUP BY g";
$sql_array = [];
$sql_array = array();
foreach ($inside_fields as $inside_field) {
$sql_array[] = sprintf(
$sql_model,
@ -245,46 +223,48 @@ class TreeGroup extends Tree
$inside_field['condition']
);
}
$sql = "SELECT $fields FROM (".implode(' UNION ALL ', $sql_array).') x2
$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';
GROUP BY tg.id_grupo";
$stats = db_get_all_rows_sql($sql);
$group_stats = [];
$group_stats = array();
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']]['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']]);
}
return $group_stats;
}
protected function getFirstLevelFields()
{
protected function getFirstLevelFields() {
$fields = parent::getFirstLevelFields();
$parent = $this->getDisplayHierarchy() ? 'tg.parent' : '0 as parent';
return "$fields, $parent";
}
protected function getProcessedModules($modules_tree) {
protected function getProcessedModules($modules_tree)
{
$groups = [];
$groups = array();
foreach ($modules_tree as $group) {
$groups[$group['id']] = $group;
$groups[$group["id"]] = $group;
}
// Build the module hierarchy
@ -293,9 +273,8 @@ class TreeGroup extends Tree
$parent = $groups[$id]['parent'];
// Parent exists
if (!isset($groups[$parent]['children'])) {
$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
@ -306,94 +285,75 @@ class TreeGroup extends Tree
// Sort the children groups
foreach ($groups as $id => $group) {
if (isset($groups[$id]['children'])) {
usort($groups[$id]['children'], ['Tree', 'cmpSortNames']);
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) {
//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);
}
// 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));
}
);
protected function getProcessedModules_old($modules_tree) {
$new_modules_child = array_filter(
$modules_tree,
function ($module) {
$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));
}
);
});
$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);
TreeGroup::recursive_modules_tree_view($new_modules_root, $new_modules_child, $i, $child);
}
}
foreach ($new_modules_root as $m) {
$tree_modules[] = $m;
}
return $tree_modules;
}
// FIXME with getProcessedModules_old
static function recursive_modules_tree_view(&$new_modules, &$new_modules_child, $i, $child)
{
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);
}
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 = [];
static function processCounters(&$groups) {
$all_counters = array();
foreach ($groups as $id => $group) {
$child_counters = [];
$child_counters = array();
if (!empty($groups[$id]['children'])) {
$child_counters = self::processCounters($groups[$id]['children']);
$child_counters = TreeGroup::processCounters($groups[$id]['children']);
}
if (!empty($child_counters)) {
foreach ($child_counters as $type => $value) {
foreach($child_counters as $type => $value) {
$groups[$id]['counters'][$type] += $value;
}
}
foreach ($groups[$id]['counters'] as $type => $value) {
foreach($groups[$id]['counters'] as $type => $value) {
$all_counters[$type] += $value;
}
}
return $all_counters;
}
/**
* @brief Recursive function to remove the empty groups
*
@ -401,47 +361,32 @@ class TreeGroup extends Tree
*
* @return new_groups A new groups structure without empty groups
*/
protected function deleteEmptyGroups($groups)
{
if ($this->displayAllGroups) {
return $groups;
}
$new_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;
$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 = [];
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']);
$children = $this->deleteEmptyGroupsNotPropagate ($group['children']);
if (empty($children)) {
unset($group['children']);
// If a group is empty, do not add to new_groups.
@ -459,18 +404,16 @@ class TreeGroup extends Tree
}
}
}
return $new_groups;
}
private static function extractGroupsWithIDs($groups, $ids_hash)
{
$result_groups = [];
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'])) {
}
else if (!empty($group['children'])) {
$result = self::extractGroupsWithIDs($group['children'], $ids_hash);
// Item found on children
@ -483,47 +426,42 @@ class TreeGroup extends Tree
return $result_groups;
}
private static function extractItemWithID($items, $item_id, $item_type='group', $strictACL=false)
{
private static function extractItemWithID ($items, $item_id, $item_type = "group", $strictACL = false) {
foreach ($items as $item) {
if ($item['type'] != $item_type) {
if ($item["type"] != $item_type)
continue;
}
// Item found
if ($strictACL && is_metaconsole()) {
foreach ($item['id'] as $server_id => $id) {
if ($id == $item_id) {
foreach ($item["id"] as $server_id => $id) {
if ($id == $item_id)
return $item;
}
}
} else {
if ($item['id'] == $item_id) {
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);
if ($item["type"] == "group" && !empty($item["children"])) {
$result = self::extractItemWithID($item["children"], $item_id, $item_type, $strictACL);
// Item found on children
if ($result !== false) {
if ($result !== false)
return $result;
}
}
}
// Item not found
return false;
}
protected function getDisplayHierarchy()
{
protected function getDisplayHierarchy() {
return $this->filter['searchHirearchy'] ||
(empty($this->filter['searchAgent']) && empty($this->filter['searchModule']));
}
}
?>

View File

@ -1,64 +1,56 @@
<?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
{
public function __construct($type, $rootType='', $id=-1, $rootID=-1, $serverID=false, $childrenMethod='on_demand', $access='AR')
{
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()
{
protected function getData() {
if ($this->id == -1) {
$this->getFirstLevel();
}
}
protected function getProcessedGroups()
{
$processed_groups = [];
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')) {
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'] = [];
$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
@ -69,37 +61,32 @@ class TreeGroupEdition extends TreeGroup
// Sort the children groups
foreach ($groups as $id => $group) {
if (isset($groups[$id]['children'])) {
usort($groups[$id]['children'], ['Tree', 'cmpSortNames']);
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) {
//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']);
usort($groups, array("Tree", "cmpSortNames"));
return $groups;
}
protected function getGroupCounters()
{
$messages = [
protected function getGroupCounters() {
$messages = array(
'confirm' => __('Confirm'),
'cancel' => __('Cancel'),
'messg' => __('Are you sure?'),
];
$sql = 'SELECT id_grupo AS gid,
'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 = [];
$group_stats = array();
foreach ($stats as $group) {
$group_stats[$group['gid']]['name'] = $group['name'];
$group_stats[$group['gid']]['parent'] = $group['parent'];
@ -115,6 +102,7 @@ class TreeGroupEdition extends TreeGroup
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

@ -294,6 +294,8 @@ enterprise_hook('close_meta_frame');
$(".loading_tree").show();
var parameters = {};
parameters['page'] = "include/ajax/tree.ajax";
parameters['getChildren'] = 1;
@ -436,7 +438,7 @@ enterprise_hook('close_meta_frame');
params.id_module = module_id;
params.offset = offset;
params.period = period;
title = <?php echo "'".__('Module: ')."'"; ?> ;
title = <?php echo "'" . __("Module: ") . "'" ?> ;
$.ajax({
type: "POST",
url: "<?php echo ui_get_full_url('ajax.php', false, false, false); ?>",
@ -470,13 +472,13 @@ enterprise_hook('close_meta_frame');
$("#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'); ?>'});
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; ?>"});