L1fieldName = 'id_group'; $this->L1extraFields = [ '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(); } else if ($this->type == 'services') { $this->getSecondLevel(); } else if ($this->type == 'agent') { $this->getThirdLevel(); } } protected function getFirstLevel() { global $config; $processed_items = $this->getProcessedServices(); $ids = array_keys($processed_items); $filter = ['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'] = 'NORMAL status.'; break; case SERVICE_STATUS_CRITICAL: $processed_items[$row['id']]['statusImageHTML'] = 'CRITICAL status.'; break; case SERVICE_STATUS_WARNING: $processed_items[$row['id']]['statusImageHTML'] = 'WARNING status.'; break; case SERVICE_STATUS_UNKNOWN: default: $processed_items[$row['id']]['statusImageHTML'] = 'UNKNOWN status.'; break; } } $this->tree = $processed_items; } protected function getProcessedServices() { $fields = $this->getFirstLevelFields(); $is_favourite = $this->getServiceFavouriteFilter(); 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 WHERE 1=1 %s %s GROUP BY id ) as t1 ON tss.id_service_child = t1.id WHERE tss.id_service_child IS NULL ", $groups_acl, $is_favourite ); $stats = db_get_all_rows_sql($sql); $services = []; 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'] = [ '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'] = 'index.php?sec=network&sec2=enterprise/operation/services/services&tab=service_map&id_service='.(int) $service['id']; } return $services; } protected function getFirstLevelFields() { $fields = []; return implode(',', array_merge($fields, $this->L1extraFields)); } protected function getSecondLevel() { $data = []; $data_agents = []; $data_modules = []; $data_services = []; $sql = $this->getSecondLevelSql(); $data_agents = db_process_sql($sql); if (empty($data_agents)) { $data_agents = []; } $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 = []; } else { foreach ($data_modules as $key => $module) { switch ($module['estado']) { case '0': $module_status = 'ok'; $module_title = 'NORMAL'; break; case '1': $module_status = 'critical'; $module_title = 'CRITICAL'; break; case '2': $module_status = 'warning'; $module_title = 'WARNING'; break; case '3': $module_status = 'down'; $module_title = 'UNKNOWN'; break; case '4': $module_status = 'no_data'; $module_title = 'NOT INITIALIZED'; break; default: $module_status = 'down'; $module_title = 'UNKNOWN'; break; } $data_modules[$key]['statusImageHTML'] = ''.$module_title.' status.'; $data_modules[$key]['showEventsBtn'] = 1; $data_modules[$key]['eventModule'] = $module['id_agente_modulo']; } } $sql = $this->getSecondLevelServicesSql(); $data_services = db_process_sql($sql); $service_stats = []; 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'] = []; $service_stats[$service['id']]['serviceDetail'] = 'index.php?sec=network&sec2=enterprise/operation/services/services&tab=service_map&id_service='.(int) $service['id']; $service_stats[$service['id']]['counters'] = [ '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'] = 'NORMAL status.'; break; case SERVICE_STATUS_CRITICAL: $service_stats[$row['id']]['statusImageHTML'] = 'CRITICAL status.'; break; case SERVICE_STATUS_WARNING: $service_stats[$row['id']][$key]['statusImageHTML'] = 'WARNING status.'; break; case SERVICE_STATUS_UNKNOWN: default: $service_stats[$row['id']]['statusImageHTML'] = 'UNKNOWN status.'; break; } } $data_services = array_values($service_stats); $data = array_merge($data_services, $data_agents, $data_modules); if (empty($data)) { $this->tree = []; 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 ''; } protected function getServiceFavouriteFilter() { if (isset($this->filter['is_favourite']) && !empty($this->filter['is_favourite'])) { return ' AND is_favourite = 1'; } return ''; } }