pandorafms/pandora_console/godmode/um_client/index.php

430 lines
13 KiB
PHP

<?php
/**
* Update Manager Client.
*
* This is an atomic package, this file must be referenced from general product
* menu entries in order to give Update Manager Client work.
*
* DO NOT EDIT THIS FILE. ONLY SETTINGS SECTION.
*
* @category Class
* @package Update Manager
* @subpackage Client
* @version 1.0.0
* @license See below
*
* ______ ___ _______ _______ ________
* | __ \.-----.--.--.--| |.-----.----.-----. | ___| | | __|
* | __/| _ | | _ || _ | _| _ | | ___| |__ |
* |___| |___._|__|__|_____||_____|__| |___._| |___| |__|_|__|_______|
*
* ============================================================================
* Copyright (c) 2005-2023 Pandora FMS
* Please see https://pandorafms.com/community/ for full contribution list
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation for version 2.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* ============================================================================
*/
// Begin.
global $config;
global $pandora_version;
require_once $config['homedir'].'/vendor/autoload.php';
require_once $config['homedir'].'/include/functions_update_manager.php';
use PandoraFMS\Enterprise\Metaconsole\Synchronizer;
use UpdateManager\UI\Manager;
check_login();
if ((bool) check_acl($config['id_user'], 0, 'PM') !== true
&& (bool) is_user_admin($config['id_user']) !== true
) {
db_pandora_audit(
AUDIT_LOG_ACL_VIOLATION,
'Trying to access Setup Management'
);
include 'general/noaccess.php';
return;
}
$license = db_get_value(
db_escape_key_identifier('value'),
'tupdate_settings',
db_escape_key_identifier('key'),
'customer_key'
);
if (isset($config['lts_updates']) === false) {
$config['lts_updates'] = true;
}
if (empty($license) === true) {
$license = 'PANDORA-FREE';
}
$mode_str = '';
if (isset($mode) === false) {
$mode = null;
}
if ($mode === Manager::MODE_ONLINE) {
$mode_str = 'online';
} else if ($mode === Manager::MODE_OFFLINE) {
$mode_str = 'offline';
}
enterprise_include_once('/include/functions_license.php');
$license_data = enterprise_hook('license_get_info');
if ($license_data !== ENTERPRISE_NOT_HOOK) {
$days_to_expiry = ((strtotime($license_data['expiry_date']) - time()) / (60 * 60 * 24));
if ((int) $license_data['limit_mode'] === 0) {
$agent_table = (is_metaconsole() === true) ? 'tmetaconsole_agent' : 'tagente';
$limit = db_get_value('count(*)', $agent_table, 'disabled', 0);
} else {
$limit = db_get_value('count(*)', 'tagente_modulo', 'disabled', 0);
}
if ($limit > $license_data['limit']) {
ui_print_warning_message(
__(
'You cannot use update manager %s. You are exceding monitoring limits by %s elements. Please update your license or disable enterprise section by moving enterprise directory to another location and try again.',
$mode_str,
($limit - $license_data['limit'])
)
);
return;
}
if ($days_to_expiry < 0) {
ui_print_warning_message(
__(
'You cannot use update manager %s. This license has expired %d days ago. Please update your license or disable enterprise section by moving enterprise directory to another location and try again.',
$mode_str,
abs($days_to_expiry)
)
);
return;
}
if (rtrim($license_data['licensed_to']) === Manager::PANDORA_TRIAL_ISSUER) {
$product_name = get_product_name();
ui_print_info_message(
__(
'You cannot use update manager %s. This license is a trial license to test all %s features. Please update your license to unlock all %s features.',
$mode_str,
$product_name,
$product_name
)
);
return;
}
} else {
$license_data = [];
$license_data['count_enabled'] = db_get_value(
'count(*)',
'tagente',
'disabled',
0
);
}
// Set dbh.
$dbh = (object) $config['dbconnection'];
// Retrieve current definition.
if ($dbh !== null) {
$stm = $dbh->query(
'SELECT `value` FROM `tconfig`
WHERE `token`="current_package"'
);
if ($stm !== false) {
$current_package = $stm->fetch_array();
if ($current_package !== null) {
$current_package = $current_package[0];
}
}
if (empty($current_package) === true) {
// If no current_package is present, use current_package_enterprise.
$stm = $dbh->query(
'SELECT MAX(`value`) FROM `tconfig`
WHERE `token`="current_package_enterprise"'
);
if ($stm !== false) {
$current_package = $stm->fetch_array();
if ($current_package !== null) {
$current_package = $current_package[0];
}
}
}
$mr = 0;
$stm = $dbh->query(
'SELECT MAX(`value`) FROM `tconfig`
WHERE `token`="MR" OR `token`="minor_release"'
);
if ($stm !== false) {
$mr = $stm->fetch_array();
if ($mr !== null) {
$mr = $mr[0];
}
}
$puid = null;
$stm = $dbh->query(
'SELECT `value` FROM `tconfig`
WHERE `token`="pandora_uid"'
);
if ($stm !== false) {
$puid = $stm->fetch_array();
if ($puid !== null) {
$puid = $puid[0];
}
}
} else {
$current_package = 0;
$mr = 0;
$puid = null;
}
if (is_ajax() !== true) {
?>
<script type="text/javascript">
var clientMode = '<?php echo $mode; ?>';
</script>
<?php
if (function_exists('db_get_value_sql') === true) {
$server_version = (string) db_get_value_sql(
'SELECT `version` FROM `tserver` ORDER BY `master` DESC'
);
if ($server_version !== false
&& preg_match('/NG\.(\d\.*\d*?) /', $server_version, $matches) > 0
) {
if ((float) $matches[1] !== floor((float) $current_package)) {
ui_print_warning_message(
__(
'Master server version %s does not match console version %s.',
(float) $matches[1],
$pandora_version
)
);
}
}
}
$PHPmemory_limit_min = config_return_in_bytes('800M');
$PHPmemory_limit = config_return_in_bytes(ini_get('memory_limit'));
if ($PHPmemory_limit < $PHPmemory_limit_min && $PHPmemory_limit !== -1) {
$msg = __(
'\'%s\' recommended value is %s or greater. Please, change it on your PHP configuration file (php.ini) or contact with administrator',
'memory_limit',
'800M'
);
ui_print_warning_message($msg);
}
}
// Load styles.
ui_require_css_file('pandora', '/vendor/articapfms/update_manager_client/resources/styles/');
if (isset($mode) === false) {
$mode = Manager::MODE_ONLINE;
if (function_exists('get_parameter') === true) {
$mode = (int) get_parameter('mode', null);
} else {
$mode = ($_REQUEST['mode'] ?? Manager::MODE_ONLINE);
}
}
if (is_int($mode) === false) {
switch ($mode) {
case 'offline':
$mode = Manager::MODE_OFFLINE;
break;
case 'register':
$mode = Manager::MODE_REGISTER;
break;
case 'online':
default:
$mode = Manager::MODE_ONLINE;
break;
}
}
$dbhHistory = null;
if (is_array($config) === true
&& (bool) $config['history_db_enabled'] === true
) {
ob_start();
$dbhHistory = db_connect(
$config['history_db_host'],
$config['history_db_name'],
$config['history_db_user'],
io_output_password($config['history_db_pass']),
$config['history_db_port']
);
ob_get_clean();
if ($dbhHistory === false) {
$dbhHistory = null;
}
}
$url_update_manager = null;
$homedir = sys_get_temp_dir();
$dbconnection = null;
$remote_config = null;
$insecure = false;
$pandora_url = ui_get_full_url('update_manager_client/', false, false, false);
if (is_array($config) === true) {
$allowOfflinePatches = false;
if (isset($config['allow_offline_patches']) === true) {
$allowOfflinePatches = (bool) $config['allow_offline_patches'];
}
if (isset($config['secure_update_manager']) === false) {
$config['secure_update_manager'] = null;
}
if ($config['secure_update_manager'] === ''
|| $config['secure_update_manager'] === null
) {
$insecure = false;
} else {
// Directive defined.
$insecure = !$config['secure_update_manager'];
}
if ((bool) is_ajax() === false) {
if ($mode === Manager::MODE_ONLINE
&& ($puid === null || $puid === 'OFFLINE')
) {
ui_print_error_message(__('Update online requires registration.'));
}
if ($mode === Manager::MODE_OFFLINE) {
ui_print_warning_message(
__('Applying offline patches may make your console unusable, we recommend to completely backup your files before applying any patch.')
);
}
}
$url_update_manager = $config['url_update_manager'];
$homedir = $config['homedir'];
$dbconnection = $config['dbconnection'];
$remote_config = $config['remote_config'];
if (is_metaconsole() === false) {
// Node.
if ((bool) $config['node_metaconsole'] === true) {
$url_update_manager = $config['metaconsole_base_url'];
$url_update_manager .= 'godmode/um_client/api.php';
}
} else {
// MC.
$sc = new Synchronizer();
$url_meta_base = ui_get_full_url('/', false, false, false);
$sc->apply(
function ($node, $sync) use ($url_meta_base) {
try {
global $config;
$sync->connect($node);
$config['metaconsole_base_url'] = db_get_value(
'value',
'tconfig',
'token',
'metaconsole_base_url'
);
if ($config['metaconsole_base_url'] === false) {
// Unset to create new value if does not exist previously.
$config['metaconsole_base_url'] = null;
}
config_update_value(
'metaconsole_base_url',
$url_meta_base
);
$sync->disconnect();
} catch (Exception $e) {
ui_print_error_message(
'Cannot update node settings: ',
$e->getMessage()
);
}
}
);
}
}
$proxy = null;
if (empty($config['update_manager_proxy_server']) === false
|| empty($config['update_manager_proxy_port']) === false
|| empty($config['update_manager_proxy_user']) === false
|| empty($config['update_manager_proxy_password']) === false
) {
$proxy = [
'host' => $config['update_manager_proxy_server'],
'port' => $config['update_manager_proxy_port'],
'user' => $config['update_manager_proxy_user'],
'password' => $config['update_manager_proxy_password'],
];
}
$ui = new Manager(
$pandora_url,
ui_get_full_url('ajax.php'),
'godmode/um_client/index',
[
'lts' => (bool) $config['lts_updates'],
'url' => $url_update_manager,
'insecure' => $insecure,
'license' => $license,
'limit_count' => ((is_array($license_data) === true) ? $license_data['count_enabled'] : null),
'language' => $config['language'],
'timezone' => $config['timezone'],
'homedir' => $homedir,
'dbconnection' => $dbconnection,
'historydb' => $dbhHistory,
'current_package' => $current_package,
'MR' => $mr,
'registration_code' => $puid,
'remote_config' => $remote_config,
'propagate_updates' => is_metaconsole(),
'proxy' => $proxy,
'allowOfflinePatches' => $allowOfflinePatches,
'set_maintenance_mode' => function () {
config_update_value('maintenance_mode', 1);
},
'clear_maintenance_mode' => function () {
config_update_value('maintenance_mode', 0);
},
'on_update' => function ($version, $type) use ($mode) {
register_upgrade($version, $type, $mode);
},
],
$mode
);
$ui->run();