mirror of
https://github.com/pandorafms/pandorafms.git
synced 2025-09-26 11:29:12 +02:00
Merge branch '2611-Cache_de_vista_de_arbol_y_vista_de_grupos' into 'develop'
2611 cache de vista de arbol y vista de grupos See merge request artica/pandorafms!1733
This commit is contained in:
commit
8480deebba
@ -950,7 +950,7 @@ class Tree {
|
|||||||
SUM(if(%s, 1, 0)) as state_unknown,
|
SUM(if(%s, 1, 0)) as state_unknown,
|
||||||
SUM(if(%s, 1, 0)) as state_notinit,
|
SUM(if(%s, 1, 0)) as state_notinit,
|
||||||
SUM(if(%s, 1, 0)) as state_normal,
|
SUM(if(%s, 1, 0)) as state_normal,
|
||||||
SUM(if(%s, 1, 0)) as state_total
|
SUM(if(%s AND tae.estado IS NOT NULL, 1, 0)) as state_total
|
||||||
",
|
",
|
||||||
$this->getModuleStatusFilterFromTestado(AGENT_MODULE_STATUS_CRITICAL_ALERT, true),
|
$this->getModuleStatusFilterFromTestado(AGENT_MODULE_STATUS_CRITICAL_ALERT, true),
|
||||||
$this->getModuleStatusFilterFromTestado(AGENT_MODULE_STATUS_WARNING_ALERT, true),
|
$this->getModuleStatusFilterFromTestado(AGENT_MODULE_STATUS_WARNING_ALERT, true),
|
||||||
@ -977,7 +977,8 @@ class Tree {
|
|||||||
FROM tagente ta
|
FROM tagente ta
|
||||||
$inner_or_left JOIN tagente_modulo tam
|
$inner_or_left JOIN tagente_modulo tam
|
||||||
ON ta.id_agente = tam.id_agente
|
ON ta.id_agente = tam.id_agente
|
||||||
INNER JOIN tagente_estado tae
|
AND tam.disabled = 0
|
||||||
|
$inner_or_left JOIN tagente_estado tae
|
||||||
ON tae.id_agente_modulo = tam.id_agente_modulo
|
ON tae.id_agente_modulo = tam.id_agente_modulo
|
||||||
$inner
|
$inner
|
||||||
WHERE ta.id_agente IN
|
WHERE ta.id_agente IN
|
||||||
@ -992,14 +993,13 @@ class Tree {
|
|||||||
$group_search_filter
|
$group_search_filter
|
||||||
$condition_inside
|
$condition_inside
|
||||||
)
|
)
|
||||||
AND ta.disabled = 0 AND tam.disabled = 0
|
AND ta.disabled = 0
|
||||||
$condition
|
$condition
|
||||||
$agent_search_filter
|
$agent_search_filter
|
||||||
$agent_status_filter
|
$agent_status_filter
|
||||||
$module_search_filter
|
$module_search_filter
|
||||||
$module_status_filter
|
$module_status_filter
|
||||||
GROUP BY ta.id_agente
|
GROUP BY ta.id_agente
|
||||||
HAVING state_total > 0
|
|
||||||
ORDER BY ta.alias ASC, ta.id_agente ASC
|
ORDER BY ta.alias ASC, ta.id_agente ASC
|
||||||
";
|
";
|
||||||
|
|
||||||
|
@ -28,7 +28,6 @@ class TreeGroup extends Tree {
|
|||||||
$this->L1fieldName = "id_group";
|
$this->L1fieldName = "id_group";
|
||||||
$this->L1extraFields = array(
|
$this->L1extraFields = array(
|
||||||
"tg.nombre AS `name`",
|
"tg.nombre AS `name`",
|
||||||
$this->getDisplayHierarchy() ? 'tg.parent' : '0 as parent',
|
|
||||||
"tg.icon",
|
"tg.icon",
|
||||||
"tg.id_grupo AS gid"
|
"tg.id_grupo AS gid"
|
||||||
);
|
);
|
||||||
@ -56,42 +55,42 @@ class TreeGroup extends Tree {
|
|||||||
protected function getFirstLevel() {
|
protected function getFirstLevel() {
|
||||||
$processed_items = $this->getProcessedGroups();
|
$processed_items = $this->getProcessedGroups();
|
||||||
|
|
||||||
if (!empty($processed_items)) {
|
if (!empty($processed_items)) {
|
||||||
// Filter by group name. This should be done after rerieving the items cause we need the possible items descendants
|
// Filter by group name. This should be done after rerieving the items cause we need the possible items descendants
|
||||||
if (!empty($this->filter['searchGroup'])) {
|
if (!empty($this->filter['searchGroup'])) {
|
||||||
// Save the groups which intersect with the user groups
|
// Save the groups which intersect with the user groups
|
||||||
$groups = db_get_all_rows_filter('tgrupo', array('nombre' => '%' . $this->filter['searchGroup'] . '%'));
|
$groups = db_get_all_rows_filter('tgrupo', array('nombre' => '%' . $this->filter['searchGroup'] . '%'));
|
||||||
if ($groups == false) $groups = array();
|
if ($groups == false) $groups = array();
|
||||||
$userGroupsACL = $this->userGroupsACL;
|
$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'];
|
$group_id = $group['id_grupo'];
|
||||||
if (isset($userGroupsACL[$group_id])) {
|
if (isset($userGroupsACL[$group_id])) {
|
||||||
$userGroups[$group_id] = $userGroupsACL[$group_id];
|
$userGroups[$group_id] = $userGroupsACL[$group_id];
|
||||||
}
|
}
|
||||||
|
|
||||||
return $userGroups;
|
return $userGroups;
|
||||||
}, array());
|
}, array());
|
||||||
|
|
||||||
$result = self::extractGroupsWithIDs($processed_items, $ids_hash);
|
$result = self::extractGroupsWithIDs($processed_items, $ids_hash);
|
||||||
|
|
||||||
$processed_items = ($result === false) ? array() : $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);
|
|
||||||
|
|
||||||
$processed_items = ($result === false) ? array() : 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);
|
||||||
|
|
||||||
|
$processed_items = ($result === false) ? array() : array($result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$this->tree = $processed_items;
|
$this->tree = $processed_items;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function getProcessedGroups () {
|
protected function getProcessedGroups () {
|
||||||
$processed_groups = array();
|
$processed_groups = array();
|
||||||
// Index and process the groups
|
// Index and process the groups
|
||||||
$groups = $this->getGroupCounters(0);
|
$groups = $this->getGroupCounters();
|
||||||
|
|
||||||
// If user have not permissions in parent, set parent node to 0 (all)
|
// If user have not permissions in parent, set parent node to 0 (all)
|
||||||
// Avoid to do foreach for admins
|
// Avoid to do foreach for admins
|
||||||
@ -136,98 +135,81 @@ class TreeGroup extends Tree {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected function getGroupCounters() {
|
protected function getGroupCounters() {
|
||||||
//FIXME PLEASE
|
$fields = $this->getFirstLevelFields();
|
||||||
if (true) {
|
$inside_fields = $this->getFirstLevelFieldsInside();
|
||||||
$fields = $this->getFirstLevelFields();
|
|
||||||
$inside_fields = $this->getFirstLevelFieldsInside();
|
|
||||||
|
|
||||||
$group_acl = "";
|
$group_acl = "";
|
||||||
$secondary_group_acl = "";
|
$secondary_group_acl = "";
|
||||||
if (!users_can_manage_group_all("AR")) {
|
if (!users_can_manage_group_all("AR")) {
|
||||||
$user_groups_str = implode(",", $this->userGroupsArray);
|
$user_groups_str = implode(",", $this->userGroupsArray);
|
||||||
$group_acl = " AND ta.id_grupo IN ($user_groups_str)";
|
$group_acl = " AND ta.id_grupo IN ($user_groups_str)";
|
||||||
$secondary_group_acl = " AND tasg.id_group 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 = "
|
|
||||||
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()
|
|
||||||
;
|
|
||||||
}
|
|
||||||
|
|
||||||
$table = is_metaconsole() ? "tmetaconsole_agent" : "tagente";
|
|
||||||
$table_sec = is_metaconsole() ? "tmetaconsole_agent_secondary_group" : "tagent_secondary_group";
|
|
||||||
|
|
||||||
$sql_model = "SELECT %s FROM
|
|
||||||
(
|
|
||||||
SELECT COUNT(DISTINCT(ta.id_agente)) AS total, id_grupo AS g
|
|
||||||
FROM $table ta
|
|
||||||
$module_search_inner
|
|
||||||
WHERE ta.disabled = 0
|
|
||||||
%s
|
|
||||||
$agent_search_filter
|
|
||||||
$agent_status_filter
|
|
||||||
$module_status_filter
|
|
||||||
$module_search_filter
|
|
||||||
$group_acl
|
|
||||||
GROUP BY id_grupo
|
|
||||||
UNION ALL
|
|
||||||
SELECT COUNT(DISTINCT(ta.id_agente)) AS total, id_group AS g
|
|
||||||
FROM $table ta INNER JOIN $table_sec tasg
|
|
||||||
ON ta.id_agente = tasg.id_agent
|
|
||||||
$module_search_inner
|
|
||||||
WHERE ta.disabled = 0
|
|
||||||
%s
|
|
||||||
$agent_search_filter
|
|
||||||
$agent_status_filter
|
|
||||||
$module_status_filter
|
|
||||||
$module_search_filter
|
|
||||||
$secondary_group_acl
|
|
||||||
GROUP BY id_group
|
|
||||||
) x GROUP BY g";
|
|
||||||
$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);
|
|
||||||
}
|
}
|
||||||
else{
|
$agent_search_filter = $this->getAgentSearchFilter();
|
||||||
$stats = db_get_all_rows_sql(
|
$agent_search_filter = preg_replace("/%/", "%%", $agent_search_filter);
|
||||||
'SELECT tgs.agents AS total_count, tgs.critical AS total_critical_count,
|
$agent_status_filter = $this->getAgentStatusFilter();
|
||||||
tgs.unknown AS total_unknown_count, tgs.warning AS total_warning_count,
|
$module_status_filter = $this->getModuleStatusFilter();
|
||||||
`non-init` AS total_not_init_count, tgs.normal AS total_normal_count,
|
|
||||||
tgs.alerts_fired AS total_alerts_count,
|
$module_search_inner = "";
|
||||||
tg.nombre AS name, tg.parent, tg.icon, tg.id_grupo AS gid
|
$module_search_filter = "";
|
||||||
FROM tgroup_stat tgs
|
if (!empty($this->filter['searchModule'])) {
|
||||||
INNER JOIN tgrupo tg
|
$module_search_inner = "
|
||||||
ON tg.id_grupo = tgs.id_group
|
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()
|
||||||
|
;
|
||||||
}
|
}
|
||||||
|
|
||||||
# Update the group cache (from db or calculated).
|
$table = is_metaconsole() ? "tmetaconsole_agent" : "tagente";
|
||||||
|
$table_sec = is_metaconsole() ? "tmetaconsole_agent_secondary_group" : "tagent_secondary_group";
|
||||||
|
|
||||||
|
$sql_model = "SELECT %s FROM
|
||||||
|
(
|
||||||
|
SELECT COUNT(DISTINCT(ta.id_agente)) AS total, id_grupo AS g
|
||||||
|
FROM $table ta
|
||||||
|
$module_search_inner
|
||||||
|
WHERE ta.disabled = 0
|
||||||
|
%s
|
||||||
|
$agent_search_filter
|
||||||
|
$agent_status_filter
|
||||||
|
$module_status_filter
|
||||||
|
$module_search_filter
|
||||||
|
$group_acl
|
||||||
|
GROUP BY id_grupo
|
||||||
|
UNION ALL
|
||||||
|
SELECT COUNT(DISTINCT(ta.id_agente)) AS total, id_group AS g
|
||||||
|
FROM $table ta INNER JOIN $table_sec tasg
|
||||||
|
ON ta.id_agente = tasg.id_agent
|
||||||
|
$module_search_inner
|
||||||
|
WHERE ta.disabled = 0
|
||||||
|
%s
|
||||||
|
$agent_search_filter
|
||||||
|
$agent_status_filter
|
||||||
|
$module_status_filter
|
||||||
|
$module_search_filter
|
||||||
|
$secondary_group_acl
|
||||||
|
GROUP BY id_group
|
||||||
|
) x GROUP BY g";
|
||||||
|
$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_stats = array();
|
$group_stats = array();
|
||||||
|
|
||||||
foreach ($stats as $group) {
|
foreach ($stats as $group) {
|
||||||
$group_stats[$group['gid']]['total_count'] = (int)$group['total_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_critical_count'] = (int)$group['total_critical_count'];
|
||||||
@ -243,13 +225,15 @@ class TreeGroup extends Tree {
|
|||||||
$group_stats[$group['gid']] = $this->getProcessedItem($group_stats[$group['gid']]);
|
$group_stats[$group['gid']] = $this->getProcessedItem($group_stats[$group['gid']]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isset($group_stats[$group_id])) {
|
|
||||||
return $group_stats[$group_id];
|
|
||||||
}
|
|
||||||
|
|
||||||
return $group_stats;
|
return $group_stats;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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 = array();
|
$groups = array();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user