'noaccess']); } include 'general/noaccess.php'; exit; } // Pure variable for full screen selection. $this->pure = $config['pure']; // Id user. $this->idUser = $config['id_user']; // Refresh rate. $this->refreshSelectedRate = (string) get_parameter('refresh-rate', '30'); // Show Modules without alerts table. $this->showWithoutAlertModules = isset($_POST['show-modules-without-alerts']); // Selected group. $this->groupId = (int) get_parameter('group-id', 0); // Create alert token. $this->createAlert = (int) get_parameter('create_alert', 0); // Offset and hor-offset (for pagination). $this->offset = (int) get_parameter('offset', 0); $this->horOffset = (int) get_parameter('hor_offset', 0); return $this; } /** * Run main page. * * @return void */ public function run() { // Javascript. ui_require_jquery_file('pandora'); // Load own javascript file. $this->loadJS(); // CSS. ui_require_css_file('wizard'); ui_require_css_file('discovery'); ui_require_css_file('agent_alerts'); // Update network modules for this group // Check for Network FLAG change request // Made it a subquery, much faster on both the database and server side // TODO. Check if this is used or necessary. if (isset($_GET['update_netgroup']) === true) { $group = get_parameter_get('update_netgroup', 0); if (check_acl($this->idUser, $group, 'AW')) { $where = ['id_agente' => 'ANY(SELECT id_agente FROM tagente WHERE id_grupo = '.$group]; db_process_sql_update('tagente_modulo', ['flag' => 1], $where); } else { db_pandora_audit('ACL Violation', 'Trying to set flag for groups'); include 'general/noaccess.php'; exit; } } // Load the header. $this->loadHeader(); // If the petition wants to create alert. if ($this->createAlert) { $this->createAlertAction(); } if ($this->showWithoutAlertModules === true) { $this->createAlertTable(); } else { $this->loadMainAlertTable(); } } /** * Show alert table. * * @return void */ private function createAlertTable() { $table = new stdClass(); if ($this->groupId > 0) { $grupo = ' AND tagente.id_grupo = '.$this->groupId; } else { $grupo = ''; } $offset_modules = $this->offset; $sql_count = 'SELECT COUNT(tagente_modulo.nombre) FROM tagente_modulo INNER JOIN tagente ON tagente.id_agente = tagente_modulo.id_agente WHERE id_agente_modulo NOT IN (SELECT id_agent_module FROM talert_template_modules)'.$grupo; $count_agent_module = db_get_all_rows_sql($sql_count); $sql = 'SELECT tagente.alias, tagente_modulo.nombre, tagente_modulo.id_agente_modulo FROM tagente_modulo INNER JOIN tagente ON tagente.id_agente = tagente_modulo.id_agente WHERE id_agente_modulo NOT IN (SELECT id_agent_module FROM talert_template_modules) '.$grupo.' LIMIT 20 OFFSET '.$offset_modules; $agent_modules = db_get_all_rows_sql($sql); ui_pagination( $count_agent_module[0]['COUNT(tagente_modulo.nombre)'], ui_get_url_refresh(), 0, 0, false, 'offset', true, '', '', false, 'alerts_modules' ); $table->width = '100%'; $table->class = 'databox data'; $table->id = 'table_agent_module'; $table->data = []; $table->head[0] = __('Agents'); $table->head[1] = __('Modules'); $table->head[2] = __('Actions'); $table->style[0] = 'width: 25%;'; $table->style[1] = 'width: 33%;'; $table->style[2] = 'width: 33%;'; foreach ($agent_modules as $agent_module) { // Let's build the table. $data[0] = io_safe_output($agent_module['alias']); $data[1] = io_safe_output($agent_module['nombre']); $uniqid = $agent_module['id_agente_modulo']; $data[2] = html_print_anchor( [ 'href' => sprintf( 'javascript:show_add_alerts(\'%s\')', $uniqid ), 'content' => html_print_image('images/add_mc.png', true), ], true ); array_push($table->data, $data); $table2 = new stdClass(); $table2->width = '100%'; $table2->id = 'table_add_alert'; $table2->class = 'databox filters'; $table2->data = []; $table2->data[0][0] = __('Actions'); $groups_user = users_get_groups($this->idUser); if (!empty($groups_user)) { $groups = implode(',', array_keys($groups_user)); $sql = sprintf( 'SELECT id, name FROM talert_actions WHERE id_group IN (%s)', $groups ); $actions = db_get_all_rows_sql($sql); } $table2->data[0][1] = html_print_select( index_array($actions, 'id', 'name'), 'action_select', '', '', __('Default action'), '0', true, '', true, '', false, 'width: 250px;' ); $table2->data[0][1] .= ''; // Check ACLs for LM users. if (check_acl($this->idUser, 0, 'LM')) { $table2->data[0][1] .= html_print_anchor( [ 'href' => 'index.php?sec=galertas&sec2=godmode/alerts/configure_alert_action&pure='.$this->pure, 'class' => 'mrgn_lft_5px', 'content' => html_print_image('images/add.png', true).''.__('Create Action').'', ], true ); } $table2->data[1][0] = __('Template'); $own_info = get_user_info($this->idUser); if ($own_info['is_admin'] || check_acl($this->idUser, 0, 'PM')) { $templates = alerts_get_alert_templates(false, ['id', 'name']); } else { $usr_groups = users_get_groups($this->idUser, 'LW', true); $filter_groups = ''; $filter_groups = implode(',', array_keys($usr_groups)); $templates = alerts_get_alert_templates(['id_group IN ('.$filter_groups.')'], ['id', 'name']); } $table2->data[1][1] = html_print_select( index_array($templates, 'id', 'name'), 'template', '', '', __('Select'), 0, true, false, true, '', false, 'width: 250px;' ); $table2->data[1][1] .= html_print_anchor( [ 'href' => '#', 'class' => 'template_details invisible', 'content' => html_print_image('images/zoom.png', true, ['class' => 'img_help']), ], true ); // Check ACLs for LM users. if (check_acl($this->idUser, 0, 'LM')) { $table2->data[1][1] .= html_print_anchor( [ 'href' => 'index.php?sec=galertas&sec2=godmode/alerts/configure_alert_template&pure='.$this->pure, 'style' => 'margin-left:5px;', 'content' => html_print_image('images/add.png', true).''.__('Create Template').'', ], true ); } $table2->data[2][0] = __('Threshold'); $table2->data[2][1] = html_print_input_text('module_action_threshold', '0', '', 5, 7, true); $table2->data[2][1] .= ' '.__('seconds'); $content2 = '
'; $content2 .= html_print_table($table2, true); $content2 .= html_print_div( [ 'class' => 'action-buttons', 'style' => 'width: '.$table2->width, 'content' => html_print_submit_button(__('Add alert'), 'add', false, 'class="sub wand"', true).html_print_input_hidden('create_alert', $uniqid, true), ], true ); $content2 .= '
'; $module_name = ui_print_truncate_text(io_safe_output($agent_module['nombre']), 40, false, true, false, '…', false); html_print_div( [ 'id' => 'add_alerts_dialog_'.$uniqid, 'title' => sprintf( '%s: %s / %s: %s', __('Agent'), $agent_module['alias'], __('Module'), $module_name ), 'style' => 'display:none; height: auto; padding-top: 1.5em;', 'content' => $content2, ] ); } html_print_table($table); } /** * Creation of alerts * * @return void */ private function createAlertAction() { $template2 = get_parameter('template'); $module_action_threshold = get_parameter('module_action_threshold'); $action_select = get_parameter('action_select', 0); $id_alert = alerts_create_alert_agent_module($this->create_alert, $template2); if ($id_alert !== false) { if ($action_select != 0) { $values = []; $values['fires_min'] = 0; $values['fires_max'] = 0; $values['module_action_threshold'] = (int) get_parameter('module_action_threshold'); alerts_add_alert_agent_module_action($id_alert, $action_select, $values); } } } /** * Load the main table. * * @return boolean */ public function loadMainAlertTable() { global $config; $block = 10; $filter = [ 'offset' => (int) $this->offset, 'limit' => (int) $config['block_size'], ]; $filter_count = []; if ($this->groupId > 0) { $filter['id_grupo'] = $this->groupId; $filter_count['id_grupo'] = $this->groupId; } // Get the id of all agents with alerts. $sql = 'SELECT DISTINCT(id_agente) FROM tagente_modulo WHERE id_agente_modulo IN (SELECT id_agent_module FROM talert_template_modules)'; $agents_with_alerts_raw = db_get_all_rows_sql($sql); if ($agents_with_alerts_raw === false) { $agents_with_alerts_raw = []; } $agents_with_alerts = []; foreach ($agents_with_alerts_raw as $awar) { $agents_with_alerts[] = $awar['id_agente']; } $filter['id_agente'] = $agents_with_alerts; $filter_count['id_agente'] = $agents_with_alerts; $agents = agents_get_agents($filter); $nagents = count(agents_get_agents($filter_count)); if ($agents == false) { ui_print_info_message( [ 'no_close' => true, 'message' => __('There are no agents with alerts'), ] ); return false; } $all_alerts = agents_get_alerts_simple(); if ($this->pure == 1) { $block = count($all_alerts); } $templates = []; $agent_alerts = []; foreach ($all_alerts as $alert) { $templates[$alert['id_alert_template']] = ''; $agent_alerts[$alert['agent_name']][$alert['id_alert_template']][] = $alert; } // Prepare pagination. ui_pagination( $nagents, false, 0, $filter['limit'], false, 'offset', true, '', '', [ 'count' => '', 'offset' => 'offset_param', ], 'alerts_agents' ); echo ''; echo ''; echo ''; $templates_raw = []; if (!empty($templates)) { $sql = sprintf( 'SELECT id, name FROM talert_templates WHERE id IN (%s)', implode(',', array_keys($templates)) ); $templates_raw = db_get_all_rows_sql($sql); if (empty($templates_raw)) { $templates_raw = []; } }; $alerts = []; $ntemplates = 0; if ($this->horOffset > 0) { $new_hor_offset = ($this->horOffset - $block); echo "'; } // Dynamic Size. if ($this->pure == 1) { // Count of templates. $templateCount = count($templates_raw); // Define a dynamic size. $thSize = floor(80 / $templateCount).'%'; } else { $thSize = '8%'; } foreach ($templates_raw as $temp) { if (isset($templates[$temp['id']]) && $templates[$temp['id']] == '') { $ntemplates++; if ($ntemplates <= $this->horOffset || $ntemplates > ($this->horOffset + $block)) { continue; } $templates[$temp['id']] = $temp['name']; } } foreach ($templates as $id => $name) { if (empty($name) === false) { $outputLine = html_print_div( [ 'id' => 'line_header_'.$id, 'class' => 'rotate_text_module position_text_module', 'style' => '', 'content' => '
'.ui_print_truncate_text(io_safe_output($name), 20).'
', ], true ); echo sprintf('', $thSize, $outputLine); } } if (($this->horOffset + $block) < $ntemplates) { $new_hor_offset = ($this->horOffset + $block); echo "'; } echo ''; foreach ($agents as $agent) { // Flag for fired alerts. $anyfired = false; // Get aliases. $alias = db_get_row('tagente', 'id_agente', $agent['id_agente']); echo ''; // Name of the agent. echo ''; // Alerts of the agent. foreach ($templates as $tid => $tname) { $anyfired = 0; if ($tname == '') { continue; } echo ''; } echo ''; } echo '
'.__('Agents').' / '.__('Alerts').'"; html_print_anchor( [ 'href' => sprintf( 'index.php?sec=extensions&sec2=extensions/agents_alerts&hor_offset=%s&offset=%s&group-id=%s&pure=%s', $new_hor_offset, $this->offset, $this->groupId, $this->pure ), 'content' => html_print_image( 'images/arrow_left_green.png', true, [ 'style' => 'float: right;', 'title' => __('Previous alerts'), ] ), ] ); echo '%s"; html_print_anchor( [ 'href' => sprintf( 'index.php?sec=extensions&sec2=extensions/agents_alerts&hor_offset=%s&offset=%s&group-id=%s&pure=%s', $new_hor_offset, $this->offset, $this->groupId, $this->pure ), 'content' => html_print_image( 'images/arrow_right_green.png', true, [ 'style' => 'float: right;', 'title' => __('More alerts'), ] ), ] ); echo '
'.$alias['alias'].''; if (isset($agent_alerts[$alias['alias']][$tid])) { foreach ($agent_alerts[$alias['alias']][$tid] as $alert) { if ((int) $alert['times_fired'] > 0) { $anyfired = true; } } if ($anyfired) { $cellstyle = 'background:'.COL_ALERTFIRED.';'; } else { $cellstyle = 'background:'.COL_NORMAL.';'; } $uniqid = uniqid(); html_print_anchor( [ 'href' => sprintf('javascript:show_alerts_details(\'%s\')', $uniqid), 'content' => html_print_div( [ 'id' => 'line_header_'.$temp['id'], 'class' => 'status_rounded_rectangles text_inside', 'style' => $cellstyle, 'content' => count($agent_alerts[$alias['alias']][$tid]), ], true ), ] ); $this->printAlertsSummaryModalWindow($uniqid, $agent_alerts[$alias['alias']][$tid]); } echo '
'; ui_pagination( $nagents, false, 0, 0, false, 'offset', true, 'pagination-bottom', '', [ 'count' => '', 'offset' => 'offset_param', ], 'alerts_agents' ); } /** * Show headers and filters * * @return void */ public function loadHeader() { if ($this->pure == 0) { // Breadcrums. $this->setBreadcrum([]); $this->prepareBreadcrum( [ [ 'link' => '', 'label' => __('Monitoring'), 'selected' => false, ], [ 'link' => '', 'label' => __('Views'), 'selected' => true, ], ], true ); ui_print_page_header( __('Agents/Alerts'), '', false, '', true, '', false, '', GENERIC_SIZE_TEXT, '', $this->printHeader(true) ); } // Start Header form. $headerForm = [ 'action' => ui_get_full_url(), 'id' => 'form-header-filters', 'method' => 'POST', 'class' => 'modal flex flex-row', 'extra' => '', 'onsubmit' => '', ]; $headerInputs = []; $headerInputs[] = [ 'label' => __('Group'), 'id' => 'select-group-id', 'arguments' => [ 'name' => 'group-id', 'type' => 'select_groups', 'input_class' => 'flex-row', 'class' => '', 'privilege' => 'AR', 'nothing' => false, 'selected' => $this->groupId, 'return' => true, 'script' => 'this.form.submit()', 'size' => '100%', ], ]; $headerInputs[] = [ 'label' => __('Show modules without alerts'), 'id' => 'txt-use-agent-ip', 'arguments' => [ 'name' => 'show-modules-without-alerts', 'checked' => $this->showWithoutAlertModules, 'input_class' => 'flex-row', 'type' => 'checkbox', 'class' => '', 'disabled_hidden' => true, 'return' => true, ], ]; if ($this->pure == 0) { $screenSwitchTitle = __('Full screen mode'); $screenSwitchClass = 'pure_full'; $screenSwitchPure = 1; $refreshVisibility = false; } else { $screenSwitchTitle = __('Back to normal mode'); $screenSwitchClass = 'pure_normal'; $screenSwitchPure = 0; $refreshVisibility = true; } $refreshComboRates = [ '30' => __('30 seconds'), (string) SECONDS_1MINUTE => __('1 minute'), (string) SECONDS_2MINUTES => __('2 minutes'), (string) SECONDS_5MINUTES => __('5 minutes'), (string) SECONDS_10MINUTES => __('10 minutes'), ]; $headerInputs[] = [ 'id' => 'pure', 'arguments' => [ 'name' => 'pure', 'type' => 'hidden', 'value' => $this->pure, 'return' => true, ], ]; $headerInputs[] = [ 'label' => __('Full screen'), 'id' => 'img-full-screen', 'surround_start' => '
', 'attributes' => 'style="margin-left: 0px"', 'arguments' => [ 'type' => 'button', 'return' => true, 'name' => 'pure', 'attributes' => 'class="full_screen_button '.$screenSwitchClass.'" title="'.$screenSwitchTitle.'"', ], ]; $headerInputs[] = [ 'label' => __('Refresh'), 'id' => 'slc-refresh-rate', 'class' => ($refreshVisibility === true) ? '' : 'invisible', 'surround_end' => '
', 'arguments' => [ 'name' => 'refresh-rate', 'input_class' => 'flex-row', 'type' => 'select', 'fields' => $refreshComboRates, 'selected' => $this->refreshSelectedRate, 'return' => true, 'script' => 'this.form.submit()', 'sort' => false, ], ]; $filterForm = $this->printForm( [ 'form' => $headerForm, 'inputs' => $headerInputs, true ], true ); // Prints the header controls. $header = html_print_div( [ 'class' => 'white_box agents_alerts_header', 'content' => $filterForm, ], true ); echo $header; } /** * Prints the modal window for summary of each alerts group. * * @param string $id Id of the agent-alert. * @param array $alerts Alerts. * * @return void */ private function printAlertsSummaryModalWindow(string $id, array $alerts) { // Definition of table class. $table = new stdClass(); $table->width = '98%'; $table->class = 'info_table'; $table->data = []; $table->head[0] = __('Module'); $table->head[1] = __('Action'); $table->head[2] = __('Last fired'); $table->head[3] = __('Status'); foreach ($alerts as $alert) { $data[0] = modules_get_agentmodule_name($alert['id_agent_module']); $actions = alerts_get_alert_agent_module_actions($alert['id']); $actionDefault = db_get_value_sql( ' SELECT id_alert_action FROM talert_templates WHERE id = '.$alert['id_alert_template'] ); $actionText = ''; if (!empty($actions)) { $actionText = '
'; } else { if (!empty($actionDefault)) { $actionText = db_get_sql( "SELECT name FROM talert_actions WHERE id = $actionDefault" ).' ('.__('Default').')'; } } $data[1] = $actionText; $data[2] = ui_print_timestamp($alert['last_fired'], true); if ($alert['times_fired'] > 0) { $status = STATUS_ALERT_FIRED; $title = __('Alert fired').' '.$alert['internal_counter'].' '.__('time(s)'); } else if ($alert['disabled'] > 0) { $status = STATUS_ALERT_DISABLED; $title = __('Alert disabled'); } else { $status = STATUS_ALERT_NOT_FIRED; $title = __('Alert not fired'); } $data[3] = ui_print_status_image($status, $title, true); array_push($table->data, $data); } $content = html_print_table($table, true); $agent = modules_get_agentmodule_agent_alias($alerts[0]['id_agent_module']); $template = alerts_get_alert_template_name($alerts[0]['id_alert_template']); // Prints the modal window hidden for default. echo html_print_div( [ 'id' => 'alerts_details_'.$id, 'title' => sprintf( '%s: %s / %s: %s', __('Agent'), $agent, __('Template'), $template ), 'style' => 'display:none;', 'content' => $content, ], true ); } /** * Load the JS. * * @return string Formed string with script. */ public function loadJS() { $str = ''; ob_start(); ?>