From 134bc6ac3fe0b07f00073df9b2d89ed692b6f6c5 Mon Sep 17 00:00:00 2001 From: Calvo Date: Mon, 3 Apr 2023 18:06:48 +0200 Subject: [PATCH 01/33] Recovered alerts skipping when threshold applies --- pandora_server/lib/PandoraFMS/Core.pm | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/pandora_server/lib/PandoraFMS/Core.pm b/pandora_server/lib/PandoraFMS/Core.pm index 4726df4710..047c52acc0 100644 --- a/pandora_server/lib/PandoraFMS/Core.pm +++ b/pandora_server/lib/PandoraFMS/Core.pm @@ -801,10 +801,6 @@ sub pandora_process_alert ($$$$$$$$;$$) { db_do($dbh, 'UPDATE ' . $table . ' SET times_fired = 0, internal_counter = 0 WHERE id = ?', $id); - # Reset action thresholds - if (defined ($alert->{'id_template_module'})) { - db_do($dbh, 'UPDATE talert_template_module_actions SET last_execution = 0 WHERE id_alert_template_module = ?', $id); - } if ($pa_config->{'alertserver'} == 1 || $pa_config->{'alertserver_queue'} == 1) { pandora_queue_alert($pa_config, $dbh, [$data, $agent, $module, @@ -1031,6 +1027,7 @@ sub pandora_execute_alert { $threshold = $action->{'action_threshold'} if (defined ($action->{'action_threshold'}) && $action->{'action_threshold'} > 0); $threshold = $action->{'module_action_threshold'} if (defined ($action->{'module_action_threshold'}) && $action->{'module_action_threshold'} > 0); if (time () >= ($action->{'last_execution'} + $threshold)) { + print "Entro"; my $monitoring_event_custom_data = ''; push(@{$custom_data->{'actions'}}, safe_output($action->{'action_name'})); @@ -1043,10 +1040,22 @@ sub pandora_execute_alert { pandora_execute_action ($pa_config, $data, $agent, $alert, $alert_mode, $action, $module, $dbh, $timestamp, $extra_macros, $monitoring_event_custom_data); } else { - if (defined ($module)) { - logger ($pa_config, "Skipping action " . safe_output($action->{'name'}) . " for alert '" . safe_output($alert->{'name'}) . "' module '" . safe_output($module->{'nombre'}) . "'.", 10); - } else { - logger ($pa_config, "Skipping action " . safe_output($action->{'name'}) . " for alert '" . safe_output($alert->{'name'}) . "'.", 10); + if($alert_mode == RECOVERED_ALERT) { + # Reset action thresholds + if (defined ($alert->{'id_template_module'})) { + db_do($dbh, 'UPDATE talert_template_module_actions SET last_execution = 0 WHERE id_alert_template_module = ?', $alert->{'id_template_module'}); + if (defined ($module)) { + logger ($pa_config, "Skipping recover action " . safe_output($action->{'name'}) . " for alert '" . safe_output($alert->{'name'}) . "' module '" . safe_output($module->{'nombre'}) . "'.", 10); + } else { + logger ($pa_config, "Skipping recover action " . safe_output($action->{'name'}) . " for alert '" . safe_output($alert->{'name'}) . "'.", 10); + } + } + } else { + if (defined ($module)) { + logger ($pa_config, "Skipping action " . safe_output($action->{'name'}) . " for alert '" . safe_output($alert->{'name'}) . "' module '" . safe_output($module->{'nombre'}) . "'.", 10); + } else { + logger ($pa_config, "Skipping action " . safe_output($action->{'name'}) . " for alert '" . safe_output($alert->{'name'}) . "'.", 10); + } } } } From c7b62c587b122f8e61dae542438cb50f8d6ff531 Mon Sep 17 00:00:00 2001 From: Jonathan Date: Wed, 12 Apr 2023 13:39:48 +0200 Subject: [PATCH 02/33] #10597 logo pandora deactivated --- pandora_console/general/node_deactivated.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pandora_console/general/node_deactivated.php b/pandora_console/general/node_deactivated.php index c88f4f599e..c6001abbc4 100644 --- a/pandora_console/general/node_deactivated.php +++ b/pandora_console/general/node_deactivated.php @@ -38,6 +38,11 @@ ui_require_css_file('maintenance');
'responsive flex margn'] + ); html_print_image( 'images/maintenance.png', false, From 9553c42496ec1d62e2b0a58cbd0cba49a548dc12 Mon Sep 17 00:00:00 2001 From: "alejandro.campos@artica.es" Date: Wed, 19 Apr 2023 19:21:38 +0200 Subject: [PATCH 03/33] implemented agent deploy wizard --- pandora_console/fonts/FiraCode-Regular.woff | Bin 0 -> 105436 bytes .../godmode/agentes/agent_deploy.php | 71 ++ .../godmode/agentes/modificar_agente.php | 33 +- .../include/class/AgentDeployWizard.class.php | 809 ++++++++++++++++++ pandora_console/include/functions_html.php | 37 +- pandora_console/include/javascript/stepper.js | 69 ++ .../include/styles/agent_deploy_wizard.css | 85 ++ pandora_console/include/styles/pandora.css | 234 +++++ 8 files changed, 1328 insertions(+), 10 deletions(-) create mode 100644 pandora_console/fonts/FiraCode-Regular.woff create mode 100644 pandora_console/godmode/agentes/agent_deploy.php create mode 100644 pandora_console/include/class/AgentDeployWizard.class.php create mode 100644 pandora_console/include/javascript/stepper.js create mode 100644 pandora_console/include/styles/agent_deploy_wizard.css diff --git a/pandora_console/fonts/FiraCode-Regular.woff b/pandora_console/fonts/FiraCode-Regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..edae9aab94a1d5770bde3c8dff91df5cd1cd154a GIT binary patch literal 105436 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

c78u_DvfGFH?`hKGu+c}oAT;-=!t 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

J=VoG~!BRQ~@h^Rg$&~GXmvW1@aGC1-N&LS>QG1 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 a0002hq$daf0002j)|RIL0002j*733WPoY`> literal 0 HcmV?d00001 diff --git a/pandora_console/godmode/agentes/agent_deploy.php b/pandora_console/godmode/agentes/agent_deploy.php new file mode 100644 index 0000000000..44c9d3dcb0 --- /dev/null +++ b/pandora_console/godmode/agentes/agent_deploy.php @@ -0,0 +1,71 @@ + '[AgentDeployWizard]'.$e->getMessage() ]); + exit; + } else { + echo '[AgentDeployWizard]'.$e->getMessage(); + } + + // Stop this execution, but continue 'globally'. + return; +} + +// AJAX controller. +if (is_ajax()) { + $method = get_parameter('method'); + + if (method_exists($adw, $method) === true) { + if ($adw->ajaxMethod($method) === true) { + $adw->{$method}(); + } else { + $adw->error('Unavailable method.'); + } + } else { + $adw->error('Method not found. ['.$method.']'); + } + + // Stop any execution. + exit; +} else { + // Run. + $adw->run(); +} diff --git a/pandora_console/godmode/agentes/modificar_agente.php b/pandora_console/godmode/agentes/modificar_agente.php index d9453eb931..78ec0a5a57 100644 --- a/pandora_console/godmode/agentes/modificar_agente.php +++ b/pandora_console/godmode/agentes/modificar_agente.php @@ -419,6 +419,9 @@ ui_toggle( 'filter-datatable-main box-flat white_table_graph fixed_filter_bar' ); + +require_once 'godmode/agentes/agent_deploy.php'; + // Data table. $selected = true; $selectNameUp = false; @@ -1025,23 +1028,35 @@ if ($agents !== false) { if ((bool) check_acl($config['id_user'], 0, 'AW') === true) { // Create agent button. - echo '
'; + echo '
'; + + $buttons = html_print_button( + __('Create agent'), + 'crt-2', + false, + '', + [ + 'icon' => 'next', + 'onClick' => "document.getElementById('create-agent').submit();", + ], + true + ).html_print_button( + __('Deploy agent'), + 'modal_deploy_agent', + false, + '', + [], + true + ); html_print_action_buttons( - html_print_submit_button( - __('Create agent'), - 'crt-2', - false, - [ 'icon' => 'next' ], - true - ), + $buttons, [ 'type' => 'data_table', 'class' => 'fixed_action_buttons', 'right_content' => $tablePagination, ] ); - echo ''; } ?> diff --git a/pandora_console/include/class/AgentDeployWizard.class.php b/pandora_console/include/class/AgentDeployWizard.class.php new file mode 100644 index 0000000000..faa2b37bc0 --- /dev/null +++ b/pandora_console/include/class/AgentDeployWizard.class.php @@ -0,0 +1,809 @@ +AJAXMethods); + } + + + /** + * Generates a JSON error. + * + * @param string $msg Error message. + * + * @return void + */ + public function error($msg) + { + echo json_encode( + ['error' => $msg] + ); + } + + + /** + * Minor function to dump json message as ajax response. + * + * @param string $type Type: result || error. + * @param string $msg Message. + * @param boolean $delete Deletion messages. + * + * @return void + */ + private function ajaxMsg($type, $msg, $delete=false) + { + if ($type === 'error') { + $msg_title = ($delete === true) ? 'Failed while removing' : 'Failed while saving'; + } else { + $msg_title = ($delete === true) ? 'Successfully deleted' : 'Successfully saved into keystore'; + } + + echo json_encode( + [ $type => __($msg_title).':
'.$msg ] + ); + + exit; + } + + + /** + * Initializes object and validates user access. + * + * @param string $ajax_controller Path of ajaxController, is the 'page' + * variable sent in ajax calls. + * + * @return object + */ + public function __construct($ajax_controller) + { + global $config; + + // Check access. + check_login(); + + if ((bool) check_acl($config['id_user'], 0, 'AR') === false) { + db_pandora_audit( + AUDIT_LOG_ACL_VIOLATION, + 'Trying to access agent deploy wizard' + ); + + if (is_ajax()) { + echo json_encode(['error' => 'noaccess']); + } else { + include 'general/noaccess.php'; + } + + exit; + } + + $this->ajaxController = $ajax_controller; + + return $this; + } + + + /** + * Prints inputs for modal "Deploy agents". + * + * @return void + */ + public function loadModal() + { + ob_start(); + echo '
'; + echo $this->getModalContent(); + echo '
'; + echo ob_get_clean(); + } + + + /** + * Run AgentDeployWizard. + * + * @return void + */ + public function run() + { + global $config; + + if (check_acl($config['id_user'], 0, 'AR') === false) { + db_pandora_audit( + AUDIT_LOG_ACL_VIOLATION, + 'Trying to access agent deploy.' + ); + include 'general/noaccess.php'; + return; + } + + ui_require_css_file('agent_deploy_wizard'); + + // Auxiliar div for agent deploy modal. + echo ''; + + echo $this->loadJS(); + } + + + /** + * Generates content of modal. + * + * @param array $values Values or null. + * + * @return string Inputs. + */ + public function getModalContent() + { + global $config; + + ob_start(); + + $inputs = []; + + // Container div for stepper. + $stepper_container = html_print_div( + [ + 'id' => 'stepper_container', + 'class' => 'stepper', + ], + true + ); + + html_print_div( + [ + 'id' => 'modal_header', + 'class' => 'margin-bottom-10', + 'content' => $stepper_container, + ] + ); + + // Deploy configuration. + $tableConfiguration = new stdClass(); + $tableConfiguration->class = 'filter-table-adv w100p'; + $tableConfiguration->data = []; + $tableConfiguration->style = []; + $tableConfiguration->cellclass = []; + $tableConfiguration->colspan = []; + $tableConfiguration->rowclass['os'] = 'margin-bottom-5'; + $tableConfiguration->rowstyle['block2'] = 'display: flex; justify-content: space-between;'; + $tableConfiguration->rowspan = []; + + $windows_label_img = html_print_image( + '/images/windows@os.svg', + true, + ['class' => 'installer-title-icon main_menu_icon'] + ); + + $windows_label = html_print_div( + [ + 'style' => 'display: flex;align-items: center; margin-top: 5px;margin-bottom: 5px;', + 'content' => $windows_label_img.'Windows', + ], + true + ); + + $linux_label_img = html_print_image( + '/images/linux@os.svg', + true, + ['class' => 'installer-title-icon main_menu_icon'] + ); + + $linux_label = html_print_div( + [ + 'style' => 'display: flex;align-items: center; margin-top: 5px;margin-bottom: 5px;', + 'content' => $linux_label_img.'Unix / Linux', + ], + true + ); + + $mac_label_img = html_print_image( + '/images/apple@os.svg', + true, + ['class' => 'installer-title-icon main_menu_icon'] + ); + + $mac_label = html_print_div( + [ + 'style' => 'display: flex;align-items: center; margin-top: 5px;margin-bottom: 5px;', + 'content' => $mac_label_img.'Mac OS', + ], + true + ); + + // Operating System switch buttons. + $switchButtons = []; + $switchButtons[] = html_print_radio_button_extended( + 'os', + 0, + $windows_label, + 0, + false, + '', + '', + true + ); + $switchButtons[] = html_print_radio_button_extended( + 'os', + 1, + $linux_label, + 0, + false, + '', + '', + true + ); + $switchButtons[] = html_print_radio_button_extended( + 'os', + 2, + $mac_label, + 0, + false, + '', + '', + true + ); + + $sub_tip = ''.__('Please note that all OS must be 64-bit based architecture').''; + + $tableConfiguration->data['os'][] = html_print_label_input_block( + __('Choose your OS'), + html_print_div( + [ + 'id' => 'os_selector', + 'class' => 'switch_radio_button', + 'content' => implode('', $switchButtons), + ], + true + ).$sub_tip + ); + + /*$stepper_container = html_print_div( + [ + 'class' => 'switch_radio_button', + 'content' + ], + true + );*/ + + $server_add_help_tip = ui_print_help_tip( + __('Use your %s Data Server IP address here. It must be possible to establish a connection from the agent to port 41121/tcp of this address.', get_product_name()), + true + ); + + $tableConfiguration->data['block2'][0] = html_print_label_input_block( + __('Server address').$server_add_help_tip, + html_print_input_text( + 'server_addr', + $_SERVER['SERVER_ADDR'], + '', + 16, + 100, + true, + false, + true, + '', + 'w260px' + ) + ); + + $tableConfiguration->data['block2'][1] = html_print_label_input_block( + __('Group'), + html_print_select_groups( + false, + 'AR', + false, + 'group', + $group, + '', + '', + 0, + true, + false, + true, + 'w260px', + false, + '', + '', + false, + 'id_grupo', + false, + false, + false, + '260px', + false, + true, + ) + ); + + echo '
'; + + echo '
'; + echo ''; + + html_print_div( + [ + 'id' => 'installer_buttonset', + 'class' => 'flex-row', + 'style' => '', + 'content' => html_print_button( + __('Change configuration'), + 'change_configuration', + false, + '', + ['class' => 'secondary'], + true, + ).html_print_button( + __('Done'), + 'done', + false, + '', + ['style' => 'min-width: 0;'], + true + ) + ] + ); + + echo '
'; + + return ob_get_clean(); + } + + + /** + * Loads JS content. + * + * @return string JS content. + */ + public function loadJS() + { + ob_start(); + + ui_require_javascript_file('stepper', 'include/javascript/', true); + + // Javascript content. + ?> + + '; return $output; -} \ No newline at end of file +} + +/** + * Render a code picker fragment with default Pandora styles. + * + * @param string $id, + * @param string $content Content. + * @param string $classes Classes for code picker. + * @param boolean $single_line If true, code picker will be displayed as a single line of code. + * @param boolean $return Return output if set to true. + * + * @return string + */ +function html_print_code_picker( + string $id, + string $content='', + string $classes='', + bool $single_line=false, + bool $return=false +) { + $single_line_class = ''; + + if ($single_line === true) { + $single_line_class = 'single-line '; + } + + $output = '
'; + $output .= '
'.$content.'
'; + $output .= '
'; + + if ($return === true) { + return $output; + } else { + echo $output; + } +} diff --git a/pandora_console/include/javascript/stepper.js b/pandora_console/include/javascript/stepper.js new file mode 100644 index 0000000000..c12834e17f --- /dev/null +++ b/pandora_console/include/javascript/stepper.js @@ -0,0 +1,69 @@ +function Stepper(container, steps) { + if (container instanceof jQuery) { + this.container = container[0]; + } else { + this.container = container; + } + + this.steps = []; + + for (var i = 1; i <= steps.length; i++) { + var stepContainer = document.createElement("div"); + stepContainer.className = "step-container"; + var step = document.createElement("span"); + step.className = "step"; + step.textContent = i; + var text = document.createElement("div"); + text.className = "step-text"; + text.textContent = steps[i - 1]; + stepContainer.appendChild(step); + stepContainer.appendChild(text); + this.steps.push(stepContainer); + } +} + +Stepper.prototype.render = function() { + var separator = document.createElement("div"); + separator.className = "step-separator"; + var stepsContainer = document.createElement("div"); + stepsContainer.className = "steps"; + + for (var i = 0; i < this.steps.length; i++) { + if (i > 0) { + stepsContainer.appendChild(separator.cloneNode()); + } + stepsContainer.appendChild(this.steps[i]); + } + + this.container.innerHTML = ""; + this.container.appendChild(stepsContainer); +}; + +Stepper.prototype.selectStep = function(step) { + for (var i = 0; i < this.steps.length; i++) { + if (i < step - 1) { + this.steps[i].querySelector(".step").classList.add("visited"); + this.steps[i].querySelector(".step-text").classList.remove("active"); + var separators = this.container.querySelectorAll(".step-separator"); + if (separators[i]) { + separators[i].classList.add("visited"); + } + } else if (i === step - 1) { + this.steps[i].querySelector(".step").classList.add("active"); + this.steps[i].querySelector(".step-text").classList.add("active"); + this.steps[i].querySelector(".step").classList.remove("visited"); + } else { + this.steps[i] + .querySelector(".step") + .classList.remove("visited", "active"); + + this.steps[i].querySelector(".step-text").classList.remove("active"); + + var separators = this.container.querySelectorAll(".step-separator"); + + if (separators[i - 1]) { + separators[i - 1].classList.remove("visited"); + } + } + } +}; diff --git a/pandora_console/include/styles/agent_deploy_wizard.css b/pandora_console/include/styles/agent_deploy_wizard.css new file mode 100644 index 0000000000..561e10c892 --- /dev/null +++ b/pandora_console/include/styles/agent_deploy_wizard.css @@ -0,0 +1,85 @@ +#agent_deploy_modal { + margin-bottom: 5px; +} + +#footer_separator { + position: absolute; + bottom: 57px; + border-top: 1px solid #c1ccdc; + width: 100%; + left: 0px; +} + +#stepper_container { + display: flex; + justify-content: center; + align-items: center; +} + +#modal_header { + background-color: #f6f7fb; + border-radius: 10px; + width: 100%; + height: 76px; + /* padding: 10px; */ + display: flex; + justify-content: center; + align-items: center; +} + +#config_form_more_info { + margin-bottom: 5px !important; +} + +#stepper_container { + width: 35%; +} + +#table1-os-0 { + width: 100%; +} + +#os_selector { + width: 100%; + height: 50px; + color: #333; +} + +#os_selector > label { + width: 100%; + height: 30px; +} + +.modal-content { + display: flex; + margin-bottom: 20px; + min-height: 400px; + flex-direction: column; + padding-left: 5px; + padding-right: 5px; +} + +.installer-code-fragment { + margin-bottom: 15px; + margin-top: 5px; +} + +.installer-title { + display: flex; + align-items: center; + margin-bottom: 10px; + margin-top: 10px; +} + +.installer-title-icon { + margin-right: 9px; +} + +.green-link { + color: #1d7873 !important; + text-decoration: none !important; +} + +.green-link:hover { + color: #0d312f !important; +} diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index d3e1e51a42..141840e6ca 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -151,6 +151,14 @@ src: local("Nunito-Regular"), url(../../fonts/nunito.woff) format("woff"); } +@font-face { + font-family: "firacode-regular"; + src: url("../fonts/FiraCode-Regular.woff") format("woff"); + src: local("FiraCode-Regular"), + url(../../fonts/FiraCode-Regular.woff) format("woff"); + font-weight: normal; +} + * { font-size: 9pt; line-height: 16pt; @@ -479,6 +487,11 @@ select:-internal-list-box { max-width: 250px; } +.w260px { + width: 260px; + max-width: 260px; +} + .w280px { width: 280px; max-width: 280px; @@ -1212,6 +1225,14 @@ p.center { margin: 0 auto; } +.margin-top-5 { + margin-top: 5px; +} + +.margin-bottom-5 { + margin-bottom: 5px; +} + .margin-top-10 { margin-top: 10px; } @@ -11518,6 +11539,11 @@ p.trademark-copyright { color: #8a96a6; } +.input_sub_placeholder_normal { + font-size: 13px; + color: #8a96a6; +} + .input_sub_placeholder_warning { color: #ffb900; font-style: italic; @@ -11899,3 +11925,211 @@ td[id^="table_info_box"] a { .break-word { word-wrap: break-word; } + +.warn-box { + background: #fffbdf; + color: #454545; + font-size: 15px; + border-radius: 5px; + padding: 15px; + padding-left: 30px; + position: relative; + margin: 25px 0px; +} +.warn-box::before { + content: "|"; + color: #dd9900; + position: absolute; + left: 4px; + top: 50%; + transform: translateY(-50%); + height: 77%; + background: #dd9900; + border-radius: 12px; + width: 4px; +} +.err-box { + background: #fbdada; + color: #454545; + font-size: 15px; + border-radius: 5px; + padding: 15px; + padding-left: 30px; + position: relative; + margin: 25px 0px; +} +.err-box::before { + content: "|"; + color: red; + position: absolute; + left: 4px; + top: 50%; + transform: translateY(-50%); + height: 77%; + background: red; + border-radius: 12px; + width: 4px; +} + +.signature { + color: #8a96a6; + font-size: 13px; + font-weight: 300; + margin-right: auto; + margin-left: 10px; +} +.link { + color: #82b92e; + text-decoration: none; +} +.signature a { + color: #82b92e; + text-decoration: none; +} + +.steps { + display: flex; + align-items: center; + width: 100%; +} + +.step { + font-size: 15px; + border: 2px solid #c0ccdc; + color: #999; + border-radius: 30px; + width: 30px; + height: 30px; + text-align: center; + display: flex; + align-items: center; + justify-content: center; + position: relative; + z-index: 1; +} + +.step.active { + background-color: #0d312f !important; + color: #ffffff !important; + border-color: #0d312f !important; +} + +.step.visited { + background-color: #1d7873 !important; + color: #ffffff !important; + border-color: #1d7873 !important; +} + +.steps { + display: flex; + justify-content: space-between; + align-items: center; +} + +.step-separator { + flex: 1; + height: calc(50% - 12px); + border: none; + border-top: 2px solid transparent; + border-image: repeating-linear-gradient( + to right, + #c0ccdc 0, + #c0ccdc 4px, + transparent 4px, + transparent 8px + ) + 1 0; + position: relative; + transform: translateY(-14px); +} + +.step-separator.visited { + border-top: 2px solid #1d7873 !important; + border-image: none; +} + +.step-separator:last-child { + display: none; +} + +.step-container { + display: flex; + flex-direction: column; + align-items: center; + width: 30px; +} + +.step-text { + font-size: 12px; + color: #333; + text-align: center; + margin-top: 5px; +} + +.step-text.active { + font-weight: bold; +} + +.code-fragment { + background-color: #1f2435; + color: #eaeaea; + overflow-y: scroll; + height: 100px; + padding: 10px; + font-family: "firacode-regular"; + font-size: 14px; + padding-left: 25px; + padding-right: 25px; + border-radius: 6px; +} + +.code-fragment.single-line { + height: 20px !important; + overflow-y: hidden !important; +} + +.code-font { + font-family: "firacode-regular" !important; +} + +/* Webkit-based browsers */ +.code-fragment::-webkit-scrollbar { + width: 6px; + height: 6px; +} + +.code-fragment::-webkit-scrollbar-track { + background-color: transparent; +} + +.code-fragment::-webkit-scrollbar-thumb { + background-color: rgba(255, 255, 255, 0.25); + border-radius: 4px; + width: 6px; + height: 50px; +} + +.code-fragment::-webkit-scrollbar-thumb:hover { + background-color: rgba(255, 255, 255, 0.25); +} + +/* Firefox */ +.code-fragment::-moz-scrollbar { + width: 6px; + height: 6px; +} + +.code-fragment::-moz-scrollbar-track { + background-color: transparent; +} + +.code-fragment::-moz-scrollbar-thumb { + background-color: rgba(255, 255, 255, 0.25); + border-radius: 4px; + width: 6px; + height: 50px; +} + +.code-fragment::-moz-scrollbar-thumb:hover { + background-color: rgba(255, 255, 255, 0.25); +} From b293587aa9b85846dd5803ea3110966d9d4a0b10 Mon Sep 17 00:00:00 2001 From: "alejandro.campos@artica.es" Date: Wed, 19 Apr 2023 19:25:22 +0200 Subject: [PATCH 04/33] implemented agent deploy wizard --- pandora_console/godmode/agentes/agent_deploy.php | 4 ++-- pandora_console/include/class/AgentDeployWizard.class.php | 7 +------ 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/pandora_console/godmode/agentes/agent_deploy.php b/pandora_console/godmode/agentes/agent_deploy.php index 44c9d3dcb0..f0ce5b3cfa 100644 --- a/pandora_console/godmode/agentes/agent_deploy.php +++ b/pandora_console/godmode/agentes/agent_deploy.php @@ -1,8 +1,8 @@ Date: Thu, 20 Apr 2023 10:01:35 +0200 Subject: [PATCH 05/33] changed icons --- .../include/class/AgentDeployWizard.class.php | 38 ++++++------------- .../include/styles/agent_deploy_wizard.css | 12 ++++++ 2 files changed, 23 insertions(+), 27 deletions(-) diff --git a/pandora_console/include/class/AgentDeployWizard.class.php b/pandora_console/include/class/AgentDeployWizard.class.php index 6257cd9ed6..7815c74bea 100644 --- a/pandora_console/include/class/AgentDeployWizard.class.php +++ b/pandora_console/include/class/AgentDeployWizard.class.php @@ -231,7 +231,7 @@ class AgentDeployWizard $tableConfiguration->rowspan = []; $windows_label_img = html_print_image( - '/images/windows@os.svg', + '/images/windows-grey@svg.svg', true, ['class' => 'installer-title-icon main_menu_icon'] ); @@ -245,7 +245,7 @@ class AgentDeployWizard ); $linux_label_img = html_print_image( - '/images/linux@os.svg', + '/images/linux-grey@svg.svg', true, ['class' => 'installer-title-icon main_menu_icon'] ); @@ -259,7 +259,7 @@ class AgentDeployWizard ); $mac_label_img = html_print_image( - '/images/apple@os.svg', + '/images/apple-grey@svg.svg', true, ['class' => 'installer-title-icon main_menu_icon'] ); @@ -312,21 +312,13 @@ class AgentDeployWizard html_print_div( [ 'id' => 'os_selector', - 'class' => 'switch_radio_button', + 'class' => 'switch_radio_button custom-switch-radio-button', 'content' => implode('', $switchButtons), ], true ).$sub_tip ); - /*$stepper_container = html_print_div( - [ - 'class' => 'switch_radio_button', - 'content' - ], - true - );*/ - $server_add_help_tip = ui_print_help_tip( __('Use your %s Data Server IP address here. It must be possible to establish a connection from the agent to port 41121/tcp of this address.', get_product_name()), true @@ -438,9 +430,9 @@ class AgentDeployWizard // Start of Unix / Linux installer section. $title = html_print_image( - '/images/linux@os.svg', + '/images/linux-grey@svg.svg', true, - ['class' => 'installer-title-icon main_menu_icon'] + ['class' => 'installer-title-icon main_menu_icon svg-brightness-0'] ); $title .= ''.__('Linux agent').''; @@ -480,9 +472,9 @@ class AgentDeployWizard // Start of Windows installer section. $title = html_print_image( - '/images/windows@os.svg', + '/images/windows-grey@svg.svg', true, - ['class' => 'installer-title-icon main_menu_icon'] + ['class' => 'installer-title-icon main_menu_icon svg-brightness-0'] ); $title .= ''.__('Windows agent').''; @@ -512,9 +504,9 @@ class AgentDeployWizard // Start of MacOS installer section. $title = html_print_image( - '/images/apple@os.svg', + '/images/apple-grey@svg.svg', true, - ['class' => 'installer-title-icon main_menu_icon'] + ['class' => 'installer-title-icon main_menu_icon svg-brightness-0'] ); $title .= ''.__('Mac agent').''; @@ -670,10 +662,8 @@ class AgentDeployWizard $('#installer_page').show(); var os_val = $('input[name="os"]:checked').val(); - var module_definition_val = $('input[name="module_definition"]:checked').val(); var server_addr_val = $('input[name="server_addr"]').val(); var group_val = $('[name="group"] option:selected').text(); - var win_installer_command = `curl -k "https://firefly.artica.es/pandorafms/latest/Windows/Pandora%20FMS%20Windows%20Agent%20v7.0NG.x86_64.exe" -o PandoraFMS_Windows_Agent_7.0NG.x86_64.exe ; ./PandoraFMS_Windows_Agent_7.0NG.x86_64.exe /S --ip ${server_addr_val} --group ${group_val} --remote_config 1`; var linux_installer_command = `export PANDORA_SERVER_IP='${server_addr_val}' && \\ \nexport PANDORA_REMOTE_CONFIG=1 && \\ \nexport PANDORA_GROUP='${group_val}' && \\ \ncurl -Ls https://pfms.me/agent-deploy | bash`; @@ -743,13 +733,7 @@ class AgentDeployWizard var stepper_container = $('#stepper_container'); var stepper = new Stepper(stepper_container, stepper_step_names); - /* - { - 1: 'Step One', - 2: 'Step Two', - 3: 'Step 3', - } - */ + stepper.render(); // Initial step: 1. diff --git a/pandora_console/include/styles/agent_deploy_wizard.css b/pandora_console/include/styles/agent_deploy_wizard.css index 561e10c892..906b20500c 100644 --- a/pandora_console/include/styles/agent_deploy_wizard.css +++ b/pandora_console/include/styles/agent_deploy_wizard.css @@ -83,3 +83,15 @@ .green-link:hover { color: #0d312f !important; } + +.custom-switch-radio-button > label { + color: #444 !important; +} + +.custom-switch-radio-button input:checked + label img { + filter: brightness(100); +} + +.svg-brightness-0 { + filter: brightness(0); +} From a3e1923849640aaf8b665db505c061c6bf152bd2 Mon Sep 17 00:00:00 2001 From: "alejandro.campos@artica.es" Date: Thu, 20 Apr 2023 10:02:45 +0200 Subject: [PATCH 06/33] changed icons --- pandora_console/images/apple-grey@svg.svg | 21 +++++++++++++++++++++ pandora_console/images/linux-grey@svg.svg | 21 +++++++++++++++++++++ pandora_console/images/windows-grey@svg.svg | 21 +++++++++++++++++++++ 3 files changed, 63 insertions(+) create mode 100644 pandora_console/images/apple-grey@svg.svg create mode 100644 pandora_console/images/linux-grey@svg.svg create mode 100644 pandora_console/images/windows-grey@svg.svg diff --git a/pandora_console/images/apple-grey@svg.svg b/pandora_console/images/apple-grey@svg.svg new file mode 100644 index 0000000000..ffe0d5fd93 --- /dev/null +++ b/pandora_console/images/apple-grey@svg.svg @@ -0,0 +1,21 @@ + + + + apple-grey@svg + Created with Sketch. + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pandora_console/images/linux-grey@svg.svg b/pandora_console/images/linux-grey@svg.svg new file mode 100644 index 0000000000..800acb957a --- /dev/null +++ b/pandora_console/images/linux-grey@svg.svg @@ -0,0 +1,21 @@ + + + + linux-grey@svg + Created with Sketch. + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pandora_console/images/windows-grey@svg.svg b/pandora_console/images/windows-grey@svg.svg new file mode 100644 index 0000000000..d133de5954 --- /dev/null +++ b/pandora_console/images/windows-grey@svg.svg @@ -0,0 +1,21 @@ + + + + windows-grey@svg + Created with Sketch. + + + + + + + + + + + + + + + + \ No newline at end of file From 10612904a8245a365cbe72b88df95f8279a06f4e Mon Sep 17 00:00:00 2001 From: Calvo Date: Fri, 21 Apr 2023 12:26:40 +0200 Subject: [PATCH 07/33] Deleted trace --- pandora_server/lib/PandoraFMS/Core.pm | 1 - 1 file changed, 1 deletion(-) diff --git a/pandora_server/lib/PandoraFMS/Core.pm b/pandora_server/lib/PandoraFMS/Core.pm index 047c52acc0..0227a0fc59 100644 --- a/pandora_server/lib/PandoraFMS/Core.pm +++ b/pandora_server/lib/PandoraFMS/Core.pm @@ -1027,7 +1027,6 @@ sub pandora_execute_alert { $threshold = $action->{'action_threshold'} if (defined ($action->{'action_threshold'}) && $action->{'action_threshold'} > 0); $threshold = $action->{'module_action_threshold'} if (defined ($action->{'module_action_threshold'}) && $action->{'module_action_threshold'} > 0); if (time () >= ($action->{'last_execution'} + $threshold)) { - print "Entro"; my $monitoring_event_custom_data = ''; push(@{$custom_data->{'actions'}}, safe_output($action->{'action_name'})); From 5f146ab3409b0cd8da2d81d9be532a8dc81242fa Mon Sep 17 00:00:00 2001 From: Daniel Maya Date: Fri, 21 Apr 2023 14:36:32 +0200 Subject: [PATCH 08/33] #10530 Fix dialog and message --- .../godmode/servers/servers.build_table.php | 37 ++++++++++++++++++- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/pandora_console/godmode/servers/servers.build_table.php b/pandora_console/godmode/servers/servers.build_table.php index 57569ac956..fe74c172c8 100644 --- a/pandora_console/godmode/servers/servers.build_table.php +++ b/pandora_console/godmode/servers/servers.build_table.php @@ -73,6 +73,8 @@ $table->headstyle[8] = 'text-align:right;width: 120px;'; $table->titleclass = 'tabletitle'; $table->titlestyle = 'text-transform:uppercase;'; +$table->style[6] = 'display: flex;align-items: center;'; + $table->head = []; $table->head[0] = __('Name'); $table->head[1] = __('Status'); @@ -166,8 +168,16 @@ foreach ($servers as $server) { } $data[6] = $server['threads'].' : '.$server['queued_modules']; - if ($server['queued_modules'] > 200) { - $data[6] .= clippy_context_help('server_queued_modules'); + if ($server['queued_modules'] > 500) { + $data[6] .= '  '; } $data[7] = ui_print_timestamp($server['keepalive'], true); @@ -306,3 +316,26 @@ if ($tiny) { } else { html_print_table($table); } + +?> + From a453ed7ceabf51a4b67e3f17fc66f15a96acfe02 Mon Sep 17 00:00:00 2001 From: "alejandro.campos@artica.es" Date: Fri, 21 Apr 2023 15:16:51 +0200 Subject: [PATCH 09/33] changes regarding encoding of tables --- pandora_console/extras/mr/63.sql | 7 +++++++ pandora_console/include/class/TipsWindow.class.php | 4 ++-- pandora_console/pandoradb.sql | 6 +++--- 3 files changed, 12 insertions(+), 5 deletions(-) create mode 100644 pandora_console/extras/mr/63.sql diff --git a/pandora_console/extras/mr/63.sql b/pandora_console/extras/mr/63.sql new file mode 100644 index 0000000000..30417b2dcc --- /dev/null +++ b/pandora_console/extras/mr/63.sql @@ -0,0 +1,7 @@ +START TRANSACTION; + +ALTER TABLE tpolicy_group_agents CONVERT TO CHARACTER SET UTF8MB4; +ALTER TABLE tevent_sound CONVERT TO CHARACTER SET UTF8MB4; +ALTER TABLE tsesion_filter CONVERT TO CHARACTER SET UTF8MB4; + +COMMIT; diff --git a/pandora_console/include/class/TipsWindow.class.php b/pandora_console/include/class/TipsWindow.class.php index 712fc62f0a..4f913f5a28 100644 --- a/pandora_console/include/class/TipsWindow.class.php +++ b/pandora_console/include/class/TipsWindow.class.php @@ -570,7 +570,7 @@ class TipsWindow $sql = sprintf( 'SELECT id, name AS language, title, text, url, enable FROM twelcome_tip t - LEFT JOIN tlanguage l ON t.id_lang = l.id_language COLLATE utf8mb4_unicode_ci + LEFT JOIN tlanguage l ON t.id_lang COLLATE utf8mb4_unicode_ci = CONVERT(l.id_language USING utf8mb4) COLLATE utf8mb4_unicode_ci %s %s %s', $filter, $order, @@ -582,7 +582,7 @@ class TipsWindow $sqlCount = sprintf( 'SELECT count(*) FROM twelcome_tip t - LEFT JOIN tlanguage l ON t.id_lang = l.id_language COLLATE utf8mb4_unicode_ci + LEFT JOIN tlanguage l ON t.id_lang COLLATE utf8mb4_unicode_ci = CONVERT(l.id_language USING utf8mb4) COLLATE utf8mb4_unicode_ci %s', $filter ); diff --git a/pandora_console/pandoradb.sql b/pandora_console/pandoradb.sql index 981b8a5ded..6702300ce9 100644 --- a/pandora_console/pandoradb.sql +++ b/pandora_console/pandoradb.sql @@ -2610,7 +2610,7 @@ CREATE TABLE IF NOT EXISTS `tpolicy_group_agents` ( ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (`id_agent`) REFERENCES `tagente`(`id_agente`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB DEFAULT CHARSET=UTF8MB4; -- --------------------------------------------------------------------- -- Table `tdashboard` @@ -4237,7 +4237,7 @@ CREATE TABLE `tevent_sound` ( `name` TEXT NULL, `sound` TEXT NULL, `active` TINYINT NOT NULL DEFAULT '1', -PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8; +PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=UTF8MB4; -- --------------------------------------------------------------------- -- Table `tsesion_filter` @@ -4251,7 +4251,7 @@ CREATE TABLE IF NOT EXISTS `tsesion_filter` ( `type` TEXT NULL, `user` TEXT NULL, PRIMARY KEY (`id_filter`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB DEFAULT CHARSET=UTF8MB4; CREATE TABLE IF NOT EXISTS `twelcome_tip` ( From ee5f79bb7a2c72874443d9ca059b952726674831 Mon Sep 17 00:00:00 2001 From: "alejandro.campos@artica.es" Date: Tue, 25 Apr 2023 09:16:48 +0200 Subject: [PATCH 10/33] change text --- .../include/class/AgentDeployWizard.class.php | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/pandora_console/include/class/AgentDeployWizard.class.php b/pandora_console/include/class/AgentDeployWizard.class.php index 7815c74bea..6a2374584d 100644 --- a/pandora_console/include/class/AgentDeployWizard.class.php +++ b/pandora_console/include/class/AgentDeployWizard.class.php @@ -53,9 +53,7 @@ class AgentDeployWizard * * @var array */ - public $AJAXMethods = [ - 'loadModal', - ]; + public $AJAXMethods = ['loadModal']; /** @@ -419,7 +417,7 @@ class AgentDeployWizard false, [], true, - ) + ), ] ); echo ''; @@ -538,11 +536,7 @@ class AgentDeployWizard ); // Footer. - html_print_div( - [ - 'id' => 'footer_separator', - ] - ); + html_print_div(['id' => 'footer_separator']); echo ''; @@ -565,7 +559,7 @@ class AgentDeployWizard '', ['style' => 'min-width: 0;'], true - ) + ), ] ); @@ -665,7 +659,7 @@ class AgentDeployWizard var server_addr_val = $('input[name="server_addr"]').val(); var group_val = $('[name="group"] option:selected').text(); - var win_installer_command = `curl -k "https://firefly.artica.es/pandorafms/latest/Windows/Pandora%20FMS%20Windows%20Agent%20v7.0NG.x86_64.exe" -o PandoraFMS_Windows_Agent_7.0NG.x86_64.exe ; ./PandoraFMS_Windows_Agent_7.0NG.x86_64.exe /S --ip ${server_addr_val} --group ${group_val} --remote_config 1`; + var win_installer_command = `Invoke-WebRequest -Uri https://firefly.pandorafms.com/pandorafms/latest/Windows/Pandora%20FMS%20Windows%20Agent%20v7.0NG.x86_64.exe -OutFile \$\{env:tmp\}\\\pandora-agent-windows.exe; & \$\{env:tmp\}\\\pandora-agent-windows.exe /S --ip ${server_addr_val} --group \"${group_val}\" --remote_config 1`; var linux_installer_command = `export PANDORA_SERVER_IP='${server_addr_val}' && \\ \nexport PANDORA_REMOTE_CONFIG=1 && \\ \nexport PANDORA_GROUP='${group_val}' && \\ \ncurl -Ls https://pfms.me/agent-deploy | bash`; var mac_installer_text = `To complete the installation process, please perform a manual installation and configure the server IP to ${server_addr_val} and specify the group as ${group_val}. Thank you for your cooperation`; var linux_service_start = "/etc/init.d/pandora_agent_daemon start"; From 925d3fa6a2820e37ff34c84832d025d0bdba1a80 Mon Sep 17 00:00:00 2001 From: Ramon Novoa Date: Tue, 25 Apr 2023 12:28:38 +0200 Subject: [PATCH 11/33] Improved module execution for master servers. Previously, master servers executed modules from any agent whose assigned server had crashed. Now they execute modules from any agent whose assigned server cannot execute them (e.g., the server is running but the required component is disabled). --- pandora_server/lib/PandoraFMS/DiscoveryServer.pm | 2 +- pandora_server/lib/PandoraFMS/InventoryServer.pm | 4 ++-- pandora_server/lib/PandoraFMS/NetworkServer.pm | 2 +- pandora_server/lib/PandoraFMS/PluginServer.pm | 2 +- pandora_server/lib/PandoraFMS/PredictionServer.pm | 4 ++-- pandora_server/lib/PandoraFMS/WMIServer.pm | 2 +- pandora_server/lib/PandoraFMS/WebServer.pm | 2 +- 7 files changed, 9 insertions(+), 9 deletions(-) diff --git a/pandora_server/lib/PandoraFMS/DiscoveryServer.pm b/pandora_server/lib/PandoraFMS/DiscoveryServer.pm index 2d5928333d..607faf856a 100644 --- a/pandora_server/lib/PandoraFMS/DiscoveryServer.pm +++ b/pandora_server/lib/PandoraFMS/DiscoveryServer.pm @@ -150,7 +150,7 @@ sub data_producer ($) { OR (status = -1 AND interval_sweep > 0 AND (utimestamp + interval_sweep) < UNIX_TIMESTAMP()))', $server_id); } else { @rows = get_db_rows ($dbh, 'SELECT * FROM trecon_task - WHERE (id_recon_server = ? OR id_recon_server = ANY(SELECT id_server FROM tserver WHERE status <> 1 AND server_type = ?)) + WHERE (id_recon_server = ? OR id_recon_server NOT IN (SELECT id_server FROM tserver WHERE status = 1 AND server_type = ?)) AND disabled = 0 AND ((utimestamp = 0 AND interval_sweep != 0 OR status = 1) OR (status = -1 AND interval_sweep > 0 AND (utimestamp + interval_sweep) < UNIX_TIMESTAMP()))', $server_id, DISCOVERYSERVER); diff --git a/pandora_server/lib/PandoraFMS/InventoryServer.pm b/pandora_server/lib/PandoraFMS/InventoryServer.pm index f0c92a7fd3..fcaf882436 100644 --- a/pandora_server/lib/PandoraFMS/InventoryServer.pm +++ b/pandora_server/lib/PandoraFMS/InventoryServer.pm @@ -122,7 +122,7 @@ sub data_producer ($) { @rows = get_db_rows ($dbh, 'SELECT tagent_module_inventory.id_agent_module_inventory, tagent_module_inventory.flag, tagent_module_inventory.timestamp FROM tagente, tagent_module_inventory, tmodule_inventory - WHERE (server_name = ? OR server_name = ANY(SELECT name FROM tserver WHERE status <> 1 AND server_type = ?)) + WHERE (server_name = ? OR server_name NOT IN (SELECT name FROM tserver WHERE status = 1 AND server_type = ?)) AND tmodule_inventory.id_module_inventory = tagent_module_inventory.id_module_inventory AND tmodule_inventory.id_os IS NOT NULL AND tagente.id_agente = tagent_module_inventory.id_agente @@ -138,7 +138,7 @@ sub data_producer ($) { @rows = get_db_rows ($dbh, 'SELECT tagent_module_inventory.id_agent_module_inventory, tagent_module_inventory.flag, tagent_module_inventory.timestamp FROM tagente, tagent_module_inventory, tmodule_inventory - WHERE (server_name = ? OR server_name = ANY(SELECT name FROM tserver WHERE status <> 1 AND server_type = ?)) + WHERE (server_name = ? OR server_name NOT IN (SELECT name FROM tserver WHERE status = 1 AND server_type = ?)) AND tmodule_inventory.id_module_inventory = tagent_module_inventory.id_module_inventory AND tmodule_inventory.id_os IS NOT NULL AND tagente.id_agente = tagent_module_inventory.id_agente diff --git a/pandora_server/lib/PandoraFMS/NetworkServer.pm b/pandora_server/lib/PandoraFMS/NetworkServer.pm index 594aee4293..2d245e7a04 100644 --- a/pandora_server/lib/PandoraFMS/NetworkServer.pm +++ b/pandora_server/lib/PandoraFMS/NetworkServer.pm @@ -112,7 +112,7 @@ sub data_producer ($) { } else { @rows = get_db_rows ($dbh, 'SELECT tagente_modulo.id_agente_modulo, tagente_modulo.flag, tagente_estado.last_execution_try, tagente_estado.current_interval + tagente_estado.last_execution_try AS time_left, last_execution_try FROM tagente, tagente_modulo, tagente_estado - WHERE ((server_name = ?) OR (server_name = ANY(SELECT name FROM tserver WHERE status <> 1 AND server_type = ?))) + WHERE ((server_name = ?) OR (server_name NOT IN (SELECT name FROM tserver WHERE status = 1 AND server_type = ?))) AND tagente_modulo.id_agente = tagente.id_agente AND tagente.disabled = 0 AND tagente_modulo.disabled = 0 diff --git a/pandora_server/lib/PandoraFMS/PluginServer.pm b/pandora_server/lib/PandoraFMS/PluginServer.pm index 7bec29513b..9d52bd5ce0 100644 --- a/pandora_server/lib/PandoraFMS/PluginServer.pm +++ b/pandora_server/lib/PandoraFMS/PluginServer.pm @@ -110,7 +110,7 @@ sub data_producer ($) { } else { @rows = get_db_rows ($dbh, 'SELECT DISTINCT(tagente_modulo.id_agente_modulo), tagente_modulo.flag, tagente_estado.current_interval + tagente_estado.last_execution_try AS time_left, last_execution_try FROM tagente, tagente_modulo, tagente_estado - WHERE ((server_name = ?) OR (server_name = ANY(SELECT name FROM tserver WHERE status <> 1 AND server_type = ?))) + WHERE ((server_name = ?) OR (server_name NOT IN (SELECT name FROM tserver WHERE status = 1 AND server_type = ?))) AND tagente_modulo.id_agente = tagente.id_agente AND tagente.disabled = 0 AND tagente_modulo.disabled = 0 diff --git a/pandora_server/lib/PandoraFMS/PredictionServer.pm b/pandora_server/lib/PandoraFMS/PredictionServer.pm index 1225ab5b19..6859c001a4 100644 --- a/pandora_server/lib/PandoraFMS/PredictionServer.pm +++ b/pandora_server/lib/PandoraFMS/PredictionServer.pm @@ -114,9 +114,9 @@ sub data_producer ($) { tagente_modulo.flag, last_execution_try FROM tagente, tagente_modulo, tagente_estado WHERE ((server_name = ?) - OR (server_name = ANY(SELECT name + OR (server_name NOT IN (SELECT name FROM tserver - WHERE status <> 1 AND server_type = ?)) + WHERE status = 1 AND server_type = ?)) OR ((server_name = 0 OR server_name IS NULL) AND 1=?) ) AND tagente_modulo.id_agente = tagente.id_agente diff --git a/pandora_server/lib/PandoraFMS/WMIServer.pm b/pandora_server/lib/PandoraFMS/WMIServer.pm index 06d6a47292..018d7e86ac 100644 --- a/pandora_server/lib/PandoraFMS/WMIServer.pm +++ b/pandora_server/lib/PandoraFMS/WMIServer.pm @@ -109,7 +109,7 @@ sub data_producer ($) { } else { @rows = get_db_rows ($dbh, 'SELECT DISTINCT(tagente_modulo.id_agente_modulo), tagente_modulo.flag, tagente_estado.current_interval + tagente_estado.last_execution_try AS time_left, last_execution_try FROM tagente, tagente_modulo, tagente_estado, tserver - WHERE ((server_name = ?) OR (server_name = ANY(SELECT name FROM tserver WHERE status <> 1 AND server_type = ?))) + WHERE ((server_name = ?) OR (server_name NOT IN (SELECT name FROM tserver WHERE status = 1 AND server_type = ?))) AND tagente_modulo.id_agente = tagente.id_agente AND tagente.disabled = 0 AND tagente_modulo.disabled = 0 diff --git a/pandora_server/lib/PandoraFMS/WebServer.pm b/pandora_server/lib/PandoraFMS/WebServer.pm index 776ef20456..e87e860c29 100644 --- a/pandora_server/lib/PandoraFMS/WebServer.pm +++ b/pandora_server/lib/PandoraFMS/WebServer.pm @@ -137,7 +137,7 @@ sub data_producer ($) { } else { @rows = get_db_rows ($dbh, 'SELECT DISTINCT(tagente_modulo.id_agente_modulo), tagente_modulo.flag, tagente_estado.current_interval + tagente_estado.last_execution_try AS time_left, last_execution_try FROM tagente, tagente_modulo, tagente_estado, tserver - WHERE ((server_name = ?) OR (server_name = ANY(SELECT server_name FROM tserver WHERE status <> 1 AND server_type = ?))) + WHERE ((server_name = ?) OR (server_name NOT IN (SELECT server_name FROM tserver WHERE status = 1 AND server_type = ?))) AND tagente_modulo.id_agente = tagente.id_agente AND tagente.disabled = 0 AND tagente_modulo.disabled = 0 From 829ed3e33a9f824273f2c4c7fde628568c01a9d3 Mon Sep 17 00:00:00 2001 From: Calvo Date: Wed, 26 Apr 2023 18:05:21 +0200 Subject: [PATCH 12/33] Remoced xprobe and modified nmap for better performance detecting OS --- extras/aditional_rpmspec/xprobe2-0.3.spec | 73 ------------------- .../xprobe2-0.3.diff.patch.README | 62 ---------------- .../pandora_deploy_community.sh | 2 - .../pandora_deploy_community_el8.sh | 2 - .../pandora_deploy_community_ubuntu_2204.sh | 2 - extras/docker/centos8/base/Dockerfile | 3 +- pandora_server/DEBIAN/control | 2 +- .../FreeBSD/pandora_server.conf.new | 7 -- pandora_server/NetBSD/pandora_server.conf.new | 7 -- pandora_server/conf/pandora_server.conf.new | 7 -- .../conf/pandora_server.conf.windows | 6 -- .../conf/pandora_server_sec.conf.template | 7 -- pandora_server/lib/PandoraFMS/Config.pm | 6 -- pandora_server/lib/PandoraFMS/Core.pm | 24 +++--- .../lib/PandoraFMS/DiscoveryServer.pm | 26 +++---- pandora_server/pandora_server_installer | 6 +- tests/Dockerfile | 2 - 17 files changed, 26 insertions(+), 218 deletions(-) delete mode 100644 extras/aditional_rpmspec/xprobe2-0.3.spec delete mode 100644 extras/aditional_sources/xprobe2-0.3.diff.patch.README diff --git a/extras/aditional_rpmspec/xprobe2-0.3.spec b/extras/aditional_rpmspec/xprobe2-0.3.spec deleted file mode 100644 index 7345b8d16e..0000000000 --- a/extras/aditional_rpmspec/xprobe2-0.3.spec +++ /dev/null @@ -1,73 +0,0 @@ -Name: xprobe2 -Version: 0.3 -Release: 2 -Summary: Tool to detect OS remotely by TCP/IP fingerprinting -License: GPLv2 -Group: Network/Security -URL: http://xprobe.sourceforge.net/ -Packager: Sancho Lerena -Source: http://dl.sf.net/xprobe/xprobe2-%{version}.tar.gz -BuildRoot: %{_tmppath}/%{name}-%{version} -Provides: %{name}-%{version} -Requires: libpcap -BuildRequires: gcc-c++ libpcap-devel - -#This is for SUSE build service, to avoid enforce FHS paths -#!BuildIgnore: post-build-checks - -%description -Xprobe is an alternative to some tools which are heavily dependent upon the -usage of the TCP protocol for remote active operating system fingerprinting. - -Xprobe I combines various remote active operating system fingerprinting methods -using the ICMP protocol, which were discovered during the "ICMP Usage in -Scanning" research project, into a simple, fast, efficient and a powerful way -to detect an underlying operating system a targeted host is using. - -Xprobe2 is an active operating system fingerprinting tool with a different -approach to operating system fingerprinting. Xprobe2 rely on fuzzy signature -matching, probabilistic guesses, multiple matches simultaneously, and a -signature database. - -%prep -%setup - -%build -./configure --with-libpcap-libraries=/usr/lib --with-libpcap-includes=/usr/include/pcap --mandir=%{_mandir} --disable-schemas-install -make - -%install -make DESTDIR=$RPM_BUILD_ROOT install - -%clean -rm -rf $RPM_BUILD_ROOT - -%post -ln -s /usr/local/bin/xprobe2 /usr/bin - -%preun - -%postun - -%files - -%defattr(755,root,root) -/usr/local/etc -/usr/local/etc/xprobe2 - -%defattr(644,root,root) -%doc AUTHORS CHANGELOG COPYING CREDITS README TODO docs/* -%doc /usr/share/man/man1/xprobe2.1.gz -/usr/local/etc/xprobe2/xprobe2.conf - -%defattr(755,root,root) -/usr/local/bin/xprobe2 - - -%changelog -* Fri Dec 18 2009 Sancho Lerena 3.2-2 -- A lot of changes to be ready for all RPM plattforms available on build.opensuse.org - -* Tue Dec 08 2009 Sancho Lerena 3.2-1 -- First RPM Spec for SUSE Systems, based on CentOS Spec from Dag Wieers - diff --git a/extras/aditional_sources/xprobe2-0.3.diff.patch.README b/extras/aditional_sources/xprobe2-0.3.diff.patch.README deleted file mode 100644 index 77e404772b..0000000000 --- a/extras/aditional_sources/xprobe2-0.3.diff.patch.README +++ /dev/null @@ -1,62 +0,0 @@ -Get the original xprobe2-0.3 from Sourceforge: - -http://downloads.sourceforge.net/project/xprobe/xprobe2/Xprobe2%200.3/xprobe2-0.3.tar.gz - -Uncompress it under, for example /tmp/xprobe2-0.3 directory - -Copy the diff file at /tmp - -Execute the patch command: - - patch -p1 < ../xprobe2-0.3.diff.patch - -This should look like: - -patching file CHANGELOG -patching file config.status -patching file configure -patching file libs-external/USI++/src/config.h -patching file libs-external/USI++/src/config.log -patching file libs-external/USI++/src/config.status -patching file libs-external/USI++/src/ip.cc -patching file libs-external/USI++/src/Makefile -patching file libs-external/USI++/src/misc.cc -patching file libs-external/USI++/src/usi++/arp.h -patching file libs-external/USI++/src/usi++/config.h -patching file libs-external/USI++/src/usi++/datalink.h -patching file libs-external/USI++/src/usi++/icmp.h -patching file libs-external/USI++/src/usi++/if.h -patching file libs-external/USI++/src/usi++/ip.h -patching file libs-external/USI++/src/usi++/Layer2.h -patching file libs-external/USI++/src/usi++/README -patching file libs-external/USI++/src/usi++/RX.h -patching file libs-external/USI++/src/usi++/tcp.h -patching file libs-external/USI++/src/usi++/TX.h -patching file libs-external/USI++/src/usi++/TX_IP.h -patching file libs-external/USI++/src/usi++/udp.h -patching file libs-external/USI++/src/usi++/usi++ -patching file libs-external/USI++/src/usi++/usi++.h -patching file libs-external/USI++/src/usi++/usi-structs.h -patching file libs-external/USI++/usi++/config.h -patching file libs-external/USI++/usi++/tcp.h -patching file Makefile -patching file src/config.h -patching file src/defines.h -patching file src/Makefile -patching file src/xplib/Makefile -patching file src/xpmodules/alive_probe/Makefile -patching file src/xpmodules/alive_probe/portscanner/Makefile -patching file src/xpmodules/alive_probe/ttl_calc/Makefile -patching file src/xpmodules/Makefile -patching file src/xpmodules/os_probe/icmp_addrmask/Makefile -patching file src/xpmodules/os_probe/icmp_echo_id/Makefile -patching file src/xpmodules/os_probe/icmp_inforeq/Makefile -patching file src/xpmodules/os_probe/icmp_port_unreach/Makefile -patching file src/xpmodules/os_probe/icmp_timestamp/Makefile -patching file src/xpmodules/os_probe/Makefile -patching file src/xpmodules/os_probe/smb/Makefile -patching file src/xpmodules/os_probe/snmp/Makefile -patching file src/xpmodules/os_probe/tcp_handshake/Makefile -patching file src/xpmodules/os_probe/tcp_rst/Makefile - -Your patched code is now ready to be used. diff --git a/extras/deploy-scripts/pandora_deploy_community.sh b/extras/deploy-scripts/pandora_deploy_community.sh index 58e3187806..60b25b3ba2 100644 --- a/extras/deploy-scripts/pandora_deploy_community.sh +++ b/extras/deploy-scripts/pandora_deploy_community.sh @@ -300,7 +300,6 @@ server_dependencies=" \ bind-utils \ whois \ cpanminus \ - http://firefly.artica.es/centos7/xprobe2-0.3-12.2.x86_64.rpm \ http://firefly.artica.es/centos7/wmic-1.4-1.el7.x86_64.rpm \ https://firefly.artica.es/centos7/pandorawmic-1.0.0-1.x86_64.rpm" execute_cmd "yum install -y $server_dependencies" "Installing Pandora FMS Server dependencies" @@ -328,7 +327,6 @@ execute_cmd "yum install -y $oracle_dependencies || yum reinstall -y $oracle_dep #ipam dependencies ipam_dependencies=" \ - http://firefly.artica.es/centos7/xprobe2-0.3-12.2.x86_64.rpm \ perl(NetAddr::IP) \ perl(Sys::Syslog) \ perl(DBI) \ diff --git a/extras/deploy-scripts/pandora_deploy_community_el8.sh b/extras/deploy-scripts/pandora_deploy_community_el8.sh index 57301f62e0..1dd0598ccd 100644 --- a/extras/deploy-scripts/pandora_deploy_community_el8.sh +++ b/extras/deploy-scripts/pandora_deploy_community_el8.sh @@ -357,7 +357,6 @@ server_dependencies=" \ java \ bind-utils \ whois \ - http://firefly.artica.es/centos7/xprobe2-0.3-12.2.x86_64.rpm \ http://firefly.artica.es/centos7/wmic-1.4-1.el7.x86_64.rpm \ https://firefly.artica.es/centos8/pandorawmic-1.0.0-1.x86_64.rpm" execute_cmd "dnf install -y $server_dependencies" "Installing Pandora FMS Server dependencies" @@ -385,7 +384,6 @@ execute_cmd "dnf install -y $oracle_dependencies" "Installing Oracle Instant cli #ipam dependencies ipam_dependencies=" \ - http://firefly.artica.es/centos7/xprobe2-0.3-12.2.x86_64.rpm \ perl(NetAddr::IP) \ perl(Sys::Syslog) \ perl(DBI) \ diff --git a/extras/deploy-scripts/pandora_deploy_community_ubuntu_2204.sh b/extras/deploy-scripts/pandora_deploy_community_ubuntu_2204.sh index 21b93c54a0..a3f1003c1e 100644 --- a/extras/deploy-scripts/pandora_deploy_community_ubuntu_2204.sh +++ b/extras/deploy-scripts/pandora_deploy_community_ubuntu_2204.sh @@ -253,7 +253,6 @@ server_dependencies=" \ openssh-client \ postfix \ unzip \ - xprobe \ coreutils \ libio-compress-perl \ libmoosex-role-timer-perl \ @@ -358,7 +357,6 @@ source '/root/.profile' &>> "$LOGFILE" #ipam dependencies ipam_dependencies=" \ - xprobe \ libnetaddr-ip-perl \ coreutils \ libdbd-mysql-perl \ diff --git a/extras/docker/centos8/base/Dockerfile b/extras/docker/centos8/base/Dockerfile index 8b14fbb780..4f9a0c994f 100644 --- a/extras/docker/centos8/base/Dockerfile +++ b/extras/docker/centos8/base/Dockerfile @@ -125,7 +125,6 @@ RUN dnf install -y --setopt=tsflags=nodocs \ bind-utils \ whois \ libnsl \ - http://firefly.artica.es/centos7/xprobe2-0.3-12.2.x86_64.rpm \ http://firefly.artica.es/centos7/wmic-1.4-1.el7.x86_64.rpm \ https://firefly.artica.es/centos8/pandorawmic-1.0.0-1.x86_64.rpm ; dnf clean all @@ -136,7 +135,7 @@ RUN dnf install -y http://firefly.artica.es/centos8/perl-Crypt-OpenSSL-AES-0.02- # Instant client Oracle RUN dnf install -y https://download.oracle.com/otn_software/linux/instantclient/19800/oracle-instantclient19.8-basic-19.8.0.0.0-1.x86_64.rpm https://download.oracle.com/otn_software/linux/instantclient/19800/oracle-instantclient19.8-sqlplus-19.8.0.0.0-1.x86_64.rpm # Install IPAM dependencies -RUN dnf install -y http://firefly.artica.es/centos7/xprobe2-0.3-12.2.x86_64.rpm "perl(NetAddr::IP)" "perl(Sys::Syslog)" "perl(DBI)" "perl(XML::Simple)" "perl(Geo::IP)" "perl(IO::Socket::INET6)" "perl(XML::Twig)" "perl(DBD::mysql)" --setopt=tsflags=nodocs +RUN dnf install -y "perl(NetAddr::IP)" "perl(Sys::Syslog)" "perl(DBI)" "perl(XML::Simple)" "perl(Geo::IP)" "perl(IO::Socket::INET6)" "perl(XML::Twig)" "perl(DBD::mysql)" --setopt=tsflags=nodocs EXPOSE 80 443 41121 162/udp diff --git a/pandora_server/DEBIAN/control b/pandora_server/DEBIAN/control index 2ff38f3ffe..75251d1b5e 100644 --- a/pandora_server/DEBIAN/control +++ b/pandora_server/DEBIAN/control @@ -6,5 +6,5 @@ Section: admin Installed-Size: 640 Maintainer: ÁRTICA ST Homepage: http://pandorafms.org/ -Depends: perl (>= 5.8), libdbi-perl, libdbd-mysql-perl, libtime-format-perl, libnetaddr-ip-perl, libtime-format-perl, libxml-simple-perl, libxml-twig-perl, libhtml-parser-perl, snmp, snmpd, traceroute, xprobe2, nmap, sudo, libwww-perl, libsocket6-perl, libio-socket-inet6-perl, libio-socket-ssl-perl, snmp-mibs-downloader, libjson-perl, libnet-telnet-perl, libencode-locale-perl, libgeo-ip-perl +Depends: perl (>= 5.8), libdbi-perl, libdbd-mysql-perl, libtime-format-perl, libnetaddr-ip-perl, libtime-format-perl, libxml-simple-perl, libxml-twig-perl, libhtml-parser-perl, snmp, snmpd, traceroute, nmap, sudo, libwww-perl, libsocket6-perl, libio-socket-inet6-perl, libio-socket-ssl-perl, snmp-mibs-downloader, libjson-perl, libnet-telnet-perl, libencode-locale-perl, libgeo-ip-perl Description: Pandora FMS is a monitoring system for big IT environments. It uses remote tests, or local agents to grab information. Pandora supports all standard OS (Linux, AIX, HP-UX, Solaris and Windows XP,2000/2003), and support multiple setups in HA enviroments. This is the server package. Server makes the remote checks and process information transfer by Pandora FMS agents to the server. diff --git a/pandora_server/FreeBSD/pandora_server.conf.new b/pandora_server/FreeBSD/pandora_server.conf.new index 481bf1f24d..7de292b583 100644 --- a/pandora_server/FreeBSD/pandora_server.conf.new +++ b/pandora_server/FreeBSD/pandora_server.conf.new @@ -242,13 +242,6 @@ mta_address localhost # Set 0 if want eMail deliver shared mail by all destination. mail_in_separate 1 - -# xprobe2: Optional package to detect OS types using advanced TCP/IP -# fingerprinting tecniques, much more accurates than stadard nmap. -# If not provided, nmap is used insted xprobe2 - -xprobe2 /usr/local/bin/xprobe2 - # nmap: If provided, is used to detect OS type with recon server using # advanded OS fingerprint technique. Xprobe2 gives more accurate results # Nmap is also used to do TCP port scanning in detected host. diff --git a/pandora_server/NetBSD/pandora_server.conf.new b/pandora_server/NetBSD/pandora_server.conf.new index 9b95def21a..49278ac36a 100644 --- a/pandora_server/NetBSD/pandora_server.conf.new +++ b/pandora_server/NetBSD/pandora_server.conf.new @@ -238,13 +238,6 @@ mta_address localhost # Set 0 if want eMail deliver shared mail by all destination. mail_in_separate 1 - -# xprobe2: Optional package to detect OS types using advanced TCP/IP -# fingerprinting tecniques, much more accurates than stadard nmap. -# If not provided, nmap is used insted xprobe2 - -xprobe2 /usr/local/bin/xprobe2 - # nmap: If provided, is used to detect OS type with recon server using # advanded OS fingerprint technique. Xprobe2 gives more accurate results # Nmap is also used to do TCP port scanning in detected host. diff --git a/pandora_server/conf/pandora_server.conf.new b/pandora_server/conf/pandora_server.conf.new index cdfdce105c..e7664e5752 100644 --- a/pandora_server/conf/pandora_server.conf.new +++ b/pandora_server/conf/pandora_server.conf.new @@ -302,13 +302,6 @@ dataserver_threads 1 # Set 0 if want eMail deliver shared mail by all destination. mail_in_separate 1 - -# xprobe2: Optional package to detect OS types using advanced TCP/IP -# fingerprinting tecniques, much more accurates than stadard nmap. -# If not provided, nmap is used insted xprobe2 - -xprobe2 /usr/bin/xprobe2 - # nmap: If provided, is used to detect OS type with recon server using # advanded OS fingerprint technique. Xprobe2 gives more accurate results # Nmap is also used to do TCP port scanning in detected host. diff --git a/pandora_server/conf/pandora_server.conf.windows b/pandora_server/conf/pandora_server.conf.windows index 8d879bc5cd..b3362b067d 100644 --- a/pandora_server/conf/pandora_server.conf.windows +++ b/pandora_server/conf/pandora_server.conf.windows @@ -252,12 +252,6 @@ dataserver_threads 2 #mta_encryption none -# xprobe2: Optional package to detect OS types using advanced TCP/IP -# fingerprinting tecniques, much more accurates than stadard nmap. -# If not provided, nmap is used insted xprobe2 - -#xprobe2 c:\pandora_server\bin\xprobe2 - # nmap: If provided, is used to detect OS type with recon server using # advanded OS fingerprint technique. Xprobe2 gives more accurate results # Nmap is also used to do TCP port scanning in detected host. diff --git a/pandora_server/conf/pandora_server_sec.conf.template b/pandora_server/conf/pandora_server_sec.conf.template index 90d71af5fd..a188feb556 100644 --- a/pandora_server/conf/pandora_server_sec.conf.template +++ b/pandora_server/conf/pandora_server_sec.conf.template @@ -302,13 +302,6 @@ dataserver_threads 1 # Set 0 if want eMail deliver shared mail by all destination. mail_in_separate 1 - -# xprobe2: Optional package to detect OS types using advanced TCP/IP -# fingerprinting tecniques, much more accurates than stadard nmap. -# If not provided, nmap is used insted xprobe2 - -xprobe2 /usr/bin/xprobe2 - # nmap: If provided, is used to detect OS type with recon server using # advanded OS fingerprint technique. Xprobe2 gives more accurate results # Nmap is also used to do TCP port scanning in detected host. diff --git a/pandora_server/lib/PandoraFMS/Config.pm b/pandora_server/lib/PandoraFMS/Config.pm index a05a44abcd..58a14fe54a 100644 --- a/pandora_server/lib/PandoraFMS/Config.pm +++ b/pandora_server/lib/PandoraFMS/Config.pm @@ -371,9 +371,6 @@ sub pandora_load_config { # SNMP enterprise retries (for braa) $pa_config->{"braa_retries"} = 3; # 5.0 - - # Xprobe2 for recon OS fingerprinting and tcpscan (optional) - $pa_config->{"xprobe2"} = "/usr/bin/xprobe2"; # Winexe allows to exec commands on remote windows systems (optional) $pa_config->{"winexe"} = "/usr/bin/winexe"; @@ -927,9 +924,6 @@ sub pandora_load_config { elsif ($parametro =~ m/^braa_retries\s+([0-9]*)/i) { $pa_config->{"braa_retries"} = clean_blank($1); } - elsif ($parametro =~ m/^xprobe2\s(.*)/i) { - $pa_config->{'xprobe2'}= clean_blank($1); - } elsif ($parametro =~ m/^winexe\s(.*)/i) { $pa_config->{'winexe'}= clean_blank($1); } diff --git a/pandora_server/lib/PandoraFMS/Core.pm b/pandora_server/lib/PandoraFMS/Core.pm index 7cdfb125b1..70b5b8d1de 100644 --- a/pandora_server/lib/PandoraFMS/Core.pm +++ b/pandora_server/lib/PandoraFMS/Core.pm @@ -6638,40 +6638,40 @@ sub pandora_get_os ($$) { return 10; } - if ($os =~ m/Windows/i) { + if ($os =~ m/Windows.*?(?=\(\d+%\))/i) { return 9; } - if ($os =~ m/Cisco/i) { + if ($os =~ m/Cisco.*?(?=\(\d+%\))/i) { return 7; } - if ($os =~ m/SunOS/i || $os =~ m/Solaris/i) { + if ($os =~ m/SunOS.*?(?=\(\d+%\))/i || $os =~ m/Solaris.*?(?=\(\d+%\))/i) { return 2; } - if ($os =~ m/AIX/i) { + if ($os =~ m/AIX.*?(?=\(\d+%\))/i) { return 3; } - if ($os =~ m/HP\-UX/i) { + if ($os =~ m/HP\-UX.*?(?=\(\d+%\))/i) { return 5; } - if ($os =~ m/Apple/i || $os =~ m/Darwin/i) { + if ($os =~ m/Apple.*?(?=\(\d+%\))/i || $os =~ m/Darwin.*?(?=\(\d+%\))/i) { return 8; } - if ($os =~ m/Linux/i) { + if ($os =~ m/Linux.*?(?=\(\d+%\))/i) { return 1; } - if ($os =~ m/Enterasys/i || $os =~ m/3com/i) { + if ($os =~ m/Enterasys.*?(?=\(\d+%\))/i || $os =~ m/3com.*?(?=\(\d+%\))/i) { return 11; } - if ($os =~ m/Octopods/i) { + if ($os =~ m/Octopods.*?(?=\(\d+%\))/i) { return 13; } - if ($os =~ m/embedded/i) { + if ($os =~ m/embedded.*?(?=\(\d+%\))/i) { return 14; } - if ($os =~ m/android/i) { + if ($os =~ m/android.*?(?=\(\d+%\))/i) { return 15; } - if ($os =~ m/BSD/i) { + if ($os =~ m/BSD.*?(?=\(\d+%\))/i) { return 4; } diff --git a/pandora_server/lib/PandoraFMS/DiscoveryServer.pm b/pandora_server/lib/PandoraFMS/DiscoveryServer.pm index 2d5928333d..9dcfe6d43b 100644 --- a/pandora_server/lib/PandoraFMS/DiscoveryServer.pm +++ b/pandora_server/lib/PandoraFMS/DiscoveryServer.pm @@ -407,7 +407,7 @@ sub exec_recon_script ($$$) { } ################################################################################ -# Guess the OS using xprobe2 or nmap. +# Guess the OS using nmap. ################################################################################ sub PandoraFMS::Recon::Base::guess_os($$;$) { my ($self, $device, $string_flag) = @_; @@ -426,26 +426,18 @@ sub PandoraFMS::Recon::Base::guess_os($$;$) { return OS_SWITCH if ($device_type eq 'switch'); return OS_OTHER; } - - # Use xprobe2 if available - if (-x $self->{'pa_config'}->{'xprobe2'}) { - my $return = `"$self->{pa_config}->{xprobe2}" $device 2>$DEVNULL`; - if ($? == 0) { - if($return =~ /Running OS:(.*)/) { - my $str_os = $1; - return $str_os if is_enabled($string_flag); - return pandora_get_os($self->{'dbh'}, $str_os); - } - } - } # Use nmap by default if (-x $self->{'pa_config'}->{'nmap'}) { - my $return = `"$self->{pa_config}->{nmap}" -F -O $device 2>$DEVNULL`; + my $return = `"$self->{pa_config}->{nmap}" -sSU -T5 -F -O --osscan-limit $device 2>$DEVNULL`; return OS_OTHER if ($? != 0); - - if ($return =~ /Aggressive OS guesses:\s*(.*)/) { - my $str_os = $1; + my $str_os; + if ($return =~ /Aggressive OS guesses:\s*(.*)|OS details:\s(.*)/) { + if($1 ne "") { + $str_os = $1; + } else { + $str_os = $2; + } return $str_os if is_enabled($string_flag); return pandora_get_os($self->{'dbh'}, $str_os); } diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index df8e987c53..d29c79d8cf 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -214,7 +214,7 @@ install () { echo "The complete installation guide is at: https://pandorafms.com/docs/" echo " " echo "Debian-based distribution do:" - echo " # apt-get install snmp snmpd libjson-perllibio-socket-inet6-perl libsocket6-perl libxml-simple-perl libxml-twig-perl libnetaddr-ip-perl libdbi-perl libnetaddr-ip-perl libhtml-parser-perl wmi-client xprobe2 snmp-mibs-downloader" + echo " # apt-get install snmp snmpd libjson-perllibio-socket-inet6-perl libsocket6-perl libxml-simple-perl libxml-twig-perl libnetaddr-ip-perl libdbi-perl libnetaddr-ip-perl libhtml-parser-perl wmi-client snmp-mibs-downloader" echo " " echo "For CentOS / RHEL do: " echo " " @@ -226,13 +226,13 @@ install () { perl-HTML-Encoding perl-HTML-Tree perl-NetAddr-IP perl-IO-Socket-INET6 perl-Socket6 perl-TimeDate perl-XML-Simple perl-XML-Twig perl-libwww-perl mysql-client" echo " " - echo " You also will need to install (optionally) xprobe2 and wmiclient from rpm (download from our website)" + echo " You also will need to install (optionally) wmiclient from rpm (download from our website)" echo " " echo "For FreeBSD do : " echo " " echo " Install following tools from ports or packages." echo " Recommended: p5-DBI p5-NetAddr-IP p5-XML-Simple p5-XML-Twig p5-HTML-Parser p5-DBD-mysql p5-Socket6 p5-IO-Socket-INET6 p5-JSON" - echo " Optional: nmap xprobe" + echo " Optional: nmap" echo " " echo " And install Geo::IP manually." echo " " diff --git a/tests/Dockerfile b/tests/Dockerfile index f414f3fe03..4c0629690a 100644 --- a/tests/Dockerfile +++ b/tests/Dockerfile @@ -54,7 +54,6 @@ RUN dnf install -y vim wget bzip2 curl && \ php-zip \ php-xmlrpc \ nmap \ - xprobe2 \ mysql-server \ mysql \ htop \ @@ -76,7 +75,6 @@ RUN dnf install -y vim wget bzip2 curl && \ perl-IO-Socket-SSL \ nmap \ sudo \ - xprobe2 \ make \ perl-CPAN \ perl-JSON \ From e4b17428b74ab9282e8094c5d1baadabf5628eac Mon Sep 17 00:00:00 2001 From: Daniel Maya Date: Thu, 27 Apr 2023 10:05:20 +0200 Subject: [PATCH 13/33] #10474 visual changes --- pandora_console/include/functions_graph.php | 2 +- pandora_console/include/graphs/pandora.d3.js | 83 +++++++++++++++----- 2 files changed, 65 insertions(+), 20 deletions(-) diff --git a/pandora_console/include/functions_graph.php b/pandora_console/include/functions_graph.php index 026ef1c889..d1702ef9d6 100644 --- a/pandora_console/include/functions_graph.php +++ b/pandora_console/include/functions_graph.php @@ -5241,7 +5241,7 @@ function graph_monitor_wheel($width=550, $height=600, $filter=false) 'name' => __('Main node'), 'type' => 'center_node', 'children' => iterate_group_array($data_groups, $data_agents), - 'color' => '#3F3F3F', + 'color' => ($config['style'] === 'pandora_black') ? '#111' : '#FFF', ]; if (empty($graph_data['children'])) { diff --git a/pandora_console/include/graphs/pandora.d3.js b/pandora_console/include/graphs/pandora.d3.js index 09150de658..5c8b59013b 100644 --- a/pandora_console/include/graphs/pandora.d3.js +++ b/pandora_console/include/graphs/pandora.d3.js @@ -825,8 +825,7 @@ function sunburst(recipient, data, width, height, tooltip = true) { if (height === "auto") { height = width; } - // var width = 960, - // height = 700; + var radius = Math.min(width, height) / 2; var x = d3.scale.linear().range([0, 2 * Math.PI]); @@ -857,7 +856,11 @@ function sunburst(recipient, data, width, height, tooltip = true) { return Math.max(0, y(d.y)); }) .outerRadius(function(d) { - return Math.max(0, y(d.y + d.dy)); + if (d.children || d.depth === 4) { + return Math.max(0, y(d.y + d.dy)); + } else { + return Math.max(0, y(d.y + d.dy)) + 20; + } }); var g = svg @@ -879,6 +882,7 @@ function sunburst(recipient, data, width, height, tooltip = true) { : color((d.children ? d : d.parent).name); }) .style("cursor", "pointer") + .style("stroke-width", "0.2") .on("click", click) .on("mouseover", tooltip === "1" ? over_user : "") .on("mouseout", out_user) @@ -888,23 +892,38 @@ function sunburst(recipient, data, width, height, tooltip = true) { if (d.type === "central_service") { return 0; } + var ang = ((x(d.x + d.dx / 2) - Math.PI / 2) / Math.PI) * 180; - return ang > 90 ? 180 + ang : ang; + if (calculate_angle(d) < 20) { + return ang; + } else { + return Math.trunc(ang) == 90 || Math.trunc(ang) == 89 + ? ang - 90 + : 90 + ang; + } } var text = g .append("text") .attr("transform", function(d) { - return ( - "translate(" + - arc.centroid(d) + - ")rotate(" + - computeTextRotation(d) + - ")" - ); + if (typeof d.show_name != "undefined" && d.show_name) { + return ( + "translate(" + + arc.centroid(d) + + ")rotate(" + + computeTextRotation(d) + + ")" + ); + } }) .attr("x", function(d) { - return computeTextRotation(d) > 180 ? -40 : -30; + if (typeof d.show_name != "undefined" && d.show_name) { + if (calculate_angle(d) < 20) { + return (d.name.length + 15) * -1; + } else { + return (d.name.length + 25) * -1; + } + } }) .attr("dx", "6") // margin .attr("dy", function(d) { @@ -914,17 +933,30 @@ function sunburst(recipient, data, width, height, tooltip = true) { return ".35em"; }) // vertical-align .attr("opacity", function(d) { - if ( - (typeof d.show_name != "undefined" && d.show_name) || - d.type === "central_service" - ) + if (typeof d.show_name != "undefined" && d.show_name) { return 1; - else return 0; + } else { + return 0; + } }) .text(function(d) { + if (d.name.length > 20) { + var resta = d.name.length - 12; + var string = d.name.slice( + d.name.length / 2 - resta / 2, + d.name.length / 2 + resta / 2 + ); + var split = d.name.split(`${string}`); + return `${split[0]}...${split[1]}`; + } return d.name; }) - .style("font-size", "10px") + .style("font-size", "11px") + .style("fill", function(d) { + if (d.color !== "#82b92e") { + return "white"; + } + }) // Makes svg elements invisible to events .style("pointer-events", "none"); @@ -972,7 +1004,11 @@ function sunburst(recipient, data, width, height, tooltip = true) { ); }) .attr("x", function(d) { - return computeTextRotation(d) > 180 ? -40 : -30; + if (calculate_angle(d) < 20) { + return (d.name.length + 15) * -1; + } else { + return (d.name.length + 25) * -1; + } }) .transition() .duration(250) @@ -1074,6 +1110,15 @@ function sunburst(recipient, data, width, height, tooltip = true) { function hide_tooltip() { $("#tooltip").hide(); } + + function calculate_angle(d) { + var start_angle = Math.max(0, Math.min(2 * Math.PI, x(d.x))); + start_angle = (start_angle * 180) / Math.PI; + var end_angle = Math.max(0, Math.min(2 * Math.PI, x(d.x + d.dx))); + end_angle = (end_angle * 180) / Math.PI; + + return end_angle - start_angle; + } } function createGauge( From 44ffd0f75b708d192cd88be71878979271d8c2dd Mon Sep 17 00:00:00 2001 From: Daniel Maya Date: Fri, 28 Apr 2023 10:27:45 +0200 Subject: [PATCH 14/33] #10157 Added max parameter --- .../util/plugin/pandora_snmp_bandwidth.pl | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/pandora_server/util/plugin/pandora_snmp_bandwidth.pl b/pandora_server/util/plugin/pandora_snmp_bandwidth.pl index 2c68be5473..015bde5893 100755 --- a/pandora_server/util/plugin/pandora_snmp_bandwidth.pl +++ b/pandora_server/util/plugin/pandora_snmp_bandwidth.pl @@ -60,6 +60,7 @@ Where OPTIONS could be: -inUsage Show only input usage (in percentage) - 1, or not 0. -outUsage Show only output usage (in percentage) - 1, or not 0. -f We treat unkonwn duplex as full duplex. + -max Value that replaces ifSpeed when you have a port chanel with multiple interfaces. Note: You can also use snmpget/snmpwalk argument notation, e.g. -v is equal to -version, -c to -community, etc. @@ -140,6 +141,9 @@ sub update_config_key ($) { if ($arg eq 'f') { return "unknown_fullduplex"; } + if ($arg eq 'max') { + return "max_interfaces"; + } } ################################################################################ @@ -258,12 +262,17 @@ sub prepare_tree { $speed{'oid'} .= $config->{'x86_indexes'}{'ifSpeed'}.$ifIndex; } - my $speed = snmp_get(\%speed); - if (ref($speed) eq "HASH") { - $speed = int $speed->{'data'}; + my $speed = 0; + if (empty($config->{'max_interfaces'}) { + $speed = snmp_get(\%speed); + if (ref($speed) eq "HASH") { + $speed = int $speed->{'data'}; + } else { + # Ignore, cannot retrieve inOctets. + next; + } } else { - # Ignore, cannot retrieve inOctets. - next; + $speed = $config->{'max_interfaces'}; } { From 77b5b7af4511c748390a3c912e3bee047fee2ced Mon Sep 17 00:00:00 2001 From: Daniel Maya Date: Fri, 28 Apr 2023 10:51:21 +0200 Subject: [PATCH 15/33] #10157 Fix max_interfaces --- pandora_server/util/plugin/pandora_snmp_bandwidth.pl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_server/util/plugin/pandora_snmp_bandwidth.pl b/pandora_server/util/plugin/pandora_snmp_bandwidth.pl index 015bde5893..15fcf58f73 100755 --- a/pandora_server/util/plugin/pandora_snmp_bandwidth.pl +++ b/pandora_server/util/plugin/pandora_snmp_bandwidth.pl @@ -263,7 +263,7 @@ sub prepare_tree { } my $speed = 0; - if (empty($config->{'max_interfaces'}) { + if (empty($config->{'max_interfaces'})) { $speed = snmp_get(\%speed); if (ref($speed) eq "HASH") { $speed = int $speed->{'data'}; From 459da487b80747c8cc52e57a6602530aaf100180 Mon Sep 17 00:00:00 2001 From: artica Date: Sat, 29 Apr 2023 01:00:23 +0200 Subject: [PATCH 16/33] Auto-updated build strings. --- pandora_agents/unix/DEBIAN/control | 2 +- pandora_agents/unix/DEBIAN/make_deb_package.sh | 2 +- pandora_agents/unix/pandora_agent | 2 +- pandora_agents/unix/pandora_agent.redhat.spec | 2 +- pandora_agents/unix/pandora_agent.spec | 2 +- pandora_agents/unix/pandora_agent_installer | 2 +- pandora_agents/win32/installer/pandora.mpi | 2 +- pandora_agents/win32/pandora.cc | 2 +- pandora_agents/win32/versioninfo.rc | 2 +- pandora_console/DEBIAN/control | 2 +- pandora_console/DEBIAN/make_deb_package.sh | 2 +- pandora_console/include/config_process.php | 2 +- pandora_console/install.php | 2 +- pandora_console/pandora_console.redhat.spec | 2 +- pandora_console/pandora_console.rhel7.spec | 2 +- pandora_console/pandora_console.spec | 2 +- pandora_server/DEBIAN/control | 2 +- pandora_server/DEBIAN/make_deb_package.sh | 2 +- pandora_server/lib/PandoraFMS/Config.pm | 2 +- pandora_server/lib/PandoraFMS/PluginTools.pm | 2 +- pandora_server/pandora_server.redhat.spec | 2 +- pandora_server/pandora_server.spec | 2 +- pandora_server/pandora_server_installer | 2 +- pandora_server/util/pandora_db.pl | 2 +- pandora_server/util/pandora_manage.pl | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index 568cca018f..13d4dbb5bc 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.770-230428 +Version: 7.0NG.770-230429 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 89c3201131..364bf43b46 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.770-230428" +pandora_version="7.0NG.770-230429" echo "Test if you has the tools for to make the packages." whereis dpkg-deb | cut -d":" -f2 | grep dpkg-deb > /dev/null diff --git a/pandora_agents/unix/pandora_agent b/pandora_agents/unix/pandora_agent index 3ab9b79571..c018d9e084 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -1023,7 +1023,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.770'; -use constant AGENT_BUILD => '230428'; +use constant AGENT_BUILD => '230429'; # 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 82f58d7310..10055daf44 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.770 -%define release 230428 +%define release 230429 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index 459212d4c9..7b8f529ade 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.770 -%define release 230428 +%define release 230429 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 29db9c6c8e..bc1399b1e0 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.770" -PI_BUILD="230428" +PI_BUILD="230429" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index f3bfbf3fd0..570b0c5e3c 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{230428} +{230429} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index d5579a39c8..265be98aad 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.770 Build 230428") +#define PANDORA_VERSION ("7.0NG.770 Build 230429") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index b39ff11fd7..a79f2542e3 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Artica ST" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.770(Build 230428))" + VALUE "ProductVersion", "(7.0NG.770(Build 230429))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index 52b7d3aa61..782bf22505 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.770-230428 +Version: 7.0NG.770-230429 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 a13be52d08..c2f2e90d5f 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.770-230428" +pandora_version="7.0NG.770-230429" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index 69374ca8c7..c74cd41048 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 = 'PC230428'; +$build_version = 'PC230429'; $pandora_version = 'v7.0NG.770'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/install.php b/pandora_console/install.php index 68c0f0f212..8d6363b334 100644 --- a/pandora_console/install.php +++ b/pandora_console/install.php @@ -131,7 +131,7 @@
[ qw() ] ); diff --git a/pandora_server/pandora_server.redhat.spec b/pandora_server/pandora_server.redhat.spec index 41fdcfff16..9ec298ffda 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -4,7 +4,7 @@ %global __os_install_post %{nil} %define name pandorafms_server %define version 7.0NG.770 -%define release 230428 +%define release 230429 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index edf38cb2d6..78cc1f5acc 100644 --- a/pandora_server/pandora_server.spec +++ b/pandora_server/pandora_server.spec @@ -4,7 +4,7 @@ %global __os_install_post %{nil} %define name pandorafms_server %define version 7.0NG.770 -%define release 230428 +%define release 230429 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index 7afa921ecf..9660cfdf6b 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.770" -PI_BUILD="230428" +PI_BUILD="230429" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index 97df877e6f..ab42706639 100755 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -35,7 +35,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.770 Build 230428"; +my $version = "7.0NG.770 Build 230429"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index ea88719005..8c032c544a 100755 --- a/pandora_server/util/pandora_manage.pl +++ b/pandora_server/util/pandora_manage.pl @@ -36,7 +36,7 @@ use Encode::Locale; Encode::Locale::decode_argv; # version: define current version -my $version = "7.0NG.770 Build 230428"; +my $version = "7.0NG.770 Build 230429"; # save program name for logging my $progname = basename($0); From 0bef49b5e735ff9ca3b79160042de7959fedb829 Mon Sep 17 00:00:00 2001 From: artica Date: Sun, 30 Apr 2023 01:00:18 +0200 Subject: [PATCH 17/33] Auto-updated build strings. --- pandora_agents/unix/DEBIAN/control | 2 +- pandora_agents/unix/DEBIAN/make_deb_package.sh | 2 +- pandora_agents/unix/pandora_agent | 2 +- pandora_agents/unix/pandora_agent.redhat.spec | 2 +- pandora_agents/unix/pandora_agent.spec | 2 +- pandora_agents/unix/pandora_agent_installer | 2 +- pandora_agents/win32/installer/pandora.mpi | 2 +- pandora_agents/win32/pandora.cc | 2 +- pandora_agents/win32/versioninfo.rc | 2 +- pandora_console/DEBIAN/control | 2 +- pandora_console/DEBIAN/make_deb_package.sh | 2 +- pandora_console/include/config_process.php | 2 +- pandora_console/install.php | 2 +- pandora_console/pandora_console.redhat.spec | 2 +- pandora_console/pandora_console.rhel7.spec | 2 +- pandora_console/pandora_console.spec | 2 +- pandora_server/DEBIAN/control | 2 +- pandora_server/DEBIAN/make_deb_package.sh | 2 +- pandora_server/lib/PandoraFMS/Config.pm | 2 +- pandora_server/lib/PandoraFMS/PluginTools.pm | 2 +- pandora_server/pandora_server.redhat.spec | 2 +- pandora_server/pandora_server.spec | 2 +- pandora_server/pandora_server_installer | 2 +- pandora_server/util/pandora_db.pl | 2 +- pandora_server/util/pandora_manage.pl | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index 13d4dbb5bc..565f2f30a4 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.770-230429 +Version: 7.0NG.770-230430 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 364bf43b46..7f5484a9fe 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.770-230429" +pandora_version="7.0NG.770-230430" echo "Test if you has the tools for to make the packages." whereis dpkg-deb | cut -d":" -f2 | grep dpkg-deb > /dev/null diff --git a/pandora_agents/unix/pandora_agent b/pandora_agents/unix/pandora_agent index c018d9e084..3160ab2ecd 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -1023,7 +1023,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.770'; -use constant AGENT_BUILD => '230429'; +use constant AGENT_BUILD => '230430'; # 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 10055daf44..08e823487c 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.770 -%define release 230429 +%define release 230430 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index 7b8f529ade..fe2de7933d 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.770 -%define release 230429 +%define release 230430 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 bc1399b1e0..8f6bf92ede 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.770" -PI_BUILD="230429" +PI_BUILD="230430" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index 570b0c5e3c..ffac212942 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{230429} +{230430} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index 265be98aad..94dcbabdd8 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.770 Build 230429") +#define PANDORA_VERSION ("7.0NG.770 Build 230430") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index a79f2542e3..06d2726ac1 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Artica ST" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.770(Build 230429))" + VALUE "ProductVersion", "(7.0NG.770(Build 230430))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index 782bf22505..e18516e03b 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.770-230429 +Version: 7.0NG.770-230430 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 c2f2e90d5f..3ad9530f41 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.770-230429" +pandora_version="7.0NG.770-230430" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index c74cd41048..e5418b7889 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 = 'PC230429'; +$build_version = 'PC230430'; $pandora_version = 'v7.0NG.770'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/install.php b/pandora_console/install.php index 8d6363b334..ccfe4f019a 100644 --- a/pandora_console/install.php +++ b/pandora_console/install.php @@ -131,7 +131,7 @@
[ qw() ] ); diff --git a/pandora_server/pandora_server.redhat.spec b/pandora_server/pandora_server.redhat.spec index 9ec298ffda..dea5bec902 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -4,7 +4,7 @@ %global __os_install_post %{nil} %define name pandorafms_server %define version 7.0NG.770 -%define release 230429 +%define release 230430 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index 78cc1f5acc..a311240f9b 100644 --- a/pandora_server/pandora_server.spec +++ b/pandora_server/pandora_server.spec @@ -4,7 +4,7 @@ %global __os_install_post %{nil} %define name pandorafms_server %define version 7.0NG.770 -%define release 230429 +%define release 230430 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index 9660cfdf6b..a877414d56 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.770" -PI_BUILD="230429" +PI_BUILD="230430" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index ab42706639..f5f0cba334 100755 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -35,7 +35,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.770 Build 230429"; +my $version = "7.0NG.770 Build 230430"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index 8c032c544a..9ff366c075 100755 --- a/pandora_server/util/pandora_manage.pl +++ b/pandora_server/util/pandora_manage.pl @@ -36,7 +36,7 @@ use Encode::Locale; Encode::Locale::decode_argv; # version: define current version -my $version = "7.0NG.770 Build 230429"; +my $version = "7.0NG.770 Build 230430"; # save program name for logging my $progname = basename($0); From 2e9c6a339fda8df374bc93e655688a5cd6e807bc Mon Sep 17 00:00:00 2001 From: artica Date: Mon, 1 May 2023 01:00:13 +0200 Subject: [PATCH 18/33] Auto-updated build strings. --- pandora_agents/unix/DEBIAN/control | 2 +- pandora_agents/unix/DEBIAN/make_deb_package.sh | 2 +- pandora_agents/unix/pandora_agent | 2 +- pandora_agents/unix/pandora_agent.redhat.spec | 2 +- pandora_agents/unix/pandora_agent.spec | 2 +- pandora_agents/unix/pandora_agent_installer | 2 +- pandora_agents/win32/installer/pandora.mpi | 2 +- pandora_agents/win32/pandora.cc | 2 +- pandora_agents/win32/versioninfo.rc | 2 +- pandora_console/DEBIAN/control | 2 +- pandora_console/DEBIAN/make_deb_package.sh | 2 +- pandora_console/include/config_process.php | 2 +- pandora_console/install.php | 2 +- pandora_console/pandora_console.redhat.spec | 2 +- pandora_console/pandora_console.rhel7.spec | 2 +- pandora_console/pandora_console.spec | 2 +- pandora_server/DEBIAN/control | 2 +- pandora_server/DEBIAN/make_deb_package.sh | 2 +- pandora_server/lib/PandoraFMS/Config.pm | 2 +- pandora_server/lib/PandoraFMS/PluginTools.pm | 2 +- pandora_server/pandora_server.redhat.spec | 2 +- pandora_server/pandora_server.spec | 2 +- pandora_server/pandora_server_installer | 2 +- pandora_server/util/pandora_db.pl | 2 +- pandora_server/util/pandora_manage.pl | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index 565f2f30a4..133d519adc 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.770-230430 +Version: 7.0NG.770-230501 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 7f5484a9fe..70aec61e0f 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.770-230430" +pandora_version="7.0NG.770-230501" echo "Test if you has the tools for to make the packages." whereis dpkg-deb | cut -d":" -f2 | grep dpkg-deb > /dev/null diff --git a/pandora_agents/unix/pandora_agent b/pandora_agents/unix/pandora_agent index 3160ab2ecd..24079e5ba7 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -1023,7 +1023,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.770'; -use constant AGENT_BUILD => '230430'; +use constant AGENT_BUILD => '230501'; # 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 08e823487c..746678634f 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.770 -%define release 230430 +%define release 230501 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index fe2de7933d..22cf2d80b0 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.770 -%define release 230430 +%define release 230501 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 8f6bf92ede..6a42d6ef87 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.770" -PI_BUILD="230430" +PI_BUILD="230501" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index ffac212942..42b11e2b27 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{230430} +{230501} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index 94dcbabdd8..92c1298c3a 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.770 Build 230430") +#define PANDORA_VERSION ("7.0NG.770 Build 230501") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index 06d2726ac1..36318b36a2 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Artica ST" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.770(Build 230430))" + VALUE "ProductVersion", "(7.0NG.770(Build 230501))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index e18516e03b..83984ac95a 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.770-230430 +Version: 7.0NG.770-230501 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 3ad9530f41..139a257217 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.770-230430" +pandora_version="7.0NG.770-230501" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index e5418b7889..9171d6b575 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 = 'PC230430'; +$build_version = 'PC230501'; $pandora_version = 'v7.0NG.770'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/install.php b/pandora_console/install.php index ccfe4f019a..1db22c810e 100644 --- a/pandora_console/install.php +++ b/pandora_console/install.php @@ -131,7 +131,7 @@
[ qw() ] ); diff --git a/pandora_server/pandora_server.redhat.spec b/pandora_server/pandora_server.redhat.spec index dea5bec902..2721c8729d 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -4,7 +4,7 @@ %global __os_install_post %{nil} %define name pandorafms_server %define version 7.0NG.770 -%define release 230430 +%define release 230501 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index a311240f9b..27d9d7ebf0 100644 --- a/pandora_server/pandora_server.spec +++ b/pandora_server/pandora_server.spec @@ -4,7 +4,7 @@ %global __os_install_post %{nil} %define name pandorafms_server %define version 7.0NG.770 -%define release 230430 +%define release 230501 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index a877414d56..8d9a055811 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.770" -PI_BUILD="230430" +PI_BUILD="230501" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index f5f0cba334..55f3d0f9cc 100755 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -35,7 +35,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.770 Build 230430"; +my $version = "7.0NG.770 Build 230501"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index 9ff366c075..68dbfe04a7 100755 --- a/pandora_server/util/pandora_manage.pl +++ b/pandora_server/util/pandora_manage.pl @@ -36,7 +36,7 @@ use Encode::Locale; Encode::Locale::decode_argv; # version: define current version -my $version = "7.0NG.770 Build 230430"; +my $version = "7.0NG.770 Build 230501"; # save program name for logging my $progname = basename($0); From b58ece6359a23470258d8edc1bfdfda1972fff65 Mon Sep 17 00:00:00 2001 From: artica Date: Tue, 2 May 2023 01:00:10 +0200 Subject: [PATCH 19/33] Auto-updated build strings. --- pandora_agents/unix/DEBIAN/control | 2 +- pandora_agents/unix/DEBIAN/make_deb_package.sh | 2 +- pandora_agents/unix/pandora_agent | 2 +- pandora_agents/unix/pandora_agent.redhat.spec | 2 +- pandora_agents/unix/pandora_agent.spec | 2 +- pandora_agents/unix/pandora_agent_installer | 2 +- pandora_agents/win32/installer/pandora.mpi | 2 +- pandora_agents/win32/pandora.cc | 2 +- pandora_agents/win32/versioninfo.rc | 2 +- pandora_console/DEBIAN/control | 2 +- pandora_console/DEBIAN/make_deb_package.sh | 2 +- pandora_console/include/config_process.php | 2 +- pandora_console/install.php | 2 +- pandora_console/pandora_console.redhat.spec | 2 +- pandora_console/pandora_console.rhel7.spec | 2 +- pandora_console/pandora_console.spec | 2 +- pandora_server/DEBIAN/control | 2 +- pandora_server/DEBIAN/make_deb_package.sh | 2 +- pandora_server/lib/PandoraFMS/Config.pm | 2 +- pandora_server/lib/PandoraFMS/PluginTools.pm | 2 +- pandora_server/pandora_server.redhat.spec | 2 +- pandora_server/pandora_server.spec | 2 +- pandora_server/pandora_server_installer | 2 +- pandora_server/util/pandora_db.pl | 2 +- pandora_server/util/pandora_manage.pl | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index 133d519adc..0d53735e7c 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.770-230501 +Version: 7.0NG.770-230502 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 70aec61e0f..67700f4aac 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.770-230501" +pandora_version="7.0NG.770-230502" echo "Test if you has the tools for to make the packages." whereis dpkg-deb | cut -d":" -f2 | grep dpkg-deb > /dev/null diff --git a/pandora_agents/unix/pandora_agent b/pandora_agents/unix/pandora_agent index 24079e5ba7..949782837e 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -1023,7 +1023,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.770'; -use constant AGENT_BUILD => '230501'; +use constant AGENT_BUILD => '230502'; # 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 746678634f..ac395ca427 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.770 -%define release 230501 +%define release 230502 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index 22cf2d80b0..c461e05674 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.770 -%define release 230501 +%define release 230502 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 6a42d6ef87..46c884533b 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.770" -PI_BUILD="230501" +PI_BUILD="230502" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index 42b11e2b27..5e521c46b5 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{230501} +{230502} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index 92c1298c3a..1552b0a88d 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.770 Build 230501") +#define PANDORA_VERSION ("7.0NG.770 Build 230502") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index 36318b36a2..9ffc2a75c7 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Artica ST" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.770(Build 230501))" + VALUE "ProductVersion", "(7.0NG.770(Build 230502))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index 83984ac95a..4b271da766 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.770-230501 +Version: 7.0NG.770-230502 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 139a257217..10b5e0754e 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.770-230501" +pandora_version="7.0NG.770-230502" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index 9171d6b575..2259114f2c 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 = 'PC230501'; +$build_version = 'PC230502'; $pandora_version = 'v7.0NG.770'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/install.php b/pandora_console/install.php index 1db22c810e..e904af538a 100644 --- a/pandora_console/install.php +++ b/pandora_console/install.php @@ -131,7 +131,7 @@
[ qw() ] ); diff --git a/pandora_server/pandora_server.redhat.spec b/pandora_server/pandora_server.redhat.spec index 2721c8729d..953b0638d4 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -4,7 +4,7 @@ %global __os_install_post %{nil} %define name pandorafms_server %define version 7.0NG.770 -%define release 230501 +%define release 230502 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index 27d9d7ebf0..942f89d888 100644 --- a/pandora_server/pandora_server.spec +++ b/pandora_server/pandora_server.spec @@ -4,7 +4,7 @@ %global __os_install_post %{nil} %define name pandorafms_server %define version 7.0NG.770 -%define release 230501 +%define release 230502 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index 8d9a055811..087f75724a 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.770" -PI_BUILD="230501" +PI_BUILD="230502" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index 55f3d0f9cc..b113c87525 100755 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -35,7 +35,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.770 Build 230501"; +my $version = "7.0NG.770 Build 230502"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index 68dbfe04a7..cbe2b53f67 100755 --- a/pandora_server/util/pandora_manage.pl +++ b/pandora_server/util/pandora_manage.pl @@ -36,7 +36,7 @@ use Encode::Locale; Encode::Locale::decode_argv; # version: define current version -my $version = "7.0NG.770 Build 230501"; +my $version = "7.0NG.770 Build 230502"; # save program name for logging my $progname = basename($0); From 77ac357745b015e6c5fb041b622729ecffaa5022 Mon Sep 17 00:00:00 2001 From: artica Date: Wed, 3 May 2023 01:00:14 +0200 Subject: [PATCH 20/33] Auto-updated build strings. --- pandora_agents/unix/DEBIAN/control | 2 +- pandora_agents/unix/DEBIAN/make_deb_package.sh | 2 +- pandora_agents/unix/pandora_agent | 2 +- pandora_agents/unix/pandora_agent.redhat.spec | 2 +- pandora_agents/unix/pandora_agent.spec | 2 +- pandora_agents/unix/pandora_agent_installer | 2 +- pandora_agents/win32/installer/pandora.mpi | 2 +- pandora_agents/win32/pandora.cc | 2 +- pandora_agents/win32/versioninfo.rc | 2 +- pandora_console/DEBIAN/control | 2 +- pandora_console/DEBIAN/make_deb_package.sh | 2 +- pandora_console/include/config_process.php | 2 +- pandora_console/install.php | 2 +- pandora_console/pandora_console.redhat.spec | 2 +- pandora_console/pandora_console.rhel7.spec | 2 +- pandora_console/pandora_console.spec | 2 +- pandora_server/DEBIAN/control | 2 +- pandora_server/DEBIAN/make_deb_package.sh | 2 +- pandora_server/lib/PandoraFMS/Config.pm | 2 +- pandora_server/lib/PandoraFMS/PluginTools.pm | 2 +- pandora_server/pandora_server.redhat.spec | 2 +- pandora_server/pandora_server.spec | 2 +- pandora_server/pandora_server_installer | 2 +- pandora_server/util/pandora_db.pl | 2 +- pandora_server/util/pandora_manage.pl | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index 0d53735e7c..c50a5ed012 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.770-230502 +Version: 7.0NG.770-230503 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 67700f4aac..5ea967c75a 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.770-230502" +pandora_version="7.0NG.770-230503" echo "Test if you has the tools for to make the packages." whereis dpkg-deb | cut -d":" -f2 | grep dpkg-deb > /dev/null diff --git a/pandora_agents/unix/pandora_agent b/pandora_agents/unix/pandora_agent index 949782837e..698e6cfce8 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -1023,7 +1023,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.770'; -use constant AGENT_BUILD => '230502'; +use constant AGENT_BUILD => '230503'; # 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 ac395ca427..38b58135fa 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.770 -%define release 230502 +%define release 230503 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index c461e05674..18e803defc 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.770 -%define release 230502 +%define release 230503 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 46c884533b..d5bf804ef1 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.770" -PI_BUILD="230502" +PI_BUILD="230503" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index 5e521c46b5..f7f8d30db8 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{230502} +{230503} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index 1552b0a88d..ba35f55dc8 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.770 Build 230502") +#define PANDORA_VERSION ("7.0NG.770 Build 230503") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index 9ffc2a75c7..7ca0f67d08 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Artica ST" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.770(Build 230502))" + VALUE "ProductVersion", "(7.0NG.770(Build 230503))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index 4b271da766..d7118c81b0 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.770-230502 +Version: 7.0NG.770-230503 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 10b5e0754e..71b23464f3 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.770-230502" +pandora_version="7.0NG.770-230503" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index 2259114f2c..8407e27dd3 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 = 'PC230502'; +$build_version = 'PC230503'; $pandora_version = 'v7.0NG.770'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/install.php b/pandora_console/install.php index e904af538a..f849793dbb 100644 --- a/pandora_console/install.php +++ b/pandora_console/install.php @@ -131,7 +131,7 @@
[ qw() ] ); diff --git a/pandora_server/pandora_server.redhat.spec b/pandora_server/pandora_server.redhat.spec index 953b0638d4..0c1218e274 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -4,7 +4,7 @@ %global __os_install_post %{nil} %define name pandorafms_server %define version 7.0NG.770 -%define release 230502 +%define release 230503 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index 942f89d888..fd7791c2be 100644 --- a/pandora_server/pandora_server.spec +++ b/pandora_server/pandora_server.spec @@ -4,7 +4,7 @@ %global __os_install_post %{nil} %define name pandorafms_server %define version 7.0NG.770 -%define release 230502 +%define release 230503 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index 087f75724a..0bf8604989 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.770" -PI_BUILD="230502" +PI_BUILD="230503" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index b113c87525..398f90167c 100755 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -35,7 +35,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.770 Build 230502"; +my $version = "7.0NG.770 Build 230503"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index cbe2b53f67..32a6343e86 100755 --- a/pandora_server/util/pandora_manage.pl +++ b/pandora_server/util/pandora_manage.pl @@ -36,7 +36,7 @@ use Encode::Locale; Encode::Locale::decode_argv; # version: define current version -my $version = "7.0NG.770 Build 230502"; +my $version = "7.0NG.770 Build 230503"; # save program name for logging my $progname = basename($0); From 87a55dd26aa3f94aa1f83fee012ec213b98006be Mon Sep 17 00:00:00 2001 From: Daniel Maya Date: Wed, 3 May 2023 09:32:52 +0200 Subject: [PATCH 21/33] #10530 Added img --- pandora_console/images/info-warning.svg | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 pandora_console/images/info-warning.svg diff --git a/pandora_console/images/info-warning.svg b/pandora_console/images/info-warning.svg new file mode 100644 index 0000000000..f707aa9410 --- /dev/null +++ b/pandora_console/images/info-warning.svg @@ -0,0 +1,11 @@ + + + + Dark / 14 / info@svg + Created with Sketch. + + + + + + \ No newline at end of file From 151358190c963612b7d9c414624385feb1c9a725 Mon Sep 17 00:00:00 2001 From: artica Date: Thu, 4 May 2023 01:00:20 +0200 Subject: [PATCH 22/33] Auto-updated build strings. --- pandora_agents/unix/DEBIAN/control | 2 +- pandora_agents/unix/DEBIAN/make_deb_package.sh | 2 +- pandora_agents/unix/pandora_agent | 2 +- pandora_agents/unix/pandora_agent.redhat.spec | 2 +- pandora_agents/unix/pandora_agent.spec | 2 +- pandora_agents/unix/pandora_agent_installer | 2 +- pandora_agents/win32/installer/pandora.mpi | 2 +- pandora_agents/win32/pandora.cc | 2 +- pandora_agents/win32/versioninfo.rc | 2 +- pandora_console/DEBIAN/control | 2 +- pandora_console/DEBIAN/make_deb_package.sh | 2 +- pandora_console/include/config_process.php | 2 +- pandora_console/install.php | 2 +- pandora_console/pandora_console.redhat.spec | 2 +- pandora_console/pandora_console.rhel7.spec | 2 +- pandora_console/pandora_console.spec | 2 +- pandora_server/DEBIAN/control | 2 +- pandora_server/DEBIAN/make_deb_package.sh | 2 +- pandora_server/lib/PandoraFMS/Config.pm | 2 +- pandora_server/lib/PandoraFMS/PluginTools.pm | 2 +- pandora_server/pandora_server.redhat.spec | 2 +- pandora_server/pandora_server.spec | 2 +- pandora_server/pandora_server_installer | 2 +- pandora_server/util/pandora_db.pl | 2 +- pandora_server/util/pandora_manage.pl | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index c50a5ed012..a4447de079 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.770-230503 +Version: 7.0NG.770-230504 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 5ea967c75a..1587c57a02 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.770-230503" +pandora_version="7.0NG.770-230504" echo "Test if you has the tools for to make the packages." whereis dpkg-deb | cut -d":" -f2 | grep dpkg-deb > /dev/null diff --git a/pandora_agents/unix/pandora_agent b/pandora_agents/unix/pandora_agent index 698e6cfce8..90d3048127 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -1023,7 +1023,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.770'; -use constant AGENT_BUILD => '230503'; +use constant AGENT_BUILD => '230504'; # 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 38b58135fa..ab86c4ebeb 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.770 -%define release 230503 +%define release 230504 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index 18e803defc..4542c2e76b 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.770 -%define release 230503 +%define release 230504 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 d5bf804ef1..b7f0573207 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.770" -PI_BUILD="230503" +PI_BUILD="230504" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index f7f8d30db8..cdd6cb5df8 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{230503} +{230504} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index ba35f55dc8..59c476faf7 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.770 Build 230503") +#define PANDORA_VERSION ("7.0NG.770 Build 230504") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index 7ca0f67d08..65d4aaa5fd 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Artica ST" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.770(Build 230503))" + VALUE "ProductVersion", "(7.0NG.770(Build 230504))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index d7118c81b0..5ac62bd771 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.770-230503 +Version: 7.0NG.770-230504 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 71b23464f3..18d5ca0dfd 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.770-230503" +pandora_version="7.0NG.770-230504" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index 8407e27dd3..5d64b5cef1 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 = 'PC230503'; +$build_version = 'PC230504'; $pandora_version = 'v7.0NG.770'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/install.php b/pandora_console/install.php index f849793dbb..0195e25f1e 100644 --- a/pandora_console/install.php +++ b/pandora_console/install.php @@ -131,7 +131,7 @@
[ qw() ] ); diff --git a/pandora_server/pandora_server.redhat.spec b/pandora_server/pandora_server.redhat.spec index 0c1218e274..a9a79ec461 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -4,7 +4,7 @@ %global __os_install_post %{nil} %define name pandorafms_server %define version 7.0NG.770 -%define release 230503 +%define release 230504 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index fd7791c2be..4088b8d5c5 100644 --- a/pandora_server/pandora_server.spec +++ b/pandora_server/pandora_server.spec @@ -4,7 +4,7 @@ %global __os_install_post %{nil} %define name pandorafms_server %define version 7.0NG.770 -%define release 230503 +%define release 230504 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index 0bf8604989..d608930e7f 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.770" -PI_BUILD="230503" +PI_BUILD="230504" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index 398f90167c..4b86504312 100755 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -35,7 +35,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.770 Build 230503"; +my $version = "7.0NG.770 Build 230504"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index 32a6343e86..777f661cd8 100755 --- a/pandora_server/util/pandora_manage.pl +++ b/pandora_server/util/pandora_manage.pl @@ -36,7 +36,7 @@ use Encode::Locale; Encode::Locale::decode_argv; # version: define current version -my $version = "7.0NG.770 Build 230503"; +my $version = "7.0NG.770 Build 230504"; # save program name for logging my $progname = basename($0); From e77a63a91ff2f9899168e79df3c1b62e7297a0e9 Mon Sep 17 00:00:00 2001 From: daniel Date: Thu, 4 May 2023 12:57:01 +0200 Subject: [PATCH 23/33] fix select2 pandora_enterprise#11110 --- pandora_console/include/functions_ui.php | 2 +- .../operation/events/sound_events.php | 21 +++++++++++++------ 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/pandora_console/include/functions_ui.php b/pandora_console/include/functions_ui.php index a5bdb1218f..4dcf94edf1 100755 --- a/pandora_console/include/functions_ui.php +++ b/pandora_console/include/functions_ui.php @@ -1770,7 +1770,7 @@ function ui_require_javascript_file($name, $path='include/javascript/', $echo_ta if (is_metaconsole() && (isset($config['requirements_use_base_url']) === false - || $config['requirements_use_base_url'] === false) && $filename !== 'include/javascript/select2.min.js' + || $config['requirements_use_base_url'] === false) ) { $config['js'][$name] = '../../'.$filename; } else { diff --git a/pandora_console/operation/events/sound_events.php b/pandora_console/operation/events/sound_events.php index f71dd0fa5d..c4a968e3df 100644 --- a/pandora_console/operation/events/sound_events.php +++ b/pandora_console/operation/events/sound_events.php @@ -55,15 +55,24 @@ if (check_acl($config['id_user'], 0, 'ER') === false return; } -ob_start('ui_process_page_head'); -ob_start(); echo ''; echo ''; - -echo ''.__('Accoustic console').''; -ui_require_css_file('wizard'); -ui_require_css_file('discovery'); ?> + +<?php echo __('Accoustic console'); ?>) + + + + + + + + + + + + +
'; + echo '
'; + + if ($config['language'] === 'es') { + $instructions_url = 'https://pandorafms.com/manual/es/documentation/02_installation/05_configuration_agents'; + } else { + $instructions_url = 'https://pandorafms.com/manual/en/documentation/02_installation/05_configuration_agents'; + } + + $instructions_link = ''.__('view the following instructions').''; + + $more_info_link = html_print_div( + [ + 'id' => 'config_form_more_info', + 'class' => 'warn-box', + 'content' => __('If you need more information regarding agents').', '.$instructions_link, + ], + true + ); + + $table_config = html_print_div( + [ + 'style' => 'flex: 1;', + 'content' => html_print_table($tableConfiguration, true), + ], + true + ); + + html_print_div( + [ + 'id' => 'config_form', + 'class' => 'white_table_flex agent_details_col modal-content', + 'content' => $table_config.$more_info_link, + ] + ); + + html_print_div( + ['id' => 'footer_separator'] + ); + + html_print_div( + [ + 'id' => 'config_buttonset', + 'class' => 'ui-dialog-buttonset', + 'content' => html_print_submit_button( + __('Generate installer'), + 'generate_installer', + false, + [], + true, + ) + ] + ); + echo '
'; + echo '