From 9f5836e2cc23c403736de5b53260cfbb6b309f2c Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Thu, 28 Sep 2023 16:10:57 +0200 Subject: [PATCH] #10194 new sections in general tactical view --- pandora_console/images/Tactical_Groups.svg | 19 ++ .../images/Tactical_Module_template.svg | 16 + pandora_console/images/Tactical_Modules.svg | 15 + .../images/Tactical_Not_init_module.svg | 15 + pandora_console/images/Tactical_Plugins.svg | 15 + pandora_console/images/Tactical_Policies.svg | 15 + .../images/Tactical_Unknown_agent.svg | 15 + .../include/javascript/tipsWindow.js | 5 +- .../lib/TacticalView/elements/Agents.php | 309 ++++++++++++++++++ .../TacticalView/elements/Configurations.php | 224 +++++++++++++ .../elements/MonitoringElements.php | 9 +- .../elements/ScheduledDowntime.php | 251 ++++++++++++++ .../include/styles/general_tactical_view.css | 55 +++- pandora_console/views/tacticalView/view.php | 154 ++++++++- 14 files changed, 1101 insertions(+), 16 deletions(-) create mode 100644 pandora_console/images/Tactical_Groups.svg create mode 100644 pandora_console/images/Tactical_Module_template.svg create mode 100644 pandora_console/images/Tactical_Modules.svg create mode 100644 pandora_console/images/Tactical_Not_init_module.svg create mode 100644 pandora_console/images/Tactical_Plugins.svg create mode 100644 pandora_console/images/Tactical_Policies.svg create mode 100644 pandora_console/images/Tactical_Unknown_agent.svg create mode 100644 pandora_console/include/lib/TacticalView/elements/Agents.php create mode 100644 pandora_console/include/lib/TacticalView/elements/Configurations.php create mode 100644 pandora_console/include/lib/TacticalView/elements/ScheduledDowntime.php diff --git a/pandora_console/images/Tactical_Groups.svg b/pandora_console/images/Tactical_Groups.svg new file mode 100644 index 0000000000..99b7e64d72 --- /dev/null +++ b/pandora_console/images/Tactical_Groups.svg @@ -0,0 +1,19 @@ + + + 59DFD8E8-D019-4076-8FED-D5B81BE90197 + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pandora_console/images/Tactical_Module_template.svg b/pandora_console/images/Tactical_Module_template.svg new file mode 100644 index 0000000000..6623647c04 --- /dev/null +++ b/pandora_console/images/Tactical_Module_template.svg @@ -0,0 +1,16 @@ + + + 04A64774-B33A-4338-8092-D83F51BBE8C1 + + + + + + + + + + + + + \ No newline at end of file diff --git a/pandora_console/images/Tactical_Modules.svg b/pandora_console/images/Tactical_Modules.svg new file mode 100644 index 0000000000..6dda1a9606 --- /dev/null +++ b/pandora_console/images/Tactical_Modules.svg @@ -0,0 +1,15 @@ + + + CD5F043F-0CA1-4012-8590-20C64D7E7E0D + + + + + + + + + + + + \ No newline at end of file diff --git a/pandora_console/images/Tactical_Not_init_module.svg b/pandora_console/images/Tactical_Not_init_module.svg new file mode 100644 index 0000000000..84a9cd0cc4 --- /dev/null +++ b/pandora_console/images/Tactical_Not_init_module.svg @@ -0,0 +1,15 @@ + + + E1DA8ECF-DB7D-48B5-96B0-3C6199FCC8EB + + + + + + + + + + + + \ No newline at end of file diff --git a/pandora_console/images/Tactical_Plugins.svg b/pandora_console/images/Tactical_Plugins.svg new file mode 100644 index 0000000000..99f3a0a6b1 --- /dev/null +++ b/pandora_console/images/Tactical_Plugins.svg @@ -0,0 +1,15 @@ + + + E2220716-B06D-4CCD-8005-3668217A51C4 + + + + + + + + + + + + \ No newline at end of file diff --git a/pandora_console/images/Tactical_Policies.svg b/pandora_console/images/Tactical_Policies.svg new file mode 100644 index 0000000000..4ad0ed37a7 --- /dev/null +++ b/pandora_console/images/Tactical_Policies.svg @@ -0,0 +1,15 @@ + + + 7780B3A6-04AD-41C0-83B2-12DA21E87CFC + + + + + + + + + + + + \ No newline at end of file diff --git a/pandora_console/images/Tactical_Unknown_agent.svg b/pandora_console/images/Tactical_Unknown_agent.svg new file mode 100644 index 0000000000..bda519c869 --- /dev/null +++ b/pandora_console/images/Tactical_Unknown_agent.svg @@ -0,0 +1,15 @@ + + + A8855F06-D8BF-417A-841F-4FBE78913DFF + + + + + + + + + + + + \ No newline at end of file diff --git a/pandora_console/include/javascript/tipsWindow.js b/pandora_console/include/javascript/tipsWindow.js index 94d28c9339..82011c4c71 100644 --- a/pandora_console/include/javascript/tipsWindow.js +++ b/pandora_console/include/javascript/tipsWindow.js @@ -134,8 +134,9 @@ function render_counter() { $(".counter-tips img:eq(0)").after( "" ); - if (totalTips > 1) { - for (let i = 1; i <= totalTips - 1; i++) { + var limitRound = totalTips > 28 ? 28 : totalTips; + if (limitRound > 1) { + for (let i = 1; i <= limitRound - 1; i++) { $(".count-round-tip:eq(0)").after( "" ); diff --git a/pandora_console/include/lib/TacticalView/elements/Agents.php b/pandora_console/include/lib/TacticalView/elements/Agents.php new file mode 100644 index 0000000000..6e9d46e21d --- /dev/null +++ b/pandora_console/include/lib/TacticalView/elements/Agents.php @@ -0,0 +1,309 @@ +title = __('Agents'); + $this->ajaxMethods = ['getGroups']; + } + + + /** + * Get total number of agents. + * + * @return string + */ + public function getTotalAgents():string + { + // TODO connect to automonitorization. + return html_print_div( + [ + 'content' => '9.999.999', + 'class' => 'text-l', + 'style' => 'margin: 0px 10px 10px 10px;', + ], + true + ); + } + + + /** + * Get total alerts of agents. + * + * @return string + */ + public function getAlerts():string + { + // TODO connect to automonitorization. + return html_print_div( + [ + 'content' => '9.999.999', + 'class' => 'text-l', + 'style' => 'margin: 0px 10px 10px 10px;', + ], + true + ); + } + + + /** + * Get a datatable with the top groups with more agents. + * + * @return string + */ + public function getDataTableGroups():string + { + $columns = [ + 'nombre', + 'total', + ]; + + $columnNames = [ + __('Group alias'), + __('Agents'), + ]; + + return ui_print_datatable( + [ + 'id' => 'list_groups', + 'class' => 'info_table', + 'style' => 'width: 90%', + 'dom_elements' => 'tfp', + 'filter_main_class' => 'box-flat white_table_graph fixed_filter_bar', + 'columns' => $columns, + 'column_names' => $columnNames, + 'ajax_url' => $this->ajaxController, + 'no-filtered' => [-1], + 'ajax_data' => [ + 'method' => 'getGroups', + 'class' => static::class, + ], + 'order' => [ + 'field' => 'title', + 'direction' => 'asc', + ], + 'default_pagination' => 8, + 'search_button_class' => 'sub filter float-right', + 'return' => true, + ] + ); + } + + + /** + * Return top 20 groups with more agents for ajax datatable. + * + * @return void + */ + public function getGroups():void + { + global $config; + + $start = get_parameter('start', 0); + $length = get_parameter('length', $config['block_size']); + $pagination = ''; + $order = ''; + + try { + ob_start(); + + if (isset($length) && $length > 0 + && isset($start) && $start >= 0 + ) { + $pagination = sprintf( + ' LIMIT %d OFFSET %d ', + $length, + $start + ); + } + + $sql = sprintf( + 'SELECT gr.nombre, count(*) + + IFNULL((SELECT count(*) AS total + FROM tagente second_a + LEFT JOIN tagent_secondary_group second_g ON second_g.id_agent = second_a.id_agente + WHERE a.id_grupo = second_g.id_group + GROUP BY second_g.id_group + ), 0) AS total + FROM tagente a + LEFT JOIN tagent_secondary_group g ON g.id_agent = a.id_agente + LEFT JOIN tgrupo gr ON gr.id_grupo = a.id_grupo + INNER JOIN( + SELECT gr.id_grupo, count(*) AS total + FROM tagente a LEFT JOIN tagent_secondary_group g ON g.id_agent = a.id_agente + LEFT JOIN tgrupo gr ON gr.id_grupo = a.id_grupo + GROUP BY a.id_grupo ORDER BY total DESC LIMIT 20 + ) top_groups ON top_groups.id_grupo = gr.id_grupo + GROUP BY a.id_grupo + ORDER BY total DESC + %s', + $pagination + ); + + $rows = db_process_sql($sql); + + $sql_count = 'SELECT gr.nombre, + IFNULL((SELECT count(*) AS total + FROM tagente second_a + LEFT JOIN tagent_secondary_group second_g ON second_g.id_agent = second_a.id_agente + WHERE a.id_grupo = second_g.id_group + GROUP BY second_g.id_group + ), 0) AS total + FROM tagente a + LEFT JOIN tagent_secondary_group g ON g.id_agent = a.id_agente + LEFT JOIN tgrupo gr ON gr.id_grupo = a.id_grupo + INNER JOIN( + SELECT gr.id_grupo, count(*) AS total + FROM tagente a LEFT JOIN tagent_secondary_group g ON g.id_agent = a.id_agente + LEFT JOIN tgrupo gr ON gr.id_grupo = a.id_grupo + GROUP BY a.id_grupo ORDER BY total DESC LIMIT 20 + ) top_groups ON top_groups.id_grupo = gr.id_grupo + GROUP BY a.id_grupo + ORDER BY total DESC'; + + $total = db_get_num_rows($sql_count); + + echo json_encode( + [ + 'data' => $rows, + 'recordsTotal' => $total, + 'recordsFiltered' => $total, + ] + ); + + // Capture output. + $response = ob_get_clean(); + } catch (Exception $e) { + echo json_encode(['error' => $e->getMessage()]); + exit; + } + + json_decode($response); + if (json_last_error() === JSON_ERROR_NONE) { + echo $response; + } else { + echo json_encode( + [ + 'success' => false, + 'error' => $response, + ] + ); + } + } + + + /** + * Return the html graph of number agents by os. + * + * @return string + */ + public function getOperatingSystemGraph():string + { + $sql = 'SELECT name, count(*) AS total + FROM tagente a + LEFT JOIN tconfig_os os ON os.id_os = a.id_os + GROUP BY a.id_os + ORDER BY total DESC'; + $rows = db_process_sql($sql); + + $labels = []; + $data = []; + foreach ($rows as $key => $row) { + $labels[] = $this->controlSizeText($row['name']); + $data[] = $row['total']; + } + + $options = [ + 'labels' => $labels, + 'legend' => [ + 'position' => 'bottom', + 'align' => 'right', + 'display' => false, + ], + 'cutout' => 80, + 'nodata_image' => ['width' => '100%'], + ]; + $pie = ring_graph($data, $options); + $output = html_print_div( + [ + 'content' => $pie, + 'style' => 'margin: 0 auto; max-width: 80%; max-height: 220px;', + ], + true + ); + + return $output; + } + + + /** + * Return the html graph of number agents by status. + * + * @return string + */ + public function getStatusGraph():string + { + // TODO Find the method for calculate status in agents. + $labels = []; + $data = []; + foreach ([] as $key => $row) { + $labels[] = $this->controlSizeText($row['alias']); + $data[] = $row['status']; + } + + $options = [ + 'labels' => $labels, + 'legend' => [ + 'position' => 'bottom', + 'align' => 'right', + 'display' => false, + ], + 'cutout' => 80, + 'nodata_image' => ['width' => '80%'], + ]; + $pie = ring_graph($data, $options); + $output = html_print_div( + [ + 'content' => $pie, + 'style' => 'margin: 0 auto; max-width: 80%; max-height: 220px;', + ], + true + ); + + return $output; + } + + +} diff --git a/pandora_console/include/lib/TacticalView/elements/Configurations.php b/pandora_console/include/lib/TacticalView/elements/Configurations.php new file mode 100644 index 0000000000..a6e171f8b5 --- /dev/null +++ b/pandora_console/include/lib/TacticalView/elements/Configurations.php @@ -0,0 +1,224 @@ +title = __('Configurations'); + } + + + /** + * Get total groups from automonitorization. + * + * @return string + */ + public function getTotalGroups():string + { + // TODO connect to automonitorization. + $image = html_print_image('images/Tactical_Groups.svg', true); + $text = ''.__('Groups').''; + $number = html_print_div( + [ + 'content' => '999.999', + 'class' => 'text-l text_center', + 'style' => '', + ], + true + ); + $output = $image.$text.$number; + return $output; + } + + + /** + * Get total modules from automonitorization. + * + * @return string + */ + public function getTotalModules():string + { + // TODO connect to automonitorization. + $image = html_print_image('images/Tactical_Modules.svg', true); + $text = ''.__('Modules').''; + $number = html_print_div( + [ + 'content' => '999.999', + 'class' => 'text-l text_center', + 'style' => '', + ], + true + ); + $output = $image.$text.$number; + return $output; + } + + + /** + * Get total policies from automonitorization. + * + * @return string + */ + public function getTotalPolicies():string + { + $totalPolicies = db_get_value( + 'count(*)', + 'tpolicies' + ); + + $image = html_print_image('images/Tactical_Policies.svg', true); + $text = ''.__('Policies').''; + $number = html_print_div( + [ + 'content' => $totalPolicies, + 'class' => 'text-l text_center', + 'style' => '', + ], + true + ); + $output = $image.$text.$number; + return $output; + } + + + /** + * Get total remote plugins from automonitorization. + * + * @return string + */ + public function getTotalRemotePlugins():string + { + $totalPLugins = db_get_value( + 'count(*)', + 'tplugin', + 'plugin_type', + 1, + ); + + $sql = 'SELECT count(*) AS total FROM tplugin WHERE plugin_type = 1;'; + $rows = db_process_sql($sql); + $totalPLugins = 0; + if (is_array($rows) === true && count($rows) > 0) { + $totalPLugins = $rows[0]['total']; + } + + $image = html_print_image('images/Tactical_Plugins.svg', true); + $text = ''.__('Remote plugins').''; + $number = html_print_div( + [ + 'content' => $totalPLugins, + 'class' => 'text-l text_center', + 'style' => '', + ], + true + ); + $output = $image.$text.$number; + return $output; + } + + + /** + * Get total module templates from automonitorization. + * + * @return string + */ + public function getTotalModuleTemplate():string + { + $countModuleTemplates = db_get_value( + 'count(*)', + 'tnetwork_profile' + ); + + $image = html_print_image('images/Tactical_Module_template.svg', true); + $text = ''.__('Module templates').''; + $number = html_print_div( + [ + 'content' => $countModuleTemplates, + 'class' => 'text-l text_center', + 'style' => '', + ], + true + ); + $output = $image.$text.$number; + return $output; + } + + + /** + * Get total not unit modules from automonitorization. + * + * @return string + */ + public function getNotInitModules():string + { + // TODO connect to automonitorization. + $image = html_print_image('images/Tactical_Not_init_module.svg', true); + $text = ''.__('Not-init modules').''; + $number = html_print_div( + [ + 'content' => '999.999', + 'class' => 'text-l text_center', + 'style' => '', + ], + true + ); + $output = $image.$text.$number; + return $output; + } + + + /** + * Get total unknow agents from automonitorization. + * + * @return string + */ + public function getTotalUnknowAgents():string + { + // TODO connect to automonitorization. + $image = html_print_image('images/Tactical_Unknown_agent.svg', true); + $text = ''.__('Unknown agents').''; + $number = html_print_div( + [ + 'content' => '999.999', + 'class' => 'text-l text_center', + 'style' => '', + ], + true + ); + $output = $image.$text.$number; + return $output; + } + + +} diff --git a/pandora_console/include/lib/TacticalView/elements/MonitoringElements.php b/pandora_console/include/lib/TacticalView/elements/MonitoringElements.php index 6782df59a3..0b071a6109 100644 --- a/pandora_console/include/lib/TacticalView/elements/MonitoringElements.php +++ b/pandora_console/include/lib/TacticalView/elements/MonitoringElements.php @@ -137,9 +137,14 @@ class MonitoringElements extends Element */ public function getAgentGroupsGraph():string { - $sql = 'SELECT gr.nombre, count(*) AS total + $sql = 'SELECT gr.nombre, count(*) + + IFNULL((SELECT count(*) AS total + FROM tagente second_a + LEFT JOIN tagent_secondary_group second_g ON second_g.id_agent = second_a.id_agente + WHERE a.id_grupo = second_g.id_group + GROUP BY second_g.id_group + ), 0) AS total FROM tagente a - LEFT JOIN tagent_secondary_group g ON g.id_agent = a.id_agente LEFT JOIN tgrupo gr ON gr.id_grupo = a.id_grupo GROUP BY a.id_grupo ORDER BY total DESC diff --git a/pandora_console/include/lib/TacticalView/elements/ScheduledDowntime.php b/pandora_console/include/lib/TacticalView/elements/ScheduledDowntime.php new file mode 100644 index 0000000000..d3bbf54c56 --- /dev/null +++ b/pandora_console/include/lib/TacticalView/elements/ScheduledDowntime.php @@ -0,0 +1,251 @@ +title = __('Scheduled Downtime'); + $this->ajaxMethods = ['getScheduleDowntime']; + } + + + /** + * List all schedule downtime. + * + * @return string + */ + public function list():string + { + $columns = [ + 'name', + 'configuration', + 'running', + 'affected', + ]; + + $columnNames = [ + __('Name #Ag.'), + __('Configuration'), + __('Running'), + __('Affected'), + ]; + + return ui_print_datatable( + [ + 'id' => 'list_downtime', + 'class' => 'info_table', + 'style' => 'width: 90%', + 'dom_elements' => 'tfp', + 'filter_main_class' => 'box-flat white_table_graph fixed_filter_bar', + 'columns' => $columns, + 'column_names' => $columnNames, + 'ajax_url' => $this->ajaxController, + 'no_sortable_columns' => [ + 1, + 2, + ], + 'ajax_data' => [ + 'method' => 'getScheduleDowntime', + 'class' => static::class, + ], + 'order' => [ + 'field' => 'name', + 'direction' => 'asc', + ], + 'default_pagination' => 5, + 'search_button_class' => 'sub filter float-right', + 'return' => true, + ] + ); + } + + + /** + * Return the schedule downtime for datatable by ajax. + * + * @return void + */ + public function getScheduleDowntime():void + { + global $config; + + $start = get_parameter('start', 0); + $length = get_parameter('length', $config['block_size']); + $orderDatatable = get_datatable_order(true); + $pagination = ''; + $order = ''; + + try { + ob_start(); + if (isset($orderDatatable)) { + $order = sprintf( + ' ORDER BY %s %s', + $orderDatatable['field'], + $orderDatatable['direction'] + ); + } + + if (isset($length) && $length > 0 + && isset($start) && $start >= 0 + ) { + $pagination = sprintf( + ' LIMIT %d OFFSET %d ', + $length, + $start + ); + } + + $columns = [ + 'id', + 'name', + 'description', + 'date_from', + 'date_to', + 'executed', + 'id_group', + 'only_alerts', + 'monday', + 'tuesday', + 'wednesday', + 'thursday', + 'friday', + 'saturday', + 'sunday', + 'periodically_time_from', + 'periodically_time_to', + 'periodically_day_from', + 'periodically_day_to', + 'type_downtime', + 'type_execution', + 'type_periodicity', + 'id_user', + 'cron_interval_from', + 'cron_interval_to', + ]; + + $columns_str = implode(',', $columns); + $sql = sprintf( + 'SELECT %s + FROM tplanned_downtime + %s %s', + $columns_str, + $order, + $pagination, + ); + + $sql_count = 'SELECT COUNT(id) AS num + FROM tplanned_downtime'; + + $downtimes = db_get_all_rows_sql($sql); + foreach ($downtimes as $key => $downtime) { + if ((int) $downtime['executed'] === 0) { + $downtimes[$key]['running'] = html_print_div( + [ + 'content' => '', + 'class' => 'square stop', + 'title' => 'Not running', + ], + true + ); + } else { + $downtimes[$key]['running'] = html_print_div( + [ + 'content' => '', + 'class' => 'square running', + 'title' => 'Running', + ], + true + ); + } + + $downtimes[$key]['configuration'] = reporting_format_planned_downtime_dates($downtime); + + $settings = [ + 'url' => ui_get_full_url('ajax.php', false, false, false), + 'loadingText' => __('Loading, this operation might take several minutes...'), + 'title' => __('Elements affected'), + 'id' => $downtime['id'], + ]; + + $downtimes[$key]['affected'] = ''; + $downtimes[$key]['affected'] .= html_print_image( + 'images/details.svg', + true, + [ + 'title' => __('Agents and modules affected'), + 'class' => 'main_menu_icon invert_filter', + ] + ); + $downtimes[$key]['affected'] .= ''; + } + + $downtimes_number_res = db_get_all_rows_sql($sql_count); + $downtimes_number = ($downtimes_number_res !== false) ? $downtimes_number_res[0]['num'] : 0; + + if (empty($downtimes) === true) { + $downtimes = []; + } + + echo json_encode( + [ + 'data' => $downtimes, + 'recordsTotal' => $downtimes_number, + 'recordsFiltered' => $downtimes_number, + ] + ); + // Capture output. + $response = ob_get_clean(); + } catch (Exception $e) { + echo json_encode(['error' => $e->getMessage()]); + exit; + } + + json_decode($response); + if (json_last_error() === JSON_ERROR_NONE) { + echo $response; + } else { + echo json_encode( + [ + 'success' => false, + 'error' => $response, + ] + ); + } + + exit; + } + + +} diff --git a/pandora_console/include/styles/general_tactical_view.css b/pandora_console/include/styles/general_tactical_view.css index 5760636c06..3d4f5f355e 100644 --- a/pandora_console/include/styles/general_tactical_view.css +++ b/pandora_console/include/styles/general_tactical_view.css @@ -26,7 +26,7 @@ .col-xl-6 { width: 50%; display: flex; - flex-wrap: wrap; + flex-wrap: nowrap; flex-direction: column; } .col-7 { @@ -36,15 +36,17 @@ width: 66.6%; } .col-4 { - width: 33.3%; + width: 33%; } .col-5 { width: 42%; } -.col-3 { +.col-3, +.col-md-3 { width: 25%; } -.col-9 { +.col-9, +.col-md-9 { width: 75%; } .container { @@ -121,7 +123,8 @@ #database .subtitle, #logStorage .subtitle, #SNMPTraps .subtitle, -#Alerts .subtitle { +#Alerts .subtitle, +#Agents .subtitle { padding: 10px 10px 5px 10px; } @@ -200,7 +203,7 @@ a.pandora_pagination:first-child { margin-left: 7px !important; } -.datatables_thead_tr th:nth-child(1) { +#datatable_events .datatables_thead_tr th:nth-child(1) { width: 10.3333px !important; padding: 20px 0px 20px 15px !important; } @@ -209,6 +212,26 @@ a.pandora_pagination:first-child { font-size: 13px !important; } +table.dataTable thead th { + padding: 0px 18px !important; +} + +#list_downtime_wrapper { + margin: 28px 0px; +} + +.square { + width: 20px; + height: 20px; + margin-left: 20px; +} +.running { + background-color: #82b92e; +} +.stop { + background-color: #ec7176; +} + @media (max-width: 1636px) { .col-xl-6 { width: 100%; @@ -216,7 +239,27 @@ a.pandora_pagination:first-child { .col-6 { width: 49%; } + .col-3 { + width: 21%; + } + .col-4 { + width: 30%; + } .row { flex-wrap: wrap; } + + .flex-nowrap { + flex-wrap: nowrap !important; + } +} + +@media (max-width: 1300px) { + .col-md-9, + .col-md-3 { + width: 100%; + } + .col-6 { + width: 49%; + } } diff --git a/pandora_console/views/tacticalView/view.php b/pandora_console/views/tacticalView/view.php index 92a4d54f79..2caa883c2b 100644 --- a/pandora_console/views/tacticalView/view.php +++ b/pandora_console/views/tacticalView/view.php @@ -4,7 +4,7 @@
-
+
@@ -60,13 +60,13 @@
getTagsGraph(); ?>
getModuleGroupGraph(); ?>
@@ -80,7 +80,7 @@
getAgentGroupsGraph(); ?>
@@ -141,7 +141,7 @@
-
+
title; ?> @@ -223,9 +223,151 @@
+
+
+
+ title; ?> +
+
+
+
+ +
+ getCurrentlyTriggered(); ?> +
+
+
+ +
+ getActiveCorrelation(); ?> +
+
+ + getDataTableUsers(); ?> +
+
+
+
+
+ title; ?> +
+
+
+ + getEventsGraph(); ?> +
+
+ + getEventsCriticalityGraph(); ?> +
+
+ + getEventsStatusValidateGraph(); ?> +
+
+ + getEventsStatusValidateGraph(); ?> +
+
+
+
+ + getDataTableEvents(); ?> +
+
+
+
- +
+
+
+ title; ?> +
+
+
+
+
+
+ +
+ getTotalAgents(); ?> +
+
+
+ +
+ getAlerts(); ?> +
+
+ + getDataTableGroups(); ?> +
+
+ + getOperatingSystemGraph(); ?> + + getOperatingSystemGraph(); ?> +
+
+
+
+
+
+
+ title; ?> +
+
+
+ getTotalGroups(); ?> +
+
+ getTotalModules(); ?> +
+
+ getTotalPolicies(); ?> +
+
+ getTotalRemotePlugins(); ?> +
+
+
+
+ getTotalModuleTemplate(); ?> +
+
+ getNotInitModules(); ?> +
+
+ getTotalUnknowAgents(); ?> +
+
+
+
+
+ title; ?> +
+ list(); ?> +
+
\ No newline at end of file