From 93341a60e16f81adc40a1cf4f38e4ae6999897e8 Mon Sep 17 00:00:00 2001 From: daniel Date: Thu, 20 Oct 2016 16:26:05 +0200 Subject: [PATCH] visual graph for critical and warning threshold --- .../agentes/module_manager_editor_common.php | 450 ++++++++++++++++-- .../manage_network_components_form_common.php | 450 ++++++++++++++++-- .../help/en/help_dynamic_threshold.php | 61 +++ .../help/es/help_dynamic_threshold.php | 62 +++ pandora_console/include/styles/pandora.css | 7 + 5 files changed, 943 insertions(+), 87 deletions(-) create mode 100644 pandora_console/include/help/en/help_dynamic_threshold.php create mode 100644 pandora_console/include/help/es/help_dynamic_threshold.php diff --git a/pandora_console/godmode/agentes/module_manager_editor_common.php b/pandora_console/godmode/agentes/module_manager_editor_common.php index 99d5aeb3ef..afe30ef4da 100644 --- a/pandora_console/godmode/agentes/module_manager_editor_common.php +++ b/pandora_console/godmode/agentes/module_manager_editor_common.php @@ -17,6 +17,8 @@ include_once("include/functions_modules.php"); include_once("include/functions_categories.php"); +echo "" . "\n"; + function prepend_table_simple ($row, $id = false) { global $table_simple; @@ -119,9 +121,11 @@ $table_simple->class = 'databox'; $table_simple->data = array (); $table_simple->colspan = array (); $table_simple->style = array (); -$table_simple->style[0] = 'font-weight: bold; width: 26%;'; -$table_simple->style[1] = 'width: 40%'; -$table_simple->style[2] = 'font-weight: bold;'; +$table_simple->style[0] = 'font-weight: bold; width: 15%;'; +$table_simple->style[1] = 'width: 35%'; +$table_simple->style[2] = 'font-weight: bold; width: 25%;'; +$table_simple->style[3] = 'width: 25%'; + #$table_simple->colspan[4][1] = 3; $table_simple->colspan[5][1] = 3; @@ -151,7 +155,12 @@ if ($policy_link != 0) { $disabled_enable = 1; } $table_simple->data[0][2] = __('Disabled'); -$table_simple->data[0][3] = html_print_checkbox ("disabled", 1, $disabled, true, $disabled_enable); +$table_simple->data[0][2] .= html_print_checkbox ("disabled", 1, $disabled, true, $disabled_enable); +$table_simple->data[0][3] = __('Module group'); +$table_simple->data[0][3] .= html_print_select_from_sql ('SELECT id_mg, name FROM tmodule_group ORDER BY name', + 'id_module_group', $id_module_group, '', __('Not assigned'), '0', true, false, true, $disabledBecauseInPolicy); + + $table_simple->data[1][0] = __('Type').' ' . ui_print_help_icon ('module_type', true); $table_simple->data[1][0] .= html_print_input_hidden ('id_module_type_hidden', $id_module_type, true); @@ -220,27 +229,22 @@ else { $table_simple->data[1][1] .= html_print_input_hidden('type_names',base64_encode(io_json_mb_encode($type_names_hash)),true); } -$table_simple->data[1][2] = __('Module group'); -$table_simple->data[1][3] = html_print_select_from_sql ('SELECT id_mg, name FROM tmodule_group ORDER BY name', - 'id_module_group', $id_module_group, '', __('Not assigned'), '0', - true, false, true, $disabledBecauseInPolicy); - if($disabledBecauseInPolicy){ $table_simple->data[1][3] .= html_print_input_hidden ('id_module_group', $id_module_group, true); } -$table_simple->data[2][0] = __('Dynamic Interval') .' ' . ui_print_help_icon ('warning_status', true); - +$table_simple->data[2][0] = __('Dynamic Threshold Interval') .' ' . ui_print_help_icon ('dynamic_threshold', true); $table_simple->data[2][1] = html_print_extended_select_for_time ('dynamic_interval', $dynamic_interval, '', 'None', '0', 10, true, 'width:150px',false); -$table_simple->data[2][2] = ''.__('Dynamic Min. ').''; +$table_simple->data[2][1] .= '' . html_print_image('images/cog.png', true, array('title' => __('Advanced options Dynamic Threshold'))) . ''; + +$table_simple->data[2][2] = ''.__('Dynamic Threshold Min. ').''; $table_simple->data[2][2] .= html_print_input_text ('dynamic_min', $dynamic_min, '', 10, 255, true); -$table_simple->data[2][2] .= '
'.__('Dynamic Max.').''; +$table_simple->data[2][2] .= '
'.__('Dynamic Threshold Max.').''; $table_simple->data[2][2] .= html_print_input_text ('dynamic_max', $dynamic_max, '', 10, 255, true); -$table_simple->data[2][3] = ''.__('Dynamic Two Tailed: ').''; +$table_simple->data[2][3] = ''.__('Dynamic Threshold Two Tailed: ').''; $table_simple->data[2][3] .= html_print_checkbox ("dynamic_two_tailed", 1, $dynamic_two_tailed, true); + + $table_simple->data[3][0] = __('Warning status').' ' . ui_print_help_icon ('warning_status', true); - -$table_simple->data[3][1] = ''; - if (!modules_is_string_type($id_module_type) || $edit) { $table_simple->data[3][1] .= ''.__('Min. ').''; $table_simple->data[3][1] .= html_print_input_text ('min_warning', $min_warning, @@ -254,52 +258,54 @@ if (modules_is_string_type($id_module_type) || $edit) { $table_simple->data[3][1] .= html_print_input_text ('str_warning', $str_warning, '', 10, 255, true, $disabledBecauseInPolicy).''; } - $table_simple->data[3][1] .= '
'.__('Inverse interval').''; $table_simple->data[3][1] .= html_print_checkbox ("warning_inverse", 1, $warning_inverse, true); -$table_simple->data[3][2] = __('Critical status').' ' . ui_print_help_icon ('critical_status', true); -$table_simple->data[3][3] = ''; +$table_simple->data[3][2] = ' '; +$table_simple->colspan[3][2] = 2; +$table_simple->rowspan[3][2] = 3; + +$table_simple->data[4][0] = __('Critical status').' ' . ui_print_help_icon ('critical_status', true); if (!modules_is_string_type($id_module_type) || $edit) { - $table_simple->data[3][3] .= ''.__('Min. ').''; - $table_simple->data[3][3] .= html_print_input_text ('min_critical', $min_critical, + $table_simple->data[4][1] .= ''.__('Min. ').''; + $table_simple->data[4][1] .= html_print_input_text ('min_critical', $min_critical, '', 10, 255, true, $disabledBecauseInPolicy); - $table_simple->data[3][3] .= '
'.__('Max.').''; - $table_simple->data[3][3] .= html_print_input_text ('max_critical', $max_critical, + $table_simple->data[4][1] .= '
'.__('Max.').''; + $table_simple->data[4][1] .= html_print_input_text ('max_critical', $max_critical, '', 10, 255, true, $disabledBecauseInPolicy).'
'; } if (modules_is_string_type($id_module_type) || $edit) { - $table_simple->data[3][3] .= ''.__('Str.').''; - $table_simple->data[3][3] .= html_print_input_text ('str_critical', $str_critical, + $table_simple->data[4][1] .= ''.__('Str.').''; + $table_simple->data[4][1] .= html_print_input_text ('str_critical', $str_critical, '', 10, 255, true, $disabledBecauseInPolicy).''; } -$table_simple->data[3][3] .= '
'.__('Inverse interval').''; -$table_simple->data[3][3] .= html_print_checkbox ("critical_inverse", 1, $critical_inverse, true); +$table_simple->data[4][1] .= '
'.__('Inverse interval').''; +$table_simple->data[4][1] .= html_print_checkbox ("critical_inverse", 1, $critical_inverse, true); /* FF stands for Flip-flop */ -$table_simple->data[4][0] = __('FF threshold').' ' . ui_print_help_icon ('ff_threshold', true); -$table_simple->colspan[4][1] = 3; +$table_simple->data[5][0] = __('FF threshold').' ' . ui_print_help_icon ('ff_threshold', true); +$table_simple->colspan[5][1] = 3; -$table_simple->data[4][1] = html_print_radio_button ('each_ff', 0, '', $each_ff, true) . ' ' . __('All state changing') . ' : '; -$table_simple->data[4][1] .= html_print_input_text ('ff_event', $ff_event, '', 5 +$table_simple->data[5][1] = html_print_radio_button ('each_ff', 0, '', $each_ff, true) . ' ' . __('All state changing') . ' : '; +$table_simple->data[5][1] .= html_print_input_text ('ff_event', $ff_event, '', 5 , 15, true, $disabledBecauseInPolicy) . '
'; -$table_simple->data[4][1] .= html_print_radio_button ('each_ff', 1, '', $each_ff, true) . ' ' . __('Each state changing') . ' : '; -$table_simple->data[4][1] .= __('To normal'); -$table_simple->data[4][1] .= html_print_input_text ('ff_event_normal', $ff_event_normal, '', 5, 15, true, $disabledBecauseInPolicy) . ' '; -$table_simple->data[4][1] .= __('To warning'); -$table_simple->data[4][1] .= html_print_input_text ('ff_event_warning', $ff_event_warning, '', 5, 15, true, $disabledBecauseInPolicy) . ' '; -$table_simple->data[4][1] .= __('To critical'); -$table_simple->data[4][1] .= html_print_input_text ('ff_event_critical', $ff_event_critical, '', 5, 15, true, $disabledBecauseInPolicy); -$table_simple->data[5][0] = __('Historical data'); +$table_simple->data[5][1] .= html_print_radio_button ('each_ff', 1, '', $each_ff, true) . ' ' . __('Each state changing') . ' : '; +$table_simple->data[5][1] .= __('To normal'); +$table_simple->data[5][1] .= html_print_input_text ('ff_event_normal', $ff_event_normal, '', 5, 15, true, $disabledBecauseInPolicy) . ' '; +$table_simple->data[5][1] .= __('To warning'); +$table_simple->data[5][1] .= html_print_input_text ('ff_event_warning', $ff_event_warning, '', 5, 15, true, $disabledBecauseInPolicy) . ' '; +$table_simple->data[5][1] .= __('To critical'); +$table_simple->data[5][1] .= html_print_input_text ('ff_event_critical', $ff_event_critical, '', 5, 15, true, $disabledBecauseInPolicy); +$table_simple->data[6][0] = __('Historical data'); if($disabledBecauseInPolicy) { // If is disabled, we send a hidden in his place and print a false checkbox because HTML dont send disabled fields and could be disabled by error - $table_simple->data[5][1] = html_print_checkbox ("history_data_fake", 1, $history_data, true, $disabledBecauseInPolicy); - $table_simple->data[5][1] .= ''; + $table_simple->data[6][1] = html_print_checkbox ("history_data_fake", 1, $history_data, true, $disabledBecauseInPolicy); + $table_simple->data[6][1] .= ''; } else { - $table_simple->data[5][1] = html_print_checkbox ("history_data", 1, $history_data, true, $disabledBecauseInPolicy); + $table_simple->data[6][1] = html_print_checkbox ("history_data", 1, $history_data, true, $disabledBecauseInPolicy); } /* Advanced form part */ @@ -807,14 +813,53 @@ $(document).ready (function () { $("#submit-crtbutton").click (function () { validate_post_process(); }); + //Dynamic_interval; disabled_status(); $('#dynamic_interval_select').change (function() { disabled_status(); }); + //Dynamic_options_advance; + $('#simple-2-2').hide(); + $('#simple-2-3').hide(); + + //paint graph stutus critical and warning: + paint_graph_values(); + $('#text-min_warning').on ('input', function() { + paint_graph_values(); + if (isNaN($('#text-min_warning').val()) && !($('#text-min_warning').val() == "-")){ + $('#text-min_warning').val(0); + } + }); + $('#text-max_warning').on ('input', function() { + paint_graph_values(); + if (isNaN($('#text-max_warning').val()) && !($('#text-max_warning').val() == "-")){ + $('#text-max_warning').val(0); + } + }); + $('#text-min_critical').on ('input', function() { + paint_graph_values(); + if (isNaN($('#text-min_critical').val()) && !($('#text-min_critical').val() == "-")){ + $('#text-min_critical').val(0); + } + }); + $('#text-max_critical').on ('input', function() { + paint_graph_values(); + if (isNaN($('#text-max_critical').val()) && !($('#text-max_critical').val() == "-")){ + $('#text-max_critical').val(0); + } + }); + $('#checkbox-warning_inverse').change (function() { + paint_graph_values(); + }); + $('#checkbox-critical_inverse').change (function() { + paint_graph_values(); + }); + }); +//readonly and add class input function disabled_status () { if($('#dynamic_interval_select').val() != 0){ $('#text-min_warning').prop('readonly', true); @@ -837,7 +882,18 @@ function disabled_status () { } } -// Add a new module macro +//Dynamic_options_advance; +function advanced_option_dynamic() { + if($('#simple-2-2').is(":visible")){ + $('#simple-2-2').hide(); + $('#simple-2-3').hide(); + } else { + $('#simple-2-2').show(); + $('#simple-2-3').show(); + } +} + +//Add a new module macro function add_macro () { var macro_count = parseInt($("#hidden-module_macro_count").val()); var delete_icon = ''; @@ -1064,6 +1120,312 @@ function validate_post_process() { $("#text-post_process").val(new_post_process); } +//function paint graph +function paint_graph_values(){ + //Parse integrer + var min_w = parseInt($('#text-min_warning').val()); + if(min_w == '0.00'){ min_w = 0; } + var max_w = parseInt($('#text-max_warning').val()); + if(max_w == '0.00'){ max_w = 0; } + var min_c = parseInt($('#text-min_critical').val()); + if(min_c =='0.00'){ min_c = 0; } + var max_c = parseInt($('#text-max_critical').val()); + if(max_c =='0.00'){ max_c = 0; } + var inverse_w = $('input:checkbox[name=warning_inverse]:checked').val(); + if(!inverse_w){ inverse_w = 0; } + var inverse_c = $('input:checkbox[name=critical_inverse]:checked').val(); + if(!inverse_c){ inverse_c = 0; } + //inicialiced error + var error_w = 0; + var error_c = 0; + //if haven't error + if(max_w == 0 || max_w > min_w){ + if(max_c == 0 || max_c > min_c){ + paint_graph_status(min_w, max_w, min_c, max_c, inverse_w, inverse_c, error_w, error_c); + } else { + error_c = 1; + paint_graph_status(0,0,0,0,0,0, error_w, error_c); + } + } else { + error_w = 1; + paint_graph_status(0,0,0,0,0,0, error_w, error_c); + } +} + +//function use d3.js for paint graph +function paint_graph_status(min_w, max_w, min_c, max_c, inverse_w, inverse_c, error_w, error_c) { + + //Check if they are numbers + if(isNaN(min_w)){ min_w = 0; }; + if(isNaN(max_w)){ max_w = 0; }; + if(isNaN(min_c)){ min_c = 0; }; + if(isNaN(max_c)){ max_c = 0; }; + + //messages legend + var legend_normal = ''; + var legend_warning = ''; + var legend_critical = ''; + + //remove elements + d3.select("#svg_dinamic rect").remove(); + $("#text-max_warning").removeClass("input_error"); + $("#text-max_critical").removeClass("input_error"); + + //if haven't errors + if (error_w == 0 && error_c == 0){ + //parse element + min_w = parseInt(min_w); + min_c = parseInt(min_c); + max_w = parseInt(max_w); + max_c = parseInt(max_c); + + //inicialize var + var range_min = 0; + var range_max = 0; + var range_max_min = 0; + var range_max_min = 0; + + //Find the lowest possible value + if(min_w < 0 || min_c < 0){ + if(min_w < min_c){ + range_min = min_w - 100; + } else { + range_min = min_c - 100; + } + } else if (min_w > 0 || min_c > 0) { + if(min_w > min_c){ + range_max_min = min_w; + } else { + range_max_min = min_c; + } + } else { + if(min_w < min_c){ + range_min = min_w - 100; + } else { + range_min = min_c - 100; + } + } + + //Find the maximum possible value + if(max_w > max_c){ + range_max = max_w + 100 + range_max_min; + } else { + range_max = max_c + 100 + range_max_min; + } + + //Controls whether the maximum = 0 is infinite + if((max_w == 0 || max_w == 0.00) && min_w != 0){ + max_w = range_max; + } + if((max_c == 0 || max_c == 0.00) && min_c != 0){ + max_c = range_max; + } + + //Scale according to the position + position = 200 / (range_max-range_min); + + //axes + var yScale = d3.scale.linear() + .domain([range_min, range_max]) + .range([100, -100]); + + var yAxis = d3.svg.axis() + .orient("left") + .scale(yScale); + + //create svg + var svg = d3.select("#svg_dinamic"); + //delete elements + svg.selectAll("g").remove(); + svg.selectAll("rect").remove(); + svg.selectAll("text").remove(); + svg.append("g") + .attr("transform", "translate(0, 100)") + .call(yAxis); + + //legend Normal text + svg.append("text") + .attr("x", 0) + .attr("y", -20) + .attr("fill", 'black') + .style("font-family", "arial") + .style("font-weight", "bold") + .style("font-size", 10) + .html(legend_normal) + .style("text-anchor", "first"); + + //legend Normal rect + svg.append("rect") + .attr("id", "legend_normal") + .attr("x", 72) + .attr("y", -30) + .attr("width", 10) + .attr("height", 10) + .style("fill", "#82B92E"); + + //legend Warning text + svg.append("text") + .attr("x", 91) + .attr("y", -20) + .attr("fill", 'black') + .style("font-family", "arial") + .style("font-weight", "bold") + .style("font-size", 10) + .html(legend_warning) + .style("text-anchor", "first"); + + //legend Warning rect + svg.append("rect") + .attr("id", "legend_warning") + .attr("x", 168) + .attr("y", -30) + .attr("width", 10) + .attr("height", 10) + .style("fill", "#ffd731"); + + //legend Critical text + svg.append("text") + .attr("x", 187) + .attr("y", -20) + .attr("fill", 'black') + .style("font-family", "arial") + .style("font-weight", "bold") + .style("font-size", 10) + .html(legend_critical) + .style("text-anchor", "first"); + + //legend critical rect + svg.append("rect") + .attr("id", "legend_critical") + .attr("x", 258) + .attr("y", -30) + .attr("width", 10) + .attr("height", 10) + .style("fill", "#fc4444"); + + //styles for number and axes + svg.selectAll("g .domain") + .style("stroke-width", 2) + .style("fill", "none") + .style("stroke", "black"); + + svg.selectAll("g .tick text") + .style("font-size", "9pt") + .style("font-weight", "initial"); + + //estatus normal + svg.append("rect") + .attr("id", "warning_rect") + .attr("x", 3) + .attr("y", 0) + .attr("width", 300) + .attr("height", 200) + .style("fill", "#82B92E"); + + //controls the inverse warning + if(inverse_w == 0){ + svg.append("rect").transition() + .duration(600) + .attr("id", "warning_rect") + .attr("x", 3) + .attr("y", ((range_max - min_w) * position) - ((max_w - min_w) * position)) + .attr("width", 300) + .attr("height", ((max_w - min_w) * position)) + .style("fill", "#ffd731"); + } + else { + svg.append("rect").transition() + .duration(600) + .attr("id", "warning_rect") + .attr("x", 3) + .attr("y", 200 - ((min_w -range_min) * position)) + .attr("width", 300) + .attr("height", (min_w -range_min) * position) + .style("fill", "#ffd731"); + + svg.append("rect").transition() + .duration(600) + .attr("id", "warning_inverse_rect") + .attr("x", 3) + .attr("y", 0) + .attr("width", 300) + .attr("height", ((range_max - min_w) * position) - ((max_w - min_w) * position)) + .style("fill", "#ffd731"); + + } + //controls the inverse critical + if(inverse_c == 0){ + svg.append("rect").transition() + .duration(600) + .attr("id", "critical_rect") + .attr("x", 3) + .attr("y", ((range_max - min_c) * position) - ((max_c - min_c) * position)) + .attr("width", 300) + .attr("height", ((max_c - min_c) * position)) + .style("fill", "#fc4444"); + } + else { + svg.append("rect").transition() + .duration(600) + .attr("id", "critical_rect") + .attr("x", 3) + .attr("y", 200 - ((min_c -range_min) * position)) + .attr("width", 300) + .attr("height", (min_c -range_min) * position) + .style("fill", "#fc4444"); + + svg.append("rect").transition() + .duration(600) + .attr("id", "critical_inverse_rect") + .attr("x", 3) + .attr("y", 0) + .attr("width", 300) + .attr("height", ((range_max - min_c) * position) - ((max_c - min_c) * position)) + .style("fill", "#fc4444"); + } + } + else { + var message_error_warning = ''; + var message_error_critical = ''; + + d3.select("#svg_dinamic rect").remove(); + //create svg + var svg = d3.select("#svg_dinamic"); + svg.selectAll("g").remove(); + svg.selectAll("rect").remove(); + svg.selectAll("text").remove(); + //message error warning + if (error_w == 1) { + $("#text-max_warning").addClass("input_error"); + svg.append("text") + .attr("x", -90) + .attr("y", 10) + .attr("fill", 'black') + .style("font-family", "arial") + .style("font-weight", "bold") + .style("font-size", 14) + .style("fill", "red") + .html(message_error_warning) + .style("text-anchor", "first"); + } + //message error critical + if (error_c == 1) { + $("#text-max_critical").addClass("input_error"); + svg.append("text") + .attr("x", -90) + .attr("y", 105) + .attr("fill", 'black') + .style("font-family", "arial") + .style("font-weight", "bold") + .style("font-size", 14) + .style("fill", "red") + .html(message_error_critical) + .style("text-anchor", "first"); + } + + } +} + /* End of relationship javascript */ /* ]]> */ diff --git a/pandora_console/godmode/modules/manage_network_components_form_common.php b/pandora_console/godmode/modules/manage_network_components_form_common.php index 7fa554a4b5..c40928a7c8 100644 --- a/pandora_console/godmode/modules/manage_network_components_form_common.php +++ b/pandora_console/godmode/modules/manage_network_components_form_common.php @@ -22,6 +22,8 @@ if (! check_acl ($config['id_user'], 0, "PM")) { return; } +echo "" . "\n"; + function push_table_row ($row, $id = false) { global $table; @@ -102,9 +104,10 @@ $table->data[2][1] = html_print_select (network_components_get_groups (), $table->data[2][2] = __('Interval'); $table->data[2][3] = html_print_extended_select_for_time ('module_interval' , $module_interval, '', '', '0', false, true); -$table->data[3][0] = __('Dynamic Interval') .' ' . ui_print_help_icon ('warning_status', true); - +$table->data[3][0] = __('Dynamic Interval') .' ' . ui_print_help_icon ('dynamic_threshold', true); $table->data[3][1] = html_print_extended_select_for_time ('dynamic_interval', $dynamic_interval, '', 'None', '0', 10, true, 'width:150px',false); +$table->data[3][1] .= '' . html_print_image('images/cog.png', true, array('title' => __('Advanced options Dynamic Threshold'))) . ''; + $table->data[3][2] = ''.__('Dynamic Min. ').''; $table->data[3][2] .= html_print_input_text ('dynamic_min', $dynamic_min, '', 10, 255, true); $table->data[3][2] .= '
'.__('Dynamic Max.').''; @@ -125,59 +128,63 @@ $table->data[4][1] .= html_print_input_text ('str_warning', $str_warning, $table->data[4][1] .= '
'.__('Inverse interval').''; $table->data[4][1] .= html_print_checkbox ("warning_inverse", 1, $warning_inverse, true); -$table->data[4][2] = __('Critical status'). ' ' . ui_print_help_icon ('critical_status', true); -$table->data[4][3] = ''.__('Min.').'  '; -$table->data[4][3] .= html_print_input_text ('min_critical', $min_critical, +$table->data[4][2] = ' '; +$table->colspan[4][2] = 2; +$table->rowspan[4][2] = 3; + +$table->data[5][0] = __('Critical status'). ' ' . ui_print_help_icon ('critical_status', true); +$table->data[5][1] = ''.__('Min.').'  '; +$table->data[5][1] .= html_print_input_text ('min_critical', $min_critical, '', 5, 15, true); -$table->data[4][3] .= '
'.__('Max.').' '; -$table->data[4][3] .= html_print_input_text ('max_critical', $max_critical, +$table->data[5][1] .= '
'.__('Max.').' '; +$table->data[5][1] .= html_print_input_text ('max_critical', $max_critical, '', 5, 15, true) . '
'; -$table->data[4][3] .= ''.__('Str.').'  '; -$table->data[4][3] .= html_print_input_text ('str_critical', $str_critical, +$table->data[5][1] .= ''.__('Str.').'  '; +$table->data[5][1] .= html_print_input_text ('str_critical', $str_critical, '', 5, 15, true) . ''; -$table->data[4][3] .= '
'.__('Inverse interval').''; -$table->data[4][3] .= html_print_checkbox ("critical_inverse", 1, $critical_inverse, true); +$table->data[5][1] .= '
'.__('Inverse interval').''; +$table->data[5][1] .= html_print_checkbox ("critical_inverse", 1, $critical_inverse, true); -$table->data[5][0] = __('FF threshold') . ' ' . ui_print_help_icon ('ff_threshold', true); -$table->colspan[5][1] = 3; -$table->data[5][1] = html_print_radio_button ('each_ff', 0, '', $each_ff, true) . ' ' . __('All state changing') . ' : '; -$table->data[5][1] .= html_print_input_text ('ff_event', $ff_event, +$table->data[6][0] = __('FF threshold') . ' ' . ui_print_help_icon ('ff_threshold', true); +$table->colspan[6][1] = 3; +$table->data[6][1] = html_print_radio_button ('each_ff', 0, '', $each_ff, true) . ' ' . __('All state changing') . ' : '; +$table->data[6][1] .= html_print_input_text ('ff_event', $ff_event, '', 5, 15, true) . '
'; -$table->data[5][1] .= html_print_radio_button ('each_ff', 1, '', $each_ff, true) . ' ' . __('Each state changing') . ' : '; -$table->data[5][1] .= __('To normal'); -$table->data[5][1] .= html_print_input_text ('ff_event_normal', $ff_event_normal, '', 5, 15, true) . ' '; -$table->data[5][1] .= __('To warning'); -$table->data[5][1] .= html_print_input_text ('ff_event_warning', $ff_event_warning, '', 5, 15, true) . ' '; -$table->data[5][1] .= __('To critical'); -$table->data[5][1] .= html_print_input_text ('ff_event_critical', $ff_event_critical, '', 5, 15, true); +$table->data[6][1] .= html_print_radio_button ('each_ff', 1, '', $each_ff, true) . ' ' . __('Each state changing') . ' : '; +$table->data[6][1] .= __('To normal'); +$table->data[6][1] .= html_print_input_text ('ff_event_normal', $ff_event_normal, '', 5, 15, true) . ' '; +$table->data[6][1] .= __('To warning'); +$table->data[6][1] .= html_print_input_text ('ff_event_warning', $ff_event_warning, '', 5, 15, true) . ' '; +$table->data[6][1] .= __('To critical'); +$table->data[6][1] .= html_print_input_text ('ff_event_critical', $ff_event_critical, '', 5, 15, true); -$table->data[6][0] = __('Historical data'); -$table->data[6][1] = html_print_checkbox ("history_data", 1, $history_data, true); +$table->data[7][0] = __('Historical data'); +$table->data[7][1] = html_print_checkbox ("history_data", 1, $history_data, true); -$table->data[7][0] = __('Min. Value'); -$table->data[7][1] = html_print_input_text ('min', $min, '', 5, 15, true). ' ' . ui_print_help_tip (__('Any value below this number is discarted'), true); -$table->data[7][2] = __('Max. Value'); -$table->data[7][3] = html_print_input_text ('max', $max, '', 5, 15, true) . ' ' . ui_print_help_tip (__('Any value over this number is discarted'), true); -$table->data[8][0] = __('Unit'); -$table->data[8][1] = html_print_input_text ('unit', $unit, '', 12, 25, true); +$table->data[8][0] = __('Min. Value'); +$table->data[8][1] = html_print_input_text ('min', $min, '', 5, 15, true). ' ' . ui_print_help_tip (__('Any value below this number is discarted'), true); +$table->data[8][2] = __('Max. Value'); +$table->data[8][3] = html_print_input_text ('max', $max, '', 5, 15, true) . ' ' . ui_print_help_tip (__('Any value over this number is discarted'), true); +$table->data[9][0] = __('Unit'); +$table->data[9][1] = html_print_input_text ('unit', $unit, '', 12, 25, true); -$table->data[8][2] = __('Throw unknown events'); -$table->data[8][3] = html_print_checkbox('throw_unknown_events', 1, +$table->data[9][2] = __('Throw unknown events'); +$table->data[9][3] = html_print_checkbox('throw_unknown_events', 1, !network_components_is_disable_type_event($id, EVENTS_GOING_UNKNOWN), true); -$table->data[9][0] = __('Critical instructions'). ui_print_help_tip(__("Instructions when the status is critical"), true); -$table->data[9][1] = html_print_textarea ('critical_instructions', 2, 65, $critical_instructions, '', true); -$table->colspan[9][1] = 3; - -$table->data[10][0] = __('Warning instructions'). ui_print_help_tip(__("Instructions when the status is warning"), true); -$table->data[10][1] = html_print_textarea ('warning_instructions', 2, 65, $warning_instructions, '', true); +$table->data[10][0] = __('Critical instructions'). ui_print_help_tip(__("Instructions when the status is critical"), true); +$table->data[10][1] = html_print_textarea ('critical_instructions', 2, 65, $critical_instructions, '', true); $table->colspan[10][1] = 3; -$table->data[11][0] = __('Unknown instructions'). ui_print_help_tip(__("Instructions when the status is unknown"), true); -$table->data[11][1] = html_print_textarea ('unknown_instructions', 2, 65, $unknown_instructions, '', true); +$table->data[11][0] = __('Warning instructions'). ui_print_help_tip(__("Instructions when the status is warning"), true); +$table->data[11][1] = html_print_textarea ('warning_instructions', 2, 65, $warning_instructions, '', true); $table->colspan[11][1] = 3; -$next_row = 12; +$table->data[12][0] = __('Unknown instructions'). ui_print_help_tip(__("Instructions when the status is unknown"), true); +$table->data[12][1] = html_print_textarea ('unknown_instructions', 2, 65, $unknown_instructions, '', true); +$table->colspan[12][1] = 3; + +$next_row = 13; if (check_acl ($config['id_user'], 0, "PM")) { $table->data[$next_row][0] = __('Category'); @@ -187,7 +194,7 @@ if (check_acl ($config['id_user'], 0, "PM")) { } else { // Store in a hidden field if is not visible to avoid delete the value - $table->data[11][1] .= html_print_input_hidden ('id_category', $id_category, true); + $table->data[12][1] .= html_print_input_hidden ('id_category', $id_category, true); } $table->data[$next_row][0] = __('Tags'); @@ -246,14 +253,54 @@ $next_row++; $('#minmax_warning').hide(); } }); + + $("#type").trigger('change'); + //Dynamic_interval; disabled_status(); $('#dynamic_interval_select').change (function() { disabled_status(); }); - $("#type").trigger('change'); + + //Dynamic_options_advance; + $('#network_component-3-2').hide(); + $('#network_component-3-3').hide(); + + //paint graph stutus critical and warning: + paint_graph_values(); + $('#text-min_warning').on ('input', function() { + paint_graph_values(); + if (isNaN($('#text-min_warning').val()) && !($('#text-min_warning').val() == "-")){ + $('#text-min_warning').val(0); + } + }); + $('#text-max_warning').on ('input', function() { + paint_graph_values(); + if (isNaN($('#text-max_warning').val()) && !($('#text-max_warning').val() == "-")){ + $('#text-max_warning').val(0); + } + }); + $('#text-min_critical').on ('input', function() { + paint_graph_values(); + if (isNaN($('#text-min_critical').val()) && !($('#text-min_critical').val() == "-")){ + $('#text-min_critical').val(0); + } + }); + $('#text-max_critical').on ('input', function() { + paint_graph_values(); + if (isNaN($('#text-max_critical').val()) && !($('#text-max_critical').val() == "-")){ + $('#text-max_critical').val(0); + } + }); + $('#checkbox-warning_inverse').change (function() { + paint_graph_values(); + }); + $('#checkbox-critical_inverse').change (function() { + paint_graph_values(); + }); }); + //readonly and add class input function disabled_status () { if($('#dynamic_interval_select').val() != 0){ $('#text-min_warning').prop('readonly', true); @@ -275,4 +322,321 @@ $next_row++; $('#text-max_critical').removeClass('readonly'); } } + + //Dynamic_options_advance; + function advanced_option_dynamic() { + if($('#network_component-3-2').is(":visible")){ + $('#network_component-3-2').hide(); + $('#network_component-3-3').hide(); + } else { + $('#network_component-3-2').show(); + $('#network_component-3-3').show(); + } + } + + //function paint graph + function paint_graph_values(){ + //Parse integrer + var min_w = parseInt($('#text-min_warning').val()); + if(min_w == '0.00'){ min_w = 0; } + var max_w = parseInt($('#text-max_warning').val()); + if(max_w == '0.00'){ max_w = 0; } + var min_c = parseInt($('#text-min_critical').val()); + if(min_c =='0.00'){ min_c = 0; } + var max_c = parseInt($('#text-max_critical').val()); + if(max_c =='0.00'){ max_c = 0; } + var inverse_w = $('input:checkbox[name=warning_inverse]:checked').val(); + if(!inverse_w){ inverse_w = 0; } + var inverse_c = $('input:checkbox[name=critical_inverse]:checked').val(); + if(!inverse_c){ inverse_c = 0; } + //inicialiced error + var error_w = 0; + var error_c = 0; + //if haven't error + if(max_w == 0 || max_w > min_w){ + if(max_c == 0 || max_c > min_c){ + paint_graph_status(min_w, max_w, min_c, max_c, inverse_w, inverse_c, error_w, error_c); + } else { + error_c = 1; + paint_graph_status(0,0,0,0,0,0, error_w, error_c); + } + } else { + error_w = 1; + paint_graph_status(0,0,0,0,0,0, error_w, error_c); + } + } + + //function use d3.js for paint graph + function paint_graph_status(min_w, max_w, min_c, max_c, inverse_w, inverse_c, error_w, error_c) { + + //Check if they are numbers + if(isNaN(min_w)){ min_w = 0; }; + if(isNaN(max_w)){ max_w = 0; }; + if(isNaN(min_c)){ min_c = 0; }; + if(isNaN(max_c)){ max_c = 0; }; + + //messages legend + var legend_normal = ''; + var legend_warning = ''; + var legend_critical = ''; + + //remove elements + d3.select("#svg_dinamic rect").remove(); + $("#text-max_warning").removeClass("input_error"); + $("#text-max_critical").removeClass("input_error"); + + //if haven't errors + if (error_w == 0 && error_c == 0){ + //parse element + min_w = parseInt(min_w); + min_c = parseInt(min_c); + max_w = parseInt(max_w); + max_c = parseInt(max_c); + + //inicialize var + var range_min = 0; + var range_max = 0; + var range_max_min = 0; + var range_max_min = 0; + + //Find the lowest possible value + if(min_w < 0 || min_c < 0){ + if(min_w < min_c){ + range_min = min_w - 100; + } else { + range_min = min_c - 100; + } + } else if (min_w > 0 || min_c > 0) { + if(min_w > min_c){ + range_max_min = min_w; + } else { + range_max_min = min_c; + } + } else { + if(min_w < min_c){ + range_min = min_w - 100; + } else { + range_min = min_c - 100; + } + } + + //Find the maximum possible value + if(max_w > max_c){ + range_max = max_w + 100 + range_max_min; + } else { + range_max = max_c + 100 + range_max_min; + } + + //Controls whether the maximum = 0 is infinite + if((max_w == 0 || max_w == 0.00) && min_w != 0){ + max_w = range_max; + } + if((max_c == 0 || max_c == 0.00) && min_c != 0){ + max_c = range_max; + } + + //Scale according to the position + position = 200 / (range_max-range_min); + + //axes + var yScale = d3.scale.linear() + .domain([range_min, range_max]) + .range([100, -100]); + + var yAxis = d3.svg.axis() + .orient("left") + .scale(yScale); + + //create svg + var svg = d3.select("#svg_dinamic"); + //delete elements + svg.selectAll("g").remove(); + svg.selectAll("rect").remove(); + svg.selectAll("text").remove(); + svg.append("g") + .attr("transform", "translate(0, 100)") + .call(yAxis); + + //legend Normal text + svg.append("text") + .attr("x", 0) + .attr("y", -20) + .attr("fill", 'black') + .style("font-family", "arial") + .style("font-weight", "bold") + .style("font-size", 10) + .html(legend_normal) + .style("text-anchor", "first"); + + //legend Normal rect + svg.append("rect") + .attr("id", "legend_normal") + .attr("x", 72) + .attr("y", -30) + .attr("width", 10) + .attr("height", 10) + .style("fill", "#82B92E"); + + //legend Warning text + svg.append("text") + .attr("x", 91) + .attr("y", -20) + .attr("fill", 'black') + .style("font-family", "arial") + .style("font-weight", "bold") + .style("font-size", 10) + .html(legend_warning) + .style("text-anchor", "first"); + + //legend Warning rect + svg.append("rect") + .attr("id", "legend_warning") + .attr("x", 168) + .attr("y", -30) + .attr("width", 10) + .attr("height", 10) + .style("fill", "#ffd731"); + + //legend Critical text + svg.append("text") + .attr("x", 187) + .attr("y", -20) + .attr("fill", 'black') + .style("font-family", "arial") + .style("font-weight", "bold") + .style("font-size", 10) + .html(legend_critical) + .style("text-anchor", "first"); + + //legend critical rect + svg.append("rect") + .attr("id", "legend_critical") + .attr("x", 258) + .attr("y", -30) + .attr("width", 10) + .attr("height", 10) + .style("fill", "#fc4444"); + + //styles for number and axes + svg.selectAll("g .domain") + .style("stroke-width", 2) + .style("fill", "none") + .style("stroke", "black"); + + svg.selectAll("g .tick text") + .style("font-size", "9pt") + .style("font-weight", "initial"); + + //estatus normal + svg.append("rect") + .attr("id", "warning_rect") + .attr("x", 3) + .attr("y", 0) + .attr("width", 300) + .attr("height", 200) + .style("fill", "#82B92E"); + + //controls the inverse warning + if(inverse_w == 0){ + svg.append("rect").transition() + .duration(600) + .attr("id", "warning_rect") + .attr("x", 3) + .attr("y", ((range_max - min_w) * position) - ((max_w - min_w) * position)) + .attr("width", 300) + .attr("height", ((max_w - min_w) * position)) + .style("fill", "#ffd731"); + } + else { + svg.append("rect").transition() + .duration(600) + .attr("id", "warning_rect") + .attr("x", 3) + .attr("y", 200 - ((min_w -range_min) * position)) + .attr("width", 300) + .attr("height", (min_w -range_min) * position) + .style("fill", "#ffd731"); + + svg.append("rect").transition() + .duration(600) + .attr("id", "warning_inverse_rect") + .attr("x", 3) + .attr("y", 0) + .attr("width", 300) + .attr("height", ((range_max - min_w) * position) - ((max_w - min_w) * position)) + .style("fill", "#ffd731"); + + } + //controls the inverse critical + if(inverse_c == 0){ + svg.append("rect").transition() + .duration(600) + .attr("id", "critical_rect") + .attr("x", 3) + .attr("y", ((range_max - min_c) * position) - ((max_c - min_c) * position)) + .attr("width", 300) + .attr("height", ((max_c - min_c) * position)) + .style("fill", "#fc4444"); + } + else { + svg.append("rect").transition() + .duration(600) + .attr("id", "critical_rect") + .attr("x", 3) + .attr("y", 200 - ((min_c -range_min) * position)) + .attr("width", 300) + .attr("height", (min_c -range_min) * position) + .style("fill", "#fc4444"); + + svg.append("rect").transition() + .duration(600) + .attr("id", "critical_inverse_rect") + .attr("x", 3) + .attr("y", 0) + .attr("width", 300) + .attr("height", ((range_max - min_c) * position) - ((max_c - min_c) * position)) + .style("fill", "#fc4444"); + } + } + else { + var message_error_warning = ''; + var message_error_critical = ''; + + d3.select("#svg_dinamic rect").remove(); + //create svg + var svg = d3.select("#svg_dinamic"); + svg.selectAll("g").remove(); + svg.selectAll("rect").remove(); + svg.selectAll("text").remove(); + //message error warning + if (error_w == 1) { + $("#text-max_warning").addClass("input_error"); + svg.append("text") + .attr("x", -90) + .attr("y", 10) + .attr("fill", 'black') + .style("font-family", "arial") + .style("font-weight", "bold") + .style("font-size", 14) + .style("fill", "red") + .html(message_error_warning) + .style("text-anchor", "first"); + } + //message error critical + if (error_c == 1) { + $("#text-max_critical").addClass("input_error"); + svg.append("text") + .attr("x", -90) + .attr("y", 105) + .attr("fill", 'black') + .style("font-family", "arial") + .style("font-weight", "bold") + .style("font-size", 14) + .style("fill", "red") + .html(message_error_critical) + .style("text-anchor", "first"); + } + + } + } diff --git a/pandora_console/include/help/en/help_dynamic_threshold.php b/pandora_console/include/help/en/help_dynamic_threshold.php new file mode 100644 index 0000000000..fb1c3c5c24 --- /dev/null +++ b/pandora_console/include/help/en/help_dynamic_threshold.php @@ -0,0 +1,61 @@ + +

Dynamic threshold

+ +

Dynamic threshold Interval

+ +

+ Introduce a time period in the Dynamic Threshold Interval field and the module will return the data obtained during the interval. This allows Pandora to establish minimum thresholds of critical and warning status according to the server configuration. +

+ The default setting will only give minimums, so if maximum = 0 it will read from the configured minimum to infinite. +

+ Example:
+ warning status min = 5 and max = 0
+ critical status min = 10 and max = 0
+ With these parameters the module will record the following states:
+ - Status normal from -infinite to 4.
+ - Status warning from 5 to 9.
+ - Status critical from 10 to infinite. +

+ Example 2:
+ warning status min = 5 and max = 0 with inverse interval checked
+ critical status min = 10 and max = 0 with inverse interval checked
+ With these parameters the module will record the following states:
+ - Status normal from 10 to infinite.
+ - Status warning disabled.
+ - Status critical from 10 to -infinite. +

+ In these examples if the critical threshold coincides with the warning threshold then status will always read as critical. +

+ +

Advanced options dynamic threshold

+Dynamic threshold Min. / Max. +

+ These fields permit percentage adjustments if it is necessary to extend or reduce dynamically-generated thresholds. + To reduce dynamically-generated thresholds introduce a negative percentage and to extend them introduce a positive percentage. This enables fine-tuning of threshold levels. +

+ +Dynamic threshold Two Tailed: +

+ This field permits the use of both minimum and maximum ranges, given that the default setting only shows minimums. +

+Example:
+warning status min = 5 and max = 10
+critical status min = 10 and max = 15
+These parameters mean the module will record the following states:
+ - Status normal from -infinite to 4 and from 16 to infinite.
+ - Status warning from 5 to 9.
+ - Status critical from 10 to 15. +

+Example 2:
+warning status min = 40 and max = 80 with inverse interval checked
+critical status min = 20 and max = 100 with inverse interval checked
+These parameters mean the module will record the following states:
+ - Status normal from 41 to 79.
+ - Status warning from 21 to 40 and from 80 to 99.
+ - Status critical from -infinite to 20 and from 100 to infinite. +

+For more information, please see the graph showing status according to the values which are introduced. \ No newline at end of file diff --git a/pandora_console/include/help/es/help_dynamic_threshold.php b/pandora_console/include/help/es/help_dynamic_threshold.php new file mode 100644 index 0000000000..4105d223ce --- /dev/null +++ b/pandora_console/include/help/es/help_dynamic_threshold.php @@ -0,0 +1,62 @@ + +

Dynamic threshold

+ +

Dynamic threshold Interval

+ +

+ Dynamic threshold interval permite introducir un intervalo de tiempo, mediante el cual durante el intervalo definido comprobara los datos que ha tenido el módulo según los resultados obtenidos establecerá los mínimos para los umbrales de critical y warning el intervalo de ejecución depende de la configuración del servidor. +

+ Por defecto Solo dará los minimos con lo cual mientras el máximo es = 0 implica que va desde el minimo mostrado hasta el infinito. +

+ Ejemplo:
+ warning status min = 5 y max = 0
+ critical status min = 10 y max = 0
+ Con estos datos nuestro módulo recogerá los siguientes estados:
+ - Estado normal de -infinito a 4.
+ - Estado warning de 5 a 9.
+ - Estado critico de 10 a infinito. +

+ Ejemplo 2:
+ warning status min = 5 y max = 0 con inverse interval seleccionado
+ critical status min = 10 y max = 0 con inverse interval seleccionado
+ Con estos datos nuestro módulo recogerá los siguientes estados:
+ - Estado normal de 10 a infinito.
+ - Estado warning no estaria nunca en warning.
+ - Estado critico de 10 a -infinito. +

+ En estos ejemplos hay que tener en cuenta que en caso de que el umbral critical coincida con el umbral warning prevalece critical. +

+ +

Advanced options dynamic threshold

+Dynamic threshold Min. / Max. +

+ Con estos campos podemos ajustar con porcentajes si queremos ampliar o disminuir los rangos dados dinamicamente. + Si lo que queremos es disminuir los rangos dados dinamicamente introduciriamos porcentajes negativo si lo que queremos es ampliar ese rango estableceremos rangos positivos con lo cual podemos afinar mas aun nuestros umbrales +

+ +Dynamic threshold Two Tailed: +

+ Con este campo podremos tambien definir si queremos ambos rangos tanto el minimo como el maximo ya que por defecto solo dara los minimos. +

+Ejemplo:
+warning status min = 5 y max = 10
+critical status min = 10 y max = 15
+Con estos datos nuestro módulo recogerá los siguientes estados:
+ - Estado normal de -infinito a 4 y de 16 a infinito.
+ - Estado warning de 5 a 9.
+ - Estado critico de 10 a 15. +

+Ejemplo 2:
+warning status min = 40 y max = 80 con inverse interval seleccionado
+critical status min = 20 y max = 100 con inverse interval seleccionado
+Con estos datos nuestro módulo recogerá los siguientes estados:
+ - Estado normal de 41 a 79.
+ - Estado warning de 21 a 40 y de 80 a 99.
+ - Estado critico de -infinito a 20 y de 100 a infinito. +

+Para enterder estos ejemplos mejor utilizar la gráfica que te indicará como estaràn tus estados dependiendo los valores que introduzcas. + diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index d76c5c6b3b..d1512f6bb2 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -1635,6 +1635,9 @@ input[type=image] { border:0px; background-color: transparent !important; } +table#simple{ + padding: 30px; +} table#simple select#id_module_type, table#alert_search select#id_agent, table#alert_search select#id_group, @@ -3566,3 +3569,7 @@ color:#82b92e;font-family:Nunito;font-size:10pt;position:relative;top:6px; .readonly{ background-color: #dedede !important; } + +.input_error { + border: 1px solid red; +} \ No newline at end of file