<?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();