<?php // phpcs:disable Squiz.NamingConventions.ValidVariableName.MemberNotCamelCaps /** * Controller for SNMP console * * @category Controller * @package Pandora FMS * @subpackage Community * @version 1.0.0 * @license See below * * ______ ___ _______ _______ ________ * | __ \.-----.--.--.--| |.-----.----.-----. | ___| | | __| * | __/| _ | | _ || _ | _| _ | | ___| |__ | * |___| |___._|__|__|_____||_____|__| |___._| |___| |__|_|__|_______| * * ============================================================================ * Copyright (c) 2005-2023 Pandora FMS * Please see https://pandorafms.com/community/ 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. * ============================================================================ */ use function Composer\Autoload\includeFile; // Begin. global $config; // Necessary classes for extends. require_once $config['homedir'].'/include/class/HTML.class.php'; /** * Class SatelliteAgent */ class SnmpConsole extends HTML { /** * Allowed methods to be called using AJAX request. * * @var array */ public $AJAXMethods = [ 'draw', 'loadModal', 'deleteTrap', 'deleteTraps', 'validateTrap', 'validateTraps', 'showInfo', ]; /** * Ajax page. * * @var string */ private $ajaxController; /** * Filter alert. * * @var integer */ private $filter_alert; /** * Filter severity. * * @var integer */ private $filter_severity; /** * Filter search. * * @var string */ private $filter_free_search; /** * Filter status. * * @var integer */ private $filter_status; /** * Filter group by. * * @var integer */ private $filter_group_by; /** * Filter hours. * * @var integer */ private $filter_hours_ago; /** * Filter trap type. * * @var integer */ private $filter_trap_type; /** * Refresh. * * @var integer */ private $refr; /** * Class constructor * * @param string $ajaxController Ajax controller. */ public function __construct( string $ajaxController, int $filter_alert, int $filter_severity, string $filter_free_search, int $filter_status, int $filter_group_by, int $filter_hours_ago, int $filter_trap_type, int $refr ) { global $config; check_login(); $agent_a = check_acl($config['id_user'], 0, 'AR'); $agent_w = check_acl($config['id_user'], 0, 'AW'); if ($agent_a === false && $agent_w === false) { db_pandora_audit( AUDIT_LOG_ACL_VIOLATION, 'Trying to access SNMP Console' ); include 'general/noaccess.php'; exit; } // Set the ajax controller. $this->ajaxController = $ajaxController; $this->filter_alert = $filter_alert; $this->filter_severity = $filter_severity; $this->filter_free_search = $filter_free_search; $this->filter_status = $filter_status; $this->filter_group_by = $filter_group_by; $this->filter_hours_ago = $filter_hours_ago; $this->filter_trap_type = $filter_trap_type; $this->refr = $refr; } /** * Run view * * @return void */ public function run() { global $config; // Javascript. ui_require_jquery_file('pandora'); // CSS. ui_require_css_file('wizard'); ui_require_css_file('discovery'); $default_refr = 300; $statistics['text'] = '<a href="index.php?sec=estado&sec2=operation/snmpconsole/snmp_statistics&pure='.$config['pure'].'">'.html_print_image( 'images/logs@svg.svg', true, [ 'title' => __('Statistics'), 'class' => 'main_menu_icon invert_filter', ] ).'</a>'; $list['text'] = '<a href="index.php?sec=snmpconsole&sec2=operation/snmpconsole/snmp_view&pure=0">'.html_print_image( 'images/SNMP-network-numeric-data@svg.svg', true, [ 'title' => __('List'), 'class' => 'main_menu_icon invert_filter', ] ).'</a>'; $list['active'] = true; if (isset($screen) === false) { $screen = ''; } // Header. ui_print_standard_header( __('SNMP Console'), 'images/op_snmp.png', false, 'snmp_console', false, [ $screen, $list, $statistics, ], [ [ 'link' => '', 'label' => __('Monitoring'), ], [ 'link' => '', 'label' => __('SNMP'), ], ] ); // Datatables list. try { $checkbox_all = html_print_checkbox( 'all_validate_box', 1, false, true ); $columns = [ 'status', [ 'text' => 'snmp_agent', 'class' => 'snmp-td datos_green', ], [ 'text' => 'enterprise_string', 'class' => 'snmp-td datos_green', ], [ 'text' => 'count', 'class' => 'snmp-td datos_green', ], [ 'text' => 'trap_subtype', 'class' => 'snmp-td datos_green', ], [ 'text' => 'user_id', 'class' => 'snmp-td datos_green', ], [ 'text' => 'timestamp', 'class' => 'snmp-td datos_green', ], 'alert', [ 'text' => 'action', 'class' => 'table_action_buttons w120px', ], [ 'text' => 'm', 'class' => 'mw60px pdd_0px', ], ]; $column_names = [ __('Status'), __('SNMP Agent'), __('Enterprise String'), __('Count'), __('Trap subtype'), __('User ID'), __('Timestamp'), __('Alert'), __('Actions'), [ 'text' => 'm', 'extra' => $checkbox_all, 'class' => 'w20px no-text-imp', ], ]; $show_alerts = [ -1 => __('All'), 0 => __('Not triggered'), 1 => __('Triggered'), ]; $severities = get_priorities(); $severities[-1] = __('All'); $paginations = [ $config['block_size'] => __('Default'), 25 => '25', 50 => '50', 100 => '100', 200 => '200', 500 => '500', ]; $status_array = [ -1 => __('All'), 0 => __('Not validated'), 1 => __('Validated'), ]; $trap_types = [ -1 => __('None'), 0 => __('Cold start (0)'), 1 => __('Warm start (1)'), 2 => __('Link down (2)'), 3 => __('Link up (3)'), 4 => __('Authentication failure (4)'), 5 => __('Other'), ]; $tableId = 'snmp_console'; // Load datatables user interface. ui_print_datatable( [ 'id' => $tableId, 'class' => 'info_table', 'style' => 'width: 100%', 'columns' => $columns, 'column_names' => $column_names, 'ajax_url' => $this->ajaxController, 'ajax_data' => ['method' => 'draw'], 'ajax_postprocces' => 'process_datatables_item(item)', 'search_button_class' => 'sub filter float-right', 'no_sortable_columns' => [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ], 'form' => [ 'class' => 'flex-row', 'inputs' => [ [ 'label' => __('Alert'), 'type' => 'select', 'id' => 'filter_alert', 'input_class' => 'filter_input_datatable', 'name' => 'filter_alert', 'fields' => $show_alerts, 'return' => true, 'selected' => $this->filter_alert, 'style' => 'widht:100% !important', ], [ 'label' => __('Severity'), 'type' => 'select', 'id' => 'filter_severity', 'input_class' => 'filter_input_datatable', 'name' => 'filter_severity', 'fields' => $severities, 'return' => true, 'selected' => $this->filter_severity, 'style' => 'widht:100%', ], [ 'label' => __('Free search'), 'type' => 'text', 'id' => 'filter_free_search', 'input_class' => 'filter_input_datatable', 'name' => 'filter_free_search', 'value' => $this->filter_free_search, ], [ 'label' => __('Status'), 'type' => 'select', 'id' => 'filter_status', 'input_class' => 'filter_input_datatable', 'name' => 'filter_status', 'fields' => $status_array, 'return' => true, 'selected' => $this->filter_status, 'style' => 'widht:100%', ], [ 'label' => __('Group by Enterprise String/IP'), 'type' => 'select', 'name' => 'filter_group_by', 'selected' => $this->filter_group_by, 'disabled' => false, 'return' => true, 'id' => 'filter_group_by', 'input_class' => 'filter_input_datatable', 'fields' => [ 0 => __('No'), 1 => __('Yes'), ], ], [ 'label' => __('Max. hours old'), 'type' => 'text', 'id' => 'filter_hours_ago', 'input_class' => 'filter_input_datatable', 'name' => 'filter_hours_ago', 'value' => $this->filter_hours_ago, ], [ 'label' => __('Trap type'), 'type' => 'select', 'id' => 'filter_trap_type', 'input_class' => 'filter_input_datatable', 'name' => 'filter_trap_type', 'fields' => $trap_types, 'return' => true, 'selected' => $this->filter_trap_type, ], ], ], 'pagination_options' => [ [ $config['block_size'], 5, 10, 25, 100, 200, 500, 1000, ], [ $config['block_size'], 5, 10, 25, 100, 200, 500, 1000, ], ], 'filter_main_class' => 'box-flat white_table_graph fixed_filter_bar', ] ); } catch (Exception $e) { echo $e->getMessage(); } $buttons[] = html_print_submit_button( __('Validate'), 'updatebt', false, [ 'class' => 'sub ok', 'icon' => 'next', ], true ); $buttons[] = html_print_submit_button( __('Delete'), 'deletebt', false, [ 'icon' => 'delete', 'mode' => 'secondary', 'onClick' => "javascript:return confirm('".__('Are you sure?')."')", ], true ); html_print_action_buttons( implode('', $buttons), ['type' => 'form_action'] ); $legend = '<table id="legend_snmp_browser"class="w100p"><td><div class="snmp_view_div w100p legend_white">'; $legend .= '<h3 style="position: relative;left: 50%;">'.__('Severity').'</h3>'; $legend .= '<div class="display-flex"><div class="flex-50">'; $priorities = get_priorities(); $half = (count($priorities) / 2); $count = 0; foreach ($priorities as $num => $name) { if ($count == $half) { $legend .= '</div><div class="mrgn_lft_5px flex-50">'; } $legend .= '<span class="'.get_priority_class($num).'">'.$name.'</span>'; $legend .= '<br />'; $count++; } $legend .= '</div></div></div></td>'; $legend .= '<td><div class="snmp_view_div">'; $legend .= '<h3>'.__('Status').'</h3>'; $legend .= '<span class="datos_green">'.__('Validated').'</span>'; $legend .= '<br />'; $legend .= '<span class="datos_red">'.__('Not validated').'</span>'; $legend .= '</div></td>'; $legend .= '<td><div class="snmp_view_div">'; $legend .= '<h3>'.__('Alert').'</h3>'; $legend .= '<span class="datos_yellow">'.__('Alert').'</span>'; $legend .= '<br />'; $legend .= '<span class="datos_grey">'.__('Not fired').'</span>'; $legend .= '</div></td>'; $legend .= '<td><div class="snmp_view_div">'; $legend .= '<h3>'.__('Action').'</h3>'; $legend .= '<div style=" display : flex;align-items : center;">'; $legend .= html_print_image('images/validate.svg', true, ['class' => 'main_menu_icon invert_filter']).' - '.__('Validate'); $legend .= '</div>'; $legend .= '<br />'; $legend .= '<div style=" display : flex;align-items : center;">'; $legend .= html_print_image('images/delete.svg', true, ['class' => 'main_menu_icon invert_filter']).' - '.__('Delete'); $legend .= '</div>'; $legend .= '</div></div></td>'; echo '<br>'; ui_toggle($legend, __('Legend')); // Load own javascript file. echo $this->loadJS(); } /** * Get the data for draw the table. * * @return void. */ public function draw() { global $config; // Init data. $data = []; // Count of total records. $count = 0; // Catch post parameters. $start = get_parameter('start', 0); $length = get_parameter('length', $config['block_size']); // There is a limit of (2^32)^2 (18446744073709551615) rows in a MyISAM table, show for show all use max nrows. $length = ($length != '-1') ? $length : '18446744073709551615'; $order = get_datatable_order(true); $filters = get_parameter('filter', []); // Build ranges. $now_timestamp = time(); $interval_seconds = ($filters['filter_hours_ago'] * 3600); $ago_timestamp = ($now_timestamp - $interval_seconds); // Build ranges. $now = new DateTime(); $ago = new DateTime(); $interval = new DateInterval(sprintf('PT%dH', $filters['filter_hours_ago'])); $ago->sub($interval); $date_from_trap = $ago->format('Y/m/d'); $date_to_trap = $now->format('Y/m/d'); $time_from_trap = $ago->format('H:i:s'); $time_to_trap = $now->format('H:i:s'); try { ob_start(); $data = []; $user_groups = users_get_groups($config['id_user'], 'AR', false); $prea = array_keys($user_groups); $ids = join(',', $prea); $user_in_group_wo_agents = db_get_value_sql('select count(DISTINCT(id_usuario)) from tusuario_perfil where id_usuario ="'.$config['id_user'].'" and id_perfil = 1 and id_grupo in (select id_grupo from tgrupo where id_grupo in ('.$ids.') and id_grupo not in (select id_grupo from tagente))'); if ($user_in_group_wo_agents == 0) { $rows = db_get_all_rows_filter( 'tagente', ['id_grupo' => array_keys($user_groups)], ['id_agente'] ); $id_agents = []; foreach ($rows as $row) { $id_agents[] = $row['id_agente']; } if (!empty($id_agents)) { $address_by_user_groups = agents_get_addresses($id_agents); foreach ($address_by_user_groups as $i => $a) { $address_by_user_groups[$i] = '"'.$a.'"'; } } } else { $rows = db_get_all_rows_filter( 'tagente', [], ['id_agente'] ); $id_agents = []; foreach ($rows as $row) { $id_agents[] = $row['id_agente']; } $all_address_agents = agents_get_addresses($id_agents); foreach ($all_address_agents as $i => $a) { $all_address_agents[$i] = '"'.$a.'"'; } } if (empty($address_by_user_groups)) { $address_by_user_groups = []; array_unshift($address_by_user_groups, '""'); } if (empty($all_address_agents)) { $all_address_agents = []; array_unshift($all_address_agents, '""'); } $sql = 'SELECT * FROM ttrap WHERE ( `source` IN ('.implode(',', $address_by_user_groups).") OR `source`='' OR `source` NOT IN (".implode(',', $all_address_agents).') ) %s ORDER BY timestamp DESC LIMIT %d,%d'; $whereSubquery = ''; if ($filters['filter_alert'] != -1) { $whereSubquery .= ' AND alerted = '.$filters['filter_alert']; } if ($filters['filter_severity'] != -1) { // There are two special severity values aimed to match two different trap standard severities // in database: warning/critical and critical/normal. if ($filters['filter_severity'] != EVENT_CRIT_OR_NORMAL && $filters['filter_severity'] != EVENT_CRIT_WARNING_OR_CRITICAL ) { // Test if enterprise is installed to search oid in text or oid field in ttrap. if ($config['enterprise_installed']) { $whereSubquery .= ' AND ( (alerted = 0 AND severity = '.$filters['filter_severity'].') OR (alerted = 1 AND priority = '.$filters['filter_severity'].'))'; } else { $whereSubquery .= ' AND ( (alerted = 0 AND 1 = '.$filters['filter_severity'].') OR (alerted = 1 AND priority = '.$filters['filter_severity'].'))'; } } else if ($filters['filter_severity'] === EVENT_CRIT_WARNING_OR_CRITICAL) { // Test if enterprise is installed to search oid in text or oid field in ttrap. if ($config['enterprise_installed']) { $whereSubquery .= ' AND ( (alerted = 0 AND (severity = '.EVENT_CRIT_WARNING.' OR severity = '.EVENT_CRIT_CRITICAL.')) OR (alerted = 1 AND (priority = '.EVENT_CRIT_WARNING.' OR priority = '.EVENT_CRIT_CRITICAL.')))'; } else { $whereSubquery .= ' AND ( (alerted = 1 AND (priority = '.EVENT_CRIT_WARNING.' OR priority = '.EVENT_CRIT_CRITICAL.')))'; } } else if ($filters['filter_severity'] === EVENT_CRIT_OR_NORMAL) { // Test if enterprise is installed to search oid in text or oid field in ttrap. if ($config['enterprise_installed']) { $whereSubquery .= ' AND ( (alerted = 0 AND (severity = '.EVENT_CRIT_NORMAL.' OR severity = '.EVENT_CRIT_CRITICAL.')) OR (alerted = 1 AND (priority = '.EVENT_CRIT_NORMAL.' OR priority = '.EVENT_CRIT_CRITICAL.')))'; } else { $whereSubquery .= ' AND ( (alerted = 1 AND (priority = '.EVENT_CRIT_NORMAL.' OR priority = '.EVENT_CRIT_CRITICAL.')))'; } } } if ($filters['filter_free_search'] !== '') { $free_search_str = io_safe_output($filters['filter_free_search']); $whereSubquery .= ' AND (source LIKE "%'.$free_search_str.'%" OR oid LIKE "%'.$free_search_str.'%" OR oid_custom LIKE "%'.$free_search_str.'%" OR type_custom LIKE "%'.$free_search_str.'%" OR value LIKE "%'.$free_search_str.'%" OR value_custom LIKE "%'.$free_search_str.'%" OR id_usuario LIKE "%'.$free_search_str.'%" OR text LIKE "%'.$free_search_str.'%" OR description LIKE "%'.$free_search_str.'%")'; } if ($filters['filter_status'] != -1) { $whereSubquery .= ' AND status = '.$filters['filter_status']; } if ($date_from_trap != '') { if ($time_from_trap != '') { $whereSubquery .= ' AND (utimestamp > '.$ago_timestamp.') '; } else { $whereSubquery .= ' AND (UNIX_TIMESTAMP(timestamp) > UNIX_TIMESTAMP("'.$date_from_trap.' 23:59:59")) '; } } if ($date_to_trap != '') { if ($time_to_trap) { $whereSubquery .= ' AND (utimestamp < '.$now_timestamp.') '; } else { $whereSubquery .= ' AND (UNIX_TIMESTAMP(timestamp) < UNIX_TIMESTAMP("'.$date_to_trap.' 23:59:59")) '; } } if ($filters['filter_trap_type'] == 5) { $whereSubquery .= ' AND type NOT IN (0, 1, 2, 3, 4)'; } else if ($filters['filter_trap_type'] != -1) { $whereSubquery .= ' AND type = '.$filters['filter_trap_type']; } if ($filters['filter_group_by']) { $where_without_group = $whereSubquery; $whereSubquery .= ' GROUP BY source,oid'; } $sql = sprintf($sql, $whereSubquery, $start, $length); $sql_count = 'SELECT COUNT(id_trap) FROM ttrap WHERE ( source IN ('.implode(',', $address_by_user_groups).") OR source='' OR source NOT IN (".implode(',', $all_address_agents).') ) %s'; $sql_count = sprintf($sql_count, $whereSubquery); $traps = db_get_all_rows_sql($sql, true); $total = (int) db_get_value_sql($sql_count, false, false); if (empty($traps) === false) { $data = $traps; $data = array_reduce( $data, function ($carry, $item) use ($filters, $where_without_group) { global $config; if (empty($carry) === true) { $count = 0; } else { $count = count($carry); } // Transforms array of arrays $data into an array // of objects, making a post-process of certain fields. $tmp = (object) $item; $severity_class = get_priority_class($tmp->severity); $status = $tmp->status; // Status. if ($status == 0) { $tmp->status = html_print_image( 'images/pixel_red.png', true, [ 'title' => __('Not validated'), 'width' => '20', 'height' => '20', ] ); } else { $tmp->status = html_print_image( 'images/pixel_green.png', true, [ 'title' => __('Validated'), 'width' => '20', 'height' => '20', ] ); } // SNMP Agent. $agent = agents_get_agent_with_ip($tmp->source); if ($agent === false) { $tmp->snmp_agent .= '<a href="index.php?sec=estado&sec2=godmode/agentes/configurar_agente&new_agent=1&direccion='.$tmp->source.'" title="'.__('Create agent').'">'.$tmp->source.'</a>'; } else { $tmp->snmp_agent .= '<div class="'.$severity_class.' snmp-div"><a href="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente='.$agent['id_agente'].'" title="'.__('View agent details').'">'; $tmp->snmp_agent .= '<strong>'.$agent['alias'].ui_print_help_tip($tmp->source, true); '</strong></a></div>'; } // Enterprise string. if (empty($tmp->text) === false) { $enterprise_string = $tmp->text; } else if (empty($tmp->oid) === false) { $enterprise_string = $tmp->oid; } else { $enterprise_string = __('N/A'); } $tmp->enterprise_string = '<div class="'.$severity_class.' snmp-div"><a href="javascript: toggleVisibleExtendedInfo('.$tmp->id_trap.','.$count.');">'.$enterprise_string.'</a></div>'; // Count. if ($filters['filter_group_by']) { $sql = 'SELECT count(*) FROM ttrap WHERE 1=1 '.$where_without_group.' AND oid="'.$tmp->oid.'" AND source="'.$tmp->source.'"'; $group_traps = db_get_value_sql($sql); $tmp->count = '<div class="'.$severity_class.' snmp-div">'.$group_traps.'</div>'; } // Trap subtype. $tmp->trap_subtype = '<div class="'.$severity_class.' snmp-div">'; if (empty($tmp->value) === true) { $tmp->trap_subtype .= __('N/A'); } else { $tmp->trap_subtype .= ui_print_truncate_text($tmp->value, GENERIC_SIZE_TEXT, false); } $tmp->trap_subtype .= '</div>'; // User ID. $tmp->user_id = '<div class="'.$severity_class.' snmp-div">'; if (empty($status) === false) { $tmp->user_id .= '<a href="index.php?sec=workspace&sec2=operation/users/user_edit&ver='.$tmp->id_usuario.'">'.substr($tmp->id_usuario, 0, 8).'</a>'; if (!empty($tmp->id_usuario)) { $tmp->user_id .= ui_print_help_tip(get_user_fullname($tmp->id_usuario), true); } } else { $tmp->user_id .= '--'; } $tmp->user_id .= '</div>'; // Timestamp. $timestamp = $tmp->timestamp; $tmp->timestamp = '<div class="'.$severity_class.' snmp-div">'; $tmp->timestamp .= '<span title="'.$timestamp.'">'; $tmp->timestamp .= ui_print_timestamp($timestamp, true); $tmp->timestamp .= '</span></div>'; // Use alert severity if fired. if (empty($tmp->alerted) === false) { $tmp->alert = html_print_image('images/pixel_yellow.png', true, ['width' => '20', 'height' => '20', 'border' => '0', 'title' => __('Alert fired')]); } else { $tmp->alert = html_print_image('images/pixel_gray.png', true, ['width' => '20', 'height' => '20', 'border' => '0', 'title' => __('Alert not fired')]); } // Actions. $tmp->action = ''; if ($status != 1) { $tmp->action .= '<a href="#">'.html_print_image( 'images/validate.svg', true, [ 'border' => '0', 'title' => __('Validate'), 'onclick' => 'validate_trap(\''.$tmp->id_trap.'\')', 'class' => 'invert_filter main_menu_icon', ] ).'</a> '; } if ($tmp->source === '') { if (\users_is_admin()) { $tmp->action .= '<a href="#">'.html_print_image( 'images/delete.svg', true, [ 'border' => '0', 'title' => __('Delete'), 'class' => 'invert_filter main_menu_icon', 'onclick' => 'delete_trap(\''.$tmp->id_trap.'\')', ] ).'</a> '; } } else { $tmp->action .= '<a href="#">'.html_print_image( 'images/delete.svg', true, [ 'border' => '0', 'title' => __('Delete'), 'class' => 'invert_filter main_menu_icon', 'onclick' => 'delete_trap(\''.$tmp->id_trap.'\')', ] ).'</a> '; } $tmp->action .= '<a id="eye_'.$tmp->id_trap.'" data-show="show" href="javascript: toggleVisibleExtendedInfo('.$tmp->id_trap.','.$count.');">'.html_print_image( 'images/see-details@svg.svg', true, [ 'id' => 'img_'.$tmp->id_trap, 'alt' => __('Show more'), 'title' => __('Show more'), 'class' => 'invert_filter main_menu_icon', ] ).' '.html_print_image( 'images/disable.svg', true, [ 'id' => 'img_hide_'.$tmp->id_trap, 'alt' => __('Hide details'), 'title' => __('Hide details'), 'class' => 'invert_filter main_menu_icon', 'style' => 'display:none', ] ).'</a>'; if ($config['enterprise_installed']) { $tmp->action .= '<a href="index.php?sec=snmpconsole&sec2=enterprise/godmode/snmpconsole/snmp_trap_editor_form&id='.$tmp->id_trap.'&oid='.$tmp->oid.'&custom_oid='.urlencode($tmp->oid_custom).'&severity='.$tmp->severity.'&text='.io_safe_input($tmp->text).'&description='.io_safe_input($tmp->description, ENT_QUOTES).'" title="'.io_safe_input($tmp->description, ENT_QUOTES).'">'; $tmp->action .= html_print_image( 'images/edit.svg', true, [ 'alt' => __('SNMP trap editor'), 'title' => __('SNMP trap editor'), 'class' => 'main_menu_icon invert_filter', ] ); $tmp->action .= '</a>'; } $tmp->m = html_print_checkbox_extended('snmptrapid[]', $tmp->id_trap, false, false, '', 'class="chk"', true); $carry[] = $tmp; return $carry; }, ); } if (empty($data) === true) { $total = 0; $data = []; } echo json_encode( [ 'data' => $data, 'recordsTotal' => $total, 'recordsFiltered' => $total, ] ); // Capture output. $response = ob_get_clean(); } catch (Exception $e) { echo json_encode(['error' => $e->getMessage()]); exit; } // If not valid, show error with issue. json_decode($response); if (json_last_error() === JSON_ERROR_NONE) { // If valid dump. echo $response; } else { echo json_encode( ['error' => $response] ); } exit; } /** * Checks if target method is available to be called using AJAX. * * @param string $method Target method. * * @return boolean True allowed, false not. */ public function ajaxMethod(string $method) { return in_array($method, $this->AJAXMethods); } /** * Delete snmp trap. * * @return void */ public function deleteTrap() { $id_trap = get_parameter('id', 0); $group_by = (bool) get_parameter('group_by', 0); if ($id_trap > 0) { if ($group_by === true) { $sql_ids_traps = 'SELECT id_trap, source FROM ttrap WHERE oid IN (SELECT oid FROM ttrap WHERE id_trap = '.$id_trap.') AND source IN (SELECT source FROM ttrap WHERE id_trap = '.$id_trap.')'; $ids_traps = db_get_all_rows_sql($sql_ids_traps); foreach ($ids_traps as $key => $value) { $result = db_process_sql_delete('ttrap', ['id_trap' => $value['id_trap']]); enterprise_hook('snmp_update_forwarded_modules', [$value]); } } else { $forward_info = db_get_row('ttrap', 'id_trap', $id_trap); $result = db_process_sql_delete('ttrap', ['id_trap' => $id_trap]); enterprise_hook('snmp_update_forwarded_modules', [$forward_info]); } } } /** * Delete snmp traps. * * @return void */ public function deleteTraps() { $ids = get_parameter('ids', []); $group_by = (bool) get_parameter('group_by', false); if (empty($ids) === false) { $string_ids = implode(',', $ids); if ($group_by === true) { $sql_ids_traps = 'SELECT id_trap, source FROM ttrap WHERE oid IN (SELECT oid FROM ttrap WHERE id_trap IN ('.$string_ids.')) AND source IN (SELECT source FROM ttrap WHERE id_trap IN ('.$string_ids.'))'; $ids_traps = db_get_all_rows_sql($sql_ids_traps); $array = array_column($ids_traps, 'id_trap'); $delete = sprintf( 'DELETE FROM `ttrap` WHERE id_trap IN (%s)', implode(',', $array), ); db_process_sql($delete); foreach ($ids_traps as $key => $value) { enterprise_hook('snmp_update_forwarded_modules', [$value]); } } else { $delete = sprintf( 'DELETE FROM `ttrap` WHERE id_trap IN (%s)', $string_ids, ); db_process_sql($delete); foreach ($ids as $id_trap) { enterprise_hook('snmp_update_forwarded_modules', [$id_trap]); } } } } /** * Validate snmp trap. * * @return void */ public function validateTrap() { global $config; $id_trap = get_parameter('id', 0); $values = [ 'status' => 1, 'id_usuario' => $config['id_user'], ]; $result = db_process_sql_update('ttrap', $values, ['id_trap' => $id_trap]); enterprise_hook('snmp_update_forwarded_modules', [$id_trap]); } /** * Validate snmp traps. * * @return void */ public function validateTraps() { global $config; $ids = get_parameter('ids', []); if (empty($ids) === false) { $update = sprintf( 'UPDATE ttrap SET `status` = 1, `id_usuario` = "%s" WHERE id_trap IN (%s)', $config['id_user'], implode(',', $ids) ); db_process_sql($update); foreach ($ids as $id_trap) { enterprise_hook('snmp_update_forwarded_modules', [$id_trap]); } } } /** * VShow info trap. * * @return void */ public function showInfo() { global $config; $id_trap = get_parameter('id', 0); $group_by = get_parameter('group_by', 0); $alert = get_parameter('alert', -1); $severity = get_parameter('severity', -1); $search = get_parameter('search', ''); $status = get_parameter('status', 0); $hours_ago = get_parameter('hours_ago', 8); $trap_type = get_parameter('trap_type', -1); $trap = db_get_row('ttrap', 'id_trap', $id_trap); if ($group_by) { $now = new DateTime(); $ago = new DateTime(); $interval = new DateInterval(sprintf('PT%dH', $hours_ago)); $ago->sub($interval); $date_from_trap = $ago->format('Y/m/d'); $date_to_trap = $now->format('Y/m/d'); $time_from_trap = $ago->format('H:i:s'); $time_to_trap = $now->format('H:i:s'); $whereSubquery = ''; if ($alert != -1) { $whereSubquery .= ' AND alerted = '.$$alert; } if ($severity != -1) { // There are two special severity values aimed to match two different trap standard severities // in database: warning/critical and critical/normal. if ($severity != EVENT_CRIT_OR_NORMAL && $severity != EVENT_CRIT_WARNING_OR_CRITICAL ) { // Test if enterprise is installed to search oid in text or oid field in ttrap. if ($config['enterprise_installed']) { $whereSubquery .= ' AND ( (alerted = 0 AND severity = '.$severity.') OR (alerted = 1 AND priority = '.$severity.'))'; } else { $whereSubquery .= ' AND ( (alerted = 0 AND 1 = '.$severity.') OR (alerted = 1 AND priority = '.$severity.'))'; } } else if ($severity === EVENT_CRIT_WARNING_OR_CRITICAL) { // Test if enterprise is installed to search oid in text or oid field in ttrap. if ($config['enterprise_installed']) { $whereSubquery .= ' AND ( (alerted = 0 AND (severity = '.EVENT_CRIT_WARNING.' OR severity = '.EVENT_CRIT_CRITICAL.')) OR (alerted = 1 AND (priority = '.EVENT_CRIT_WARNING.' OR priority = '.EVENT_CRIT_CRITICAL.')))'; } else { $whereSubquery .= ' AND ( (alerted = 1 AND (priority = '.EVENT_CRIT_WARNING.' OR priority = '.EVENT_CRIT_CRITICAL.')))'; } } else if ($severity === EVENT_CRIT_OR_NORMAL) { // Test if enterprise is installed to search oid in text or oid field in ttrap. if ($config['enterprise_installed']) { $whereSubquery .= ' AND ( (alerted = 0 AND (severity = '.EVENT_CRIT_NORMAL.' OR severity = '.EVENT_CRIT_CRITICAL.')) OR (alerted = 1 AND (priority = '.EVENT_CRIT_NORMAL.' OR priority = '.EVENT_CRIT_CRITICAL.')))'; } else { $whereSubquery .= ' AND ( (alerted = 1 AND (priority = '.EVENT_CRIT_NORMAL.' OR priority = '.EVENT_CRIT_CRITICAL.')))'; } } } if ($search !== '') { $whereSubquery .= ' AND (source LIKE "%'.$search.'%" OR oid LIKE "%'.$search.'%" OR oid_custom LIKE "%'.$search.'%" OR type_custom LIKE "%'.$search.'%" OR value LIKE "%'.$search.'%" OR value_custom LIKE "%'.$search.'%" OR id_usuario LIKE "%'.$search.'%" OR text LIKE "%'.$search.'%" OR description LIKE "%'.$search.'%")'; } if ($status != -1) { $whereSubquery .= ' AND status = '.$status; } if ($date_from_trap != '') { if ($time_from_trap != '') { $whereSubquery .= ' AND (UNIX_TIMESTAMP(timestamp) > UNIX_TIMESTAMP("'.$date_from_trap.' '.$time_from_trap.'")) '; } else { $whereSubquery .= ' AND (UNIX_TIMESTAMP(timestamp) > UNIX_TIMESTAMP("'.$date_from_trap.' 23:59:59")) '; } } if ($date_to_trap != '') { if ($time_to_trap) { $whereSubquery .= ' AND (UNIX_TIMESTAMP(timestamp) < UNIX_TIMESTAMP("'.$date_to_trap.' '.$time_to_trap.'")) '; } else { $whereSubquery .= ' AND (UNIX_TIMESTAMP(timestamp) < UNIX_TIMESTAMP("'.$date_to_trap.' 23:59:59")) '; } } if ($trap_type == 5) { $whereSubquery .= ' AND type NOT IN (0, 1, 2, 3, 4)'; } else if ($trap_type != -1) { $whereSubquery .= ' AND type = '.$trap_type; } $sql = 'SELECT * FROM ttrap WHERE 1=1 '.$whereSubquery.' AND oid="'.$trap['oid'].'" AND source="'.$trap['source'].'"'; $group_traps = db_get_all_rows_sql($sql); $count_group_traps = count($group_traps); $sql = 'SELECT timestamp FROM ttrap WHERE 1=1 '.$whereSubquery.' AND oid="'.$trap['oid'].'" AND source="'.$trap['source'].'" ORDER BY `timestamp` DESC'; $last_trap = db_get_value_sql($sql); $sql = 'SELECT timestamp FROM ttrap WHERE 1=1 '.$whereSubquery.' AND oid="'.$trap['oid'].'" AND source="'.$trap['source'].'" ORDER BY `timestamp` ASC'; $first_trap = db_get_value_sql($sql); $trap['count'] = $count_group_traps; $trap['first'] = $first_trap; $trap['last'] = $last_trap; } echo json_encode($trap); return; } /** * Load Javascript code. * * @return string. */ public function loadJS() { // Nothing for this moment. ob_start(); // Javascript content. ?> <script type="text/javascript"> /** * Delete selected snmp trap */ function delete_trap(id) { if (confirm('<?php echo __('Are you sure?'); ?>')) { $.ajax({ method: 'post', url: '<?php echo ui_get_full_url('ajax.php', false, false, false); ?>', data: { page: 'operation/snmpconsole/snmp_view', method: 'deleteTrap', id: id, group_by: $('#filter_group_by').val(), }, datatype: "json", success: function(data) { var dt_snmp = $("#snmp_console").DataTable(); dt_snmp.draw(); }, error: function(e) { console.error(e); } }); } } /** * Validated selected snmp trap */ function validate_trap(id) { if (confirm('<?php echo __('Are you sure?'); ?>')) { $.ajax({ method: 'post', url: '<?php echo ui_get_full_url('ajax.php', false, false, false); ?>', data: { page: 'operation/snmpconsole/snmp_view', method: 'validateTrap', id: id, }, datatype: "json", success: function(data) { var dt_snmp = $("#snmp_console").DataTable(); dt_snmp.draw(); }, error: function(e) { console.error(e); } }); } } function fullscreen(pure) { let new_url = 'index.php?sec=snmpconsole&sec2=operation/snmpconsole/snmp_view&pure='+pure; new_url += '&filter_severity='+$('#filter_severity').val(); new_url += '&filter_status='+$('#filter_status').val(); new_url += '&filter_alert='+$('#filter_alert').val(); new_url += '&filter_group_by=0&filter_free_search='+$('#text-filter_free_search').val(); new_url += '&filter_hours_ago='+$('#text-filter_hours_ago').val(); new_url += '&filter_trap_type='+$('#filter_trap_type').val(); window.location.href = new_url; } /** * Show more information */ function toggleVisibleExtendedInfo(id, position) { var status = $('#eye_'+id).attr('data-show'); if(status == "show"){ $.ajax({ method: 'get', url: '<?php echo ui_get_full_url('ajax.php', false, false, false); ?>', data: { page: 'operation/snmpconsole/snmp_view', method: 'showInfo', id: id, group_by : $('#filter_group_by').val(), alert: $('#filter_alert').val(), severity: $('#filter_severity').val(), search: $('#text-filter_free_search').val(), status: $('#filter_status').val(), hours_ago: $('#text-filter_hours_ago').val(), trap_type: $('#filter_trap_type').val() }, datatype: "json", success: function(data) { let trap = JSON.parse(data); var tr = $('#snmp_console tr:not([id^="show_"])').eq(position+1); // Count. if ($('#filter_group_by').val() == 1) { let labelCount = '<td align="left" valign="top"><b><?php echo __('Count:'); ?></b></br><b><?php echo __('First trap:'); ?></b></br><b><?php echo __('Last trap:'); ?></td>'; let variableCount = `<td align="left" valign="top" style="line-height: 16pt">${trap['count']}</br>${trap['first']}</br>${trap['last']}</td>`; tr.after(`<tr id="show_${id}" role="row">${labelCount}${variableCount}</tr>`); } // Type. desc_trap_type = "<?php echo __('Other'); ?>"; switch (trap['type']) { case -1: desc_trap_type = "<?php echo __('None'); ?>"; break; case 0: desc_trap_type = "<?php echo __('Cold start (0)'); ?>"; break; case 1: desc_trap_type = "<?php echo __('Warm start (1)'); ?>"; break; case 2: desc_trap_type = "<?php echo __('Link down (2)'); ?>"; break; case 3: desc_trap_type = "<?php echo __('Link up (3)'); ?>"; break; case 4: desc_trap_type = "<?php echo __('Authentication failure (4)'); ?>"; break; default: desc_trap_type = "<?php echo __('Other'); ?>"; break; } let labelType = '<td align="left" valign="top"><b><?php echo __('Type:'); ?></td>'; let variableType = `<td align="left" colspan="8">${desc_trap_type}</td>`; tr.after(`<tr id="show_${id}" role="row">${labelType}${variableType}</tr>`); // Description. if (trap['description']) { let labelDesc = '<td align="left" valign="top"><b><?php echo __('Description:'); ?></td>'; let variableDesc = `<td align="left" colspan="8">${trap['description']}</td>`; tr.after(`<tr id="show_${id}" role="row">${labelDesc}${variableDesc}</tr>`); } // Enterprise String. let labelOid = '<td align="left" valign="top"><b><?php echo __('Enterprise String:'); ?></td>'; let variableOId = `<td align="left" colspan="8">${trap['oid']}</td>`; tr.after(`<tr id="show_${id}" role="row">${labelOid}${variableOId}</tr>`); // Variable bindings. let labelBindings = ''; let variableBindings = ''; if ($('#filter_group_by').val() == 1) { labelBindings = '<td align="left" valign="top" ><b><?php echo __('Variable bindings:'); ?></b></td>'; let new_url = 'index.php?sec=snmpconsole&sec2=operation/snmpconsole/snmp_view'; new_url += '&filter_severity='+$('#filter_severity').val(); new_url += '&filter_status='+$('#filter_status').val(); new_url += '&filter_alert='+$('#filter_alert').val(); new_url += '&filter_group_by=0&filter_free_search='+$('#text-filter_free_search').val(); new_url += '&filter_hours_ago='+$('#text-filter_hours_ago').val(); new_url += '&filter_trap_type='+$('#filter_trap_type').val(); const string = '<a href="'+new_url+'"><?php echo __('See more details'); ?></a>'; variableBindings = `<td align="left" colspan="8">${string}</td>`; } else { labelBindings = '<td align="left" valign="top" ><b><?php echo __('Variable bindings:'); ?></b></td>'; const binding_vars = trap['oid_custom'].split("\t"); let string = ''; binding_vars.forEach(function(oid) { string += oid+'<br/>'; }); variableBindings = `<td align="left" colspan="8" class="break-word w200px">${string}</td>`; } tr.after(`<tr id="show_${id}" role="row">${labelBindings}${variableBindings}</tr>`); }, error: function(e) { console.error(e); } }); $('#eye_'+id).attr('data-show', 'hide'); $('#img_'+id).hide(); $('#img_hide_'+id).show(); } else{ $(`tr#show_${id}`).remove(); $('#eye_'+id).attr('data-show', 'show'); $('#img_'+id).show(); $('#img_hide_'+id).hide(); } } $(document).ready(function() { var table = $('#snmp_console').DataTable(); const column = table.column(3); column.visible(false); $('#form_snmp_console_search_bt').click(function() { if ($('#filter_group_by').val() == 1) { column.visible(true); } else { column.visible(false); } }); $('#button-updatebt').click(function() { let array = []; $('input[name="snmptrapid[]"]:checked').each(function() { array.push(this.value); }); if (array.length > 0) { $.ajax({ method: 'post', url: '<?php echo ui_get_full_url('ajax.php', false, false, false); ?>', data: { page: 'operation/snmpconsole/snmp_view', method: 'validateTraps', ids: array, }, datatype: "json", success: function(data) { var dt_snmp = $("#snmp_console").DataTable(); dt_snmp.draw(); }, error: function(e) { console.error(e); } }); } }); $('#button-deletebt').click(function() { let array = []; $('input[name="snmptrapid[]"]:checked').each(function() { array.push(this.value); }); if (array.length > 0) { $.ajax({ method: 'post', url: '<?php echo ui_get_full_url('ajax.php', false, false, false); ?>', data: { page: 'operation/snmpconsole/snmp_view', method: 'deleteTraps', ids: array, group_by: $('#filter_group_by').val(), }, datatype: "json", success: function(data) { var dt_snmp = $("#snmp_console").DataTable(); dt_snmp.draw(); }, error: function(e) { console.error(e); } }); } }); $('#checkbox-all_validate_box').click(function() { const c = this.checked; $(':checkbox').prop('checked', c); }); var controls = document.getElementById('dashboard-controls'); autoHideElement(controls, 1000); var startCountDown = function (duration, cb) { $('div.dashboard-countdown').countdown('destroy'); if (!duration) return; var t = new Date(); t.setTime(t.getTime() + duration * 1000); $('div.dashboard-countdown').countdown({ until: t, format: 'MS', layout: '(%M%nn%M:%S%nn%S <?php echo __('Until next'); ?>) ', alwaysExpire: true, onExpiry: function () { var dt_snmp = $("#snmp_console").DataTable(); dt_snmp.draw(); startCountDown(duration); throw "exit"; } }); } // Auto refresh select $('form#refr-form').submit(function (event) { event.preventDefault(); }); var handleRefrChange = function (event) { event.preventDefault(); var url = $('form#refr-form').prop('action'); var refr = Number.parseInt(event.target.value, 10); startCountDown(refr); } $('form#refr-form select').change(handleRefrChange).change(); }); </script> <?php // EOF Javascript content. return ob_get_clean(); } }