From 354324b9d14b38d686f7b19ee4d072c794294997 Mon Sep 17 00:00:00 2001 From: "alejandro.campos@artica.es" Date: Mon, 24 Jul 2023 13:11:05 +0200 Subject: [PATCH 001/123] implemented database ha view in metaconsole --- pandora_console/include/functions_html.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/include/functions_html.php b/pandora_console/include/functions_html.php index 68b90c5dc9..4bc25da298 100644 --- a/pandora_console/include/functions_html.php +++ b/pandora_console/include/functions_html.php @@ -3294,7 +3294,7 @@ function html_print_input_image($name, $src, $value, $style='', $return=false, $ // If metaconsole is activated and image doesn't exists try to search on normal console. if (is_metaconsole() === true) { - if (false === @file_get_contents($src, 0, null, 0, 1)) { + if ($src !== null && false === @file_get_contents($src, 0, null, 0, 1)) { $src = '../../'.$src; } } From d44df2ea6b2650262737f53daaf3e0d0e88c0f2d Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Thu, 27 Jul 2023 13:21:57 +0200 Subject: [PATCH 002/123] #11326 added top n agents with worst score --- .../reporting_builder.item_editor.php | 11 +++++++++- .../godmode/reporting/reporting_builder.php | 12 ++++++++++ .../include/functions_reporting.php | 7 ++++++ .../include/functions_reporting_html.php | 22 +++++++++++++++++++ pandora_console/include/functions_reports.php | 7 ++++++ 5 files changed, 58 insertions(+), 1 deletion(-) diff --git a/pandora_console/godmode/reporting/reporting_builder.item_editor.php b/pandora_console/godmode/reporting/reporting_builder.item_editor.php index 397e533366..3eb6bc6d1c 100755 --- a/pandora_console/godmode/reporting/reporting_builder.item_editor.php +++ b/pandora_console/godmode/reporting/reporting_builder.item_editor.php @@ -1019,6 +1019,11 @@ switch ($action) { $idAgent = $item['id_agent']; break; + case 'top_n_agents_sh': + $group = $item['id_group']; + $top_n_value = (empty($item['top_n_value']) === true) ? 10 : $item['top_n_value']; + break; + default: // It's not possible. break; @@ -7411,7 +7416,11 @@ function chooseType() { case 'ncm': $("#row_agent").show(); break; - + + case 'top_n_agents_sh': + $("#row_group").show(); + $("#row_max_items").show(); + break; } switch (type) { diff --git a/pandora_console/godmode/reporting/reporting_builder.php b/pandora_console/godmode/reporting/reporting_builder.php index 00bc80f234..242ee1156c 100755 --- a/pandora_console/godmode/reporting/reporting_builder.php +++ b/pandora_console/godmode/reporting/reporting_builder.php @@ -1987,6 +1987,12 @@ switch ($action) { $good_format = true; break; + case 'top_n_agents_sh': + $values['id_group'] = get_parameter('combo_group'); + $values['top_n_value'] = get_parameter('max_items'); + $good_format = true; + break; + default: $values['period'] = get_parameter('period'); $values['top_n'] = get_parameter( @@ -2863,6 +2869,12 @@ switch ($action) { $good_format = true; break; + case 'top_n_agents_sh': + $values['id_group'] = get_parameter('combo_group'); + $values['top_n_value'] = get_parameter('max_items'); + $good_format = true; + break; + default: $values['period'] = get_parameter('period'); $values['top_n'] = get_parameter( diff --git a/pandora_console/include/functions_reporting.php b/pandora_console/include/functions_reporting.php index c01e44157a..d92b4ea38e 100755 --- a/pandora_console/include/functions_reporting.php +++ b/pandora_console/include/functions_reporting.php @@ -935,6 +935,13 @@ function reporting_make_reporting_data( ); break; + case 'top_n_agents_sh': + $report['contents'][] = reporting_top_n_agents_sh( + $report, + $content + ); + break; + default: // Default. break; diff --git a/pandora_console/include/functions_reporting_html.php b/pandora_console/include/functions_reporting_html.php index 91d8a9e5a5..ca36af48b8 100644 --- a/pandora_console/include/functions_reporting_html.php +++ b/pandora_console/include/functions_reporting_html.php @@ -463,6 +463,10 @@ function reporting_html_print_report($report, $mini=false, $report_info=1) case 'ncm': reporting_html_ncm_config($table, $item); break; + + case 'top_n_agents_sh': + reporting_html_top_n_agents_sh($table, $item); + break; } if ($item['type'] == 'agent_module') { @@ -478,6 +482,24 @@ function reporting_html_print_report($report, $mini=false, $report_info=1) } +function reporting_html_top_n_agents_sh($table, $item) +{ + global $config; + + $table->data[1][0] = ''.__('Agent').''; + $table->data[1][1] = ''.__('Last audit scan').''; + $table->data[1][2] = ''.__('Score').''; + + $row = 2; + foreach ($item['data'] as $key => $agent) { + $table->data[$row][0] = $agent['alias']; + $table->data[$row][1] = date($config['date_format'], $agent['utimestamp']); + $table->data[$row][2] = $agent['datos'].' %'; + $row++; + } +} + + /** * Function to print to HTML SLA report. * diff --git a/pandora_console/include/functions_reports.php b/pandora_console/include/functions_reports.php index f13e935b6a..5b2c00229f 100755 --- a/pandora_console/include/functions_reports.php +++ b/pandora_console/include/functions_reports.php @@ -963,6 +963,13 @@ function reports_get_report_types($template=false, $not_editor=false) 'name' => __('Network configuration changes'), ]; + if (enterprise_installed() === true) { + $types['top_n_agents_sh'] = [ + 'optgroup' => __('Security hardening'), + 'name' => __('Top-N agents with the worst score'), + ]; + } + return $types; } From a0fdb2a791dbcef9f8023965211680b506d3c209 Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Fri, 28 Jul 2023 12:11:36 +0200 Subject: [PATCH 003/123] #11326 new report vulnerabilities --- pandora_console/extras/mr/66.sql | 5 ++ .../reporting_builder.item_editor.php | 35 ++++++++ .../godmode/reporting/reporting_builder.php | 12 +++ .../include/functions_reporting.php | 7 ++ .../include/functions_reporting_html.php | 12 +++ pandora_console/include/functions_reports.php | 5 ++ pandora_console/include/graphs/fgraph.php | 11 +++ .../phpchartjs/src/Options/Elements.php | 26 ++++++ .../src/Options/Elements/Center.php | 85 +++++++++++++++++++ 9 files changed, 198 insertions(+) create mode 100644 pandora_console/extras/mr/66.sql create mode 100644 pandora_console/vendor/artica/phpchartjs/src/Options/Elements/Center.php diff --git a/pandora_console/extras/mr/66.sql b/pandora_console/extras/mr/66.sql new file mode 100644 index 0000000000..c563508f1a --- /dev/null +++ b/pandora_console/extras/mr/66.sql @@ -0,0 +1,5 @@ +START TRANSACTION; + +ALTER TABLE `treport_content` ADD COLUMN `cat_security_hardening` INT NOT NULL DEFAULT 0; + +COMMIT; \ No newline at end of file diff --git a/pandora_console/godmode/reporting/reporting_builder.item_editor.php b/pandora_console/godmode/reporting/reporting_builder.item_editor.php index 3eb6bc6d1c..cc3fee9a2c 100755 --- a/pandora_console/godmode/reporting/reporting_builder.item_editor.php +++ b/pandora_console/godmode/reporting/reporting_builder.item_editor.php @@ -200,6 +200,14 @@ $text_agent_module = ''; $only_data = false; +$categories_security_hardening = []; +if (security_hardening_installed() === true) { + $categories_security_hardening = categories_of_cis(); + foreach ($categories_security_hardening as $key => $cat) { + $categories_security_hardening[$key] = implode(' ', $cat); + } +} + // Users. $id_users = []; $users_groups = []; @@ -1024,6 +1032,11 @@ switch ($action) { $top_n_value = (empty($item['top_n_value']) === true) ? 10 : $item['top_n_value']; break; + case 'vul_by_cat': + $group = $item['id_group']; + $cat_selected = $item['cat_security_hardening']; + break; + default: // It's not possible. break; @@ -3690,6 +3703,22 @@ $class = 'databox filters'; ?> + + + + + + + + @@ -6562,6 +6591,7 @@ function chooseType() { $("#row_group_by").hide(); $("#row_type_show").hide(); $("#row_use_prefix_notation").hide(); + $("#row_cat_security_hardening").hide(); // SLA list default state. $("#sla_list").hide(); @@ -7421,6 +7451,11 @@ function chooseType() { $("#row_group").show(); $("#row_max_items").show(); break; + + case 'vul_by_cat': + $("#row_group").show(); + $("#row_cat_security_hardening").show(); + break; } switch (type) { diff --git a/pandora_console/godmode/reporting/reporting_builder.php b/pandora_console/godmode/reporting/reporting_builder.php index 242ee1156c..697561a59f 100755 --- a/pandora_console/godmode/reporting/reporting_builder.php +++ b/pandora_console/godmode/reporting/reporting_builder.php @@ -1993,6 +1993,12 @@ switch ($action) { $good_format = true; break; + case 'vul_by_cat': + $values['id_group'] = get_parameter('combo_group'); + $values['cat_security_hardening'] = get_parameter('cat_security_hardening'); + $good_format = true; + break; + default: $values['period'] = get_parameter('period'); $values['top_n'] = get_parameter( @@ -2875,6 +2881,12 @@ switch ($action) { $good_format = true; break; + case 'vul_by_cat': + $values['id_group'] = get_parameter('combo_group'); + $values['cat_security_hardening'] = get_parameter('cat_security_hardening'); + $good_format = true; + break; + default: $values['period'] = get_parameter('period'); $values['top_n'] = get_parameter( diff --git a/pandora_console/include/functions_reporting.php b/pandora_console/include/functions_reporting.php index d92b4ea38e..6561fe9389 100755 --- a/pandora_console/include/functions_reporting.php +++ b/pandora_console/include/functions_reporting.php @@ -942,6 +942,13 @@ function reporting_make_reporting_data( ); break; + case 'vul_by_cat': + $report['contents'][] = reporting_vul_by_categories( + $report, + $content + ); + break; + default: // Default. break; diff --git a/pandora_console/include/functions_reporting_html.php b/pandora_console/include/functions_reporting_html.php index ca36af48b8..bf144cd518 100644 --- a/pandora_console/include/functions_reporting_html.php +++ b/pandora_console/include/functions_reporting_html.php @@ -467,6 +467,10 @@ function reporting_html_print_report($report, $mini=false, $report_info=1) case 'top_n_agents_sh': reporting_html_top_n_agents_sh($table, $item); break; + + case 'vul_by_cat': + reporting_vul_by_cat_graph($table, $item); + break; } if ($item['type'] == 'agent_module') { @@ -482,6 +486,14 @@ function reporting_html_print_report($report, $mini=false, $report_info=1) } +function reporting_vul_by_cat_graph($table, $item) +{ + $table->colspan['chart']['cell'] = 3; + $table->cellstyle['chart']['cell'] = 'text-align: center;'; + $table->data['chart']['cell'] = $item['chart']; +} + + function reporting_html_top_n_agents_sh($table, $item) { global $config; diff --git a/pandora_console/include/functions_reports.php b/pandora_console/include/functions_reports.php index 5b2c00229f..fca253153e 100755 --- a/pandora_console/include/functions_reports.php +++ b/pandora_console/include/functions_reports.php @@ -968,6 +968,11 @@ function reports_get_report_types($template=false, $not_editor=false) 'optgroup' => __('Security hardening'), 'name' => __('Top-N agents with the worst score'), ]; + + $types['vul_by_cat'] = [ + 'optgroup' => __('Security hardening'), + 'name' => __('Vulnerabilities by category'), + ]; } return $types; diff --git a/pandora_console/include/graphs/fgraph.php b/pandora_console/include/graphs/fgraph.php index 7da82a2ba8..40466decb5 100644 --- a/pandora_console/include/graphs/fgraph.php +++ b/pandora_console/include/graphs/fgraph.php @@ -691,6 +691,17 @@ function get_build_setup_charts($type, $options, $data) } $chart->options()->setMaintainAspectRatio($maintainAspectRatio); + if (isset($options['elements']) === true) { + if (isset($options['elements']['center']) === true) { + if (isset($options['elements']['center']['text']) === true) { + $chart->options()->getElements()->center()->setText($options['elements']['center']['text']); + } + + if (isset($options['elements']['center']['color']) === true) { + $chart->options()->getElements()->center()->setColor($options['elements']['center']['color']); + } + } + } // Set Responsive for responsive charts. $responsive = true; diff --git a/pandora_console/vendor/artica/phpchartjs/src/Options/Elements.php b/pandora_console/vendor/artica/phpchartjs/src/Options/Elements.php index 116fc46758..b63513bc23 100644 --- a/pandora_console/vendor/artica/phpchartjs/src/Options/Elements.php +++ b/pandora_console/vendor/artica/phpchartjs/src/Options/Elements.php @@ -8,6 +8,7 @@ use Artica\PHPChartJS\Options\Elements\Arc; use Artica\PHPChartJS\Options\Elements\Line; use Artica\PHPChartJS\Options\Elements\Point; use Artica\PHPChartJS\Options\Elements\Rectangle; +use Artica\PHPChartJS\Options\Elements\Center; use JsonSerializable; /** @@ -39,6 +40,11 @@ class Elements implements ArraySerializableInterface, JsonSerializable */ private $arc; + /** + * @var Center + */ + private $center; + /** * @return Rectangle */ @@ -119,6 +125,26 @@ class Elements implements ArraySerializableInterface, JsonSerializable return $this->arc; } + /** + * @return Center + */ + public function center() + { + if (is_null($this->center)) { + $this->center = new Center(); + } + + return $this->center; + } + + /** + * @return Center + */ + public function getCenter() + { + return $this->center; + } + /** * @return array */ diff --git a/pandora_console/vendor/artica/phpchartjs/src/Options/Elements/Center.php b/pandora_console/vendor/artica/phpchartjs/src/Options/Elements/Center.php new file mode 100644 index 0000000000..d8b35b4e89 --- /dev/null +++ b/pandora_console/vendor/artica/phpchartjs/src/Options/Elements/Center.php @@ -0,0 +1,85 @@ +text; + } + + /** + * Set text center graph. + * + * @param string $text Text center graph. + * + * @return self + */ + public function setText(string $text) + { + $this->text = $text; + + return $this; + } + + /** + * Get color text. + * + * @return string + */ + public function getColor() + { + return $this->color; + } + + /** + * Set color text. + * + * @param string $color Color text. + * + * @return self + */ + public function setColor(string $color) + { + $this->color = $color; + + return $this; + } + + /** + * @return array + */ + public function jsonSerialize() + { + return $this->getArrayCopy(); + } +} From c92899573f9a0998ef0de4a70ae712c1699412a6 Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Fri, 28 Jul 2023 12:12:29 +0200 Subject: [PATCH 004/123] #11326 new field in treport_content for reports --- pandora_console/pandoradb.sql | 1 + 1 file changed, 1 insertion(+) diff --git a/pandora_console/pandoradb.sql b/pandora_console/pandoradb.sql index 87f6283152..dcb3e41220 100644 --- a/pandora_console/pandoradb.sql +++ b/pandora_console/pandoradb.sql @@ -1641,6 +1641,7 @@ CREATE TABLE IF NOT EXISTS `treport_content` ( `macros_definition` TEXT, `render_definition` TEXT, `use_prefix_notation` TINYINT UNSIGNED NOT NULL DEFAULT 1, + `cat_security_hardening` INT NOT NULL DEFAULT 0, PRIMARY KEY(`id_rc`), FOREIGN KEY (`id_report`) REFERENCES treport(`id_report`) ON UPDATE CASCADE ON DELETE CASCADE From bc66f71e14e42f1204452d6faf28e0bc8807c13b Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Mon, 7 Aug 2023 12:42:05 +0200 Subject: [PATCH 005/123] #11807 added report vul_by_cat --- pandora_console/extras/mr/66.sql | 2 ++ .../reporting_builder.item_editor.php | 24 +++++++++++++++++++ pandora_console/pandoradb.sql | 1 + 3 files changed, 27 insertions(+) diff --git a/pandora_console/extras/mr/66.sql b/pandora_console/extras/mr/66.sql index c563508f1a..291f25e2a3 100644 --- a/pandora_console/extras/mr/66.sql +++ b/pandora_console/extras/mr/66.sql @@ -2,4 +2,6 @@ START TRANSACTION; ALTER TABLE `treport_content` ADD COLUMN `cat_security_hardening` INT NOT NULL DEFAULT 0; +ALTER TABLE `treport_content` ADD COLUMN `ignore_skipped` INT NOT NULL DEFAULT 0; + COMMIT; \ No newline at end of file diff --git a/pandora_console/godmode/reporting/reporting_builder.item_editor.php b/pandora_console/godmode/reporting/reporting_builder.item_editor.php index cc3fee9a2c..ea1db7aac8 100755 --- a/pandora_console/godmode/reporting/reporting_builder.item_editor.php +++ b/pandora_console/godmode/reporting/reporting_builder.item_editor.php @@ -1029,12 +1029,15 @@ switch ($action) { case 'top_n_agents_sh': $group = $item['id_group']; + $recursion = $item['recursion']; $top_n_value = (empty($item['top_n_value']) === true) ? 10 : $item['top_n_value']; break; case 'vul_by_cat': $group = $item['id_group']; + $recursion = $item['recursion']; $cat_selected = $item['cat_security_hardening']; + $ignore_skipped = ($item['ignore_skipped'] !== null) ? $item['ignore_skipped'] : true; break; default: @@ -3703,6 +3706,24 @@ $class = 'databox filters'; ?> + + + + + + + + + + + @@ -6592,6 +6614,7 @@ function chooseType() { $("#row_type_show").hide(); $("#row_use_prefix_notation").hide(); $("#row_cat_security_hardening").hide(); + $("#row_ignore_skipped").hide(); // SLA list default state. $("#sla_list").hide(); @@ -7455,6 +7478,7 @@ function chooseType() { case 'vul_by_cat': $("#row_group").show(); $("#row_cat_security_hardening").show(); + $("#row_ignore_skipped").show(); break; } diff --git a/pandora_console/pandoradb.sql b/pandora_console/pandoradb.sql index d9d5a9f1cd..8b5ed12e91 100644 --- a/pandora_console/pandoradb.sql +++ b/pandora_console/pandoradb.sql @@ -1657,6 +1657,7 @@ CREATE TABLE IF NOT EXISTS `treport_content` ( `render_definition` TEXT, `use_prefix_notation` TINYINT UNSIGNED NOT NULL DEFAULT 1, `cat_security_hardening` INT NOT NULL DEFAULT 0, + `ignore_skipped` INT NOT NULL DEFAULT 0, PRIMARY KEY(`id_rc`), FOREIGN KEY (`id_report`) REFERENCES treport(`id_report`) ON UPDATE CASCADE ON DELETE CASCADE From 3429e0d190bbdb38123b55bb2fe6d6ec65b65de7 Mon Sep 17 00:00:00 2001 From: Jorge Rincon Date: Mon, 7 Aug 2023 14:43:50 +0200 Subject: [PATCH 006/123] #10065 Added the option to create-edit a private event filter. --- pandora_console/extras/mr/66.sql | 5 ++++ .../godmode/events/event_edit_filter.php | 30 +++++++++++++++++-- .../godmode/events/event_filter.php | 12 ++++++++ pandora_console/include/ajax/events.php | 25 ++++++++++++++-- pandora_console/include/functions_events.php | 17 +++++++++-- pandora_console/operation/events/events.php | 24 +++++++++++++++ 6 files changed, 107 insertions(+), 6 deletions(-) create mode 100644 pandora_console/extras/mr/66.sql diff --git a/pandora_console/extras/mr/66.sql b/pandora_console/extras/mr/66.sql new file mode 100644 index 0000000000..cffa3707c1 --- /dev/null +++ b/pandora_console/extras/mr/66.sql @@ -0,0 +1,5 @@ +START TRANSACTION; + +ALTER TABLE tevent_filter ADD private_filter_user text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL; + +COMMIT; diff --git a/pandora_console/godmode/events/event_edit_filter.php b/pandora_console/godmode/events/event_edit_filter.php index e230055f1e..aaf5d00b9b 100644 --- a/pandora_console/godmode/events/event_edit_filter.php +++ b/pandora_console/godmode/events/event_edit_filter.php @@ -61,6 +61,9 @@ if ($id) { $filter = events_get_event_filter($id); $id_group_filter = $filter['id_group_filter']; $id_group = $filter['id_group']; + // Get owner user private filter. + $private_filter = ($filter['private_filter_user'] === null || $filter['private_filter_user'] === '') ? 0 : 1; + $private_filter_user = $filter['private_filter_user']; $id_name = $filter['id_name']; $event_type = $filter['event_type']; $severity = explode(',', $filter['severity']); @@ -113,6 +116,7 @@ if ($id) { $server_id = ($filter['server_id'] ?? ''); } else { $id_group = ''; + $private_filter = 0; $id_group_filter = ''; $id_name = ''; $event_type = ''; @@ -167,8 +171,8 @@ if ($update || $create) { $id_user_ack = get_parameter('id_user_ack', ''); $owner_user = get_parameter('owner_user', ''); $group_rep = get_parameter('group_rep', ''); - $date_from = get_parameter('date_from', ''); - $date_to = get_parameter('date_to', ''); + $date_from = get_parameter('date_from', '0000-00-00'); + $date_to = get_parameter('date_to', '0000-00-00'); $source = get_parameter('source'); $id_extra = get_parameter('id_extra'); $user_comment = get_parameter('user_comment'); @@ -192,6 +196,16 @@ if ($update || $create) { $server_id = implode(',', $servers_array); } + // Get private filter from user. + $private_filter = get_parameter_switch('private_filter_event', 0); + if ((int) $private_filter === 1 && $create) { + $private_filter_user = $_SESSION['id_usuario']; + } else if ((int) $private_filter === 1 && $update) { + $private_filter_user = ($private_filter_user === $_SESSION['id_usuario']) ? $private_filter_user : $_SESSION['id_usuario']; + } else if ((int) $private_filter === 0) { + $private_filter_user = null; + } + $values = [ 'id_name' => $id_name, 'id_group_filter' => $id_group_filter, @@ -222,6 +236,7 @@ if ($update || $create) { 'custom_data' => $custom_data, 'custom_data_filter_type' => $custom_data_filter_type, 'server_id' => $server_id, + 'private_filter_user' => $private_filter_user, ]; $severity = explode(',', $severity); @@ -293,6 +308,17 @@ $table->data[0][0] = html_print_label_input_block( false, '', 'w100p' + ).html_print_label_input_block( + __('Private event'), + html_print_checkbox_switch( + 'private_filter_event', + $private_filter, + $private_filter, + true, + false, + 'checked_slide_events(this);', + true + ) ) ); diff --git a/pandora_console/godmode/events/event_filter.php b/pandora_console/godmode/events/event_filter.php index 533bfe1190..0be93fa4a4 100644 --- a/pandora_console/godmode/events/event_filter.php +++ b/pandora_console/godmode/events/event_filter.php @@ -133,6 +133,18 @@ $filters = db_get_all_rows_sql($sql); if ($filters === false) { $filters = []; +} else { + foreach ($filters as $key => $filter) { + $permission = check_acl($config['id_user'], 0, 'PM'); + // Validate permission and private filter user. + if ($permission || $filter['private_filter_user'] === $config['id_user']) { + if ($filter['private_filter_user'] !== null) { + $filters[$key]['id_name'] = $filter['id_name'].' (P)'; + } + } else if ($filter['private_filter_user'] !== null) { + unset($filters[$key]); + } + } } $table = new stdClass(); diff --git a/pandora_console/include/ajax/events.php b/pandora_console/include/ajax/events.php index 571955fd25..b3a6be0670 100644 --- a/pandora_console/include/ajax/events.php +++ b/pandora_console/include/ajax/events.php @@ -337,6 +337,14 @@ if ($save_event_filter) { $values['custom_data'] = get_parameter('custom_data'); $values['custom_data_filter_type'] = get_parameter('custom_data_filter_type'); + // Get private filter from user. + $private_filter = get_parameter_switch('private_filter_user', 0); + if ((int) $private_filter === 1) { + $values['private_filter_user'] = $config['id_user']; + } else { + $values['private_filter_user'] = null; + } + if (is_metaconsole() === true) { $values['server_id'] = implode(',', get_parameter('server_id')); } @@ -397,6 +405,17 @@ if ($update_event_filter) { $values['custom_data'] = get_parameter('custom_data'); $values['custom_data_filter_type'] = get_parameter('custom_data_filter_type'); + // Get private filter from user. + $private_filter = get_parameter('private_filter_user', 0); + $user_private_filter = events_get_event_filter($id); + if ((int) $private_filter === 1 && $user_private_filter['private_filter_user'] === null) { + $values['private_filter_user'] = $config['id_user']; + } else if ($private_filter === $user_private_filter['private_filter_user'] && $user_private_filter['private_filter_user'] !== $config['id_user']) { + $values['private_filter_user'] = $user_private_filter['private_filter_user']; + } else { + $values['private_filter_user'] = null; + } + if (is_metaconsole() === true) { $values['server_id'] = implode(',', get_parameter('server_id')); } @@ -936,7 +955,8 @@ function save_new_filter() { "id_source_event": $("#text-id_source_event").val(), "server_id": $("#server_id").val(), "custom_data": $("#text-custom_data").val(), - "custom_data_filter_type": $("#custom_data_filter_type").val() + "custom_data_filter_type": $("#custom_data_filter_type").val(), + "private_filter_user": $("#checkbox-private_filter_event").val() }, function (data) { $("#info_box").hide(); @@ -1015,7 +1035,8 @@ function save_update_filter() { "id_source_event": $("#text-id_source_event").val(), "server_id": $("#server_id").val(), "custom_data": $("#text-custom_data").val(), - "custom_data_filter_type": $("#custom_data_filter_type").val() + "custom_data_filter_type": $("#custom_data_filter_type").val(), + "private_filter_user": $("#checkbox-private_filter_event").val() }, function (data) { diff --git a/pandora_console/include/functions_events.php b/pandora_console/include/functions_events.php index 49007aaca1..516f01d876 100644 --- a/pandora_console/include/functions_events.php +++ b/pandora_console/include/functions_events.php @@ -3343,7 +3343,7 @@ function events_get_event_filter_select($manage=true) } $sql = ' - SELECT id_filter, id_name + SELECT id_filter, id_name, private_filter_user FROM tevent_filter WHERE id_group_filter IN (0, '.implode(',', array_keys($user_groups)).')'; @@ -3354,7 +3354,20 @@ function events_get_event_filter_select($manage=true) } else { $result = []; foreach ($event_filters as $event_filter) { - $result[$event_filter['id_filter']] = $event_filter['id_name']; + $permission = check_acl($config['id_user'], 0, 'PM'); + if ($permission || $event_filter['private_filter_user'] === $config['id_user']) { + if ($event_filter['private_filter_user'] !== null) { + $filter_name = $event_filter['id_name'].' (P)'; + } else { + $filter_name = $event_filter['id_name']; + } + + $result[$event_filter['id_filter']] = $filter_name; + } + + if ($event_filter['private_filter_user'] === null) { + $result[$event_filter['id_filter']] = $event_filter['id_name']; + } } } diff --git a/pandora_console/operation/events/events.php b/pandora_console/operation/events/events.php index 0152fea782..fd5ab1a46c 100644 --- a/pandora_console/operation/events/events.php +++ b/pandora_console/operation/events/events.php @@ -196,6 +196,10 @@ $search_recursive_groups = get_parameter( 'filter[search_recursive_groups]', ($filter['search_recursive_groups'] ?? '') ); +$search_recursive_groups = get_parameter( + 'filter[private_filter_event]', + ($filter['private_filter_event'] ?? '') +); $id_group_filter = get_parameter( 'filter[id_group_filter]', ($filter['id_group'] ?? '') @@ -1322,6 +1326,7 @@ if ($loaded_filter !== false && $from_event_graph != 1 && isset($fb64) === false $filter_only_alert = $filter['filter_only_alert']; $search_secondary_groups = ($filter['search_secondary_groups'] ?? 0); + $private_filter_event = ($filter['private_filter_user'] ?? 0); $search_recursive_groups = ($filter['search_recursive_groups'] ?? 0); $id_group_filter = $filter['id_group_filter']; $date_from = $filter['date_from']; @@ -1938,6 +1943,25 @@ $in_sec_group .= ''; $in_sec_group .= ''; $in .= $in_sec_group; +// User private filter. +$data = html_print_checkbox_switch( + 'private_filter_event', + $private_filter_event, + $private_filter_event, + true, + false, + 'checked_slide_events(this);', + true +); + +$in_third_group = '
'; +$in_third_group .= $data; +$in_third_group .= ''; +$in_third_group .= '
'; +$in .= $in_third_group; + $in .= ''; $inputs[] = $in; From 74f2fa7a74549521cdb9faed1d3ac0f149648f51 Mon Sep 17 00:00:00 2001 From: Jorge Rincon Date: Wed, 9 Aug 2023 15:35:03 +0200 Subject: [PATCH 007/123] #10065 added private_filter_user field for new installations. --- pandora_console/pandoradb.sql | 1 + 1 file changed, 1 insertion(+) diff --git a/pandora_console/pandoradb.sql b/pandora_console/pandoradb.sql index cb5598f957..cf9265cfc8 100644 --- a/pandora_console/pandoradb.sql +++ b/pandora_console/pandoradb.sql @@ -1296,6 +1296,7 @@ CREATE TABLE IF NOT EXISTS `tevent_filter` ( `custom_data` VARCHAR(500) DEFAULT '', `custom_data_filter_type` TINYINT UNSIGNED DEFAULT 0, `owner_user` TEXT, + `private_filter_user` TEXT, PRIMARY KEY (`id_filter`) ) ENGINE=InnoDB DEFAULT CHARSET=UTF8MB4; From 85de06fbecbcb8de34fbb510da6c94bcd59cd415 Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Thu, 10 Aug 2023 11:36:50 +0200 Subject: [PATCH 008/123] #11807 new report vulnerability by category --- .../reporting_builder.item_editor.php | 14 +++--- .../godmode/reporting/reporting_builder.php | 2 + .../phpchartjs/src/Renderer/JavaScript.php | 43 +++++++++++++++++++ 3 files changed, 51 insertions(+), 8 deletions(-) diff --git a/pandora_console/godmode/reporting/reporting_builder.item_editor.php b/pandora_console/godmode/reporting/reporting_builder.item_editor.php index ea1db7aac8..6ecaf98f0d 100755 --- a/pandora_console/godmode/reporting/reporting_builder.item_editor.php +++ b/pandora_console/godmode/reporting/reporting_builder.item_editor.php @@ -200,12 +200,10 @@ $text_agent_module = ''; $only_data = false; -$categories_security_hardening = []; -if (security_hardening_installed() === true) { - $categories_security_hardening = categories_of_cis(); - foreach ($categories_security_hardening as $key => $cat) { - $categories_security_hardening[$key] = implode(' ', $cat); - } + +$categories_security_hardening = categories_of_cis(); +foreach ($categories_security_hardening as $key => $cat) { + $categories_security_hardening[$key] = implode(' ', $cat); } // Users. @@ -1037,7 +1035,7 @@ switch ($action) { $group = $item['id_group']; $recursion = $item['recursion']; $cat_selected = $item['cat_security_hardening']; - $ignore_skipped = ($item['ignore_skipped'] !== null) ? $item['ignore_skipped'] : true; + $ignore_skipped = $item['ignore_skipped']; break; default: @@ -3718,7 +3716,7 @@ $class = 'databox filters'; html_print_checkbox_switch( 'ignore_skipped', 1, - $ignore_skipped, + ($ignore_skipped !== null) ? $ignore_skipped : true, ); ?> diff --git a/pandora_console/godmode/reporting/reporting_builder.php b/pandora_console/godmode/reporting/reporting_builder.php index 5cc94049f7..1517de9fc1 100755 --- a/pandora_console/godmode/reporting/reporting_builder.php +++ b/pandora_console/godmode/reporting/reporting_builder.php @@ -1996,6 +1996,7 @@ switch ($action) { case 'vul_by_cat': $values['id_group'] = get_parameter('combo_group'); $values['cat_security_hardening'] = get_parameter('cat_security_hardening'); + $values['ignore_skipped'] = get_parameter('ignore_skipped'); $good_format = true; break; @@ -2884,6 +2885,7 @@ switch ($action) { case 'vul_by_cat': $values['id_group'] = get_parameter('combo_group'); $values['cat_security_hardening'] = get_parameter('cat_security_hardening'); + $values['ignore_skipped'] = get_parameter('ignore_skipped'); $good_format = true; break; diff --git a/pandora_console/vendor/artica/phpchartjs/src/Renderer/JavaScript.php b/pandora_console/vendor/artica/phpchartjs/src/Renderer/JavaScript.php index 100276743f..b1fcb1bb9f 100644 --- a/pandora_console/vendor/artica/phpchartjs/src/Renderer/JavaScript.php +++ b/pandora_console/vendor/artica/phpchartjs/src/Renderer/JavaScript.php @@ -32,6 +32,49 @@ class JavaScript extends Renderer if (empty($this->chart->defaults()->getWatermark()) === false) { $script[] = 'const chart_watermark_'.$this->chart->getId().' = { id: "chart_watermark_'.$this->chart->getId().'", + beforeDraw: (chart) => { + if (Object.prototype.hasOwnProperty.call(chart, "config") && + Object.prototype.hasOwnProperty.call(chart.config.options, "elements") && + Object.prototype.hasOwnProperty.call(chart.config.options.elements, "center")) + { + var ctx = chart.ctx; + + ctx.save(); + + var centerConfig = chart.config.options.elements.center; + var txt = centerConfig.text; + var color = centerConfig.color || "#000"; + ctx.textAlign = "center"; + ctx.textBaseline = "middle"; + var centerX = (chart.chartArea.left + chart.chartArea.right) / 2; + var centerY = (chart.chartArea.top + chart.chartArea.bottom) / 2; + + var outerRadius = Math.min(ctx.canvas.width, ctx.canvas.height) / 2; + + var padding = 20; + + var innerRadius = outerRadius - padding; + + ctx.font = "30px "; + var sidePaddingCalculated = (92/100) * (innerRadius * 2) + + var stringWidth = ctx.measureText(txt).width; + var elementWidth = (innerRadius * 2) - sidePaddingCalculated; + + var widthRatio = elementWidth / stringWidth; + var newFontSize = Math.floor(30 * widthRatio); + var elementHeight = (innerRadius * 2); + + var fontSizeToUse = Math.min(newFontSize, elementHeight); + + ctx.font = fontSizeToUse + "px Lato, sans-serif"; + ctx.fillStyle = color; + + ctx.fillText(txt, centerX, centerY); + + ctx.restore(); + } + }, afterDraw: (chart) => { const image = new Image(); image.src = "'.$this->chart->defaults()->getWatermark()->getSrc().'"; From abb173c1a7af425fe6830e3dcb8ed55d5a471405 Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Fri, 18 Aug 2023 10:27:55 +0200 Subject: [PATCH 009/123] #11807 new report top checks more frequent --- .../reporting_builder.item_editor.php | 11 +++++ .../godmode/reporting/reporting_builder.php | 12 +++++ .../include/functions_reporting.php | 7 +++ .../include/functions_reporting_html.php | 49 ++++++++++++++++++- pandora_console/include/functions_reports.php | 5 ++ 5 files changed, 83 insertions(+), 1 deletion(-) diff --git a/pandora_console/godmode/reporting/reporting_builder.item_editor.php b/pandora_console/godmode/reporting/reporting_builder.item_editor.php index 6ecaf98f0d..efd9da896c 100755 --- a/pandora_console/godmode/reporting/reporting_builder.item_editor.php +++ b/pandora_console/godmode/reporting/reporting_builder.item_editor.php @@ -1031,6 +1031,12 @@ switch ($action) { $top_n_value = (empty($item['top_n_value']) === true) ? 10 : $item['top_n_value']; break; + case 'top_n_checks_failed': + $group = $item['id_group']; + $recursion = $item['recursion']; + $top_n_value = (empty($item['top_n_value']) === true) ? 10 : $item['top_n_value']; + break; + case 'vul_by_cat': $group = $item['id_group']; $recursion = $item['recursion']; @@ -7473,6 +7479,11 @@ function chooseType() { $("#row_max_items").show(); break; + case 'top_n_checks_failed': + $("#row_group").show(); + $("#row_max_items").show(); + break; + case 'vul_by_cat': $("#row_group").show(); $("#row_cat_security_hardening").show(); diff --git a/pandora_console/godmode/reporting/reporting_builder.php b/pandora_console/godmode/reporting/reporting_builder.php index 1517de9fc1..7ac62c9c45 100755 --- a/pandora_console/godmode/reporting/reporting_builder.php +++ b/pandora_console/godmode/reporting/reporting_builder.php @@ -1993,6 +1993,12 @@ switch ($action) { $good_format = true; break; + case 'top_n_checks_failed': + $values['id_group'] = get_parameter('combo_group'); + $values['top_n_value'] = get_parameter('max_items'); + $good_format = true; + break; + case 'vul_by_cat': $values['id_group'] = get_parameter('combo_group'); $values['cat_security_hardening'] = get_parameter('cat_security_hardening'); @@ -2882,6 +2888,12 @@ switch ($action) { $good_format = true; break; + case 'top_n_checks_failed': + $values['id_group'] = get_parameter('combo_group'); + $values['top_n_value'] = get_parameter('max_items'); + $good_format = true; + break; + case 'vul_by_cat': $values['id_group'] = get_parameter('combo_group'); $values['cat_security_hardening'] = get_parameter('cat_security_hardening'); diff --git a/pandora_console/include/functions_reporting.php b/pandora_console/include/functions_reporting.php index 6561fe9389..b61b005e2d 100755 --- a/pandora_console/include/functions_reporting.php +++ b/pandora_console/include/functions_reporting.php @@ -942,6 +942,13 @@ function reporting_make_reporting_data( ); break; + case 'top_n_checks_failed': + $report['contents'][] = reporting_top_n_checks_failed( + $report, + $content + ); + break; + case 'vul_by_cat': $report['contents'][] = reporting_vul_by_categories( $report, diff --git a/pandora_console/include/functions_reporting_html.php b/pandora_console/include/functions_reporting_html.php index bf144cd518..d532061d80 100644 --- a/pandora_console/include/functions_reporting_html.php +++ b/pandora_console/include/functions_reporting_html.php @@ -468,6 +468,10 @@ function reporting_html_print_report($report, $mini=false, $report_info=1) reporting_html_top_n_agents_sh($table, $item); break; + case 'top_n_checks_failed': + reporting_html_top_n_checks_failed($table, $item); + break; + case 'vul_by_cat': reporting_vul_by_cat_graph($table, $item); break; @@ -486,18 +490,61 @@ function reporting_html_print_report($report, $mini=false, $report_info=1) } +/** + * Function to print HTML top checks failed. + * + * @param object $table Head table or false if it comes from pdf. + * @param array $item Items data. + * + * @return void + */ +function reporting_html_top_n_checks_failed($table, $item) +{ + global $config; + $table->rowclass[0] = ''; + $table->data[1][0] = ''.__('Id').''; + $table->data[1][1] = ''.__('Title').''; + $table->data[1][2] = ''.__('Total Failed').''; + + $row = 2; + foreach ($item['data'] as $key => $check) { + $table->data[$row][0] = $check['id']; + $table->data[$row][1] = $check['title']; + $table->data[$row][2] = $check['total']; + $row++; + } +} + + +/** + * Function to print HTML top categories in graph. + * + * @param object $table Head table or false if it comes from pdf. + * @param array $item Items data. + * + * @return void + */ function reporting_vul_by_cat_graph($table, $item) { + $table->rowclass[0] = ''; $table->colspan['chart']['cell'] = 3; $table->cellstyle['chart']['cell'] = 'text-align: center;'; $table->data['chart']['cell'] = $item['chart']; } +/** + * Function to print HTML top n agents from security hardening. + * + * @param object $table Head table or false if it comes from pdf. + * @param array $item Items data. + * + * @return void + */ function reporting_html_top_n_agents_sh($table, $item) { global $config; - + $table->rowclass[0] = ''; $table->data[1][0] = ''.__('Agent').''; $table->data[1][1] = ''.__('Last audit scan').''; $table->data[1][2] = ''.__('Score').''; diff --git a/pandora_console/include/functions_reports.php b/pandora_console/include/functions_reports.php index fca253153e..f4f1f6499e 100755 --- a/pandora_console/include/functions_reports.php +++ b/pandora_console/include/functions_reports.php @@ -969,6 +969,11 @@ function reports_get_report_types($template=false, $not_editor=false) 'name' => __('Top-N agents with the worst score'), ]; + $types['top_n_checks_failed'] = [ + 'optgroup' => __('Security hardening'), + 'name' => __('Top-N most frequent failed checks'), + ]; + $types['vul_by_cat'] = [ 'optgroup' => __('Security hardening'), 'name' => __('Vulnerabilities by category'), From 76b3e1da4a02e93b77932e0ebda1e102ff65ab7f Mon Sep 17 00:00:00 2001 From: Jorge Rincon Date: Mon, 21 Aug 2023 13:29:58 +0200 Subject: [PATCH 010/123] #10065 Fixed query that adds private_filter_user field in the database --- pandora_console/extras/mr/66.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/extras/mr/66.sql b/pandora_console/extras/mr/66.sql index 0251ea70cc..d3fe3a7c70 100644 --- a/pandora_console/extras/mr/66.sql +++ b/pandora_console/extras/mr/66.sql @@ -1,6 +1,6 @@ START TRANSACTION; -ALTER TABLE tevent_filter ADD private_filter_user text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL; +ALTER TABLE tevent_filter ADD private_filter_user text NULL; UPDATE `twelcome_tip` SET title = 'Scheduled downtimes', From dd453507d23b7a8056b506338525269ace2fd1dd Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Tue, 22 Aug 2023 09:53:35 +0200 Subject: [PATCH 011/123] #11807 new report top n failed by checks --- .../reporting_builder.item_editor.php | 11 +++++++ .../godmode/reporting/reporting_builder.php | 12 ++++++++ .../include/functions_reporting.php | 7 +++++ .../include/functions_reporting_html.php | 30 +++++++++++++++++++ pandora_console/include/functions_reports.php | 5 ++++ 5 files changed, 65 insertions(+) diff --git a/pandora_console/godmode/reporting/reporting_builder.item_editor.php b/pandora_console/godmode/reporting/reporting_builder.item_editor.php index efd9da896c..1aeaa8a1a6 100755 --- a/pandora_console/godmode/reporting/reporting_builder.item_editor.php +++ b/pandora_console/godmode/reporting/reporting_builder.item_editor.php @@ -1037,6 +1037,12 @@ switch ($action) { $top_n_value = (empty($item['top_n_value']) === true) ? 10 : $item['top_n_value']; break; + case 'top_n_categories_checks': + $group = $item['id_group']; + $recursion = $item['recursion']; + $top_n_value = (empty($item['top_n_value']) === true) ? 10 : $item['top_n_value']; + break; + case 'vul_by_cat': $group = $item['id_group']; $recursion = $item['recursion']; @@ -7484,6 +7490,11 @@ function chooseType() { $("#row_max_items").show(); break; + case 'top_n_categories_checks': + $("#row_group").show(); + $("#row_max_items").show(); + break; + case 'vul_by_cat': $("#row_group").show(); $("#row_cat_security_hardening").show(); diff --git a/pandora_console/godmode/reporting/reporting_builder.php b/pandora_console/godmode/reporting/reporting_builder.php index 8b5cea5236..48805131d7 100755 --- a/pandora_console/godmode/reporting/reporting_builder.php +++ b/pandora_console/godmode/reporting/reporting_builder.php @@ -2002,6 +2002,12 @@ switch ($action) { $good_format = true; break; + case 'top_n_categories_checks': + $values['id_group'] = get_parameter('combo_group'); + $values['top_n_value'] = get_parameter('max_items'); + $good_format = true; + break; + case 'vul_by_cat': $values['id_group'] = get_parameter('combo_group'); $values['cat_security_hardening'] = get_parameter('cat_security_hardening'); @@ -2897,6 +2903,12 @@ switch ($action) { $good_format = true; break; + case 'top_n_categories_checks': + $values['id_group'] = get_parameter('combo_group'); + $values['top_n_value'] = get_parameter('max_items'); + $good_format = true; + break; + case 'vul_by_cat': $values['id_group'] = get_parameter('combo_group'); $values['cat_security_hardening'] = get_parameter('cat_security_hardening'); diff --git a/pandora_console/include/functions_reporting.php b/pandora_console/include/functions_reporting.php index b61b005e2d..67c12f73a7 100755 --- a/pandora_console/include/functions_reporting.php +++ b/pandora_console/include/functions_reporting.php @@ -949,6 +949,13 @@ function reporting_make_reporting_data( ); break; + case 'top_n_categories_checks': + $report['contents'][] = reporting_top_n_categories_checks( + $report, + $content + ); + break; + case 'vul_by_cat': $report['contents'][] = reporting_vul_by_categories( $report, diff --git a/pandora_console/include/functions_reporting_html.php b/pandora_console/include/functions_reporting_html.php index d532061d80..887c3d5fcb 100644 --- a/pandora_console/include/functions_reporting_html.php +++ b/pandora_console/include/functions_reporting_html.php @@ -472,6 +472,10 @@ function reporting_html_print_report($report, $mini=false, $report_info=1) reporting_html_top_n_checks_failed($table, $item); break; + case 'top_n_categories_checks': + reporting_html_top_n_categories_checks($table, $item); + break; + case 'vul_by_cat': reporting_vul_by_cat_graph($table, $item); break; @@ -490,6 +494,32 @@ function reporting_html_print_report($report, $mini=false, $report_info=1) } +/** + * Function to print HTML top checks failed by category + * + * @param object $table Head table or false if it comes from pdf. + * @param array $item Items data. + * + * @return void + */ +function reporting_html_top_n_categories_checks($table, $item) +{ + global $config; + $table->rowclass[0] = ''; + $table->data[1][0] = ''.__('Id').''; + $table->data[1][1] = ''.__('Category').''; + $table->data[1][2] = ''.__('Total Failed').''; + + $row = 2; + foreach ($item['data'] as $key => $check) { + $table->data[$row][0] = $check['id']; + $table->data[$row][1] = $check['category']; + $table->data[$row][2] = $check['total']; + $row++; + } +} + + /** * Function to print HTML top checks failed. * diff --git a/pandora_console/include/functions_reports.php b/pandora_console/include/functions_reports.php index f4f1f6499e..9e26be5998 100755 --- a/pandora_console/include/functions_reports.php +++ b/pandora_console/include/functions_reports.php @@ -974,6 +974,11 @@ function reports_get_report_types($template=false, $not_editor=false) 'name' => __('Top-N most frequent failed checks'), ]; + $types['top_n_categories_checks'] = [ + 'optgroup' => __('Security hardening'), + 'name' => __('Top-N checks failed by category'), + ]; + $types['vul_by_cat'] = [ 'optgroup' => __('Security hardening'), 'name' => __('Vulnerabilities by category'), From 61839db7ffe79243e1e22c9f1ca6aef9893e8a47 Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Tue, 22 Aug 2023 16:28:01 +0200 Subject: [PATCH 012/123] #11807 new report list of checks agent --- pandora_console/extras/mr/66.sql | 2 + .../reporting_builder.item_editor.php | 38 +++++++++++++++++++ .../godmode/reporting/reporting_builder.php | 14 +++++++ .../include/functions_reporting.php | 7 ++++ .../include/functions_reporting_html.php | 33 +++++++++++++++- pandora_console/include/functions_reports.php | 5 +++ pandora_console/pandoradb.sql | 1 + 7 files changed, 99 insertions(+), 1 deletion(-) diff --git a/pandora_console/extras/mr/66.sql b/pandora_console/extras/mr/66.sql index 466909a617..4f92b5e659 100644 --- a/pandora_console/extras/mr/66.sql +++ b/pandora_console/extras/mr/66.sql @@ -4,6 +4,8 @@ ALTER TABLE `treport_content` ADD COLUMN `cat_security_hardening` INT NOT NULL ALTER TABLE `treport_content` ADD COLUMN `ignore_skipped` INT NOT NULL DEFAULT 0; +ALTER TABLE `treport_content` ADD COLUMN `status_of_check` TINYTEXT; + UPDATE `twelcome_tip` SET title = 'Scheduled downtimes', url = 'https://pandorafms.com/manual/en/documentation/04_using/11_managing_and_administration#scheduled_downtimes' diff --git a/pandora_console/godmode/reporting/reporting_builder.item_editor.php b/pandora_console/godmode/reporting/reporting_builder.item_editor.php index 1aeaa8a1a6..841874e3eb 100755 --- a/pandora_console/godmode/reporting/reporting_builder.item_editor.php +++ b/pandora_console/godmode/reporting/reporting_builder.item_editor.php @@ -1050,6 +1050,14 @@ switch ($action) { $ignore_skipped = $item['ignore_skipped']; break; + case 'list_checks': + $group = $item['id_group']; + $recursion = $item['recursion']; + $cat_selected = $item['cat_security_hardening']; + $status_of_check = $item['status_of_check']; + $idAgent = $item['id_agent']; + break; + default: // It's not possible. break; @@ -3751,6 +3759,28 @@ $class = 'databox filters'; + + + + + + __('All'), + 'PASS' => __('Passed'), + 'FAIL' => __('Failed'), + 'INVALID' => __('Skipped'), + ], + 'status_of_check', + $status_of_check, + ); + ?> + + + @@ -6625,6 +6655,7 @@ function chooseType() { $("#row_use_prefix_notation").hide(); $("#row_cat_security_hardening").hide(); $("#row_ignore_skipped").hide(); + $("#row_status_check").hide(); // SLA list default state. $("#sla_list").hide(); @@ -7500,6 +7531,13 @@ function chooseType() { $("#row_cat_security_hardening").show(); $("#row_ignore_skipped").show(); break; + + case 'list_checks': + $("#row_group").show(); + $("#row_agent").show(); + $("#row_cat_security_hardening").show(); + $("#row_status_check").show(); + break; } switch (type) { diff --git a/pandora_console/godmode/reporting/reporting_builder.php b/pandora_console/godmode/reporting/reporting_builder.php index 48805131d7..1102aabdfc 100755 --- a/pandora_console/godmode/reporting/reporting_builder.php +++ b/pandora_console/godmode/reporting/reporting_builder.php @@ -2015,6 +2015,13 @@ switch ($action) { $good_format = true; break; + case 'list_checks': + $values['id_group'] = get_parameter('combo_group'); + $values['cat_security_hardening'] = get_parameter('cat_security_hardening'); + $values['status_of_check'] = get_parameter('status_of_check'); + $good_format = true; + break; + default: $values['period'] = get_parameter('period'); $values['top_n'] = get_parameter( @@ -2916,6 +2923,13 @@ switch ($action) { $good_format = true; break; + case 'list_checks': + $values['id_group'] = get_parameter('combo_group'); + $values['cat_security_hardening'] = get_parameter('cat_security_hardening'); + $values['status_of_check'] = get_parameter('status_of_check'); + $good_format = true; + break; + default: $values['period'] = get_parameter('period'); $values['top_n'] = get_parameter( diff --git a/pandora_console/include/functions_reporting.php b/pandora_console/include/functions_reporting.php index 67c12f73a7..1603183b65 100755 --- a/pandora_console/include/functions_reporting.php +++ b/pandora_console/include/functions_reporting.php @@ -963,6 +963,13 @@ function reporting_make_reporting_data( ); break; + case 'list_checks': + $report['contents'][] = reporting_list_checks( + $report, + $content + ); + break; + default: // Default. break; diff --git a/pandora_console/include/functions_reporting_html.php b/pandora_console/include/functions_reporting_html.php index 887c3d5fcb..c9c4da53fb 100644 --- a/pandora_console/include/functions_reporting_html.php +++ b/pandora_console/include/functions_reporting_html.php @@ -479,6 +479,10 @@ function reporting_html_print_report($report, $mini=false, $report_info=1) case 'vul_by_cat': reporting_vul_by_cat_graph($table, $item); break; + + case 'list_checks': + reporting_html_list_checks($table, $item); + break; } if ($item['type'] == 'agent_module') { @@ -494,6 +498,34 @@ function reporting_html_print_report($report, $mini=false, $report_info=1) } +/** + * Function to print HTML checks filtered by agent and category. + * + * @param object $table Head table or false if it comes from pdf. + * @param array $item Items data. + * + * @return void + */ +function reporting_html_list_checks($table, $item) +{ + $table->rowclass[0] = ''; + $table->colspan[0][1] = 3; + $table->data[1][0] = ''.__('Id').''; + $table->data[1][1] = ''.__('Title').''; + $table->data[1][2] = ''.__('Category').''; + $table->data[1][3] = ''.__('Status').''; + + $row = 2; + foreach ($item['data'] as $key => $check) { + $table->data[$row][0] = $check['id']; + $table->data[$row][1] = $check['title']; + $table->data[$row][2] = $check['category']; + $table->data[$row][3] = $check['status']; + $row++; + } +} + + /** * Function to print HTML top checks failed by category * @@ -504,7 +536,6 @@ function reporting_html_print_report($report, $mini=false, $report_info=1) */ function reporting_html_top_n_categories_checks($table, $item) { - global $config; $table->rowclass[0] = ''; $table->data[1][0] = ''.__('Id').''; $table->data[1][1] = ''.__('Category').''; diff --git a/pandora_console/include/functions_reports.php b/pandora_console/include/functions_reports.php index 9e26be5998..f574beb3bf 100755 --- a/pandora_console/include/functions_reports.php +++ b/pandora_console/include/functions_reports.php @@ -983,6 +983,11 @@ function reports_get_report_types($template=false, $not_editor=false) 'optgroup' => __('Security hardening'), 'name' => __('Vulnerabilities by category'), ]; + + $types['list_checks'] = [ + 'optgroup' => __('Security hardening'), + 'name' => __('List of checks'), + ]; } return $types; diff --git a/pandora_console/pandoradb.sql b/pandora_console/pandoradb.sql index 5164d2ed21..d1fb4e4f1f 100644 --- a/pandora_console/pandoradb.sql +++ b/pandora_console/pandoradb.sql @@ -1674,6 +1674,7 @@ CREATE TABLE IF NOT EXISTS `treport_content` ( `use_prefix_notation` TINYINT UNSIGNED NOT NULL DEFAULT 1, `cat_security_hardening` INT NOT NULL DEFAULT 0, `ignore_skipped` INT NOT NULL DEFAULT 0, + `status_of_check` TINYTEXT, PRIMARY KEY(`id_rc`), FOREIGN KEY (`id_report`) REFERENCES treport(`id_report`) ON UPDATE CASCADE ON DELETE CASCADE From ae288e3dd4e1a6420c6b11c9dd391981419dc797 Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Thu, 24 Aug 2023 09:24:31 +0200 Subject: [PATCH 013/123] #11807 added new report scoring --- .../reporting_builder.item_editor.php | 9 +++++ .../godmode/reporting/reporting_builder.php | 10 +++++ .../include/functions_reporting.php | 7 ++++ .../include/functions_reporting_html.php | 39 ++++++++++++++++++- pandora_console/include/functions_reports.php | 5 +++ 5 files changed, 69 insertions(+), 1 deletion(-) diff --git a/pandora_console/godmode/reporting/reporting_builder.item_editor.php b/pandora_console/godmode/reporting/reporting_builder.item_editor.php index 841874e3eb..99fedcb308 100755 --- a/pandora_console/godmode/reporting/reporting_builder.item_editor.php +++ b/pandora_console/godmode/reporting/reporting_builder.item_editor.php @@ -1058,6 +1058,11 @@ switch ($action) { $idAgent = $item['id_agent']; break; + case 'scoring': + $group = $item['id_group']; + $recursion = $item['recursion']; + break; + default: // It's not possible. break; @@ -7538,6 +7543,10 @@ function chooseType() { $("#row_cat_security_hardening").show(); $("#row_status_check").show(); break; + + case 'scoring': + $("#row_group").show(); + break; } switch (type) { diff --git a/pandora_console/godmode/reporting/reporting_builder.php b/pandora_console/godmode/reporting/reporting_builder.php index 1102aabdfc..8901b68ecd 100755 --- a/pandora_console/godmode/reporting/reporting_builder.php +++ b/pandora_console/godmode/reporting/reporting_builder.php @@ -2022,6 +2022,11 @@ switch ($action) { $good_format = true; break; + case 'scoring': + $values['id_group'] = get_parameter('combo_group'); + $good_format = true; + break; + default: $values['period'] = get_parameter('period'); $values['top_n'] = get_parameter( @@ -2930,6 +2935,11 @@ switch ($action) { $good_format = true; break; + case 'scoring': + $values['id_group'] = get_parameter('combo_group'); + $good_format = true; + break; + default: $values['period'] = get_parameter('period'); $values['top_n'] = get_parameter( diff --git a/pandora_console/include/functions_reporting.php b/pandora_console/include/functions_reporting.php index 1603183b65..782d756e4c 100755 --- a/pandora_console/include/functions_reporting.php +++ b/pandora_console/include/functions_reporting.php @@ -970,6 +970,13 @@ function reporting_make_reporting_data( ); break; + case 'scoring': + $report['contents'][] = reporting_scoring( + $report, + $content + ); + break; + default: // Default. break; diff --git a/pandora_console/include/functions_reporting_html.php b/pandora_console/include/functions_reporting_html.php index c9c4da53fb..d976b96951 100644 --- a/pandora_console/include/functions_reporting_html.php +++ b/pandora_console/include/functions_reporting_html.php @@ -483,6 +483,10 @@ function reporting_html_print_report($report, $mini=false, $report_info=1) case 'list_checks': reporting_html_list_checks($table, $item); break; + + case 'scoring': + reporting_html_scoring($table, $item); + break; } if ($item['type'] == 'agent_module') { @@ -498,6 +502,38 @@ function reporting_html_print_report($report, $mini=false, $report_info=1) } +/** + * Function to print the agents scoring. + * + * @param object $table Head table or false if it comes from pdf. + * @param array $item Items data. + * + * @return void + */ +function reporting_html_scoring($table, $item) +{ + global $config; + + $table1 = new stdClass(); + $table1->width = '100%'; + $table1->class = 'databox filters'; + $table1->styleTable = 'border: 0px;'; + $table1->data[0][0] = ''.__('Date').''; + $table1->data[0][1] = ''.__('Agent').''; + $table1->data[0][2] = ''.__('Score').''; + $row = 1; + foreach ($item['data'] as $key => $check) { + $table1->data[$row][1] = date($config['date_format'], $check['date']); + $table1->data[$row][2] = $check['agent']; + $table1->data[$row][3] = $check['scoring'].' %'; + $row++; + } + + $table->colspan[2][0] = 3; + $table->data[2][0] = html_print_table($table1, true); +} + + /** * Function to print HTML checks filtered by agent and category. * @@ -509,7 +545,8 @@ function reporting_html_print_report($report, $mini=false, $report_info=1) function reporting_html_list_checks($table, $item) { $table->rowclass[0] = ''; - $table->colspan[0][1] = 3; + $table->colspan[0][1] = 2; + $table->align[3] = 'center'; $table->data[1][0] = ''.__('Id').''; $table->data[1][1] = ''.__('Title').''; $table->data[1][2] = ''.__('Category').''; diff --git a/pandora_console/include/functions_reports.php b/pandora_console/include/functions_reports.php index f574beb3bf..6fa873b72a 100755 --- a/pandora_console/include/functions_reports.php +++ b/pandora_console/include/functions_reports.php @@ -988,6 +988,11 @@ function reports_get_report_types($template=false, $not_editor=false) 'optgroup' => __('Security hardening'), 'name' => __('List of checks'), ]; + + $types['scoring'] = [ + 'optgroup' => __('Security hardening'), + 'name' => __('Scoring'), + ]; } return $types; From 797b24af86a515a7f79c9dccf31ab4d83b24c96a Mon Sep 17 00:00:00 2001 From: Jorge Rincon Date: Mon, 28 Aug 2023 13:54:35 +0200 Subject: [PATCH 014/123] #10065 Added switch to filter create/edit modal. --- .../godmode/events/event_edit_filter.php | 2 +- .../godmode/events/event_filter.php | 2 +- pandora_console/include/ajax/events.php | 58 +++++++++++++++---- pandora_console/operation/events/events.php | 27 +++------ 4 files changed, 57 insertions(+), 32 deletions(-) diff --git a/pandora_console/godmode/events/event_edit_filter.php b/pandora_console/godmode/events/event_edit_filter.php index aaf5d00b9b..113c156df3 100644 --- a/pandora_console/godmode/events/event_edit_filter.php +++ b/pandora_console/godmode/events/event_edit_filter.php @@ -309,7 +309,7 @@ $table->data[0][0] = html_print_label_input_block( '', 'w100p' ).html_print_label_input_block( - __('Private event'), + __('Private'), html_print_checkbox_switch( 'private_filter_event', $private_filter, diff --git a/pandora_console/godmode/events/event_filter.php b/pandora_console/godmode/events/event_filter.php index 0be93fa4a4..c4f1860e6f 100644 --- a/pandora_console/godmode/events/event_filter.php +++ b/pandora_console/godmode/events/event_filter.php @@ -135,7 +135,7 @@ if ($filters === false) { $filters = []; } else { foreach ($filters as $key => $filter) { - $permission = check_acl($config['id_user'], 0, 'PM'); + $permission = users_is_admin($config['id_user']); // Validate permission and private filter user. if ($permission || $filter['private_filter_user'] === $config['id_user']) { if ($filter['private_filter_user'] !== null) { diff --git a/pandora_console/include/ajax/events.php b/pandora_console/include/ajax/events.php index b3a6be0670..dbab927606 100644 --- a/pandora_console/include/ajax/events.php +++ b/pandora_console/include/ajax/events.php @@ -92,6 +92,9 @@ $get_id_source_event = get_parameter('get_id_source_event'); $node_id = (int) get_parameter('node_id', 0); $settings_modal = get_parameter('settings', 0); $parameters_modal = get_parameter('parameters', 0); +// User private filter. +$current_filter = get_parameter('current_filter', 0); +$private_filter_event = get_parameter('private_filter_event', 0); if ($get_comments === true) { global $config; @@ -731,8 +734,8 @@ if ($save_filter_modal) { $table = new StdClass; $table->id = 'save_filter_form'; $table->width = '100%'; - $table->cellspacing = 4; - $table->cellpadding = 4; + $table->cellspacing = 5; + $table->cellpadding = 5; $table->class = 'databox'; if (is_metaconsole() === true) { $table->class = 'databox filters'; @@ -751,7 +754,7 @@ if ($save_filter_modal) { 'filter_mode', 'new', __('New filter'), - true, + ((int) $current_filter === 0) ? true : false, true ); @@ -759,7 +762,7 @@ if ($save_filter_modal) { 'filter_mode', 'update', __('Update filter'), - false, + ((int) $current_filter > 0) ? true : false, true ); @@ -774,6 +777,7 @@ if ($save_filter_modal) { $table->rowclass[2] = 'flex'; $table->rowclass[3] = 'flex'; $table->rowclass[4] = 'flex'; + $table->rowclass[5] = 'flex'; $data[0] = ''.__('Filter name').''.$jump; $data[0] .= html_print_input_text('id_name', '', '', 15, 255, true); if (is_metaconsole()) { @@ -820,9 +824,9 @@ if ($save_filter_modal) { $data[0] .= html_print_select( $_filters_update, 'overwrite_filter', + $current_filter, '', - '', - '', + __('None'), 0, true, false, @@ -833,6 +837,31 @@ if ($save_filter_modal) { $table->data[] = $data; $table->rowclass[] = ''; + $data = []; + $table->rowid[4] = 'update_filter_row2'; + + $table->data[] = $data; + $table->rowclass[] = ''; + + // Update user private filter. + $data = []; + $table->rowid[6] = 'private_filter_event_row1'; + $data[0] = html_print_label_input_block( + __('Private'), + html_print_checkbox_switch( + 'private_filter_event', + $private_filter_event, + $private_filter_event, + true, + false, + 'checked_slide_events(this);', + true + ) + ); + + $table->data[] = $data; + $table->rowclass[] = ''; + html_print_table($table); html_print_div( @@ -877,10 +906,19 @@ if ($save_filter_modal) { ?> From da35e8e346d7fe99b8eea832bd2201c0074dd36d Mon Sep 17 00:00:00 2001 From: Calvo Date: Tue, 5 Sep 2023 13:13:16 +0200 Subject: [PATCH 029/123] Fix group report metaconsole --- .../include/functions_reporting_html.php | 204 +++++++++++++----- 1 file changed, 154 insertions(+), 50 deletions(-) diff --git a/pandora_console/include/functions_reporting_html.php b/pandora_console/include/functions_reporting_html.php index eb7c555fb9..588b9d44f4 100644 --- a/pandora_console/include/functions_reporting_html.php +++ b/pandora_console/include/functions_reporting_html.php @@ -26,6 +26,7 @@ * GNU General Public License for more details. * ============================================================================ */ +use PandoraFMS\Enterprise\Metaconsole\Node; require_once $config['homedir'].'/include/functions.php'; require_once $config['homedir'].'/include/functions_db.php'; @@ -2582,16 +2583,72 @@ function reporting_html_group_report($table, $item, $pdf=0) $table->colspan['group_report']['cell'] = 3; $table->cellstyle['group_report']['cell'] = 'text-align: center;'; $metaconsole_connected = false; - if (is_metaconsole() === true) { + if (is_metaconsole() === true && $item['server_name'] != '0') { $connection = metaconsole_get_connection($item['server_name']); if (metaconsole_connect($connection) == NOERR) { $metaconsole_connected = true; } } + if (is_metaconsole() && $item['server_name'] === '0') { + $table_agent = 'tmetaconsole_agent'; + } else { + $table_agent = 'tagente'; + } + + $all_group_id = []; + $group_events = []; + $group_os = []; + if ($item['subtitle'] === 'All') { + if (is_metaconsole() === true && $item['server_name'] === 'all') { + $nodes = metaconsole_get_connections(); + foreach ($nodes as $node) { + try { + $nd = new Node($node['id']); + $nd->connect(); + + $all_group_id_node = db_get_all_rows_sql('SELECT id_grupo FROM tgrupo'); + + $group_events_node = db_get_all_rows_sql( + 'SELECT COUNT(te.id_evento) as count_events, ta.alias + FROM tevento as te + INNER JOIN tagente as ta ON te.id_agente = ta.id_agente + GROUP BY te.id_agente' + ); + $group_os_node = db_get_all_rows_sql( + 'SELECT COUNT(os.name) as count_os, os.name as name_os, ta.id_grupo + FROM tconfig_os as os + INNER JOIN tagente as ta ON ta.id_os = os.id_os GROUP by os.name' + ); + + $all_group_id = array_merge($all_group_id, $all_group_id_node); + $group_events = array_merge($group_events, $group_events_node); + $group_os = array_merge($group_os, $group_os_node); + } catch (\Exception $e) { + $nd->disconnect(); + $modules_regex_node = []; + } finally { + $nd->disconnect(); + } + } + } else { + $all_group_id = db_get_all_rows_sql('SELECT id_grupo FROM tgrupo'); + + $group_events = db_get_all_rows_sql( + 'SELECT COUNT(te.id_evento) as count_events, ta.alias + FROM tevento as te + INNER JOIN '.$table_agent.' as ta ON te.id_agente = ta.id_agente + GROUP BY te.id_agente' + ); + $group_os = db_get_all_rows_sql( + 'SELECT COUNT(os.name) as count_os, os.name as name_os, ta.id_grupo + FROM tconfig_os as os + INNER JOIN '.$table_agent.' as ta ON ta.id_os = os.id_os GROUP by os.name' + ); + } + $group_id = []; - $all_group_id = db_get_all_rows_sql('SELECT id_grupo FROM tgrupo'); foreach ($all_group_id as $group) { $group_id[] = $group['id_grupo']; @@ -2599,61 +2656,108 @@ function reporting_html_group_report($table, $item, $pdf=0) $description = __('Data view of all groups'); $icon = ''; - - $group_events = db_get_all_rows_sql( - 'SELECT COUNT(te.id_evento) as count_events, ta.alias - FROM tevento as te - INNER JOIN tagente as ta ON te.id_agente = ta.id_agente - GROUP BY te.id_agente' - ); - - $group_os = db_get_all_rows_sql( - 'SELECT COUNT(os.name) as count_os, os.name as name_os, ta.id_grupo - FROM tconfig_os as os - INNER JOIN tagente as ta ON ta.id_os = os.id_os GROUP by os.name' - ); } else { $group_id = db_get_value('id_grupo', 'tgrupo', 'nombre', $item['subtitle']); - $description = db_get_value('description', 'tgrupo', 'id_grupo', $group_id); - $icon_url = db_get_value('icon', 'tgrupo', 'id_grupo', $group_id); - $icon = html_print_image( - 'images/'.$icon_url, - true, - [ - 'title' => $item['subtitle'], - 'class' => 'main_menu_icon invert_filter', - ] - ); - $childrens = db_get_all_rows_sql('SELECT id_grupo FROM tgrupo WHERE parent = '.$group_id); - $total_agents = db_get_all_rows_sql('SELECT COUNT(id_agente) as total FROM tagente where id_grupo = '.$group_id); + if (is_metaconsole() === true && $item['server_name'] === 'all') { + $nodes = metaconsole_get_connections(); + foreach ($nodes as $node) { + try { + $nd = new Node($node['id']); + $nd->connect(); - if ($childrens !== false && (int) $total_agents[0]['total'] !== $item['data']['group_stats']['total_agents']) { - $array_group_id = []; - $array_group_id[] = $group_id; - foreach ($childrens as $group) { - $array_group_id[] = $group['id_grupo']; + $group_id_node = db_get_value('id_grupo', 'tgrupo', 'nombre', $item['subtitle']); + $description = db_get_value('description', 'tgrupo', 'id_grupo', $group_id_node); + $icon_url = db_get_value('icon', 'tgrupo', 'id_grupo', $group_id_node); + $icon = html_print_image( + 'images/'.$icon_url, + true, + [ + 'title' => $item['subtitle'], + 'class' => 'main_menu_icon invert_filter', + ] + ); + + $childrens = db_get_all_rows_sql('SELECT id_grupo FROM tgrupo WHERE parent = '.$group_id_node); + $total_agents = db_get_all_rows_sql('SELECT COUNT(id_agente) as total FROM tagente where id_grupo = '.$group_id_node); + + if ($childrens !== false && (int) $total_agents[0]['total'] !== $item['data']['group_stats']['total_agents']) { + $array_group_id = []; + $array_group_id[] = $group_id_node; + foreach ($childrens as $group) { + $array_group_id[] = $group['id_grupo']; + } + + $group_id_node = $array_group_id; + $explode_group_id = implode(',', $group_id_node); + } else { + $explode_group_id = $group_id_node; + } + + $group_events_node = db_get_all_rows_sql( + 'SELECT COUNT(te.id_evento) as count_events, ta.alias + FROM tevento as te + INNER JOIN tagente as ta ON te.id_agente = ta.id_agente WHERE te.id_grupo IN ('.$explode_group_id.') + GROUP BY te.id_agente' + ); + + $group_os_node = db_get_all_rows_sql( + 'SELECT COUNT(os.name) as count_os, os.name as name_os, ta.id_grupo + FROM tconfig_os as os + INNER JOIN tagente as ta ON ta.id_os = os.id_os + WHERE ta.id_grupo IN ('.$explode_group_id.') GROUP by os.name' + ); + + $group_events = array_merge($group_events, $group_events_node); + $group_os = array_merge($group_os, $group_os_node); + } catch (\Exception $e) { + $nd->disconnect(); + } finally { + $nd->disconnect(); + } + } + } else { + $description = db_get_value('description', 'tgrupo', 'id_grupo', $group_id); + $icon_url = db_get_value('icon', 'tgrupo', 'id_grupo', $group_id); + $icon = html_print_image( + 'images/'.$icon_url, + true, + [ + 'title' => $item['subtitle'], + 'class' => 'main_menu_icon invert_filter', + ] + ); + + $childrens = db_get_all_rows_sql('SELECT id_grupo FROM tgrupo WHERE parent = '.$group_id); + $total_agents = db_get_all_rows_sql('SELECT COUNT(id_agente) as total FROM '.$table_agent.' where id_grupo = '.$group_id); + + if ($childrens !== false && (int) $total_agents[0]['total'] !== $item['data']['group_stats']['total_agents']) { + $array_group_id = []; + $array_group_id[] = $group_id; + foreach ($childrens as $group) { + $array_group_id[] = $group['id_grupo']; + } + + $group_id = $array_group_id; + $explode_group_id = implode(',', $group_id); + } else { + $explode_group_id = $group_id; } - $group_id = $array_group_id; - $explode_group_id = implode(',', $group_id); - } else { - $explode_group_id = $group_id; + $group_events = db_get_all_rows_sql( + 'SELECT COUNT(te.id_evento) as count_events, ta.alias + FROM tevento as te + INNER JOIN '.$table_agent.' as ta ON te.id_agente = ta.id_agente WHERE te.id_grupo IN ('.$explode_group_id.') + GROUP BY te.id_agente' + ); + + $group_os = db_get_all_rows_sql( + 'SELECT COUNT(os.name) as count_os, os.name as name_os, ta.id_grupo + FROM tconfig_os as os + INNER JOIN '.$table_agent.' as ta ON ta.id_os = os.id_os + WHERE ta.id_grupo IN ('.$explode_group_id.') GROUP by os.name' + ); } - - $group_events = db_get_all_rows_sql( - 'SELECT COUNT(te.id_evento) as count_events, ta.alias - FROM tevento as te - INNER JOIN tagente as ta ON te.id_agente = ta.id_agente WHERE te.id_grupo IN ('.$explode_group_id.') - GROUP BY te.id_agente' - ); - - $group_os = db_get_all_rows_sql( - 'SELECT COUNT(os.name) as count_os, os.name as name_os, ta.id_grupo - FROM tconfig_os as os - INNER JOIN tagente as ta ON ta.id_os = os.id_os - WHERE ta.id_grupo IN ('.$explode_group_id.') GROUP by os.name' - ); } if ($metaconsole_connected === true) { From 33d5dc2e765757d32d74c4bc0c5fd9bc0a1e1c8c Mon Sep 17 00:00:00 2001 From: Calvo Date: Tue, 5 Sep 2023 15:33:20 +0200 Subject: [PATCH 030/123] Fix group report metaconsole --- .../include/functions_reporting_html.php | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/pandora_console/include/functions_reporting_html.php b/pandora_console/include/functions_reporting_html.php index 588b9d44f4..4419248314 100644 --- a/pandora_console/include/functions_reporting_html.php +++ b/pandora_console/include/functions_reporting_html.php @@ -2590,12 +2590,6 @@ function reporting_html_group_report($table, $item, $pdf=0) } } - if (is_metaconsole() && $item['server_name'] === '0') { - $table_agent = 'tmetaconsole_agent'; - } else { - $table_agent = 'tagente'; - } - $all_group_id = []; $group_events = []; $group_os = []; @@ -2638,13 +2632,13 @@ function reporting_html_group_report($table, $item, $pdf=0) $group_events = db_get_all_rows_sql( 'SELECT COUNT(te.id_evento) as count_events, ta.alias FROM tevento as te - INNER JOIN '.$table_agent.' as ta ON te.id_agente = ta.id_agente + INNER JOIN tagente as ta ON te.id_agente = ta.id_agente GROUP BY te.id_agente' ); $group_os = db_get_all_rows_sql( 'SELECT COUNT(os.name) as count_os, os.name as name_os, ta.id_grupo FROM tconfig_os as os - INNER JOIN '.$table_agent.' as ta ON ta.id_os = os.id_os GROUP by os.name' + INNER JOIN tagente as ta ON ta.id_os = os.id_os GROUP by os.name' ); } @@ -2729,7 +2723,7 @@ function reporting_html_group_report($table, $item, $pdf=0) ); $childrens = db_get_all_rows_sql('SELECT id_grupo FROM tgrupo WHERE parent = '.$group_id); - $total_agents = db_get_all_rows_sql('SELECT COUNT(id_agente) as total FROM '.$table_agent.' where id_grupo = '.$group_id); + $total_agents = db_get_all_rows_sql('SELECT COUNT(id_agente) as total FROM tagente where id_grupo = '.$group_id); if ($childrens !== false && (int) $total_agents[0]['total'] !== $item['data']['group_stats']['total_agents']) { $array_group_id = []; @@ -2747,14 +2741,14 @@ function reporting_html_group_report($table, $item, $pdf=0) $group_events = db_get_all_rows_sql( 'SELECT COUNT(te.id_evento) as count_events, ta.alias FROM tevento as te - INNER JOIN '.$table_agent.' as ta ON te.id_agente = ta.id_agente WHERE te.id_grupo IN ('.$explode_group_id.') + INNER JOIN tagente as ta ON te.id_agente = ta.id_agente WHERE te.id_grupo IN ('.$explode_group_id.') GROUP BY te.id_agente' ); $group_os = db_get_all_rows_sql( 'SELECT COUNT(os.name) as count_os, os.name as name_os, ta.id_grupo FROM tconfig_os as os - INNER JOIN '.$table_agent.' as ta ON ta.id_os = os.id_os + INNER JOIN tagente as ta ON ta.id_os = os.id_os WHERE ta.id_grupo IN ('.$explode_group_id.') GROUP by os.name' ); } From 351fad8f824e08db8d8c0cfa189912c546031bbe Mon Sep 17 00:00:00 2001 From: Calvo Date: Tue, 5 Sep 2023 16:21:19 +0200 Subject: [PATCH 031/123] Fix group report metaconsole --- pandora_console/include/functions_reporting_html.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandora_console/include/functions_reporting_html.php b/pandora_console/include/functions_reporting_html.php index 4419248314..0e9082c347 100644 --- a/pandora_console/include/functions_reporting_html.php +++ b/pandora_console/include/functions_reporting_html.php @@ -2595,7 +2595,7 @@ function reporting_html_group_report($table, $item, $pdf=0) $group_os = []; if ($item['subtitle'] === 'All') { - if (is_metaconsole() === true && $item['server_name'] === 'all') { + if (is_metaconsole() === true && $item['server_name'] === 'all' || $item['server_name'] === '0') { $nodes = metaconsole_get_connections(); foreach ($nodes as $node) { try { @@ -2653,7 +2653,7 @@ function reporting_html_group_report($table, $item, $pdf=0) } else { $group_id = db_get_value('id_grupo', 'tgrupo', 'nombre', $item['subtitle']); - if (is_metaconsole() === true && $item['server_name'] === 'all') { + if (is_metaconsole() === true && $item['server_name'] === 'all' || $item['server_name'] === '0') { $nodes = metaconsole_get_connections(); foreach ($nodes as $node) { try { From 793c953e0713c75a75e5538f5bb80cec43de8d16 Mon Sep 17 00:00:00 2001 From: miguel angel rasteu Date: Wed, 6 Sep 2023 10:38:09 +0200 Subject: [PATCH 032/123] #11947 Fix notification --- pandora_console/include/class/ConsoleSupervisor.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/include/class/ConsoleSupervisor.php b/pandora_console/include/class/ConsoleSupervisor.php index 4caab01ee0..7e5e5de1bc 100644 --- a/pandora_console/include/class/ConsoleSupervisor.php +++ b/pandora_console/include/class/ConsoleSupervisor.php @@ -702,7 +702,7 @@ class ConsoleSupervisor $total_agents = db_get_value('count(*)', 'tagente'); - if ($total_agents >= 1) { + if ($total_agents >= 200) { if ((int) $config['agentaccess'] !== 0) { db_process_sql_update('tconfig', ['value' => 0], ['token' => 'agentaccess']); $this->notify( From e3050c29339cee4ad56ed23a2c203af427a6b7b0 Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Wed, 6 Sep 2023 15:09:42 +0200 Subject: [PATCH 033/123] #11965 change css in hardening --- pandora_console/include/styles/security_hardening.css | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pandora_console/include/styles/security_hardening.css b/pandora_console/include/styles/security_hardening.css index f6b6733aff..fdcb836d61 100644 --- a/pandora_console/include/styles/security_hardening.css +++ b/pandora_console/include/styles/security_hardening.css @@ -114,7 +114,8 @@ align-items: flex-end; } -#form_list_total_resume { +#form_list_total_resume, +#form_list_total_failed { display: flex; align-items: flex-end; } From 03d77613ef92e6ae0e2851b6fb41990b790a06d8 Mon Sep 17 00:00:00 2001 From: "alejandro.campos@artica.es" Date: Wed, 6 Sep 2023 17:42:42 +0200 Subject: [PATCH 034/123] fix agent search in community versoin --- pandora_console/operation/search_agents.getdata.php | 1 + 1 file changed, 1 insertion(+) diff --git a/pandora_console/operation/search_agents.getdata.php b/pandora_console/operation/search_agents.getdata.php index ea63506fa4..bdeea391a1 100644 --- a/pandora_console/operation/search_agents.getdata.php +++ b/pandora_console/operation/search_agents.getdata.php @@ -15,6 +15,7 @@ global $config; enterprise_include_once('include/functions_policies.php'); require_once $config['homedir'].'/include/functions_users.php'; +require_once $config['homedir'].'/include/functions_reporting.php'; $searchAgents = get_parameter('search_agents', 0); $stringSearchSQL = get_parameter('stringSearchSQL'); From a433a78a4cd0bb3cdbfcf9828f83725ff2ecd630 Mon Sep 17 00:00:00 2001 From: miguel angel rasteu Date: Thu, 7 Sep 2023 10:44:46 +0200 Subject: [PATCH 035/123] #Fix graph --- pandora_console/include/functions_graph.php | 8 ++- pandora_console/include/functions_html.php | 2 + .../include/functions_reporting.php | 37 ++++++++++-- .../include/functions_reporting_html.php | 19 ++++-- .../operation/reporting/reporting_viewer.php | 60 +++++++++++++------ 5 files changed, 97 insertions(+), 29 deletions(-) diff --git a/pandora_console/include/functions_graph.php b/pandora_console/include/functions_graph.php index 6fa1e2a8d5..141f6385fd 100644 --- a/pandora_console/include/functions_graph.php +++ b/pandora_console/include/functions_graph.php @@ -1577,10 +1577,16 @@ function graphic_combined_module( $server_name = metaconsole_get_server_by_id($modules[0]['server']); } + if (isset($params_combined['custom_period']) !== false && $params_combined['custom_period'] !== false) { + $period = $params_combined['custom_period']; + } else { + $period = $params['period']; + } + if ($params_combined['projection']) { $output_projection = forecast_projection_graph( $module_list[0], - $params['period'], + $period, $params_combined['projection'], false, false, diff --git a/pandora_console/include/functions_html.php b/pandora_console/include/functions_html.php index 3d8eb231b9..4cacb0218d 100644 --- a/pandora_console/include/functions_html.php +++ b/pandora_console/include/functions_html.php @@ -7266,6 +7266,8 @@ function html_print_select_date_range( $date_init = date('Y/m/d', strtotime($date_end.' -1 days')); } + $date_init = date('Y/m/d', strtotime($date_init)); + if ($time_init === '') { $time_init = date('H:i:s'); } diff --git a/pandora_console/include/functions_reporting.php b/pandora_console/include/functions_reporting.php index c01e44157a..ee1f04b952 100755 --- a/pandora_console/include/functions_reporting.php +++ b/pandora_console/include/functions_reporting.php @@ -159,7 +159,10 @@ function reporting_make_reporting_data( $force_width_chart=null, $force_height_chart=null, $pdf=false, - $from_template=false + $from_template=false, + $filter_type='', + $custom_date_end='', + $custom_period=false ) { global $config; @@ -194,8 +197,7 @@ function reporting_make_reporting_data( if (empty($contents)) { return reporting_check_structure_report($report); - } - + }; $metaconsole_on = is_metaconsole(); $index_content = 0; @@ -562,7 +564,10 @@ function reporting_make_reporting_data( $type, $force_width_chart, $force_height_chart, - $pdf + $pdf, + $filter_type, + $custom_date_end, + $custom_period ); break; @@ -6804,7 +6809,10 @@ function reporting_projection_graph( $type='dinamic', $force_width_chart=null, $force_height_chart=null, - $pdf=false + $pdf=false, + $filter_type='', + $custom_date_end='', + $custom_period=false ) { global $config; @@ -6870,6 +6878,7 @@ function reporting_projection_graph( $return['agent_name_db'] = $agent_name_db; $return['agent_name'] = $agent_name; $return['module_name'] = $module_name; + $return['datetime'] = $report['datetime']; set_time_limit(500); @@ -6890,8 +6899,24 @@ function reporting_projection_graph( 'return_img_base_64' => true, ]; + $top_n_value = $content['top_n_value']; + if ($filter_type === 'this_week') { + $current_date = date('Y/m/d H:i:s'); + $monday = date('Y/m/d H:i:s', strtotime('last monday')); + $sunday = date('Y/m/d H:i:s', strtotime($monday.' +6 days')); + $top_n_value = (strtotime($sunday) - strtotime($current_date)); + } else if ($filter_type === 'this_month') { + $current_date = date('Y/m/d H:i:s'); + $last_of_month = date('Y/m/d', strtotime('last day of this month')); + $top_n_value = (strtotime($last_of_month) - strtotime($current_date)); + } else if ($filter_type === 'chose_range') { + $current_date = date('Y/m/d H:i:s'); + $top_n_value = (strtotime($custom_date_end) - strtotime($current_date)); + } + $params_combined = [ - 'projection' => $content['top_n_value'], + 'projection' => $top_n_value, + 'custom_period' => $custom_period, ]; if ($pdf === true) { diff --git a/pandora_console/include/functions_reporting_html.php b/pandora_console/include/functions_reporting_html.php index eb7c555fb9..e1c506cf83 100644 --- a/pandora_console/include/functions_reporting_html.php +++ b/pandora_console/include/functions_reporting_html.php @@ -119,10 +119,15 @@ function reporting_html_header( } -function html_do_report_info($report) +function html_do_report_info($report, $custom_date_end=false, $custom_period=false) { global $config; + if ($custom_period !== false && $custom_date_end !== false) { + $report['datetime'] = strtotime($custom_date_end); + $report['period'] = $custom_period; + } + if ($config['style'] === 'pandora_black' && !is_metaconsole()) { $background_color = '#222'; } else { @@ -170,10 +175,10 @@ function html_do_report_info($report) * * @return array */ -function reporting_html_print_report($report, $mini=false, $report_info=1) +function reporting_html_print_report($report, $mini=false, $report_info=1, $custom_date_end=false, $custom_period=false) { if ($report_info == 1) { - html_do_report_info($report); + html_do_report_info($report, $custom_date_end, $custom_period); } foreach ($report['contents'] as $key => $item) { @@ -226,6 +231,12 @@ function reporting_html_print_report($report, $mini=false, $report_info=1) $label = ''; } + if ($custom_date_end !== false) { + $to = strtotime($custom_date_end); + } else { + $to = $item['date']['to']; + } + reporting_html_header( $table, $mini, @@ -234,7 +245,7 @@ function reporting_html_print_report($report, $mini=false, $report_info=1) $item['date']['period'], $item['date']['date'], $item['date']['from'], - $item['date']['to'], + $to, $label ); diff --git a/pandora_console/operation/reporting/reporting_viewer.php b/pandora_console/operation/reporting/reporting_viewer.php index 78f9126122..e9430b8eca 100755 --- a/pandora_console/operation/reporting/reporting_viewer.php +++ b/pandora_console/operation/reporting/reporting_viewer.php @@ -60,12 +60,29 @@ $datetime_end = strtotime($date_end.' '.$time_end); $custom_date = get_parameter('custom_date', 0); $date = get_parameter('date', SECONDS_1DAY); $date_text = get_parameter('date_text', SECONDS_1DAY); -if ($custom_date === '1') { - if ($datetime_init >= $datetime_end) { - $datetime_init = $date_init_less; - } - $period = ($datetime_end - $datetime_init); +$custom_date_end = ''; +$filter_type = ''; +$custom_period = false; +if ($custom_date === '1') { + if ($date === 'chose_range') { + $date_init = get_parameter('date_init', 0); + $date_init = explode(' ', $date_init); + $date_init = $date_init[0]; + $date_init .= ' '.get_parameter('time_init', '00:00:00'); + $custom_date_end = get_parameter('date_end', 0); + $custom_date_end .= ' '.get_parameter('time_end', '00:00:00'); + $date_end = date('Y/m/d H:i:s'); + $period = (strtotime($date_end) - strtotime($date_init)); + $custom_period = (strtotime($custom_date_end) - strtotime($date_init)); + $filter_type = 'chose_range'; + } else { + if ($datetime_init >= $datetime_end) { + $datetime_init = $date_init_less; + } + + $period = ($datetime_end - $datetime_init); + } } else if ($custom_date === '2') { $date_units = get_parameter('date_units'); $date_end = date('Y/m/d H:i:s'); @@ -73,16 +90,18 @@ if ($custom_date === '1') { $period = (strtotime($date_end) - strtotime($date_start)); } else if (in_array($date, ['this_week', 'this_month', 'past_week', 'past_month'])) { if ($date === 'this_week') { - $monday = date('Y/m/d', strtotime('last monday')); - - $sunday = date('Y/m/d', strtotime($monday.' +6 days')); - $period = (strtotime($sunday) - strtotime($monday)); - $date_init = $monday; - $date_end = $sunday; + // Last monday. + $date_init = date('Y/m/d H:i:s', strtotime('last monday')); + // $date_end = date('Y/m/d H:i:s', strtotime($date_init.' +6 days')); + $date_end = date('Y/m/d H:i:s'); + $period = (strtotime($date_end) - strtotime($date_init)); + $filter_type = 'this_week'; } else if ($date === 'this_month') { - $date_end = date('Y/m/d', strtotime('last day of this month')); + // $date_end = date('Y/m/d', strtotime('last day of this month')); + $date_end = date('Y/m/d H:i:s'); $first_of_month = date('Y/m/d', strtotime('first day of this month')); $period = (strtotime($date_end) - strtotime($first_of_month)); + $filter_type = 'this_month'; } else if ($date === 'past_month') { $date_end = date('Y/m/d', strtotime('last day of previous month')); $first_of_month = date('Y/m/d', strtotime('first day of previous month')); @@ -265,10 +284,8 @@ ui_print_standard_header( // ------------------------ INIT FORM ----------------------------------- $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->size[2] = '20%'; +$table2->style[3] = 'position:absolute; left: auto'; $table2->styleTable = 'border:none'; if (defined('METACONSOLE')) { @@ -353,13 +370,20 @@ $report = reporting_make_reporting_data( $date_end, $time, $period, - 'dinamic' + 'dinamic', + null, + null, + false, + false, + $filter_type, + $custom_date_end, + $custom_period ); for ($i = 0; $i < count($report['contents']); $i++) { $report['contents'][$i]['description'] = str_replace(' ', '
', $report['contents'][$i]['description']); } -reporting_html_print_report($report, false, $config['custom_report_info']); +reporting_html_print_report($report, false, $config['custom_report_info'], $custom_date_end, $custom_period); echo '
'; From 87c02fd0a7f9c0e60b716f294034801a9891f99f Mon Sep 17 00:00:00 2001 From: Pablo Aragon Date: Thu, 7 Sep 2023 11:08:31 +0200 Subject: [PATCH 036/123] 11801-Resolve conflict --- extras/deploy-scripts/pandora_agent_deploy.sh | 82 +- pandora_agents/pc/Linux/pandora_agent.conf | 2 +- pandora_agents/pc/Win32/pandora_agent.conf | 2 +- pandora_agents/unix/DEBIAN/control | 2 +- .../unix/DEBIAN/make_deb_package.sh | 2 +- pandora_agents/unix/Darwin/pandora_agent.conf | 2 +- pandora_agents/unix/Linux/pandora_agent.conf | 2 +- pandora_agents/unix/pandora_agent | 2 +- pandora_agents/unix/pandora_agent.redhat.spec | 2 +- .../unix/pandora_agent.redhat_bin.spec | 2 +- pandora_agents/unix/pandora_agent.spec | 2 +- pandora_agents/unix/pandora_agent_installer | 2 +- pandora_agents/win32/bin/pandora_agent.conf | 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/extras/mr/66.sql | 26 + .../godmode/agentes/configurar_agente.php | 6 +- .../godmode/agentes/module_manager_editor.php | 6 +- .../agentes/module_manager_editor_network.php | 17 +- .../godmode/alerts/alert_commands.php | 4 +- .../godmode/setup/setup_visuals.php | 25 + .../godmode/snmpconsole/snmp_alert.php | 2 +- .../wizards/DiscoveryTaskList.class.php | 4 +- .../images/widgets/groups_status_map.png | Bin 0 -> 4390 bytes pandora_console/images/widgets/inventory.png | Bin 0 -> 5698 bytes pandora_console/include/ajax/audit_log.php | 78 +- pandora_console/include/ajax/module.php | 54 +- .../include/class/AuditLog.class.php | 48 +- .../include/class/SnmpConsole.class.php | 9 +- pandora_console/include/config_process.php | 2 +- pandora_console/include/functions_config.php | 8 + .../include/functions_filemanager.php | 36 +- pandora_console/include/functions_html.php | 293 ++++ .../include/functions_inventory.php | 14 +- pandora_console/include/functions_menu.php | 4 + pandora_console/include/functions_ui.php | 21 +- pandora_console/include/get_file.php | 26 +- .../include/graphs/flot/pandora.flot.js | 20 +- .../include/graphs/functions_d3.php | 16 +- pandora_console/include/graphs/pandora.d3.js | 115 +- .../include/javascript/jquery-ui.min.js | 2 +- .../include/javascript/pandora_dashboards.js | 73 + .../include/lib/Dashboard/Manager.php | 45 + .../include/lib/Dashboard/Widget.php | 8 + .../Dashboard/Widgets/groups_status_map.php | 460 ++++++ .../lib/Dashboard/Widgets/inventory.php | 1270 +++++++++++++++++ .../lib/Dashboard/Widgets/single_graph.php | 92 +- pandora_console/include/styles/dashboards.css | 10 + .../include/styles/js/jquery-ui.min.css | 2 +- .../include/styles/js/jquery-ui_custom.css | 127 +- pandora_console/include/styles/pandora.css | 4 + pandora_console/install.php | 2 +- .../operation/agentes/stat_win.php | 71 +- .../operation/agentes/ver_agente.php | 98 ++ pandora_console/operation/events/events.php | 1 + .../operation/inventory/inventory.php | 140 +- .../operation/netflow/nf_live_view.php | 200 +-- .../operation/network/network_report.php | 233 +-- .../operation/network/network_usage_map.php | 138 +- .../operation/reporting/graph_viewer.php | 108 +- .../operation/reporting/reporting_viewer.php | 99 +- .../operation/visual_console/view.php | 5 + pandora_console/pandora_console.redhat.spec | 2 +- pandora_console/pandora_console.rhel7.spec | 2 +- pandora_console/pandora_console.spec | 2 +- pandora_console/pandoradb.sql | 26 +- pandora_console/pandoradb_data.sql | 6 +- pandora_console/views/dashboard/cell.php | 12 + pandora_server/DEBIAN/control | 2 +- pandora_server/DEBIAN/make_deb_package.sh | 2 +- pandora_server/lib/PandoraFMS/Config.pm | 2 +- pandora_server/lib/PandoraFMS/DB.pm | 4 +- pandora_server/lib/PandoraFMS/PluginTools.pm | 2 +- pandora_server/lib/PandoraFMS/SNMPServer.pm | 4 +- 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 +- 82 files changed, 3400 insertions(+), 814 deletions(-) create mode 100644 pandora_console/images/widgets/groups_status_map.png create mode 100644 pandora_console/images/widgets/inventory.png create mode 100644 pandora_console/include/lib/Dashboard/Widgets/groups_status_map.php create mode 100644 pandora_console/include/lib/Dashboard/Widgets/inventory.php diff --git a/extras/deploy-scripts/pandora_agent_deploy.sh b/extras/deploy-scripts/pandora_agent_deploy.sh index a16f5afc47..88bfe4dd83 100644 --- a/extras/deploy-scripts/pandora_agent_deploy.sh +++ b/extras/deploy-scripts/pandora_agent_deploy.sh @@ -78,16 +78,16 @@ cd unix && ./pandora_agent_installer --install } -install_autodiscover () { - local arch=$1 - wget http://firefly.pandorafms.com/projects/autodiscover-linux.zip - unzip autodiscover-linux.zip - chmod +x $arch/autodiscover - mv -f $arch/autodiscover /etc/pandora/plugins/autodiscover -} +# install_autodiscover () { +# local arch=$1 +# wget http://firefly.pandorafms.com/projects/autodiscover-linux.zip +# unzip autodiscover-linux.zip +# chmod +x $arch/autodiscover +# mv -f $arch/autodiscover /etc/pandora/plugins/autodiscover +# } ## Main -echo "Starting PandoraFMS Agent deployment ver. $S_VERSION" +echo "Starting PandoraFMS Agent binary deployment ver. $S_VERSION" execute_cmd "[ $PANDORA_SERVER_IP ]" 'Check Server IP Address' 'Please define env variable PANDORA_SERVER_IP' @@ -104,8 +104,6 @@ OS=$([[ $(grep '^ID_LIKE=' /etc/os-release) ]] && grep ^ID_LIKE= /etc/os-release [[ $OS =~ 'rhel' ]] && OS_RELEASE=$OS [[ $OS =~ 'fedora' ]] && OS_RELEASE=$OS [[ $OS =~ 'debian' ]] && OS_RELEASE=$OS -#[[ $OS == 'rhel fedora' ]] && OS_RELEASE=$OS -#[[ $OS == 'centos rhel fedora' ]] && OS_RELEASE=$OS # initialice logfile execute_cmd "echo 'Starting community deployment' > $LOGFILE" "All installer activity is logged on $LOGFILE" @@ -126,6 +124,30 @@ check_repo_connection execute_cmd "grep --version" 'Checking needed tools: grep' execute_cmd "sed --version" 'Checking needed tools: sed' +# Arch check +arch=$(uname -m) +case $arch in + + x86_64) + echo -e "${cyan}Arch: $arch ${reset} " + ;; + + x86) + echo -e "${yellow}Skiping installation arch: $arch not suported by binary agent please consider to install source agent${reset}" + exit -1 + ;; + + armv7l) + echo -e "${yellow}Skiping installation arch: $arch not suported by binary agent please consider to install source agent${reset}" + exit -1 + ;; + + *) + echo -e "${yellow}Skiping installation arch: $arch not suported by binary agent please consider to install source agent${reset}" + exit -1 + ;; +esac + # Creating working directory rm -rf $HOME/pandora_deploy_tmp/ &>> $LOGFILE mkdir $HOME/pandora_deploy_tmp &>> $LOGFILE @@ -148,6 +170,10 @@ if [[ $OS_RELEASE =~ 'rhel' ]] || [[ $OS_RELEASE =~ 'fedora' ]]; then # Check rh version if [ $(sed -nr 's/VERSION_ID+=\s*"([0-9]).*"$/\1/p' /etc/os-release) -eq '8' ] ; then package_manager_cmd=dnf + execute_cmd "$package_manager_cmd install -y libnsl" "Installing dependencies" + elif [ $(sed -nr 's/VERSION_ID+=\s*"([0-9]).*"$/\1/p' /etc/os-release) -eq '9' ] ; then + package_manager_cmd=dnf + execute_cmd "$package_manager_cmd install -y libnsl libxcrypt-compat" "Installing dependencies" elif [ $(sed -nr 's/VERSION_ID+=\s*"([0-9]).*"$/\1/p' /etc/os-release) -eq '7' ] ; then package_manager_cmd=yum @@ -158,24 +184,23 @@ if [[ $OS_RELEASE =~ 'rhel' ]] || [[ $OS_RELEASE =~ 'fedora' ]]; then echo -e "${cyan}Installing agent dependencies...${reset}" ${green}OK${reset} # Insatall pandora agent - $package_manager_cmd install -y http://firefly.pandorafms.com/pandorafms/latest/RHEL_CentOS/pandorafms_agent_linux-7.0NG.noarch.rpm &>> $LOGFILE - echo -en "${cyan}Installing Pandora FMS agent...${reset}" - check_cmd_status 'Error installing Pandora FMS agent' - [[ $PANDORA_AGENT_SSL ]] && execute_cmd "$package_manager_cmd install -y perl-IO-Socket-SSL" "Installing SSL libraries for encrypted connection" + [ "$PANDORA_AGENT_PACKAGE_EL" ] || PANDORA_AGENT_PACKAGE_EL="https://firefly.pandorafms.com/pandorafms/latest/RHEL_CentOS/pandorafms_agent_linux_bin-7.0NG.x86_64.rpm " + execute_cmd "$package_manager_cmd install -y ${PANDORA_AGENT_PACKAGE_EL}" 'Installing Pandora FMS agent package' + #[[ $PANDORA_AGENT_SSL ]] && execute_cmd "$package_manager_cmd install -y perl-IO-Socket-SSL" "Installing SSL libraries for encrypted connection" fi if [[ $OS_RELEASE == 'debian' ]]; then + [ "$PANDORA_AGENT_PACKAGE_UBUNTU" ] || PANDORA_AGENT_PACKAGE_UBUNTU='https://firefly.pandorafms.com/pandorafms/latest/Tarball/pandorafms_agent_linux-7.0NG_x86_64.tar.gz' execute_cmd "apt update" 'Updating repos' - execute_cmd "apt install -y perl wget curl unzip procps python3 python3-pip" 'Installing agent dependencies' - execute_cmd 'wget http://firefly.pandorafms.com/pandorafms/latest/Tarball/pandorafms_agent_linux-7.0NG.tar.gz' 'Downloading Pandora FMS agent package' + execute_cmd "apt install -y perl wget curl unzip procps python3 python3-pip" 'Installing agent dependencies' + execute_cmd "curl --output pandorafms_agent_linux-7.0NG.tar.gz ${PANDORA_AGENT_PACKAGE_UBUNTU}" 'Downloading Pandora FMS agent package' execute_cmd 'install_tarball pandorafms_agent_linux-7.0NG.tar.gz' 'Installing Pandora FMS agent' - [[ $PANDORA_AGENT_SSL ]] && execute_cmd 'apt install -y libio-socket-ssl-perl' "Installing SSL libraries for encrypted connection" + #[[ $PANDORA_AGENT_SSL ]] && execute_cmd 'apt install -y libio-socket-ssl-perl' "Installing SSL libraries for encrypted connection" cd $HOME/pandora_deploy_tmp fi # Configuring Agente - [[ $PANDORA_SERVER_IP ]] && sed -i "s/^server_ip.*$/server_ip $PANDORA_SERVER_IP/g" $PANDORA_AGENT_CONF [[ $PANDORA_REMOTE_CONFIG ]] && sed -i "s/^remote_config.*$/remote_config $PANDORA_REMOTE_CONFIG/g" $PANDORA_AGENT_CONF [[ $PANDORA_GROUP ]] && sed -i "s/^group.*$/group $PANDORA_GROUP/g" $PANDORA_AGENT_CONF @@ -187,27 +212,6 @@ fi [[ $PANDORA_AGENT_SSL ]] && sed -i "s/^#server_ssl.*$/server_ssl $PANDORA_AGENT_SSL/g" $PANDORA_AGENT_CONF -#installing autodiscover - -arch=$(uname -m) -case $arch in - - x86_64) - execute_cmd 'install_autodiscover x86_64' "installing service autodiscover on $arch" 'Error unable to install autodiscovery' - ;; - - x86) - execute_cmd 'install_autodiscover x84' "installing service autodiscover on $arch" 'Error unable to install autodiscovery' - ;; - - armv7l) - echo -e "${cyan}Skiping autodiscover installation arch $arch not suported${reset}" - ;; - - *) - echo -e "${yellow}Skiping autodiscover installation arch $arch not suported${reset}" - ;; -esac #Starting pandora agent daemon. execute_cmd '/etc/init.d/pandora_agent_daemon restart' 'Starting Pandora Agent' diff --git a/pandora_agents/pc/Linux/pandora_agent.conf b/pandora_agents/pc/Linux/pandora_agent.conf index 745b464803..0a3a48950c 100644 --- a/pandora_agents/pc/Linux/pandora_agent.conf +++ b/pandora_agents/pc/Linux/pandora_agent.conf @@ -166,7 +166,7 @@ module_description User CPU Usage (%) module_min_warning 70 module_max_warning 90 module_min_critical 91 -module_max_critical 100 +module_max_critical 0 module_unit % module_end diff --git a/pandora_agents/pc/Win32/pandora_agent.conf b/pandora_agents/pc/Win32/pandora_agent.conf index 53b368f5ee..edf5a7847a 100644 --- a/pandora_agents/pc/Win32/pandora_agent.conf +++ b/pandora_agents/pc/Win32/pandora_agent.conf @@ -119,7 +119,7 @@ module_description CPU Load (%) module_min_warning 80 module_max_warning 90 module_min_critical 91 -module_max_critical 100 +module_max_critical 0 module_end # Number processes diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index 7c20120eae..4a10fb7ac8 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.773.3-230831 +Version: 7.0NG.773.3-230907 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 3a6431f20f..9304a38d93 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.773.3-230831" +pandora_version="7.0NG.773.3-230907" 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/Darwin/pandora_agent.conf b/pandora_agents/unix/Darwin/pandora_agent.conf index 27b3dfd479..44f909aee8 100644 --- a/pandora_agents/unix/Darwin/pandora_agent.conf +++ b/pandora_agents/unix/Darwin/pandora_agent.conf @@ -187,7 +187,7 @@ module_description User CPU Usage (%) module_min_warning 70 module_max_warning 90 module_min_critical 91 -module_max_critical 100 +module_max_critical 0 module_end #Get load average diff --git a/pandora_agents/unix/Linux/pandora_agent.conf b/pandora_agents/unix/Linux/pandora_agent.conf index a172ae37a2..1b8131a42d 100644 --- a/pandora_agents/unix/Linux/pandora_agent.conf +++ b/pandora_agents/unix/Linux/pandora_agent.conf @@ -219,7 +219,7 @@ module_description User CPU Usage (%) module_min_warning 70 module_max_warning 90 module_min_critical 91 -module_max_critical 100 +module_max_critical 0 module_unit % module_group System module_end diff --git a/pandora_agents/unix/pandora_agent b/pandora_agents/unix/pandora_agent index d712b8efec..f8fdb985c4 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -1031,7 +1031,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.773.3'; -use constant AGENT_BUILD => '230831'; +use constant AGENT_BUILD => '230907'; # 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 f6116fcc83..cf506511f5 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.773.3 -%define release 230831 +%define release 230907 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.redhat_bin.spec b/pandora_agents/unix/pandora_agent.redhat_bin.spec index 99e1c4900c..7c7373124e 100644 --- a/pandora_agents/unix/pandora_agent.redhat_bin.spec +++ b/pandora_agents/unix/pandora_agent.redhat_bin.spec @@ -5,7 +5,7 @@ %define name pandorafms_agent_linux_bin %define source_name pandorafms_agent_linux %define version 7.0NG.773.3 -%define release 230831 +%define release 230907 Summary: Pandora FMS Linux agent, binary version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index 613a77c5f2..40ecbc015c 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.773.3 -%define release 230831 +%define release 230907 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 7e287a8c08..60dd5f2a43 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.773.3" -PI_BUILD="230831" +PI_BUILD="230907" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/bin/pandora_agent.conf b/pandora_agents/win32/bin/pandora_agent.conf index 97974c62fa..d299325f3b 100644 --- a/pandora_agents/win32/bin/pandora_agent.conf +++ b/pandora_agents/win32/bin/pandora_agent.conf @@ -165,7 +165,7 @@ module_description User CPU Usage (%) module_min_warning 70 module_max_warning 90 module_min_critical 91 -module_max_critical 100 +module_max_critical 0 module_unit % module_group System module_end diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index 9880384a67..5ec92eec40 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{230831} +{230907} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index 9c355f5be7..c9ada13790 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.773.3 Build 230831") +#define PANDORA_VERSION ("7.0NG.773.3 Build 230907") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index 20c585892a..5c694f8a90 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Pandora FMS" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.773.3(Build 230831))" + VALUE "ProductVersion", "(7.0NG.773.3(Build 230907))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index 4530f088df..658070ae58 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.773.3-230831 +Version: 7.0NG.773.3-230907 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 33070dbbac..ff558a0de4 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.773.3-230831" +pandora_version="7.0NG.773.3-230907" package_pear=0 package_pandora=1 diff --git a/pandora_console/extras/mr/66.sql b/pandora_console/extras/mr/66.sql index b0022d31b0..8161c4c2b6 100644 --- a/pandora_console/extras/mr/66.sql +++ b/pandora_console/extras/mr/66.sql @@ -1,5 +1,9 @@ START TRANSACTION; +ALTER TABLE `ttrap` ADD COLUMN `utimestamp` INT UNSIGNED NOT NULL DEFAULT 0; + +UPDATE ttrap SET utimestamp=UNIX_TIMESTAMP(timestamp); + CREATE TABLE IF NOT EXISTS `tgraph_analytics_filter` ( `id` INT NOT NULL auto_increment, `filter_name` VARCHAR(45) NULL, @@ -18,4 +22,26 @@ UPDATE tagente_modulo SET `tcp_send` = '2c' WHERE `tcp_send` = '2'; UPDATE tpolicy_modules SET `tcp_send` = '2c' WHERE `tcp_send` = '2'; UPDATE tnetwork_component SET `tcp_send` = '2c' WHERE `tcp_send` = '2'; +ALTER TABLE `tsesion_filter_log_viewer` +CHANGE COLUMN `date_range` `custom_date` INT NULL DEFAULT NULL , +CHANGE COLUMN `start_date_defined` `date` VARCHAR(45) NULL DEFAULT NULL , +CHANGE COLUMN `start_date_time` `date_text` VARCHAR(45) NULL DEFAULT NULL , +CHANGE COLUMN `start_date_date` `date_units` VARCHAR(45) NULL DEFAULT NULL , +CHANGE COLUMN `start_date_date_range` `date_init` VARCHAR(45) NULL DEFAULT NULL , +CHANGE COLUMN `start_date_time_range` `time_init` VARCHAR(45) NULL DEFAULT NULL , +CHANGE COLUMN `end_date_date_range` `date_end` VARCHAR(45) NULL DEFAULT NULL , +CHANGE COLUMN `end_date_time_range` `time_end` VARCHAR(45) NULL DEFAULT NULL ; + +ALTER TABLE `tsesion_filter` +CHANGE COLUMN `period` `date_text` VARCHAR(45) NULL DEFAULT NULL AFTER `user`; + +ALTER TABLE `tsesion_filter` +ADD COLUMN `custom_date` INT NULL AFTER `user`, +ADD COLUMN `date` VARCHAR(45) NULL AFTER `custom_date`, +ADD COLUMN `date_units` VARCHAR(45) NULL AFTER `date_text`, +ADD COLUMN `date_init` VARCHAR(45) NULL AFTER `date_units`, +ADD COLUMN `time_init` VARCHAR(45) NULL AFTER `date_init`, +ADD COLUMN `date_end` VARCHAR(45) NULL AFTER `time_init`, +ADD COLUMN `time_end` VARCHAR(45) NULL AFTER `date_end`; + COMMIT; diff --git a/pandora_console/godmode/agentes/configurar_agente.php b/pandora_console/godmode/agentes/configurar_agente.php index 5fa92f8c85..701ce4894b 100644 --- a/pandora_console/godmode/agentes/configurar_agente.php +++ b/pandora_console/godmode/agentes/configurar_agente.php @@ -1475,13 +1475,13 @@ if ($update_module === true || $create_module === true) { $plugin_pass = io_input_password( (string) get_parameter('snmp3_auth_pass') ); - $plugin_parameter = (string) get_parameter('snmp3_auth_method'); + $plugin_parameter = (string) get_parameter('snmp3_auth_method', 'MD5'); - $custom_string_1 = (string) get_parameter('snmp3_privacy_method'); + $custom_string_1 = (string) get_parameter('snmp3_privacy_method', 'DES'); $custom_string_2 = io_input_password( (string) get_parameter('snmp3_privacy_pass') ); - $custom_string_3 = (string) get_parameter('snmp3_security_level'); + $custom_string_3 = (string) get_parameter('snmp3_security_level', 'noAuthNoPriv'); } else if ($id_module_type >= 34 && $id_module_type <= 37) { $tcp_send = (string) get_parameter('command_text'); $custom_string_1 = (string) get_parameter( diff --git a/pandora_console/godmode/agentes/module_manager_editor.php b/pandora_console/godmode/agentes/module_manager_editor.php index 42aa286c8a..452d2a498a 100644 --- a/pandora_console/godmode/agentes/module_manager_editor.php +++ b/pandora_console/godmode/agentes/module_manager_editor.php @@ -459,10 +459,10 @@ if ($id_agent_module) { $snmp_version = 1; $snmp3_auth_user = ''; $snmp3_auth_pass = ''; - $snmp3_auth_method = ''; - $snmp3_privacy_method = ''; + $snmp3_auth_method = 'MD5'; + $snmp3_privacy_method = 'DES'; $snmp3_privacy_pass = ''; - $snmp3_security_level = ''; + $snmp3_security_level = 'noAuthNoPriv'; // For Remote CMD. $command_text = ''; diff --git a/pandora_console/godmode/agentes/module_manager_editor_network.php b/pandora_console/godmode/agentes/module_manager_editor_network.php index 656dac2b0b..a5f0b4d184 100644 --- a/pandora_console/godmode/agentes/module_manager_editor_network.php +++ b/pandora_console/godmode/agentes/module_manager_editor_network.php @@ -405,7 +405,22 @@ push_table_simple($data, 'field_snmpv3_row1'); $data = []; $data[0] = __('Privacy method'); -$data[1] = html_print_select(['DES' => __('DES'), 'AES' => __('AES')], 'snmp3_privacy_method', $snmp3_privacy_method, '', '', '', true, false, false, '', $disabledBecauseInPolicy); +$data[1] = html_print_select( + [ + 'DES' => __('DES'), + 'AES' => __('AES'), + ], + 'snmp3_privacy_method', + $snmp3_privacy_method, + '', + '', + '', + true, + false, + false, + '', + $disabledBecauseInPolicy +); $data[2] = __('Privacy pass').ui_print_help_tip(__('The pass length must be eight character minimum.'), true); $data[3] = html_print_input_password( 'snmp3_privacy_pass', diff --git a/pandora_console/godmode/alerts/alert_commands.php b/pandora_console/godmode/alerts/alert_commands.php index 75a80d8d57..b6231544d1 100644 --- a/pandora_console/godmode/alerts/alert_commands.php +++ b/pandora_console/godmode/alerts/alert_commands.php @@ -97,7 +97,7 @@ if (is_ajax()) { if (!empty($field_description)) { // If the value is 5, this because severity in snmp alerts is not permit to show. - if (($i > 5) && ($command['id'] == 3)) { + if (($i > 5) && ($command['id'] === 3)) { $fdesc = $field_description.'
'.sprintf( __('Field %s'), ($i - 1) @@ -118,7 +118,7 @@ if (is_ajax()) { } } else { // If the macro hasn't description and doesnt appear in command, set with empty description to dont show it. - if (($i > 5) && ($command['id'] == 3)) { + if (($i > 5) && ($command['id'] === 3)) { if (substr_count($command['command'], '_field'.($i - 1).'_') > 0) { $fdesc = sprintf(__('Field %s'), ($i - 1)); } else { diff --git a/pandora_console/godmode/setup/setup_visuals.php b/pandora_console/godmode/setup/setup_visuals.php index 6753d1d499..68f2e1dfe2 100755 --- a/pandora_console/godmode/setup/setup_visuals.php +++ b/pandora_console/godmode/setup/setup_visuals.php @@ -759,6 +759,31 @@ if (enterprise_installed() === true) { ); } +$days_week = [ + 0 => __('Sunday'), + 1 => __('Monday'), + 2 => __('Tuesday'), + 3 => __('Wednesday'), + 4 => __('Thursday'), + 5 => __('Friday'), + 6 => __('Saturday'), +]; + +$table_styles->data[$row][] = html_print_label_input_block( + __('Datepicker first day of week'), + html_print_select( + $days_week, + 'datepicker_first_day', + $config['datepicker_first_day'], + '', + '', + false, + true, + false, + false + ) +); + $row++; // Title Header. diff --git a/pandora_console/godmode/snmpconsole/snmp_alert.php b/pandora_console/godmode/snmpconsole/snmp_alert.php index d23b65d7ea..2c139e4f21 100755 --- a/pandora_console/godmode/snmpconsole/snmp_alert.php +++ b/pandora_console/godmode/snmpconsole/snmp_alert.php @@ -2312,7 +2312,7 @@ $(document).ready (function () { // The row provided has a predefined class. We delete it. $('#table_macros-field' + i) .removeAttr('class'); - if(old_value && i != 4){ + if(old_value){ $("[name=field" + i + "_value]").val(old_value).trigger('change'); } $('#table_macros-field').show(); diff --git a/pandora_console/godmode/wizards/DiscoveryTaskList.class.php b/pandora_console/godmode/wizards/DiscoveryTaskList.class.php index af88c3e51f..347458ff62 100644 --- a/pandora_console/godmode/wizards/DiscoveryTaskList.class.php +++ b/pandora_console/godmode/wizards/DiscoveryTaskList.class.php @@ -912,7 +912,7 @@ class DiscoveryTaskList extends HTML 'class' => 'main_menu_icon invert_filter', ] ).'  '; - $data[6] .= __('Discovery.NetScan (legacy)'); + $data[6] .= __('Discovery.NetScan'); } else { // APP or external script recon task. $data[6] = html_print_image( @@ -920,7 +920,7 @@ class DiscoveryTaskList extends HTML true, ['class' => 'main_menu_icon invert_filter'] ).'  '; - $data[6] .= $recon_script_name.' (legacy)'; + $data[6] .= $recon_script_name; } break; } diff --git a/pandora_console/images/widgets/groups_status_map.png b/pandora_console/images/widgets/groups_status_map.png new file mode 100644 index 0000000000000000000000000000000000000000..ca624b9c71c9ea3bea62daa236dec8642bd8afd7 GIT binary patch literal 4390 zcmV+>5!vpEP)3%p69VBE0;nhg0R^dI zp;`@M^eA90LWKZQ5l_*`PYb1|2kpnxdhpa*^$3DNJqm{?#9CW>swh8^sI^4Ff*^#S zAiwar*mJJxAWe<|GwQM%f54x`Q6Xld*{u}o4GT~AcLp$olklqQO*-2Bp_Bg zJgc~kdNjt}^g+3So?~buMi+kz zDYY5BT>i;GDJo>gK;mOF?koC=VHjCOqCs9Q-`G!-xLipV&&-%ybdWBCxPnyr=Ekc; zSeJ9z6(rJFE7rbKux-ocnR-ByCXH2TD;s!eu%3{sv zzWWhrIJXeRK2l)b+AEvJOc;Fi9* zQF$LoIZrcz%*xN#|KXtkX;elJ0u7@G&R3FI_rzXKQcj0ZzFaq2#WA80^zqnBpno^@kg<1_ zlo&FK5o`v7SMv>|^u+|vb!f;4)I>jtG67nKj9^4JvJuVPZJg%>920l|k13?_rIc;fseYR;j@6-$Gd&DtJgW5B^_8PO?SwZ5+?GM$XdjPm3Fvs*v&Byg6D2+&LA8{4xY%99v2n@3ExC`E)I z&z%=JuA$`KTaFPptI&{)pf6*@=;0YtM^?w>(;0~{py@yy8bHZ?Me19wNK{&0 z*-?zv_R|CVk=8T@y(BL`Gyf?;5aI`92b^;{_L8C{HMrY2PQ73dXus%*EeI%cx3kwT1jSRkc;u!sA^lb{> zXJKu}dQ&LYD_9MDmv@)Y@nd0xMouIA5qu@ZF(QMTzQ3FGT=Sp@*j58yVE7T#V}B5T zH)AhBePOilgRcb9#xK)STd)*v%d%aR`5LPhp)hZseJt}OMjX$`inV}$%#ZqEZ%vM~Gb^5q3w%u~mFTAA^Sb+jUh(7&E;L_b|%=}=@%z@YT-b`kyW1EFc&lgkPXij^$Q z-WLH%=4Kn=;de-UJqTUZLL`HPcAw=0t|db9xoyPTR3JTYqOLl6dT!EYo5e;n91CQG ztj|*xAUUps6cIxK4)I}$4KPwPz_CGPcz~^RnGHlktQ3ukNMM6pSP;cJFAIu#-X!gt zK&7RX0j_hTLs*RFfDi}^!(*YMG84cKc^r1g69bGK6|f+9u{fHAg*qRJo)0v2sx2uQ z8YLAO`0u;$lt6JXbw)!mTIpA_={$U0g;T!ChQmGDci5TZlo=mGVOFg8FsGgi zSo-9e5llsXdolX$)TtxmJd5Lmd1=+As~J)Bw6&EAK?o0-06tI z$dcG*zJ(Z;lV(gFv6Tp<3bU+i<8=b=LP$)=|rp8ehQE&KNEQ=20pkm?W% zgx+8G`D8N-F)VYMwGsp>JaFJZSrkRIY}qmtiA0o;q#-o=lOzejpT5j(K8-(V(j>HF z>*o)cDG}tbT_b=!7TD7nKYl!_udi3a+S*z)VZsE{y&f}$`h2539U4YoZs%`kD-2EC zZCqa&f^U{j%DslR!tC1eA4J>&pFM#!3JJa-h?YIBtuVv; zwL?!tE>U^dt+T;06mfARNZ`&04>@Q<@|}hRf7yuD@sWOj4E3yfdlNv|B!DWf|Ld zCNnp4+dh1Px3!EHK2}}17kUJTJVG6=1a! zaKT;5)s9-ST(_Ft$Vj8ohRT+P(OpY4n9#&qE{W2x$&AAR%yIWWW_slq$f0xqu#IN6 z4fxpamfro`?1w9UFq+TmHQ1SfP9L)LeRC!Ad3-|Vi`5aKQ-{7!nI160^#`Krj+osB z?U_?2Lff}&y3$omd;rer*y;Sxo9;YhMk;QDmH?*B);SR^EgXSp zffS*zix%oo*Oxx4u7^ol+AkL^qYAcp=Q$&x^m*W57tK1C+b$Sr*Mwaf5q53lxgd6H zj2gN%%Gj+@ZfUnhy%1j0rIonp?nmt;J{*$5LI?>`2zzpdIED+hgl83aNQtr-VMHd3 zcs9(2_%JJk!l(~AUozAmA5yovQYQg!5$)j1%fAU8N2fc6q-ZW9vK`u@2bh_RF!7K% zsV=|Q93tbX+8chx3Z zV^79eQntA>!wHwlq8v)J0_l#=a76MpQSnN`3wNK-@jY7Xm-t+lM}IDzudonf7GK#kF;9jHZ#fbbLZ%rFlHXqJiq8yPtDG59jPn;fw&Wym$mx~m7tD_|)=zlv zz4th{kmzE5_V3@1#*7&w2D970{m|T}pY@`P27IXN*Z5Eu`=l(hxeV|4LOne*< z*U z0o{0!3G4xO;d}mlb9a%waCw*qN^l(N#v5;B>*|`vGdOoLV88&Bo13c`3P?g49|uv= zxXV-0`T6;3xd*nb9tCt#`Q6?$dPfLZ-)vzilMoGGzH{eJGwn{kTH&D)g>P> zW1Qsc*fWPVvlRfdKD+0#Gulh%zIT9QN7HF}p2(vtivO`j+wB@#(rv~#&VJrh*AW!N zezDb76TSe%_^)3JjY->B+_Lb+I5kLAenQWPd36t8E<9M6fw-Oajt=kah&Ta<&eH~Yl+rce-56e*P71z()CJ3JoDzHLdza`WQ^lcaj8Jd z7$+54_Q=DRF~{zn2)nvn%;SocZhSG0{@x3kp>-Lkhl z6G{`yoTjF=k=(fB)71KEWbPr*Ys9~_=X(hBRmj}nq1TA_v~M?fm{lQj_l=om;`5V! z_f0%YZH{tlR1n`970uil)#A5CX-#9Cg8SC$@qKI2%zbOd3UZLEe&;xV^%W%Ura}(i gR48O_Dx{VCf6%MpYQw+CiU0rr07*qoM6N<$f;n++olN2AFYRh(ZvY_3UAARsN3h zQ9eTW3J8lp0)+hYKK**@c2Z5f>gwO?_mU7(=e$={x9+`Fw{CTHeQyhh;|e$K?1p5e zODK#&$P>Qs)7+eD8ciUPWkp->Az?FrUf%dGRU$%Au=u$pW(4zJ{=-5@m)^&R2pUC>jxsysCIxZ#gWcgcbSv+!;CN=rjncM1}8e>nAHp5}U}z zp|Pq&r1o}yyfO3OzFqTJL=q>BRc+;jXxhU=BC1*CCUQ@2vK9w+y z@Xy`QxB7^-7lDl z8f;BWkIpLjc+uGHArwlMdqSLf441h$* zGy)senh~1-@#SkiN>@a0cV3zu7-3H1YEOop($R!=!=g9kbbjuz3N<4-6L>(1-YIy` zE+ZqnCCjVo1f$J8`5e$q@9Mb{(J2%;d=Xg$Ll zn@{1 z!ILN^_u({Sq13DU+4U<71fs^>?(W4`D4>KNJ zM$f$GgU_M)di!@sI*4M%M_r~5y6I6`Q3M>qr1AN6A&V=caWrWMjGmp z(U3+@K#ktCrV^b!U#gA`VC)Y+7(4vWx;IenLxa$XuaBe8KG~`M{3gYdKN&YeDfWF5;vC(-lXQXYyaO!A56BzWaotu*Xh(oU)EI!4%5#(FAh3 z#zh#k1fO(0P!?4ntL58*#S7kl`K6b7Wb?Ow#&CQJj?23LGFa2^t1rcE$lP8kd(|gXdOdjnf|3VJN*+24p&CHfdmy9ScM=;1!Zi zr^7Jwfgd=aOYV}U+dZW5qYc{A~rr^NI!IE&ny<8CdD4t#s21Z~)Hj0QOl$3&n6pXtV}D$L524a-V{1`jnX zq|btnAt99z6M>+{%{C1V>?lHbc@QmJxKP!O5iaaQx^<2PqPt?dnP-p9L+}GPInR7| zfGi|A>8j~+n7(-d5mtF&EY;MG9Md2ILjH&L?y_85;U2PJ3xBoryLNwmbJ4DT{Rg15 z^mJ{6PVitg&8Qg>96LTVIoPpd9SD+?l3I)xU|wg_*to4G2P0f|d7Ngn=`U~CS{F6AF6v-x_*2U1E#@30|Q> zdM59oQ?XczsVFZ)4=mJo-=8e2i*d1y+0D+)IjubpZiM=;MRWGtojFJ}&dOfO*;8N3 zFTA?)UVGS)SP^?)Bq^SoZ6uFa`{b+#;j3wg0ElljEhl)*;gjh$FK zmM~E3a%z1~6by9WF^Mb8n@}y5w>x7;d#1wR-mMGX$%)%4kJC!PJ=(YUFvnFRI<7El z)_jyyEqZMoW;0?OPk0A8c>IYcCg`@sb;7*0ZbyGXmfOd(FtOmRh+^$er;m-8n@0$< z{JkC7N?5j>3&o-^vEU(i#PHl1V-FBsnlLMhwhay8E|etPDn33ACO@5*a}dg_3R778 z@ttx|OfwVUoi`Wd*Hl$D`Ew*mQq92Z`&N&B@bObd>%2H%mMk`jVK!HF&^+_Cj-Y*;uBlxjt zPT@5D^y$;lkprLqvr#329F}VYu*U*>I#Z@hLDkjOs$W@IiKb4SYPi>9lpzb}?di}s zY`WEXLrY<3=1#+GVFTI#K`>ot zuoPy%pux!LkwwcwQ3w_I*nK&7E0;oQ492onBJ^!dw&R_3g*h2UIhCPOU=-% zzP)gB2aSe9n7$?eaTb?N2b>DOqHbP6m|m`hIC1ISZXSLlFeBfQFmT$EK5=Qp6yR34 zl~@q^eoC~9>U0?#31g?W33C>gz`?(7%E0)wEvn_Ja4DHNt@e^fwOOfWo3tI|f)itMf>WoG`^dyhB3S$dzw%PmX=09t< z8VnhlBv=Y#)ivV<2NU)UNd*N3XvvZ#X#Du`rnsUg>8^R35-^EP(lzfnbQZyl47mOg zPiI}NRPJnd3rW|?BadoP=xUH|R#sO`sw=D1(Q~tP03Q@ZnyX-iaT4#4k{sU-;ETWS zh9RN4)D(?ooCrfSL(>o~h49fBI3h!*v0=+*);{^R_2ncm~>p4>S~Q)wpep=|lt zU%VA@qtmf4aHi#{C-P8j)s1N*M@3$y1ZGFSK8!|~cT#MghVj$K4kPw@WBJu9;WH;o zgeMogI@XY|F~L$ZfY*3Phx?k}w|5^H&Kc9l&z0w|_wT~zXck7xq)EEwXbb0*u2l(R ztC`uUp{1|QL0$Xm*Voh9kKK^~Z=Kkc-0iRrqX)AE|)dtfWT6yp|2 z1UV$IwS07<>0%O()e$XTVQ%@ub3CC~7#y$*w!4wiKEd0*9v^8$_-LafCg5X@ zLGH0e1s`ivn)_HID@3&M!u`1EoJqi_IBQr*)+b0-O?B;TIPlO}LD%b@YXUDT3@tz7G+dC}lO@QfHwLzTJfJa23_JQDO-a&f8 zhpQYgMG~qDXUcMjn@)(^eD^hgH$xRE(Q^uncd^_eD!;h6SS$}@WXXcL8CsS}TiksO zh>93UO}J8mZS3G&YCrc@Lif~QQrZ8Uk z$|Wzo7^thB`r(HkieQlF`|Qq~IfEW~W{q}s}fO}76m7`4mEP*NDn!+3inR>_U(&OQc_e!0ZWME z>mX_zP8LBtJw07Zk0RR^PXcwa|I33>y(T~(pchH03#4M(?lBYA19tan@bV>CdW(gFqfbW< z?2E9Z>x3`pC1%GtoMhaRaBBisDcGn4eetKIlrOHz;T@Z_65NiVMl-&4=%Ea7mw`Mj z^oJA7tW_G7ogCFPN{<#ESLN_d=to;nn$9g>xJs%%F}NFJFJ-~U4af%$=scSv99QMU zqJ{G+#f&cxA7JE(g70O(y9K&3o@;w@c(vjH7R{3bPYB#E1I3tq%;bCXq0x>SC6}~>Sh>?L7ljDF;R}yWiYpejD{ZOEAX_)cxe|F zK$4nxL*0%sXe+s5q8y`4%wF8&1#LuY1~=mibnx}%5dML24>GB=JKSv>5O8W9t|xEW zunv`$Ug4yggUT>X>6HdLtP`aE;19b_X&IZHW_xnz zQf*kf9345h7tMa|x2VTJ?ty+9T^EK6ze9%((XL|?1h|%c?*Fc$aT8_{kS#xqEkONh z;ZIQi!6VR*X3W)S>^^-Ofy+Q#m1B3v`$16vrFHF&Jfd^OxRjqu4&_M4XU`sWlW)}cM^(@( zue^eil9Euy9lZ#OW8aMphg*6mP1lr_=>-~>7w$W71nSXyAj-b?hg$M|WB&;q*z+m! zwTs@SEo&^`dpaOUR=-HA)vUun){y(S6tuFq2o^xMW+^P#TPC}H=in}>rmVCSW)<2Q zIFhT?WRc*xeR2q&So`dgW5l2LM1j!k!Da*b9~pxO(n#F z77W&aQl{k$l-IoV+jCGSMs||z=4b1hOLmz7-tLb#W}Z5JXuQ9!w!4+NV8Rzpsr2YQ zpfhcAiKI1`4@2p5r;lEP11wf$fbPqe*#1Ihzad-QDum9J@pLnvv6D|zZKnZ&z1lKy?8D?Hs*>LhV7{~*HUT#^Z|O2ekllHd_U(z5^5PAA%bq|>jMh1`5({IDHlsdOvj!GqT0`#Je*5INJzS(x%&CNF3Idc$wK3^G_y~3MZ;`m83o6NKv zrzk22Hrt>)P%a~!c){Uj+dTSa8_B3S?}YC7TXDaWC0{<~_xqduF#x6X$+~CL*onEO zR!~X3#lkne6G~^$cAJ{6jrfLb-==1Z(PoE$t&!Npqqal97NO082U{c2$75!}!>9;t zwr`ATMh}m>?HhfTkr35tR06gd6>PH_)$CTIB2~kWfxWeAY;P^tW^avOK{lYe-AfxZ oF+tH;DipD$!cd!~Lb`JQAJg$+oz!!8D*ylh07*qoM6N<$f*;bozW@LL literal 0 HcmV?d00001 diff --git a/pandora_console/include/ajax/audit_log.php b/pandora_console/include/ajax/audit_log.php index c0d1c4f73e..754d679f5b 100644 --- a/pandora_console/include/ajax/audit_log.php +++ b/pandora_console/include/ajax/audit_log.php @@ -58,7 +58,14 @@ if ($save_log_filter) { $values = []; $values['id_name'] = get_parameter('id_name'); $values['text'] = get_parameter('text', ''); - $values['period'] = get_parameter('period', ''); + $values['custom_date'] = get_parameter('custom_date'); + $values['date'] = get_parameter('date'); + $values['date_text'] = get_parameter('date_text'); + $values['date_units'] = get_parameter('date_units'); + $values['date_init'] = get_parameter('date_init'); + $values['time_init'] = get_parameter('time_init'); + $values['date_end'] = get_parameter('date_end'); + $values['time_end'] = get_parameter('time_end'); $values['ip'] = get_parameter('ip', ''); $values['type'] = get_parameter('type', -1); $values['user'] = get_parameter('user', -1); @@ -91,7 +98,14 @@ if ($update_log_filter) { $values = []; $id = get_parameter('id'); $values['text'] = get_parameter('text', ''); - $values['period'] = get_parameter('period', ''); + $values['custom_date'] = get_parameter('custom_date'); + $values['date'] = get_parameter('date'); + $values['date_text'] = get_parameter('date_text'); + $values['date_units'] = get_parameter('date_units'); + $values['date_init'] = get_parameter('date_init'); + $values['time_init'] = get_parameter('time_init'); + $values['date_end'] = get_parameter('date_end'); + $values['time_end'] = get_parameter('time_end'); $values['ip'] = get_parameter('ip', ''); $values['type'] = get_parameter('type', -1); $values['user'] = get_parameter('user', -1); @@ -211,18 +225,42 @@ function load_filter_values() { $.each(data,function(i,value){ if (i == 'text'){ $("#text-filter_text").val(value); - } - if (i == 'period'){ - $("#filter_period").val(value).change(); - } - if (i == 'ip'){ + } else if (i == 'ip'){ $("#text-filter_ip").val(value); - } - if (i == 'type'){ + } else if (i == 'type'){ $("#filter_type").val(value).change(); - } - if (i == 'user'){ + } else if (i == 'user'){ $("#filter_user").val(value).change(); + } else if (i == 'custom_date'){ + $('#hidden-custom_date').val(value).change(); + if ($('#hidden-custom_date').val()==='0'){ + $('#date_default').show(); + $('#date_range').hide(); + $('#date_extend').hide(); + $('#date').val('".SECONDS_1DAY."').trigger('change'); + } else if ($('#hidden-custom_date').val()==='1'){ + $('#date_range').show(); + $('#date_default').hide(); + $('#date_extend').hide(); + } else { + $('#date_range').hide(); + $('#date_default').hide(); + $('#date_extend').show(); + } + } else if (i == 'date'){ + $('#date').val(value).change(); + } else if (i == 'date_end'){ + $('#text-date_end').val(value); + } else if (i == 'date_init'){ + $('#text-date_init').val(value); + } else if (i == 'date_text'){ + $('#text-date_text').val(value); + } else if (i == 'date_units'){ + $('#date_units').val(value).change(); + } else if (i == 'time_end'){ + $('#text-time_end').val(value); + } else if (i == 'time_init'){ + $('#text-time_init').val(value); } }); } @@ -408,7 +446,14 @@ function save_new_filter() { "save_log_filter" : 1, "id_name" : $("#text-id_name").val(), "text" : $("#text-filter_text").val(), - "period" : $("#filter_period :selected").val(), + "custom_date": $('#hidden-custom_date').val(), + "date": $('#date option:selected').val(), + "date_text": $('#text-date_text').val(), + "date_units": $('#date_units option:selected').val(), + "date_init": $('#text-date_init').val(), + "time_init": $('#text-time_init').val(), + "date_end": $('#text-date_end').val(), + "time_end": $('#text-time_end').val(), "ip" : $('#text-filter_ip').val(), "type" : $('#filter_type :selected').val(), "user" : $('#filter_user :selected').val(), @@ -444,7 +489,14 @@ function save_update_filter() { "update_log_filter" : 1, "id" : $("#overwrite_filter :selected").val(), "text" : $("#text-filter_text").val(), - "period" : $("#filter_period :selected").val(), + "custom_date": $('#hidden-custom_date').val(), + "date": $('#date option:selected').val(), + "date_text": $('#text-date_text').val(), + "date_units": $('#date_units option:selected').val(), + "date_init": $('#text-date_init').val(), + "time_init": $('#text-time_init').val(), + "date_end": $('#text-date_end').val(), + "time_end": $('#text-time_end').val(), "ip" : $('#text-filter_ip').val(), "type" : $('#filter_type :selected').val(), "user" : $('#filter_user :selected').val(), diff --git a/pandora_console/include/ajax/module.php b/pandora_console/include/ajax/module.php index 921a1e1bc0..1e529c487c 100755 --- a/pandora_console/include/ajax/module.php +++ b/pandora_console/include/ajax/module.php @@ -1486,27 +1486,53 @@ if (check_login()) { metaconsole_connect($server); } - if ($params['histogram'] === true) { - $params['id_agent_module'] = $params['agent_module_id']; - $params['dinamic_proc'] = 1; + if ($params['enable_projected_period'] === '1') { + $params_graphic = [ + 'period' => $params['period'], + 'date' => strtotime(date('Y-m-d H:i:s')), + 'only_image' => false, + 'homeurl' => ui_get_full_url(false, false, false, false).'/', + 'ttl' => false, + 'height' => $config['graph_image_height'], + 'landscape' => $content['landscape'], + 'return_img_base_64' => true, + ]; + $params_combined = [ + 'projection' => $params['period_projected'], + ]; + + $return['chart'] = graphic_combined_module( + [$params['agent_module_id']], + $params_graphic, + $params_combined + ); $output .= '
'; - if ($params['compare'] === 'separated') { + $output .= $return['chart']; + $output .= '
'; + } else { + if ($params['histogram'] === true) { + $params['id_agent_module'] = $params['agent_module_id']; + $params['dinamic_proc'] = 1; + + $output .= '
'; + if ($params['compare'] === 'separated') { + $graph = \reporting_module_histogram_graph( + ['datetime' => ($params['begin_date'] - $params['period'])], + $params + ); + $output .= $graph['chart']; + } + $graph = \reporting_module_histogram_graph( - ['datetime' => ($params['begin_date'] - $params['period'])], + ['datetime' => $params['begin_date']], $params ); $output .= $graph['chart']; + $output .= '
'; + } else { + $output .= grafico_modulo_sparse($params); } - - $graph = \reporting_module_histogram_graph( - ['datetime' => $params['begin_date']], - $params - ); - $output .= $graph['chart']; - $output .= '
'; - } else { - $output .= grafico_modulo_sparse($params); } if (is_metaconsole() === true && empty($server_id) === false) { diff --git a/pandora_console/include/class/AuditLog.class.php b/pandora_console/include/class/AuditLog.class.php index f35f4e4e6d..261ffac531 100644 --- a/pandora_console/include/class/AuditLog.class.php +++ b/pandora_console/include/class/AuditLog.class.php @@ -201,23 +201,8 @@ class AuditLog extends HTML 'name' => 'filter_text', ], [ - 'label' => __('Max. hours old'), - 'type' => 'select', - 'class' => 'w20px', - 'select2_enable' => true, - 'sort' => false, - 'selected' => 168, - 'fields' => [ - 24 => __('1 day'), - 168 => __('7 days'), - 360 => __('15 days'), - 744 => __('1 month'), - 2160 => __('3 months'), - 4320 => __('6 months'), - 8760 => __('1 Year'), - ], - 'id' => 'filter_period', - 'name' => 'filter_period', + 'label' => __('Date'), + 'type' => 'date_range', ], [ 'label' => __('IP'), @@ -312,10 +297,35 @@ class AuditLog extends HTML $filter .= sprintf(" AND ip_origen LIKE '%%%s%%'", $this->filterIp); } - if (empty($this->filterPeriod) === false) { - $filter .= sprintf(' AND fecha >= DATE_ADD(NOW(), INTERVAL -%d HOUR)', $this->filterPeriod); + // Calculate range dates. + $custom_date = $filters['custom_date']; + if ($custom_date === '1') { + $date_from = ($filters['date_init'].' '.$filters['time_init']); + $date_to = ($filters['date_end'].' '.$filters['time_end']); + } else if ($custom_date === '2') { + $period = ($filters['date_text'] * $filters['date_units']); + $date_to = date('Y-m-d H:i:s'); + $date_from = date('Y-m-d H:i:s', (strtotime($date_to) - $period)); + } else if (in_array($filters['date'], ['this_week', 'this_month', 'past_week', 'past_month'])) { + if ($filters['date'] === 'this_week') { + $date_from = date('Y-m-d 00:00:00', strtotime('last monday')); + $date_to = date('Y-m-d 23:59:59', strtotime($date_from.' +6 days')); + } else if ($filters['date'] === 'this_month') { + $date_from = date('Y-m-d 23:59:59', strtotime('first day of this month')); + $date_to = date('Y-m-d 00:00:00', strtotime('last day of this month')); + } else if ($filters['date'] === 'past_month') { + $date_from = date('Y-m-d 00:00:00', strtotime('first day of previous month')); + $date_to = date('Y-m-d 23:59:59', strtotime('last day of previous month')); + } else if ($filters['date'] === 'past_week') { + $date_from = date('Y-m-d 00:00:00', strtotime('monday', strtotime('last week'))); + $date_to = date('Y-m-d 23:59:59', strtotime('sunday', strtotime('last week'))); + } + } else { + $date_to = date('Y-m-d H:i:s'); + $date_from = date('Y-m-d H:i:s', (strtotime($date_to) - $filters['date'])); } + $filter .= sprintf(' AND fecha BETWEEN "%s" AND "%s"', $date_from, $date_to); $count = (int) db_get_value_sql(sprintf('SELECT COUNT(*) as "total" FROM tsesion WHERE %s', $filter)); if ($length !== '-1') { diff --git a/pandora_console/include/class/SnmpConsole.class.php b/pandora_console/include/class/SnmpConsole.class.php index 4a2c32de2e..86132d3956 100644 --- a/pandora_console/include/class/SnmpConsole.class.php +++ b/pandora_console/include/class/SnmpConsole.class.php @@ -549,6 +549,11 @@ class SnmpConsole extends HTML $order = get_datatable_order(true); $filters = get_parameter('filter', []); + // Build ranges. + $now_timestamp = time(); + $interval_seconds = ($filters['filter_hours_ago'] * 3600); + $ago_timestamp = ($now_timestamp - $interval_seconds); + // Build ranges. $now = new DateTime(); $ago = new DateTime(); @@ -688,7 +693,7 @@ class SnmpConsole extends HTML if ($date_from_trap != '') { if ($time_from_trap != '') { $whereSubquery .= ' - AND (UNIX_TIMESTAMP(timestamp) > UNIX_TIMESTAMP("'.$date_from_trap.' '.$time_from_trap.'")) + AND (utimestamp > '.$ago_timestamp.') '; } else { $whereSubquery .= ' @@ -700,7 +705,7 @@ class SnmpConsole extends HTML if ($date_to_trap != '') { if ($time_to_trap) { $whereSubquery .= ' - AND (UNIX_TIMESTAMP(timestamp) < UNIX_TIMESTAMP("'.$date_to_trap.' '.$time_to_trap.'")) + AND (utimestamp < '.$now_timestamp.') '; } else { $whereSubquery .= ' diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index 47631474c7..ec8dc69f48 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 = 'PC230831'; +$build_version = 'PC230907'; $pandora_version = 'v7.0NG.773.3'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/include/functions_config.php b/pandora_console/include/functions_config.php index 033b2067b6..9bda03f8fd 100644 --- a/pandora_console/include/functions_config.php +++ b/pandora_console/include/functions_config.php @@ -1168,6 +1168,10 @@ function config_update_config() $error_update[] = __('Custom title header'); } + if (config_update_value('datepicker_first_day', (string) get_parameter('datepicker_first_day'), true) === false) { + $error_update[] = __('Datepicker first day'); + } + if (config_update_value('custom_subtitle_header', (string) get_parameter('custom_subtitle_header'), true) === false) { $error_update[] = __('Custom subtitle header'); } @@ -2751,6 +2755,10 @@ function config_process_config() config_update_value('custom_title_header', __('Pandora FMS')); } + if (!isset($config['datepicker_first_day'])) { + config_update_value('datepicker_first_day', '0'); + } + if (!isset($config['custom_subtitle_header'])) { config_update_value('custom_subtitle_header', __('the Flexible Monitoring System')); } diff --git a/pandora_console/include/functions_filemanager.php b/pandora_console/include/functions_filemanager.php index 50ca449123..aee3d88730 100644 --- a/pandora_console/include/functions_filemanager.php +++ b/pandora_console/include/functions_filemanager.php @@ -125,9 +125,22 @@ function upload_file($upload_file_or_zip, $default_real_directory, $destination_ if (isset($_FILES['file']) === true && empty($_FILES['file']['name']) === false) { $filename = $_FILES['file']['name']; $real_directory = filemanager_safe_directory($destination_directory); - $umask = io_safe_output((string) get_parameter('umask')); + $extension = pathinfo($filename, PATHINFO_EXTENSION); - if (strpos($real_directory, $default_real_directory) !== 0) { + $umask = io_safe_output((string) get_parameter('umask')); + $parse_all_queries = explode('&', parse_url($_SERVER['HTTP_REFERER'], PHP_URL_QUERY)); + $parse_sec2_query = explode('=', $parse_all_queries[1]); + $check_extension = true; + if ($parse_sec2_query[1] === 'operation/snmpconsole/snmp_mib_uploader') { + if ((strtolower($extension) !== 'mib' && strtolower($extension) !== 'zip')) { + $check_extension = false; + } else { + $check_extension = true; + } + } + + // (strtolower($extension) !== 'mib' && strtolower($extension) !== 'zip') + if (strpos($real_directory, $default_real_directory) !== 0 || $check_extension === false) { // Perform security check to determine whether received upload // directory is part of the default path for caller uploader and // user is not trying to access an external path (avoid @@ -177,14 +190,31 @@ function upload_file($upload_file_or_zip, $default_real_directory, $destination_ // Upload zip. if ($upload_zip === true) { + $parse_all_queries = explode('&', parse_url($_SERVER['HTTP_REFERER'], PHP_URL_QUERY)); + $parse_sec2_query = explode('=', $parse_all_queries[1]); if (isset($_FILES['file']) === true && empty($_FILES['file']['name']) === false ) { $filename = $_FILES['file']['name']; $filepath = $_FILES['file']['tmp_name']; $real_directory = filemanager_safe_directory($destination_directory); + $secure = true; + if ($parse_sec2_query[1] === 'operation/snmpconsole/snmp_mib_uploader') { + // Security control structure. + $zip = new \ZipArchive; + if ($zip->open($filepath) === true) { + for ($i = 0; $i < $zip->numFiles; $i++) { + $unzip_filename = $zip->getNameIndex($i); + $extension = pathinfo($unzip_filename, PATHINFO_EXTENSION); + if (strtolower($extension) !== 'mib') { + $secure = false; + break; + } + } + } + } - if (strpos($real_directory, $default_real_directory) !== 0) { + if (strpos($real_directory, $default_real_directory) !== 0 || $secure === false) { // Perform security check to determine whether received upload // directory is part of the default path for caller uploader // and user is not trying to access an external path (avoid diff --git a/pandora_console/include/functions_html.php b/pandora_console/include/functions_html.php index 1b20cdfc3c..3d8eb231b9 100644 --- a/pandora_console/include/functions_html.php +++ b/pandora_console/include/functions_html.php @@ -7228,6 +7228,298 @@ function html_print_code_picker( } +function html_print_select_date_range( + $name, + $return, + $selected=SECONDS_1DAY, + $date_init='', + $time_init='', + $date_end='', + $time_end='', + $date_text=SECONDS_1DAY, + $class='w100p' +) { + global $config; + + if ($selected === 'custom') { + $display_extend = ''; + $display_range = 'style="display:none"'; + $display_default = 'style="display:none"'; + $custom_date = 2; + } else if ($selected === 'chose_range') { + $display_range = ''; + $display_default = 'style="display:none"'; + $display_extend = 'style="display:none"'; + $custom_date = 1; + } else { + $display_default = ''; + $display_range = 'style="display:none"'; + $display_extend = 'style="display:none"'; + $custom_date = 0; + } + + if ($date_end === '') { + $date_end = date('Y/m/d'); + } + + if ($date_init === '') { + $date_init = date('Y/m/d', strtotime($date_end.' -1 days')); + } + + if ($time_init === '') { + $time_init = date('H:i:s'); + } + + if ($time_end === '') { + $time_end = date('H:i:s'); + } + + $fields[SECONDS_1DAY] = __('Last 24hr'); + $fields['this_week'] = __('This week'); + $fields['this_month'] = __('This month'); + $fields['past_week'] = __('Past week'); + $fields['past_month'] = __('Past month'); + $fields[SECONDS_1WEEK] = __('Last 7 days'); + $fields[SECONDS_15DAYS] = __('Last 15 days'); + $fields[SECONDS_1MONTH] = __('Last 30 days'); + $fields['custom'] = __('Custom'); + $fields['chose_range'] = __('Chose start/end date period'); + + $output = html_print_input_hidden('custom_date', $custom_date, true); + $output .= '
'; + $output .= html_print_select( + $fields, + $name, + $selected, + '', + '', + 0, + true, + false, + false, + $class + ); + $output .= '
'; + $output .= '
'; + $table = new stdClass(); + $table->class = 'table-adv-filter'; + $table->data[0][0] .= '
'.__('From').':
'; + $table->data[0][0] .= html_print_input_text('date_init', $date_init, '', 12, 10, true).' '; + $table->data[0][0] .= html_print_input_text('time_init', $time_init, '', 10, 7, true).' '; + $table->data[0][0] .= '
'; + $table->data[0][0] .= '
'.__('to').':
'; + $table->data[0][0] .= html_print_input_text('date_end', $date_end, '', 12, 10, true).' '; + $table->data[0][0] .= '
'; + $table->data[0][0] .= html_print_input_text('time_end', $time_end, '', 10, 7, true).' '; + $table->data[0][0] .= ' '.html_print_image( + 'images/logs@svg.svg', + true, + [ + 'id' => 'back_default', + 'class' => ' main_menu_icon invert_filter', + 'alt' => __('List'), + 'title' => __('List'), + 'style' => 'width: 18px;', + ] + ).''; + $table->data[0][0] .= '
'; + $output .= html_print_table($table, true); + $output .= '
'; + + $units = [ + 1 => __('seconds'), + SECONDS_1MINUTE => __('minutes'), + SECONDS_1HOUR => __('hours'), + SECONDS_1DAY => __('days'), + SECONDS_1WEEK => __('weeks'), + SECONDS_1MONTH => __('months'), + SECONDS_1YEAR => __('years'), + ]; + $output .= '
'; + $output .= html_print_input_text($name.'_text', $date_text, '', false, 255, true); + $output .= html_print_select( + $units, + $name.'_units', + '1', + '', + '', + 0, + true, + false, + false, + '', + false, + ' margin-left: 5px; width: 140px;', + false, + false, + false, + '', + false, + false, + false, + false, + false + ); + $output .= ' '.html_print_image( + 'images/logs@svg.svg', + true, + [ + 'id' => 'back_default_extend', + 'class' => $name.'_toggler main_menu_icon invert_filter', + 'alt' => __('List'), + 'title' => __('List'), + 'style' => 'width: 18px;margin-bottom: -5px; padding-top: 10px;', + ] + ).''; + $output .= '
'; + ui_include_time_picker(); + ui_require_jquery_file('ui.datepicker-'.get_user_language(), 'include/javascript/i18n/'); + $output .= ""; + + if ($return === true) { + return $output; + } else { + echo $output; + } + +} + + function html_print_wizard_diagnosis( $title, $id_button, @@ -7266,4 +7558,5 @@ function html_print_wizard_diagnosis( } else { echo $output; } + } \ No newline at end of file diff --git a/pandora_console/include/functions_inventory.php b/pandora_console/include/functions_inventory.php index 89fe0da71e..8e69da7445 100644 --- a/pandora_console/include/functions_inventory.php +++ b/pandora_console/include/functions_inventory.php @@ -31,6 +31,7 @@ function inventory_get_data( $agents_ids, $inventory_module_name, $utimestamp, + $period, $inventory_search_string='', $export_csv=false, $return_mode=false, @@ -97,7 +98,7 @@ function inventory_get_data( // Prepare pagination. $url = sprintf( - '?sec=estado&sec2=operation/inventory/inventory&agent_id=%s&agent=%s&id_group=%s&export=%s&module_inventory_general_view=%s&search_string=%s&utimestamp=%s&order_by_agent=%s&submit_filter=%d', + '?sec=estado&sec2=operation/inventory/inventory&agent_id=%s&agent=%s&id_group=%s&export=%s&module_inventory_general_view=%s&search_string=%s&utimestamp=%s&period=%s&order_by_agent=%s&submit_filter=%d', $pagination_url_parameters['inventory_id_agent'], $pagination_url_parameters['inventory_agent'], $pagination_url_parameters['inventory_id_group'], @@ -105,6 +106,7 @@ function inventory_get_data( $inventory_module_name, $inventory_search_string, $utimestamp, + $period, $order_by_agent, 1 ); @@ -328,7 +330,7 @@ function inventory_get_data( $timestamp = db_get_value_sql( "SELECT timestamp FROM tagente_datos_inventory - WHERE utimestamp = $utimestamp" + WHERE utimestamp BETWEEN '".($utimestamp - $period)."' AND '".$utimestamp."'" ); } else { $timestamp = db_get_value_sql( @@ -892,6 +894,14 @@ function get_data_basic_info_sql($params, $count=false) ); } + if ($params['utimestamp'] > 0 && $count === false) { + $where .= sprintf( + ' AND utimestamp BETWEEN %d AND %d', + ($params['utimestamp'] - $params['period']), + $params['utimestamp'] + ); + } + if ($params['order'] > 0) { $str_split = explode(' ', $params['order']); switch ($str_split[0]) { diff --git a/pandora_console/include/functions_menu.php b/pandora_console/include/functions_menu.php index 614c0df43e..a1927bb60a 100644 --- a/pandora_console/include/functions_menu.php +++ b/pandora_console/include/functions_menu.php @@ -143,6 +143,10 @@ function menu_print_menu(&$menu) if (empty($new_msg) === false) { $sec2 = 'operation/messages/message_edit&new_msg='.$new_msg; } + } else if ($sec2 === 'enterprise/godmode/servers/credential_boxes_satellite' + || $sec2 === 'enterprise/godmode/servers/manage_credential_boxes' + ) { + $sec2 = 'enterprise/godmode/servers/list_satellite'; } else { $sec2 = (string) get_parameter('sec2'); } diff --git a/pandora_console/include/functions_ui.php b/pandora_console/include/functions_ui.php index 730f4d77d6..027965e649 100755 --- a/pandora_console/include/functions_ui.php +++ b/pandora_console/include/functions_ui.php @@ -3918,6 +3918,15 @@ function ui_print_datatable(array $parameters) $parameters['startDisabled'] = true; } + $columns_tmp = []; + foreach ($parameters['columns'] as $k_column => $v_column) { + if (isset($parameters['columns'][$k_column]['text']) === true) { + array_push($columns_tmp, $v_column['text']); + } else { + array_push($columns_tmp, $v_column); + } + } + if (!is_array($parameters['order'])) { $order = 0; $direction = 'asc'; @@ -3931,7 +3940,7 @@ function ui_print_datatable(array $parameters) } else { $order = array_search( $parameters['order']['field'], - $parameters['columns'] + $columns_tmp ); if ($order === false) { @@ -3948,7 +3957,7 @@ function ui_print_datatable(array $parameters) foreach ($parameters['no_sortable_columns'] as $key => $find) { $found = array_search( $parameters['no_sortable_columns'][$key], - $parameters['columns'] + $columns_tmp ); if ($found !== false) { @@ -4018,7 +4027,11 @@ function ui_print_datatable(array $parameters) $filter .= '
    '; foreach ($parameters['form']['inputs'] as $input) { - $filter .= html_print_input(($input + ['return' => true]), 'li'); + if ($input['type'] === 'date_range') { + $filter .= '
  • '.html_print_select_date_range('date', true).'
  • '; + } else { + $filter .= html_print_input(($input + ['return' => true]), 'li'); + } } $filter .= '
'; @@ -7100,7 +7113,7 @@ function ui_print_breadcrums($tab_name) * * @return string HTML string with the last comment of the events. */ -function ui_print_comments($comments, $truncate_limit=255) +function ui_print_comments($comment, $truncate_limit=255) { global $config; diff --git a/pandora_console/include/get_file.php b/pandora_console/include/get_file.php index aa9d9fe6dd..679fdad5ad 100644 --- a/pandora_console/include/get_file.php +++ b/pandora_console/include/get_file.php @@ -46,6 +46,18 @@ $hash = get_parameter('hash'); $file_raw = get_parameter('file'); $file = base64_decode(urldecode($file_raw)); +$secure_extension = true; +$extension = pathinfo($file, PATHINFO_EXTENSION); +if ($extension === 'php' || $extension === 'js') { + $secure_extension = false; +} + +$parse_all_queries = explode('&', parse_url($_SERVER['HTTP_REFERER'], PHP_URL_QUERY)); +$parse_sec2_query = explode('=', $parse_all_queries[1]); +$dirname = dirname($file); + +$path_traversal = strpos($file, '../'); + // Avoid possible inifite loop with referer. if (isset($_SERVER['HTTP_ORIGIN']) === false || (isset($_SERVER['HTTP_ORIGIN']) === true && $_SERVER['HTTP_REFERER'] === $_SERVER['HTTP_ORIGIN'].$_SERVER['REQUEST_URI'])) { $refererPath = ui_get_full_url('index.php'); @@ -53,12 +65,13 @@ if (isset($_SERVER['HTTP_ORIGIN']) === false || (isset($_SERVER['HTTP_ORIGIN']) $refererPath = $_SERVER['HTTP_REFERER']; } -if (empty($file) === true || empty($hash) === true || $hash !== md5($file_raw.$config['server_unique_identifier']) || isset($_SERVER['HTTP_REFERER']) === false) { +if (empty($file) === true || empty($hash) === true || $hash !== md5($file_raw.$config['server_unique_identifier']) + || isset($_SERVER['HTTP_REFERER']) === false || $path_traversal !== false || $secure_extension === false +) { $errorMessage = __('Security error. Please contact the administrator.'); } else { $downloadable_file = ''; - $parse_all_queries = explode('&', parse_url($_SERVER['HTTP_REFERER'], PHP_URL_QUERY)); - $parse_sec2_query = explode('=', $parse_all_queries[1]); + // Metaconsole have a route distinct than node. $main_file_manager = (is_metaconsole() === true) ? 'advanced/metasetup' : 'godmode/setup/file_manager'; $main_collections = (is_metaconsole() === true) ? 'advanced/collections' : 'enterprise/godmode/agentes/collections'; @@ -70,7 +83,9 @@ if (empty($file) === true || empty($hash) === true || $hash !== md5($file_raw.$c break; case 'extensions/files_repo': - $downloadable_file = $_SERVER['DOCUMENT_ROOT'].'/pandora_console/attachment/files_repo/'.$file; + $attachment_path = io_safe_output($config['attachment_store']); + $downloadable_file = $attachment_path.'/files_repo/'.$file; + // $downloadable_file = $_SERVER['DOCUMENT_ROOT'].'/pandora_console/attachment/files_repo/'.$file; break; case 'godmode/servers/plugin': @@ -81,6 +96,9 @@ if (empty($file) === true || empty($hash) === true || $hash !== md5($file_raw.$c $downloadable_file = $_SERVER['DOCUMENT_ROOT'].'/pandora_console/attachment/collection/'.$file; break; + case 'godmode/setup/file_manager': + $downloadable_file = ($dirname === 'image') ? $_SERVER['DOCUMENT_ROOT'].'/pandora_console/'.$file : ''; + default: // Wrong action. $downloadable_file = ''; diff --git a/pandora_console/include/graphs/flot/pandora.flot.js b/pandora_console/include/graphs/flot/pandora.flot.js index 37162f5a37..56cd4a71a1 100644 --- a/pandora_console/include/graphs/flot/pandora.flot.js +++ b/pandora_console/include/graphs/flot/pandora.flot.js @@ -943,17 +943,25 @@ function pandoraFlotSlicebar( // Format functions function xFormatter(v) { - // var ct = new Date(); - var ct = new timezoneJS.Date(); - ct.setTimezone(phpTimezone); + var ct; + if (typeof timezoneJS === "undefined") { + ct = new Date(); + } else { + ct = new timezoneJS.Date(); + ct.setTimezone(phpTimezone); + } var currentTime = ct.getTime(); var diffDates = (currentTime - 1000 * datelimit) / 1000; - // var d = new Date(1000 * (v + datelimit)); - var d = new timezoneJS.Date(1000 * (v + datelimit)); - d.setTimezone(phpTimezone); + var d; + if (typeof timezoneJS === "undefined") { + d = new Date(1000 * (v + datelimit)); + } else { + d = new timezoneJS.Date(1000 * (v + datelimit)); + d.setTimezone(phpTimezone); + } var monthNames = [ "Jan", diff --git a/pandora_console/include/graphs/functions_d3.php b/pandora_console/include/graphs/functions_d3.php index 498602a1d1..5bfd03d244 100644 --- a/pandora_console/include/graphs/functions_d3.php +++ b/pandora_console/include/graphs/functions_d3.php @@ -83,7 +83,7 @@ function d3_relationship_graph($elements, $matrix, $width=700, $return=false, $h } -function d3_tree_map_graph($data, $width=700, $height=700, $return=false) +function d3_tree_map_graph($data, $width=700, $height=700, $return=false, $id_container='tree_map', $child_links=false) { global $config; @@ -91,7 +91,7 @@ function d3_tree_map_graph($data, $width=700, $height=700, $return=false) $data = json_encode($data); } - $output = "
"; + $output = '
"; $output .= include_javascript_d3(true); $output .= ''; $output .= ""; + if ($child_links === true) { + $output .= html_print_input_image( + 'resize_parent', + '/images/normal_screen.png', + 1, + 'background-color: white !important; padding: 4px !important;', + true, + ['class' => 'resize_button invisible'] + ); + } if (!$return) { echo $output; diff --git a/pandora_console/include/graphs/pandora.d3.js b/pandora_console/include/graphs/pandora.d3.js index f99f0448da..881899a1df 100644 --- a/pandora_console/include/graphs/pandora.d3.js +++ b/pandora_console/include/graphs/pandora.d3.js @@ -402,18 +402,24 @@ function chordDiagram(recipient, elements, matrix, width, height) { // } // ] // }; -function treeMap(recipient, data, width, height) { +function treeMap(recipient, data, width, height, childLinks = false) { //var isIE = BrowserDetect.browser == 'Explorer'; var isIE = true; var chartWidth = width; var chartHeight = height; - var consoleStyle = document.getElementById("hidden-selected_style_theme") - .value; - $("#tooltip").css( + const uniqueId = generateUniqueId(); + if (document.getElementById("hidden-selected_style_theme") !== null) { + var consoleStyle = document.getElementById("hidden-selected_style_theme") + .value; + } else { + var consoleStyle = ""; + } + + $("#tooltip_" + uniqueId).css( "color", consoleStyle === "pandora_black" ? "rgb(240, 240, 240)" : "rgb(0, 0, 0)" ); - $("#tooltip").css( + $("#tooltip_" + uniqueId).css( "background-color", consoleStyle === "pandora_black" ? "rgb(0, 0, 0)" : "rgb(240, 240, 240)" ); @@ -431,6 +437,9 @@ function treeMap(recipient, data, width, height) { var transitionDuration = 500; var root; var node; + var resize_button = $(recipient) + .parent() + .find(".resize_button"); var treemap = d3.layout .treemap() @@ -468,6 +477,7 @@ function treeMap(recipient, data, width, height) { .attr("class", "cell parent") .on("click", function(d) { zoom(d); + resize_button.show(); }) .append("svg") .attr("class", "clip") @@ -476,6 +486,9 @@ function treeMap(recipient, data, width, height) { }) .attr("height", headerHeight); parentEnterTransition + .filter(function(d) { + if (d.name) return d; + }) .append("rect") .attr("width", function(d) { return Math.max(0.01, d.dx); @@ -483,6 +496,9 @@ function treeMap(recipient, data, width, height) { .attr("height", headerHeight) .style("fill", headerColor); parentEnterTransition + .filter(function(d) { + if (d.name) return d; + }) .append("text") .attr("class", "label") .attr("fill", "white") @@ -490,6 +506,7 @@ function treeMap(recipient, data, width, height) { .attr("width", function(d) { return Math.max(0.01, d.dx); }) + .attr("style", "transition: all 0.5s ease-out;") .attr("height", headerHeight) .text(function(d) { return d.name; @@ -521,6 +538,10 @@ function treeMap(recipient, data, width, height) { // remove transition parentCells.exit().remove(); + $(resize_button).on("click", function() { + zoom(root); + $(this).hide(); + }); // create children cells var childrenCells = chart .selectAll("g.cell.child") @@ -534,19 +555,27 @@ function treeMap(recipient, data, width, height) { .append("g") .attr("class", "cell child") .on("click", function(d) { - zoom(node === d.parent ? root : d.parent); + if (childLinks) { + if (node === d.parent) { + window.location.href = d.link; + } else { + resize_button.show(); + zoom(d.parent); + } + } else { + zoom(node === d.parent ? root : d.parent); + } }) - .on("mouseover", over_user) - .on("mouseout", out_user) - .on("mousemove", move_tooltip) .append("svg") .attr("class", "clip"); - + $(recipient).on("mouseover", over_user); + $(recipient).on("mouseout", out_user); + $(recipient).on("mousemove", move_tooltip); childEnterTransition .append("rect") .classed("background", true) .style("fill", function(d) { - return color(d.name); + return d.color ? d.color : color(d.name); }); childEnterTransition @@ -608,6 +637,30 @@ function treeMap(recipient, data, width, height) { zoom(node); + function calculateSizeText() { + $(recipient + " .parent .clip .label").each((key, node) => { + const textElement = node; + const containerWidth = parseFloat( + $(textElement) + .parent() + .attr("width") + ); + const originalFontSize = 12; + + textElement.style.fontSize = "16px"; + const computedTextLength = textElement.getComputedTextLength(); + const textWidth = computedTextLength + 8; + textElement.style.fontSize = originalFontSize + "px"; + + const scaleFactor = containerWidth / textWidth; + let scaledFontSize = parseFloat(originalFontSize) * scaleFactor; + + scaledFontSize = scaledFontSize > 12 ? 12 : scaledFontSize; + + textElement.style.fontSize = scaledFontSize + "px"; + }); + } + function size(d) { return d.size; } @@ -728,6 +781,9 @@ function treeMap(recipient, data, width, height) { if (d3.event) { d3.event.stopPropagation(); } + setTimeout(() => { + calculateSizeText(); + }, transitionDuration); } function position() { @@ -746,11 +802,10 @@ function treeMap(recipient, data, width, height) { } function move_tooltip(d) { - x = d3.event.pageX + 10; - y = d3.event.pageY + 10; - - $("#tooltip").css("left", x + "px"); - $("#tooltip").css("top", y + "px"); + x = d.offsetX + 40; + y = d.offsetY + 40; + $("#tooltip_" + uniqueId).css("left", x + "px"); + $("#tooltip_" + uniqueId).css("top", y + "px"); } function over_user(d) { @@ -772,17 +827,17 @@ function treeMap(recipient, data, width, height) { } function create_tooltip(d, x, y) { - if ($("#tooltip").length == 0) { + if ($("#tooltip_" + uniqueId).length == 0) { $(recipient).append( $("
") - .attr("id", "tooltip") - .html(d.tooltip_content) + .attr("id", "tooltip_" + uniqueId) + .html(d.target.__data__.tooltip_content) ); } else { - $("#tooltip").html(d.tooltip_content); + $("#tooltip_" + uniqueId).html(d.target.__data__.tooltip_content); } - $("#tooltip").attr( + $("#tooltip_" + uniqueId).attr( "style", "background: #fff;" + "color: #111;" + @@ -805,14 +860,22 @@ function treeMap(recipient, data, width, height) { } function show_tooltip(d) { - x = d3.event.pageX + 10; - y = d3.event.pageY + 10; - - create_tooltip(d, x, y); + x = d.offsetX + 10; + y = d.offsetY + 10; + if (d.target.__data__) { + create_tooltip(d, x, y); + } } function hide_tooltip() { - $("#tooltip").hide(); + $("#tooltip_" + uniqueId).hide(); + } + + function generateUniqueId() { + const timestamp = new Date().getTime(); + const randomNum = Math.floor(Math.random() * 10000); + const uniqueId = `${timestamp}-${randomNum}`; + return uniqueId; } } diff --git a/pandora_console/include/javascript/jquery-ui.min.js b/pandora_console/include/javascript/jquery-ui.min.js index 50b036f4d2..c39e5c7792 100644 --- a/pandora_console/include/javascript/jquery-ui.min.js +++ b/pandora_console/include/javascript/jquery-ui.min.js @@ -3,4 +3,4 @@ * Includes: widget.js, position.js, data.js, disable-selection.js, effect.js, effects/effect-blind.js, effects/effect-bounce.js, effects/effect-clip.js, effects/effect-drop.js, effects/effect-explode.js, effects/effect-fade.js, effects/effect-fold.js, effects/effect-highlight.js, effects/effect-puff.js, effects/effect-pulsate.js, effects/effect-scale.js, effects/effect-shake.js, effects/effect-size.js, effects/effect-slide.js, effects/effect-transfer.js, focusable.js, form-reset-mixin.js, jquery-patch.js, keycode.js, labels.js, scroll-parent.js, tabbable.js, unique-id.js, widgets/accordion.js, widgets/autocomplete.js, widgets/button.js, widgets/checkboxradio.js, widgets/controlgroup.js, widgets/datepicker.js, widgets/dialog.js, widgets/draggable.js, widgets/droppable.js, widgets/menu.js, widgets/mouse.js, widgets/progressbar.js, widgets/resizable.js, widgets/selectable.js, widgets/selectmenu.js, widgets/slider.js, widgets/sortable.js, widgets/spinner.js, widgets/tabs.js, widgets/tooltip.js * Copyright jQuery Foundation and other contributors; Licensed MIT */ -!function(t){"use strict";"function"==typeof define&&define.amd?define(["jquery"],t):t(jQuery)}(function(V){"use strict";V.ui=V.ui||{};V.ui.version="1.13.2";var n,i=0,a=Array.prototype.hasOwnProperty,r=Array.prototype.slice;V.cleanData=(n=V.cleanData,function(t){for(var e,i,s=0;null!=(i=t[s]);s++)(e=V._data(i,"events"))&&e.remove&&V(i).triggerHandler("remove");n(t)}),V.widget=function(t,i,e){var s,n,o,a={},r=t.split(".")[0],l=r+"-"+(t=t.split(".")[1]);return e||(e=i,i=V.Widget),Array.isArray(e)&&(e=V.extend.apply(null,[{}].concat(e))),V.expr.pseudos[l.toLowerCase()]=function(t){return!!V.data(t,l)},V[r]=V[r]||{},s=V[r][t],n=V[r][t]=function(t,e){if(!this||!this._createWidget)return new n(t,e);arguments.length&&this._createWidget(t,e)},V.extend(n,s,{version:e.version,_proto:V.extend({},e),_childConstructors:[]}),(o=new i).options=V.widget.extend({},o.options),V.each(e,function(e,s){function n(){return i.prototype[e].apply(this,arguments)}function o(t){return i.prototype[e].apply(this,t)}a[e]="function"==typeof s?function(){var t,e=this._super,i=this._superApply;return this._super=n,this._superApply=o,t=s.apply(this,arguments),this._super=e,this._superApply=i,t}:s}),n.prototype=V.widget.extend(o,{widgetEventPrefix:s&&o.widgetEventPrefix||t},a,{constructor:n,namespace:r,widgetName:t,widgetFullName:l}),s?(V.each(s._childConstructors,function(t,e){var i=e.prototype;V.widget(i.namespace+"."+i.widgetName,n,e._proto)}),delete s._childConstructors):i._childConstructors.push(n),V.widget.bridge(t,n),n},V.widget.extend=function(t){for(var e,i,s=r.call(arguments,1),n=0,o=s.length;n",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=V(e||this.defaultElement||this)[0],this.element=V(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=V(),this.hoverable=V(),this.focusable=V(),this.classesElementLookup={},e!==this&&(V.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=V(e.style?e.ownerDocument:e.document||e),this.window=V(this.document[0].defaultView||this.document[0].parentWindow)),this.options=V.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:V.noop,_create:V.noop,_init:V.noop,destroy:function(){var i=this;this._destroy(),V.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:V.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return V.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=V.widget.extend({},this.options[t]),n=0;n
"),i=e.children()[0];return V("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(k(s),k(n))?o.important="horizontal":o.important="vertical",u.using.call(this,t,o)}),a.offset(V.extend(h,{using:t}))})},V.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,a=s-o,r=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0")[0],w=d.each;function P(t){return null==t?t+"":"object"==typeof t?p[e.call(t)]||"object":typeof t}function M(t,e,i){var s=v[e.type]||{};return null==t?i||!e.def?null:e.def:(t=s.floor?~~t:parseFloat(t),isNaN(t)?e.def:s.mod?(t+s.mod)%s.mod:Math.min(s.max,Math.max(0,t)))}function S(s){var n=m(),o=n._rgba=[];return s=s.toLowerCase(),w(g,function(t,e){var i=e.re.exec(s),i=i&&e.parse(i),e=e.space||"rgba";if(i)return i=n[e](i),n[_[e].cache]=i[_[e].cache],o=n._rgba=i._rgba,!1}),o.length?("0,0,0,0"===o.join()&&d.extend(o,B.transparent),n):B[s]}function H(t,e,i){return 6*(i=(i+1)%1)<1?t+(e-t)*i*6:2*i<1?e:3*i<2?t+(e-t)*(2/3-i)*6:t}y.style.cssText="background-color:rgba(1,1,1,.5)",b.rgba=-1o.mod/2?s+=o.mod:s-n>o.mod/2&&(s-=o.mod)),l[i]=M((n-s)*a+s,e)))}),this[e](l)},blend:function(t){if(1===this._rgba[3])return this;var e=this._rgba.slice(),i=e.pop(),s=m(t)._rgba;return m(d.map(e,function(t,e){return(1-i)*s[e]+i*t}))},toRgbaString:function(){var t="rgba(",e=d.map(this._rgba,function(t,e){return null!=t?t:2").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),e={width:i.width(),height:i.height()},n=document.activeElement;try{n.id}catch(t){n=document.body}return i.wrap(t),i[0]!==n&&!V.contains(i[0],n)||V(n).trigger("focus"),t=i.parent(),"static"===i.css("position")?(t.css({position:"relative"}),i.css({position:"relative"})):(V.extend(s,{position:i.css("position"),zIndex:i.css("z-index")}),V.each(["top","left","bottom","right"],function(t,e){s[e]=i.css(e),isNaN(parseInt(s[e],10))&&(s[e]="auto")}),i.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})),i.css(e),t.css(s).show()},removeWrapper:function(t){var e=document.activeElement;return t.parent().is(".ui-effects-wrapper")&&(t.parent().replaceWith(t),t[0]!==e&&!V.contains(t[0],e)||V(e).trigger("focus")),t}}),V.extend(V.effects,{version:"1.13.2",define:function(t,e,i){return i||(i=e,e="effect"),V.effects.effect[t]=i,V.effects.effect[t].mode=e,i},scaledDimensions:function(t,e,i){if(0===e)return{height:0,width:0,outerHeight:0,outerWidth:0};var s="horizontal"!==i?(e||100)/100:1,e="vertical"!==i?(e||100)/100:1;return{height:t.height()*e,width:t.width()*s,outerHeight:t.outerHeight()*e,outerWidth:t.outerWidth()*s}},clipToBox:function(t){return{width:t.clip.right-t.clip.left,height:t.clip.bottom-t.clip.top,left:t.clip.left,top:t.clip.top}},unshift:function(t,e,i){var s=t.queue();1").insertAfter(t).css({display:/^(inline|ruby)/.test(t.css("display"))?"inline-block":"block",visibility:"hidden",marginTop:t.css("marginTop"),marginBottom:t.css("marginBottom"),marginLeft:t.css("marginLeft"),marginRight:t.css("marginRight"),float:t.css("float")}).outerWidth(t.outerWidth()).outerHeight(t.outerHeight()).addClass("ui-effects-placeholder"),t.data(j+"placeholder",e)),t.css({position:i,left:s.left,top:s.top}),e},removePlaceholder:function(t){var e=j+"placeholder",i=t.data(e);i&&(i.remove(),t.removeData(e))},cleanUp:function(t){V.effects.restoreStyle(t),V.effects.removePlaceholder(t)},setTransition:function(s,t,n,o){return o=o||{},V.each(t,function(t,e){var i=s.cssUnit(e);0");l.appendTo("body").addClass(t.className).css({top:s.top-a,left:s.left-r,height:i.innerHeight(),width:i.innerWidth(),position:n?"fixed":"absolute"}).animate(o,t.duration,t.easing,function(){l.remove(),"function"==typeof e&&e()})}}),V.fx.step.clip=function(t){t.clipInit||(t.start=V(t.elem).cssClip(),"string"==typeof t.end&&(t.end=G(t.end,t.elem)),t.clipInit=!0),V(t.elem).cssClip({top:t.pos*(t.end.top-t.start.top)+t.start.top,right:t.pos*(t.end.right-t.start.right)+t.start.right,bottom:t.pos*(t.end.bottom-t.start.bottom)+t.start.bottom,left:t.pos*(t.end.left-t.start.left)+t.start.left})},Y={},V.each(["Quad","Cubic","Quart","Quint","Expo"],function(e,t){Y[t]=function(t){return Math.pow(t,e+2)}}),V.extend(Y,{Sine:function(t){return 1-Math.cos(t*Math.PI/2)},Circ:function(t){return 1-Math.sqrt(1-t*t)},Elastic:function(t){return 0===t||1===t?t:-Math.pow(2,8*(t-1))*Math.sin((80*(t-1)-7.5)*Math.PI/15)},Back:function(t){return t*t*(3*t-2)},Bounce:function(t){for(var e,i=4;t<((e=Math.pow(2,--i))-1)/11;);return 1/Math.pow(4,3-i)-7.5625*Math.pow((3*e-2)/22-t,2)}}),V.each(Y,function(t,e){V.easing["easeIn"+t]=e,V.easing["easeOut"+t]=function(t){return 1-e(1-t)},V.easing["easeInOut"+t]=function(t){return t<.5?e(2*t)/2:1-e(-2*t+2)/2}});y=V.effects,V.effects.define("blind","hide",function(t,e){var i={up:["bottom","top"],vertical:["bottom","top"],down:["top","bottom"],left:["right","left"],horizontal:["right","left"],right:["left","right"]},s=V(this),n=t.direction||"up",o=s.cssClip(),a={clip:V.extend({},o)},r=V.effects.createPlaceholder(s);a.clip[i[n][0]]=a.clip[i[n][1]],"show"===t.mode&&(s.cssClip(a.clip),r&&r.css(V.effects.clipToBox(a)),a.clip=o),r&&r.animate(V.effects.clipToBox(a),t.duration,t.easing),s.animate(a,{queue:!1,duration:t.duration,easing:t.easing,complete:e})}),V.effects.define("bounce",function(t,e){var i,s,n=V(this),o=t.mode,a="hide"===o,r="show"===o,l=t.direction||"up",h=t.distance,c=t.times||5,o=2*c+(r||a?1:0),u=t.duration/o,d=t.easing,p="up"===l||"down"===l?"top":"left",f="up"===l||"left"===l,g=0,t=n.queue().length;for(V.effects.createPlaceholder(n),l=n.css(p),h=h||n["top"==p?"outerHeight":"outerWidth"]()/3,r&&((s={opacity:1})[p]=l,n.css("opacity",0).css(p,f?2*-h:2*h).animate(s,u,d)),a&&(h/=Math.pow(2,c-1)),(s={})[p]=l;g").css({position:"absolute",visibility:"visible",left:-s*p,top:-i*f}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:p,height:f,left:n+(u?a*p:0),top:o+(u?r*f:0),opacity:u?0:1}).animate({left:n+(u?0:a*p),top:o+(u?0:r*f),opacity:u?1:0},t.duration||500,t.easing,m)}),V.effects.define("fade","toggle",function(t,e){var i="show"===t.mode;V(this).css("opacity",i?0:1).animate({opacity:i?1:0},{queue:!1,duration:t.duration,easing:t.easing,complete:e})}),V.effects.define("fold","hide",function(e,t){var i=V(this),s=e.mode,n="show"===s,o="hide"===s,a=e.size||15,r=/([0-9]+)%/.exec(a),l=!!e.horizFirst?["right","bottom"]:["bottom","right"],h=e.duration/2,c=V.effects.createPlaceholder(i),u=i.cssClip(),d={clip:V.extend({},u)},p={clip:V.extend({},u)},f=[u[l[0]],u[l[1]]],s=i.queue().length;r&&(a=parseInt(r[1],10)/100*f[o?0:1]),d.clip[l[0]]=a,p.clip[l[0]]=a,p.clip[l[1]]=0,n&&(i.cssClip(p.clip),c&&c.css(V.effects.clipToBox(p)),p.clip=u),i.queue(function(t){c&&c.animate(V.effects.clipToBox(d),h,e.easing).animate(V.effects.clipToBox(p),h,e.easing),t()}).animate(d,h,e.easing).animate(p,h,e.easing).queue(t),V.effects.unshift(i,s,4)}),V.effects.define("highlight","show",function(t,e){var i=V(this),s={backgroundColor:i.css("backgroundColor")};"hide"===t.mode&&(s.opacity=0),V.effects.saveStyle(i),i.css({backgroundImage:"none",backgroundColor:t.color||"#ffff99"}).animate(s,{queue:!1,duration:t.duration,easing:t.easing,complete:e})}),V.effects.define("size",function(s,e){var n,i=V(this),t=["fontSize"],o=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],a=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],r=s.mode,l="effect"!==r,h=s.scale||"both",c=s.origin||["middle","center"],u=i.css("position"),d=i.position(),p=V.effects.scaledDimensions(i),f=s.from||p,g=s.to||V.effects.scaledDimensions(i,0);V.effects.createPlaceholder(i),"show"===r&&(r=f,f=g,g=r),n={from:{y:f.height/p.height,x:f.width/p.width},to:{y:g.height/p.height,x:g.width/p.width}},"box"!==h&&"both"!==h||(n.from.y!==n.to.y&&(f=V.effects.setTransition(i,o,n.from.y,f),g=V.effects.setTransition(i,o,n.to.y,g)),n.from.x!==n.to.x&&(f=V.effects.setTransition(i,a,n.from.x,f),g=V.effects.setTransition(i,a,n.to.x,g))),"content"!==h&&"both"!==h||n.from.y!==n.to.y&&(f=V.effects.setTransition(i,t,n.from.y,f),g=V.effects.setTransition(i,t,n.to.y,g)),c&&(c=V.effects.getBaseline(c,p),f.top=(p.outerHeight-f.outerHeight)*c.y+d.top,f.left=(p.outerWidth-f.outerWidth)*c.x+d.left,g.top=(p.outerHeight-g.outerHeight)*c.y+d.top,g.left=(p.outerWidth-g.outerWidth)*c.x+d.left),delete f.outerHeight,delete f.outerWidth,i.css(f),"content"!==h&&"both"!==h||(o=o.concat(["marginTop","marginBottom"]).concat(t),a=a.concat(["marginLeft","marginRight"]),i.find("*[width]").each(function(){var t=V(this),e=V.effects.scaledDimensions(t),i={height:e.height*n.from.y,width:e.width*n.from.x,outerHeight:e.outerHeight*n.from.y,outerWidth:e.outerWidth*n.from.x},e={height:e.height*n.to.y,width:e.width*n.to.x,outerHeight:e.height*n.to.y,outerWidth:e.width*n.to.x};n.from.y!==n.to.y&&(i=V.effects.setTransition(t,o,n.from.y,i),e=V.effects.setTransition(t,o,n.to.y,e)),n.from.x!==n.to.x&&(i=V.effects.setTransition(t,a,n.from.x,i),e=V.effects.setTransition(t,a,n.to.x,e)),l&&V.effects.saveStyle(t),t.css(i),t.animate(e,s.duration,s.easing,function(){l&&V.effects.restoreStyle(t)})})),i.animate(g,{queue:!1,duration:s.duration,easing:s.easing,complete:function(){var t=i.offset();0===g.opacity&&i.css("opacity",f.opacity),l||(i.css("position","static"===u?"relative":u).offset(t),V.effects.saveStyle(i)),e()}})}),V.effects.define("scale",function(t,e){var i=V(this),s=t.mode,s=parseInt(t.percent,10)||(0===parseInt(t.percent,10)||"effect"!==s?0:100),s=V.extend(!0,{from:V.effects.scaledDimensions(i),to:V.effects.scaledDimensions(i,s,t.direction||"both"),origin:t.origin||["middle","center"]},t);t.fade&&(s.from.opacity=1,s.to.opacity=0),V.effects.effect.size.call(this,s,e)}),V.effects.define("puff","hide",function(t,e){t=V.extend(!0,{},t,{fade:!0,percent:parseInt(t.percent,10)||150});V.effects.effect.scale.call(this,t,e)}),V.effects.define("pulsate","show",function(t,e){var i=V(this),s=t.mode,n="show"===s,o=2*(t.times||5)+(n||"hide"===s?1:0),a=t.duration/o,r=0,l=1,s=i.queue().length;for(!n&&i.is(":visible")||(i.css("opacity",0).show(),r=1);l li > :first-child").add(t.find("> :not(li)").even())},heightStyle:"auto",icons:{activeHeader:"ui-icon-triangle-1-s",header:"ui-icon-triangle-1-e"},activate:null,beforeActivate:null},hideProps:{borderTopWidth:"hide",borderBottomWidth:"hide",paddingTop:"hide",paddingBottom:"hide",height:"hide"},showProps:{borderTopWidth:"show",borderBottomWidth:"show",paddingTop:"show",paddingBottom:"show",height:"show"},_create:function(){var t=this.options;this.prevShow=this.prevHide=V(),this._addClass("ui-accordion","ui-widget ui-helper-reset"),this.element.attr("role","tablist"),t.collapsible||!1!==t.active&&null!=t.active||(t.active=0),this._processPanels(),t.active<0&&(t.active+=this.headers.length),this._refresh()},_getCreateEventData:function(){return{header:this.active,panel:this.active.length?this.active.next():V()}},_createIcons:function(){var t,e=this.options.icons;e&&(t=V(""),this._addClass(t,"ui-accordion-header-icon","ui-icon "+e.header),t.prependTo(this.headers),t=this.active.children(".ui-accordion-header-icon"),this._removeClass(t,e.header)._addClass(t,null,e.activeHeader)._addClass(this.headers,"ui-accordion-icons"))},_destroyIcons:function(){this._removeClass(this.headers,"ui-accordion-icons"),this.headers.children(".ui-accordion-header-icon").remove()},_destroy:function(){var t;this.element.removeAttr("role"),this.headers.removeAttr("role aria-expanded aria-selected aria-controls tabIndex").removeUniqueId(),this._destroyIcons(),t=this.headers.next().css("display","").removeAttr("role aria-hidden aria-labelledby").removeUniqueId(),"content"!==this.options.heightStyle&&t.css("height","")},_setOption:function(t,e){"active"!==t?("event"===t&&(this.options.event&&this._off(this.headers,this.options.event),this._setupEvents(e)),this._super(t,e),"collapsible"!==t||e||!1!==this.options.active||this._activate(0),"icons"===t&&(this._destroyIcons(),e&&this._createIcons())):this._activate(e)},_setOptionDisabled:function(t){this._super(t),this.element.attr("aria-disabled",t),this._toggleClass(null,"ui-state-disabled",!!t),this._toggleClass(this.headers.add(this.headers.next()),null,"ui-state-disabled",!!t)},_keydown:function(t){if(!t.altKey&&!t.ctrlKey){var e=V.ui.keyCode,i=this.headers.length,s=this.headers.index(t.target),n=!1;switch(t.keyCode){case e.RIGHT:case e.DOWN:n=this.headers[(s+1)%i];break;case e.LEFT:case e.UP:n=this.headers[(s-1+i)%i];break;case e.SPACE:case e.ENTER:this._eventHandler(t);break;case e.HOME:n=this.headers[0];break;case e.END:n=this.headers[i-1]}n&&(V(t.target).attr("tabIndex",-1),V(n).attr("tabIndex",0),V(n).trigger("focus"),t.preventDefault())}},_panelKeyDown:function(t){t.keyCode===V.ui.keyCode.UP&&t.ctrlKey&&V(t.currentTarget).prev().trigger("focus")},refresh:function(){var t=this.options;this._processPanels(),!1===t.active&&!0===t.collapsible||!this.headers.length?(t.active=!1,this.active=V()):!1===t.active?this._activate(0):this.active.length&&!V.contains(this.element[0],this.active[0])?this.headers.length===this.headers.find(".ui-state-disabled").length?(t.active=!1,this.active=V()):this._activate(Math.max(0,t.active-1)):t.active=this.headers.index(this.active),this._destroyIcons(),this._refresh()},_processPanels:function(){var t=this.headers,e=this.panels;"function"==typeof this.options.header?this.headers=this.options.header(this.element):this.headers=this.element.find(this.options.header),this._addClass(this.headers,"ui-accordion-header ui-accordion-header-collapsed","ui-state-default"),this.panels=this.headers.next().filter(":not(.ui-accordion-content-active)").hide(),this._addClass(this.panels,"ui-accordion-content","ui-helper-reset ui-widget-content"),e&&(this._off(t.not(this.headers)),this._off(e.not(this.panels)))},_refresh:function(){var i,t=this.options,e=t.heightStyle,s=this.element.parent();this.active=this._findActive(t.active),this._addClass(this.active,"ui-accordion-header-active","ui-state-active")._removeClass(this.active,"ui-accordion-header-collapsed"),this._addClass(this.active.next(),"ui-accordion-content-active"),this.active.next().show(),this.headers.attr("role","tab").each(function(){var t=V(this),e=t.uniqueId().attr("id"),i=t.next(),s=i.uniqueId().attr("id");t.attr("aria-controls",s),i.attr("aria-labelledby",e)}).next().attr("role","tabpanel"),this.headers.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}).next().attr({"aria-hidden":"true"}).hide(),this.active.length?this.active.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}).next().attr({"aria-hidden":"false"}):this.headers.eq(0).attr("tabIndex",0),this._createIcons(),this._setupEvents(t.event),"fill"===e?(i=s.height(),this.element.siblings(":visible").each(function(){var t=V(this),e=t.css("position");"absolute"!==e&&"fixed"!==e&&(i-=t.outerHeight(!0))}),this.headers.each(function(){i-=V(this).outerHeight(!0)}),this.headers.next().each(function(){V(this).height(Math.max(0,i-V(this).innerHeight()+V(this).height()))}).css("overflow","auto")):"auto"===e&&(i=0,this.headers.next().each(function(){var t=V(this).is(":visible");t||V(this).show(),i=Math.max(i,V(this).css("height","").height()),t||V(this).hide()}).height(i))},_activate:function(t){t=this._findActive(t)[0];t!==this.active[0]&&(t=t||this.active[0],this._eventHandler({target:t,currentTarget:t,preventDefault:V.noop}))},_findActive:function(t){return"number"==typeof t?this.headers.eq(t):V()},_setupEvents:function(t){var i={keydown:"_keydown"};t&&V.each(t.split(" "),function(t,e){i[e]="_eventHandler"}),this._off(this.headers.add(this.headers.next())),this._on(this.headers,i),this._on(this.headers.next(),{keydown:"_panelKeyDown"}),this._hoverable(this.headers),this._focusable(this.headers)},_eventHandler:function(t){var e=this.options,i=this.active,s=V(t.currentTarget),n=s[0]===i[0],o=n&&e.collapsible,a=o?V():s.next(),r=i.next(),a={oldHeader:i,oldPanel:r,newHeader:o?V():s,newPanel:a};t.preventDefault(),n&&!e.collapsible||!1===this._trigger("beforeActivate",t,a)||(e.active=!o&&this.headers.index(s),this.active=n?V():s,this._toggle(a),this._removeClass(i,"ui-accordion-header-active","ui-state-active"),e.icons&&(i=i.children(".ui-accordion-header-icon"),this._removeClass(i,null,e.icons.activeHeader)._addClass(i,null,e.icons.header)),n||(this._removeClass(s,"ui-accordion-header-collapsed")._addClass(s,"ui-accordion-header-active","ui-state-active"),e.icons&&(n=s.children(".ui-accordion-header-icon"),this._removeClass(n,null,e.icons.header)._addClass(n,null,e.icons.activeHeader)),this._addClass(s.next(),"ui-accordion-content-active")))},_toggle:function(t){var e=t.newPanel,i=this.prevShow.length?this.prevShow:t.oldPanel;this.prevShow.add(this.prevHide).stop(!0,!0),this.prevShow=e,this.prevHide=i,this.options.animate?this._animate(e,i,t):(i.hide(),e.show(),this._toggleComplete(t)),i.attr({"aria-hidden":"true"}),i.prev().attr({"aria-selected":"false","aria-expanded":"false"}),e.length&&i.length?i.prev().attr({tabIndex:-1,"aria-expanded":"false"}):e.length&&this.headers.filter(function(){return 0===parseInt(V(this).attr("tabIndex"),10)}).attr("tabIndex",-1),e.attr("aria-hidden","false").prev().attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0})},_animate:function(t,i,e){var s,n,o,a=this,r=0,l=t.css("box-sizing"),h=t.length&&(!i.length||t.index()",delay:300,options:{icons:{submenu:"ui-icon-caret-1-e"},items:"> *",menus:"ul",position:{my:"left top",at:"right top"},role:"menu",blur:null,focus:null,select:null},_create:function(){this.activeMenu=this.element,this.mouseHandled=!1,this.lastMousePosition={x:null,y:null},this.element.uniqueId().attr({role:this.options.role,tabIndex:0}),this._addClass("ui-menu","ui-widget ui-widget-content"),this._on({"mousedown .ui-menu-item":function(t){t.preventDefault(),this._activateItem(t)},"click .ui-menu-item":function(t){var e=V(t.target),i=V(V.ui.safeActiveElement(this.document[0]));!this.mouseHandled&&e.not(".ui-state-disabled").length&&(this.select(t),t.isPropagationStopped()||(this.mouseHandled=!0),e.has(".ui-menu").length?this.expand(t):!this.element.is(":focus")&&i.closest(".ui-menu").length&&(this.element.trigger("focus",[!0]),this.active&&1===this.active.parents(".ui-menu").length&&clearTimeout(this.timer)))},"mouseenter .ui-menu-item":"_activateItem","mousemove .ui-menu-item":"_activateItem",mouseleave:"collapseAll","mouseleave .ui-menu":"collapseAll",focus:function(t,e){var i=this.active||this._menuItems().first();e||this.focus(t,i)},blur:function(t){this._delay(function(){V.contains(this.element[0],V.ui.safeActiveElement(this.document[0]))||this.collapseAll(t)})},keydown:"_keydown"}),this.refresh(),this._on(this.document,{click:function(t){this._closeOnDocumentClick(t)&&this.collapseAll(t,!0),this.mouseHandled=!1}})},_activateItem:function(t){var e,i;this.previousFilter||t.clientX===this.lastMousePosition.x&&t.clientY===this.lastMousePosition.y||(this.lastMousePosition={x:t.clientX,y:t.clientY},e=V(t.target).closest(".ui-menu-item"),i=V(t.currentTarget),e[0]===i[0]&&(i.is(".ui-state-active")||(this._removeClass(i.siblings().children(".ui-state-active"),null,"ui-state-active"),this.focus(t,i))))},_destroy:function(){var t=this.element.find(".ui-menu-item").removeAttr("role aria-disabled").children(".ui-menu-item-wrapper").removeUniqueId().removeAttr("tabIndex role aria-haspopup");this.element.removeAttr("aria-activedescendant").find(".ui-menu").addBack().removeAttr("role aria-labelledby aria-expanded aria-hidden aria-disabled tabIndex").removeUniqueId().show(),t.children().each(function(){var t=V(this);t.data("ui-menu-submenu-caret")&&t.remove()})},_keydown:function(t){var e,i,s,n=!0;switch(t.keyCode){case V.ui.keyCode.PAGE_UP:this.previousPage(t);break;case V.ui.keyCode.PAGE_DOWN:this.nextPage(t);break;case V.ui.keyCode.HOME:this._move("first","first",t);break;case V.ui.keyCode.END:this._move("last","last",t);break;case V.ui.keyCode.UP:this.previous(t);break;case V.ui.keyCode.DOWN:this.next(t);break;case V.ui.keyCode.LEFT:this.collapse(t);break;case V.ui.keyCode.RIGHT:this.active&&!this.active.is(".ui-state-disabled")&&this.expand(t);break;case V.ui.keyCode.ENTER:case V.ui.keyCode.SPACE:this._activate(t);break;case V.ui.keyCode.ESCAPE:this.collapse(t);break;default:e=this.previousFilter||"",s=n=!1,i=96<=t.keyCode&&t.keyCode<=105?(t.keyCode-96).toString():String.fromCharCode(t.keyCode),clearTimeout(this.filterTimer),i===e?s=!0:i=e+i,e=this._filterMenuItems(i),(e=s&&-1!==e.index(this.active.next())?this.active.nextAll(".ui-menu-item"):e).length||(i=String.fromCharCode(t.keyCode),e=this._filterMenuItems(i)),e.length?(this.focus(t,e),this.previousFilter=i,this.filterTimer=this._delay(function(){delete this.previousFilter},1e3)):delete this.previousFilter}n&&t.preventDefault()},_activate:function(t){this.active&&!this.active.is(".ui-state-disabled")&&(this.active.children("[aria-haspopup='true']").length?this.expand(t):this.select(t))},refresh:function(){var t,e,s=this,n=this.options.icons.submenu,i=this.element.find(this.options.menus);this._toggleClass("ui-menu-icons",null,!!this.element.find(".ui-icon").length),e=i.filter(":not(.ui-menu)").hide().attr({role:this.options.role,"aria-hidden":"true","aria-expanded":"false"}).each(function(){var t=V(this),e=t.prev(),i=V("").data("ui-menu-submenu-caret",!0);s._addClass(i,"ui-menu-icon","ui-icon "+n),e.attr("aria-haspopup","true").prepend(i),t.attr("aria-labelledby",e.attr("id"))}),this._addClass(e,"ui-menu","ui-widget ui-widget-content ui-front"),(t=i.add(this.element).find(this.options.items)).not(".ui-menu-item").each(function(){var t=V(this);s._isDivider(t)&&s._addClass(t,"ui-menu-divider","ui-widget-content")}),i=(e=t.not(".ui-menu-item, .ui-menu-divider")).children().not(".ui-menu").uniqueId().attr({tabIndex:-1,role:this._itemRole()}),this._addClass(e,"ui-menu-item")._addClass(i,"ui-menu-item-wrapper"),t.filter(".ui-state-disabled").attr("aria-disabled","true"),this.active&&!V.contains(this.element[0],this.active[0])&&this.blur()},_itemRole:function(){return{menu:"menuitem",listbox:"option"}[this.options.role]},_setOption:function(t,e){var i;"icons"===t&&(i=this.element.find(".ui-menu-icon"),this._removeClass(i,null,this.options.icons.submenu)._addClass(i,null,e.submenu)),this._super(t,e)},_setOptionDisabled:function(t){this._super(t),this.element.attr("aria-disabled",String(t)),this._toggleClass(null,"ui-state-disabled",!!t)},focus:function(t,e){var i;this.blur(t,t&&"focus"===t.type),this._scrollIntoView(e),this.active=e.first(),i=this.active.children(".ui-menu-item-wrapper"),this._addClass(i,null,"ui-state-active"),this.options.role&&this.element.attr("aria-activedescendant",i.attr("id")),i=this.active.parent().closest(".ui-menu-item").children(".ui-menu-item-wrapper"),this._addClass(i,null,"ui-state-active"),t&&"keydown"===t.type?this._close():this.timer=this._delay(function(){this._close()},this.delay),(i=e.children(".ui-menu")).length&&t&&/^mouse/.test(t.type)&&this._startOpening(i),this.activeMenu=e.parent(),this._trigger("focus",t,{item:e})},_scrollIntoView:function(t){var e,i,s;this._hasScroll()&&(i=parseFloat(V.css(this.activeMenu[0],"borderTopWidth"))||0,s=parseFloat(V.css(this.activeMenu[0],"paddingTop"))||0,e=t.offset().top-this.activeMenu.offset().top-i-s,i=this.activeMenu.scrollTop(),s=this.activeMenu.height(),t=t.outerHeight(),e<0?this.activeMenu.scrollTop(i+e):s",options:{appendTo:null,autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},requestIndex:0,pending:0,liveRegionTimer:null,_create:function(){var i,s,n,t=this.element[0].nodeName.toLowerCase(),e="textarea"===t,t="input"===t;this.isMultiLine=e||!t&&this._isContentEditable(this.element),this.valueMethod=this.element[e||t?"val":"text"],this.isNewMenu=!0,this._addClass("ui-autocomplete-input"),this.element.attr("autocomplete","off"),this._on(this.element,{keydown:function(t){if(this.element.prop("readOnly"))s=n=i=!0;else{s=n=i=!1;var e=V.ui.keyCode;switch(t.keyCode){case e.PAGE_UP:i=!0,this._move("previousPage",t);break;case e.PAGE_DOWN:i=!0,this._move("nextPage",t);break;case e.UP:i=!0,this._keyEvent("previous",t);break;case e.DOWN:i=!0,this._keyEvent("next",t);break;case e.ENTER:this.menu.active&&(i=!0,t.preventDefault(),this.menu.select(t));break;case e.TAB:this.menu.active&&this.menu.select(t);break;case e.ESCAPE:this.menu.element.is(":visible")&&(this.isMultiLine||this._value(this.term),this.close(t),t.preventDefault());break;default:s=!0,this._searchTimeout(t)}}},keypress:function(t){if(i)return i=!1,void(this.isMultiLine&&!this.menu.element.is(":visible")||t.preventDefault());if(!s){var e=V.ui.keyCode;switch(t.keyCode){case e.PAGE_UP:this._move("previousPage",t);break;case e.PAGE_DOWN:this._move("nextPage",t);break;case e.UP:this._keyEvent("previous",t);break;case e.DOWN:this._keyEvent("next",t)}}},input:function(t){if(n)return n=!1,void t.preventDefault();this._searchTimeout(t)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(t){clearTimeout(this.searching),this.close(t),this._change(t)}}),this._initSource(),this.menu=V("