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'] = ''.html_print_image( 'images/logs@svg.svg', true, [ 'title' => __('Statistics'), 'class' => 'main_menu_icon invert_filter', ] ).''; $list['text'] = ''.html_print_image( 'images/SNMP-network-numeric-data@svg.svg', true, [ 'title' => __('List'), 'class' => 'main_menu_icon invert_filter', ] ).''; $list['active'] = true; // 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', ], [ 'text' => 'enterprise_string', 'class' => 'snmp-td', ], [ 'text' => 'count', 'class' => 'snmp-td', ], [ 'text' => 'trap_subtype', 'class' => 'snmp-td', ], [ 'text' => 'user_id', 'class' => 'snmp-td', ], [ 'text' => 'timestamp', 'class' => 'snmp-td', ], '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: 99%', '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 = '
';
$legend .= ' '.__('Severity').''; $legend .= '';
$priorities = get_priorities();
$half = (count($priorities) / 2);
$count = 0;
foreach ($priorities as $num => $name) {
if ($count == $half) {
$legend .= ' ';
}
$legend .= ''.$name.'';
$legend .= ' '; $count++; } $legend .= ' | ';
$legend .= '';
$legend .= ' '.__('Status').''; $legend .= ''.__('Validated').''; $legend .= ''; $legend .= ''.__('Not validated').''; $legend .= ' | ';
$legend .= '';
$legend .= ' '.__('Alert').''; $legend .= ''.__('Alert').''; $legend .= ''; $legend .= ''.__('Not fired').''; $legend .= ' | ';
$legend .= '';
$legend .= ' '.__('Action').''; $legend .= '';
$legend .= html_print_image('images/validate.svg', true, ['class' => 'main_menu_icon invert_filter']).' - '.__('Validate');
$legend .= ' ';
$legend .= ''; $legend .= ' ';
$legend .= html_print_image('images/delete.svg', true, ['class' => 'main_menu_icon invert_filter']).' - '.__('Delete');
$legend .= ' ';
$legend .= ' | ';
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 = 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 (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 ($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, true);
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 .= ''.$tmp->source.'';
} else {
$tmp->snmp_agent .= '';
}
// 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 = '';
// 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 = '