fixed error tree groups agent edition metaconsole

This commit is contained in:
Daniel Barbero Martin 2021-03-15 13:31:24 +01:00
parent 971f86601a
commit b78f4093ac
5 changed files with 538 additions and 199 deletions

View File

@ -39,14 +39,14 @@ require_once $config['homedir'].'/include/functions_groups.php';
require_once $config['homedir'].'/include/functions_agents.php';
require_once $config['homedir'].'/include/functions_users.php';
if (is_metaconsole()) {
if (is_metaconsole() === true) {
enterprise_include_once('include/functions_metaconsole.php');
enterprise_include_once('meta/include/functions_agents_meta.php');
enterprise_hook('open_meta_frame');
}
if (is_ajax()) {
if (! check_acl($config['id_user'], 0, 'AR')) {
if (is_ajax() === true) {
if (check_acl($config['id_user'], 0, 'AR') === false) {
db_pandora_audit('ACL Violation', 'Trying to access Group Management');
include 'general/noaccess.php';
return;
@ -56,10 +56,10 @@ if (is_ajax()) {
$get_group_agents = (bool) get_parameter('get_group_agents');
$get_is_disabled = (bool) get_parameter('get_is_disabled');
if ($get_group_json) {
if ($get_group_json === true) {
$id_group = (int) get_parameter('id_group');
if ($id_group == 0) {
if ($id_group === 0) {
$group = [
'id_grupo' => 0,
'nombre' => 'All',
@ -72,7 +72,7 @@ if (is_ajax()) {
return;
}
if (! check_acl($config['id_user'], $id_group, 'AR')) {
if (check_acl($config['id_user'], $id_group, 'AR') === false) {
db_pandora_audit(
'ACL Violation',
'Trying to access Alert Management'
@ -87,7 +87,7 @@ if (is_ajax()) {
return;
}
if ($get_group_agents) {
if ($get_group_agents === true) {
ob_clean();
$id_group = (int) get_parameter('id_group');
$disabled = (int) get_parameter('disabled', 0);
@ -108,10 +108,13 @@ if (is_ajax()) {
// (by default and for compatibility show void agents).
$show_void_agents = (int) get_parameter('show_void_agents', 1);
$serialized = (bool) get_parameter('serialized', false);
$serialized_separator = (string) get_parameter('serialized_separator', '|');
$serialized_separator = (string) get_parameter(
'serialized_separator',
'|'
);
$force_serialized = (bool) get_parameter('force_serialized', false);
if (! check_acl($config['id_user'], $id_group, 'AR')) {
if (check_acl($config['id_user'], $id_group, 'AR') === false) {
db_pandora_audit(
'ACL Violation',
'Trying to access Alert Management'
@ -120,12 +123,15 @@ if (is_ajax()) {
return;
}
if (https_is_running()) {
if (https_is_running() === true) {
header('Content-type: application/json');
}
if ($filter_agents_json != '') {
$filter['id_agente'] = json_decode(io_safe_output($filter_agents_json), true);
$filter['id_agente'] = json_decode(
io_safe_output($filter_agents_json),
true
);
}
if ($all_agents) {
@ -142,7 +148,6 @@ if (is_ajax()) {
$filter['status'] = $status_agents;
}
// Juanma (22/05/2014) Fix: If remove void agents set.
$_sql_post = ' 1=1 ';
if ($show_void_agents == 0) {
$_sql_post .= ' AND id_agente IN (SELECT a.id_agente FROM tagente a, tagente_modulo b WHERE a.id_agente=b.id_agente AND b.delete_pending=0) AND \'1\'';
@ -172,7 +177,7 @@ if (is_ajax()) {
$agents_aux = [];
foreach ($agents as $key => $value) {
if (preg_match('/'.$search.'/', io_safe_output($value))) {
if (preg_match('/'.$search.'/', io_safe_output($value)) === true) {
$agents_aux[$key] = $value;
}
}
@ -197,7 +202,10 @@ if (is_ajax()) {
'id_tmetaconsole_setup' => $agent_info[0],
]
);
} else if ($serialized && !is_metaconsole() && $force_serialized) {
} else if ($serialized
&& is_metaconsole() === false
&& $force_serialized
) {
$agent_info = explode($serialized_separator, $k);
$agent_disabled = db_get_value_filter(
'disabled',
@ -233,10 +241,14 @@ if (is_ajax()) {
return;
}
if ($get_is_disabled) {
if ($get_is_disabled === true) {
$index = get_parameter('id_agent');
$agent_disabled = db_get_value_filter('disabled', 'tagente', ['id_agente' => $index]);
$agent_disabled = db_get_value_filter(
'disabled',
'tagente',
['id_agente' => $index]
);
$return['disabled'] = $agent_disabled;
$return['id_agent'] = $index;
@ -268,8 +280,8 @@ if ($tab != 'credbox' && ! check_acl(
include 'general/noaccess.php';
return;
} else if ($tab == 'credbox'
&& !check_acl($config['id_user'], 0, 'UM')
&& !check_acl($config['id_user'], 0, 'PM')
&& check_acl($config['id_user'], 0, 'UM') === false
&& check_acl($config['id_user'], 0, 'PM') === false
) {
db_pandora_audit(
'ACL Violation',
@ -339,7 +351,7 @@ switch ($tab) {
}
// Header.
if (defined('METACONSOLE')) {
if (is_metaconsole() === true) {
agents_meta_print_header();
echo '<div class="notify">';
echo __('Edit or delete groups can cause problems with synchronization');
@ -368,7 +380,7 @@ $delete_group = (bool) get_parameter('delete_group');
$pure = get_parameter('pure', 0);
// Create group.
if (($create_group) && (check_acl($config['id_user'], 0, 'PM'))) {
if (($create_group) && (check_acl($config['id_user'], 0, 'PM') === true)) {
$name = (string) get_parameter('name');
$icon = (string) get_parameter('icon');
$id_parent = (int) get_parameter('id_parent');
@ -492,7 +504,7 @@ if ($update_group) {
}
// Delete group.
if (($delete_group) && (check_acl($config['id_user'], 0, 'PM'))) {
if (($delete_group) && (check_acl($config['id_user'], 0, 'PM') === true)) {
$id_group = (int) get_parameter('id_group');
$usedGroup = groups_check_used($id_group);
@ -508,28 +520,42 @@ if (($delete_group) && (check_acl($config['id_user'], 0, 'PM'))) {
$success_nodes = [];
$error_nodes = [];
// Check if the group can be deleted or not.
foreach ($servers as $server) {
if (metaconsole_connect($server) == NOERR) {
$result_exist_group = db_get_row_filter('tgrupo', ['nombre' => $group_name, 'id_grupo' => $id_group]);
if ($result_exist_group !== false) {
$used_group = groups_check_used($id_group);
// Save the names of the nodes that are empty and can be deleted, and those that cannot.
if (!$used_group['return']) {
$success_nodes[] .= $server['server_name'];
$success_counter++;
} else {
$error_nodes[] .= $server['server_name'];
$error_counter++;
if (isset($servers) === true
&& is_array($servers) === true
) {
foreach ($servers as $server) {
if (metaconsole_connect($server) == NOERR) {
$result_exist_group = db_get_row_filter(
'tgrupo',
[
'nombre' => $group_name,
'id_grupo' => $id_group,
]
);
if ($result_exist_group !== false) {
$used_group = groups_check_used($id_group);
// Save the names of the nodes that are empty
// and can be deleted, and those that cannot.
if (!$used_group['return']) {
$success_nodes[] .= $server['server_name'];
$success_counter++;
} else {
$error_nodes[] .= $server['server_name'];
$error_counter++;
}
}
}
}
metaconsole_restore_db();
metaconsole_restore_db();
}
}
if ($error_counter > 0) {
ui_print_error_message(
__('The group %s could not be deleted because it is not empty in the nodes', $group_name).': '.implode(', ', $error_nodes)
__(
'The group %s could not be deleted because it is not empty in the nodes',
$group_name
).': '.implode(', ', $error_nodes)
);
$errors_meta = true;
} else {
@ -540,60 +566,80 @@ if (($delete_group) && (check_acl($config['id_user'], 0, 'PM'))) {
$success_deleting = [];
$error_connecting_node = [];
// Delete the group in the nodes.
foreach ($servers as $server) {
if (metaconsole_connect($server) == NOERR) {
$group = db_get_row_filter(
'tgrupo',
['id_grupo' => $id_group]
);
if (isset($servers) === true
&& is_array($servers) === true
) {
foreach ($servers as $server) {
if (metaconsole_connect($server) == NOERR) {
$group = db_get_row_filter(
'tgrupo',
['id_grupo' => $id_group]
);
db_process_sql_update(
'tgrupo',
['parent' => $group['parent']],
['parent' => $id_group]
);
db_process_sql_update(
'tgrupo',
['parent' => $group['parent']],
['parent' => $id_group]
);
db_process_sql_delete(
'tgroup_stat',
['id_group' => $id_group]
);
db_process_sql_delete(
'tgroup_stat',
['id_group' => $id_group]
);
$result = db_process_sql_delete(
'tgrupo',
['id_grupo' => $id_group]
);
$result = db_process_sql_delete(
'tgrupo',
['id_grupo' => $id_group]
);
if ($result === false) {
$error_deleting[] .= $server['server_name'];
$error_deleting_counter++;
if ($result === false) {
$error_deleting[] .= $server['server_name'];
$error_deleting_counter++;
} else {
$success_deleting[] .= $server['server_name'];
$success_deleting_counter++;
}
} else {
$success_deleting[] .= $server['server_name'];
$success_deleting_counter++;
$error_deleting_counter++;
$error_connecting_node[] .= $server['server_name'];
}
} else {
$error_deleting_counter++;
$error_connecting_node[] .= $server['server_name'];
}
metaconsole_restore_db();
metaconsole_restore_db();
}
}
// If the group could not be deleted in any node, do not delete it in meta.
// If the group could not be deleted in any node,
// do not delete it in meta.
if ($error_deleting_counter > 0) {
$errors_meta = true;
if (!empty($error_connecting_node)) {
ui_print_error_message(__('Error connecting to %s', implode(', ', $error_connecting_node).'. The group has not been deleted in the metaconsole.'));
if (empty($error_connecting_node) === false) {
ui_print_error_message(
__(
'Error connecting to %s',
implode(
', ',
$error_connecting_node
).'. The group has not been deleted in the metaconsole.'
)
);
}
if (!empty($error_deleting)) {
if (empty($error_deleting) === false) {
ui_print_error_message(
__('The group has not been deleted in the metaconsole due to an error in the node database').': '.implode(', ', $error_deleting)
__(
'The group has not been deleted in the metaconsole due to an error in the node database'
).': '.implode(', ', $error_deleting)
);
}
}
if ($success_deleting_counter > 0) {
ui_print_success_message(__('The group %s has been deleted in the nodes', $group_name).': '.implode(', ', $success_deleting));
ui_print_success_message(
__(
'The group %s has been deleted in the nodes',
$group_name
).': '.implode(', ', $success_deleting)
);
}
}
}
@ -624,12 +670,17 @@ if (($delete_group) && (check_acl($config['id_user'], 0, 'PM'))) {
if ($result && (!$usedGroup['return'])) {
ui_print_success_message(__('Group successfully deleted'));
} else {
ui_print_error_message(__('There was a problem deleting group'));
ui_print_error_message(
__('There was a problem deleting group')
);
}
}
} else {
ui_print_error_message(
sprintf(__('The group is not empty. It is use in %s.'), implode(', ', $usedGroup['tables']))
sprintf(
__('The group is not empty. It is use in %s.'),
implode(', ', $usedGroup['tables'])
)
);
}
}
@ -662,14 +713,14 @@ if ($tab == 'tree') {
$search = (string) get_parameter('search', '');
$block_size = $config['block_size'];
if (!empty($search)) {
if (empty($search) === false) {
$search_name = 'AND t.nombre LIKE "%'.$search.'%"';
}
if (!users_can_manage_group_all('AR')) {
if (users_can_manage_group_all('AR') === false) {
$user_groups_acl = users_get_groups(false, 'AR');
$groups_acl = implode(',', $user_groups_ACL);
if (empty($groups_acl)) {
if (empty($groups_acl) === true) {
return ui_print_info_message(
[
'no_close' => true,
@ -684,7 +735,14 @@ if ($tab == 'tree') {
$form = "<form method='post' action=''>";
$form .= "<table class='databox filters bolder' width='100%'>";
$form .= '<tr><td>'.__('Search').'&nbsp;';
$form .= html_print_input_text('search', $search, '', 100, 100, true);
$form .= html_print_input_text(
'search',
$search,
'',
100,
100,
true
);
$form .= '</td><td>';
$form .= "<input name='find' type='submit' class='sub search' value='".__('Search')."'>";
$form .= '<td></tr>';
@ -713,7 +771,7 @@ if ($tab == 'tree') {
$groups = db_get_all_rows_sql($groups_sql);
if (!empty($groups)) {
if (empty($groups) === false) {
// Count all groups for pagination only saw user and filters.
$groups_sql_count = sprintf(
'SELECT count(*)
@ -799,7 +857,7 @@ if ($tab == 'tree') {
]
).'</a>';
if (is_metaconsole()) {
if (is_metaconsole() === true) {
$confirm_message = __('Are you sure? This group will also be deleted in all the nodes.');
} else {
$confirm_message = __('Are you sure?');
@ -841,11 +899,16 @@ if ($tab == 'tree') {
'pagination-bottom'
);
} else {
ui_print_info_message(['no_close' => true, 'message' => __('There are no defined groups') ]);
ui_print_info_message(
[
'no_close' => true,
'message' => __('There are no defined groups'),
]
);
}
}
if (check_acl($config['id_user'], 0, 'PM')) {
if (check_acl($config['id_user'], 0, 'PM') === true) {
echo '<form method="post" action="index.php?sec='.$sec.'&sec2=godmode/groups/configure_group">';
echo '<div class="action-buttons w100p">';
html_print_submit_button(__('Create group'), 'crt', false, 'class="sub next"');
@ -860,7 +923,7 @@ $tab = 'group_edition';
?>
<?php if (!is_metaconsole()) { ?>
<?php if (is_metaconsole() === false) { ?>
<script type="text/javascript" src="include/javascript/fixed-bottom-box.js"></script>
<?php } else { ?>
<script type="text/javascript" src="../../include/javascript/fixed-bottom-box.js"></script>
@ -900,7 +963,6 @@ $tab = 'group_edition';
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'); ?>",

View File

@ -1,17 +1,32 @@
<?php
// Pandora FMS - http://pandorafms.com
// ==================================================
// Copyright (c) 2005-2021 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()) {
/**
* Tree view.
*
* @category Tree
* @package Pandora FMS
* @subpackage Community
* @version 1.0.0
* @license See below
*
* ______ ___ _______ _______ ________
* | __ \.-----.--.--.--| |.-----.----.-----. | ___| | | __|
* | __/| _ | | _ || _ | _| _ | | ___| |__ |
* |___| |___._|__|__|_____||_____|__| |___._| |___| |__|_|__|_______|
*
* ============================================================================
* Copyright (c) 2005-2021 Artica Soluciones Tecnologicas
* Please see http://pandorafms.org for full contribution list
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation for version 2.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* ============================================================================
*/
if (is_ajax() === true) {
global $config;
// Login check.
@ -34,7 +49,7 @@ if (is_ajax()) {
$getGroupStatus = (bool) get_parameter('getGroupStatus', 0);
$getDetail = (bool) get_parameter('getDetail');
if ($getChildren) {
if ($getChildren === true) {
$type = get_parameter('type', 'group');
$rootType = get_parameter('rootType', '');
$id = get_parameter('id', -1);
@ -55,47 +70,111 @@ if (is_ajax()) {
$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;
$access = ($agent_a === true) ? 'AR' : (($agent_w === true) ? 'AW' : 'AR');
$switch_type = (empty($rootType) === false) ? $rootType : $type;
switch ($switch_type) {
case 'os':
$tree = new TreeOS($type, $rootType, $id, $rootID, $serverID, $childrenMethod, $access);
$tree = new TreeOS(
$type,
$rootType,
$id,
$rootID,
$serverID,
$childrenMethod,
$access
);
break;
case 'module_group':
$tree = new TreeModuleGroup($type, $rootType, $id, $rootID, $serverID, $childrenMethod, $access);
$tree = new TreeModuleGroup(
$type,
$rootType,
$id,
$rootID,
$serverID,
$childrenMethod,
$access
);
break;
case 'module':
$tree = new TreeModule($type, $rootType, $id, $rootID, $serverID, $childrenMethod, $access);
$tree = new TreeModule(
$type,
$rootType,
$id,
$rootID,
$serverID,
$childrenMethod,
$access
);
break;
case 'tag':
$tree = new TreeTag($type, $rootType, $id, $rootID, $serverID, $childrenMethod, $access);
$tree = new TreeTag(
$type,
$rootType,
$id,
$rootID,
$serverID,
$childrenMethod,
$access
);
break;
case 'group':
if (is_metaconsole()) {
if (!class_exists('TreeGroupMeta')) {
if (is_metaconsole() === true) {
if (class_exists('TreeGroupMeta') === false) {
break;
}
$tree = new TreeGroupMeta($type, $rootType, $id, $rootID, $serverID, $childrenMethod, $access);
$tree = new TreeGroupMeta(
$type,
$rootType,
$id,
$rootID,
$serverID,
$childrenMethod,
$access
);
} else {
$tree = new TreeGroup($type, $rootType, $id, $rootID, $serverID, $childrenMethod, $access);
$tree = new TreeGroup(
$type,
$rootType,
$id,
$rootID,
$serverID,
$childrenMethod,
$access
);
}
break;
case 'policies':
if (!class_exists('TreePolicies')) {
if (class_exists('TreePolicies') === false) {
break;
}
$tree = new TreePolicies($type, $rootType, $id, $rootID, $serverID, $childrenMethod, $access);
$tree = new TreePolicies(
$type,
$rootType,
$id,
$rootID,
$serverID,
$childrenMethod,
$access
);
break;
case 'group_edition':
$tree = new TreeGroupEdition($type, $rootType, $id, $rootID, $serverID, $childrenMethod, $access);
$tree = new TreeGroupEdition(
$type,
$rootType,
$id,
$rootID,
$serverID,
$childrenMethod,
$access
);
break;
case 'services':
@ -112,7 +191,7 @@ if (is_ajax()) {
break;
default:
// FIXME. No error handler
// No error handler.
return;
}
@ -123,14 +202,14 @@ if (is_ajax()) {
return;
}
if ($getDetail) {
if ($getDetail === true) {
include_once $config['homedir'].'/include/functions_treeview.php';
$id = (int) get_parameter('id');
$type = (string) get_parameter('type');
$server = [];
if (is_metaconsole()) {
if (is_metaconsole() === true) {
$server_id = (int) get_parameter('serverID');
$server = metaconsole_get_servers($server_id);
}
@ -142,7 +221,7 @@ if (is_ajax()) {
echo '</style>';
echo '<div class="left_align backgrund_primary_important">';
if (!empty($id) && !empty($type)) {
if (empty($id) === false && empty($type) === false) {
switch ($type) {
case 'agent':
treeview_printTable($id, $server, true);
@ -157,7 +236,7 @@ if (is_ajax()) {
break;
default:
// Nothing
// Nothing.
break;
}
}

View File

@ -1,15 +1,30 @@
<?php
// Pandora FMS- http://pandorafms.com
// ==================================================
// Copyright (c) 2005-2021 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.
/**
* Tree view.
*
* @category Tree
* @package Pandora FMS
* @subpackage Community
* @version 1.0.0
* @license See below
*
* ______ ___ _______ _______ ________
* | __ \.-----.--.--.--| |.-----.----.-----. | ___| | | __|
* | __/| _ | | _ || _ | _| _ | | ___| |__ |
* |___| |___._|__|__|_____||_____|__| |___._| |___| |__|_|__|_______|
*
* ============================================================================
* Copyright (c) 2005-2021 Artica Soluciones Tecnologicas
* Please see http://pandorafms.org for full contribution list
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation for version 2.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* ============================================================================
*/
class Tree
{

View File

@ -1,32 +1,86 @@
<?php
// Pandora FMS- http://pandorafms.com
// ==================================================
// Copyright (c) 2005-2021 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.
/**
* Tree view.
*
* @category Tree
* @package Pandora FMS
* @subpackage Community
* @version 1.0.0
* @license See below
*
* ______ ___ _______ _______ ________
* | __ \.-----.--.--.--| |.-----.----.-----. | ___| | | __|
* | __/| _ | | _ || _ | _| _ | | ___| |__ |
* |___| |___._|__|__|_____||_____|__| |___._| |___| |__|_|__|_______|
*
* ============================================================================
* Copyright (c) 2005-2021 Artica Soluciones Tecnologicas
* Please see http://pandorafms.org for full contribution list
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation for version 2.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* ============================================================================
*/
global $config;
require_once $config['homedir'].'/include/class/Tree.class.php';
/**
* Tree group class.
*/
class TreeGroup extends Tree
{
/**
* Propagate ACL.
*
* @var boolean
*/
protected $propagateCounters = true;
/**
* Display all groups.
*
* @var boolean
*/
protected $displayAllGroups = false;
public function __construct($type, $rootType='', $id=-1, $rootID=-1, $serverID=false, $childrenMethod='on_demand', $access='AR')
{
/**
* Construct.
*
* @param string $type Type.
* @param string $rootType Root.
* @param integer $id Id.
* @param integer $rootID Root Id.
* @param boolean $serverID Server.
* @param string $childrenMethod Method children.
* @param string $access Access ACL.
*/
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 = [
@ -42,18 +96,37 @@ class TreeGroup extends Tree
}
/**
* Setter propagate counters.
*
* @param boolean $value True or ffalse.
*
* @return void
*/
public function setPropagateCounters($value)
{
$this->propagateCounters = (bool) $value;
}
/**
* Setter all groups.
*
* @param boolean $value True or ffalse.
*
* @return void
*/
public function setDisplayAllGroups($value)
{
$this->displayAllGroups = (bool) $value;
}
/**
* Get data.
*
* @return void
*/
protected function getData()
{
if ($this->id == -1) {
@ -66,22 +139,36 @@ class TreeGroup extends Tree
}
/**
* Filter search groups.
*
* @return string
*/
protected function getGroupSearchFilter()
{
return '';
}
/**
* First level tree.
*
* @return void
*/
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) {
if (empty($processed_items) === false) {
// Filter by group name. This should be done after rerieving
// the items cause we need the possible items descendants.
if (empty($this->filter['searchGroup']) === false) {
// Save the groups which intersect with the user groups.
$groups = db_get_all_rows_filter(
'tgrupo',
['nombre' => '%'.$this->filter['searchGroup'].'%']
);
if ($groups === false) {
$groups = [];
}
@ -90,7 +177,7 @@ class TreeGroup extends Tree
$groups,
function ($userGroups, $group) use ($userGroupsACL) {
$group_id = $group['id_grupo'];
if (isset($userGroupsACL[$group_id])) {
if (isset($userGroupsACL[$group_id]) === true) {
$userGroups[$group_id] = $userGroupsACL[$group_id];
}
@ -99,14 +186,22 @@ class TreeGroup extends Tree
[]
);
$result = self::extractGroupsWithIDs($processed_items, $ids_hash);
$result = self::extractGroupsWithIDs(
$processed_items,
$ids_hash
);
$processed_items = ($result === false) ? [] : $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);
// GroupID filter. To access the view from tactical views f.e.
if (empty($this->filter['groupID']) === false) {
$result = self::extractItemWithID(
$processed_items,
$this->filter['groupID'],
'group',
$this->strictACL
);
$processed_items = ($result === false) ? [] : [$result];
}
@ -116,56 +211,64 @@ class TreeGroup extends Tree
}
/**
* Process group
*
* @return mixed
*/
protected function getProcessedGroups()
{
$processed_groups = [];
// Index and process the 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')) {
// Avoid to do foreach for admins.
if (users_can_manage_group_all('AR') === false) {
foreach ($groups as $id => $group) {
if (!isset($this->userGroups[$groups[$id]['parent']])) {
if (isset($this->userGroups[$groups[$id]['parent']]) === false) {
$groups[$id]['parent'] = 0;
}
}
}
// Build the group hierarchy
// Build the group hierarchy.
foreach ($groups as $id => $group) {
if (isset($groups[$id]['parent']) && ($groups[$id]['parent'] != 0)) {
if (isset($groups[$id]['parent']) === true
&& ($groups[$id]['parent'] != 0)
) {
$parent = $groups[$id]['parent'];
// Parent exists
if (!isset($groups[$parent]['children'])) {
// Parent exists.
if (isset($groups[$parent]['children']) === false) {
$groups[$parent]['children'] = [];
}
// Store a reference to the group into the parent
// Store a reference to the group into the parent.
$groups[$parent]['children'][] = &$groups[$id];
// This group was introduced into a parent
// This group was introduced into a parent.
$groups[$id]['have_parent'] = true;
}
}
// Sort the children groups
// Sort the children groups.
foreach ($groups as $id => $group) {
if (isset($groups[$id]['children'])) {
if (isset($groups[$id]['children']) === true) {
usort($groups[$id]['children'], ['Tree', 'cmpSortNames']);
}
}
// Filter groups and eliminates the reference to children groups out of her parent
// 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) {
// Propagate child counters to her parents.
if ($this->propagateCounters === true) {
self::processCounters($groups);
// Filter groups and eliminates the reference to empty groups
// Filter groups and eliminates the reference to empty groups.
$groups = $this->deleteEmptyGroups($groups);
} else {
$groups = $this->deleteEmptyGroupsNotPropagate($groups);

View File

@ -1,31 +1,81 @@
<?php
// Pandora FMS- http://pandorafms.com
// ==================================================
// Copyright (c) 2005-2021 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.
/**
* Tree view.
*
* @category Tree
* @package Pandora FMS
* @subpackage Community
* @version 1.0.0
* @license See below
*
* ______ ___ _______ _______ ________
* | __ \.-----.--.--.--| |.-----.----.-----. | ___| | | __|
* | __/| _ | | _ || _ | _| _ | | ___| |__ |
* |___| |___._|__|__|_____||_____|__| |___._| |___| |__|_|__|_______|
*
* ============================================================================
* Copyright (c) 2005-2021 Artica Soluciones Tecnologicas
* Please see http://pandorafms.org for full contribution list
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation for version 2.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* ============================================================================
*/
global $config;
require_once $config['homedir'].'/include/class/Tree.class.php';
/**
* Tree group edition.
*/
class TreeGroupEdition extends TreeGroup
{
public function __construct($type, $rootType='', $id=-1, $rootID=-1, $serverID=false, $childrenMethod='on_demand', $access='AR')
{
/**
* Construct.
*
* @param string $type Type.
* @param string $rootType Root.
* @param integer $id Id.
* @param integer $rootID Root Id.
* @param boolean $serverID Server.
* @param string $childrenMethod Method children.
* @param string $access Access ACL.
*/
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
);
}
/**
* Get data.
*
* @return void
*/
protected function getData()
{
if ($this->id == -1) {
@ -34,46 +84,54 @@ class TreeGroupEdition extends TreeGroup
}
/**
* Get process group.
*
* @return mixed
*/
protected function getProcessedGroups()
{
$processed_groups = [];
// Index and process the 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')) {
// Avoid to do foreach for admins.
if (users_can_manage_group_all('AR') === false) {
foreach ($groups as $id => $group) {
if (!isset($this->userGroups[$groups[$id]['parent']])) {
if (isset($this->userGroups[$groups[$id]['parent']]) === false) {
$groups[$id]['parent'] = 0;
}
}
}
// Build the group hierarchy
// Build the group hierarchy.
foreach ($groups as $id => $group) {
if (isset($groups[$id]['parent']) && ($groups[$id]['parent'] != 0)) {
if (isset($groups[$id]['parent']) === true
&& ($groups[$id]['parent'] != 0)
) {
$parent = $groups[$id]['parent'];
// Parent exists
if (!isset($groups[$parent]['children'])) {
// Parent exists.
if (isset($groups[$parent]['children']) === false) {
$groups[$parent]['children'] = [];
}
// Store a reference to the group into the parent
// Store a reference to the group into the parent.
$groups[$parent]['children'][] = &$groups[$id];
// This group was introduced into a parent
// This group was introduced into a parent.
$groups[$id]['have_parent'] = true;
}
}
// Sort the children groups
// Sort the children groups.
foreach ($groups as $id => $group) {
if (isset($groups[$id]['children'])) {
if (isset($groups[$id]['children']) === true) {
usort($groups[$id]['children'], ['Tree', 'cmpSortNames']);
}
}
// Filter groups and eliminates the reference to children groups out of her parent
// Filter groups and eliminates the reference
// to children groups out of her parent.
$groups = array_filter(
$groups,
function ($group) {
@ -86,6 +144,11 @@ class TreeGroupEdition extends TreeGroup
}
/**
* Get group counters.
*
* @return mixed
*/
protected function getGroupCounters()
{
$messages = [
@ -93,10 +156,25 @@ class TreeGroupEdition extends TreeGroup
'cancel' => __('Cancel'),
'messg' => __('Are you sure?'),
];
$sql = 'SELECT id_grupo AS gid,
nombre as name, parent, icon
$group_acl = '';
if (users_can_manage_group_all('AR') === false) {
$user_groups_str = implode(',', $this->userGroupsArray);
$group_acl = sprintf(
'AND id_grupo IN (%s)',
$user_groups_str
);
}
$sql = sprintf(
'SELECT id_grupo AS gid,
nombre as name,
parent,
icon
FROM tgrupo
';
WHERE 1=1 %s',
$group_acl
);
$stats = db_get_all_rows_sql($sql);
$group_stats = [];
@ -107,7 +185,9 @@ class TreeGroupEdition extends TreeGroup
$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']] = $this->getProcessedItem(
$group_stats[$group['gid']]
);
$group_stats[$group['gid']]['delete']['messages'] = $messages;
$group_stats[$group['gid']]['edit'] = 1;
$group_stats[$group['gid']]['alerts'] = '';