<?php // Pandora FMS - http://pandorafms.com // ================================================== // Copyright (c) 2005-2011 Artica Soluciones Tecnologicas // Please see http://pandorafms.org 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; 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. require_once $config['homedir'].'/include/functions_agents.php'; require_once $config['homedir'].'/include/functions_modules.php'; require_once $config['homedir'].'/include/functions_users.php'; function mainAgentsAlerts() { global $config; // Load global vars include_once 'include/config.php'; include_once 'include/functions_reporting.php'; check_login(); // ACL Check if (! check_acl($config['id_user'], 0, 'AR')) { db_pandora_audit( 'ACL Violation', 'Trying to access Agent view (Grouped)' ); include 'general/noaccess.php'; exit; } // 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 if (isset($_GET['update_netgroup'])) { $group = get_parameter_get('update_netgroup', 0); if (check_acl($config['id_user'], $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; } } if ($config['realtimestats'] == 0) { $updated_info = __('Last update').' : '.ui_print_timestamp(db_get_sql('SELECT min(utimestamp) FROM tgroup_stat'), true); } else { // $updated_info = __("Updated at realtime"); $updated_info = ''; } $updated_time = $updated_info; $create_alert = (int) get_parameter('create_alert', 0); if ($create_alert) { $template2 = get_parameter('template'); $module_action_threshold = get_parameter('module_action_threshold'); $id_alert = alerts_create_alert_agent_module($create_alert, $template2); if ($id_alert !== false) { $action_select = get_parameter('action_select', 0); 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); } } } $refr = (int) get_parameter('refr', 30); // By default 30 seconds $show_modules = (bool) get_parameter('show_modules', 0); $group_id = get_parameter('group_id', 0); $offset = get_parameter('offset', 0); $hor_offset = get_parameter('hor_offset', 0); $block = 20; $groups = users_get_groups(); $filter_groups .= '<b>'.__('Group').'</b>'; $filter_groups .= html_print_select_groups(false, 'AR', true, 'group_id', $group_id, false, '', '', true, false, true, '', false, 'margin-right: 10px; margin-top: 5px;'); $check = '<b>'.__('Show modules without alerts').'</b>'; $check .= html_print_checkbox('slides_ids[]', $d['id'], $show_modules, true, false, '', true); $comborefr = '<form method="post" action="'.ui_get_url_refresh(['offset' => 0, 'hor_offset' => 0]).'">'; $comborefr .= '<b>'.__('Refresh').'</b>'; $comborefr .= html_print_select( [ '30' => '30 '.__('seconds'), (string) SECONDS_1MINUTE => __('1 minute'), (string) SECONDS_2MINUTES => __('2 minutes'), (string) SECONDS_5MINUTES => __('5 minutes'), (string) SECONDS_10MINUTES => __('10 minutes'), ], 'refr', (int) get_parameter('refr', 0), $script = 'this.form.submit()', '', 0, true, false, false, '', false, 'width: 100px; margin-right: 10px; margin-top: 5px;' ); $comborefr .= '</form>'; if ($config['pure'] == 0) { $fullscreen['text'] = '<a href="'.ui_get_url_refresh(['pure' => 1]).'">'.html_print_image('images/full_screen.png', true, ['title' => __('Full screen mode')]).'</a>'; } else { $fullscreen['text'] = '<a href="'.ui_get_url_refresh(['pure' => 0]).'">'.html_print_image('images/normal_screen.png', true, ['title' => __('Back to normal mode')]).'</a>'; $config['refr'] = $refr; } $onheader = [ 'updated_time' => $updated_time, 'fullscreen' => $fullscreen, 'combo_groups' => $filter_groups, ]; if ($config['pure'] == 1) { $onheader['combo_refr'] = $comborefr; } // Header. ui_print_page_header( __('Agents/Alerts'), 'images/op_alerts.png', false, 'agents_alerts_view', false, $updated_time ); // Old style table, we need a lot of special formatting,don't use table function // Prepare old-style table echo '<table class="databox filters" cellpadding="0" cellspacing="0" border="0" style="width:100%;">'; echo '<tr>'; echo '<td>'.$filter_groups.'</td>'; echo '<td>'.$check.'</td>'; if ($config['pure'] == 1) { echo '<td>'.$comborefr.'</td>'; } echo '<td> <strong>'.__('Full screen').'</strong>'.$fullscreen['text'].'</td>'; echo '</tr>'; echo '</table>'; if ($show_modules) { if ($group_id > 0) { $grupo = " AND tagente.id_grupo = $group_id"; } else { $grupo = ''; } $offset_modules = get_parameter('offset', 0); $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) { $data[0] = io_safe_output($agent_module['alias']); $data[1] = io_safe_output($agent_module['nombre']); $uniqid = $agent_module['id_agente_modulo']; $data[2] = "<a title='".__('Create alert')."' href='javascript:show_add_alerts(\"$uniqid\")'>".html_print_image('images/add_mc.png', true).'</a>'; array_push($table->data, $data); $table2->width = '100%'; $table2->id = 'table_add_alert'; $table2->class = 'databox filters'; $table2->data = []; // $data[0] = $table2->data[0][0] = __('Actions'); $groups_user = users_get_groups($config['id_user']); if (!empty($groups_user)) { $groups = implode(',', array_keys($groups_user)); $sql = "SELECT id, name FROM talert_actions WHERE id_group IN ($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] .= '<span id="advanced_action" class="advanced_actions invisible"><br>'; $table2->data[0][1] .= __('Number of alerts match from').' '; $table2->data[0][1] .= html_print_input_text('fires_min', '', '', 4, 10, true); $table2->data[0][1] .= ' '.__('to').' '; $table2->data[0][1] .= html_print_input_text('fires_max', '', '', 4, 10, true); $table2->data[0][1] .= ui_print_help_icon( 'alert-matches', true, ui_get_full_url(false, false, false, false) ); $table2->data[0][1] .= '</span>'; if (check_acl($config['id_user'], 0, 'LM')) { $table2->data[0][1] .= '<a style="margin-left:5px;" href="index.php?sec=galertas&sec2=godmode/alerts/configure_alert_action&pure='.$pure.'">'; $table2->data[0][1] .= html_print_image('images/add.png', true); $table2->data[0][1] .= '<span style="margin-left:5px;vertical-align:middle;">'.__('Create Action').'</span>'; $table2->data[0][1] .= '</a>'; } $table2->data[1][0] = __('Template'); $own_info = get_user_info($config['id_user']); if ($own_info['is_admin'] || check_acl($config['id_user'], 0, 'PM')) { $templates = alerts_get_alert_templates(false, ['id', 'name']); } else { $usr_groups = users_get_groups($config['id_user'], '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] .= ' <a class="template_details invisible" href="#">'.html_print_image('images/zoom.png', true, ['class' => 'img_help']).'</a>'; if (check_acl($config['id_user'], 0, 'LM')) { $table2->data[1][1] .= '<a href="index.php?sec=galertas&sec2=godmode/alerts/configure_alert_template&pure='.$pure.'">'; $table2->data[1][1] .= html_print_image('images/add.png', true); $table2->data[1][1] .= '<span style="margin-left:5px;vertical-align:middle;">'.__('Create Template').'</span>'; $table2->data[1][1] .= '</a>'; } $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 = '<form class="add_alert_form" method="post">'; $content2 .= html_print_table($table2, true); $content2 .= '<div class="action-buttons" style="width: '.$table2->width.'">'; $content2 .= html_print_submit_button(__('Add alert'), 'add', false, 'class="sub wand"', true); $content2 .= html_print_input_hidden('create_alert', $uniqid, true); $content2 .= '</div></form>'; $module_name = ui_print_truncate_text(io_safe_output($agent_module['nombre']), 40, false, true, false, '…', false); echo '<div id="add_alerts_dialog_'.$uniqid.'" title="'.__('Agent').': '.$agent_module['alias'].' / '.__('module').': '.$module_name.'" style="display:none">'.$content2.'</div>'; } html_print_table($table); } else { $filter = [ 'offset' => (int) $offset, 'limit' => (int) $config['block_size'], ]; $filter_count = []; if ($group_id > 0) { $filter['id_grupo'] = $group_id; $filter_count['id_grupo'] = $group_id; } // 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; } $all_alerts = agents_get_alerts_simple(); if ($config['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, 0, false, 'offset', true, '', '', [ 'count' => '', 'offset' => 'offset_param', ], 'alerts_agents' ); echo '<table class="info_table" cellpadding="0" cellspacing="0" border="0" width=100%>'; echo '<thead><tr>'; echo "<th width='140px' >".__('Agents').' / '.__('Alert templates').'</th>'; if ($hor_offset > 0) { $new_hor_offset = ($hor_offset - $block); echo "<th width='20px' style='' rowspan='".($nagents + 1)."'> <a href='index.php?sec=extensions&sec2=extensions/agents_alerts&refr=0&hor_offset=".$new_hor_offset.'&offset='.$offset.'&group_id='.$group_id."'>".html_print_image('images/darrowleft.png', true, ['title' => __('Previous templates')]).'</a> </th>'; } $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; foreach ($templates_raw as $temp) { if (isset($templates[$temp['id']]) && $templates[$temp['id']] == '') { $ntemplates++; if ($ntemplates <= $hor_offset || $ntemplates > ($hor_offset + $block)) { continue; } $templates[$temp['id']] = $temp['name']; } } foreach ($templates as $tid => $tname) { if ($tname == '') { continue; } echo '<th width="20px" >'.io_safe_output($tname).'</th>'; } echo '</tr></thead>'; if (($hor_offset + $block) < $ntemplates) { $new_hor_offset = ($hor_offset + $block); echo "<th width='20px' style='' rowspan='".($nagents + 1)."'> <a href='index.php?sec=extensions&sec2=extensions/agents_alerts&hor_offset=".$new_hor_offset.'&offset='.$offset.'&group_id='.$group_id."'>".html_print_image('images/darrowright.png', true, ['title' => __('More templates')]).'</a> </th>'; } foreach ($agents as $agent) { $alias = db_get_row('tagente', 'id_agente', $agent['id_agente']); echo '<tr>'; // Name of the agent echo '<td style="font-weight:bold;">'.$alias['alias'].'</td>'; // Alerts of the agent $anyfired = false; foreach ($templates as $tid => $tname) { if ($tname == '') { continue; } if (isset($agent_alerts[$agent['nombre']][$tid])) { foreach ($agent_alerts[$agent['nombre']][$tid] as $alert) { if ($alert['times_fired'] > 0) { $anyfired = true; } } $cellstyle = ''; if ($anyfired) { $cellstyle = 'background:'.COL_ALERTFIRED.';'; } echo '<td style=";'.$cellstyle.'" class="action_buttons"> '; $uniqid = uniqid(); echo '<div>'; echo count($agent_alerts[$agent['nombre']][$tid]).' '.__('Alerts').' '; echo "<a href='javascript:show_alerts_details(\"$uniqid\")'>".html_print_image('images/zoom.png', true).'</a>'; echo '</div>'; print_alerts_summary_modal_window($uniqid, $agent_alerts[$agent['nombre']][$tid]); } else { echo '<td style="text-align:center"> '; } echo '</td>'; } echo '</tr>'; } echo '</table>'; ui_pagination( $nagents, false, 0, 0, false, 'offset', true, 'pagination-bottom', '', [ 'count' => '', 'offset' => 'offset_param', ], 'alerts_agents' ); } } // Print the modal window for the summary of each alerts group function print_alerts_summary_modal_window($id, $alerts) { $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 = '<div style="margin-left: 10px;"><ul class="action_list">'; foreach ($actions as $action) { $actionText .= '<div><span class="action_name"><li>'.$action['name']; if ($action['fires_min'] != $action['fires_max']) { $actionText .= ' ('.$action['fires_min'].' / '.$action['fires_max'].')'; } $actionText .= '</li></span><br /></div>'; } $actionText .= '</ul></div>'; } else { if (!empty($actionDefault)) { $actionText = db_get_sql( "SELECT name FROM talert_actions WHERE id = $actionDefault" ).' <i>('.__('Default').')</i>'; } } $data[1] = $actionText; $data[2] = ui_print_timestamp($alert['last_fired'], true); $status = STATUS_ALERT_NOT_FIRED; 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']); echo '<div id="alerts_details_'.$id.'" title="'.__('Agent').': '.$agent.' / '.__('Template').': '.$template.'" style="display:none">'.$content.'</div>'; } extensions_add_operation_menu_option(__('Agents/Alerts view'), 'estado', null, 'v1r1', 'view'); extensions_add_main_function('mainAgentsAlerts'); ui_require_jquery_file('pandora'); ?> <script type="text/javascript"> function show_alerts_details(id) { $("#alerts_details_"+id).dialog({ resizable: true, draggable: true, modal: true, height: 280, width: 800, overlay: { opacity: 0.5, background: "black" } }); } function show_add_alerts(id) { $("#add_alerts_dialog_"+id).dialog({ resizable: true, draggable: true, modal: true, height: 235, width: 600, overlay: { opacity: 0.5, background: "black" } }); } // checkbox-slides_ids $(document).ready(function () { $('#checkbox-slides_ids').click(function(){ if ($('#checkbox-slides_ids').prop('checked')){ var url = location.href.replace("&show_modules=true", ""); location.href = url+"&show_modules=true"; } else { var url = location.href.replace("&show_modules=true", ""); var re = /&offset=\d*/g; location.href = url.replace(re, ""); } }); $('#group_id').change(function(){ if(location.href.indexOf("extensions/agents_modules") == -1){ var regx = /&group_id=\d*/g; var url = location.href.replace(regx, ""); location.href = url+"&group_id="+$("#group_id").val(); } }); }); </script>