From a8a201cf19ac705eb42d77802661abc5495b7100 Mon Sep 17 00:00:00 2001 From: Calvo Date: Mon, 4 Sep 2023 16:47:01 +0200 Subject: [PATCH 01/26] Agents show events 24h switch checked default --- pandora_console/include/ajax/events.php | 2 +- pandora_console/operation/agentes/status_events.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pandora_console/include/ajax/events.php b/pandora_console/include/ajax/events.php index 7ccf17938b..ddf36ee912 100644 --- a/pandora_console/include/ajax/events.php +++ b/pandora_console/include/ajax/events.php @@ -2000,7 +2000,7 @@ if ($table_events) { include_once 'include/functions_graph.php'; $id_agente = (int) get_parameter('id_agente'); - $all_events_24h = (int) get_parameter('all_events_24h'); + $all_events_24h = (int) get_parameter('all_events_24h', 1); // Fix: for tag functionality groups have to be all user_groups // (propagate ACL funct!). diff --git a/pandora_console/operation/agentes/status_events.php b/pandora_console/operation/agentes/status_events.php index 39b8b9edf0..30df1fb897 100755 --- a/pandora_console/operation/agentes/status_events.php +++ b/pandora_console/operation/agentes/status_events.php @@ -43,7 +43,7 @@ html_print_div( ?> diff --git a/pandora_console/godmode/setup/os.php b/pandora_console/godmode/setup/os.php index 539189f88d..99402ff30a 100644 --- a/pandora_console/godmode/setup/os.php +++ b/pandora_console/godmode/setup/os.php @@ -40,24 +40,13 @@ if (! check_acl($config['id_user'], 0, 'PM') && ! is_user_admin($config['id_user return; } -$action = get_parameter('action', 'new'); +$action = get_parameter('action', ''); $idOS = get_parameter('id_os', 0); $id_message = get_parameter('message', 0); if (is_metaconsole() === true) { $tab = get_parameter('tab2', 'list'); } else { - $tab = get_parameter('tab', 'list'); -} - -if ($idOS) { - $os = db_get_row_filter('tconfig_os', ['id_os' => $idOS]); - $name = $os['name']; - $description = $os['description']; - $icon = $os['icon_name']; -} else { - $name = io_safe_input(strip_tags(io_safe_output((string) get_parameter('name')))); - $description = io_safe_input(strip_tags(io_safe_output((string) get_parameter('description')))); - $icon = get_parameter('icon', 0); + $tab = get_parameter('tab', 'manage_os'); } $is_management_allowed = true; @@ -65,150 +54,60 @@ if (is_management_allowed() === false) { $is_management_allowed = false; } -$message = ''; -if ($is_management_allowed === true) { - switch ($action) { - case 'edit': - $actionHidden = 'update'; - $textButton = __('Update'); - $classButton = ['icon' => 'wand']; - break; - - case 'save': - $values = []; - $values['name'] = $name; - $values['description'] = $description; - - if (($icon !== 0) && ($icon != '')) { - $values['icon_name'] = $icon; - } - - $resultOrId = false; - if ($name != '') { - $resultOrId = db_process_sql_insert('tconfig_os', $values); - } - - if ($resultOrId === false) { - $message = 2; - $tab = 'builder'; - $actionHidden = 'save'; - $textButton = __('Create'); - $classButton = ['icon' => 'wand']; - } else { - $tab = 'list'; - $message = 1; - } - - if (is_metaconsole() === true) { - header('Location:'.$config['homeurl'].'index.php?sec=advanced&sec2=advanced/component_management&tab=os_manage&tab2='.$tab.'&message='.$message); - } else { - header('Location:'.$config['homeurl'].'index.php?sec=gsetup&sec2=godmode/setup/os&tab='.$tab.'&message='.$message); - } - break; - - case 'update': - $name = io_safe_input(strip_tags(io_safe_output((string) get_parameter('name')))); - $description = io_safe_input(strip_tags(io_safe_output((string) get_parameter('description')))); - $icon = get_parameter('icon', 0); - - $values = []; - $values['name'] = $name; - $values['description'] = $description; - // Only for Metaconsole. Save the previous name for synchronizing. - if (is_metaconsole() === true) { - $values['previous_name'] = db_get_value('name', 'tconfig_os', 'id_os', $idOS); - } - - if (($icon !== 0) && ($icon != '')) { - $values['icon_name'] = $icon; - } - - $result = false; - if ($name != '') { - $result = db_process_sql_update('tconfig_os', $values, ['id_os' => $idOS]); - } - - if ($result !== false) { - $message = 3; - $tab = 'list'; - } else { - $message = 4; - $tab = 'builder'; - $os = db_get_row_filter('tconfig_os', ['id_os' => $idOS]); - $name = $os['name']; - } - - $actionHidden = 'update'; - $textButton = __('Update'); - $classButton = ['icon' => 'wand']; - if (is_metaconsole() === true) { - header('Location:'.$config['homeurl'].'index.php?sec=advanced&sec2=advanced/component_management&tab=os_manage&tab2='.$tab.'&message='.$message); - } else { - header('Location:'.$config['homeurl'].'index.php?sec=gsetup&sec2=godmode/setup/os&tab='.$tab.'&message='.$message); - } - break; - - case 'delete': - $sql = 'SELECT COUNT(id_os) AS count FROM tagente WHERE id_os = '.$idOS; - $count = db_get_all_rows_sql($sql); - $count = $count[0]['count']; - - if ($count > 0) { - $message = 5; - } else { - $result = (bool) db_process_sql_delete('tconfig_os', ['id_os' => $idOS]); - if ($result) { - $message = 6; - } else { - $message = 7; - } - } - - if (is_metaconsole() === true) { - header('Location:'.$config['homeurl'].'index.php?sec=advanced&sec2=advanced/component_management&tab=os_manage&tab2='.$tab.'&message='.$message); - } else { - header('Location:'.$config['homeurl'].'index.php?sec=gsetup&sec2=godmode/setup/os&tab='.$tab.'&message='.$message); - } - break; - - default: - case 'new': - $actionHidden = 'save'; - $textButton = __('Create'); - $classButton = ['icon' => 'next']; - break; - } -} - $buttons = []; -$buttons['list'] = [ + +$buttons['manage_os'] = [ 'active' => false, - 'text' => ''.html_print_image( - 'images/logs@svg.svg', + 'text' => ''.html_print_image( + 'images/os@svg.svg', true, [ - 'title' => __('List OS'), + 'title' => __('Manage OS types'), + 'class' => 'invert_filter main_menu_icon', + ] + ).'', +]; + +$buttons['manage_version'] = [ + 'active' => false, + 'text' => ''.html_print_image( + 'images/os_version@svg.svg', + true, + [ + 'title' => __('Manage version expiration dates'), 'class' => 'invert_filter main_menu_icon', ] ).'', ]; -if ($is_management_allowed === true) { - $buttons['builder'] = [ - 'active' => false, - 'text' => ''.html_print_image( - 'images/edit.svg', - true, - [ - 'title' => __('Builder OS'), - 'class' => 'invert_filter main_menu_icon', - ] - ).'', - ]; -} $buttons[$tab]['active'] = true; -$headerTitle = ($tab === 'builder') ? __('Edit OS') : __('List of Operating Systems'); +switch ($tab) { + case 'builder': + $headerTitle = __('Edit OS'); + break; + + case 'manage_os': + case 'list': + if ($action === 'edit') { + $headerTitle = __('Edit OS'); + } else { + $headerTitle = __('List of Operating Systems'); + } + break; + + case 'manage_version': + if ($action === 'edit') { + $headerTitle = __('Edit OS version expiration date'); + } else { + $headerTitle = __('List of version expiration dates'); + } + break; + + default: + // Default. + break; +} if (is_metaconsole() === false) { // Header. @@ -262,6 +161,14 @@ if (empty($id_message) === false) { echo ui_print_error_message(__('Error deleting'), '', true); break; + case 8: + echo ui_print_success_message(__('Icon successfuly uploaded'), '', true); + break; + + case 9: + echo ui_print_error_message(__('File must be of type JPG, JPEG, PNG or SVG'), '', true); + break; + default: // Default. break; @@ -269,12 +176,21 @@ if (empty($id_message) === false) { } switch ($tab) { + case 'manage_os': case 'list': - include_once $config['homedir'].'/godmode/setup/os.list.php'; + if (in_array($action, ['edit', 'save', 'update']) && is_management_allowed() === true) { + include_once $config['homedir'].'/godmode/setup/os.builder.php'; + } else { + include_once $config['homedir'].'/godmode/setup/os.list.php'; + } break; - case 'builder': - include_once $config['homedir'].'/godmode/setup/os.builder.php'; + case 'manage_version': + if (in_array($action, ['edit', 'save', 'update']) && is_management_allowed() === true) { + include_once $config['homedir'].'/godmode/setup/os_version.builder.php'; + } else { + include_once $config['homedir'].'/godmode/setup/os_version.list.php'; + } break; default: diff --git a/pandora_console/godmode/setup/os_version.builder.php b/pandora_console/godmode/setup/os_version.builder.php new file mode 100644 index 0000000000..89e0092085 --- /dev/null +++ b/pandora_console/godmode/setup/os_version.builder.php @@ -0,0 +1,213 @@ + 0) { + $os_version = db_get_row_filter('tconfig_os_version', ['id_os_version' => $idOS]); + $product = $os_version['product']; + $version = $os_version['version']; + $end_of_life_date = $os_version['end_of_support']; +} else { + $product = io_safe_input(strip_tags(io_safe_output((string) get_parameter('product')))); + $version = io_safe_input(strip_tags(io_safe_output((string) get_parameter('version')))); + $end_of_life_date = get_parameter('end_of_life_date', date("Y/m/d")); +} + +$message = ''; +if ($is_management_allowed === true) { + switch ($action) { + case 'edit': + if ($idOS > 0) { + $actionHidden = 'update'; + $textButton = __('Update'); + $classButton = ['icon' => 'wand']; + } else { + $actionHidden = 'save'; + $textButton = __('Create'); + $classButton = ['icon' => 'next']; + } + break; + + case 'save': + $values = []; + // Product and version must be stored with no entities to be able to use REGEXP in queries. + // CAREFUL! output of these fields must be encoded to avoid scripting vulnerabilities. + $values['product'] = io_safe_output($product); + $values['version'] = io_safe_output($version); + $values['end_of_support'] = $end_of_life_date; + + $result = db_process_sql_insert('tconfig_os_version', $values); + + if ($result === false) { + $message = 2; + } else { + $message = 1; + } + + $tab = 'manage_version'; + + header('Location:'.$config['homeurl'].'index.php?sec=gsetup&sec2=godmode/setup/os&tab='.$tab.'&message='.$message); + break; + + case 'update': + $product = io_safe_output(get_parameter('product')); + $version = io_safe_output(get_parameter('version')); + $end_of_life_date = get_parameter('end_of_life_date', 0); + $values = []; + $values['product'] = $product; + $values['version'] = $version; + $values['end_of_support'] = $end_of_life_date; + hd($values, true); + hd($idOS, true); + $result = db_process_sql_update('tconfig_os_version', $values, ['id_os_version' => $idOS]); + + if ($result === false) { + $message = 4; + } else { + $message = 3; + } + + $tab = 'manage_version'; + + header('Location:'.$config['homeurl'].'index.php?sec=gsetup&sec2=godmode/setup/os&tab='.$tab.'&message='.$message); + break; + + case 'delete': + $sql = 'SELECT COUNT(id_os) AS count FROM tagente WHERE id_os = '.$idOS; + $count = db_get_all_rows_sql($sql); + $count = $count[0]['count']; + + if ($count > 0) { + $message = 5; + } else { + $result = (bool) db_process_sql_delete('tconfig_os', ['id_os' => $idOS]); + if ($result) { + $message = 6; + } else { + $message = 7; + } + } + + if (is_metaconsole() === true) { + header('Location:'.$config['homeurl'].'index.php?sec=advanced&sec2=advanced/component_management&tab=list&tab2='.$tab.'&message='.$message); + } else { + header('Location:'.$config['homeurl'].'index.php?sec=gsetup&sec2=godmode/setup/os&tab='.$tab.'&message='.$message); + } + break; + + default: + case 'new': + $actionHidden = 'save'; + $textButton = __('Create'); + $classButton = ['icon' => 'next']; + break; + } +} + +echo '
'; +$table = new stdClass(); +$table->width = '100%'; +$table->class = 'databox filter-table-adv'; + +// $table->style[0] = 'width: 15%'; +$table->data[0][] = html_print_label_input_block( + __('Product'), + html_print_input_text('product', io_safe_input($product), __('Product'), 20, 300, true, false, false, '', 'w250px') +); + +$table->data[0][] = html_print_label_input_block( + __('Version'), + html_print_input_text('version', io_safe_input($version), __('Version'), 20, 300, true, false, false, '', 'w250px') +); + +$timeInputs = []; + +$timeInputs[] = html_print_div( + [ + 'id' => 'end_of_life_date', + 'style' => '', + 'content' => html_print_div( + [ + 'class' => '', + 'content' => html_print_input_text( + 'end_of_life_date', + $end_of_life_date, + '', + 10, + 10, + true + ), + ], + true + ), + ], + true +); + +$table->data[1][] = html_print_label_input_block( + __('End of life date'), + implode('', $timeInputs) +); + +html_print_table($table); + +html_print_input_hidden('id_os', $idOS); +html_print_input_hidden('action', $actionHidden); + +html_print_action_buttons( + html_print_submit_button($textButton, 'update_button', false, $classButton, true), + ['type' => 'form_action'] +); + +echo '
'; + +?> + \ No newline at end of file diff --git a/pandora_console/godmode/setup/os_version.list.php b/pandora_console/godmode/setup/os_version.list.php new file mode 100644 index 0000000000..eac41fae71 --- /dev/null +++ b/pandora_console/godmode/setup/os_version.list.php @@ -0,0 +1,195 @@ + __('Options'), + 'class' => 'w100px table_action_buttons', + ], + ]; + + $tableId = 'os_version_table'; + // Load datatables user interface. + ui_print_datatable( + [ + 'id' => $tableId, + 'class' => 'info_table', + 'style' => 'width: 100%', + 'columns' => $columns, + 'column_names' => $column_names, + 'ajax_url' => 'include/ajax/os', + 'ajax_data' => ['method' => 'drawOSVersionTable'], + 'ajax_postprocess' => 'process_datatables_item(item)', + 'no_sortable_columns' => [-1], + 'order' => [ + 'field' => 'id', + 'direction' => 'asc', + ], + 'search_button_class' => 'sub filter float-right', + 'form' => [ + 'inputs' => [ + [ + 'label' => __('Free search'), + 'type' => 'text', + 'class' => 'w25p', + 'id' => 'free_search', + 'name' => 'free_search', + ], + ], + ], + 'filter_main_class' => 'box-flat white_table_graph fixed_filter_bar', + 'dom_elements' => 'lftpB', + ] + ); +} catch (Exception $e) { + echo $e->getMessage(); +} + +echo ''; + +echo '
'; + +html_print_action_buttons( + html_print_submit_button(__('Create OS version'), 'update_button', false, ['icon' => 'next'], true), + ['type' => 'form_action'] +); + +echo '
'; + +echo '
'; + +html_print_input_hidden('os_version_regex', ''); + +echo '
'; + +?> + + \ No newline at end of file diff --git a/pandora_console/godmode/setup/os_version.php b/pandora_console/godmode/setup/os_version.php new file mode 100644 index 0000000000..ec5d27beae --- /dev/null +++ b/pandora_console/godmode/setup/os_version.php @@ -0,0 +1,285 @@ + $id_os_version]); + $product = $os_version['product']; + $version = $os_version['version']; + $end_of_life_date = $os_version['end_of_life_date']; +} else { + $product = io_safe_input(strip_tags(io_safe_output((string) get_parameter('product')))); + $version = io_safe_input(strip_tags(io_safe_output((string) get_parameter('version')))); + $end_of_life_date = get_parameter('end_of_life_date', 0); +} + +$is_management_allowed = true; +if (is_management_allowed() === false) { + $is_management_allowed = false; +} + +$message = ''; +if ($is_management_allowed === true) { + switch ($action) { + case 'edit': + $action_hidden = 'update'; + $text_button = __('Update'); + $class_button = ['icon' => 'wand']; + break; + + case 'save': + $values = []; + $values['product'] = $product; + $values['version'] = $version; + $values['end_of_life_date'] = $end_of_life_date; + + $result_or_id = false; + if ($product !== '') { + $result_or_id = db_process_sql_insert('tconfig_os_version', $values); + } + + if ($result_or_id === false) { + $message = 2; + $tab = 'builder'; + $actionHidden = 'save'; + $textButton = __('Create'); + $classButton = ['icon' => 'wand']; + } else { + $tab = 'list'; + $message = 1; + } + + if (is_metaconsole() === true) { + header('Location:'.$config['homeurl'].'index.php?sec=advanced&sec2=advanced/component_management&tab=os_manage&tab2='.$tab.'&message='.$message); + } else { + header('Location:'.$config['homeurl'].'index.php?sec=gsetup&sec2=godmode/setup/os&tab='.$tab.'&message='.$message); + } + break; + + case 'update': + $product = io_safe_input(strip_tags(io_safe_output((string) get_parameter('product')))); + $version = io_safe_input(strip_tags(io_safe_output((string) get_parameter('version')))); + $end_of_life_date = get_parameter('end_of_life_date', 0); + + $values = []; + $values['product'] = $product; + $values['version'] = $version; + + $result = false; + $result = db_process_sql_update('tconfig_os_version', $values, ['id_os' => $id_os_version]); + + if ($result !== false) { + $message = 3; + $tab = 'list'; + } else { + $message = 4; + $tab = 'builder'; + $os = db_get_row_filter('tconfig_os', ['id_os' => $idOS]); + $name = $os['name']; + } + + $actionHidden = 'update'; + $textButton = __('Update'); + $classButton = ['icon' => 'wand']; + if (is_metaconsole() === true) { + header('Location:'.$config['homeurl'].'index.php?sec=advanced&sec2=advanced/component_management&tab=os_manage&tab2='.$tab.'&message='.$message); + } else { + header('Location:'.$config['homeurl'].'index.php?sec=gsetup&sec2=godmode/setup/os_version&tab='.$tab.'&message='.$message); + } + break; + + case 'delete': + $sql = 'SELECT COUNT(id_os) AS count FROM tagente WHERE id_os = '.$idOS; + $count = db_get_all_rows_sql($sql); + $count = $count[0]['count']; + + if ($count > 0) { + $message = 5; + } else { + $result = (bool) db_process_sql_delete('tconfig_os', ['id_os' => $idOS]); + if ($result) { + $message = 6; + } else { + $message = 7; + } + } + + if (is_metaconsole() === true) { + header('Location:'.$config['homeurl'].'index.php?sec=advanced&sec2=advanced/component_management&tab=os_manage&tab2='.$tab.'&message='.$message); + } else { + header('Location:'.$config['homeurl'].'index.php?sec=gsetup&sec2=godmode/setup/os&tab='.$tab.'&message='.$message); + } + break; + + default: + case 'new': + $actionHidden = 'save'; + $textButton = __('Create'); + $classButton = ['icon' => 'next']; + break; + } +} + +$buttons = []; +$buttons['list'] = [ + 'active' => false, + 'text' => ''.html_print_image( + 'images/logs@svg.svg', + true, + [ + 'title' => __('List OS'), + 'class' => 'invert_filter main_menu_icon', + ] + ).'', +]; +if ($is_management_allowed === true) { + $buttons['builder'] = [ + 'active' => false, + 'text' => ''.html_print_image( + 'images/edit.svg', + true, + [ + 'title' => __('Builder OS'), + 'class' => 'invert_filter main_menu_icon', + ] + ).'', + ]; + + $buttons['version_exp_date_editor'] = [ + 'active' => false, + 'text' => ''.html_print_image( + 'images/edit.svg', + true, + [ + 'title' => __('Version expiration date editor'), + 'class' => 'invert_filter main_menu_icon', + ] + ).'', + ]; +} + +$buttons[$tab]['active'] = true; + +switch ($tab) { + case 'builder': + $headerTitle = __('Edit OS'); + break; + + case 'manage_version': + $headerTitle = __('Version expiration date editor'); + break; + + case 'list': + $headerTitle = __('List of Operating Systems'); + break; + + default: + // Default. + break; +} + +if (is_metaconsole() === false) { + // Header. + ui_print_standard_header( + $headerTitle, + '', + false, + '', + true, + $buttons, + [ + [ + 'link' => '', + 'label' => __('Servers'), + ], + [ + 'link' => '', + 'label' => __('Edit OS'), + ], + ] + ); +} + +if (empty($id_message) === false) { + switch ($id_message) { + case 1: + echo ui_print_success_message(__('Success creating OS'), '', true); + break; + + case 2: + echo ui_print_error_message(__('Fail creating OS'), '', true); + break; + + case 3: + echo ui_print_success_message(__('Success updating OS'), '', true); + break; + + case 4: + echo ui_print_error_message(__('Error updating OS'), '', true); + break; + + case 5: + echo ui_print_error_message(__('There are agents with this OS.'), '', true); + break; + + case 6: + echo ui_print_success_message(__('Success deleting'), '', true); + break; + + case 7: + echo ui_print_error_message(__('Error deleting'), '', true); + break; + + default: + // Default. + break; + } +} + +include_once $config['homedir'].'/godmode/setup/os_version.list.php'; diff --git a/pandora_console/images/os@svg.svg b/pandora_console/images/os@svg.svg new file mode 100644 index 0000000000..80f8caf194 --- /dev/null +++ b/pandora_console/images/os@svg.svg @@ -0,0 +1,7 @@ + + + os@svg + + + + \ No newline at end of file diff --git a/pandora_console/images/os_version@svg.svg b/pandora_console/images/os_version@svg.svg new file mode 100644 index 0000000000..1274ccc3f8 --- /dev/null +++ b/pandora_console/images/os_version@svg.svg @@ -0,0 +1,15 @@ + + + os version@svg + + + + + + + + + + + + \ No newline at end of file diff --git a/pandora_console/include/ajax/os.php b/pandora_console/include/ajax/os.php new file mode 100644 index 0000000000..058fe75578 --- /dev/null +++ b/pandora_console/include/ajax/os.php @@ -0,0 +1,376 @@ + false]); + return; + } + + if (db_process_sql_delete( + 'tconfig_os', + ['id_os' => $id_os] + ) === false + ) { + echo json_encode(['deleted' => false]); + } else { + echo json_encode(['deleted' => true]); + } +} + +if ($method === 'deleteOSVersion') { + global $config; + + $id_os_version = get_parameter('id_os_version', null); + + if (empty($id_os_version) === true || $id_os_version < 1) { + echo json_encode(['deleted' => false]); + } + + if (db_process_sql_delete( + 'tconfig_os_version', + ['id_os_version' => $id_os_version] + ) === false + ) { + echo json_encode(['deleted' => false]); + } else { + echo json_encode(['deleted' => true]); + } +} + +if ($method === 'drawOSTable') { + // Datatables offset, limit and order. + $filter = get_parameter('filter', []); + $start = get_parameter('start', 0); + $length = get_parameter('length', $config['block_size']); + $orderBy = get_datatable_order(true); + + $sort_field = $orderBy['field']; + $order = $orderBy['direction']; + + $pagination = ''; + + $pagination = sprintf( + ' LIMIT %d OFFSET %d ', + $length, + $start + ); + + try { + ob_start(); + + $fields = ['*']; + $sql_filters = []; + + if (isset($filter['free_search']) === true + && empty($filter['free_search']) === false + ) { + $sql_filters[] = sprintf( + ' AND (`name` like "%%%s%%" OR `description` like "%%%s%%") ', + $filter['free_search'], + $filter['free_search'] + ); + } + + if (isset($order) === true) { + $dir = 'asc'; + if ($order == 'desc') { + $dir = 'desc'; + }; + + if (in_array( + $sort_field, + [ + 'id_os', + 'name', + 'description', + ] + ) === true + ) { + $order_by = sprintf( + 'ORDER BY `%s` %s', + $sort_field, + $dir + ); + } + } + + // Retrieve data. + $sql = sprintf( + 'SELECT %s + FROM tconfig_os + WHERE 1=1 + %s + %s + %s', + join(',', $fields), + join(' ', $sql_filters), + $order_by, + $pagination + ); + + $count_sql = sprintf( + 'SELECT id_os + FROM tconfig_os + WHERE 1=1 + %s', + join(' ', $sql_filters) + ); + + $return = db_get_all_rows_sql($sql); + if ($return === false) { + $data = []; + } else { + $data = $return; + } + + $data = array_map( + function ($item) { + $item['icon_img'] = ui_print_os_icon($item['id_os'], false, true); + + if (is_management_allowed() === true) { + if (is_metaconsole() === true) { + $osNameUrl = 'index.php?sec=advanced&sec2=advanced/component_management&tab=os_manage&action=edit&tab2=list&id_os='.$item['id_os']; + } else { + $osNameUrl = 'index.php?sec=gsetup&sec2=godmode/setup/os&action=edit&tab=manage_os&id_os='.$item['id_os']; + } + + $item['name'] = html_print_anchor( + [ + 'href' => $osNameUrl, + 'content' => $item['name'], + ], + true + ); + } else { + $item['name'] = $item['name']; + } + + $item['description'] = ui_print_truncate_text( + $item['description'], + 'description', + true, + true + ); + + if (is_management_allowed() === true) { + $item['enable_delete'] = false; + + if ($item['id_os'] > 16) { + $item['enable_delete'] = true; + } + } + + return $item; + }, + $data + ); + + // Retrieve counter. + $count = db_get_value('count(*)', '('.$count_sql.') t'); + + // Datatables format: RecordsTotal && recordsfiltered. + echo json_encode( + [ + 'data' => $data, + 'recordsTotal' => $count, + 'recordsFiltered' => $count, + ] + ); + // Capture output. + $response = ob_get_clean(); + } catch (Exception $e) { + echo json_encode(['error' => $e->getMessage()]); + exit; + } + + // If not valid, show error with issue. + json_decode($response); + if (json_last_error() == JSON_ERROR_NONE) { + // If valid dump. + echo $response; + } else { + echo json_encode( + ['error' => $response] + ); + } + + exit; +} + +if ($method === 'drawOSVersionTable') { + // Datatables offset, limit and order. + $filter = get_parameter('filter', []); + $start = get_parameter('start', 0); + $length = get_parameter('length', $config['block_size']); + $orderBy = get_datatable_order(true); + + $sort_field = $orderBy['field']; + $order = $orderBy['direction']; + + $pagination = ''; + + $pagination = sprintf( + ' LIMIT %d OFFSET %d ', + $length, + $start + ); + + try { + ob_start(); + + $fields = ['*']; + $sql_filters = []; + + if (isset($filter['free_search']) === true + && empty($filter['free_search']) === false + ) { + $sql_filters[] = sprintf( + ' AND (`product` like "%%%s%%" OR `version` like "%%%s%%") ', + $filter['free_search'], + $filter['free_search'] + ); + } + + if (isset($order) === true) { + $dir = 'asc'; + if ($order == 'desc') { + $dir = 'desc'; + }; + + if (in_array( + $sort_field, + [ + 'product', + 'version', + 'end_of_support', + ] + ) === true + ) { + $order_by = sprintf( + 'ORDER BY `%s` %s', + $sort_field, + $dir + ); + } + } + + // Retrieve data. + $sql = sprintf( + 'SELECT %s + FROM tconfig_os_version + WHERE 1=1 + %s + %s + %s', + join(',', $fields), + join(' ', $sql_filters), + $order_by, + $pagination + ); + + $count_sql = sprintf( + 'SELECT id_os_version + FROM tconfig_os_version + WHERE 1=1 + %s', + join(' ', $sql_filters) + ); + + $return = db_get_all_rows_sql($sql); + + if ($return === false) { + $data = []; + } else { + // Format end of life date. + $return = array_map( + function ($item) { + $date_string = date_w_fixed_tz($item['end_of_support']); + $timestamp = strtotime($date_string); + $date_without_time = date('F j, Y', $timestamp); + $item['end_of_support'] = $date_without_time; + return $item; + }, + $return + ); + + $data = $return; + } + + // Retrieve counter. + $count = db_get_value('count(*)', '('.$count_sql.') t'); + + // Datatables format: RecordsTotal && recordsfiltered. + echo json_encode( + [ + 'data' => $data, + 'recordsTotal' => $count, + 'recordsFiltered' => $count, + ] + ); + // Capture output. + $response = ob_get_clean(); + } catch (Exception $e) { + echo json_encode(['error' => $e->getMessage()]); + exit; + } + + // If not valid, show error with issue. + json_decode($response); + if (json_last_error() == JSON_ERROR_NONE) { + // If valid dump. + echo $response; + } else { + echo json_encode( + ['error' => $response] + ); + } + + exit; +} diff --git a/pandora_console/include/chart_generator.php b/pandora_console/include/chart_generator.php index e8ee5f294c..ac0cf16e53 100644 --- a/pandora_console/include/chart_generator.php +++ b/pandora_console/include/chart_generator.php @@ -213,6 +213,8 @@ $hack_metaconsole = (is_metaconsole() === true) ? '../../' : ''; case 'sparse': $params['pdf'] = true; + hd(grafico_modulo_sparse($params), true); + hd("resultadoooooooooooooooooooooooooooo", true); echo grafico_modulo_sparse($params); break; diff --git a/pandora_console/include/functions_agents.php b/pandora_console/include/functions_agents.php index 940e9e3e7f..b4ce559d37 100644 --- a/pandora_console/include/functions_agents.php +++ b/pandora_console/include/functions_agents.php @@ -497,7 +497,8 @@ function agents_get_agents( ], $return=false, $disabled_agent=0, - $use_meta_table=false + $use_meta_table=false, + $join_os_table=false ) { global $config; @@ -720,6 +721,18 @@ function agents_get_agents( ON tpolicy_agents.id_agent=tagente.id_agente'; } + if ($join_os_table === true) { + $os_version_join = ' + INNER JOIN tconfig_os + ON tagente.id_os = tconfig_os.id_os + INNER JOIN tconfig_os_version + ON tconfig_os.name REGEXP tconfig_os_version.product + '; + unset($filter['os_version_end_of_life']); + } else { + $os_version_join = ''; + } + if ($extra) { $where = sprintf( '(%s OR (%s)) AND (%s) AND (%s) %s AND %s %s %s %s', @@ -754,11 +767,12 @@ function agents_get_agents( FROM `%s` tagente LEFT JOIN tagent_secondary_group ON tagent_secondary_group.id_agent=tagente.id_agente - %s + %s %s WHERE %s %s', implode(',', $fields), $table_name, $policy_join, + $os_version_join, $where, $order ); diff --git a/pandora_console/include/functions_html.php b/pandora_console/include/functions_html.php index 551f6812ef..db51873122 100644 --- a/pandora_console/include/functions_html.php +++ b/pandora_console/include/functions_html.php @@ -4865,7 +4865,7 @@ function html_print_header_logo_image(bool $menuCollapsed, bool $return=false) * Key disabled: Whether to disable the input or not. * Key class: HTML class */ -function html_print_input_file($name, $return=false, $options=false) +function html_print_input_file($name, $return=false, $options=false, $inline_upload_anchor_to_form='') { $output = ''; // Start to build the input. @@ -4912,11 +4912,49 @@ function html_print_input_file($name, $return=false, $options=false) $output .= ($options['caption'] ?? __('Select a file')); $output .= ''; + + if ($inline_upload_anchor_to_form !== '') { + // Add script to submit targeted form. + $output .= ''; + $output .= '
'; + } + $output .= ' '; + + if ($inline_upload_anchor_to_form !== '') { + $output .= '
'; + $output .= html_print_button( + __('Upload'), + 'upload-icon-btn', + false, + sprintf( + 'javascript:submitForm("%s")', + $inline_upload_anchor_to_form + ), + [ + 'mode' => 'link', + 'style' => 'min-width: initial;', + ], + true, + ); + $output .= '
'; + } + + if ($inline_upload_anchor_to_form !== '') { + $output .= '
'; + } + // Add script. $output .= ''; @@ -7208,4 +7247,4 @@ function html_print_wizard_diagnosis( } else { echo $output; } -} \ No newline at end of file +} diff --git a/pandora_console/include/functions_reporting.php b/pandora_console/include/functions_reporting.php index c01e44157a..994496322d 100755 --- a/pandora_console/include/functions_reporting.php +++ b/pandora_console/include/functions_reporting.php @@ -773,6 +773,13 @@ function reporting_make_reporting_data( ); break; + case 'end_of_life': + $report['contents'][] = reporting_end_of_life( + $report, + $content + ); + break; + case 'alert_report_actions': $report['contents'][] = reporting_alert_report_actions( $report, @@ -3562,6 +3569,112 @@ function reporting_agent_module_status($report, $content) } +/** + * OS Version End of Life + * + * @param array $report Info Report. + * @param array $content Info content. + * + * @return array + */ +function reporting_end_of_life($report, $content) +{ + global $config; + + $return['type'] = 'end_of_life'; + + if (empty($content['name'])) { + $content['name'] = __('End of life'); + } + + $return['title'] = io_safe_output($content['name']); + $return['landscape'] = $content['landscape']; + $return['pagebreak'] = $content['pagebreak']; + $return['subtitle'] = __('End of life report'); + $return['description'] = io_safe_output($content['description']); + $return['date'] = reporting_get_date_text($report, $content); + $return['label'] = (isset($content['style']['label'])) ? $content['style']['label'] : ''; + + $return['data'] = []; + + $external_source = json_decode( + $content['external_source'], + true + ); + + $servers_ids = [0]; + + if (is_metaconsole() === true) { + $servers_ids = array_column(metaconsole_get_servers(), 'id'); + } + + foreach ($servers_ids as $server_id) { + if (is_metaconsole() === true) { + $connection = metaconsole_get_connection_by_id($server_id); + if (metaconsole_connect($connection) != NOERR) { + continue; + } + } + + $agents = agents_get_agents( + [], + [ + 'alias', + 'direccion', + 'name', + 'os_version', + ], + 'AR', + [ + 'field' => 'nombre', + 'order' => 'ASC', + ], + false, + 0, + false, + true + ); + + $es_os_version = $external_source['os_version']; + + $es_limit_eol_datetime = DateTime::createFromFormat('Y/m/d', $external_source['end_of_life_date']); + + // Post-process returned agents to filter agents using correctly formatted fields. + foreach ($agents as $idx => $agent) { + // Must perform this query and subsequent operations in each iteration (note this is costly) since OS version field may contain HTML entities in BD and decoding can't be fully handled with mysql methods when doing a REGEXP. + $result_end_of_life = db_get_value_sql('SELECT end_of_support FROM tconfig_os_version WHERE "'.io_safe_output($agent['os_version']).'" REGEXP version'); + $agent_eol_datetime = DateTime::createFromFormat('Y/m/d', $result_end_of_life); + + if ((preg_match('/'.$es_os_version.'/', $agent['os_version']) || $es_os_version === '') && $result_end_of_life !== false && $es_limit_eol_datetime >= $agent_eol_datetime) { + // Agent matches an existing OS version. + $agents[$idx]['end_of_life'] = $result_end_of_life; + } else { + // Set agent to be filtered out. + $agents[$idx] = null; + } + } + + if ($agents !== false) { + $agents = array_filter($agents); + } + + if (is_metaconsole() === true) { + $res[$connection['server_name']] = $agents; + + metaconsole_restore_db(); + } + } + + if (is_metaconsole() === true) { + $return['data'] = $res; + } else { + $return['data'] = $agents; + } + + return reporting_check_structure_content($return); +} + + function reporting_exception( $report, $content, diff --git a/pandora_console/include/functions_reporting_html.php b/pandora_console/include/functions_reporting_html.php index 91d8a9e5a5..da2ab3bed0 100644 --- a/pandora_console/include/functions_reporting_html.php +++ b/pandora_console/include/functions_reporting_html.php @@ -391,6 +391,10 @@ function reporting_html_print_report($report, $mini=false, $report_info=1) reporting_html_agent_module_status($table, $item); break; + case 'end_of_life': + reporting_html_end_of_life($table, $item); + break; + case 'alert_report_actions': reporting_html_alert_report_actions($table, $item); break; @@ -2440,6 +2444,123 @@ function reporting_html_agent_module_status($table, $item, $pdf=0) } +/** + * Html report end of life. + * + * @param object $table Head table or false if it comes from pdf. + * @param array $item Items data. + * @param integer $pdf Pdf output. + * + * @return mixed + */ +function reporting_html_end_of_life($table, $item, $pdf=0) +{ + global $config; + + $return_pdf = ''; + + if (empty($item['data']) === true) { + if ($pdf !== 0) { + $return_pdf .= __('No items'); + } else { + $table->colspan['group_report']['cell'] = 3; + $table->cellstyle['group_report']['cell'] = 'text-align: center;'; + $table->data['group_report']['cell'] = __('No items'); + } + } else { + $table_info = new stdClass(); + $table_info->width = '99%'; + + $table_info->align = []; + + if (is_metaconsole() === true) { + $table_info->align['server'] = 'left'; + } + + $table_info->align['agent_alias'] = 'left'; + $table_info->align['ip'] = 'left'; + $table_info->align['os_type'] = 'left'; + $table_info->align['os_version'] = 'left'; + $table_info->align['end_of_life'] = 'left'; + + $table_info->headstyle = []; + + if (is_metaconsole() === true) { + $table_info->headstyle['server'] = 'text-align: left'; + } + + $table_info->headstyle['agent_alias'] = 'text-align: left'; + $table_info->headstyle['ip'] = 'text-align: left'; + $table_info->headstyle['os_type'] = 'text-align: left'; + $table_info->headstyle['os_version'] = 'text-align: left'; + $table_info->headstyle['end_of_life'] = 'text-align: left'; + + $table_info->head = []; + if (is_metaconsole() === true) { + $table_info->head['server'] = __('Server'); + } + + $table_info->head['agent_alias'] = __('Agent alias'); + $table_info->head['ip'] = __('IP'); + $table_info->head['os_type'] = __('OS Type'); + $table_info->head['os_version'] = __('OS Version'); + $table_info->head['end_of_life'] = __('End of life'); + + $table_info->data = []; + + if (is_metaconsole() === true) { + foreach ($item['data'] as $server_name => $agents_per_server) { + foreach ($agents_per_server as $agent) { + $row = []; + + $row['server'] = $server_name; + $row['agent_alias'] = $agent['alias']; + $row['ip'] = $agent['direccion']; + $row['os_type'] = $agent['name']; + $row['os_version'] = $agent['os_version']; + $date_string = date_w_fixed_tz($agent['end_of_life']); + $timestamp = strtotime($date_string); + $date_without_time = date('F j, Y', $timestamp); + $row['end_of_life'] = $date_without_time; + + $table_info->data[] = $row; + } + } + } else { + foreach ($item['data'] as $data) { + $row = []; + + $row['agent_alias'] = $data['alias']; + $row['ip'] = $data['direccion']; + $row['os_type'] = $data['name']; + $row['os_version'] = $data['os_version']; + $date_string = date_w_fixed_tz($data['end_of_life']); + $timestamp = strtotime($date_string); + $date_without_time = date('F j, Y', $timestamp); + $row['end_of_life'] = $date_without_time; + + $table_info->data[] = $row; + } + } + + if ($pdf !== 0) { + $table_info->title = $item['title']; + $table_info->titleclass = 'title_table_pdf'; + $table_info->titlestyle = 'text-align:left;'; + $return_pdf .= html_print_table($table_info, true); + } else { + $table->colspan['data']['cell'] = 3; + $table->cellstyle['data']['cell'] = 'text-align: center;'; + $table->data['data']['cell'] = html_print_table($table_info, true); + } + } + + if ($pdf !== 0) { + return $return_pdf; + } +} + + /** * Function to print to HTML Exception report. * diff --git a/pandora_console/include/functions_reports.php b/pandora_console/include/functions_reports.php index f13e935b6a..bfb43c0607 100755 --- a/pandora_console/include/functions_reports.php +++ b/pandora_console/include/functions_reports.php @@ -814,6 +814,11 @@ function reports_get_report_types($template=false, $not_editor=false) 'name' => __('Agents/Modules status'), ]; + $types['end_of_life'] = [ + 'optgroup' => __('Grouped'), + 'name' => __('End of life'), + ]; + // Only pandora managers have access to the whole database. if (check_acl($config['id_user'], 0, 'PM')) { $types['sql'] = [ diff --git a/pandora_console/operation/agentes/estado_agente.php b/pandora_console/operation/agentes/estado_agente.php index d7eb3e3aed..2759e2739a 100644 --- a/pandora_console/operation/agentes/estado_agente.php +++ b/pandora_console/operation/agentes/estado_agente.php @@ -169,6 +169,7 @@ $refr = get_parameter('refr', 0); $recursion = get_parameter('recursion', 0); $status = (int) get_parameter('status', -1); $os = (int) get_parameter('os', 0); +$os_version_regex = trim(get_parameter('os_version_regex', '')); $policies = (array) get_parameter('policies', []); $ag_custom_fields = (array) get_parameter('ag_custom_fields', []); @@ -393,6 +394,18 @@ $table->data[1][0] = html_print_label_input_block( html_print_select($fields, 'os', $os, '', 'All', 0, true) ); +$table->data[1][1] = html_print_label_input_block( + __('Operating System version').ui_print_help_tip(__('Case insensitive regular expression, e.g. Rocky.* will match the following OS version: Rocky Linux 8.7'), true), + html_print_input_text( + 'os_version_regex', + $os_version_regex, + '', + 35, + 255, + true + ) +); + if (function_exists('policies_get_policies') === true) { $pre_fields = policies_get_policies(false, ['id', 'name']); $fields = []; @@ -401,7 +414,7 @@ if (function_exists('policies_get_policies') === true) { } } -$table->data[1][1] = html_print_label_input_block( +$table->data[2][0] = html_print_label_input_block( __('Policies'), html_print_select($fields, 'policies[]', $policies, '', 'All', 0, true, true) ); @@ -443,8 +456,8 @@ foreach ($custom_fields as $custom_field) { $div_custom_fields .= ''; } -$table->colspan[2][0] = 2; -$table->data[2][0] = ui_toggle( +$table->colspan[3][0] = 2; +$table->data[3][0] = ui_toggle( $div_custom_fields, __('Agent custom fields'), '', @@ -872,6 +885,10 @@ if ($os > 0) { $id_os_sql = ' AND id_os = '.$os; } +if ($os_version_regex !== '') { + $id_os_sql .= ' AND os_version REGEXP \''.$os_version_regex.'\''; +} + if ($all_policies === false && is_array($policies) && count($policies) > 0) { $policies_sql = ' AND tpolicy_agents.id_policy IN ('.implode(',', $policies).')'; } diff --git a/pandora_console/pandoradb.sql b/pandora_console/pandoradb.sql index 440199f901..1392a366ca 100644 --- a/pandora_console/pandoradb.sql +++ b/pandora_console/pandoradb.sql @@ -652,6 +652,17 @@ CREATE TABLE IF NOT EXISTS `tconfig_os` ( PRIMARY KEY (`id_os`) ) ENGINE=InnoDB DEFAULT CHARSET=UTF8MB4; +-- ----------------------------------------------------- +-- Table `tconfig_os_version` +-- ----------------------------------------------------- +CREATE TABLE IF NOT EXISTS `tconfig_os_version` ( + `id_os_version` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `product` TEXT, + `version` TEXT, + `end_of_support` VARCHAR(10) DEFAULT NULL, + PRIMARY KEY (`id_os_version`) +) ENGINE=InnoDB DEFAULT CHARSET=UTF8MB4; + -- ----------------------------------------------------- -- Table `tcontainer` -- ----------------------------------------------------- diff --git a/pandora_console/pandoradb_data.sql b/pandora_console/pandoradb_data.sql index ebf38a35f7..d36f1b5de8 100644 --- a/pandora_console/pandoradb_data.sql +++ b/pandora_console/pandoradb_data.sql @@ -2636,3 +2636,15 @@ INSERT INTO `twelcome_tip_file` (`twelcome_tip_file`,`filename`,`path`) VALUES ( INSERT INTO `twelcome_tip` (`id_lang`,`id_profile`,`title`,`text`,`url`,`enable`) VALUES ('en_GB',0,'Zoom on data graphs','Do you know that Pandora FMS allows you to zoom in on a part of the graph. With that you will expand the information of the graph. If you are looking at a graph for a month and you zoom in, you will be able to see the data for that interval. If you use a graph with full resolution data (we call them TIP graphs) you will be able to see the detail of each piece of data, even if your graph has thousands of samples.','',1); SELECT @last_id := LAST_INSERT_ID(); INSERT INTO `twelcome_tip_file` (`twelcome_tip_file`,`filename`,`path`) VALUES (@last_id,'zoom_en_graficas.png','images/tips/'); + + +-- +-- Dumping data for table `tconfig_os_version` +-- + +LOCK TABLES `tconfig_os_version` WRITE; +INSERT INTO `tconfig_os_version` (`id_os_version`, `product`, `version`, `end_of_support`) VALUES +(1,'Windows.*','7.*','2020/01/14'), +(2,'Cisco.*','IOS 3.4.3','2017/05/12'), +(3,'Linux.*','Centos 7.*','2022/01/01'); +UNLOCK TABLES; diff --git a/pandora_server/lib/PandoraFMS/Core.pm b/pandora_server/lib/PandoraFMS/Core.pm index b90044db58..fe9c011a8b 100644 --- a/pandora_server/lib/PandoraFMS/Core.pm +++ b/pandora_server/lib/PandoraFMS/Core.pm @@ -3915,17 +3915,21 @@ Create a new entry in B optionaly with position information =cut ########################################################################## -sub pandora_create_agent ($$$$$$$$$$;$$$$$$$$$$) { +sub pandora_create_agent ($$$$$$$$$$;$$$$$$$$$$$) { # If parameter event_id is not undef, then create an extended event # related to it instead launch new event. my ($pa_config, $server_name, $agent_name, $address, $group_id, $parent_id, $os_id, $description, $interval, $dbh, $timezone_offset, $longitude, $latitude, $altitude, $position_description, - $custom_id, $url_address, $agent_mode, $alias, $event_id) = @_; + $custom_id, $url_address, $agent_mode, $alias, $event_id, $os_version) = @_; logger ($pa_config, "Server '$server_name' creating agent '$agent_name' address '$address'.", 10); + if (!defined $os_version) { + $os_version = ''; + } + if (!defined($group_id)) { $group_id = pandora_get_agent_group($pa_config, $dbh, $agent_name); if ($group_id <= 0) { @@ -3951,9 +3955,10 @@ sub pandora_create_agent ($$$$$$$$$$;$$$$$$$$$$) { 'url_address' => $url_address, 'timezone_offset' => $timezone_offset, 'alias' => safe_input($alias), - 'update_module_count' => 1, # Force to replicate in metaconsole - }); - + 'os_version' => $os_version, + 'update_module_count' => 1, # Force to replicate in metaconsole + }); + my $agent_id = db_insert ($dbh, 'id_agente', "INSERT INTO tagente $columns", @{$values}); # Save GIS data diff --git a/pandora_server/lib/PandoraFMS/DiscoveryServer.pm b/pandora_server/lib/PandoraFMS/DiscoveryServer.pm index d331c7986d..777e51ec8b 100644 --- a/pandora_server/lib/PandoraFMS/DiscoveryServer.pm +++ b/pandora_server/lib/PandoraFMS/DiscoveryServer.pm @@ -788,8 +788,8 @@ sub get_recon_credential_macro($$$) { ################################################################################ # Guess the OS using xprobe2 or nmap. ################################################################################ -sub PandoraFMS::Recon::Base::guess_os($$;$) { - my ($self, $device, $string_flag) = @_; +sub PandoraFMS::Recon::Base::guess_os($$;$$$) { + my ($self, $device, $string_flag, $return_version_only) = @_; return $self->{'os_id'}{$device} if defined($self->{'os_id'}{$device}); @@ -810,15 +810,32 @@ sub PandoraFMS::Recon::Base::guess_os($$;$) { if (-x $self->{'pa_config'}->{'nmap'}) { my $return = `"$self->{pa_config}->{nmap}" -sSU -T5 -F -O --osscan-limit $device 2>$DEVNULL`; return OS_OTHER if ($? != 0); - my $str_os; + my ($str_os, $os_version); if ($return =~ /Aggressive OS guesses:(.*?)(?>\(\d+%\),)|^OS details:(.*?)$/mi) { if(defined($1) && $1 ne "") { $str_os = $1; } else { $str_os = $2; } + + my $pandora_os = pandora_get_os($self->{'dbh'}, $str_os); + my $pandora_os_name = pandora_get_os_by_id($self->{'dbh'}, $pandora_os); + + if ($return_version_only == 1) { + if ($str_os =~ /$pandora_os_name/i) { + $os_version = $'; # Get string after matched found OS name. + $os_version =~ s/^\s+//; # Remove leading spaces. + $os_version =~ s/\s+$//; # Remove trailing spaces. + } else { + $os_version = ''; + } + + return $os_version; + + } + return $str_os if is_enabled($string_flag); - return pandora_get_os($self->{'dbh'}, $str_os); + return $pandora_os; } } @@ -1640,6 +1657,10 @@ sub PandoraFMS::Recon::Base::report_scanned_agents($;$) { $os_id = $self->guess_os($data->{'agent'}{'direccion'}); } + if (is_empty($data->{'agent'}{'os_version'})) { + $data->{'agent'}{'os_version'} = $self->guess_os($data->{'agent'}{'direccion'}, undef, 1); + } + $self->call('message', "Agent accepted: ".$data->{'agent'}{'nombre'}, 5); # Agent creation. @@ -1681,7 +1702,7 @@ sub PandoraFMS::Recon::Base::report_scanned_agents($;$) { $os_id, $data->{'agent'}->{'description'}, $data->{'agent'}{'interval'}, $self->{'dbh'}, $data->{'agent'}{'timezone_offset'}, undef, undef, undef, undef, - undef, undef, 1, $data->{'agent'}{'alias'} + undef, undef, 1, $data->{'agent'}{'alias'}, undef, $data->{'agent'}{'os_version'} ); # Add found IP addresses to the agent. diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index 5da49dea30..5001beb4c3 100755 --- a/pandora_server/util/pandora_manage.pl +++ b/pandora_server/util/pandora_manage.pl @@ -6671,6 +6671,19 @@ sub cli_set_event_storm_protection () { db_do ($dbh, 'UPDATE tconfig SET value=? WHERE token=?', $value, 'event_storm_protection'); } +############################################################################## +# Set existing OS and OS version for a specific agent +# Related option: --agent_set_os +############################################################################## +sub cli_agent_set_os() { + my ($id_agente,$id_os,$os_version) = @ARGV[2..4]; + + my $os_name = get_db_value($dbh, 'SELECT name FROM tconfig_os WHERE id_os = ?',$id_os); + exist_check($id_os,'tconfig_os',$os_name); + + db_process_update($dbh, 'tagente', {'id_os' => $id_os, 'os_version' => $os_version}, {'id_agente' => $id_agente}); +} + ############################################################################## # Return event name given a event id ############################################################################## @@ -8147,7 +8160,11 @@ sub pandora_manage_main ($$$) { elsif ($param eq '--set_event_storm_protection') { param_check($ltotal, 1); cli_set_event_storm_protection(); - } + } + elsif ($param eq '--agent_set_os') { + param_check($ltotal, 3, 1); + cli_agent_set_os(); + } elsif ($param eq '--create_custom_graph') { param_check($ltotal, 11); cli_create_custom_graph(); From 753851410e6f5e4f73854c6b43686e02321d8080 Mon Sep 17 00:00:00 2001 From: "alejandro.campos@artica.es" Date: Wed, 6 Sep 2023 17:02:15 +0200 Subject: [PATCH 03/26] implemented os version management --- pandora_console/godmode/setup/os_version.builder.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/pandora_console/godmode/setup/os_version.builder.php b/pandora_console/godmode/setup/os_version.builder.php index 89e0092085..caf968e5be 100644 --- a/pandora_console/godmode/setup/os_version.builder.php +++ b/pandora_console/godmode/setup/os_version.builder.php @@ -100,8 +100,6 @@ if ($is_management_allowed === true) { $values['product'] = $product; $values['version'] = $version; $values['end_of_support'] = $end_of_life_date; - hd($values, true); - hd($idOS, true); $result = db_process_sql_update('tconfig_os_version', $values, ['id_os_version' => $idOS]); if ($result === false) { From eea6400f453a11b93d71d7a4d0891da38f34977b Mon Sep 17 00:00:00 2001 From: "alejandro.campos@artica.es" Date: Wed, 6 Sep 2023 17:05:07 +0200 Subject: [PATCH 04/26] implemented os version management --- pandora_console/include/chart_generator.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/pandora_console/include/chart_generator.php b/pandora_console/include/chart_generator.php index ac0cf16e53..e8ee5f294c 100644 --- a/pandora_console/include/chart_generator.php +++ b/pandora_console/include/chart_generator.php @@ -213,8 +213,6 @@ $hack_metaconsole = (is_metaconsole() === true) ? '../../' : ''; case 'sparse': $params['pdf'] = true; - hd(grafico_modulo_sparse($params), true); - hd("resultadoooooooooooooooooooooooooooo", true); echo grafico_modulo_sparse($params); break; From f76615ba72cc04fed5f58c0c7c05404869dbcb97 Mon Sep 17 00:00:00 2001 From: "alejandro.campos@artica.es" Date: Thu, 7 Sep 2023 17:53:31 +0200 Subject: [PATCH 05/26] change --- pandora_console/include/functions_html.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/pandora_console/include/functions_html.php b/pandora_console/include/functions_html.php index 6c6538cc58..0dfbdc15af 100644 --- a/pandora_console/include/functions_html.php +++ b/pandora_console/include/functions_html.php @@ -4946,9 +4946,6 @@ function html_print_input_file($name, $return=false, $options=false, $inline_upl true, ); $output .= ''; - } - - if ($inline_upload_anchor_to_form !== '') { $output .= ''; } From f410f09745040ae6eb48cf4565563452cb14dfcb Mon Sep 17 00:00:00 2001 From: "alejandro.campos@artica.es" Date: Thu, 14 Sep 2023 10:43:35 +0200 Subject: [PATCH 06/26] change mr --- pandora_console/extras/mr/65.sql | 12 ------------ pandora_console/extras/mr/66.sql | 12 ++++++++++++ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/pandora_console/extras/mr/65.sql b/pandora_console/extras/mr/65.sql index 3887862d3e..290c9a3972 100644 --- a/pandora_console/extras/mr/65.sql +++ b/pandora_console/extras/mr/65.sql @@ -62,14 +62,6 @@ CREATE TABLE IF NOT EXISTS `tnetwork_usage_filter` ( PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=UTF8MB4; -CREATE TABLE IF NOT EXISTS `tconfig_os_version` ( - `id_os_version` INT UNSIGNED NOT NULL AUTO_INCREMENT, - `product` TEXT, - `version` TEXT, - `end_of_support` VARCHAR(10) DEFAULT NULL, - PRIMARY KEY (`id_os_version`) -) ENGINE=InnoDB DEFAULT CHARSET=UTF8MB4; - ALTER TABLE `tlayout` ADD COLUMN `grid_color` VARCHAR(45) NOT NULL DEFAULT '#cccccc' AFTER `maintenance_mode`, ADD COLUMN `grid_size` VARCHAR(45) NOT NULL DEFAULT '10' AFTER `grid_color`; @@ -86,10 +78,6 @@ ALTER TABLE `tmetaconsole_agent` ADD COLUMN `disabled_by_downtime` TINYINT NOT N DELETE FROM tconfig WHERE token = 'refr'; -INSERT INTO `tconfig_os_version` (`id_os_version`, `product`, `version`, `end_of_support`) VALUES (1,'Windows.*','7.*','2020/01/14'); -INSERT INTO `tconfig_os_version` (`id_os_version`, `product`, `version`, `end_of_support`) VALUES (2,'Cisco.*','IOS 3.4.3','2017/05/12'); -INSERT INTO `tconfig_os_version` (`id_os_version`, `product`, `version`, `end_of_support`) VALUES (3,'Linux.*','Centos 7.*','2022/01/01'); - INSERT INTO `tmodule_inventory` (`id_module_inventory`, `id_os`, `name`, `description`, `interpreter`, `data_format`, `code`, `block_mode`,`script_mode`) VALUES (37,2,'CPU','CPU','','Brand;Clock;Model','',0,2); INSERT INTO `tmodule_inventory` (`id_module_inventory`, `id_os`, `name`, `description`, `interpreter`, `data_format`, `code`, `block_mode`,`script_mode`) VALUES (38,2,'RAM','RAM','','Size','',0,2); diff --git a/pandora_console/extras/mr/66.sql b/pandora_console/extras/mr/66.sql index 8161c4c2b6..173aedd395 100644 --- a/pandora_console/extras/mr/66.sql +++ b/pandora_console/extras/mr/66.sql @@ -13,6 +13,14 @@ CREATE TABLE IF NOT EXISTS `tgraph_analytics_filter` ( PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=UTF8MB4; +CREATE TABLE IF NOT EXISTS `tconfig_os_version` ( + `id_os_version` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `product` TEXT, + `version` TEXT, + `end_of_support` VARCHAR(10) DEFAULT NULL, + PRIMARY KEY (`id_os_version`) +) ENGINE=InnoDB DEFAULT CHARSET=UTF8MB4; + UPDATE `twelcome_tip` SET title = 'Scheduled downtimes', url = 'https://pandorafms.com/manual/en/documentation/04_using/11_managing_and_administration#scheduled_downtimes' @@ -44,4 +52,8 @@ 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`; +INSERT INTO `tconfig_os_version` (`id_os_version`, `product`, `version`, `end_of_support`) VALUES (1,'Windows.*','7.*','2020/01/14'); +INSERT INTO `tconfig_os_version` (`id_os_version`, `product`, `version`, `end_of_support`) VALUES (2,'Cisco.*','IOS 3.4.3','2017/05/12'); +INSERT INTO `tconfig_os_version` (`id_os_version`, `product`, `version`, `end_of_support`) VALUES (3,'Linux.*','Centos 7.*','2022/01/01'); + COMMIT; From dbd418d6dc376b404830c3a7893909c53ede1a65 Mon Sep 17 00:00:00 2001 From: "alejandro.campos@artica.es" Date: Wed, 20 Sep 2023 16:01:23 +0200 Subject: [PATCH 07/26] remove trace --- .../godmode/reporting/reporting_builder.item_editor.php | 2 +- pandora_console/include/functions_html.php | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/pandora_console/godmode/reporting/reporting_builder.item_editor.php b/pandora_console/godmode/reporting/reporting_builder.item_editor.php index 2a58c0601d..e350204930 100755 --- a/pandora_console/godmode/reporting/reporting_builder.item_editor.php +++ b/pandora_console/godmode/reporting/reporting_builder.item_editor.php @@ -6635,7 +6635,7 @@ function loadGeneralAgents(agent_group) { if (group < 0) { return; } - console.log("!!!!!!!!!!!!!!!!!!!!!!!!",group); + group = agent_group || group; params.push("get_agents=1"); diff --git a/pandora_console/include/functions_html.php b/pandora_console/include/functions_html.php index 382aaffc5b..235d5f2bba 100644 --- a/pandora_console/include/functions_html.php +++ b/pandora_console/include/functions_html.php @@ -4920,7 +4920,6 @@ function html_print_input_file($name, $return=false, $options=false, $inline_upl $output .= ''; From c6a04d5d8fb5df86e7d8eb6dba85a2031a3a6382 Mon Sep 17 00:00:00 2001 From: daniel Date: Fri, 22 Sep 2023 12:56:01 +0200 Subject: [PATCH 08/26] fix show comment events ticket pandora_enterprise#12066 --- .../include/javascript/pandora_events.js | 2 +- pandora_console/operation/events/events.php | 13 +++++-------- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/pandora_console/include/javascript/pandora_events.js b/pandora_console/include/javascript/pandora_events.js index 940fd3ce5d..5e272ee0e7 100644 --- a/pandora_console/include/javascript/pandora_events.js +++ b/pandora_console/include/javascript/pandora_events.js @@ -52,7 +52,7 @@ function show_event_dialog(event, dialog_page) { .empty() .append(data) .dialog({ - title: event.evento, + title: event.event_title, resizable: true, draggable: true, modal: false, diff --git a/pandora_console/operation/events/events.php b/pandora_console/operation/events/events.php index 059c8f90ec..5300bf109a 100644 --- a/pandora_console/operation/events/events.php +++ b/pandora_console/operation/events/events.php @@ -511,8 +511,10 @@ if (is_ajax() === true) { ); } - $tmp->evento = str_replace('"', '', io_safe_output($tmp->evento)); - $event_text = $tmp->evento; + $output_event_name = str_replace('"', '', io_safe_output($tmp->evento)); + $tmp->event_title = $output_event_name; + $tmp->b64 = base64_encode(json_encode($tmp)); + $tmp->evento = $output_event_name; $tmp->evento = ui_print_truncate_text( $tmp->evento, @@ -623,7 +625,7 @@ if (is_ajax() === true) { $total_sec = strtotime($tmp->timestamp); $total_sec += $dif; - $last_contact = date($confb64ig['date_format'], $total_sec); + $last_contact = date($config['date_format'], $total_sec); $last_contact_value = ui_print_timestamp($last_contact, true); } else { $title = date($config['date_format'], strtotime($tmp->timestamp)); @@ -662,11 +664,6 @@ if (is_ajax() === true) { ); } - $aux_event = $tmp->evento; - $tmp->evento = $event_text; - $tmp->b64 = base64_encode(json_encode($tmp)); - $tmp->evento = $aux_event; - $tmp->user_comment = ui_print_comments( event_get_last_comment( $item, From db7a5e121d68d7eba8092dbd8203ac182e187a0c Mon Sep 17 00:00:00 2001 From: Jorge Rincon Date: Mon, 25 Sep 2023 17:10:43 +0200 Subject: [PATCH 09/26] Add the None option to the date filter to prioritize the period of the report items. --- pandora_console/include/functions_html.php | 1 + .../operation/reporting/reporting_viewer.php | 10 ++++++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/pandora_console/include/functions_html.php b/pandora_console/include/functions_html.php index 8458dcfcc8..1c908b50d1 100644 --- a/pandora_console/include/functions_html.php +++ b/pandora_console/include/functions_html.php @@ -7286,6 +7286,7 @@ function html_print_select_date_range( $fields[SECONDS_1MONTH] = __('Last 30 days'); $fields['custom'] = __('Custom'); $fields['chose_range'] = __('Chose start/end date period'); + $fields['none'] = __('None'); $output = html_print_input_hidden('custom_date', $custom_date, true); $output .= '
'; diff --git a/pandora_console/operation/reporting/reporting_viewer.php b/pandora_console/operation/reporting/reporting_viewer.php index e3e07590ba..cc42d7e6ac 100755 --- a/pandora_console/operation/reporting/reporting_viewer.php +++ b/pandora_console/operation/reporting/reporting_viewer.php @@ -58,7 +58,7 @@ $datetime_end = strtotime($date_end.' '.$time_end); // Calculate new inteval for all reports. $custom_date = get_parameter('custom_date', 0); -$date = get_parameter('date', SECONDS_1DAY); +$date = get_parameter('date', 'none'); $date_text = get_parameter('date_text', SECONDS_1DAY); $custom_date_end = ''; @@ -111,6 +111,9 @@ if ($custom_date === '1') { $first_of_week = date('Y-m-d', strtotime('monday', strtotime('last week'))); $period = (strtotime($date_end) - strtotime($first_of_week)); } +} else if ($date === 'none') { + // Prioritize the report item period based on the current local date/time. + $date_end = date('Y/m/d H:i:s'); } else { $date_end = date('Y/m/d H:i:s'); $date_start = date('Y/m/d H:i:s', (strtotime($date_end) - $date)); @@ -315,12 +318,12 @@ if ($html_menu_export === ENTERPRISE_NOT_HOOK) { if ((bool) is_metaconsole() === true) { $table2->data[0][2] = html_print_label_input_block( __('Date').' ', - html_print_select_date_range('date', true, get_parameter('date', SECONDS_1DAY), $date_init, $time_init, date('Y/m/d'), date('H:i:s'), $date_text), + html_print_select_date_range('date', true, get_parameter('date', 'none'), $date_init, $time_init, date('Y/m/d'), date('H:i:s'), $date_text), ); } else { $table2->data[0][2] = html_print_label_input_block( __('Date').' ', - html_print_select_date_range('date', true, get_parameter('date', SECONDS_1DAY), $date_init, $time_init, date('Y/m/d'), date('H:i:s'), $date_text), + html_print_select_date_range('date', true, get_parameter('date', 'none'), $date_init, $time_init, date('Y/m/d'), date('H:i:s'), $date_text), ['label_class' => 'filter_label_position_before'] ); } @@ -451,7 +454,6 @@ $(document).ready (function () { $("#string_to").show(); $('#string_from').show(); $("#string_items").hide(); - console.log($(".filter_label_position_before").html()); } else { $("#string_to").hide(); $('#string_from').hide(); From 0b4ee357804b47c116d8bca7460e445011f61e53 Mon Sep 17 00:00:00 2001 From: Calvo Date: Wed, 27 Sep 2023 11:01:21 +0200 Subject: [PATCH 10/26] Fix query agent events --- pandora_console/include/ajax/events.php | 2 +- pandora_console/include/functions_events.php | 5 +---- pandora_console/operation/agentes/status_events.php | 2 +- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/pandora_console/include/ajax/events.php b/pandora_console/include/ajax/events.php index ddf36ee912..be8b095d25 100644 --- a/pandora_console/include/ajax/events.php +++ b/pandora_console/include/ajax/events.php @@ -2000,7 +2000,7 @@ if ($table_events) { include_once 'include/functions_graph.php'; $id_agente = (int) get_parameter('id_agente'); - $all_events_24h = (int) get_parameter('all_events_24h', 1); + $all_events_24h = (int) get_parameter('all_events_24h', 0); // Fix: for tag functionality groups have to be all user_groups // (propagate ACL funct!). diff --git a/pandora_console/include/functions_events.php b/pandora_console/include/functions_events.php index 32113327b8..64a2f2b84e 100644 --- a/pandora_console/include/functions_events.php +++ b/pandora_console/include/functions_events.php @@ -2404,14 +2404,11 @@ function events_print_event_table( $filter = '1 = 1'; } - $secondary_join = 'LEFT JOIN tagent_secondary_group tasg ON tevento.id_agente = tasg.id_agent'; - $sql = sprintf( 'SELECT DISTINCT tevento.* - FROM tevento %s + FROM tevento WHERE %s %s ORDER BY utimestamp DESC LIMIT %d', - $secondary_join, $agent_condition, $filter, $limit diff --git a/pandora_console/operation/agentes/status_events.php b/pandora_console/operation/agentes/status_events.php index 30df1fb897..39b8b9edf0 100755 --- a/pandora_console/operation/agentes/status_events.php +++ b/pandora_console/operation/agentes/status_events.php @@ -43,7 +43,7 @@ html_print_div( ?>