From ea513994607b6869d006248db9a70d90da18c727 Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Wed, 1 Mar 2023 17:27:32 +0100 Subject: [PATCH 01/35] #10347 create view tactic for groups with monitoring and alerts --- pandora_console/godmode/groups/tactical.php | 189 ++++++++ pandora_console/include/functions_graph.php | 177 +++++++ pandora_console/include/functions_groups.php | 447 ++++++++++++++++-- .../include/javascript/tactical_groups.js | 1 + pandora_console/include/lib/Group.php | 34 +- .../include/styles/tactical_groups.css | 15 + 6 files changed, 831 insertions(+), 32 deletions(-) create mode 100644 pandora_console/godmode/groups/tactical.php create mode 100644 pandora_console/include/javascript/tactical_groups.js create mode 100644 pandora_console/include/styles/tactical_groups.css diff --git a/pandora_console/godmode/groups/tactical.php b/pandora_console/godmode/groups/tactical.php new file mode 100644 index 0000000000..7f095f8472 --- /dev/null +++ b/pandora_console/godmode/groups/tactical.php @@ -0,0 +1,189 @@ + '', + 'label' => __('Monitoring'), + ], + [ + 'link' => '', + 'label' => __('Tactic group'), + ], + ] + ); +} + +ui_require_css_file('tactical_groups'); +ui_require_javascript_file('tactical_groups'); +$groups = groups_get_children($id_group); +$id_groups = []; +if (count($groups) > 0) { + foreach ($groups as $key => $value) { + $id_groups[] = $value['id_grupo']; + } +} else { + $id_groups[] = $id_group; +} + + +echo '
'; +echo ''; +echo ''; +echo ''; +echo ''; +echo ''; +echo ''; +echo '
'; +$table_col1 = new stdClass(); +$table_col1->class = 'no-class'; +$table_col1->data = []; +$table_col1->rowclass[] = ''; +$table_col1->headstyle[0] = 'text-align:center;'; +$table_col1->width = '100%'; +$table_col1->data[0][0] = groups_get_heat_map_agents($id_groups, 320, 100); +$table_col1->data[1][0] = tactical_groups_get_agents_and_monitoring($id_groups); + +$distribution_by_so = '
'; +$distribution_by_so .= '
'; +$distribution_by_so .= ''.__('Distribution by so').''; +$distribution_by_so .= html_print_image('images/spinner.gif', true, ['id' => 'spinner_distribution_by_so_graph']); +$distribution_by_so .= '
'; +$distribution_by_so .= '
'; + + +$table_col1->data[2][0] = $distribution_by_so; + + +ui_toggle( + html_print_table($table_col1, true), + __('Monitoring'), + '', + '', + false, + false +); + +echo '
'; +$table_col2 = new stdClass(); +$table_col2->class = 'no-class'; +$table_col2->data = []; +$table_col2->rowclass[] = ''; +$table_col2->headstyle[0] = 'text-align:center;'; +$table_col2->width = '100%'; +$table_col2->data[0][0] = tactical_groups_get_stats_alerts($id_groups); +$table_col2->data[1][0] = groups_get_stats_modules_status($id_groups); + +$events_by_agents_group = '
'; +$events_by_agents_group .= '
'; +$events_by_agents_group .= ''.__('Events by agent').''; +$events_by_agents_group .= html_print_image('images/spinner.gif', true, ['id' => 'spinner_events_by_agents_group_graph']); +$events_by_agents_group .= '
'; +$events_by_agents_group .= '
'; + + +$table_col2->data[2][0] = $events_by_agents_group; +ui_toggle( + html_print_table($table_col2, true), + __('Alerts'), + '', + '', + false, + false +); +echo '
'; +$table_col3 = new stdClass(); +$table_col3->class = 'no-class'; +$table_col3->data = []; +$table_col3->rowclass[] = ''; +$table_col3->headstyle[0] = 'text-align:center;'; +$table_col3->width = '100%'; +$table_col3->data[0][0] = 'En desarrollo'; + + +ui_toggle( + html_print_table($table_col3, true), + __('Agents'), + '', + '', + false, + false +); +echo '
'; + + +?> + \ No newline at end of file diff --git a/pandora_console/include/functions_graph.php b/pandora_console/include/functions_graph.php index 0f6d03fee7..98ad504b54 100644 --- a/pandora_console/include/functions_graph.php +++ b/pandora_console/include/functions_graph.php @@ -5339,3 +5339,180 @@ function get_baseline_data( $result['agent_alias'] = $array_data[0]['sum0']['agent_alias']; return ['sum0' => $result]; } + + +function graph_so_by_group($id_group, $width=300, $height=200, $recursive=true) +{ + global $config; + + $id_groups = [$id_group]; + + if ($recursive == true) { + $groups = groups_get_children($id_group); + if (count($groups) > 0) { + $id_groups = []; + foreach ($groups as $key => $value) { + $id_groups[] = $value['id_grupo']; + } + } + } + + $sql = sprintf( + 'SELECT COUNT(id_agente) AS count, + os.name + FROM tagente a + LEFT JOIN tconfig_os os ON a.id_os = os.id_os + WHERE a.id_grupo IN (%s) + GROUP BY os.id_os', + implode(',', $id_groups) + ); + + $result = db_get_all_rows_sql($sql, false, false); + if ($result === false) { + $result = []; + } + + $labels = []; + $data = []; + foreach ($result as $key => $row) { + $labels[] = $row['name']; + $data[] = $row['count']; + } + + $water_mark = [ + 'file' => $config['homedir'].'/images/logo_vertical_water.png', + 'url' => ui_get_full_url('images/logo_vertical_water.png', false, false, false), + ]; + + $options = [ + 'width' => $width, + 'height' => $height, + 'waterMark' => $water_mark, + 'legend' => [ + 'display' => true, + 'position' => 'right', + 'align' => 'center', + ], + 'labels' => $labels, + ]; + + return pie_graph( + $data, + $options + ); + +} + + +function graph_events_agent_by_group($id_group, $width=300, $height=200, $noWaterMark=true, $time_limit=false, $recursive=true) +{ + global $config; + + $data = []; + $labels = []; + $loop = 0; + define('NUM_PIECES_PIE_2', 6); + + // Add tags condition to filter. + $tags_condition = tags_get_acl_tags( + $config['id_user'], + 0, + 'ER', + 'event_condition', + 'AND' + ); + + if ($time_limit && $config['event_view_hr']) { + $tags_condition .= ' AND utimestamp > (UNIX_TIMESTAMP(NOW()) - '.($config['event_view_hr'] * SECONDS_1HOUR).')'; + } + + $id_groups = [$id_group]; + if ($recursive === true) { + $groups = groups_get_children($id_group); + if (count($groups) > 0) { + $id_groups = []; + foreach ($groups as $key => $value) { + $id_groups[] = $value['id_grupo']; + } + } + } + + $filter_groups = ' AND te.id_grupo IN ('.implode(',', $id_groups).') '; + + // This will give the distinct id_agente, give the id_grupo that goes + // with it and then the number of times it occured. GROUP BY statement + // is required if both DISTINCT() and COUNT() are in the statement. + $sql = sprintf( + 'SELECT DISTINCT(id_agente) AS id_agente, + COUNT(id_agente) AS count + FROM tevento te + WHERE 1=1 AND estado = 0 %s %s + GROUP BY id_agente + ORDER BY count DESC LIMIT 8', + $tags_condition, + $filter_groups + ); + $result = db_get_all_rows_sql($sql, false, false); + if ($result === false) { + $result = []; + } + + $system_events = 0; + $other_events = 0; + + foreach ($result as $row) { + $row['id_grupo'] = agents_get_agent_group($row['id_agente']); + if (!check_acl($config['id_user'], $row['id_grupo'], 'ER') == 1) { + continue; + } + + if ($loop >= NUM_PIECES_PIE_2) { + $other_events += $row['count']; + } else { + if ($row['id_agente'] == 0) { + $system_events += $row['count']; + } else { + $alias = agents_get_alias($row['id_agente']); + $name = mb_substr($alias, 0, 25).' #'.$row['id_agente'].' ('.$row['count'].')'; + $labels[] = io_safe_output($name); + $data[] = $row['count']; + } + } + + $loop++; + } + + if ($system_events > 0) { + $name = __('SYSTEM').' ('.$system_events.')'; + $labels[] = io_safe_output($name); + $data[] = $system_events; + } + + // Sort the data. + arsort($data); + if ($noWaterMark) { + $water_mark = [ + 'file' => $config['homedir'].'/images/logo_vertical_water.png', + 'url' => ui_get_full_url('images/logo_vertical_water.png', false, false, false), + ]; + } else { + $water_mark = []; + } + + $options = [ + 'width' => $width, + 'height' => $height, + 'waterMark' => $water_mark, + 'legend' => [ + 'display' => true, + 'position' => 'right', + 'align' => 'center', + ], + 'labels' => $labels, + ]; + + return pie_graph( + $data, + $options + ); +} diff --git a/pandora_console/include/functions_groups.php b/pandora_console/include/functions_groups.php index 20841bf26a..752ec4396a 100644 --- a/pandora_console/include/functions_groups.php +++ b/pandora_console/include/functions_groups.php @@ -1276,7 +1276,7 @@ function groups_get_not_init_agents($group, $agent_filter=[], $module_filter=[], * * @return integer Number of monitors. */ -function groups_get_monitors_counter($group, $agent_filter=[], $module_filter=[], $strict_user=false, $groups_and_tags=false, $realtime=false) +function groups_get_monitors_counter($group, $agent_filter=[], $module_filter=[], $strict_user=false, $groups_and_tags=false, $realtime=false, $secondary_group=true) { if (empty($group)) { return 0; @@ -1291,7 +1291,11 @@ function groups_get_monitors_counter($group, $agent_filter=[], $module_filter=[] } $group_str = implode(',', $groups); - $groups_clause = "AND (ta.id_grupo IN ($group_str) OR tasg.id_group IN ($group_str))"; + if ($secondary_group === true) { + $groups_clause = "AND (ta.id_grupo IN ($group_str) OR tasg.id_group IN ($group_str))"; + } else { + $groups_clause = "AND (ta.id_grupo IN ($group_str))"; + } $tags_clause = ''; @@ -1401,10 +1405,12 @@ function groups_get_monitors_counter($group, $agent_filter=[], $module_filter=[] ON tam.id_agente_modulo = tae.id_agente_modulo $modules_clause INNER JOIN tagente ta - ON tam.id_agente = ta.id_agente - LEFT JOIN tagent_secondary_group tasg - ON ta.id_agente = tasg.id_agent - AND ta.disabled = 0 + ON tam.id_agente = ta.id_agente"; + if ($secondary_group === true) { + $sql .= ' LEFT JOIN tagent_secondary_group tasg ON ta.id_agente = tasg.id_agent'; + } + + $sql .= "AND ta.disabled = 0 $agent_name_filter $agents_clause WHERE tam.disabled = 0 @@ -1450,8 +1456,9 @@ function groups_get_monitors_counter($group, $agent_filter=[], $module_filter=[] } $status_columns_str = implode(',', $status_columns_array); + $status_columns_str_sum = implode('+', $status_columns_array); - $sql = "SELECT SUM($status_columns_str) FROM + $sql = "SELECT SUM($status_columns_str_sum) FROM (SELECT DISTINCT(ta.id_agente), $status_columns_str FROM tagente ta LEFT JOIN tagent_secondary_group tasg ON ta.id_agente = tasg.id_agent @@ -1486,11 +1493,11 @@ function groups_get_monitors_counter($group, $agent_filter=[], $module_filter=[] * * @return integer Number of monitors. */ -function groups_get_total_monitors($group, $agent_filter=[], $module_filter=[], $strict_user=false, $groups_and_tags=false, $realtime=false) +function groups_get_total_monitors($group, $agent_filter=[], $module_filter=[], $strict_user=false, $groups_and_tags=false, $realtime=false, $secondary_group=true) { // Always modify the module status filter $module_filter['status'] = AGENT_MODULE_STATUS_ALL; - return groups_get_monitors_counter($group, $agent_filter, $module_filter, $strict_user, $groups_and_tags, $realtime); + return groups_get_monitors_counter($group, $agent_filter, $module_filter, $strict_user, $groups_and_tags, $realtime, $secondary_group); } @@ -1511,11 +1518,11 @@ function groups_get_total_monitors($group, $agent_filter=[], $module_filter=[], * * @return integer Number of monitors. */ -function groups_get_normal_monitors($group, $agent_filter=[], $module_filter=[], $strict_user=false, $groups_and_tags=false, $realtime=false) +function groups_get_normal_monitors($group, $agent_filter=[], $module_filter=[], $strict_user=false, $groups_and_tags=false, $realtime=false, $secondary_group=true) { // Always modify the module status filter $module_filter['status'] = AGENT_MODULE_STATUS_NORMAL; - return groups_get_monitors_counter($group, $agent_filter, $module_filter, $strict_user, $groups_and_tags, $realtime); + return groups_get_monitors_counter($group, $agent_filter, $module_filter, $strict_user, $groups_and_tags, $realtime, $secondary_group); } @@ -1536,11 +1543,11 @@ function groups_get_normal_monitors($group, $agent_filter=[], $module_filter=[], * * @return integer Number of monitors. */ -function groups_get_critical_monitors($group, $agent_filter=[], $module_filter=[], $strict_user=false, $groups_and_tags=false, $realtime=false) +function groups_get_critical_monitors($group, $agent_filter=[], $module_filter=[], $strict_user=false, $groups_and_tags=false, $realtime=false, $secondary_group=true) { // Always modify the module status filter $module_filter['status'] = AGENT_MODULE_STATUS_CRITICAL_BAD; - return groups_get_monitors_counter($group, $agent_filter, $module_filter, $strict_user, $groups_and_tags, $realtime); + return groups_get_monitors_counter($group, $agent_filter, $module_filter, $strict_user, $groups_and_tags, $realtime, $secondary_group); } @@ -1561,11 +1568,11 @@ function groups_get_critical_monitors($group, $agent_filter=[], $module_filter=[ * * @return integer Number of monitors. */ -function groups_get_warning_monitors($group, $agent_filter=[], $module_filter=[], $strict_user=false, $groups_and_tags=false, $realtime=false) +function groups_get_warning_monitors($group, $agent_filter=[], $module_filter=[], $strict_user=false, $groups_and_tags=false, $realtime=false, $secondary_group=true) { // Always modify the module status filter $module_filter['status'] = AGENT_MODULE_STATUS_WARNING; - return groups_get_monitors_counter($group, $agent_filter, $module_filter, $strict_user, $groups_and_tags, $realtime); + return groups_get_monitors_counter($group, $agent_filter, $module_filter, $strict_user, $groups_and_tags, $realtime, $secondary_group); } @@ -1586,11 +1593,11 @@ function groups_get_warning_monitors($group, $agent_filter=[], $module_filter=[] * * @return integer Number of monitors. */ -function groups_get_unknown_monitors($group, $agent_filter=[], $module_filter=[], $strict_user=false, $groups_and_tags=false, $realtime=false) +function groups_get_unknown_monitors($group, $agent_filter=[], $module_filter=[], $strict_user=false, $groups_and_tags=false, $realtime=false, $secondary_group=true) { // Always modify the module status filter $module_filter['status'] = AGENT_MODULE_STATUS_UNKNOWN; - return groups_get_monitors_counter($group, $agent_filter, $module_filter, $strict_user, $groups_and_tags, $realtime); + return groups_get_monitors_counter($group, $agent_filter, $module_filter, $strict_user, $groups_and_tags, $realtime, $secondary_group); } @@ -1611,11 +1618,11 @@ function groups_get_unknown_monitors($group, $agent_filter=[], $module_filter=[] * * @return integer Number of monitors. */ -function groups_get_not_init_monitors($group, $agent_filter=[], $module_filter=[], $strict_user=false, $groups_and_tags=false, $realtime=false) +function groups_get_not_init_monitors($group, $agent_filter=[], $module_filter=[], $strict_user=false, $groups_and_tags=false, $realtime=false, $secondary_group=true) { // Always modify the module status filter $module_filter['status'] = AGENT_MODULE_STATUS_NOT_INIT; - return groups_get_monitors_counter($group, $agent_filter, $module_filter, $strict_user, $groups_and_tags, $realtime); + return groups_get_monitors_counter($group, $agent_filter, $module_filter, $strict_user, $groups_and_tags, $realtime, $secondary_group); } @@ -1746,7 +1753,7 @@ function groups_monitor_total_counters($group_array, $search_in_testado=false) } -function groups_agents_total_counters($group_array) +function groups_agents_total_counters($group_array, $secondary_groups=true) { $default_total = [ 'ok' => 0, @@ -1763,30 +1770,36 @@ function groups_agents_total_counters($group_array) } $group_clause = implode(',', $group_array); - $group_clause = "(tasg.id_group IN ($group_clause) OR ta.id_grupo IN ($group_clause))"; + if ($secondary_groups === true) { + $group_clause = "(tasg.id_group IN ($group_clause) OR ta.id_grupo IN ($group_clause))"; + } else { + $group_clause = "(ta.id_grupo IN ($group_clause))"; + } $condition_critical = agents_get_status_clause(AGENT_STATUS_CRITICAL); $condition_warning = agents_get_status_clause(AGENT_STATUS_WARNING); $condition_unknown = agents_get_status_clause(AGENT_STATUS_UNKNOWN); $condition_not_init = agents_get_status_clause(AGENT_STATUS_NOT_INIT); $condition_normal = agents_get_status_clause(AGENT_STATUS_NORMAL); + $sql = "SELECT SUM(IF($condition_normal, 1, 0)) AS ok, SUM(IF($condition_critical, 1, 0)) AS critical, SUM(IF($condition_warning, 1, 0)) AS warning, SUM(IF($condition_unknown, 1, 0)) AS unknown, SUM(IF($condition_not_init, 1, 0)) AS not_init, COUNT(ta.id_agente) AS total - FROM tagente ta - WHERE ta.disabled = 0 + FROM tagente ta + WHERE ta.disabled = 0 AND ta.id_agente IN ( - SELECT ta.id_agente FROM tagente ta - LEFT JOIN tagent_secondary_group tasg - ON ta.id_agente = tasg.id_agent - WHERE ta.disabled = 0 - AND $group_clause - GROUP BY ta.id_agente - ) - "; + SELECT ta.id_agente FROM tagente ta"; + if ($secondary_groups === true) { + $sql .= ' LEFT JOIN tagent_secondary_group tasg ON ta.id_agente = tasg.id_agent'; + } + + $sql .= " WHERE ta.disabled = 0 + AND $group_clause + GROUP BY ta.id_agente + )"; $agents = db_get_row_sql($sql); @@ -2438,3 +2451,375 @@ function groups_get_group_deep($id_group) return $deep; } + + +function groups_get_heat_map_agents(array $id_group, float $width=0, float $height=0) +{ + ui_require_css_file('heatmap'); + + if (is_array($id_group) === false) { + $id_group = [$id_group]; + } + + $sql = 'SELECT * FROM tagente WHERE id_grupo IN('.implode(',', $id_group).')'; + + $all_agents = db_get_all_rows_sql($sql); + hd($sql, true); + if (empty($all_agents)) { + return null; + } + + $total_agents = count($all_agents); + + // Best square. + $high = (float) max($width, $height); + $low = 0.0; + + while (abs($high - $low) > 0.000001) { + $mid = (($high + $low) / 2.0); + $midval = (floor($width / $mid) * floor($height / $mid)); + if ($midval >= $total_agents) { + $low = $mid; + } else { + $high = $mid; + } + } + + $square_length = min(($width / floor($width / $low)), ($height / floor($height / $low))); + + // Print starmap. + $html = sprintf( + '', + $id_group, + $width, + $height + ); + + $html .= ''; + $row = 0; + $column = 0; + $x = 0; + $y = 0; + $cont = 1; + + foreach ($all_agents as $key => $value) { + // Colour by status. + $status = agents_get_status_from_counts($value); + + switch ($status) { + case 5: + // Not init status. + $status = 'notinit'; + break; + + case 1: + // Critical status. + $status = 'critical'; + break; + + case 2: + // Warning status. + $status = 'warning'; + break; + + case 0: + // Normal status. + $status = 'normal'; + break; + + case 3: + case -1: + default: + // Unknown status. + $status = 'unknown'; + break; + } + + $html .= sprintf( + '', + 'rect_'.$cont, + $x, + $y, + $row, + $column, + $square_length, + $square_length, + $status, + random_int(1, 10) + ); + + $y += $square_length; + $row++; + if ((int) ($y + $square_length) > (int) $height) { + $y = 0; + $x += $square_length; + $row = 0; + $column++; + } + + if ((int) ($x + $square_length) > (int) $width) { + $x = 0; + $y += $square_length; + $column = 0; + $row++; + } + + $cont++; + } + ?> + + '; + $html .= ''; + + return $html; +} + + +function tactical_groups_get_agents_and_monitoring($id_groups) +{ + global $config; + + $data = [ + 'total_agents' => groups_agents_total_counters($id_groups, false)['total'], + 'monitor_total' => groups_get_total_monitors($id_groups, [], [], false, false, false, false), + ]; + + // Link URLS + $urls = []; + $urls['total_agents'] = $config['homeurl'].'index.php?sec=estado&sec2=operation/agentes/estado_agente&refr=60'; + $urls['monitor_total'] = $config['homeurl'].'index.php?sec=view&sec2=operation/agentes/status_monitor&refr=60&status=-1'; + + $table_am = html_get_predefined_table(); + $tdata = []; + $tdata[0] = html_print_image('images/agent.png', true, ['title' => __('Total agents'), 'class' => 'invert_filter'], false, false, false, true); + $tdata[1] = $data['total_agents'] <= 0 ? '-' : $data['total_agents']; + $tdata[1] = ''.$tdata[1].''; + + if ($data['total_agents'] > 500 && !enterprise_installed()) { + $tdata[2] = "
"; + } + + $tdata[3] = html_print_image('images/module.png', true, ['title' => __('Monitor checks'), 'class' => 'invert_filter'], false, false, false, true); + $tdata[4] = $data['monitor_total'] <= 0 ? '-' : $data['monitor_total']; + $tdata[4] = ''.$tdata[4].''; + + /* + Hello there! :) + We added some of what seems to be "buggy" messages to the openSource version recently. This is not to force open-source users to move to the enterprise version, this is just to inform people using Pandora FMS open source that it requires skilled people to maintain and keep it running smoothly without professional support. This does not imply open-source version is limited in any way. If you check the recently added code, it contains only warnings and messages, no limitations except one: we removed the option to add custom logo in header. In the Update Manager section, it warns about the 'danger’ of applying automated updates without a proper backup, remembering in the process that the Enterprise version comes with a human-tested package. Maintaining an OpenSource version with more than 500 agents is not so easy, that's why someone using a Pandora with 8000 agents should consider asking for support. It's not a joke, we know of many setups with a huge number of agents, and we hate to hear that “its becoming unstable and slow” :( + You can of course remove the warnings, that's why we include the source and do not use any kind of trick. And that's why we added here this comment, to let you know this does not reflect any change in our opensource mentality of does the last 14 years. + */ + if ($data['total_agents']) { + if (($data['monitor_total'] / $data['total_agents'] > 100) && !enterprise_installed()) { + $tdata[5] = "
"; + } + } + + $table_am->rowclass[] = ''; + $table_am->data[] = $tdata; + + $output = '
+ '.__('Total agents and monitors').''.html_print_table($table_am, true).'
'; + + return $output; +} + + +function tactical_groups_get_stats_alerts($id_groups) +{ + global $config; + + $alerts = groups_monitor_alerts_total_counters($id_groups); + $data = [ + 'monitor_alerts' => $alerts['total'], + 'monitor_alerts_fired' => $alerts['fired'], + + ]; + + $urls = []; + $urls['monitor_alerts'] = $config['homeurl'].'index.php?sec=estado&sec2=operation/agentes/alerts_status&refr=60'; + $urls['monitor_alerts_fired'] = $config['homeurl'].'index.php?sec=estado&sec2=operation/agentes/alerts_status&refr=60&disabled=fired'; + + // Alerts table. + $table_al = html_get_predefined_table(); + + $tdata = []; + $tdata[0] = html_print_image('images/bell.png', true, ['title' => __('Defined alerts'), 'class' => 'invert_filter'], false, false, false, true); + $tdata[1] = $data['monitor_alerts'] <= 0 ? '-' : $data['monitor_alerts']; + $tdata[1] = ''.$tdata[1].''; + + /* + Hello there! :) + We added some of what seems to be "buggy" messages to the openSource version recently. This is not to force open-source users to move to the enterprise version, this is just to inform people using Pandora FMS open source that it requires skilled people to maintain and keep it running smoothly without professional support. This does not imply open-source version is limited in any way. If you check the recently added code, it contains only warnings and messages, no limitations except one: we removed the option to add custom logo in header. In the Update Manager section, it warns about the 'danger’ of applying automated updates without a proper backup, remembering in the process that the Enterprise version comes with a human-tested package. Maintaining an OpenSource version with more than 500 agents is not so easy, that's why someone using a Pandora with 8000 agents should consider asking for support. It's not a joke, we know of many setups with a huge number of agents, and we hate to hear that “its becoming unstable and slow” :( + You can of course remove the warnings, that's why we include the source and do not use any kind of trick. And that's why we added here this comment, to let you know this does not reflect any change in our opensource mentality of does the last 14 years. + */ + + if ($data['monitor_alerts'] > $data['total_agents'] && !enterprise_installed()) { + $tdata[2] = "
"; + } + + $tdata[3] = html_print_image( + 'images/bell_error.png', + true, + [ + 'title' => __('Fired alerts'), + 'class' => 'invert_filter', + ], + false, + false, + false, + true + ); + $tdata[4] = $data['monitor_alerts_fired'] <= 0 ? '-' : $data['monitor_alerts_fired']; + $tdata[4] = ''.$tdata[4].''; + $table_al->rowclass[] = ''; + $table_al->data[] = $tdata; + + if (!is_metaconsole()) { + $output = '
+ '.__('Defined and fired alerts').''.html_print_table($table_al, true).'
'; + } else { + // Remove the defined alerts cause with the new cache table is difficult to retrieve them. + unset($table_al->data[0][0], $table_al->data[0][1]); + + $table_al->class = 'tactical_view'; + $table_al->style = []; + $output = '
+ '.__('Fired alerts').''.html_print_table($table_al, true).'
'; + } + + return $output; +} + + +function groups_get_stats_modules_status($id_groups, $graph_width=250, $graph_height=150, $links=false, $data_agents=false) +{ + global $config; + + $data = [ + 'monitor_critical' => groups_get_critical_monitors($id_groups, [], [], false, false, false, false), + 'monitor_warning' => groups_get_warning_monitors($id_groups, [], [], false, false, false, false), + 'monitor_ok' => groups_get_normal_monitors($id_groups, [], [], false, false, false, false), + 'monitor_unknown' => groups_get_unknown_monitors($id_groups, [], [], false, false, false, false), + 'monitor_not_init' => groups_get_not_init_monitors($id_groups, [], [], false, false, false, false), + ]; + + // Link URLS. + if ($links === false) { + $urls = []; + $urls['monitor_critical'] = $config['homeurl'].'index.php?'.'sec=view&sec2=operation/agentes/status_monitor&'.'refr=60&status='.AGENT_MODULE_STATUS_CRITICAL_BAD.'&pure='.$config['pure'].'&recursion=1&ag_group='.$id_group; + $urls['monitor_warning'] = $config['homeurl'].'index.php?'.'sec=view&sec2=operation/agentes/status_monitor&'.'refr=60&status='.AGENT_MODULE_STATUS_WARNING.'&pure='.$config['pure'].'&recursion=1&ag_group='.$id_group; + $urls['monitor_ok'] = $config['homeurl'].'index.php?'.'sec=view&sec2=operation/agentes/status_monitor&'.'refr=60&status='.AGENT_MODULE_STATUS_NORMAL.'&pure='.$config['pure'].'&recursion=1&ag_group='.$id_group; + $urls['monitor_unknown'] = $config['homeurl'].'index.php?'.'sec=view&sec2=operation/agentes/status_monitor&'.'refr=60&status='.AGENT_MODULE_STATUS_UNKNOWN.'&pure='.$config['pure'].'&recursion=1&ag_group='.$id_group; + $urls['monitor_not_init'] = $config['homeurl'].'index.php?'.'sec=view&sec2=operation/agentes/status_monitor&'.'refr=60&status='.AGENT_MODULE_STATUS_NOT_INIT.'&pure='.$config['pure'].'&recursion=1&ag_group='.$id_group; + } else { + $urls = []; + $urls['monitor_critical'] = $links['monitor_critical']; + $urls['monitor_warning'] = $links['monitor_warning']; + $urls['monitor_ok'] = $links['monitor_ok']; + $urls['monitor_unknown'] = $links['monitor_unknown']; + $urls['monitor_not_init'] = $links['monitor_not_init']; + } + + // Fixed width non interactive charts + $status_chart_width = $graph_width; + + // Modules by status table + $table_mbs = html_get_predefined_table(); + + $tdata = []; + $tdata[0] = html_print_image('images/module_critical.png', true, ['title' => __('Monitor critical')], false, false, false, true); + $tdata[1] = $data['monitor_critical'] <= 0 ? '-' : $data['monitor_critical']; + $tdata[1] = ''.$tdata[1].''; + + $tdata[2] = html_print_image('images/module_warning.png', true, ['title' => __('Monitor warning')], false, false, false, true); + $tdata[3] = $data['monitor_warning'] <= 0 ? '-' : $data['monitor_warning']; + $tdata[3] = ''.$tdata[3].''; + $table_mbs->rowclass[] = ''; + $table_mbs->data[] = $tdata; + + $tdata = []; + $tdata[0] = html_print_image('images/module_ok.png', true, ['title' => __('Monitor normal')], false, false, false, true); + $tdata[1] = $data['monitor_ok'] <= 0 ? '-' : $data['monitor_ok']; + $tdata[1] = ''.$tdata[1].''; + + $tdata[2] = html_print_image('images/module_unknown.png', true, ['title' => __('Monitor unknown')], false, false, false, true); + $tdata[3] = $data['monitor_unknown'] <= 0 ? '-' : $data['monitor_unknown']; + $tdata[3] = ''.$tdata[3].''; + $table_mbs->rowclass[] = ''; + $table_mbs->data[] = $tdata; + + $tdata = []; + $tdata[0] = html_print_image('images/module_notinit.png', true, ['title' => __('Monitor not init')], false, false, false, true); + $tdata[1] = $data['monitor_not_init'] <= 0 ? '-' : $data['monitor_not_init']; + $tdata[1] = ''.$tdata[1].''; + + $tdata[2] = $tdata[3] = ''; + $table_mbs->rowclass[] = ''; + $table_mbs->data[] = $tdata; + + if ($data['monitor_checks'] > 0) { + $tdata = []; + $table_mbs->colspan[count($table_mbs->data)][0] = 4; + $table_mbs->cellstyle[count($table_mbs->data)][0] = 'text-align: center;'; + $tdata[0] = '
'.'
'.graph_agent_status(false, $graph_width, $graph_height, true, true, $data_agents).'
'; + $table_mbs->rowclass[] = ''; + $table_mbs->data[] = $tdata; + } + + if (!is_metaconsole()) { + $output = ' +
+ '.__('Monitors by status').''.html_print_table($table_mbs, true).'
'; + } else { + $table_mbs->class = 'tactical_view'; + $table_mbs->style = []; + $output = ' +
+ '.__('Monitors by status').''.html_print_table($table_mbs, true).'
'; + } + + return $output; +} + + +function groups_get_agents_group($id_groups) +{ + global $config; + + if (is_array($id_groups) === false) { + $id_groups = [$id_groups]; + } + + if ($rows === false) { + $rows = []; + } + + return $rows; +} \ No newline at end of file diff --git a/pandora_console/include/javascript/tactical_groups.js b/pandora_console/include/javascript/tactical_groups.js new file mode 100644 index 0000000000..cf2a8ca42d --- /dev/null +++ b/pandora_console/include/javascript/tactical_groups.js @@ -0,0 +1 @@ +function showInfoAgent(id_agent) {} diff --git a/pandora_console/include/lib/Group.php b/pandora_console/include/lib/Group.php index 1f34f941fd..745b1e4039 100644 --- a/pandora_console/include/lib/Group.php +++ b/pandora_console/include/lib/Group.php @@ -43,7 +43,11 @@ class Group extends Entity * * @var array */ - private static $ajaxMethods = ['getGroupsForSelect']; + private static $ajaxMethods = [ + 'getGroupsForSelect', + 'distributionBySoGraph', + 'groupEventsByAgent', + ]; /** @@ -473,4 +477,32 @@ class Group extends Entity } + public static function distributionBySoGraph() + { + global $config; + $id_group = get_parameter('id_group', ''); + include_once $config['homedir'].'/include/functions_graph.php'; + + $out = '
'; + $out .= graph_so_by_group($id_group); + $out .= '
'; + echo $out; + return; + } + + + public static function groupEventsByAgent() + { + global $config; + $id_group = get_parameter('id_group', ''); + include_once $config['homedir'].'/include/functions_graph.php'; + + $out = '
'; + $out .= graph_events_agent_by_group($id_group, 300, 200, true, true); + $out .= '
'; + echo $out; + return; + } + + } diff --git a/pandora_console/include/styles/tactical_groups.css b/pandora_console/include/styles/tactical_groups.css new file mode 100644 index 0000000000..423292a336 --- /dev/null +++ b/pandora_console/include/styles/tactical_groups.css @@ -0,0 +1,15 @@ +.tactical_group_left_column { + vertical-align: top; + min-width: 30em; + width: 30%; + padding-top: 0px; +} +.tactical_group_right_column { + width: 40%; + vertical-align: top; + min-width: 30em; + padding-top: 0px; +} +rect { + cursor: pointer; +} From a4a5650a01f7ef084daaf54bb3b150757fb090f3 Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Thu, 2 Mar 2023 11:10:37 +0100 Subject: [PATCH 02/35] #10347 added modal in heatmap agent --- pandora_console/godmode/groups/tactical.php | 2 +- pandora_console/include/functions_groups.php | 17 ----- .../include/javascript/tactical_groups.js | 19 ++++- pandora_console/include/lib/Group.php | 71 +++++++++++++++++++ .../include/styles/tactical_groups.css | 10 +++ 5 files changed, 100 insertions(+), 19 deletions(-) diff --git a/pandora_console/godmode/groups/tactical.php b/pandora_console/godmode/groups/tactical.php index 7f095f8472..faa1628ec0 100644 --- a/pandora_console/godmode/groups/tactical.php +++ b/pandora_console/godmode/groups/tactical.php @@ -160,7 +160,7 @@ ui_toggle( echo ''; echo ''; echo ''; - +echo '' ?> \ No newline at end of file diff --git a/pandora_console/godmode/modules/manage_inventory_modules.php b/pandora_console/godmode/modules/manage_inventory_modules.php index 5422ae451b..a8faa13a66 100644 --- a/pandora_console/godmode/modules/manage_inventory_modules.php +++ b/pandora_console/godmode/modules/manage_inventory_modules.php @@ -332,14 +332,16 @@ if ($result === false) { if ($management_allowed === true) { // Update module. - $data[4] = ''; - $data[4] .= html_print_image('images/config.png', true, ['border' => '0', 'title' => __('Update'), 'class' => 'invert_filter']).''; + $data[4] = ''; } array_push($table->data, $data); @@ -349,22 +351,50 @@ if ($result === false) { html_print_input_hidden('multiple_delete', 1); html_print_table($table); echo ''; - $tablePagination = ui_pagination($total_modules, 'index.php?sec='.$sec.'&sec2=godmode/modules/manage_inventory_modules', $offset, 0, true, 'offset', false); - $actionButtons = []; + echo '
'; + echo html_print_input_hidden('create_module_inventory', 1); + echo ''; + + $tablePagination = ui_pagination( + $total_modules, + 'index.php?sec='.$sec.'&sec2=godmode/modules/manage_inventory_modules', + $offset, + 0, + true, + 'offset', + false + ); + + $actionButtons = ''; if ($management_allowed === true) { - $actionButtons[] = html_print_submit_button(__('Delete'), 'delete_btn', false, ['icon' => 'delete', 'mode' => 'secondary', 'form' => 'form_delete'], true); - $actionButtons[] = html_print_submit_button(__('Create'), 'crt', false, ['icon' => 'wand', 'form' => 'form_create'], true); + $actionButtons .= html_print_submit_button( + __('Create'), + 'crt', + false, + [ + 'icon' => 'wand', + 'form' => 'form_create', + ], + true + ); - $actionButtons[] = ''; - $actionButtons[] = html_print_input_hidden('create_module_inventory', 1, true); - $actionButtons[] = ''; + $actionButtons .= html_print_submit_button( + __('Delete'), + 'delete_btn', + false, + [ + 'icon' => 'delete', + 'mode' => 'secondary', + 'form' => 'form_delete', + ], + true + ); } - html_print_action_buttons( - implode('', $actionButtons), + $actionButtons, [ 'type' => 'form_action', 'right_content' => $tablePagination, diff --git a/pandora_console/godmode/modules/manage_inventory_modules_form.php b/pandora_console/godmode/modules/manage_inventory_modules_form.php index 65597d7af1..32424b7f39 100644 --- a/pandora_console/godmode/modules/manage_inventory_modules_form.php +++ b/pandora_console/godmode/modules/manage_inventory_modules_form.php @@ -26,22 +26,32 @@ if (! check_acl($config['id_user'], 0, 'PM') && ! check_acl($config['id_user'], // Header -if (defined('METACONSOLE')) { +if (is_metaconsole() === true) { $sec = 'advanced'; enterprise_include_once('meta/include/functions_components_meta.php'); components_meta_print_header(); } else { $sec = 'gmodules'; - ui_print_page_header( - __('Module management').' » '.__('Inventory modules'), + ui_print_standard_header( + __('Module management'), 'images/op_inventory.png', false, '', - true + true, + [], + [ + [ + 'link' => '', + 'label' => __('Configuration'), + ], + [ + 'link' => '', + 'label' => __('Inventory modules'), + ], + ] ); } -// Header $is_windows = strtoupper(substr(PHP_OS, 0, 3)) == 'WIN'; if ($is_windows) { ui_print_error_message(__('Not supported in Windows systems')); @@ -95,82 +105,166 @@ if ($id_os == null) { $table = new stdClass(); $table->width = '100%'; -$table->class = 'databox filters'; +$table->class = 'databox filter-table-adv'; $table->style = []; -$table->style[0] = 'font-weight: bold'; +$table->style[0] = 'width: 50%'; +$table->style[1] = 'width: 50%'; $table->data = []; -$table->data[0][0] = ''.__('Name').''; -$table->data[0][1] = html_print_input_text('name', $name, '', 45, 100, true, $disabled); -$table->data[1][0] = ''.__('Description').''; -$table->data[1][1] = html_print_input_text('description', $description, '', 60, 500, true); -$table->data[2][0] = ''.__('OS').''; -$table->data[2][1] = html_print_select_from_sql( - 'SELECT id_os, name FROM tconfig_os ORDER BY name', - 'id_os', - $id_os, - '', - '', - '', - $return = true + +$table->data[0][] = html_print_label_input_block( + __('Name'), + html_print_input_text( + 'name', + $name, + '', + 45, + 100, + true, + $disabled + ) ); -$table->data[3][0] = ''.__('Interpreter').''; -$table->data[3][1] = html_print_input_text('interpreter', $interpreter, '', 25, 100, true); -$table->data[3][1] .= ui_print_help_tip(__('Left blank for the LOCAL inventory modules'), true); +$table->data[0][] = html_print_label_input_block( + __('Description'), + html_print_input_text( + 'description', + $description, + '', + 60, + 500, + true + ) +); -$table->data['block_mode'][0] = ''.__('Block Mode').''; -$table->data['block_mode'][1] = html_print_checkbox('block_mode', 1, $block_mode, true); +$table->data[1][] = html_print_label_input_block( + __('OS'), + html_print_select_from_sql( + 'SELECT id_os, name FROM tconfig_os ORDER BY name', + 'id_os', + $id_os, + '', + '', + '', + $return = true + ) +); -$table->data[4][0] = ''.__('Format').''; -$table->data[4][0] .= ui_print_help_tip(__('separate fields with ').SEPARATOR_COLUMN, true); -$table->data[4][1] = html_print_input_text('format', $data_format, '', 50, 100, true); +$table->data[1][] = html_print_label_input_block( + __('Interpreter'), + html_print_input_text( + 'interpreter', + $interpreter, + '', + 25, + 100, + true + ).ui_print_input_placeholder( + __('Left blank for the LOCAL inventory modules'), + true + ) +); -$table->data[5][0] = ''.__('Script mode').''; -$table->data[5][0] .= ui_print_help_tip(__(''), true); -$table->data[5][1] = __('Use script'); -$table->data[5][1] .= html_print_radio_button( - 'script_mode', - 1, - '', - $script_mode, - true -).'  '; -$table->data[5][1] .= '    '.__('Use inline code'); -$table->data[5][1] .= html_print_radio_button( - 'script_mode', - 2, - '', - $script_mode, - true -).'  '; +$table->data[2][] = html_print_label_input_block( + __('Format'), + html_print_input_text( + 'format', + $data_format, + '', + 50, + 100, + true + ).ui_print_input_placeholder( + __('separate fields with ').SEPARATOR_COLUMN, + true + ) +); -$table->data[6][0] = ''.__('Script path').''; -$table->data[6][1] = html_print_input_text('script_path', $script_path, '', 50, 1000, true); +$table->data[2][] = html_print_label_input_block( + __('Block Mode'), + html_print_checkbox_switch( + 'block_mode', + 1, + $block_mode, + true + ) +); -$table->data[7][0] = ''.__('Code').''; -$table->data[7][0] .= ui_print_help_tip(__("Here is placed the script for the REMOTE inventory modules Local inventory modules don't use this field").SEPARATOR_COLUMN, true); +$radioButtons = []; +$radioButtons[] = html_print_radio_button('script_mode', 1, __('Script mode'), $script_mode, true); +$radioButtons[] = html_print_radio_button('script_mode', 2, __('Use inline code'), $script_mode, true); -$table->data[7][1] = html_print_textarea('code', 25, 80, base64_decode($code), '', true); +$table->data[3][] = html_print_label_input_block( + __('Script mode'), + html_print_div( + [ + 'class' => 'switch_radio_button', + 'content' => implode('', $radioButtons), + ], + true + ) +); -echo 'colspan[4][0] = 2; + +$table->data[4][0] = html_print_label_input_block( + __('Script path'), + html_print_input_text( + 'script_path', + $script_path, + '', + 50, + 1000, + true + ), + ['div_class' => 'script_path_inventory_modules'] +); + +$table->data[4][0] .= html_print_label_input_block( + __('Code'), + html_print_textarea( + 'code', + 25, + 80, + base64_decode($code), + '', + true + ).ui_print_input_placeholder( + __("Here is placed the script for the REMOTE inventory modules Local inventory modules don't use this field").SEPARATOR_COLUMN, + true + ), + ['div_class' => 'code_inventory_modules'] +); + +echo ''; html_print_table($table); if ($id_module_inventory) { html_print_input_hidden('update_module_inventory', 1); html_print_input_hidden('id_module_inventory', $id_module_inventory); + $buttonCaption = __('Update'); + $buttonIcon = 'update'; } else { html_print_input_hidden('create_module_inventory', 1); + $buttonCaption = __('Create'); + $buttonIcon = 'wand'; } -echo '
'; -if ($id_module_inventory) { - html_print_submit_button(__('Update'), 'submit', false, 'class="sub next"'); -} else { - html_print_submit_button(__('Create'), 'submit', false, 'class="sub upd"'); -} +$actionButtons = ''; +$actionButtons = html_print_submit_button( + $buttonCaption, + 'submit', + false, + ['icon' => $buttonIcon], + true +); +$actionButtons .= html_print_go_back_button( + 'index.php?sec=gmodules&sec2=godmode/modules/manage_inventory_modules', + ['button_class' => ''], + true +); -echo '
'; +html_print_action_buttons($actionButtons); echo '
'; ?> @@ -180,21 +274,21 @@ echo ''; var mode = ; if (mode == 1) { - $('#table1-6').show(); - $('#table1-7').hide(); + $('.script_path_inventory_modules').show(); + $('.code_inventory_modules').hide(); } else { - $('#table1-7').show(); - $('#table1-6').hide(); + $('.code_inventory_modules').show(); + $('.script_path_inventory_modules').hide(); } $('input[type=radio][name=script_mode]').change(function() { if (this.value == 1) { - $('#table1-6').show(); - $('#table1-7').hide(); + $('.script_path_inventory_modules').show(); + $('.code_inventory_modules').hide(); } else if (this.value == 2) { - $('#table1-7').show(); - $('#table1-6').hide(); + $('.code_inventory_modules').show(); + $('.script_path_inventory_modules').hide(); } }); }); diff --git a/pandora_console/godmode/modules/manage_network_components.php b/pandora_console/godmode/modules/manage_network_components.php index 44d35d3f06..a3050f02e9 100644 --- a/pandora_console/godmode/modules/manage_network_components.php +++ b/pandora_console/godmode/modules/manage_network_components.php @@ -615,18 +615,6 @@ $url = ui_get_url_refresh( true, false ); -$name_url = 'index.php?sec=templates&sec2=godmode/modules/manage_network_components'; -$table = new stdClass(); -$table->width = '100%'; -$table->class = 'databox filters'; - -$table->style = []; -$table->style[0] = 'font-weight: bold'; -$table->style[2] = 'font-weight: bold'; - -$table->data = []; - -$table->data[0][0] = __('Group'); $component_groups = network_components_get_groups(); @@ -656,54 +644,81 @@ foreach ($component_groups as $component_group_key => $component_group_val) { } } -$table->data[0][1] = html_print_select( - $component_groups, - 'search_id_group', - $search_id_group, +$name_url = 'index.php?sec=templates&sec2=godmode/modules/manage_network_components'; +$table = new stdClass(); +$table->width = '100%'; +$table->class = 'filter-table-adv'; + +$table->style = []; +$table->style[0] = 'font-weight: bold'; +$table->style[2] = 'font-weight: bold'; + +$table->data = []; + +$table->data[0][] = html_print_label_input_block( + __('Group'), + html_print_select( + $component_groups, + 'search_id_group', + $search_id_group, + '', + __('All'), + 0, + true, + false, + false, + '', + false, + 'width: 100%' + ) +); + +$table->data[0][] = html_print_label_input_block( + __('Free Search'), + html_print_input_text( + 'search_string', + $search_string, + '', + 25, + 255, + true + ).ui_print_input_placeholder( + __('Search by name, description, tcp send or tcp rcv, list matches.'), + true + ) +); + +$toggleFilters = '
'; +$toggleFilters .= html_print_table($table, true); +$toggleFilters .= html_print_div( + [ + 'class' => 'action-buttons-right-forced', + 'content' => html_print_submit_button( + __('Filter'), + 'search', + false, + [ + 'icon' => 'search', + 'mode' => 'mini', + ], + true + ), + ], + true +); +$toggleFilters .= '
'; + +ui_toggle( + $toggleFilters, + ''.__('Filters').'', + 'filter_form', '', - __('All'), - 0, true, false, - false -); -$table->data[0][2] = __('Free Search').ui_print_help_tip( - __('Search by name, description, tcp send or tcp rcv, list matches.'), - true -); -$table->data[0][3] = html_print_input_text( - 'search_string', - $search_string, '', - 25, - 255, - true + 'white-box-content', + 'box-flat white_table_graph fixed_filter_bar' ); -if (is_metaconsole() === true) { - $table->data[0][4] = '
'; -} else { - $table->data[0][4] = '
'; -} - -$table->data[0][4] .= html_print_submit_button( - __('Search'), - 'search', - false, - 'class="sub search"', - true -); -$table->data[0][4] .= '
'; - -if (is_metaconsole() === true) { - $filter = '
'; - $filter .= html_print_table($table, true); - $filter .= '
'; - ui_toggle($filter, __('Show Options')); -} else { - echo '
'; - html_print_table($table); - echo '
'; -} $filter = []; if ($search_id_group) { @@ -721,7 +736,6 @@ $total_components = network_components_get_network_components( ); $total_components = $total_components[0]['total']; $offset_delete = ($offset >= ($total_components - 1)) ? ($offset - $config['block_size']) : $offset; -ui_pagination($total_components, $name_url); $filter['offset'] = (int) get_parameter('offset'); $filter['limit'] = (int) $config['block_size']; $components = network_components_get_network_components( diff --git a/pandora_console/godmode/reporting/create_container.php b/pandora_console/godmode/reporting/create_container.php index 26231fc107..a1361867b4 100644 --- a/pandora_console/godmode/reporting/create_container.php +++ b/pandora_console/godmode/reporting/create_container.php @@ -496,7 +496,7 @@ if ($edit_container) { $single_table .= ""; $single_table .= html_print_label_input_block( __('Type of graph'), - html_print_select($type_graphs, 'simple_type_graph', '', '', '', 0, true) + html_print_select($type_graphs, 'simple_type_graph2', '', '', '', 0, true, false, true, '', false, 'width:100%') ); $single_table .= ''; @@ -543,21 +543,22 @@ if ($edit_container) { $table->width = '100%'; $table->cellspacing = 4; $table->cellpadding = 4; - $table->class = 'dat'; + $table->class = 'filter-table-adv'; $table->styleTable = 'font-weight: bold;'; $table->style[0] = 'width: 13%'; $table->data = []; + $table->size[0] = '30%'; + $table->size[1] = '30%'; + $table->size[2] = '30%'; - $data = []; - $data[0] = __('Time lapse'); - $data[0] .= ui_print_help_tip(__('This is the interval or period of time with which the graph data will be obtained. For example, a week means data from a week ago from now. '), true); - $data[1] = html_print_extended_select_for_time('period_custom', $period, '', '', '0', 10, true, false, true, '', false, $periods); - $table->data[] = $data; - $table->rowclass[] = ''; - - $data = []; - $data[0] = __('Custom graph'); + $table->data[0][0] = html_print_label_input_block( + __('Time lapse').ui_print_help_tip( + __('This is the interval or period of time with which the graph data will be obtained. For example, a week means data from a week ago from now. '), + true + ), + html_print_extended_select_for_time('period_custom', $period, '', '', '0', 10, true, 'width:100%', true, '', false, $periods) + ); $list_custom_graphs = custom_graphs_get_user($config['id_user'], false, true, 'RR'); @@ -566,29 +567,45 @@ if ($edit_container) { $graphs[$custom_graph['id_graph']] = $custom_graph['name']; } - $data[1] = html_print_select($graphs, 'id_custom_graph', $idCustomGraph, '', __('None'), 0, true); - $table->data[] = $data; - $table->rowclass[] = ''; + $table->data[0][1] = html_print_label_input_block( + __('Custom graph'), + html_print_select($graphs, 'id_custom_graph', $idCustomGraph, '', __('None'), 0, true, '', true, '', false, 'width:100%') + ); - $data = []; - $data[0] = __('Show full scale graph (TIP)').ui_print_help_tip('This option may cause performance issues', true); - $data[1] = html_print_checkbox('fullscale_2', 1, false, true); - $table->data[] = $data; - $table->rowclass[] = ''; + $table->data[0][2] = html_print_label_input_block( + __('Show full scale graph (TIP)').ui_print_help_tip('This option may cause performance issues', true), + html_print_checkbox('fullscale_2', 1, false, true) + ); - $data = []; - $data[0] = ''; - $data[1] = ""; - $table->data[] = $data; - $table->rowclass[] = ''; + $data_toggle = html_print_table($table, true); + $data_toggle .= html_print_div( + [ + 'class' => 'action-buttons-right-forced mrgn_right_10px', + 'content' => html_print_submit_button( + __('Add item'), + 'add_custom', + false, + [ + 'mode' => 'mini', + 'icon' => 'next', + ], + true + ), + ], + true + ); - echo ""; - echo ''; - echo ''; - echo ''; - echo '
'; - echo ui_toggle(html_print_table($table, true), 'Custom graph', '', '', true); - echo '
'; + ui_toggle( + $data_toggle, + ''.__('Custom graph').'', + 'container', + '', + true, + false, + '', + 'white-box-content', + 'box-flat white_table_graph' + ); unset($table); @@ -597,93 +614,113 @@ if ($edit_container) { $table->width = '100%'; $table->cellspacing = 4; $table->cellpadding = 4; - $table->class = 'dat'; + $table->class = 'filter-table-adv'; $table->styleTable = 'font-weight: bold;'; - $table->style[0] = 'width: 13%'; $table->data = []; + $table->size[0] = '30%'; + $table->size[1] = '30%'; + $table->size[2] = '30%'; - $data = []; - $data[0] = __('Time lapse'); - $data[0] .= ui_print_help_tip(__('This is the interval or period of time with which the graph data will be obtained. For example, a week means data from a week ago from now. '), true); - $data[1] = html_print_extended_select_for_time('period_dynamic', $period, '', '', '0', 10, true, false, true, '', false, $periods); - $table->data[] = $data; - $table->rowclass[] = ''; - $data = []; - $data[0] = __('Group'); - $data[1] = '
'.html_print_select_groups($config['id_user'], 'RW', $return_all_groups, 'container_id_group', $id_group, '', '', '', true).'
'; - $table->data[] = $data; - $table->rowclass[] = ''; + $table->data[0][0] = html_print_label_input_block( + __('Time lapse').ui_print_help_tip( + __('This is the interval or period of time with which the graph data will be obtained. For example, a week means data from a week ago from now. '), + true + ), + html_print_extended_select_for_time('period_custom', $period, '', '', '0', 10, true, 'width:100%', true, '', false, $periods) + ); - $data = []; - $data[0] = __('Module group'); - $data[1] = html_print_select_from_sql( - 'SELECT * FROM tmodule_group ORDER BY name', - 'combo_modulegroup', - $modulegroup, - '', - __('All'), - false, + $table->data[0][1] = html_print_label_input_block( + __('Group'), + html_print_select_groups($config['id_user'], 'RW', $return_all_groups, 'container_id_group', $id_group, '', '', '', true) + ); + + $table->data[0][2] = html_print_label_input_block( + __('Module group'), + html_print_select_from_sql( + 'SELECT * FROM tmodule_group ORDER BY name', + 'combo_modulegroup', + $modulegroup, + '', + __('All'), + false, + true, + false, + true, + false, + 'width:100%' + ) + ); + + $table->data[1][0] = html_print_label_input_block( + __('Agent'), + html_print_input_text('text_agent', $textAgent, '', 30, 100, true) + ); + + $table->data[1][1] = html_print_label_input_block( + __('Module'), + html_print_input_text('text_agent_module', $textModule, '', 30, 100, true) + ); + + $select_tags = tags_search_tag(false, false, true); + $table->data[1][2] = html_print_label_input_block( + __('Tag'), + html_print_select( + $select_tags, + 'tag', + $tag, + '', + __('Any'), + 0, + true, + false, + false, + '', + false, + 'width:100%' + ) + ); + + $table->data[2][0] = html_print_label_input_block( + __('Type of graph'), + html_print_select($type_graphs, 'simple_type_graph2', '', '', '', 0, true, false, true, '', false, 'width:100%') + ); + + $table->data[2][1] = html_print_label_input_block( + __('Show full scale graph (TIP)').ui_print_help_tip('This option may cause performance issues', true), + html_print_checkbox('fullscale_3', 1, false, true) + ); + + $data_toggle = html_print_table($table, true); + $data_toggle .= html_print_div( + [ + 'class' => 'action-buttons-right-forced mrgn_right_10px', + 'content' => html_print_submit_button( + __('Add item'), + 'add_dynamic', + false, + [ + 'mode' => 'mini', + 'icon' => 'next', + ], + true + ), + ], true ); - $table->data[] = $data; - $table->rowclass[] = ''; - $data = []; - $data[0] = __('Agent'); - $data[1] = html_print_input_text('text_agent', $textAgent, '', 30, 100, true); - $table->data[] = $data; - $table->rowclass[] = ''; - - $data = []; - $data[0] = __('Module'); - $data[1] = html_print_input_text('text_agent_module', $textModule, '', 30, 100, true); - $table->data[] = $data; - $table->rowclass[] = ''; - - $data = []; - $data[0] = __('Tag'); - $select_tags = tags_search_tag(false, false, true); - $data[1] = html_print_select( - $select_tags, - 'tag', - $tag, + ui_toggle( + $data_toggle, + ''.__('Dynamic rules for simple module graph').'', + 'container', '', - __('Any'), - 0, true, false, - false + '', + 'white-box-content', + 'box-flat white_table_graph' ); - $table->data[] = $data; - $table->rowclass[] = ''; - - $data = []; - $data[0] = __('Type of graph'); - $data[1] = html_print_select($type_graphs, 'simple_type_graph2', '', '', '', 0, true); - $table->data[] = $data; - $table->rowclass[] = ''; - - $data = []; - $data[0] = __('Show full scale graph (TIP)').ui_print_help_tip('This option may cause performance issues', true); - $data[1] = html_print_checkbox('fullscale_3', 1, false, true); - $table->data[] = $data; - $table->rowclass[] = ''; - - $data = []; - $data[0] = ''; - $data[1] = ""; - $table->data[] = $data; - $table->rowclass[] = ''; - - echo ""; - echo ''; - echo ''; - echo ''; - echo '
'; - echo ui_toggle(html_print_table($table, true), 'Dynamic rules for simple module graph', '', '', true); - echo '
'; if ((bool) $id_container !== false) { $total_item = db_get_all_rows_sql('SELECT count(*) FROM tcontainer_item WHERE id_container = '.$id_container); @@ -696,7 +733,7 @@ if ($edit_container) { ui_pagination($total_item[0]['count(*)'], false, $offset, 10); $table = new stdClass(); $table->width = '100%'; - $table->class = 'databox data'; + $table->class = 'info_table'; $table->id = 'item_table'; $table->align = []; $table->head = []; @@ -710,7 +747,7 @@ if ($edit_container) { $table->head[7] = __('Delete'); $table->data = []; - + $i = 0; foreach ($result_item as $item) { $data = []; @@ -759,6 +796,8 @@ if ($edit_container) { break; } + $table->cellclass[$i][7] = 'table_action_buttons'; + $i++; $data[7] = ''.html_print_image('images/delete.svg', true, ['alt' => __('Delete'), 'title' => __('Delete'), 'class' => 'invert_filter main_menu_icon']).''; @@ -801,7 +840,7 @@ echo html_print_input_hidden('id_agent', 0); } }); - $("input[name=add_custom]").click (function () { + $("#button-add_custom").click (function () { var id_custom = $("#id_custom_graph").val(); var fullscale = $("#checkbox-fullscale_2").prop("checked"); if (id_custom !== '0'){ @@ -824,7 +863,7 @@ echo html_print_input_hidden('id_agent', 0); } }); - $("input[name=add_dynamic]").click (function () { + $("#button-add_dynamic").click (function () { var agent_alias = $("#text-text_agent").val(); var module_name = $("#text-text_agent_module").val(); var time_lapse = $("#hidden-period_dynamic").attr('value'); diff --git a/pandora_console/godmode/reporting/graph_container.php b/pandora_console/godmode/reporting/graph_container.php index cbc947ef78..370285d7bf 100644 --- a/pandora_console/godmode/reporting/graph_container.php +++ b/pandora_console/godmode/reporting/graph_container.php @@ -129,11 +129,22 @@ $container = folder_get_folders(); $tree = folder_get_folders_tree_recursive($container); echo folder_togge_tree_folders($tree); if ($report_r && $report_w) { - echo "
"; - echo '
'; - html_print_submit_button(__('Create container'), 'create', false, 'class="sub next mrgn_right_5px mrgn_top_15px"'); - echo '
'; - echo '
'; + $ActionButtons[] = '
'; + $ActionButtons[] = '
'; + $ActionButtons[] = html_print_submit_button( + __('Create container'), + 'create', + false, + [ + 'class' => 'sub ok submitButton', + 'icon' => 'next', + ], + true + ); + $ActionButtons[] = '
'; + $ActionButtons[] = '
'; + + html_print_action_buttons(implode('', $ActionButtons), ['type' => 'form_action']); } ?> diff --git a/pandora_console/godmode/reporting/reporting_builder.item_editor.php b/pandora_console/godmode/reporting/reporting_builder.item_editor.php index ce755015ed..ec336eb290 100755 --- a/pandora_console/godmode/reporting/reporting_builder.item_editor.php +++ b/pandora_console/godmode/reporting/reporting_builder.item_editor.php @@ -2229,7 +2229,7 @@ $class = 'databox filters'; - + 'link', + 'style' => 'display:none', + ]; + } else { + $style_create = [ 'mode' => 'link' ]; + } + + if (!empty($style_button_edit_custom_graph)) { + $style_edit = [ + 'mode' => 'link', + 'style' => 'display:none', + ]; + } else { + $style_edit = [ 'mode' => 'link' ]; + } + html_print_button( __('Create'), 'create_graph', false, - 'create_custom_graph();', - 'class="sub add" '.$style_button_create_custom_graph + 'create_custom_graph()', + $style_create ); html_print_button( __('Edit'), 'edit_graph', false, - 'edit_custom_graph();', - 'class="sub config" '.$style_button_edit_custom_graph + 'edit_custom_graph()', + $style_edit ); ?> diff --git a/pandora_console/include/ajax/module.php b/pandora_console/include/ajax/module.php index 086741d052..052f105eda 100755 --- a/pandora_console/include/ajax/module.php +++ b/pandora_console/include/ajax/module.php @@ -1283,7 +1283,7 @@ if (check_login()) { $linkCaption, 'additional_action_for_'.$idAgenteModulo, false, - 'window.location.assign(\'index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente='.$id_agente.'&id_agente_modulo='.$module['id_agente_modulo'].'&refr=60'.$addedLinkParams.'\')', + 'window.location.assign("index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente='.$id_agente.'&id_agente_modulo='.$module['id_agente_modulo'].'&refr=60'.$addedLinkParams.'")', [ 'mode' => 'link', 'style' => 'justify-content: flex-end;', @@ -1300,7 +1300,7 @@ if (check_login()) { __('Edit'), 'edit_module_'.$idAgenteModulo, false, - 'window.location.assign(\'index.php?sec=gagente&sec2=godmode/agentes/configurar_agente&id_agente='.$id_agente.'&tab=module&id_agent_module='.$module['id_agente_modulo'].'&edit_module='.$module['id_modulo'].'\')', + 'window.location.assign("index.php?sec=gagente&sec2=godmode/agentes/configurar_agente&id_agente='.$id_agente.'&tab=module&id_agent_module='.$module['id_agente_modulo'].'&edit_module='.$module['id_modulo'].'")', [ 'mode' => 'link', 'style' => 'justify-content: flex-end;', diff --git a/pandora_console/include/class/CredentialStore.class.php b/pandora_console/include/class/CredentialStore.class.php index 8bdc200299..befc213a8c 100644 --- a/pandora_console/include/class/CredentialStore.class.php +++ b/pandora_console/include/class/CredentialStore.class.php @@ -103,42 +103,16 @@ class CredentialStore extends Wizard */ private function ajaxMsg($type, $msg, $delete=false) { - $msg_err = 'Failed while saving: %s'; - $msg_ok = 'Successfully saved into keystore '; - - if ($delete) { - $msg_err = 'Failed while removing: %s'; - $msg_ok = 'Successfully deleted '; - } - - if ($type == 'error') { - echo json_encode( - [ - $type => ui_print_error_message( - __( - $msg_err, - $msg - ), - '', - true - ), - ] - ); + if ($type === 'error') { + $msg_title = ($delete === true) ? 'Failed while removing' : 'Failed while saving'; } else { - echo json_encode( - [ - $type => ui_print_success_message( - __( - $msg_ok, - $msg - ), - '', - true - ), - ] - ); + $msg_title = ($delete === true) ? 'Successfully deleted' : 'Successfully saved into keystore'; } + echo json_encode( + [ $type => __($msg_title).':
'.$msg ] + ); + exit; } diff --git a/pandora_console/include/class/ModuleTemplates.class.php b/pandora_console/include/class/ModuleTemplates.class.php index fb1a496246..2e777bdf4c 100644 --- a/pandora_console/include/class/ModuleTemplates.class.php +++ b/pandora_console/include/class/ModuleTemplates.class.php @@ -14,7 +14,7 @@ * |___| |___._|__|__|_____||_____|__| |___._| |___| |__|_|__|_______| * * ============================================================================ - * Copyright (c) 2005-2021 Artica Soluciones Tecnologicas + * Copyright (c) 2005-2023 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 @@ -264,27 +264,11 @@ class ModuleTemplates extends HTML */ private function ajaxMsg($type, $msg) { - if ($type == 'error') { - echo json_encode( - [ - $type => ui_print_error_message( - __($msg), - '', - true - ), - ] - ); - } else { - echo json_encode( - [ - $type => ui_print_success_message( - __($msg), - '', - true - ), - ] - ); - } + echo json_encode( + [ + $type => __($msg), + ] + ); exit; } @@ -708,7 +692,7 @@ class ModuleTemplates extends HTML 'action' => $this->baseUrl, 'id' => 'add_module_form', 'method' => 'POST', - 'class' => 'modal', + 'class' => 'modal filter-list-adv', 'extra' => '', ]; @@ -846,10 +830,10 @@ class ModuleTemplates extends HTML false ); // Create the table with Module Block list. - $table = new StdClasS(); + $table = new stdClass(); $table->class = 'databox data '; $table->width = '75%'; - $table->styleTable = 'margin: 2em auto 0;border: 1px solid #ddd;'; + $table->styleTable = 'border: 1px solid #ddd;'; $table->rowid = []; $table->data = []; @@ -893,7 +877,7 @@ class ModuleTemplates extends HTML ); $data[3] .= html_print_input_image( 'export_profile', - 'images/csv.png', + 'images/file-csv.svg', $row['id_np'], '', true, @@ -914,7 +898,7 @@ class ModuleTemplates extends HTML $data[3] .= ''; $data[3] .= ''; $data[3] .= html_print_image( - 'images/csv.png', + 'images/file-csv.svg', true, [ 'title' => __('Export to CSV'), @@ -1165,7 +1149,7 @@ class ModuleTemplates extends HTML $blockComponentList = chop($blockComponentList, ','); // Title of Block. - $blockTitle = '
'; + $blockTitle = '
'; $blockTitle .= $blockTable['name']; $blockTitle .= '
'; $blockTitle .= html_print_input_image( @@ -1186,7 +1170,7 @@ class ModuleTemplates extends HTML $table = new StdClasS(); $table->class = 'databox data border_bt'; $table->width = '75%'; - $table->styleTable = 'margin: 2em auto 0;border: 1px solid #ddd;'; + $table->styleTable = 'margin: 0; border: 1px solid #ddd;'; $table->rowid = []; $table->data = []; @@ -1220,7 +1204,7 @@ class ModuleTemplates extends HTML switch ($module['id_format']) { case MODULE_NETWORK: $formatInfo = html_print_image( - 'images/network.png', + 'images/network-server@os.svg', true, [ 'title' => __('Network module'), @@ -1231,7 +1215,7 @@ class ModuleTemplates extends HTML case MODULE_WMI: $formatInfo = html_print_image( - 'images/wmi.png', + 'images/WMI@svg.svg', true, [ 'title' => __('WMI module'), @@ -1242,7 +1226,7 @@ class ModuleTemplates extends HTML case MODULE_PLUGIN: $formatInfo = html_print_image( - 'images/plugin.png', + 'images/plugins@svg.svg', true, [ 'title' => __('Plug-in module'), diff --git a/pandora_console/include/class/NetworkMap.class.php b/pandora_console/include/class/NetworkMap.class.php index b1c5e84763..701eb4ecfb 100644 --- a/pandora_console/include/class/NetworkMap.class.php +++ b/pandora_console/include/class/NetworkMap.class.php @@ -3601,7 +3601,7 @@ class NetworkMap url_background_grid: url_background_grid, refresh_time: '.$this->mapOptions['refresh_time'].', font_size: '.$this->mapOptions['font_size'].', - method: '.$this->map['generation_method'].', + method: '.($this->map['generation_method'] ?? 3).', base_url_homedir: "'.ui_get_full_url(false).'" }); init_drag_and_drop(); diff --git a/pandora_console/include/class/SatelliteAgent.class.php b/pandora_console/include/class/SatelliteAgent.class.php index 0d9111a24b..aa86f25e81 100644 --- a/pandora_console/include/class/SatelliteAgent.class.php +++ b/pandora_console/include/class/SatelliteAgent.class.php @@ -959,41 +959,28 @@ class SatelliteAgent extends HTML */ private function ajaxMsg($type, $msg, $delete=false, $disable=false) { - $msg_err = 'Failed while saving: %s'; - $msg_ok = 'Successfully saved agent '; - - if ($delete === true) { - $msg_err = 'Failed while removing: %s'; - $msg_ok = 'Successfully deleted '; - } - - if ($disable === true) { - $msg_err = 'Failed while disabling: %s'; - $msg_ok = 'Successfully disabled'; - } - - if ($type == 'error') { - echo json_encode( - [ - $type => ui_print_error_message( - __($msg), - '', - true - ), - ] - ); + if ($type === 'error') { + if ($delete === true) { + $msg_title = 'Failed while removing'; + } else if ($disable === true) { + $msg_title = 'Failed while disabling'; + } else { + $msg_title = 'Failed while saving'; + } } else { - echo json_encode( - [ - $type => ui_print_success_message( - __($msg), - '', - true - ), - ] - ); + if ($delete === true) { + $msg_title = 'Successfully deleted'; + } else if ($disable === true) { + $msg_title = 'Successfully disabled'; + } else { + $msg_title = 'Successfully saved agent'; + } } + echo json_encode( + [ $type => __($msg_title).':
'.$msg ] + ); + exit; } diff --git a/pandora_console/include/class/SatelliteCollection.class.php b/pandora_console/include/class/SatelliteCollection.class.php index aae0cb6780..6ef72c40c4 100644 --- a/pandora_console/include/class/SatelliteCollection.class.php +++ b/pandora_console/include/class/SatelliteCollection.class.php @@ -475,27 +475,11 @@ class SatelliteCollection extends HTML */ private function ajaxMsg(string $type, string $msg) { - if ($type === 'error') { - echo json_encode( - [ - $type => ui_print_error_message( - __($msg), - '', - true - ), - ] - ); - } else { - echo json_encode( - [ - $type => ui_print_success_message( - __($msg), - '', - true - ), - ] - ); - } + echo json_encode( + [ + $type => __($msg), + ] + ); exit; } diff --git a/pandora_console/include/functions_container.php b/pandora_console/include/functions_container.php index 502db2b4ad..e9d034f431 100644 --- a/pandora_console/include/functions_container.php +++ b/pandora_console/include/functions_container.php @@ -316,13 +316,13 @@ function ui_toggle_container($code, $name, $title='', $hidden_default=true, $ret $data[0] = '
'.html_print_image($original, true, ['title' => $title, 'id' => 'image_'.$uniqid, 'class' => 'invert_filter']).'  '.$name.''; $data[1] = ui_print_group_icon($group, true); if ($report_r && $report_w) { - $data[2] = ''.html_print_image('images/config.png', true, ['class' => 'invert_filter']).''; + $data[2] = ''.html_print_image('images/edit.svg', true, ['class' => 'invert_filter main_menu_icon']).''; } if ($report_r && $report_w && $report_m) { if ($id_container !== '1') { $data[2] .= '    '.''.html_print_image('images/cross.png', true, ['alt' => __('Delete'), 'title' => __('Delete'), 'class' => 'invert_filter']).''; + return false;">'.html_print_image('images/delete.svg', true, ['alt' => __('Delete'), 'title' => __('Delete'), 'class' => 'invert_filter main_menu_icon']).''; } } diff --git a/pandora_console/include/functions_graph.php b/pandora_console/include/functions_graph.php index 0f6d03fee7..977076824b 100644 --- a/pandora_console/include/functions_graph.php +++ b/pandora_console/include/functions_graph.php @@ -5339,3 +5339,199 @@ function get_baseline_data( $result['agent_alias'] = $array_data[0]['sum0']['agent_alias']; return ['sum0' => $result]; } + + +/** + * Draw graph SO agents by group. + * + * @param [type] $id_group + * @param integer $width + * @param integer $height + * @param boolean $recursive + * @param boolean $noWaterMark + * @return string Graph + */ +function graph_so_by_group($id_group, $width=300, $height=200, $recursive=true, $noWaterMark=true) +{ + global $config; + + $id_groups = [$id_group]; + + if ($recursive == true) { + $groups = groups_get_children($id_group); + if (count($groups) > 0) { + $id_groups = []; + foreach ($groups as $key => $value) { + $id_groups[] = $value['id_grupo']; + } + } + } + + $sql = sprintf( + 'SELECT COUNT(id_agente) AS count, + os.name + FROM tagente a + LEFT JOIN tconfig_os os ON a.id_os = os.id_os + WHERE a.id_grupo IN (%s) + GROUP BY os.id_os', + implode(',', $id_groups) + ); + + $result = db_get_all_rows_sql($sql, false, false); + if ($result === false) { + $result = []; + } + + $labels = []; + $data = []; + foreach ($result as $key => $row) { + $labels[] = $row['name']; + $data[] = $row['count']; + } + + if ($noWaterMark === true) { + $water_mark = [ + 'file' => $config['homedir'].'/images/logo_vertical_water.png', + 'url' => ui_get_full_url('images/logo_vertical_water.png', false, false, false), + ]; + } else { + $water_mark = []; + } + + $options = [ + 'width' => $width, + 'height' => $height, + 'waterMark' => $water_mark, + 'legend' => [ + 'display' => true, + 'position' => 'right', + 'align' => 'center', + ], + 'labels' => $labels, + ]; + + return pie_graph( + $data, + $options + ); + +} + + +/** + * Draw graph events by group + * + * @param [type] $id_group + * @param integer $width + * @param integer $height + * @param boolean $noWaterMark + * @param boolean $time_limit + * @param boolean $recursive + * @return string Graph + */ +function graph_events_agent_by_group($id_group, $width=300, $height=200, $noWaterMark=true, $time_limit=false, $recursive=true) +{ + global $config; + + $data = []; + $labels = []; + $loop = 0; + define('NUM_PIECES_PIE_2', 6); + + // Add tags condition to filter. + $tags_condition = ''; + if ($time_limit && $config['event_view_hr']) { + $tags_condition .= ' AND utimestamp > (UNIX_TIMESTAMP(NOW()) - '.($config['event_view_hr'] * SECONDS_1HOUR).')'; + } + + $id_groups = [$id_group]; + if ($recursive === true) { + $groups = groups_get_children($id_group); + if (count($groups) > 0) { + $id_groups = []; + foreach ($groups as $key => $value) { + $id_groups[] = $value['id_grupo']; + } + } + } + + $filter_groups = ' AND te.id_grupo IN ('.implode(',', $id_groups).') '; + + // This will give the distinct id_agente, give the id_grupo that goes + // with it and then the number of times it occured. GROUP BY statement + // is required if both DISTINCT() and COUNT() are in the statement. + $sql = sprintf( + 'SELECT DISTINCT(id_agente) AS id_agente, + COUNT(id_agente) AS count + FROM tevento te + WHERE 1=1 AND estado = 0 + %s %s + GROUP BY id_agente + ORDER BY count DESC LIMIT 8', + $tags_condition, + $filter_groups + ); + $result = db_get_all_rows_sql($sql, false, false); + if ($result === false) { + $result = []; + } + + $system_events = 0; + $other_events = 0; + + foreach ($result as $row) { + $row['id_grupo'] = agents_get_agent_group($row['id_agente']); + if (!check_acl($config['id_user'], $row['id_grupo'], 'ER') == 1) { + continue; + } + + if ($loop >= NUM_PIECES_PIE_2) { + $other_events += $row['count']; + } else { + if ($row['id_agente'] == 0) { + $system_events += $row['count']; + } else { + $alias = agents_get_alias($row['id_agente']); + $name = mb_substr($alias, 0, 25).' #'.$row['id_agente'].' ('.$row['count'].')'; + $labels[] = io_safe_output($name); + $data[] = $row['count']; + } + } + + $loop++; + } + + if ($system_events > 0) { + $name = __('SYSTEM').' ('.$system_events.')'; + $labels[] = io_safe_output($name); + $data[] = $system_events; + } + + // Sort the data. + arsort($data); + if ($noWaterMark === true) { + $water_mark = [ + 'file' => $config['homedir'].'/images/logo_vertical_water.png', + 'url' => ui_get_full_url('images/logo_vertical_water.png', false, false, false), + ]; + } else { + $water_mark = []; + } + + $options = [ + 'width' => $width, + 'height' => $height, + 'waterMark' => $water_mark, + 'legend' => [ + 'display' => true, + 'position' => 'right', + 'align' => 'center', + ], + 'labels' => $labels, + ]; + + return pie_graph( + $data, + $options + ); +} diff --git a/pandora_console/include/functions_groups.php b/pandora_console/include/functions_groups.php index 6eb91b7afd..02d0f434bb 100644 --- a/pandora_console/include/functions_groups.php +++ b/pandora_console/include/functions_groups.php @@ -1276,7 +1276,7 @@ function groups_get_not_init_agents($group, $agent_filter=[], $module_filter=[], * * @return integer Number of monitors. */ -function groups_get_monitors_counter($group, $agent_filter=[], $module_filter=[], $strict_user=false, $groups_and_tags=false, $realtime=false) +function groups_get_monitors_counter($group, $agent_filter=[], $module_filter=[], $strict_user=false, $groups_and_tags=false, $realtime=false, $secondary_group=true) { if (empty($group)) { return 0; @@ -1291,7 +1291,11 @@ function groups_get_monitors_counter($group, $agent_filter=[], $module_filter=[] } $group_str = implode(',', $groups); - $groups_clause = "AND (ta.id_grupo IN ($group_str) OR tasg.id_group IN ($group_str))"; + if ($secondary_group === true) { + $groups_clause = "AND (ta.id_grupo IN ($group_str) OR tasg.id_group IN ($group_str))"; + } else { + $groups_clause = "AND (ta.id_grupo IN ($group_str))"; + } $tags_clause = ''; @@ -1401,10 +1405,12 @@ function groups_get_monitors_counter($group, $agent_filter=[], $module_filter=[] ON tam.id_agente_modulo = tae.id_agente_modulo $modules_clause INNER JOIN tagente ta - ON tam.id_agente = ta.id_agente - LEFT JOIN tagent_secondary_group tasg - ON ta.id_agente = tasg.id_agent - AND ta.disabled = 0 + ON tam.id_agente = ta.id_agente"; + if ($secondary_group === true) { + $sql .= ' LEFT JOIN tagent_secondary_group tasg ON ta.id_agente = tasg.id_agent'; + } + + $sql .= "AND ta.disabled = 0 $agent_name_filter $agents_clause WHERE tam.disabled = 0 @@ -1450,8 +1456,9 @@ function groups_get_monitors_counter($group, $agent_filter=[], $module_filter=[] } $status_columns_str = implode(',', $status_columns_array); + $status_columns_str_sum = implode('+', $status_columns_array); - $sql = "SELECT SUM($status_columns_str) FROM + $sql = "SELECT SUM($status_columns_str_sum) FROM (SELECT DISTINCT(ta.id_agente), $status_columns_str FROM tagente ta LEFT JOIN tagent_secondary_group tasg ON ta.id_agente = tasg.id_agent @@ -1486,11 +1493,11 @@ function groups_get_monitors_counter($group, $agent_filter=[], $module_filter=[] * * @return integer Number of monitors. */ -function groups_get_total_monitors($group, $agent_filter=[], $module_filter=[], $strict_user=false, $groups_and_tags=false, $realtime=false) +function groups_get_total_monitors($group, $agent_filter=[], $module_filter=[], $strict_user=false, $groups_and_tags=false, $realtime=false, $secondary_group=true) { // Always modify the module status filter $module_filter['status'] = AGENT_MODULE_STATUS_ALL; - return groups_get_monitors_counter($group, $agent_filter, $module_filter, $strict_user, $groups_and_tags, $realtime); + return groups_get_monitors_counter($group, $agent_filter, $module_filter, $strict_user, $groups_and_tags, $realtime, $secondary_group); } @@ -1511,11 +1518,11 @@ function groups_get_total_monitors($group, $agent_filter=[], $module_filter=[], * * @return integer Number of monitors. */ -function groups_get_normal_monitors($group, $agent_filter=[], $module_filter=[], $strict_user=false, $groups_and_tags=false, $realtime=false) +function groups_get_normal_monitors($group, $agent_filter=[], $module_filter=[], $strict_user=false, $groups_and_tags=false, $realtime=false, $secondary_group=true) { // Always modify the module status filter $module_filter['status'] = AGENT_MODULE_STATUS_NORMAL; - return groups_get_monitors_counter($group, $agent_filter, $module_filter, $strict_user, $groups_and_tags, $realtime); + return groups_get_monitors_counter($group, $agent_filter, $module_filter, $strict_user, $groups_and_tags, $realtime, $secondary_group); } @@ -1536,11 +1543,11 @@ function groups_get_normal_monitors($group, $agent_filter=[], $module_filter=[], * * @return integer Number of monitors. */ -function groups_get_critical_monitors($group, $agent_filter=[], $module_filter=[], $strict_user=false, $groups_and_tags=false, $realtime=false) +function groups_get_critical_monitors($group, $agent_filter=[], $module_filter=[], $strict_user=false, $groups_and_tags=false, $realtime=false, $secondary_group=true) { // Always modify the module status filter $module_filter['status'] = AGENT_MODULE_STATUS_CRITICAL_BAD; - return groups_get_monitors_counter($group, $agent_filter, $module_filter, $strict_user, $groups_and_tags, $realtime); + return groups_get_monitors_counter($group, $agent_filter, $module_filter, $strict_user, $groups_and_tags, $realtime, $secondary_group); } @@ -1561,11 +1568,11 @@ function groups_get_critical_monitors($group, $agent_filter=[], $module_filter=[ * * @return integer Number of monitors. */ -function groups_get_warning_monitors($group, $agent_filter=[], $module_filter=[], $strict_user=false, $groups_and_tags=false, $realtime=false) +function groups_get_warning_monitors($group, $agent_filter=[], $module_filter=[], $strict_user=false, $groups_and_tags=false, $realtime=false, $secondary_group=true) { // Always modify the module status filter $module_filter['status'] = AGENT_MODULE_STATUS_WARNING; - return groups_get_monitors_counter($group, $agent_filter, $module_filter, $strict_user, $groups_and_tags, $realtime); + return groups_get_monitors_counter($group, $agent_filter, $module_filter, $strict_user, $groups_and_tags, $realtime, $secondary_group); } @@ -1586,11 +1593,11 @@ function groups_get_warning_monitors($group, $agent_filter=[], $module_filter=[] * * @return integer Number of monitors. */ -function groups_get_unknown_monitors($group, $agent_filter=[], $module_filter=[], $strict_user=false, $groups_and_tags=false, $realtime=false) +function groups_get_unknown_monitors($group, $agent_filter=[], $module_filter=[], $strict_user=false, $groups_and_tags=false, $realtime=false, $secondary_group=true) { // Always modify the module status filter $module_filter['status'] = AGENT_MODULE_STATUS_UNKNOWN; - return groups_get_monitors_counter($group, $agent_filter, $module_filter, $strict_user, $groups_and_tags, $realtime); + return groups_get_monitors_counter($group, $agent_filter, $module_filter, $strict_user, $groups_and_tags, $realtime, $secondary_group); } @@ -1611,11 +1618,11 @@ function groups_get_unknown_monitors($group, $agent_filter=[], $module_filter=[] * * @return integer Number of monitors. */ -function groups_get_not_init_monitors($group, $agent_filter=[], $module_filter=[], $strict_user=false, $groups_and_tags=false, $realtime=false) +function groups_get_not_init_monitors($group, $agent_filter=[], $module_filter=[], $strict_user=false, $groups_and_tags=false, $realtime=false, $secondary_group=true) { // Always modify the module status filter $module_filter['status'] = AGENT_MODULE_STATUS_NOT_INIT; - return groups_get_monitors_counter($group, $agent_filter, $module_filter, $strict_user, $groups_and_tags, $realtime); + return groups_get_monitors_counter($group, $agent_filter, $module_filter, $strict_user, $groups_and_tags, $realtime, $secondary_group); } @@ -1635,7 +1642,7 @@ function groups_monitor_fired_alerts($group_array) } -function groups_monitor_alerts_total_counters($group_array) +function groups_monitor_alerts_total_counters($group_array, $secondary_group=true) { // If there are not groups to query, we jump to nextone $default_total = [ @@ -1649,26 +1656,32 @@ function groups_monitor_alerts_total_counters($group_array) } $group_clause = implode(',', $group_array); - $group_clause = "(tasg.id_group IN ($group_clause) OR ta.id_grupo IN ($group_clause))"; + if ($secondary_group === true) { + $group_clause = "(tasg.id_group IN ($group_clause) OR ta.id_grupo IN ($group_clause))"; + } else { + $group_clause = "(ta.id_grupo IN ($group_clause))"; + } - $alerts = db_get_row_sql( - "SELECT - COUNT(tatm.id) AS total, - SUM(IF(tatm.times_fired > 0, 1, 0)) AS fired - FROM talert_template_modules tatm - INNER JOIN tagente_modulo tam - ON tatm.id_agent_module = tam.id_agente_modulo - INNER JOIN tagente ta - ON ta.id_agente = tam.id_agente - WHERE ta.id_agente IN ( - SELECT ta.id_agente - FROM tagente ta - LEFT JOIN tagent_secondary_group tasg - ON ta.id_agente = tasg.id_agent - WHERE ta.disabled = 0 - AND $group_clause - ) AND tam.disabled = 0" - ); + $sql = 'SELECT + COUNT(tatm.id) AS total, + SUM(IF(tatm.times_fired > 0, 1, 0)) AS fired + FROM talert_template_modules tatm + INNER JOIN tagente_modulo tam + ON tatm.id_agent_module = tam.id_agente_modulo + INNER JOIN tagente ta + ON ta.id_agente = tam.id_agente + WHERE ta.id_agente IN ( + SELECT ta.id_agente + FROM tagente ta'; + if ($secondary_group === true) { + $sql .= ' LEFT JOIN tagent_secondary_group tasg ON ta.id_agente = tasg.id_agent'; + } + + $sql .= " WHERE ta.disabled = 0 + AND $group_clause + ) AND tam.disabled = 0"; + + $alerts = db_get_row_sql($sql); return ($alerts === false) ? $default_total : $alerts; } @@ -1746,7 +1759,7 @@ function groups_monitor_total_counters($group_array, $search_in_testado=false) } -function groups_agents_total_counters($group_array) +function groups_agents_total_counters($group_array, $secondary_groups=true) { $default_total = [ 'ok' => 0, @@ -1763,30 +1776,36 @@ function groups_agents_total_counters($group_array) } $group_clause = implode(',', $group_array); - $group_clause = "(tasg.id_group IN ($group_clause) OR ta.id_grupo IN ($group_clause))"; + if ($secondary_groups === true) { + $group_clause = "(tasg.id_group IN ($group_clause) OR ta.id_grupo IN ($group_clause))"; + } else { + $group_clause = "(ta.id_grupo IN ($group_clause))"; + } $condition_critical = agents_get_status_clause(AGENT_STATUS_CRITICAL); $condition_warning = agents_get_status_clause(AGENT_STATUS_WARNING); $condition_unknown = agents_get_status_clause(AGENT_STATUS_UNKNOWN); $condition_not_init = agents_get_status_clause(AGENT_STATUS_NOT_INIT); $condition_normal = agents_get_status_clause(AGENT_STATUS_NORMAL); + $sql = "SELECT SUM(IF($condition_normal, 1, 0)) AS ok, SUM(IF($condition_critical, 1, 0)) AS critical, SUM(IF($condition_warning, 1, 0)) AS warning, SUM(IF($condition_unknown, 1, 0)) AS unknown, SUM(IF($condition_not_init, 1, 0)) AS not_init, COUNT(ta.id_agente) AS total - FROM tagente ta - WHERE ta.disabled = 0 + FROM tagente ta + WHERE ta.disabled = 0 AND ta.id_agente IN ( - SELECT ta.id_agente FROM tagente ta - LEFT JOIN tagent_secondary_group tasg - ON ta.id_agente = tasg.id_agent - WHERE ta.disabled = 0 - AND $group_clause - GROUP BY ta.id_agente - ) - "; + SELECT ta.id_agente FROM tagente ta"; + if ($secondary_groups === true) { + $sql .= ' LEFT JOIN tagent_secondary_group tasg ON ta.id_agente = tasg.id_agent'; + } + + $sql .= " WHERE ta.disabled = 0 + AND $group_clause + GROUP BY ta.id_agente + )"; $agents = db_get_row_sql($sql); @@ -2438,3 +2457,390 @@ function groups_get_group_deep($id_group) return $deep; } + + +/** + * Heat map from agents by group + * + * @param array $id_group + * @param integer $width + * @param integer $height + * + * @return string Html Graph. + */ +function groups_get_heat_map_agents(array $id_group, float $width=0, float $height=0) +{ + ui_require_css_file('heatmap'); + + if (is_array($id_group) === false) { + $id_group = [$id_group]; + } + + $sql = 'SELECT * FROM tagente WHERE id_grupo IN('.implode(',', $id_group).')'; + + $all_agents = db_get_all_rows_sql($sql); + if (empty($all_agents)) { + return null; + } + + $total_agents = count($all_agents); + + // Best square. + $high = (float) max($width, $height); + $low = 0.0; + + while (abs($high - $low) > 0.000001) { + $mid = (($high + $low) / 2.0); + $midval = (floor($width / $mid) * floor($height / $mid)); + if ($midval >= $total_agents) { + $low = $mid; + } else { + $high = $mid; + } + } + + $square_length = min(($width / floor($width / $low)), ($height / floor($height / $low))); + + // Print starmap. + $html = sprintf( + '', + $id_group, + $width, + $height + ); + + $html .= ''; + $row = 0; + $column = 0; + $x = 0; + $y = 0; + $cont = 1; + + foreach ($all_agents as $key => $value) { + // Colour by status. + $status = agents_get_status_from_counts($value); + + switch ($status) { + case 5: + // Not init status. + $status = 'notinit'; + break; + + case 1: + // Critical status. + $status = 'critical'; + break; + + case 2: + // Warning status. + $status = 'warning'; + break; + + case 0: + // Normal status. + $status = 'normal'; + break; + + case 3: + case -1: + default: + // Unknown status. + $status = 'unknown'; + break; + } + + $html .= sprintf( + '', + 'rect_'.$cont, + $x, + $y, + $row, + $column, + $square_length, + $square_length, + $status, + random_int(1, 10) + ); + + $y += $square_length; + $row++; + if ((int) ($y + $square_length) > (int) $height) { + $y = 0; + $x += $square_length; + $row = 0; + $column++; + } + + if ((int) ($x + $square_length) > (int) $width) { + $x = 0; + $y += $square_length; + $column = 0; + $row++; + } + + $cont++; + } + ?> + + '; + $html .= ''; + + return $html; +} + + +/** + * Return html count from agents and monitoring by group. + * + * @param [type] $id_groups + * + * @return string Html + */ +function tactical_groups_get_agents_and_monitoring($id_groups) +{ + global $config; + + $data = [ + 'total_agents' => groups_agents_total_counters($id_groups, false)['total'], + 'monitor_total' => groups_get_total_monitors($id_groups, [], [], false, false, false, false), + ]; + + // Link URLS + $urls = []; + $urls['total_agents'] = $config['homeurl'].'index.php?sec=estado&sec2=operation/agentes/estado_agente&refr=60&group_id='.$id_groups[0].'&recursion=1'; + $urls['monitor_total'] = $config['homeurl'].'index.php?sec=view&sec2=operation/agentes/status_monitor&refr=60&status=-1&ag_group='.$id_groups[0].'&recursion=1'; + + $table_am = html_get_predefined_table(); + $tdata = []; + $tdata[0] = html_print_image('images/agent.png', true, ['title' => __('Total agents'), 'class' => 'invert_filter'], false, false, false, true); + $tdata[1] = $data['total_agents'] <= 0 ? '-' : $data['total_agents']; + $tdata[1] = ''.$tdata[1].''; + + if ($data['total_agents'] > 500 && !enterprise_installed()) { + $tdata[2] = "
"; + } + + $tdata[3] = html_print_image('images/module.png', true, ['title' => __('Monitor checks'), 'class' => 'invert_filter'], false, false, false, true); + $tdata[4] = $data['monitor_total'] <= 0 ? '-' : $data['monitor_total']; + $tdata[4] = ''.$tdata[4].''; + + /* + Hello there! :) + We added some of what seems to be "buggy" messages to the openSource version recently. This is not to force open-source users to move to the enterprise version, this is just to inform people using Pandora FMS open source that it requires skilled people to maintain and keep it running smoothly without professional support. This does not imply open-source version is limited in any way. If you check the recently added code, it contains only warnings and messages, no limitations except one: we removed the option to add custom logo in header. In the Update Manager section, it warns about the 'danger’ of applying automated updates without a proper backup, remembering in the process that the Enterprise version comes with a human-tested package. Maintaining an OpenSource version with more than 500 agents is not so easy, that's why someone using a Pandora with 8000 agents should consider asking for support. It's not a joke, we know of many setups with a huge number of agents, and we hate to hear that “its becoming unstable and slow” :( + You can of course remove the warnings, that's why we include the source and do not use any kind of trick. And that's why we added here this comment, to let you know this does not reflect any change in our opensource mentality of does the last 14 years. + */ + if ($data['total_agents']) { + if (($data['monitor_total'] / $data['total_agents'] > 100) && !enterprise_installed()) { + $tdata[5] = "
"; + } + } + + $table_am->rowclass[] = ''; + $table_am->data[] = $tdata; + + $output = '
+ '.__('Total agents and monitors').''.html_print_table($table_am, true).'
'; + + return $output; +} + + +/** + * Return html count from stats alerts by group. + * + * @param [type] $id_groups + * @return string Html. + */ +function tactical_groups_get_stats_alerts($id_groups) +{ + global $config; + + $alerts = groups_monitor_alerts_total_counters($id_groups, false); + $data = [ + 'monitor_alerts' => $alerts['total'], + 'monitor_alerts_fired' => $alerts['fired'], + + ]; + + $urls = []; + $urls['monitor_alerts'] = $config['homeurl'].'index.php?sec=estado&sec2=operation/agentes/alerts_status&refr=60&ag_group='.$id_groups[0]; + $urls['monitor_alerts_fired'] = $config['homeurl'].'index.php?sec=estado&sec2=operation/agentes/alerts_status&refr=60&disabled=fired&ag_group='.$id_groups[0]; + + // Alerts table. + $table_al = html_get_predefined_table(); + + $tdata = []; + $tdata[0] = html_print_image('images/bell.png', true, ['title' => __('Defined alerts'), 'class' => 'invert_filter'], false, false, false, true); + $tdata[1] = $data['monitor_alerts'] <= 0 ? '-' : $data['monitor_alerts']; + $tdata[1] = ''.$tdata[1].''; + + /* + Hello there! :) + We added some of what seems to be "buggy" messages to the openSource version recently. This is not to force open-source users to move to the enterprise version, this is just to inform people using Pandora FMS open source that it requires skilled people to maintain and keep it running smoothly without professional support. This does not imply open-source version is limited in any way. If you check the recently added code, it contains only warnings and messages, no limitations except one: we removed the option to add custom logo in header. In the Update Manager section, it warns about the 'danger’ of applying automated updates without a proper backup, remembering in the process that the Enterprise version comes with a human-tested package. Maintaining an OpenSource version with more than 500 agents is not so easy, that's why someone using a Pandora with 8000 agents should consider asking for support. It's not a joke, we know of many setups with a huge number of agents, and we hate to hear that “its becoming unstable and slow” :( + You can of course remove the warnings, that's why we include the source and do not use any kind of trick. And that's why we added here this comment, to let you know this does not reflect any change in our opensource mentality of does the last 14 years. + */ + + if ($data['monitor_alerts'] > $data['total_agents'] && !enterprise_installed()) { + $tdata[2] = "
"; + } + + $tdata[3] = html_print_image( + 'images/bell_error.png', + true, + [ + 'title' => __('Fired alerts'), + 'class' => 'invert_filter', + ], + false, + false, + false, + true + ); + $tdata[4] = $data['monitor_alerts_fired'] <= 0 ? '-' : $data['monitor_alerts_fired']; + $tdata[4] = ''.$tdata[4].''; + $table_al->rowclass[] = ''; + $table_al->data[] = $tdata; + + if (!is_metaconsole()) { + $output = '
+ '.__('Defined and fired alerts').''.html_print_table($table_al, true).'
'; + } else { + // Remove the defined alerts cause with the new cache table is difficult to retrieve them. + unset($table_al->data[0][0], $table_al->data[0][1]); + + $table_al->class = 'tactical_view'; + $table_al->style = []; + $output = '
+ '.__('Fired alerts').''.html_print_table($table_al, true).'
'; + } + + return $output; +} + + +/** + * Return html count from stats modules by group. + * + * @param [type] $id_groups + * @param integer $graph_width + * @param integer $graph_height + * @param boolean $links + * @param boolean $data_agents + * @return void + */ +function groups_get_stats_modules_status($id_groups, $graph_width=250, $graph_height=150, $links=false, $data_agents=false) +{ + global $config; + + $data = [ + 'monitor_critical' => groups_get_critical_monitors($id_groups, [], [], false, false, false, false), + 'monitor_warning' => groups_get_warning_monitors($id_groups, [], [], false, false, false, false), + 'monitor_ok' => groups_get_normal_monitors($id_groups, [], [], false, false, false, false), + 'monitor_unknown' => groups_get_unknown_monitors($id_groups, [], [], false, false, false, false), + 'monitor_not_init' => groups_get_not_init_monitors($id_groups, [], [], false, false, false, false), + ]; + + // Link URLS. + if ($links === false) { + $urls = []; + $urls['monitor_critical'] = $config['homeurl'].'index.php?'.'sec=view&sec2=operation/agentes/status_monitor&'.'refr=60&status='.AGENT_MODULE_STATUS_CRITICAL_BAD.'&pure='.$config['pure'].'&recursion=1&ag_group='.$id_groups[0]; + $urls['monitor_warning'] = $config['homeurl'].'index.php?'.'sec=view&sec2=operation/agentes/status_monitor&'.'refr=60&status='.AGENT_MODULE_STATUS_WARNING.'&pure='.$config['pure'].'&recursion=1&ag_group='.$id_groups[0]; + $urls['monitor_ok'] = $config['homeurl'].'index.php?'.'sec=view&sec2=operation/agentes/status_monitor&'.'refr=60&status='.AGENT_MODULE_STATUS_NORMAL.'&pure='.$config['pure'].'&recursion=1&ag_group='.$id_groups[0]; + $urls['monitor_unknown'] = $config['homeurl'].'index.php?'.'sec=view&sec2=operation/agentes/status_monitor&'.'refr=60&status='.AGENT_MODULE_STATUS_UNKNOWN.'&pure='.$config['pure'].'&recursion=1&ag_group='.$id_groups[0]; + $urls['monitor_not_init'] = $config['homeurl'].'index.php?'.'sec=view&sec2=operation/agentes/status_monitor&'.'refr=60&status='.AGENT_MODULE_STATUS_NOT_INIT.'&pure='.$config['pure'].'&recursion=1&ag_group='.$id_groups[0]; + } else { + $urls = []; + $urls['monitor_critical'] = $links['monitor_critical']; + $urls['monitor_warning'] = $links['monitor_warning']; + $urls['monitor_ok'] = $links['monitor_ok']; + $urls['monitor_unknown'] = $links['monitor_unknown']; + $urls['monitor_not_init'] = $links['monitor_not_init']; + } + + // Fixed width non interactive charts + $status_chart_width = $graph_width; + + // Modules by status table + $table_mbs = html_get_predefined_table(); + + $tdata = []; + $tdata[0] = html_print_image('images/module_critical.png', true, ['title' => __('Monitor critical')], false, false, false, true); + $tdata[1] = $data['monitor_critical'] <= 0 ? '-' : $data['monitor_critical']; + $tdata[1] = ''.$tdata[1].''; + + $tdata[2] = html_print_image('images/module_warning.png', true, ['title' => __('Monitor warning')], false, false, false, true); + $tdata[3] = $data['monitor_warning'] <= 0 ? '-' : $data['monitor_warning']; + $tdata[3] = ''.$tdata[3].''; + $table_mbs->rowclass[] = ''; + $table_mbs->data[] = $tdata; + + $tdata = []; + $tdata[0] = html_print_image('images/module_ok.png', true, ['title' => __('Monitor normal')], false, false, false, true); + $tdata[1] = $data['monitor_ok'] <= 0 ? '-' : $data['monitor_ok']; + $tdata[1] = ''.$tdata[1].''; + + $tdata[2] = html_print_image('images/module_unknown.png', true, ['title' => __('Monitor unknown')], false, false, false, true); + $tdata[3] = $data['monitor_unknown'] <= 0 ? '-' : $data['monitor_unknown']; + $tdata[3] = ''.$tdata[3].''; + $table_mbs->rowclass[] = ''; + $table_mbs->data[] = $tdata; + + $tdata = []; + $tdata[0] = html_print_image('images/module_notinit.png', true, ['title' => __('Monitor not init')], false, false, false, true); + $tdata[1] = $data['monitor_not_init'] <= 0 ? '-' : $data['monitor_not_init']; + $tdata[1] = ''.$tdata[1].''; + + $tdata[2] = $tdata[3] = ''; + $table_mbs->rowclass[] = ''; + $table_mbs->data[] = $tdata; + + if ($data['monitor_checks'] > 0) { + $tdata = []; + $table_mbs->colspan[count($table_mbs->data)][0] = 4; + $table_mbs->cellstyle[count($table_mbs->data)][0] = 'text-align: center;'; + $tdata[0] = '
'.'
'.graph_agent_status(false, $graph_width, $graph_height, true, true, $data_agents).'
'; + $table_mbs->rowclass[] = ''; + $table_mbs->data[] = $tdata; + } + + if (!is_metaconsole()) { + $output = ' +
+ '.__('Monitors by status').''.html_print_table($table_mbs, true).'
'; + } else { + $table_mbs->class = 'tactical_view'; + $table_mbs->style = []; + $output = ' +
+ '.__('Monitors by status').''.html_print_table($table_mbs, true).'
'; + } + + return $output; +} \ No newline at end of file diff --git a/pandora_console/include/functions_html.php b/pandora_console/include/functions_html.php index 693a14adb7..e9e60f3418 100644 --- a/pandora_console/include/functions_html.php +++ b/pandora_console/include/functions_html.php @@ -1361,29 +1361,27 @@ function html_print_select_multiple_filtered( $output .= '
'; - $output .= html_print_input( + $output .= html_print_image( + 'images/plus.svg', + true, [ - 'type' => 'image', - 'src' => 'images/darrowright.png', - 'return' => true, - 'options' => [ - 'title' => $texts['title-add'], - 'onclick' => $add, - 'class' => 'invert_filter', - ], + 'id' => 'right_autorefreshlist', + 'style' => 'width: 24px; margin: 10px 10px 0;', + 'alt' => __('Push selected pages into autorefresh list'), + 'title' => __('Push selected pages into autorefresh list'), + 'onclick' => $add, ] ); - $output .= html_print_input( + $output .= html_print_image( + 'images/minus.svg', + true, [ - 'type' => 'image', - 'src' => 'images/darrowleft.png', - 'return' => true, - 'options' => [ - 'title' => $texts['title-del'], - 'onclick' => $del, - 'class' => 'invert_filter', - ], + 'id' => 'left_autorefreshlist', + 'style' => 'width: 24px; margin: 10px 10px 0;', + 'alt' => __('Pop selected pages out of autorefresh list'), + 'title' => __('Pop selected pages out of autorefresh list'), + 'onclick' => $del, ] ); diff --git a/pandora_console/include/functions_reporting.php b/pandora_console/include/functions_reporting.php index 710bae4c82..ea3f7de46f 100755 --- a/pandora_console/include/functions_reporting.php +++ b/pandora_console/include/functions_reporting.php @@ -7488,7 +7488,7 @@ function reporting_sql($report, $content) foreach ($results as $id_node => $items) { foreach ($items['result']['data'] as $key => $item) { - $items['result']['data'][$key] = ['node_id' => $id_node] + $items['result']['data'][$key]; + $items['result']['data'][$key] = (['node_id' => $id_node] + $items['result']['data'][$key]); } if ((int) $items['result']['correct'] !== 1) { @@ -7537,7 +7537,8 @@ function reporting_sql($report, $content) * * @return array */ -function reporting_sql_auxiliary($report, $content) { +function reporting_sql_auxiliary($report, $content) +{ if ($content['treport_custom_sql_id'] != 0) { $sql = io_safe_output( db_get_value_filter( diff --git a/pandora_console/include/functions_treeview.php b/pandora_console/include/functions_treeview.php index b43d6bba95..e86c728fa7 100755 --- a/pandora_console/include/functions_treeview.php +++ b/pandora_console/include/functions_treeview.php @@ -467,7 +467,7 @@ function treeview_printAlertsTable($id_module, $server_data=[], $no_head=false) __('Go to alerts edition'), 'upd_button', false, - 'window.location.assign(\''.$console_url.'index.php?sec=gagente&sec2=godmode/agentes/configurar_agente&tab=alert&search=1&module_name='.$module_name.'&id_agente='.$agent_id.$url_hash.'\')', + 'window.location.assign("'.$console_url.'index.php?sec=gagente&sec2=godmode/agentes/configurar_agente&tab=alert&search=1&module_name='.$module_name.'&id_agente='.$agent_id.$url_hash.'")', ['icon' => 'alert'], true ), diff --git a/pandora_console/include/functions_ui.php b/pandora_console/include/functions_ui.php index 1e4556965b..e30ea78923 100755 --- a/pandora_console/include/functions_ui.php +++ b/pandora_console/include/functions_ui.php @@ -693,7 +693,7 @@ function ui_print_tags_warning($return=false) * * @return string HTML code if return parameter is true. */ -function ui_print_group_icon($id_group, $return=false, $path='', $style='', $link=true, $force_show_image=false, $show_as_image=false, $class='') +function ui_print_group_icon($id_group, $return=false, $path='', $style='', $link=true, $force_show_image=false, $show_as_image=false, $class='', $tactical_view=false) { global $config; @@ -707,7 +707,11 @@ function ui_print_group_icon($id_group, $return=false, $path='', $style='', $lin } if ($link === true) { - $output = ''; + if ($tactical_view === true) { + $output = ''; + } else { + $output = ''; + } } if ((bool) $config['show_group_name'] === true) { @@ -904,11 +908,11 @@ function ui_print_type_agent_icon( if ((int) $id_os === SATELLITE_OS_ID) { // Satellite. $options['title'] = __('Satellite'); - $output = html_print_image('images/satellite@svg.svg', true, ['class' => 'main_menu_icon invert_filter'], false, false, false, true); + $output = html_print_image('images/satellite@os.svg', true, ['class' => 'main_menu_icon invert_filter'], false, false, false, true); } else if ($remote_contact === $contact && $remote === 0 && empty($version) === true) { // Network. $options['title'] = __('Network'); - $output = html_print_image('images/network-server@svg.svg', true, ['class' => 'main_menu_icon invert_filter'], false, false, false, true); + $output = html_print_image('images/network-server@os.svg', true, ['class' => 'main_menu_icon invert_filter'], false, false, false, true); } else { // Software. $options['title'] = __('Software'); @@ -1210,7 +1214,7 @@ function ui_format_alert_row( $forceTitle, 'force_execution_'.$alert['id'], false, - 'window.location.assign(\''.$url.'&id_alert='.$alert['id'].'&refr=60'.$additionUrl.'\');', + 'window.location.assign("'.$url.'&id_alert='.$alert['id'].'&refr=60'.$additionUrl.'");', [ 'mode' => 'link' ], true ); @@ -1496,6 +1500,7 @@ function ui_print_alert_template_example($id_alert_template, $return=false, $pri * @param string $image Image path. * @param boolean $is_relative Route is relative or not. * @param string $id Target id. + * @param string $isHeader If true, the view is header. * * @return string The help tip */ @@ -1505,10 +1510,17 @@ function ui_print_help_icon( $home_url='', $image='images/info@svg.svg', $is_relative=false, - $id='' + $id='', + $isHeader=false ) { global $config; + if (empty($image) === true) { + $image = 'images/info@svg.svg'; + } + + $iconClass = ($isHeader === true) ? 'header_help_icon' : 'main_menu_icon'; + // Do not display the help icon if help is disabled. if ((bool) $config['disable_help'] === true) { return ''; @@ -1533,7 +1545,7 @@ function ui_print_help_icon( $image, true, [ - 'class' => 'img_help main_menu_icon', + 'class' => 'img_help '.$iconClass, 'title' => __('Help'), 'onclick' => "open_help ('".ui_get_full_url($help_handler)."')", 'id' => $id, @@ -5053,7 +5065,7 @@ function ui_print_page_header( if (is_metaconsole() === false) { if ($help != '') { - $buffer .= "
".ui_print_help_icon($help, true, '', 'images/help_g.png').'
'; + $buffer .= "
".ui_print_help_icon($help, true, '', '', false, '', true).'
'; } } @@ -7154,7 +7166,7 @@ function ui_print_servertype_icon(int $id) case MODULE_NETWORK: $title = __('Network server'); - $image = 'images/network-server@svg.svg'; + $image = 'images/network-server@os.svg'; break; case MODULE_PLUGIN: diff --git a/pandora_console/include/javascript/tactical_groups.js b/pandora_console/include/javascript/tactical_groups.js new file mode 100644 index 0000000000..08bca2f02e --- /dev/null +++ b/pandora_console/include/javascript/tactical_groups.js @@ -0,0 +1,18 @@ +/* global $, load_modal */ +function showInfoAgent(id_agent) { + load_modal({ + target: $("#modal-info-agent"), + url: "ajax.php", + modal: { + title: "Info agent", + cancel: "close" + }, + onshow: { + page: "include/ajax/group", + method: "loadInfoAgent", + extradata: { + idAgent: id_agent + } + } + }); +} diff --git a/pandora_console/include/lib/Group.php b/pandora_console/include/lib/Group.php index 1f34f941fd..9e386d8dd0 100644 --- a/pandora_console/include/lib/Group.php +++ b/pandora_console/include/lib/Group.php @@ -43,7 +43,13 @@ class Group extends Entity * * @var array */ - private static $ajaxMethods = ['getGroupsForSelect']; + private static $ajaxMethods = [ + 'getGroupsForSelect', + 'distributionBySoGraph', + 'groupEventsByAgent', + 'loadInfoAgent', + 'getAgentsByGroup', + ]; /** @@ -473,4 +479,271 @@ class Group extends Entity } + /** + * Draw a graph distribution so by group. + * + * @return void + */ + public static function distributionBySoGraph() + { + global $config; + $id_group = get_parameter('id_group', ''); + include_once $config['homedir'].'/include/functions_graph.php'; + + $out = '
'; + $out .= graph_so_by_group($id_group, 300, 200, false, false); + $out .= '
'; + echo $out; + return; + } + + + /** + * Draw a graph events agent by group. + * + * @return void + */ + public static function groupEventsByAgent() + { + global $config; + $id_group = get_parameter('id_group', ''); + include_once $config['homedir'].'/include/functions_graph.php'; + + $out = '
'; + $out .= graph_events_agent_by_group($id_group, 300, 200, false, true, true); + $out .= '
'; + echo $out; + return; + } + + + /** + * Draw in modal a agent info + * + * @return void + */ + public static function loadInfoAgent() + { + $extradata = get_parameter('extradata', ''); + echo '
'; + + if (empty($extradata) === false) { + $extradata = json_decode(io_safe_output($extradata), true); + $agent = agents_get_agent($extradata['idAgent']); + + if (is_array($agent)) { + $status_img = agents_tree_view_status_img( + $agent['critical_count'], + $agent['warning_count'], + $agent['unknown_count'], + $agent['total_count'], + $agent['notinit_count'] + ); + $table = new \stdClass(); + $table->class = 'table_modal_alternate'; + $table->data = [ + [ + __('Id'), + $agent['id_agente'], + ], + [ + __('Agent name'), + ''.$agent['nombre'].'', + ], + [ + __('Alias'), + $agent['alias'], + ], + [ + __('Ip Address'), + $agent['direccion'], + ], + [ + __('Status'), + $status_img, + ], + [ + __('Group'), + groups_get_name($agent['id_grupo']), + ], + [ + __('Interval'), + $agent['intervalo'], + ], + [ + __('Operative system'), + get_os_name($agent['id_os']), + ], + [ + __('Server name'), + $agent['server_name'], + ], + [ + __('Description'), + $agent['comentarios'], + ], + ]; + + html_print_table($table); + } + } + + echo '
'; + } + + + /** + * Get agents by group for datatable. + * + * @return void + */ + public static function getAgentsByGroup() + { + global $config; + + $data = []; + $id_group = get_parameter('id_group', ''); + $id_groups = [$id_group]; + $groups = groups_get_children($id_group); + + if (count($groups) > 0) { + $id_groups = []; + foreach ($groups as $key => $value) { + $id_groups[] = $value['id_grupo']; + } + } + + $start = get_parameter('start', 0); + $length = get_parameter('length', $config['block_size']); + $orderDatatable = get_datatable_order(true); + $pagination = ''; + $order = ''; + + try { + ob_start(); + if (isset($orderDatatable)) { + switch ($orderDatatable['field']) { + case 'alerts': + $orderDatatable['field'] = 'fired_count'; + break; + + case 'status': + $orderDatatable['field'] = 'total_count'; + + default: + $orderDatatable['field'] = $orderDatatable['field']; + break; + } + + $order = sprintf( + ' ORDER BY %s %s', + $orderDatatable['field'], + $orderDatatable['direction'] + ); + } + + if (isset($length) && $length > 0 + && isset($start) && $start >= 0 + ) { + $pagination = sprintf( + ' LIMIT %d OFFSET %d ', + $length, + $start + ); + } + + $sql = sprintf( + 'SELECT id_agente, + alias, + critical_count, + warning_count, + unknown_count, + total_count, + notinit_count, + ultimo_contacto_remoto, + fired_count + FROM tagente t + WHERE disabled = 0 AND + total_count <> notinit_count AND + id_grupo IN (%s) + %s %s', + implode(',', $id_groups), + $order, + $pagination + ); + + $data = db_get_all_rows_sql($sql); + + $sql = sprintf( + 'SELECT + id_agente, + alias, + critical_count, + warning_count, + unknown_count, + total_count, + notinit_count, + ultimo_contacto_remoto, + fired_count + FROM tagente t + WHERE disabled = 0 AND + total_count <> notinit_count AND + id_grupo IN (%s) + %s', + implode(',', $id_groups), + $order, + ); + + $count_agents = db_get_num_rows($sql); + + foreach ($data as $key => $agent) { + $status_img = agents_tree_view_status_img( + $agent['critical_count'], + $agent['warning_count'], + $agent['unknown_count'], + $agent['total_count'], + $agent['notinit_count'] + ); + $data[$key]['alias'] = ''.$agent['alias'].''; + $data[$key]['status'] = $status_img; + $data[$key]['alerts'] = agents_tree_view_alert_img($agent['fired_count']); + } + + if (empty($data) === true) { + $total = 0; + $data = []; + } else { + $total = $count_agents; + } + + 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; + } + + json_decode($response); + if (json_last_error() === JSON_ERROR_NONE) { + echo $response; + } else { + echo json_encode( + [ + 'success' => false, + 'error' => $response, + ] + ); + } + + exit; + } + + } diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index d819230098..63ad0d2e52 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -647,6 +647,10 @@ select:-internal-list-box { width: 20%; } +.w21p { + width: 21%; +} + .w22p { width: 22%; } @@ -5811,10 +5815,10 @@ div.label_select_child_left > span { overflow: hidden; } -.switch_radio_button label { +div.switch_radio_button label { background-color: #fff; color: rgba(0, 0, 0, 0.6); - line-height: 9pt; + line-height: 6px !important; text-align: center; padding: 14px 10px; margin-right: -1px; @@ -5822,14 +5826,14 @@ div.label_select_child_left > span { transition: all 0.1s ease-in-out; } -.switch_radio_button label:first { - border-top-left-radius: 4px; - border-bottom-left-radius: 4px; +div.switch_radio_button label:first-of-type { + border-top-left-radius: 4px !important; + border-bottom-left-radius: 4px !important; } -.switch_radio_button label:last-child { - border-top-right-radius: 4px; - border-bottom-right-radius: 4px; +div.switch_radio_button label:last-of-type { + border-top-right-radius: 4px !important; + border-bottom-right-radius: 4px !important; margin-right: 0px; } @@ -11014,14 +11018,14 @@ pre.external_tools_output { .tag-editor .tag-editor-tag { padding: 5px !important; color: #fff !important; - background: #82b92e !important; + background: var(--primary-color) !important; border-radius: 0 2px 2px 0 !important; } .tag-editor .tag-editor-delete { padding: 5px !important; line-height: 16px !important; - background: #82b92e !important; + background: var(--primary-color) !important; border-radius: 2px 0 0 2px !important; } @@ -11195,6 +11199,10 @@ table.table_modal_alternate height: 20px; } +.header_help_icon { + width: 16px; + height: 16px; +} .main_menu_icon.arrow_up { transform: rotate(90deg); } @@ -11509,6 +11517,15 @@ div[role="dialog"] { /* font-weight: bold; */ } +.font-title-font { + font-size: 13px; + line-height: 16px; + color: #161628; + text-align: left; + margin-bottom: 10px; + font-weight: bold; +} + .preimage_container span { font-size: 11pt; line-height: 28px; @@ -11545,6 +11562,20 @@ table.alert-template-fields > tbody > tr > td[id^="template-label_fields"] { text-align: center; } +ul.tag-editor { + list-style-type: none; + padding: 0.5em !important; + margin: 0; + overflow: hidden; + border: 2px solid #c0ccdc; + border-radius: 6px; + cursor: text; + font: normal 14px sans-serif; + color: #333333; + background: #f6f7fb; + line-height: 20px; +} + .max-width-100p { max-width: 100% !important; } diff --git a/pandora_console/include/styles/tactical_groups.css b/pandora_console/include/styles/tactical_groups.css new file mode 100644 index 0000000000..383e9ef37f --- /dev/null +++ b/pandora_console/include/styles/tactical_groups.css @@ -0,0 +1,31 @@ +.tactical_group_left_column { + vertical-align: top; + min-width: 30em; + width: 30%; + padding-top: 0px; +} +.tactical_group_right_column { + width: 40%; + vertical-align: top; + min-width: 30em; + padding-top: 0px; +} +rect { + cursor: pointer; +} +.info-agent { + width: 100%; + max-height: 400px; +} +.info-agent table { + width: 100%; +} +#modal-info-agent { + display: none; +} +#list_agents_tactical_wrapper { + max-height: 600px; +} +.graph-distribution-so { + margin-top: 55px; +} diff --git a/pandora_console/include/styles/wizard.css b/pandora_console/include/styles/wizard.css index 92d40ccc33..c7c37a8143 100644 --- a/pandora_console/include/styles/wizard.css +++ b/pandora_console/include/styles/wizard.css @@ -129,6 +129,12 @@ ul.wizard li > textarea { background: #e63c52; } +.wizard .tag-editor li, +.wizard .tag-editor li:focus, +.wizard .tag-editor li:hover { + border: 0; + padding: 0; +} .wizard .time_selection_container { display: flex; align-items: baseline; diff --git a/pandora_console/operation/agentes/estado_generalagente.php b/pandora_console/operation/agentes/estado_generalagente.php index 3e5584fe42..8aaa7ed60a 100755 --- a/pandora_console/operation/agentes/estado_generalagente.php +++ b/pandora_console/operation/agentes/estado_generalagente.php @@ -106,7 +106,12 @@ $agentIconGroup = ((bool) $config['show_group_name'] === false) ? ui_print_group $agent['id_grupo'], true, '', - 'padding-right: 6px;' + 'padding-right: 6px;', + true, + false, + false, + '', + true ) : ''; $agentIconStatus = agents_detail_view_status_img( @@ -396,7 +401,7 @@ $buttonsRefreshAgent = html_print_button( __('Refresh data'), 'refresh_data', false, - 'window.location.assign(\'index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente='.$id_agente.'&refr=60\')', + 'window.location.assign("index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente='.$id_agente.'&refr=60")', [ 'mode' => 'link' ], true ); @@ -406,7 +411,7 @@ if (check_acl_one_of_groups($config['id_user'], $all_groups, 'AW') === true) { __('Force checks'), 'force_checks', false, - 'window.location.assign(\'index.php?sec=estado&sec2=operation/agentes/ver_agente&flag_agent=1&id_agente='.$id_agente.'\')', + 'window.location.assign("index.php?sec=estado&sec2=operation/agentes/ver_agente&flag_agent=1&id_agente='.$id_agente.'")', [ 'mode' => 'link' ], true ); @@ -488,7 +493,7 @@ $data = []; $data[0] = ''.__('Group').''; $data[1] = html_print_anchor( [ - 'href' => 'index.php?sec=estado&sec2=operation/agentes/estado_agente&refr=60&group_id='.$agent['id_grupo'], + 'href' => 'index.php?sec=gagente&sec2=godmode/groups/tactical&id_group='.$agent['id_grupo'], 'content' => groups_get_name($agent['id_grupo']), ], true diff --git a/pandora_console/operation/reporting/reporting_viewer.php b/pandora_console/operation/reporting/reporting_viewer.php index 5c3ce7a73b..26e16c7f37 100755 --- a/pandora_console/operation/reporting/reporting_viewer.php +++ b/pandora_console/operation/reporting/reporting_viewer.php @@ -226,77 +226,52 @@ ui_print_standard_header( // ------------------- END HEADER --------------------------------------- // ------------------------ INIT FORM ----------------------------------- -$table = new stdClass(); -$table->id = 'controls_table'; -$table->width = '100%'; -$table->class = 'filter-table-adv'; +$table2 = new stdClass(); +$table2->id = 'controls_table'; +$table2->size[2] = '50%'; +$table2->size[3] = '50%'; +$table2->style[0] = 'text-align:center'; +$table2->style[1] = 'text-align:center'; +$table2->styleTable = 'border:none'; + if (defined('METACONSOLE')) { - $table->width = '100%'; - $table->class = 'databox filters'; + $table2->width = '100%'; + $table2->class = 'databox filters'; - $table->head[0] = __('View Report'); - $table->head_colspan[0] = 5; - $table->headstyle[0] = 'text-align: center'; + $table2->head[0] = __('View Report'); + $table2->head_colspan[0] = 5; + $table2->headstyle[0] = 'text-align: center'; } -$table->style = []; -$table->style[0] = 'vertical-align: middle'; -$table->rowspan[0][0] = 2; - // Set initial conditions for these controls, later will be modified by javascript if (!$enable_init_date) { - $table->style[1] = 'display: none'; - $table->style[2] = 'display: flex;align-items: baseline;'; $display_to = 'none'; $display_item = ''; } else { - $table->style[1] = 'display: "block"'; - $table->style[2] = 'display: flex;align-items: baseline;'; $display_to = ''; $display_item = 'none'; } -$table->size = []; -$table->colspan[0][1] = 2; -$table->data = []; -$table->data[0][0] = html_print_image( - 'images/reporting32.png', - true, - [ - 'width' => '32', - 'height' => '32', - ] -); - -if (reporting_get_description($id_report)) { - $table->data[0][1] = '
'.reporting_get_description($id_report).'
'; -} else { - $table->data[0][1] = '
'.reporting_get_name($id_report).'
'; -} - -$table->data[0][1] .= '
'.__('Set initial date').html_print_checkbox('enable_init_date', 1, $enable_init_date, true).'
'; - $html_menu_export = enterprise_hook('reporting_print_button_export'); if ($html_menu_export === ENTERPRISE_NOT_HOOK) { $html_menu_export = ''; } -$table->data[0][1] .= '
'; -$table->data[0][1] .= $html_menu_export; +$table2->data[0][2] = '
'.__('Set initial date').'
'.html_print_checkbox_switch('enable_init_date', 1, $enable_init_date, true).'

'; +$table2->data[0][2] .= '
'.__('From').':
'; +$table2->data[0][2] .= html_print_input_text('date_init', $date_init, '', 12, 10, true).' '; +$table2->data[0][2] .= html_print_input_text('time_init', $time_init, '', 10, 7, true).' '; +$table2->data[0][2] .= '
'.__('Items period before').':
'; +$table2->data[0][2] .= '
'.__('to').':
'; +$table2->data[0][2] .= html_print_input_text('date', $date, '', 12, 10, true).' '; +$table2->data[0][2] .= html_print_input_text('time', $time, '', 10, 7, true).' '; +$table2->data[0][3] = $html_menu_export; -$table->data[1][1] = '
'.__('From').':
'; -$table->data[1][1] .= html_print_input_text('date_init', $date_init, '', 12, 10, true).' '; -$table->data[1][1] .= html_print_input_text('time_init', $time_init, '', 10, 7, true).' '; -$table->data[1][2] = '
'.__('Items period before').':
'; -$table->data[1][2] .= '
'.__('to').':
'; -$table->data[1][2] .= html_print_input_text('date', $date, '', 12, 10, true).' '; -$table->data[1][2] .= html_print_input_text('time', $time, '', 10, 7, true).' '; - $searchForm = '
'; -$searchForm .= html_print_table($table, true); +$searchForm .= html_print_table($table2, true); $searchForm .= html_print_input_hidden('id_report', $id_report, true); $Actionbuttons .= html_print_submit_button( @@ -354,10 +329,6 @@ for ($i = 0; $i < count($report['contents']); $i++) { reporting_html_print_report($report, false, $config['custom_report_info']); -// ---------------------------------------------------------------------- -// The rowspan of the first row is only 2 in controls table. Why is used the same code here and in the items?? -$table->rowspan[0][0] = 1; - echo '
'; echo html_print_image('images/wait.gif', true, ['border' => '0']); echo ''.__('Loading').'...'; @@ -387,16 +358,15 @@ $(document).ready (function () { secondText: '', currentText: '', closeText: ''}); - + $.datepicker.setDefaults($.datepicker.regional[ ""]); - + $("#text-date").datepicker({ dateFormat: "", changeMonth: true, changeYear: true, showAnim: "slideDown"}); - - + $('[id^=text-time_init]').timepicker({ showSecond: true, timeFormat: '', @@ -407,29 +377,23 @@ $(document).ready (function () { secondText: '', currentText: '', closeText: ''}); - + $('[id^=text-date_init]').datepicker ({ dateFormat: "", changeMonth: true, changeYear: true, showAnim: "slideDown"}); - - - $("*", "#controls_table-0").css("display", ""); //Re-show the first row of form. - + /* Show/hide begin date reports controls */ $("#checkbox-enable_init_date").click(function() { flag = $("#checkbox-enable_init_date").is(':checked'); if (flag == true) { - $("#controls_table-1-1").css("display", ""); - $("#controls_table-1-2").css("display", ""); $("#string_to").show(); + $('#string_from').show(); $("#string_items").hide(); - } - else { - $("#controls_table-1-1").css("display", "none"); - $("#controls_table-1-2").css("display", ""); + } else { $("#string_to").hide(); + $('#string_from').hide(); $("#string_items").show(); } }); From 1ba420a9ce1a8ebf9d657875efecd136a24a50bc Mon Sep 17 00:00:00 2001 From: daniel Date: Tue, 7 Mar 2023 16:22:13 +0100 Subject: [PATCH 27/35] fixed styles --- pandora_console/include/javascript/pandora.js | 7 +++++++ pandora_console/index.php | 15 --------------- 2 files changed, 7 insertions(+), 15 deletions(-) diff --git a/pandora_console/include/javascript/pandora.js b/pandora_console/include/javascript/pandora.js index 30da9745eb..8bfdee500c 100644 --- a/pandora_console/include/javascript/pandora.js +++ b/pandora_console/include/javascript/pandora.js @@ -2400,3 +2400,10 @@ function topFunction() { 500 ); } + +function menuActionButtonResizing() { + $(".action_buttons_right_content").attr( + "style", + "left: " + $("#menu_full").width() + "px;" + ); +} diff --git a/pandora_console/index.php b/pandora_console/index.php index 78de0734b4..a78d97d926 100755 --- a/pandora_console/index.php +++ b/pandora_console/index.php @@ -1524,17 +1524,6 @@ require 'include/php_to_js_values.php'; } } - //$('.button_collapse').on('click', menuActionButtonResizing()); - - // Cursor change for show a spinner. Experimental. - /* - $('.buttonButton').not('.dialog_opener').on('click', function(){ - $('*').css('cursor', 'wait'); - }); - $('.submitButton').not('.dialog_opener').on('click', function(){ - $('*').css('cursor', 'wait'); - }); -*/ // When the user scrolls down 400px from the top of the document, show the // button. window.onscroll = function() { @@ -1545,10 +1534,6 @@ require 'include/php_to_js_values.php'; scrollFunction() }; - function menuActionButtonResizing() { - $('.action_buttons_right_content').attr('style', 'left: '+($('#menu_full').width())+'px;'); - } - function first_time_identification() { jQuery.post("ajax.php", { "page": "general/register", From 2dbc2e801f210e1b7f224add470c5cf2565265dd Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Tue, 7 Mar 2023 17:24:36 +0100 Subject: [PATCH 28/35] Minor icon fixes --- .../godmode/reporting/reporting_builder.php | 4 ++-- pandora_console/godmode/servers/plugin.php | 18 ++++++++++++----- .../include/class/SnmpConsole.class.php | 20 +++++++++---------- .../include/functions_filemanager.php | 11 +++++----- pandora_console/include/styles/tables.css | 6 ++++-- .../operation/snmpconsole/snmp_browser.php | 8 ++++---- .../operation/snmpconsole/snmp_statistics.php | 16 +++++++-------- .../operation/snmpconsole/snmp_view.php | 2 +- 8 files changed, 47 insertions(+), 38 deletions(-) diff --git a/pandora_console/godmode/reporting/reporting_builder.php b/pandora_console/godmode/reporting/reporting_builder.php index 9fd9c02f7e..12d5266f34 100755 --- a/pandora_console/godmode/reporting/reporting_builder.php +++ b/pandora_console/godmode/reporting/reporting_builder.php @@ -509,11 +509,11 @@ switch ($action) { 'list_reports' => [ 'active' => false, 'text' => ''.html_print_image( - 'images/report_list.png', + 'images/logs@svg.svg', true, [ 'title' => __('Reports list'), - 'class' => 'invert_filter', + 'class' => 'main_menu_icon invert_filter', ] ).'', ], diff --git a/pandora_console/godmode/servers/plugin.php b/pandora_console/godmode/servers/plugin.php index 43fad7d3be..688e898c9d 100644 --- a/pandora_console/godmode/servers/plugin.php +++ b/pandora_console/godmode/servers/plugin.php @@ -632,7 +632,7 @@ if (empty($create) === false || empty($view) === false) { $delete_macro_style = 'display:none;'; } - $datam[2] = ''; + $datam[2] = ''; $table->colspan['plugin_action'][0] = 2; $table->colspan['plugin_action'][2] = 2; @@ -665,8 +665,10 @@ if (empty($create) === false || empty($view) === false) { echo ''; - if ($create != '') { - $button = html_print_submit_button( + $buttons = ''; + + if (empty($create) === false) { + $buttons .= html_print_submit_button( __('Create'), 'crtbutton', false, @@ -674,7 +676,7 @@ if (empty($create) === false || empty($view) === false) { true ); } else { - $button = html_print_submit_button( + $buttons .= html_print_submit_button( __('Update'), 'uptbutton', false, @@ -683,8 +685,14 @@ if (empty($create) === false || empty($view) === false) { ); } + $buttons .= html_print_go_back_button( + 'index.php?sec=gservers&sec2=godmode/servers/plugin', + ['button_class' => ''], + true + ); + html_print_action_buttons( - $button + $buttons ); echo ''; diff --git a/pandora_console/include/class/SnmpConsole.class.php b/pandora_console/include/class/SnmpConsole.class.php index c84775d4ed..5999479c64 100644 --- a/pandora_console/include/class/SnmpConsole.class.php +++ b/pandora_console/include/class/SnmpConsole.class.php @@ -183,29 +183,29 @@ class SnmpConsole extends HTML if (!isset($config['pure']) || $config['pure'] === false) { $statistics['text'] = ''.html_print_image( - 'images/op_reporting.png', + 'images/logs@svg.svg', true, [ 'title' => __('Statistics'), - 'class' => 'invert_filter', + 'class' => 'main_menu_icon invert_filter', ] ).''; $list['text'] = ''.html_print_image( - 'images/op_snmp.png', + 'images/SNMP-network-numeric-data@svg.svg', true, [ 'title' => __('List'), - 'class' => 'invert_filter', + 'class' => 'main_menu_icon invert_filter', ] ).''; $list['active'] = true; $screen['text'] = ''.html_print_image( - 'images/full_screen.png', + 'images/fullscreen@svg.svg', true, [ - 'title' => __('List'), - 'class' => 'invert_filter', + 'title' => __('View in full screen'), + 'class' => 'main_menu_icon invert_filter', ] ).''; @@ -242,11 +242,11 @@ class SnmpConsole extends HTML echo ''; echo html_print_image( - 'images/normal_screen.png', + 'images/exit_fullscreen@svg.svg', true, [ 'title' => __('Exit fullscreen'), - 'class' => 'invert_filter', + 'class' => 'main_menu_icon invert_filter', ] ); echo ''; @@ -844,7 +844,7 @@ class SnmpConsole extends HTML $tmp->snmp_agent .= ''.$tmp->source.''; } else { $tmp->snmp_agent .= ''; } diff --git a/pandora_console/include/functions_filemanager.php b/pandora_console/include/functions_filemanager.php index 1f1f57c832..0012804398 100644 --- a/pandora_console/include/functions_filemanager.php +++ b/pandora_console/include/functions_filemanager.php @@ -744,8 +744,7 @@ function filemanager_file_explorer( // Actions buttons // Delete button. - $data[4] = ''; - $data[4] .= ''; + $data[4] = '
'; $typefile = array_pop(explode('.', $fileinfo['name'])); if (is_writable($fileinfo['realpath']) === true && (is_dir($fileinfo['realpath']) === false || count(scandir($fileinfo['realpath'])) < 3) @@ -774,7 +773,7 @@ function filemanager_file_explorer( && ($typefile !== 'iso') && ($typefile !== 'docx') && ($typefile !== 'doc') && ($fileinfo['mime'] != MIME_DIR) ) { $hash = md5($fileinfo['realpath'].$config['server_unique_identifier']); - $data[4] .= "".html_print_image('images/edit.png', true, ['style' => 'margin-top: 2px;', 'title' => __('Edit file'), 'class' => 'invert_filter']).''; + $data[4] .= "".html_print_image('images/edit.svg', true, ['style' => 'margin-top: 2px;', 'title' => __('Edit file'), 'class' => 'main_menu_icon invert_filter']).''; } } } @@ -794,7 +793,7 @@ function filemanager_file_explorer( $data[4] .= ''.html_print_image('images/enable.svg', true, ['style' => 'margin-top: 2px;', 'title' => __('Real path'), 'class' => 'invert_filter main_menu_icon']).''; } - $data[4] .= ''; + $data[4] .= '
'; array_push($table->data, $data); } @@ -983,7 +982,7 @@ function filemanager_file_explorer(
"; if (isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] == 'on' || $_SERVER['SERVER_NAME'] == 'localhost' || $_SERVER['SERVER_NAME'] == '127.0.0.1') { - $modal_real_path .= "
".html_print_submit_button(__('Copy'), 'submit', false, 'class="sub next"', true).'
'; + $modal_real_path .= "
".html_print_submit_button(__('Copy'), 'submit', false, ['icon' => 'wand', 'mode' => 'mini'], true).'
'; } html_print_div( @@ -997,7 +996,7 @@ function filemanager_file_explorer( echo '
'; } else { echo "
"; - echo "".__('The directory is read-only'); + echo "".__('The directory is read-only'); echo '
'; } } diff --git a/pandora_console/include/styles/tables.css b/pandora_console/include/styles/tables.css index 7fbf593d16..4383e02ea5 100644 --- a/pandora_console/include/styles/tables.css +++ b/pandora_console/include/styles/tables.css @@ -235,7 +235,8 @@ .table_action_buttons > a, .table_action_buttons > img, -.table_action_buttons > button { +.table_action_buttons > button, +.table_action_buttons > form { visibility: hidden; } .info_table > tbody > tr:hover { @@ -246,7 +247,8 @@ .info_table > tbody > tr:hover .table_action_buttons > a, .info_table > tbody > tr:hover .table_action_buttons > img, -.info_table > tbody > tr:hover .table_action_buttons > button { +.info_table > tbody > tr:hover .table_action_buttons > button, +.info_table > tbody > tr:hover .table_action_buttons > form { visibility: visible; } diff --git a/pandora_console/operation/snmpconsole/snmp_browser.php b/pandora_console/operation/snmpconsole/snmp_browser.php index 3bcb2be975..9831d7ba64 100644 --- a/pandora_console/operation/snmpconsole/snmp_browser.php +++ b/pandora_console/operation/snmpconsole/snmp_browser.php @@ -50,11 +50,11 @@ if ($config['pure']) { // Windowed. $link['text'] = ''; $link['text'] .= html_print_image( - 'images/normal_screen.png', + 'images/exit_fullscreen@svg.svg', true, [ 'title' => __('Normal screen'), - 'class' => 'invert_filter', + 'class' => 'main_menu_icon invert_filter', ] ); $link['text'] .= ''; @@ -62,11 +62,11 @@ if ($config['pure']) { // Fullscreen. $link['text'] = ''; $link['text'] .= html_print_image( - 'images/full_screen.png', + 'images/fullscreen@svg.svg', true, [ 'title' => __('Full screen'), - 'class' => 'invert_filter', + 'class' => 'main_menu_icon invert_filter', ] ); $link['text'] .= ''; diff --git a/pandora_console/operation/snmpconsole/snmp_statistics.php b/pandora_console/operation/snmpconsole/snmp_statistics.php index 56109aa04c..0ebc548496 100755 --- a/pandora_console/operation/snmpconsole/snmp_statistics.php +++ b/pandora_console/operation/snmpconsole/snmp_statistics.php @@ -39,20 +39,20 @@ $refr = (int) get_parameter('refr', 0); $fullscreen = []; if ($config['pure']) { $fullscreen['text'] = ''.html_print_image( - 'images/normal_screen.png', + 'images/exit_fullscreen@svg.svg', true, [ 'title' => __('Normal screen'), - 'class' => 'invert_filter', + 'class' => 'main_menu_icon invert_filter', ] ).''; } else { $fullscreen['text'] = ''.html_print_image( - 'images/full_screen.png', + 'images/fullscreen@svg.svg', true, [ 'title' => __('Full screen'), - 'class' => 'invert_filter', + 'class' => 'main_menu_icon invert_filter', ] ).''; } @@ -60,11 +60,11 @@ if ($config['pure']) { // List $list = []; $list['text'] = ''.html_print_image( - 'images/op_snmp.png', + 'images/SNMP-network-numeric-data@svg.svg', true, [ 'title' => __('List'), - 'class' => 'invert_filter', + 'class' => 'main_menu_icon invert_filter', ] ).''; @@ -72,11 +72,11 @@ $list['text'] = ''.html_print_image( - 'images/op_reporting.png', + 'images/logs@svg.svg', true, [ 'title' => __('Statistics'), - 'class' => 'invert_filter', + 'class' => 'main_menu_icon invert_filter', ] ).''; diff --git a/pandora_console/operation/snmpconsole/snmp_view.php b/pandora_console/operation/snmpconsole/snmp_view.php index 9f0f9e44f8..f5c967972c 100755 --- a/pandora_console/operation/snmpconsole/snmp_view.php +++ b/pandora_console/operation/snmpconsole/snmp_view.php @@ -14,7 +14,7 @@ * |___| |___._|__|__|_____||_____|__| |___._| |___| |__|_|__|_______| * * ============================================================================ - * Copyright (c) 2005-2022 Artica Soluciones Tecnologicas + * Copyright (c) 2005-2023 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 From b13892ecdbb2bd3e59700f31de1243ea6e8c1e66 Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Tue, 7 Mar 2023 17:37:01 +0100 Subject: [PATCH 29/35] Users connected view --- .../extensions/users_connected.php | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/pandora_console/extensions/users_connected.php b/pandora_console/extensions/users_connected.php index 40b17f4903..21c319065b 100644 --- a/pandora_console/extensions/users_connected.php +++ b/pandora_console/extensions/users_connected.php @@ -34,7 +34,24 @@ function users_extension_main_god($god=true) } // Header. - ui_print_page_header(__('Users connected'), $image, false, '', $god); + ui_print_standard_header( + __('List of users connected'), + $image, + false, + '', + $god, + [], + [ + [ + 'link' => '', + 'label' => __('Workspace'), + ], + [ + 'link' => '', + 'label' => __('Users connected'), + ], + ] + ); $check_profile = db_get_row('tusuario_perfil', 'id_usuario', $config['id_user'], 'id_up'); if ($check_profile === false && !users_is_admin()) { From 651469b562b4bf271a6406b303433fb79eb35b20 Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Tue, 7 Mar 2023 17:37:33 +0100 Subject: [PATCH 30/35] Users connected view --- .../extensions/users_connected.php | 39 +++++++++++++------ 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/pandora_console/extensions/users_connected.php b/pandora_console/extensions/users_connected.php index 21c319065b..ad6282c598 100644 --- a/pandora_console/extensions/users_connected.php +++ b/pandora_console/extensions/users_connected.php @@ -1,16 +1,33 @@ Date: Tue, 7 Mar 2023 17:50:03 +0100 Subject: [PATCH 31/35] User edit notifications --- pandora_console/operation/users/user_edit_header.php | 12 ++++++------ .../operation/users/user_edit_notifications.php | 9 +++++---- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/pandora_console/operation/users/user_edit_header.php b/pandora_console/operation/users/user_edit_header.php index ea698e1355..50cb5c52fc 100644 --- a/pandora_console/operation/users/user_edit_header.php +++ b/pandora_console/operation/users/user_edit_header.php @@ -77,28 +77,28 @@ if (is_metaconsole()) { user_meta_print_header(); $urls['main'] = 'index.php?sec=advanced&sec2=advanced/users_setup&tab=user_edit'; } else { - $urls['main'] = 'index.php?sec=workspace&sec2=operation/users/user_edit'; + $urls['main'] = 'index.php?sec=gusuarios&sec2=godmode/users/user_list'; $urls['notifications'] = 'index.php?sec=workspace&sec2=operation/users/user_edit_notifications'; $buttons = [ 'main' => [ - 'active' => $_GET['sec2'] === 'operation/users/user_edit', + 'active' => $_GET['sec2'] === 'godmode/users/user_list&tab=user&pure=0', 'text' => "".html_print_image( - 'images/user.png', + 'images/user.svg', true, [ 'title' => __('User management'), - 'class' => 'invert_filter', + 'class' => 'main_menu_icon invert_filter', ] ).'', ], 'notifications' => [ 'active' => $_GET['sec2'] === 'operation/users/user_edit_notifications', 'text' => "".html_print_image( - 'images/alerts_template.png', + 'images/alert@svg.svg', true, [ 'title' => __('User notifications'), - 'class' => 'invert_filter', + 'class' => 'main_menu_icon invert_filter', ] ).'', ], diff --git a/pandora_console/operation/users/user_edit_notifications.php b/pandora_console/operation/users/user_edit_notifications.php index 4228c16543..e511eb0b92 100644 --- a/pandora_console/operation/users/user_edit_notifications.php +++ b/pandora_console/operation/users/user_edit_notifications.php @@ -15,7 +15,7 @@ * |___| |___._|__|__|_____||_____|__| |___._| |___| |__|_|__|_______| * * ============================================================================ - * Copyright (c) 2005-2021 Artica Soluciones Tecnologicas + * Copyright (c) 2005-2023 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 @@ -58,7 +58,7 @@ if (get_parameter('change_label', 0)) { } -echo '
+echo '
'.__('Enable').'
@@ -91,8 +91,9 @@ foreach ($sources as $source) { } if ((bool) $disabled_flag === true) { - $s = __('Controls have been disabled by the system administrator'); - echo ''.$s.''; + ui_print_warning_message( + __('Controls have been disabled by the system administrator') + ); } echo '
'; From 4af67db415e2528ced9ab3bb6e1cf41726f102f2 Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Tue, 7 Mar 2023 18:10:07 +0100 Subject: [PATCH 32/35] Export data view --- .../operation/agentes/exportdata.php | 312 +++++++++++------- 1 file changed, 185 insertions(+), 127 deletions(-) diff --git a/pandora_console/operation/agentes/exportdata.php b/pandora_console/operation/agentes/exportdata.php index 604131d888..910a46acb2 100644 --- a/pandora_console/operation/agentes/exportdata.php +++ b/pandora_console/operation/agentes/exportdata.php @@ -1,10 +1,10 @@ '', + 'label' => __('Tools'), + ], + [ + 'link' => '', + 'label' => __('Export data'), + ], + ] +); $group = get_parameter_post('group', 0); $agentName = get_parameter_post('agent', 0); @@ -220,48 +242,10 @@ if (!empty($export_btn) && !empty($module)) { } if (empty($export_btn) || $show_form) { - echo '
'; - - $table = new stdClass(); - $table->width = '100%'; - $table->border = 0; - $table->cellspacing = 3; - $table->cellpadding = 5; - $table->class = 'databox filters'; - $table->style[0] = 'vertical-align: top;'; - - $table->data = []; - - // Group selector - $table->data[0][0] = ''.__('Group').''; - $groups = users_get_groups($config['id_user'], 'RR', users_can_manage_group_all()); - $table->data[0][1] = '
'.html_print_select_groups( - $config['id_user'], - 'RR', - true, - 'group', - $group, - '', - '', - 0, - true, - false, - true, - '', - false - ).'
'; - - // Agent selector. - $table->data[1][0] = ''.__('Source agent').''; - $filter = []; - if ($group > 0) { - $filter['id_grupo'] = (array) $group; - } else { - $filter['id_grupo'] = array_keys($groups); - } + $filter['id_grupo'] = ($group > 0) ? (array) $group : array_keys($groups); $agents = []; $rows = agents_get_agents($filter, false, 'RR'); @@ -286,11 +270,6 @@ if (empty($export_btn) || $show_form) { $params['add_none_module'] = false; $params['size'] = 38; $params['selectbox_id'] = 'module_arr'; - $table->data[1][1] = ui_print_agent_autocomplete_input($params); - - // Module selector. - $table->data[2][0] = ''.__('Modules').''; - $table->data[2][0] .= ui_print_help_tip(__('No modules of type string. You can not calculate their average'), true); if ($agent > 0) { $modules = agents_get_modules($agent); @@ -325,91 +304,170 @@ if (empty($export_btn) || $show_form) { $disabled_export_button = true; } - $table->data[2][1] = html_print_select($modules, 'module_arr[]', array_keys($modules), '', '', 0, true, true, true, 'w250px', false); - - // Start date selector. - $table->data[3][0] = ''.__('Begin date').''; - - $table->data[3][1] = html_print_input_text( - 'start_date', - date('Y-m-d', (get_system_time() - SECONDS_1DAY)), - false, - 13, - 10, - true - ); - $table->data[3][1] .= html_print_image( - 'images/calendar_view_day.png', - true, - [ - 'alt' => 'calendar', - 'onclick' => "scwShow(scwID('text-start_date'),this);", - 'class' => 'invert_filter', - ] - ); - $table->data[3][1] .= html_print_input_text( - 'start_time', - date('H:i:s', (get_system_time() - SECONDS_1DAY)), - false, - 10, - 9, - true - ); - - // End date selector. - $table->data[4][0] = ''.__('End date').''; - $table->data[4][1] = html_print_input_text( - 'end_date', - date('Y-m-d', get_system_time()), - false, - 13, - 10, - true - ); - $table->data[4][1] .= html_print_image( - 'images/calendar_view_day.png', - true, - [ - 'alt' => 'calendar', - 'onclick' => "scwShow(scwID('text-end_date'),this);", - 'class' => 'invert_filter', - ] - ); - $table->data[4][1] .= html_print_input_text( - 'end_time', - date('H:i:s', get_system_time()), - false, - 10, - 9, - true - ); - - // Export type. - $table->data[5][0] = ''.__('Export type').''; - $export_types = []; $export_types['data'] = __('Data table'); $export_types['csv'] = __('CSV'); $export_types['excel'] = __('MS Excel'); $export_types['avg'] = __('Average per hour/day'); - $table->data[5][1] = html_print_select($export_types, 'export_type', $export_type, '', '', 0, true, false, true, 'w250px', false); + + echo ''; + + $table = new stdClass(); + $table->width = '100%'; + $table->border = 0; + $table->cellspacing = 3; + $table->cellpadding = 5; + $table->class = 'databox filter-table-adv'; + $table->style[0] = 'vertical-align: top;'; + + $table->data = []; + + // Group selector. + $table->data[0][] = html_print_label_input_block( + __('Group'), + html_print_select_groups( + $config['id_user'], + 'RR', + true, + 'group', + $group, + '', + '', + 0, + true, + false, + true, + '', + false + ) + ); + + // Agent selector. + $table->data[0][] = html_print_label_input_block( + __('Source agent'), + ui_print_agent_autocomplete_input($params) + ); + + // Module selector. + $table->data[1][] = html_print_label_input_block( + __('Modules'), + html_print_select( + $modules, + 'module_arr[]', + array_keys($modules), + '', + '', + 0, + true, + true, + true, + 'w100p', + false + ).ui_print_input_placeholder( + __('No modules of type string. You can not calculate their average'), + true + ) + ); + + // Export type. + $table->data[1][] = html_print_label_input_block( + __('Export type'), + html_print_select( + $export_types, + 'export_type', + $export_type, + '', + '', + 0, + true, + false, + true, + 'w100p', + false + ) + ); + + // Start date selector. + $table->data[2][] = html_print_label_input_block( + __('Begin date'), + html_print_div( + [ + 'class' => 'flex-content', + 'content' => html_print_input_text( + 'start_date', + date('Y-m-d', (get_system_time() - SECONDS_1DAY)), + false, + 13, + 10, + true + ).html_print_image( + 'images/calendar_view_day.png', + true, + [ + 'alt' => 'calendar', + 'onclick' => "scwShow(scwID('text-start_date'),this);", + 'class' => 'main_menu_icon invert_filter', + ] + ).html_print_input_text( + 'start_time', + date('H:i:s', (get_system_time() - SECONDS_1DAY)), + false, + 10, + 9, + true + ), + ], + true + ) + ); + + // End date selector. + $table->data[2][] = html_print_label_input_block( + __('End date'), + html_print_div( + [ + 'class' => 'flex-content', + 'content' => html_print_input_text( + 'end_date', + date('Y-m-d', get_system_time()), + false, + 13, + 10, + true + ).html_print_image( + 'images/calendar_view_day.png', + true, + [ + 'alt' => 'calendar', + 'onclick' => "scwShow(scwID('text-end_date'),this);", + 'class' => 'main_menu_icon invert_filter', + ] + ).html_print_input_text( + 'end_time', + date('H:i:s', get_system_time()), + false, + 10, + 9, + true + ), + ], + true + ), + ); html_print_table($table); // Submit button. - html_print_div( - [ - 'class' => 'action-buttons', - 'content' => html_print_button( - __('Export'), - 'export_btn', - false, - 'change_action()', - ['icon' => 'wand'], - true - ), - ] + html_print_action_buttons( + html_print_button( + __('Export'), + 'export_btn', + false, + 'change_action()', + ['icon' => 'wand'], + true + ) ); echo '
'; From 5017878701e736b1dd028811ba607cbd6f7920b1 Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Tue, 7 Mar 2023 22:05:06 +0100 Subject: [PATCH 33/35] Messages view --- .../operation/messages/message_edit.php | 149 ++++++++++-------- .../operation/messages/message_list.php | 86 ++++++---- 2 files changed, 141 insertions(+), 94 deletions(-) diff --git a/pandora_console/operation/messages/message_edit.php b/pandora_console/operation/messages/message_edit.php index 105a9560de..0e232788e7 100644 --- a/pandora_console/operation/messages/message_edit.php +++ b/pandora_console/operation/messages/message_edit.php @@ -14,7 +14,7 @@ * |___| |___._|__|__|_____||_____|__| |___._| |___| |__|_|__|_______| * * ============================================================================ - * Copyright (c) 2005-2022 Artica Soluciones Tecnologicas + * Copyright (c) 2005-2023 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 @@ -52,7 +52,7 @@ $buttons['message_list'] = [ true, [ 'title' => __('Received messages'), - 'class' => 'invert_filter', + 'class' => 'main_menu_icon invert_filter', ] ).'', ]; @@ -64,7 +64,7 @@ $buttons['sent_messages'] = [ true, [ 'title' => __('Sent messages'), - 'class' => 'invert_filter', + 'class' => 'main_menu_icon invert_filter', ] ).'', ]; @@ -76,7 +76,7 @@ $buttons['create_message'] = [ true, [ 'title' => __('Create message'), - 'class' => 'invert_filter', + 'class' => 'main_menu_icon invert_filter', ] ).'', ]; @@ -218,11 +218,8 @@ if ($read_message) { true ); - html_print_div( - [ - 'class' => 'action-buttons', - 'content' => $outputButtons, - ], + html_print_action_buttons( + $outputButtons ); return; @@ -264,18 +261,6 @@ if ($send_mes === true) { // User info. $own_info = get_user_info($config['id_user']); -$table = new stdClass(); -$table->width = '100%'; -$table->class = 'databox filters'; - -$table->data = []; - -$table->data[0][0] = __('Sender'); - -$table->data[0][1] = (empty($own_info['fullname']) === false) ? $own_info['fullname'] : $config['id_user']; - -$table->data[1][0] = __('Destination'); - $is_admin = (bool) db_get_value( 'is_admin', 'tusuario', @@ -305,15 +290,29 @@ foreach ($users_full as $user_id => $user_info) { $users[$user_info['id_user']] = (empty($user_info['fullname']) === true) ? $user_info['id_user'] : $user_info['fullname']; } +$table = new stdClass(); +$table->id = 'send_message_table'; +$table->width = '100%'; +$table->class = 'databox max_floating_element_size filter-table-adv'; +$table->style = []; +$table->style[0] = 'width: 30%'; +$table->style[1] = 'width: 70%'; +$table->data = []; + +$table->data[0][] = html_print_label_input_block( + __('Sender'), + ''.((empty($own_info['fullname']) === false) ? $own_info['fullname'] : $config['id_user']).'' +); + // Check if the user to reply is in the list, if not add reply user. if ($reply === true) { - $table->data[1][1] = (array_key_exists($dst_user, $users) === true) ? $users[$dst_user] : $dst_user; - $table->data[1][1] .= html_print_input_hidden( + $destinationInputs = (array_key_exists($dst_user, $users) === true) ? $users[$dst_user] : $dst_user; + $destinationInputs .= html_print_input_hidden( 'dst_user', $dst_user, true ); - $table->data[1][1] .= html_print_input_hidden( + $destinationInputs .= html_print_input_hidden( 'replied', '1', true @@ -324,21 +323,27 @@ if ($reply === true) { $groups = users_get_groups($config['id_user'], 'AR'); // Get a list of all groups. - $table->data[1][1] = html_print_select( - $users, - 'dst_user', - $dst_user, - 'changeStatusOtherSelect(\'dst_user\', \'dst_group\')', - __('Select user'), - false, - true, - false, - '' - ); - $table->data[1][1] .= '  '.__('OR').'  '; - $table->data[1][1] .= html_print_div( + $destinationInputs = html_print_div( [ - 'class' => 'w250px inline', + 'class' => 'select_users mrgn_right_5px', + 'content' => html_print_select( + $users, + 'dst_user', + $dst_user, + 'changeStatusOtherSelect(\'dst_user\', \'dst_group\')', + __('Select user'), + false, + true, + false, + '' + ), + ], + true + ); + $destinationInputs .= __('OR'); + $destinationInputs .= html_print_div( + [ + 'class' => 'mrgn_lft_5px', 'content' => html_print_select_groups( $config['id_user'], 'AR', @@ -355,24 +360,41 @@ if ($reply === true) { ); } -$table->data[2][0] = __('Subject'); -$table->data[2][1] = html_print_input_text( - 'subject', - $subject, - '', - 50, - 70, - true +$table->data[0][] = html_print_label_input_block( + __('Destination'), + html_print_div( + [ + 'class' => 'flex-content-left', + 'content' => $destinationInputs, + ], + true + ) ); -$table->data[3][0] = __('Message'); -$table->data[3][1] = html_print_textarea( - 'message', - 15, - 255, - $message, - '', - true +$table->colspan[1][] = 2; +$table->data[1][] = html_print_label_input_block( + __('Subject'), + html_print_input_text( + 'subject', + $subject, + '', + 50, + 70, + true + ) +); + +$table->colspan[2][] = 2; +$table->data[2][] = html_print_label_input_block( + __('Message'), + html_print_textarea( + 'message', + 15, + 50, + $message, + '', + true + ) ); $jsOutput = ''; @@ -396,17 +418,14 @@ echo '
'; - $data[0] .= html_print_image('images/email_inbox.png', true, ['border' => 0, 'title' => __('Click to read'), 'class' => 'invert_filter']); - $data[0] .= ''; + $pathRead = 'index.php?sec=message_list&sec2=operation/messages/message_edit&read_message=1&show_sent=1&id_message='.$message_id; + $titleRead = __('Click to read'); } else { - $data[0] .= ''; - $data[0] .= html_print_image('images/email_inbox.png', true, ['border' => 0, 'title' => __('Mark as unread'), 'class' => 'invert_filter']); - $data[0] .= ''; + $pathRead = 'index.php?sec=message_list&sec2=operation/messages/message_list&mark_unread=1&id_message='.$message_id; + $titleRead = __('Mark as unread'); } } else { if ($show_sent === true) { - $data[0] .= ''; - $data[0] .= html_print_image('images/email_inbox.png', true, ['border' => 0, 'title' => __('Message unread - click to read'), 'class' => 'invert_filter']); - $data[0] .= ''; + $pathRead = 'index.php?sec=message_list&sec2=operation/messages/message_edit&read_message=1&show_sent=1&id_message='.$message_id; + $titleRead = __('Message unread - click to read'); } else { - $data[0] .= ''; - $data[0] .= html_print_image('images/email_inbox.png', true, ['border' => 0, 'title' => __('Message unread - click to read'), 'class' => 'invert_filter']); - $data[0] .= ''; + $pathRead = 'index.php?sec=message_list&sec2=operation/messages/message_edit&read_message=1&id_message='.$message_id; + $titleRead = __('Message unread - click to read'); } } + $data[0] = html_print_anchor( + [ + 'href' => $pathRead, + 'content' => html_print_image( + 'images/email_inbox.png', + true, + [ + 'title' => $titleRead, + 'class' => 'main_menu_icon invert_filter', + ], + ), + ], + true + ); + if ($show_sent === true) { $dest_user = get_user_fullname($message['dest']); if (!$dest_user) { @@ -243,18 +254,24 @@ if (empty($messages) === true) { } if ($show_sent === true) { - $data[2] = ''; + $pathSubject = 'index.php?sec=message_list&sec2=operation/messages/message_edit&read_message=1&show_sent=1&id_message='.$message_id; } else { - $data[2] = ''; + $pathSubject = 'index.php?sec=message_list&sec2=operation/messages/message_edit&read_message=1&id_message='.$message_id; } - if ($message['subject'] == '') { - $data[2] .= __('No Subject'); - } else { - $data[2] .= $message['subject']; + $contentSubject = (empty($message['subject']) === true) ? __('No Subject') : $message['subject']; + + if ((int) $message['read'] !== 1) { + $contentSubject = ''.$contentSubject.''; } - $data[2] .= ''; + $data[2] .= html_print_anchor( + [ + 'href' => $pathSubject, + 'content' => $contentSubject, + ], + true + ); $data[3] = ui_print_timestamp( $message['timestamp'], @@ -264,13 +281,27 @@ if (empty($messages) === true) { $table->cellclass[][4] = 'table_action_buttons'; if ($show_sent === true) { - $data[4] = ''.html_print_image('images/cross.png', true, ['title' => __('Delete'), 'class' => 'invert_filter']).''; + $pathDelete = 'index.php?sec=message_list&sec2=operation/messages/message_list&show_sent=1&delete_message=1&id='.$message_id; } else { - $data[4] = ''.html_print_image('images/cross.png', true, ['title' => __('Delete'), 'class' => 'invert_filter']).''; + $pathDelete = 'index.php?sec=message_list&sec2=operation/messages/message_list&delete_message=1&id='.$message_id; } + $data[4] = html_print_anchor( + [ + 'href' => $pathDelete, + 'content' => html_print_image( + 'images/delete.svg', + true, + [ + 'title' => __('Delete'), + 'class' => 'main_menu_icon invert_filter', + ] + ), + 'onClick' => 'javascript:if (!confirm(\''.__('Are you sure?').'\')) return false;', + ], + true + ); + array_push($table->data, $data); } } @@ -312,11 +343,8 @@ if (empty($messages) === false) { echo '
'; - html_print_div( - [ - 'class' => 'action-buttons', - 'content' => $outputButton, - ] + html_print_action_buttons( + $outputButton ); ?> From eefb62e520fab8c2b199a2e702ff3ff108642cea Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Tue, 7 Mar 2023 22:45:48 +0100 Subject: [PATCH 34/35] Input improve --- pandora_console/include/functions_html.php | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/pandora_console/include/functions_html.php b/pandora_console/include/functions_html.php index e9e60f3418..be9ed5d1a8 100644 --- a/pandora_console/include/functions_html.php +++ b/pandora_console/include/functions_html.php @@ -4903,7 +4903,8 @@ function html_print_autocomplete_modules( $filter=[], $return=false, $id_agent_module=0, - $size='30' + $size='30', + $underInputTip=false ) { global $config; @@ -4960,7 +4961,11 @@ function html_print_autocomplete_modules( html_print_input_hidden($name.'_hidden', $id_agent_module); if (is_metaconsole() === false) { - ui_print_help_tip(__('Type at least two characters to search the module.'), false); + if ($underInputTip === true) { + ui_print_input_placeholder(__('Type at least two characters to search the module.'), false); + } else { + ui_print_help_tip(__('Type at least two characters to search the module.'), false); + } } $javascript_ajax_page = ui_get_full_url('ajax.php', false, false, false); From 27357b16b632a40bd58c771c6f8e6a85f86feb7e Mon Sep 17 00:00:00 2001 From: artica Date: Wed, 8 Mar 2023 01:00:21 +0100 Subject: [PATCH 35/35] Auto-updated build strings. --- pandora_agents/unix/DEBIAN/control | 2 +- pandora_agents/unix/DEBIAN/make_deb_package.sh | 2 +- pandora_agents/unix/pandora_agent | 2 +- pandora_agents/unix/pandora_agent.redhat.spec | 2 +- pandora_agents/unix/pandora_agent.spec | 2 +- pandora_agents/unix/pandora_agent_installer | 2 +- pandora_agents/win32/installer/pandora.mpi | 2 +- pandora_agents/win32/pandora.cc | 2 +- pandora_agents/win32/versioninfo.rc | 2 +- pandora_console/DEBIAN/control | 2 +- pandora_console/DEBIAN/make_deb_package.sh | 2 +- pandora_console/include/config_process.php | 2 +- pandora_console/install.php | 2 +- pandora_console/pandora_console.redhat.spec | 2 +- pandora_console/pandora_console.rhel7.spec | 2 +- pandora_console/pandora_console.spec | 2 +- pandora_server/DEBIAN/control | 2 +- pandora_server/DEBIAN/make_deb_package.sh | 2 +- pandora_server/lib/PandoraFMS/Config.pm | 2 +- pandora_server/lib/PandoraFMS/PluginTools.pm | 2 +- pandora_server/pandora_server.redhat.spec | 2 +- pandora_server/pandora_server.spec | 2 +- pandora_server/pandora_server_installer | 2 +- pandora_server/util/pandora_db.pl | 2 +- pandora_server/util/pandora_manage.pl | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index d48173512f..7d9cee8f9c 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.769-230307 +Version: 7.0NG.769-230308 Architecture: all Priority: optional Section: admin diff --git a/pandora_agents/unix/DEBIAN/make_deb_package.sh b/pandora_agents/unix/DEBIAN/make_deb_package.sh index cb6b963504..53c9f200aa 100644 --- a/pandora_agents/unix/DEBIAN/make_deb_package.sh +++ b/pandora_agents/unix/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.769-230307" +pandora_version="7.0NG.769-230308" echo "Test if you has the tools for to make the packages." whereis dpkg-deb | cut -d":" -f2 | grep dpkg-deb > /dev/null diff --git a/pandora_agents/unix/pandora_agent b/pandora_agents/unix/pandora_agent index 012a228cd2..492ec37320 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -1023,7 +1023,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.769'; -use constant AGENT_BUILD => '230307'; +use constant AGENT_BUILD => '230308'; # Agent log default file size maximum and instances use constant DEFAULT_MAX_LOG_SIZE => 600000; diff --git a/pandora_agents/unix/pandora_agent.redhat.spec b/pandora_agents/unix/pandora_agent.redhat.spec index 26931473af..77859b1dde 100644 --- a/pandora_agents/unix/pandora_agent.redhat.spec +++ b/pandora_agents/unix/pandora_agent.redhat.spec @@ -4,7 +4,7 @@ %global __os_install_post %{nil} %define name pandorafms_agent_linux %define version 7.0NG.769 -%define release 230307 +%define release 230308 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index 329768dfa7..857f141c94 100644 --- a/pandora_agents/unix/pandora_agent.spec +++ b/pandora_agents/unix/pandora_agent.spec @@ -4,7 +4,7 @@ %global __os_install_post %{nil} %define name pandorafms_agent_linux %define version 7.0NG.769 -%define release 230307 +%define release 230308 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent_installer b/pandora_agents/unix/pandora_agent_installer index 1a32864bd8..79cc3133b3 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.769" -PI_BUILD="230307" +PI_BUILD="230308" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index 48912e2ff3..a78a35121f 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{230307} +{230308} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index 11a3383389..d7ef085547 100644 --- a/pandora_agents/win32/pandora.cc +++ b/pandora_agents/win32/pandora.cc @@ -30,7 +30,7 @@ using namespace Pandora; using namespace Pandora_Strutils; #define PATH_SIZE _MAX_PATH+1 -#define PANDORA_VERSION ("7.0NG.769 Build 230307") +#define PANDORA_VERSION ("7.0NG.769 Build 230308") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index 3c842ed958..76b5c3540e 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Artica ST" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.769(Build 230307))" + VALUE "ProductVersion", "(7.0NG.769(Build 230308))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index d71a8ffb94..b3ce245f17 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.769-230307 +Version: 7.0NG.769-230308 Architecture: all Priority: optional Section: admin diff --git a/pandora_console/DEBIAN/make_deb_package.sh b/pandora_console/DEBIAN/make_deb_package.sh index ecb6a40251..0a19d7c0e3 100644 --- a/pandora_console/DEBIAN/make_deb_package.sh +++ b/pandora_console/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.769-230307" +pandora_version="7.0NG.769-230308" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index 75b110fd90..e4b91d9635 100644 --- a/pandora_console/include/config_process.php +++ b/pandora_console/include/config_process.php @@ -20,7 +20,7 @@ /** * Pandora build version and version */ -$build_version = 'PC230307'; +$build_version = 'PC230308'; $pandora_version = 'v7.0NG.769'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/install.php b/pandora_console/install.php index 2a7bde9bb0..68d69a23d6 100644 --- a/pandora_console/install.php +++ b/pandora_console/install.php @@ -131,7 +131,7 @@
[ qw() ] ); diff --git a/pandora_server/pandora_server.redhat.spec b/pandora_server/pandora_server.redhat.spec index 205a8ef850..a4738c6552 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -4,7 +4,7 @@ %global __os_install_post %{nil} %define name pandorafms_server %define version 7.0NG.769 -%define release 230307 +%define release 230308 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index 2cc1e07821..b108390a3d 100644 --- a/pandora_server/pandora_server.spec +++ b/pandora_server/pandora_server.spec @@ -4,7 +4,7 @@ %global __os_install_post %{nil} %define name pandorafms_server %define version 7.0NG.769 -%define release 230307 +%define release 230308 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index 6479a6943a..2a76611dde 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.769" -PI_BUILD="230307" +PI_BUILD="230308" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index 3ddb47ab77..ce08881710 100755 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -35,7 +35,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.769 Build 230307"; +my $version = "7.0NG.769 Build 230308"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index e5eec498f7..0b193ab6c6 100755 --- a/pandora_server/util/pandora_manage.pl +++ b/pandora_server/util/pandora_manage.pl @@ -36,7 +36,7 @@ use Encode::Locale; Encode::Locale::decode_argv; # version: define current version -my $version = "7.0NG.769 Build 230307"; +my $version = "7.0NG.769 Build 230308"; # save program name for logging my $progname = basename($0);