Merge branch 'develop' into ent-12934-cambio-sistema-despliegue-de-agentes

This commit is contained in:
Daniel Cebrian 2024-03-21 15:23:43 +01:00
commit ded8c9b7b5
42 changed files with 7923 additions and 754 deletions

View File

@ -1,5 +1,5 @@
package: pandorafms-agent-unix
Version: 7.0NG.776-240320
Version: 7.0NG.776-240321
Architecture: all
Priority: optional
Section: admin

View File

@ -14,7 +14,7 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
pandora_version="7.0NG.776-240320"
pandora_version="7.0NG.776-240321"
echo "Test if you has the tools for to make the packages."
whereis dpkg-deb | cut -d":" -f2 | grep dpkg-deb > /dev/null

View File

@ -1039,7 +1039,7 @@ my $Sem = undef;
my $ThreadSem = undef;
use constant AGENT_VERSION => '7.0NG.776';
use constant AGENT_BUILD => '240320';
use constant AGENT_BUILD => '240321';
# Agent log default file size maximum and instances
use constant DEFAULT_MAX_LOG_SIZE => 600000;

View File

@ -4,7 +4,7 @@
%global __os_install_post %{nil}
%define name pandorafms_agent_linux
%define version 7.0NG.776
%define release 240320
%define release 240321
Summary: Pandora FMS Linux agent, PERL version
Name: %{name}

View File

@ -5,7 +5,7 @@
%define name pandorafms_agent_linux_bin
%define source_name pandorafms_agent_linux
%define version 7.0NG.776
%define release 240320
%define release 240321
%define debug_package %{nil}
Summary: Pandora FMS Linux agent, binary version

View File

@ -5,7 +5,7 @@
%define name pandorafms_agent_linux_bin
%define source_name pandorafms_agent_linux
%define version 7.0NG.776
%define release 240320
%define release 240321
%define debug_package %{nil}
Summary: Pandora FMS Linux agent, binary version

View File

@ -5,7 +5,7 @@
%define name pandorafms_agent_linux_bin
%define source_name pandorafms_agent_linux
%define version 7.0NG.776
%define release 240320
%define release 240321
Summary: Pandora FMS Linux agent, binary version
Name: %{name}

View File

@ -4,7 +4,7 @@
%global __os_install_post %{nil}
%define name pandorafms_agent_linux
%define version 7.0NG.776
%define release 240320
%define release 240321
Summary: Pandora FMS Linux agent, PERL version
Name: %{name}

View File

@ -10,7 +10,7 @@
# **********************************************************************
PI_VERSION="7.0NG.776"
PI_BUILD="240320"
PI_BUILD="240321"
OS_NAME=`uname -s`
FORCE=0

View File

@ -186,7 +186,7 @@ UpgradeApplicationID
{}
Version
{240320}
{240321}
ViewReadme
{Yes}

View File

@ -30,7 +30,7 @@ using namespace Pandora;
using namespace Pandora_Strutils;
#define PATH_SIZE _MAX_PATH+1
#define PANDORA_VERSION ("7.0NG.776 Build 240320")
#define PANDORA_VERSION ("7.0NG.776 Build 240321")
string pandora_path;
string pandora_dir;

View File

@ -11,7 +11,7 @@ BEGIN
VALUE "LegalCopyright", "Pandora FMS"
VALUE "OriginalFilename", "PandoraAgent.exe"
VALUE "ProductName", "Pandora FMS Windows Agent"
VALUE "ProductVersion", "(7.0NG.776(Build 240320))"
VALUE "ProductVersion", "(7.0NG.776(Build 240321))"
VALUE "FileVersion", "1.0.0.0"
END
END

View File

@ -1,5 +1,5 @@
package: pandorafms-console
Version: 7.0NG.776-240320
Version: 7.0NG.776-240321
Architecture: all
Priority: optional
Section: admin

View File

@ -14,7 +14,7 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
pandora_version="7.0NG.776-240320"
pandora_version="7.0NG.776-240321"
package_pear=0
package_pandora=1

View File

@ -299,7 +299,7 @@ function agents_modules_load_js()
*
* @return void
*/
function mainAgentsModules()
function mainAgentsModules($params=[], $post_data=[])
{
global $config;
@ -352,29 +352,39 @@ function mainAgentsModules()
$updated_time = $updated_info;
$modulegroup = get_parameter('modulegroup', 0);
$refr = (int) get_parameter('refresh', 0);
// By default 30 seconds.
$recursion = get_parameter('recursion', 0);
if ($post_data === []) {
$show_type = (int) get_parameter('show_type', 0);
$group_id = (int) get_parameter('group_id', 0);
$offset = (int) get_parameter('offset', 0);
$hor_offset = (int) get_parameter('hor_offset', 0);
$block = $config['block_size'];
if (intval($block) > 15) {
$block = '15';
}
$recursion = get_parameter('recursion', 0);
$modulegroup = get_parameter('modulegroup', 0);
if (get_parameter('modulegroup') != null) {
$agents_id = (array) get_parameter('id_agents2', null);
}
$selection_a_m = (int) get_parameter('selection_agent_module');
$modules_selected = (array) get_parameter('module', 0);
} else {
$show_type = (int) ($post_data['show_type'] ?? 0);
$group_id = (int) ($post_data['group_id'] ?? 0);
$recursion = ($post_data['recursion'] ?? 0);
$modulegroup = ($post_data['modulegroup'] ?? 0);
if ($modulegroup !== 0) {
$agents_id = (array) ($post_data['id_agents2'] ?? []);
}
$selection_a_m = ($post_data['selection_agent_module'] ?? '');
$modules_selected = ($post_data['module'] ?? []);
}
$refr = (int) get_parameter('refresh', 0);
// By default 30 seconds.
$offset = (int) get_parameter('offset', 0);
$hor_offset = (int) get_parameter('hor_offset', 0);
$block = (string) ($params['block_size'] ?? $hor_offset);
$update_item = (string) get_parameter('edit_item', '');
$save_serialize = (int) get_parameter('save_serialize', 0);
$full_modules_selected = explode(';', get_parameter('full_modules_selected', 0));
$full_agents_id = explode(';', get_parameter('full_agents_id', 0));
$show_type = (int) get_parameter('show_type', 0);
// In full screen there is no pagination neither filters.
if (( ($config['pure'] == 0 && $save_serialize) && $update_item == '' ) || ( ($config['pure'] == 1 && $save_serialize == 0) && $update_item == '' )) {
@ -572,6 +582,7 @@ function mainAgentsModules()
*/
if ($config['pure'] == 0) {
include_once 'include/class/HTML.class.php';
// Header.
ui_print_standard_header(
__('Agents/Modules'),
@ -895,7 +906,9 @@ function mainAgentsModules()
return;
}
echo '<table cellpadding="4" cellspacing="4" border="0" class="info_table mrgn_btn_20px" id="agents_modules_table">';
echo '<div id="div-agents-modules-table">';
echo '<div id="agents-modules-spinner" class="spinner-fixed"><span></span><span></span><span></span><span></span></div>';
echo '<table cellpadding="4" cellspacing="4" border="0" class="info_table mrgn_btn_20px invisible" id="agents_modules_table">';
echo '<tr>';
@ -1084,6 +1097,7 @@ function mainAgentsModules()
}
echo '</table>';
echo '</div>';
if ($show_type === 0) {
$show_legend = "<div class='legend_white'>";
@ -1114,4 +1128,66 @@ function mainAgentsModules()
extensions_add_operation_menu_option(__('Agents/Modules view'), 'estado', 'agents_modules/icon_menu.png', 'v1r1', 'view');
$pure = (int) get_parameter('pure', 0);
$hor_offset = (int) get_parameter('hor_offset', 0);
$offset = (int) get_parameter('offset', 0);
$sec2 = get_parameter('sec2');
if ($pure !== 0) {
extensions_add_main_function('mainAgentsModules');
if ($sec2 === 'extensions/agents_modules') {
echo '<script>
$(document).ready(function () {
$("#agents-modules-spinner").hide();
$("#agents_modules_table").show();
});
</script>';
}
}
if ($pure === 0) {
if (is_ajax()) {
$params = [];
$post_data = get_parameter('post_data', []);
$items_offset = get_parameter('items_offset', 15);
$params['block_size'] = $items_offset;
$params['offset'] = $offset;
$params['hor_offset'] = $hor_offset;
mainAgentsModules($params, $post_data);
return;
}
if ($sec2 === 'extensions/agents_modules') {
echo '<script>
$(document).ready(function () {
// Calc items per page.
const mainWidth = $("#page #main").width();
const itemsOffset = Math.floor((mainWidth - 240) / 46);
$.ajax({
url: "ajax.php",
data: {
page: "extensions/agents_modules",
post_data: '.json_encode($_POST).',
items_offset: itemsOffset,
offset: '.$offset.',
hor_offset: '.$hor_offset.',
},
dataType: "html",
success: function (data) {
$("#page > #main").html(data);
$("#agents-modules-spinner").hide();
$("#agents_modules_table").show();
menuActionButtonResizing();
},
error: function (error) {
console.error(error);
}
});
});
</script>';
}
}

View File

@ -1738,3 +1738,12 @@ extensions/files_repo/sql/files_repo.sql
extensions/files_repo
extensions/resource_exportation.php
extensions/resource_registration.php
enterprise/include/class/Aws.cloud.php
enterprise/include/class/Azure.cloud.php
enterprise/include/class/DB2.app.php
enterprise/include/class/Google.cloud.php
enterprise/include/class/MicrosoftSQLServer.app.php
enterprise/include/class/MySQL.app.php
enterprise/include/class/Oracle.app.php
enterprise/include/class/SAP.app.php
enterprise/include/class/VMware.app.php

View File

@ -1,5 +1,5 @@
pandorafms.vmware=a272ee00a9b5f201bb708bef72bbe276
pandorafms.mysql=fadb4750d18285c0eca34f47c6aa3cfe
pandorafms.mysql=33d470c7492214d4b384ed307e81adf4
pandorafms.vmware=1deafce1d55d3574645d8b136104e9ad
pandorafms.mysql=ca7dd8b80a1a03a25eb0fb077818ad63
pandorafms.mssql=1cc215409741d19080269ffba112810e

View File

@ -125,7 +125,7 @@ UPDATE `tncm_agent_data_template` SET `vendors` = CONCAT('["', TRIM(BOTH '"' FRO
-- Update version for plugin oracle
UPDATE `tdiscovery_apps` SET `version` = '1.2' WHERE `short_name` = 'pandorafms.oracle';
-- Update version for plugin mysql
UPDATE `tdiscovery_apps` SET `version` = '1.1' WHERE `short_name` = 'pandorafms.mysql';
UPDATE `tdiscovery_apps` SET `version` = '1.2' WHERE `short_name` = 'pandorafms.mysql';
SET @widget_id = NULL;

File diff suppressed because one or more lines are too long

View File

@ -81,16 +81,6 @@ if ((bool) check_acl($config['id_user'], 0, 'AR') === true
if ((bool) check_acl($config['id_user'], 0, 'AW') === true) {
// Applications.
$sub2 = [];
// Check if app has been migrated.
if (enterprise_installed() === true) {
(ManageExtensions::isMigrated('pandorafms.mssql') === true) ?: ($sub2['godmode/servers/discovery&wiz=app&mode=MicrosoftSQLServer']['text'] = __('Microsoft SQL Server (legacy)'));
(ManageExtensions::isMigrated('pandorafms.mysql') === true) ?: ($sub2['godmode/servers/discovery&wiz=app&mode=mysql']['text'] = __('Mysql (legacy)'));
(ManageExtensions::isMigrated('pandorafms.oracle') === true) ?: ($sub2['godmode/servers/discovery&wiz=app&mode=oracle']['text'] = __('Oracle (legacy)'));
(ManageExtensions::isMigrated('pandorafms.vmware') === true) ?: ($sub2['godmode/servers/discovery&wiz=app&mode=vmware']['text'] = __('VMware (legacy)'));
(ManageExtensions::isMigrated('pandorafms.sap.desert') === true) ?: ($sub2['godmode/servers/discovery&wiz=app&mode=SAP']['text'] = __('SAP (legacy)'));
(ManageExtensions::isMigrated('pandorafms.db2') === true) ?: ($sub2['godmode/servers/discovery&wiz=app&mode=DB2']['text'] = __('DB2 (legacy)'));
}
$extensions = ManageExtensions::getExtensionBySection('app');
if ($extensions !== false) {
foreach ($extensions as $key => $extension) {
@ -112,13 +102,6 @@ if ((bool) check_acl($config['id_user'], 0, 'AR') === true
// Cloud.
$sub2 = [];
if (enterprise_installed() === true) {
(ManageExtensions::isMigrated('pandorafms.aws.ec2') === true) ?: (ManageExtensions::isMigrated('pandorafms.aws.s3') === true) ?: (ManageExtensions::isMigrated('pandorafms.aws.rds') === true) ?: ($sub2['godmode/servers/discovery&wiz=cloud&mode=amazonws']['text'] = __('Amazon Web Services (legacy)'));
(ManageExtensions::isMigrated('pandorafms.azure.mc') === true) ?: ($sub2['godmode/servers/discovery&wiz=cloud&mode=azure']['text'] = __('Microsoft Azure (legacy)'));
(ManageExtensions::isMigrated('pandorafms.azure.gcp.ce') === true) ?: ($sub2['godmode/servers/discovery&wiz=cloud&mode=gcp']['text'] = __('Google Compute Platform (legacy)'));
}
$extensions = ManageExtensions::getExtensionBySection('cloud');
if ($extensions !== false) {
foreach ($extensions as $key => $extension) {

View File

@ -632,7 +632,7 @@ if (empty($create) === false || empty($view) === false) {
$datam[1] = html_print_label_input_block(
__('Default value').'<span class="normal_weight">('.$macro_name.')</span>',
html_print_input_text_extended($macro_value_name, $macro_value_value, 'text-'.$macro_value_name, '', 30, 255, false, '', "class='command_component command_macro text_input'", true)
html_print_input_text_extended($macro_value_name, io_safe_input($macro_value_value), 'text-'.$macro_value_name, '', 30, 255, false, '', "class='command_component command_macro text_input'", true)
);
$table->data['plugin_'.$next_name_number] = $datam;

View File

@ -82,9 +82,6 @@ class Applications extends Wizard
'index.php?sec=gservers&sec2=godmode/servers/discovery&wiz=app'
);
// Print Warning Message.
$this->printWarningMessage();
return $this;
}
@ -108,90 +105,14 @@ class Applications extends Wizard
);
$mode = get_parameter('mode', null);
// Load application wizards.
$enterprise_classes = glob(
$config['homedir'].'/'.ENTERPRISE_DIR.'/include/class/*.app.php'
);
$extensions = new ExtensionsDiscovery('app', $mode);
foreach ($enterprise_classes as $classpath) {
enterprise_include_once(
'include/class/'.basename($classpath)
);
}
switch ($mode) {
case 'DB2':
$classname_selected = 'DB2';
break;
case 'SAP':
$classname_selected = 'SAP';
break;
case 'vmware':
$classname_selected = 'VMware';
break;
case 'mysql':
$classname_selected = 'MySQL';
break;
case 'oracle':
$classname_selected = 'Oracle';
break;
case 'MicrosoftSQLServer':
$classname_selected = 'MicrosoftSQLServer';
break;
default:
$classname_selected = null;
break;
}
// Else: class not found pseudo exception.
if ($classname_selected !== null) {
$wiz = new $classname_selected($this->page);
// Check if app has been migrated.
if (method_exists($wiz, 'isMigrated') === true) {
if ($wiz->isMigrated() === true) {
ui_print_info_message(__('This legacy app has been migrated to new discovery 2.0 system'));
return false;
}
}
$result = $wiz->run();
if (is_array($result) === true) {
return $result;
}
}
if ($classname_selected === null) {
if ($mode !== null) {
// Load extension if exist.
$extensions->run();
return;
}
// Load classes and print selector.
$wiz_data = [];
foreach ($enterprise_classes as $classpath) {
$classname = basename($classpath, '.app.php');
$obj = new $classname();
if (method_exists($obj, 'isMigrated') === true) {
if ($obj->isMigrated() === true) {
continue;
}
}
$wiz_data[] = $obj->load();
}
$wiz_data = array_merge($wiz_data, $extensions->loadExtensions());
$this->prepareBreadcrum(
[
[
@ -225,7 +146,7 @@ class Applications extends Wizard
$this->printHeader(true)
);
Wizard::printBigButtonsList($wiz_data);
Wizard::printBigButtonsList($extensions->loadExtensions());
$not_defined_extensions = $extensions->loadExtensions(true);
@ -249,7 +170,6 @@ class Applications extends Wizard
echo $output;
echo '<div class="app_mssg"><i>*'.__('All company names used here are for identification purposes only. Use of these names, logos, and brands does not imply endorsement.').'</i></div>';
}
return $result;
}

View File

@ -114,8 +114,6 @@ class Cloud extends Wizard
*/
public function run()
{
global $config;
// Load styles.
parent::run();
@ -127,54 +125,8 @@ class Cloud extends Wizard
$mode = get_parameter('mode', null);
// Load cloud wizards.
$enterprise_classes = glob(
$config['homedir'].'/'.ENTERPRISE_DIR.'/include/class/*.cloud.php'
);
$extensions = new ExtensionsDiscovery('cloud', $mode);
foreach ($enterprise_classes as $classpath) {
enterprise_include_once(
'include/class/'.basename($classpath)
);
}
switch ($mode) {
case 'amazonws':
$classname_selected = 'Aws';
break;
case 'azure':
$classname_selected = 'Azure';
break;
case 'gcp':
$classname_selected = 'Google';
break;
default:
$classname_selected = null;
break;
}
// Else: class not found pseudo exception.
if ($classname_selected !== null) {
$wiz = new $classname_selected($this->page);
// Check if app has been migrated.
if (method_exists($wiz, 'isMigrated') === true) {
if ($wiz->isMigrated() === true) {
ui_print_info_message(__('This legacy app has been migrated to new discovery 2.0 system'));
return false;
}
}
$result = $wiz->run();
if (is_array($result) === true) {
return $result;
}
}
if ($classname_selected === null) {
if ($mode !== null) {
// Load extension if exist.
$extensions->run();
@ -182,22 +134,6 @@ class Cloud extends Wizard
}
// Load classes and print selector.
$wiz_data = [];
foreach ($enterprise_classes as $classpath) {
$classname = basename($classpath, '.cloud.php');
$obj = new $classname();
// Check if legacy has been migrated.
if (method_exists($obj, 'isMigrated') === true) {
if ($obj->isMigrated() === true) {
continue;
}
}
$wiz_data[] = $obj->load();
}
$wiz_data = array_merge($wiz_data, $extensions->loadExtensions());
$this->prepareBreadcrum(
[
[
@ -230,7 +166,7 @@ class Cloud extends Wizard
$this->printHeader(true)
);
Wizard::printBigButtonsList($wiz_data);
Wizard::printBigButtonsList($extensions->loadExtensions());
$not_defined_extensions = $extensions->loadExtensions(true);
@ -256,12 +192,6 @@ class Cloud extends Wizard
echo '<div class="app_mssg"><i>*'.__('All company names used here are for identification purposes only. Use of these names, logos, and brands does not imply endorsement.').'</i></div>';
}
// Print Warning Message.
$this->printWarningMessage();
return $result;
}
/**
* Run credentials wizard.

View File

@ -242,10 +242,6 @@ class DiscoveryTaskList extends HTML
html_print_action_buttons($this->printForm($form, true));
}
// Warning Message.
$wizar_main = new Wizard();
$wizar_main->printWarningMessage();
return $ret;
}

View File

@ -767,24 +767,6 @@ class ManageExtensions extends HTML
],
);
}
$migrationHash = $this->canMigrate($row['short_name']);
if ($migrationHash !== false && empty($migrationHash) !== true) {
// Migrate button.
$data[$key]['actions'] .= html_print_input_image(
'button_migrate-'.$row['short_name'],
'images/reset.png',
'',
'',
true,
[
'onclick' => 'show_migration_form(\''.$row['short_name'].'\',\''.$migrationHash.'\')',
'title' => __('Migrate old discovery tasks.'),
'alt' => __('Migrate old discovery tasks.'),
'class' => 'main_menu_icon invert_filter',
]
);
}
}
if (empty($data) === true) {
@ -1123,386 +1105,6 @@ class ManageExtensions extends HTML
}
/**
* Checks if the discovery app can be migrated to .disco system.
* If app is migrated or is not in .ini file, it cannot be migrated.
*
* @param string $shortName Short name of the discovery app.
*
* @return string App hash, false in case hash doesnt exist on ini file, or is already migraeted..
*/
private function canMigrate(string $shortName='')
{
global $config;
if (empty($shortName) === true) {
return false;
}
// 1. Check if app is already migrated:
// Get migrated Discovery Apps from config.
$migratedAppsJson = db_get_value('value', 'tconfig', 'token', 'migrated_discovery_apps');
if ($migratedAppsJson === false || empty($migratedAppsJson) === true) {
return false;
}
// Decode JSON migrated apps.
$migrateApps = json_decode(io_safe_output($migratedAppsJson), true);
if (json_last_error() !== JSON_ERROR_NONE) {
return false;
}
// Check app migrated.
if (array_key_exists($shortName, $migrateApps)) {
if (empty($migrateApps[$shortName]) === false && (bool) $migrateApps[$shortName] === true) {
// Already migrated.
return false;
}
}
// 2. If app not migrated yet, check DiscoveryApplicationsMigrateCodes.ini
// Path to the INI file
$filePath = $config['homedir'].'/extras/discovery/DiscoveryApplicationsMigrateCodes.ini';
// Parse the INI file.
$migrationCodes = parse_ini_file($filePath, true);
if ($migrationCodes === false) {
return false;
}
// Check shortname in ini file.
if (array_key_exists($shortName, $migrationCodes) === false) {
return false;
} else {
return $migrationCodes[$shortName];
}
// All checks ok, discovery app can be migrated.
return false;
}
/**
* Prints html for migrate modal
*
* @return void
*/
public function loadMigrateModal()
{
$shortname = get_parameter('shortname', null);
$hash = get_parameter('hash', null);
$form = [
'action' => '#',
'id' => 'modal_migrate_form',
'onsubmit' => 'return false;',
'class' => 'modal',
'name' => 'migrate_form',
];
$inputs = [];
$migrateMessage = __(
'All legacy tasks for this application will be migrated to the new .disco package system. All configurations and executions will be managed with the new system. This process will not be reversible.</br></br>'
);
$migrateMessage .= _('Please check the migration code for the application before proceeding.');
$inputs[] = [
'wrapper' => 'div',
'block_id' => 'div_migrate_message',
'class' => 'hole flex-row flex-items-center w98p',
'direct' => 1,
'block_content' => [
[
'label' => $migrateMessage,
'arguments' => [
'class' => 'first_lbl w98p',
'name' => 'lbl_migrate_message',
'id' => 'lbl_migrate_message',
],
],
],
];
$inputs[] = [
'label' => __('Applicattion hash'),
'id' => 'div-hash',
'arguments' => [
'name' => 'hash',
'type' => 'text',
'value' => $hash,
'return' => true,
],
];
$inputs[] = [
'block_id' => 'migrate_buttons',
'class' => 'flex-row flex-items-center w98p',
'direct' => 1,
'block_content' => [
[
'arguments' => [
'name' => 'cancel',
'label' => __('Cancel'),
'type' => 'button',
'attributes' => [
'icon' => 'left',
'mode' => 'secondary',
'class' => 'sub cancel float-left',
],
],
],
[
'arguments' => [
'name' => 'migrate',
'label' => __('Migrate'),
'type' => 'submit',
'attributes' => [
'icon' => 'wand',
'class' => 'sub wand float-right',
],
],
],
],
];
$spinner = '<div id="migration-spinner" class="invisible spinner-fixed"></div>';
$migration_form = $this->printForm(
[
'form' => $form,
'inputs' => $inputs,
],
true,
);
echo $migration_form.$spinner;
}
/**
* Migrate app to new .disco system
*
* @return true if success, false in case of error.
*/
public function migrateApp()
{
global $config;
$hash = get_parameter('hash', false);
$shortName = get_parameter('shortName', false);
if ($hash === false || $shortName === false) {
return false;
}
// 1. Gets md5
try {
$console_md5 = $this->calculateDirectoryMD5($shortName, false);
$server_md5 = $this->calculateDirectoryMD5($shortName, true);
} catch (Exception $e) {
$return = [
'error' => $e->getMessage(),
];
echo json_encode($return);
return;
}
if ($console_md5 === false || $server_md5 === false) {
$return = [
'error' => __('Error calculating app MD5'),
];
echo json_encode($return);
return;
}
// 2. Checks MD5
if ($hash === $console_md5 && $hash === $server_md5) {
// Init migration script.
$return = $this->executeMigrationScript($shortName);
} else {
$return = [
'error' => __('App hash does not match.'),
];
}
// Add shotrname to return for showing messages.
$return['shortname'] = $shortName;
echo \json_encode($return);
}
/**
* Calculates directory MD% and saves it into array
*
* @param string $shortName Shorname of app.
* @param boolean $server If true, perform checks into server folder.
*
* @return $md5 Array of md5 of filess.
*/
private function calculateDirectoryMD5($shortName, $server)
{
global $config;
$md5List = [];
$serverPath = $config['remote_config'].'/discovery/'.$shortName;
$consolePath = $config['homedir'].'/'.$this->path.'/'.$shortName;
if ($server === true) {
$directory = $serverPath;
} else {
$directory = $consolePath;
}
$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory));
foreach ($iterator as $file) {
if ($file->isFile()) {
$md5List[] = md5_file($file->getPathname());
}
}
if ($server === true) {
$console_ini = $consolePath.'/discovery_definition.ini';
$logo = $consolePath.'/logo.png';
if (file_exists($console_ini)) {
$md5List[] = md5_file($console_ini);
}
if (file_exists($logo)) {
$md5List[] = md5_file($logo);
}
}
sort($md5List);
$concatenatedChecksums = implode('', $md5List);
return md5($concatenatedChecksums);
}
/**
* Executed migration script for app
*
* @param string $shortName Shortname of the app.
*
* @return true on success, false in case of error.
*/
private function executeMigrationScript(string $shortName)
{
global $config;
$dblock = db_get_lock('migrate-working');
// Try to get a lock from DB.
if ($dblock !== 1) {
// Locked!
return false;
}
$scriptName = preg_replace('/^pandorafms\.(\w+\.?\w*)$/m', 'migrate.$1.sql', $shortName);
$script_path = $config['homedir'].'/extras/discovery/migration_scripts/'.$scriptName;
if (file_exists($script_path) === false) {
$return = [
'error' => __('Migration script '.$scriptName.' could not be found'),
];
} else {
try {
$res = db_process_file($script_path, false);
} catch (\Exception $e) {
$return = [
'error' => $e->getMessage(),
];
} finally {
db_release_lock('migrate_working');
}
if ($res === true) {
$migrateAppsJson = io_safe_output(
db_get_value(
'value',
'tconfig',
'token',
'migrated_discovery_apps'
)
);
$migrateApps = json_decode(
$migrateAppsJson,
true
);
$migrateApps[$shortName] = 1;
$migratedAppsJson = json_encode($migrateApps);
if (json_last_error() === JSON_ERROR_NONE) {
config_update_value(
'migrated_discovery_apps',
$migratedAppsJson
);
} else {
$return = [
'error' => __('Error decoding migrated apps json.'),
];
}
$return = [
'result' => __('App migrated successfully'),
'shortName' => $shortName,
];
} else {
$return = [
'error' => __('Error migrating app'),
];
}
}
return $return;
}
/**
* Check if legacy app has been migrated.
*
* @param string $shortName Shorn name of the app.
*
* @return boolean
*/
static public function isMigrated($shortName)
{
global $config;
$migrateAppsJson = io_safe_output(
db_get_value(
'value',
'tconfig',
'token',
'migrated_discovery_apps'
)
);
$migratedApps = json_decode($migrateAppsJson, true);
if (json_last_error() !== JSON_ERROR_NONE) {
return false;
}
if (array_key_exists($shortName, $migratedApps) === true && empty($migratedApps[$shortName] === false)) {
return (bool) $migratedApps[$shortName];
} else {
return false;
}
}
/**
* Read metadata CSV from system and store data structure in memory.
*

View File

@ -584,28 +584,4 @@ class Wizard
}
/**
* Generates warning message.
*
* @return void Warning message.
*/
public function printWarningMessage()
{
return ui_print_warning_message(
__(
'Starting with version 773, the new modular system of discovery 2.0 has been implemented. The current
discovery (1.0) and its defined tasks will continue to function normally until the next LTS version,
in which migration to the new system will be mandatory.
The tasks of the current discovery (1.0) will be marked as legacy although it will not affect their
operation, it will only be a visual indicator to identify and differentiate the tasks of discovery 1.0
from those of the new version 2.0.
In the intermediate versions between the 773 and the next LTS version, more applications of the new
discovery 2.0 will be added. Both new and those that will come to replace the applications of the
current discovery 1.0. In addition, an automatic migration tool for legacy (1.0) tasks to the new 2.0
model will be included.'
)
);
}
}

View File

@ -22,7 +22,7 @@ use DI\ContainerBuilder;
/*
* Pandora build version and version
*/
$build_version = 'PC240320';
$build_version = 'PC240321';
$pandora_version = 'v7.0NG.776';
// Do not overwrite default timezone set if defined.

View File

@ -4082,6 +4082,11 @@ div.div_groups_status {
border: 1px solid #e2e2e2;
}
#agents_modules_table th:nth-child(1),
#agents_modules_table td:nth-child(1) {
max-width: 215px;
}
.dashboard {
top: 23px;
}

View File

@ -131,7 +131,7 @@
<div style='padding-bottom: 50px'>
<?php
$version = '7.0NG.776';
$build = '240320';
$build = '240321';
$banner = "v$version Build $build";
error_reporting(0);

View File

@ -6,7 +6,7 @@
%define debug_package %{nil}
%define name pandorafms_console
%define version 7.0NG.776
%define release 240320
%define release 240321
# User and Group under which Apache is running
%define httpd_name httpd

View File

@ -6,7 +6,7 @@
%define debug_package %{nil}
%define name pandorafms_console
%define version 7.0NG.776
%define release 240320
%define release 240321
# User and Group under which Apache is running
%define httpd_name httpd

View File

@ -3,7 +3,7 @@
#
%define name pandorafms_console
%define version 7.0NG.776
%define release 240320
%define release 240321
%define httpd_name httpd
# User and Group under which Apache is running
%define httpd_name apache2

View File

@ -2885,7 +2885,7 @@ SET @short_name = 'pandorafms.mysql';
SET @name = 'MySQL';
SET @section = 'app';
SET @description = 'Monitor&#x20;MySQL&#x20;databases';
SET @version = '1.1';
SET @version = '1.2';
INSERT IGNORE INTO `tdiscovery_apps` (`id_app`, `short_name`, `name`, `section`, `description`, `version`) VALUES ('', @short_name, @name, @section, @description, @version);
SELECT @id_app := `id_app` FROM `tdiscovery_apps` WHERE `short_name` = @short_name;

View File

@ -1,5 +1,5 @@
package: pandorafms-server
Version: 7.0NG.776-240320
Version: 7.0NG.776-240321
Architecture: all
Priority: optional
Section: admin

View File

@ -14,7 +14,7 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
pandora_version="7.0NG.776-240320"
pandora_version="7.0NG.776-240321"
package_cpan=0
package_pandora=1

View File

@ -46,7 +46,7 @@ our @EXPORT = qw(
# version: Defines actual version of Pandora Server for this module only
my $pandora_version = "7.0NG.776";
my $pandora_build = "240320";
my $pandora_build = "240321";
our $VERSION = $pandora_version." ".$pandora_build;
# Setup hash

View File

@ -34,7 +34,7 @@ our @ISA = qw(Exporter);
# version: Defines actual version of Pandora Server for this module only
my $pandora_version = "7.0NG.776";
my $pandora_build = "240320";
my $pandora_build = "240321";
our $VERSION = $pandora_version." ".$pandora_build;
our %EXPORT_TAGS = ( 'all' => [ qw() ] );

View File

@ -7,7 +7,7 @@
%define debug_package %{nil}
%define name pandorafms_server
%define version 7.0NG.776
%define release 240320
%define release 240321
Summary: Pandora FMS Server
Name: %{name}

View File

@ -4,7 +4,7 @@
%global __os_install_post %{nil}
%define name pandorafms_server
%define version 7.0NG.776
%define release 240320
%define release 240321
Summary: Pandora FMS Server
Name: %{name}

View File

@ -9,7 +9,7 @@
# **********************************************************************
PI_VERSION="7.0NG.776"
PI_BUILD="240320"
PI_BUILD="240321"
MODE=$1
if [ $# -gt 1 ]; then

View File

@ -38,7 +38,7 @@ use PandoraFMS::Config;
use PandoraFMS::DB;
# version: define current version
my $version = "7.0NG.776 Build 240320";
my $version = "7.0NG.776 Build 240321";
# Pandora server configuration
my %conf;

View File

@ -36,7 +36,7 @@ use Encode::Locale;
Encode::Locale::decode_argv;
# version: define current version
my $version = "7.0NG.776 Build 240320";
my $version = "7.0NG.776 Build 240321";
# save program name for logging
my $progname = basename($0);