From f4ec4654db7ff7b502e0db8a9a5a8e193a6770d8 Mon Sep 17 00:00:00 2001 From: mdtrooper Date: Mon, 15 Sep 2014 15:27:48 +0200 Subject: [PATCH 1/2] In the function 'agents_get_modules' improved/fixed the filter of kind 'x IN (N,M,O..)' --- pandora_console/include/functions_agents.php | 47 +++++++++++++++++--- 1 file changed, 42 insertions(+), 5 deletions(-) diff --git a/pandora_console/include/functions_agents.php b/pandora_console/include/functions_agents.php index b87769b304..203a1aacfc 100644 --- a/pandora_console/include/functions_agents.php +++ b/pandora_console/include/functions_agents.php @@ -941,7 +941,10 @@ function agents_get_group_agents ($id_group = 0, $search = false, $case = "lower * @return array An array with all modules in the agent. * If multiple rows are selected, they will be in an array */ -function agents_get_modules ($id_agent = null, $details = false, $filter = false, $indexed = true, $get_not_init_modules = true, $noACLs = false) { +function agents_get_modules ($id_agent = null, $details = false, + $filter = false, $indexed = true, $get_not_init_modules = true, + $noACLs = false) { + global $config; $userGroups = users_get_groups($config['id_user'], 'AR', false); @@ -1014,8 +1017,38 @@ function agents_get_modules ($id_agent = null, $details = false, $filter = false if (! empty ($filter)) { $where .= ' AND '; if (is_array ($filter)) { - $fields = array (); - foreach ($filter as $field => $value) { + $fields = array (); + + + //---------------------------------------------------------- + // Code for filters as array of arrays + // for example: + // $filter = array( + // 'id_modulo' => 2, // networkmap type + // 'id_tipo_modulo' => array( + // '<>2', // != generic_proc + // '<>6', // != remote_icmp_proc + // '<>9')); + //---------------------------------------------------------- + $list_filter = array(); + foreach ($filter as $field => $value) { + if (is_array($value)) { + foreach ($value as $v) { + $list_filter[] = array('field' => $field, + 'value' => $v); + } + } + else { + $list_filter[] = array('field' => $field, + 'value' => $value); + } + } + //---------------------------------------------------------- + + foreach ($list_filter as $item) { + $field = $item['field']; + $value = $item['value']; + //Check <> operator $operatorDistin = false; if (strlen($value) > 2) { @@ -1028,10 +1061,12 @@ function agents_get_modules ($id_agent = null, $details = false, $filter = false switch ($config['dbtype']) { case "mysql": case "postgresql": - array_push ($fields, $field.' LIKE "'.$value.'"'); + array_push ($fields, + $field . ' LIKE "' . $value . '"'); break; case "oracle": - array_push ($fields, $field.' LIKE \''.$value.'\''); + array_push ($fields, + $field . ' LIKE \'' . $value . '\''); break; } } @@ -1142,6 +1177,8 @@ function agents_get_modules ($id_agent = null, $details = false, $filter = false break; } + //html_debug_print($sql); + $result = db_get_all_rows_sql ($sql); if (empty ($result)) { From 92acbb9b44b4b9b804aa64a6b2e108203218e62b Mon Sep 17 00:00:00 2001 From: mdtrooper Date: Tue, 16 Sep 2014 12:25:40 +0200 Subject: [PATCH 2/2] Added the feature show the combined graph in the agent graph tabs. TICKET #1277 --- pandora_console/include/ajax/graph.ajax.php | 41 +++ .../include/functions_custom_graphs.php | 120 ++++++++- pandora_console/include/functions_graph.php | 2 +- pandora_console/include/functions_html.php | 2 +- pandora_console/operation/agentes/graphs.php | 250 +++++++++++++++--- 5 files changed, 361 insertions(+), 54 deletions(-) create mode 100644 pandora_console/include/ajax/graph.ajax.php diff --git a/pandora_console/include/ajax/graph.ajax.php b/pandora_console/include/ajax/graph.ajax.php new file mode 100644 index 0000000000..60ed82cc5c --- /dev/null +++ b/pandora_console/include/ajax/graph.ajax.php @@ -0,0 +1,41 @@ + diff --git a/pandora_console/include/functions_custom_graphs.php b/pandora_console/include/functions_custom_graphs.php index 3d1994f1c1..41b28bb872 100644 --- a/pandora_console/include/functions_custom_graphs.php +++ b/pandora_console/include/functions_custom_graphs.php @@ -28,6 +28,64 @@ global $config; require_once ($config['homedir'] . '/include/functions_graph.php'); require_once ($config['homedir'] . '/include/functions_users.php'); +function custom_graphs_create($id_modules = array(), $name = "", + $description = "", $stacked = CUSTOM_GRAPH_AREA, $width = 0, + $height = 0, $events = 0 , $period = 0, $private = 0, $id_group = 0, + $user = false) { + + global $config; + + if ($user === false) { + $user = $config['id_user']; + } + + $id_graph = db_process_sql_insert('tgraph', + array( + 'id_user' => $user, + 'name' => $name, + 'description' => $description, + 'period' => $period, + 'width' => $width, + 'height' => $height, + 'private' => $private, + 'events' => $events, + 'stacked' => $stacked, + 'id_group' => $id_group, + 'id_graph_template' => 0 + )); + + if (empty($id_graph)) { + return false; + } + else { + $result = true; + foreach ($id_modules as $id_module) { + $result = db_process_sql_insert('tgraph_source', + array( + 'id_graph' => $id_graph, + 'id_agent_module' => $id_module, + 'weight' => 1 + )); + + if (empty($result)) + break; + } + + if (empty($result)) { + //Not it is a complete insert the modules. Delete all + db_process_sql_delete('tgraph_source', + array('id_graph' => $id_graph)); + + db_process_sql_delete('tgraph', + array('id_graph' => $id_graph)); + + return false; + } + + return $id_graph; + } +} + /** * Get all the custom graphs a user can see. * @@ -94,33 +152,69 @@ function custom_graphs_get_user ($id_user = 0, $only_names = false, $returnAllGr function custom_graphs_print($id_graph, $height, $width, $period, $stacked = null, $return = false, $date = 0, $only_image = false, - $background_color = 'white') { + $background_color = 'white', $modules_param = array()) { + global $config; - $graph_conf = db_get_row('tgraph', 'id_graph', $id_graph); + if ($id_graph == 0) { + $graph_conf['stacked'] = CUSTOM_GRAPH_LINE; + } + else { + $graph_conf = db_get_row('tgraph', 'id_graph', $id_graph); + } if ($stacked === null) { $stacked = $graph_conf['stacked']; } - $sources = db_get_all_rows_field_filter('tgraph_source', 'id_graph', - $id_graph); - $modules = array (); - $weights = array (); + $sources = false; + if ($id_graph == 0) { + $modules = $modules_param; + $count_modules = count($modules); + $weights = array_fill(0, $count_modules, 1); + + if ($count_modules > 0) + $sources = true; + } + else { + $sources = db_get_all_rows_field_filter('tgraph_source', 'id_graph', + $id_graph); + + $modules = array (); + $weights = array (); + foreach ($sources as $source) { + array_push ($modules, $source['id_agent_module']); + array_push ($weights, $source['weight']); + } + } + + if ($sources === false) { echo "
" . __('Empty graph') . "
"; return; } - foreach ($sources as $source) { - array_push ($modules, $source['id_agent_module']); - array_push ($weights, $source['weight']); - } - $output = graphic_combined_module($modules, $weights, $period, - $width, $height, '', '', 0, 0, 0, $stacked, $date, $only_image, - '', 1, false, false, $background_color); + + $output = graphic_combined_module($modules, + $weights, + $period, + $width, + $height, + '', + '', + 0, + 0, + 0, + $stacked, + $date, + $only_image, + '', + 1, + false, + false, + $background_color); if ($return) return $output; diff --git a/pandora_console/include/functions_graph.php b/pandora_console/include/functions_graph.php index 9b9b1c6478..3813ae71f5 100755 --- a/pandora_console/include/functions_graph.php +++ b/pandora_console/include/functions_graph.php @@ -745,7 +745,7 @@ function grafico_modulo_sparse ($agent_module_id, $period, $show_events, $projection, $adapt_key, $compare, $series_suffix, $series_suffix_str, $show_unknown); - switch($compare) { + switch ($compare) { case 'separated': // Store the chart calculated $chart_prev = $chart; diff --git a/pandora_console/include/functions_html.php b/pandora_console/include/functions_html.php index bedbdefdca..d6237837df 100644 --- a/pandora_console/include/functions_html.php +++ b/pandora_console/include/functions_html.php @@ -481,7 +481,7 @@ function html_print_select ($fields, $name, $selected = '', $script = '', $lastopttype = ''; foreach ($fields as $value => $label) { $optlabel = $label; - if(is_array($label)) { + if (is_array($label)) { if (isset($label['optgroup'])) { if ($label['optgroup'] != $lastopttype) { if ($lastopttype != '') { diff --git a/pandora_console/operation/agentes/graphs.php b/pandora_console/operation/agentes/graphs.php index 478581c650..35e94c148b 100644 --- a/pandora_console/operation/agentes/graphs.php +++ b/pandora_console/operation/agentes/graphs.php @@ -17,6 +17,7 @@ global $config; require_once ("include/functions_agents.php"); +require_once ("include/functions_custom_graphs.php"); if (! check_acl ($config['id_user'], $id_grupo, "AR")) { db_pandora_audit("ACL Violation", @@ -36,65 +37,123 @@ $label = get_parameter ("label", ""); $start_date = get_parameter ("start_date", date("Y-m-d")); $draw_events = get_parameter ("draw_events", 0); $zoom = get_parameter ("zoom", 1); -$modulesChecked = get_parameter('modules', array()); +$modules = get_parameter('modules', array()); $filter = get_parameter('filter', 0); +$combined = (bool)get_parameter('combined', 1); -$unit = ""; -$modules = agents_get_modules($id_agente); +//---------------------------------------------------------------------- +// Get modules of agent sorted as: +// - modules network no proc +// - modules network proc +// - others +//---------------------------------------------------------------------- +$list_modules = array(); -if (!$filter) { - foreach ($modules as $id => $module) { - $modulesChecked[$id] = 1; - } +$modules_networkmap_no_proc = agents_get_modules( + $id_agente, false, array( + 'id_modulo' => 2, // networkmap type + 'id_tipo_modulo' => array( + '<>2', // != generic_proc + '<>6', // != remote_icmp_proc + '<>9', // != remote_tcp_proc + '<>6', // != remote_tcp_proc + '<>18', // != remote_snmp_proc + '<>21', // != async_proc + '<>31') // != web_proc + )); +if (empty($modules_networkmap_no_proc)) + $modules_networkmap_no_proc = array(); + +$modules_others = agents_get_modules( + $id_agente, false, array( + 'id_tipo_modulo' => array( + '<>2', // != generic_proc + '<>6', // != remote_icmp_proc + '<>9', // != remote_tcp_proc + '<>6', // != remote_tcp_proc + '<>18', // != remote_snmp_proc + '<>21', // != async_proc + '<>31') // != web_proc + )); +if (empty($modules_others)) + $modules_others = array(); + +//Cleaned the duplicate $modules and other things +$modules_others = array_diff_key($modules_others, + $modules_networkmap_no_proc); +foreach ($modules_others as $i => $m) { + $modules_others[$i] = array( + 'optgroup' => __('Other modules'), + 'name' => $m); +} +foreach ($modules_networkmap_no_proc as $i => $m) { + $modules_networkmap_no_proc[$i] = array( + 'optgroup' => __('Modules network no proc'), + 'name' => $m); } +$list_modules = $modules_networkmap_no_proc + + $modules_others; +//---------------------------------------------------------------------- + +if (empty($modules)) { + //Selected the first 6 modules. + $module_ids = array_keys($list_modules); + $module_ids = array_slice($module_ids, 0, 6); + $modules = $module_ids; +} + $table = null; $table->width = '98%'; -$table->size = array(); -$table->size[0] = '20%'; -$table->size[1] = '80%'; - $table->style[0] = 'font-weight: bolder; text-align: right;'; $table->style[1] = ''; +$table->style[2] = 'font-weight: bolder; text-align: right;'; $table->valign[0] = 'top'; +$table->valign[1] = 'top'; +$table->valign[2] = 'top'; +$table->valign[3] = 'top'; + +$table->rowspan[0][0] = 6; +$table->rowspan[0][1] = 6; $table->data[0][0] = __('Modules'); -$listModules = array(); -foreach ($modules as $id => $module) { - $checked = false; - if (isset($modulesChecked[$id])) - $checked = (bool) $modulesChecked[$id]; - $listModules[] = '' . - html_print_checkbox('modules[' . $id . ']', 1, $checked, true, false, '', true) . - ' ' . $module . ''; -} -$table->data[0][1] = implode(' ', $listModules); +$table->data[0][1] = html_print_select($list_modules, 'modules[]', + $modules, '', '', 0, true, true, + true, '', false, "width: 100%; height: 200px;"); -$table->data[1][0] = __('Begin date'); -$table->data[1][1] = html_print_input_text ("start_date", substr ($start_date, 0, 10),'', 10, 40, true); -$table->data[1][1] .= html_print_image ("images/calendar_view_day.png", true, array ("onclick" => "scwShow(scwID('text-start_date'),this);")); +$table->data[0][2] = __('Begin date'); +$table->data[0][3] = html_print_input_text ("start_date", substr ($start_date, 0, 10),'', 10, 40, true); +$table->data[0][3] .= html_print_image ("images/calendar_view_day.png", true, array ("onclick" => "scwShow(scwID('text-start_date'),this);")); -$table->data[2][0] = __('Zoom factor'); +$table->data[1][2] = __('Zoom factor'); $options = array (); -$options[$zoom] = 'x'.$zoom; +$options[$zoom] = 'x' . $zoom; $options[1] = 'x1'; $options[2] = 'x2'; $options[3] = 'x3'; $options[4] = 'x4'; -$table->data[2][1] = html_print_select ($options, "zoom", $zoom, '', '', 0, true); +$table->data[1][3] = html_print_select ($options, "zoom", $zoom, '', '', 0, true); -$table->data[3][0] = __('Time range'); +$table->data[2][2] = __('Time range'); -$table->data[3][1] = html_print_extended_select_for_time('period', $period, '', '', 0, 7, true); +$table->data[2][3] = html_print_extended_select_for_time('period', $period, '', '', 0, 7, true); -$table->data[4][0] = __('Show events'); -$table->data[4][1] = html_print_checkbox ("draw_events", 1, (bool) $draw_events, true); -$table->data[5][0] = __('Show alerts'); -$table->data[5][1] = html_print_checkbox ("draw_alerts", 1, (bool) $draw_alerts, true); +$table->data[3][2] = __('Show events'); +$table->data[3][3] = html_print_checkbox ("draw_events", 1, (bool) $draw_events, true); +$table->data[4][2] = __('Show alerts') . + ui_print_help_tip(__('the combined graph does not show the alerts into this graph'), true); +$table->data[4][3] = html_print_checkbox ("draw_alerts", 1, (bool) $draw_alerts, true); +$table->data[5][2] = __('Show as one combined graph'); +$table->data[5][3] = + html_print_radio_button('combined', 1, __('one combined graph'), + $combined, true); +$table->data[5][3] .= + html_print_radio_button('combined', 0, __('several graphs for each module'), + $combined, true); $htmlForm = '
'; $htmlForm .= html_print_table($table, true); @@ -104,7 +163,7 @@ $htmlForm .= html_print_submit_button (__('Filter'), 'filter_button', false, 'cl $htmlForm .= ''; $htmlForm .= '
'; -ui_toggle($htmlForm,__('Filter graphs'), __('Toggle filter(s)')); +ui_toggle($htmlForm,__('Filter graphs'), __('Toggle filter(s)'), false); $utime = get_system_time (); $current = date("Y-m-d", $utime); @@ -114,14 +173,127 @@ if ($start_date != $current) else $date = $utime; -foreach ($modulesChecked as $idModuleShowGraph => $value) { - echo "

" . $modules[$idModuleShowGraph] . '

'; +if ($combined) { + echo "

" . __('Combined graph') . '

'; - $unit = modules_get_unit ($idModuleShowGraph); + custom_graphs_print(0, + $height, + $width, + $period, + CUSTOM_GRAPH_LINE, + false, + $date, + false, + 'white', + $modules); - echo grafico_modulo_sparse($idModuleShowGraph, $period, $draw_events, $width, $height, - $modules[$idModuleShowGraph], null, $draw_alerts, $avg_only, false, $date, $unit); + echo "
"; + html_print_button(__('Save as custom graph'), 'save_custom_graph', + false, 'save_custom_graph();', 'class="sub save"'); + echo "
"; +} +else { + foreach ($modules as $id_module) { + $title = modules_get_agentmodule_name($id_module); + + echo "

" . $title . '

'; + + $unit = modules_get_unit ($id_module); + + echo grafico_modulo_sparse($id_module, + $period, + $draw_events, + $width, + $height, + $title, + null, + $draw_alerts, + $avg_only, + false, + $date, + $unit); + } } echo "
"; + +//Dialog to save the custom graph +echo ""; ?> + \ No newline at end of file