[Tags performance] Fixed performance of main agent view

This commit is contained in:
fermin831 2018-10-02 13:19:17 +02:00
parent 14caf7bc07
commit dc92a00b48
2 changed files with 81 additions and 130 deletions

View File

@ -74,7 +74,7 @@ if ($search_modules) {
$id_agents = json_decode(io_safe_output(get_parameter('id_agents')));
$filter = '%' . get_parameter('q', '') . '%';
$other_filter = json_decode(io_safe_output(get_parameter('other_filter')), true);
// TODO TAGS agents_get_modules
$modules = agents_get_modules($id_agents, false,
(array('nombre' => $filter) + $other_filter));
@ -550,11 +550,15 @@ if ($list_modules) {
// Fix: for tag functionality groups have to be all user_groups (propagate ACL funct!)
$groups = users_get_groups($config["id_user"], $access);
if($cluster_list != 1){
// TODO revision tag
$tags_sql = tags_get_acl_tags($config['id_user'],
array_keys($groups), $access, 'module_condition', 'AND',
'tagente_modulo', false, array(), true);
$tags_join = "";
$tags_sql = "";
if($cluster_list != 1) {
$tags = tags_get_user_applied_agent_tags ($id_agent, $access);
if (is_array($tags)) {
$tags_sql = " AND ttag_module.id_tag IN (" . implode(',', $tags) . ")";
$tags_join = "LEFT JOIN ttag_module
ON ttag_module.id_agente_modulo = tagente_modulo.id_agente_modulo";
}
}
$status_filter_monitor = (int)get_parameter('status_filter_monitor', -1);
@ -572,10 +576,10 @@ if ($list_modules) {
}
if ($status_module_group != -1) {
$status_module_group_filter = 'id_module_group = ' . $status_module_group;
$status_module_group_filter = 'tagente_modulo.id_module_group = ' . $status_module_group;
}
else {
$status_module_group_filter = 'id_module_group >= 0';
$status_module_group_filter = 'tagente_modulo.id_module_group >= 0';
}
$status_text_monitor_sql = '%';
@ -591,66 +595,22 @@ if ($list_modules) {
}
//Count monitors/modules
switch ($config["dbtype"]) {
case "mysql":
$sql = sprintf("
SELECT COUNT(*)
FROM tagente_estado,
(SELECT *
FROM tagente_modulo
WHERE id_agente = %d AND nombre LIKE \"%s\" AND delete_pending = 0
AND disabled = 0 AND %s) tagente_modulo
LEFT JOIN tmodule_group
ON tagente_modulo.id_module_group = tmodule_group.id_mg
WHERE tagente_estado.id_agente_modulo = tagente_modulo.id_agente_modulo
AND %s %s
AND tagente_estado.estado != %d
AND tagente_modulo.%s
ORDER BY tagente_modulo.id_module_group , %s %s",
$id_agente, $status_text_monitor_sql,$status_module_group_filter,$status_filter_sql, $tags_sql, $monitor_filter,
$status_module_group_filter, $order['field'], $order['order']);
break;
case "postgresql":
$sql = sprintf("
SELECT COUNT(DISTINCT tagente_modulo.id_module_group)
FROM tagente_estado,
(SELECT *
FROM tagente_modulo
WHERE id_agente = %d AND nombre LIKE '%s'
AND delete_pending = 0
AND disabled = 0 AND %s) tagente_modulo
LEFT JOIN tmodule_group
ON tagente_modulo.id_module_group = tmodule_group.id_mg
WHERE tagente_estado.id_agente_modulo = tagente_modulo.id_agente_modulo
AND %s %s
AND tagente_estado.estado != %d
AND tagente_modulo.%s
GROUP BY tagente_modulo.id_module_group,
tagente_modulo.nombre
ORDER BY tagente_modulo.id_module_group , %s %s",
$id_agente, $status_text_monitor_sql,$status_module_group_filter,$status_filter_sql,
$tags_sql, $monitor_filter,$status_module_group_filter,$order['field'],
$order['order']);
break;
case "oracle":
$sql = sprintf ("
SELECT COUNT(*)" .
" FROM tagente_estado, tagente_modulo
LEFT JOIN tmodule_group
ON tmodule_group.id_mg = tagente_modulo.id_module_group
WHERE tagente_estado.id_agente_modulo = tagente_modulo.id_agente_modulo
AND tagente_modulo.id_agente = %d
AND tagente_modulo.nombre LIKE '%s'
AND %s %s
AND tagente_modulo.delete_pending = 0
AND tagente_modulo.disabled = 0
AND tagente_estado.estado != %d
AND tagente_modulo.%s
ORDER BY tagente_modulo.id_module_group , %s %s
", $id_agente, $status_text_monitor_sql, $status_filter_sql, $tags_sql, $monitor_filter,
$status_module_group_filter,$order['field'], $order['order']);
break;
}
$order_sql = $order['field'] . " " . $order['order'];
$sql = "SELECT COUNT(*)
FROM tagente_modulo
$tags_join
INNER JOIN tagente_estado
ON tagente_modulo.id_agente_modulo = tagente_estado.id_agente_modulo
LEFT JOIN tmodule_group
ON tagente_modulo.id_module_group = tmodule_group.id_mg
WHERE tagente_modulo.id_agente = $id_agente
AND nombre LIKE '$status_text_monitor_sql'
AND delete_pending = 0
AND $status_filter_sql
$tags_sql
AND tagente_estado.estado != $monitor_filter
GROUP BY tagente_modulo.id_agente_modulo
";
$count_modules = db_get_all_rows_sql($sql);
if (isset($count_modules[0]))
@ -660,68 +620,22 @@ if ($list_modules) {
//Get monitors/modules
// Get all module from agent
switch ($config["dbtype"]) {
case "mysql":
$sql = sprintf("
SELECT *
FROM tagente_estado,
(SELECT *
FROM tagente_modulo
WHERE id_agente = %d AND nombre LIKE \"%s\" AND delete_pending = 0
AND disabled = 0 AND %s) tagente_modulo
LEFT JOIN tmodule_group
ON tagente_modulo.id_module_group = tmodule_group.id_mg
WHERE tagente_estado.id_agente_modulo = tagente_modulo.id_agente_modulo
AND %s %s
AND tagente_estado.estado != %d
AND tagente_modulo.%s
ORDER BY tmodule_group.name , %s %s",
$id_agente, $status_text_monitor_sql,$status_module_group_filter,$status_filter_sql, $tags_sql, $monitor_filter,
$status_module_group_filter, $order['field'], $order['order']);
break;
case "postgresql":
$sql = sprintf("
SELECT *
FROM tagente_estado,
(SELECT *
FROM tagente_modulo
WHERE id_agente = %d AND nombre LIKE '%s' AND delete_pending = 0
AND disabled = 0 AND %s) tagente_modulo
LEFT JOIN tmodule_group
ON tagente_modulo.id_module_group = tmodule_group.id_mg
WHERE tagente_estado.id_agente_modulo = tagente_modulo.id_agente_modulo
AND %s %s
AND tagente_estado.estado != %d
AND tagente_modulo.%s
ORDER BY tmodule_group.name , %s %s",
$id_agente, $status_text_monitor_sql,$status_module_group_filter,$status_filter_sql, $tags_sql, $monitor_filter,
$status_module_group_filter, $order['field'], $order['order']);
break;
// If Dbms is Oracle then field_list in sql statement has to be recoded. See oracle_list_all_field_table()
case "oracle":
$fields_tagente_estado = oracle_list_all_field_table('tagente_estado', 'string');
$fields_tagente_modulo = oracle_list_all_field_table('tagente_modulo', 'string');
$fields_tmodule_group = oracle_list_all_field_table('tmodule_group', 'string');
$sql = sprintf ("
SELECT " . $fields_tagente_estado . ', ' . $fields_tagente_modulo . ', ' . $fields_tmodule_group .
" FROM tagente_estado, tagente_modulo
LEFT JOIN tmodule_group
ON tmodule_group.id_mg = tagente_modulo.id_module_group
WHERE tagente_estado.id_agente_modulo = tagente_modulo.id_agente_modulo
AND tagente_modulo.id_agente = %d
AND tagente_modulo.nombre LIKE '%s'
AND %s %s
AND tagente_modulo.delete_pending = 0
AND tagente_modulo.disabled = 0
AND tagente_estado.estado != %d
AND tagente_modulo.%s
ORDER BY tmodule_group.name , %s %s
", $id_agente, $status_text_monitor_sql, $tags_sql, $status_filter_sql, $monitor_filter,
$status_module_group_filter, $order['field'], $order['order']);
break;
}
$sql = "SELECT tagente_estado.*, tagente_modulo.*, tmodule_group.*
FROM tagente_modulo
$tags_join
INNER JOIN tagente_estado
ON tagente_modulo.id_agente_modulo = tagente_estado.id_agente_modulo
LEFT JOIN tmodule_group
ON tagente_modulo.id_module_group = tmodule_group.id_mg
WHERE tagente_modulo.id_agente = $id_agente
AND nombre LIKE '$status_text_monitor_sql'
AND delete_pending = 0
AND $status_filter_sql
$tags_sql
AND tagente_estado.estado != $monitor_filter
GROUP BY tagente_modulo.id_agente_modulo
ORDER BY tmodule_group.name, $order_sql
";
if ($monitors_change_filter) {
$limit = " LIMIT " . $config['block_size'] . " OFFSET 0";

View File

@ -2628,4 +2628,41 @@ function tags_get_module_policy_tags($id_tag, $id_module) {
return $id_module_policy;
}
/**
* Get all tags configured to user associated to the agent.
*
* @param int $id_agent Agent to extract tags
* @param string $access Access to check
*
* @return mixed
* false if user has not permission on agent groups
* true if there is not any tag restriction
* array with all tags if there are tags configured
*/
function tags_get_user_applied_agent_tags ($id_agent, $access) {
global $config;
$agent_groups = agents_get_all_groups_agent($id_agent);
$user_groups = users_get_groups(false, 'AR', false, true);
// Check global agent permissions
if (!check_acl_one_of_groups($config['id_user'], $agent_groups, $access)) {
return false;
}
$acl_column = get_acl_column($access);
$tags = array();
foreach ($agent_groups as $group) {
// If user has not permission to a single group, continue
if (!isset($user_groups[$group])) continue;
$group_tags = $user_groups[$group]["tags"][$acl_column];
if (!empty($group_tags)) {
$tags = array_merge($tags, $group_tags);
} else {
// If an agent
return true;
}
}
return empty($tags) ? true : $tags;
}
?>