<?php /** * Welcome to Pandora FMS feature. * * @category Class * @package Pandora FMS * @subpackage New Installation Welcome Window * @version 1.0.0 * @license See below * * ______ ___ _______ _______ ________ * | __ \.-----.--.--.--| |.-----.----.-----. | ___| | | __| * | __/| _ | | _ || _ | _| _ | | ___| |__ | * |___| |___._|__|__|_____||_____|__| |___._| |___| |__|_|__|_______| * * ============================================================================ * Copyright (c) 2005-2022 Artica Soluciones Tecnologicas * Please see http://pandorafms.org 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; require_once $config['homedir'].'/godmode/wizards/Wizard.main.php'; /** * Class WelcomeWindow. */ class WelcomeWindow extends Wizard { /** * Allowed methods to be called using AJAX request. * * @var array */ public $AJAXMethods = [ 'loadWelcomeWindow', 'cancelWelcome', ]; /** * Tasks. * * @var array */ private $tasks = [ 'welcome_mail_configured', 'welcome_id_agent', 'welcome_module', 'welcome_alert', 'welcome_task', ]; /** * Url of controller. * * @var string */ public $ajaxController; /** * Current step. * * @var integer */ public $step; /** * Current agent (created example). * * @var integer */ public $agent; /** * Generates a JSON error. * * @param string $msg Error message. * * @return void */ public function error($msg) { echo json_encode( ['error' => $msg] ); } /** * Checks if target method is available to be called using AJAX. * * @param string $method Target method. * * @return boolean True allowed, false not. */ public function ajaxMethod($method) { global $config; // Check access. check_login(); return in_array($method, $this->AJAXMethods); } /** * Constructor. * * @param boolean $must_run Must run or not. * @param string $ajax_controller Controller. * * @return object * @throws Exception On error. */ public function __construct( bool $must_run=false, $ajax_controller='include/ajax/welcome_window' ) { $this->ajaxController = $ajax_controller; if ($this->initialize($must_run) !== true) { throw new Exception('Must not be shown'); } return $this; } /** * Main method. * * @return void */ public function run() { ui_require_css_file('new_installation_welcome_window'); echo '<div id="welcome_modal_window" class="invisible"; >'; ?> <script type="text/javascript"> load_modal({ target: $('#welcome_modal_window'), url: '<?php echo ui_get_full_url('ajax.php', false, false, false); ?>', modal: { title: "<?php echo __('Welcome to').' '.io_safe_output(get_product_name()); ?>", cancel: '<?php echo __('Do not show anymore'); ?>', ok: '<?php echo __('Close'); ?>' }, onshow: { page: '<?php echo $this->ajaxController; ?>', method: 'loadWelcomeWindow', }, oncancel: { page: '<?php echo $this->ajaxController; ?>', title: "<?php echo __('Cancel Configuration Window'); ?>", method: 'cancelWelcome', confirm: function (fn) { confirmDialog({ title: '<?php echo __('Are you sure?'); ?>', message: '<?php echo __('Are you sure you want to cancel this tutorial?'); ?>', ok: '<?php echo __('OK'); ?>', cancel: '<?php echo __('Cancel'); ?>', onAccept: function() { // Continue execution. fn(); } }) } } }); </script> <?php echo '</div>'; } /** * Method to cancel welcome modal window. * * @return void */ public function cancelWelcome() { // Config update value. $this->setStep(WELCOME_FINISHED); } /** * Return current step. * * @return integer Step. */ public function getStep(): int { global $config; $this->step = $config['welcome_state']; // Get step available. if (empty($config['welcome_mail_configured']) === true && get_parameter('sec2') == 'godmode/setup/setup' && get_parameter('section', '') == 'general' && get_parameter('update_config', false) !== false ) { $this->step = W_CONFIGURE_MAIL; } else if (empty($config['welcome_id_agent']) === true) { $this->step = W_CREATE_AGENT; } else if (empty($config['welcome_module']) === true) { $this->step = W_CREATE_MODULE; } else if (empty($config['welcome_alert']) === true) { $this->step = W_CREATE_ALERT; } else if (empty($config['welcome_task']) === true) { $this->step = W_CREATE_TASK; } return $this->step; } /** * Sets current step. * * @param integer $step Current step. * * @return void */ public function setStep(int $step) { $this->step = $step; config_update_value('welcome_state', $step); } /** * Completes current step. * * @return void */ public function completeStep() { switch ($this->step) { case W_CONFIGURE_MAIL: config_update_value('welcome_mail_configured', true); break; case W_CREATE_AGENT: config_update_value('welcome_id_agent', true); break; case W_CREATE_MODULE: config_update_value('welcome_module', true); break; case W_CREATE_ALERT: config_update_value('welcome_alert', true); break; case W_CREATE_TASK: config_update_value('welcome_task', true); break; default: // Ignore. break; } } /** * Check if all tasks had been completed. * * @return boolean All completed or not. */ public function checkAllTasks() { global $config; foreach ($this->tasks as $t) { if (empty($config[$t]) === true) { return false; } } return true; } /** * Retrieve current welcome agent id. * * @return integer Agent id (created). */ public function getWelcomeAgent() { global $config; return (isset($config['welcome_id_agent']) === true) ? $config['welcome_id_agent'] : ''; } /** * Saves current welcome agent (latest created). * * @param integer $id_agent Agent id. * * @return void */ public function setWelcomeAgent(int $id_agent) { config_update_value('welcome_id_agent', $id_agent); } /** * Loads a welcome window form * * @return​ ​string HTML code for form. * * @return void Runs loadWelcomeWindow (AJAX). */ public function loadWelcomeWindow() { global $config; $btn_configure_mail_class = 'pending'; $btn_create_agent_class = 'pending'; $btn_create_module_class = ''; $btn_create_alert_class = ''; $btn_create_discovery_class = 'pending'; $li_configure_mail_class = 'row_green'; $li_create_agent_class = 'row_green'; $li_create_module_class = 'row_grey'; $li_create_alert_class = 'row_grey'; $li_create_discovery_class = 'row_green'; if (empty($config['welcome_mail_configured']) === false) { $btn_configure_mail_class = ' completed'; } if (empty($config['welcome_id_agent']) === false) { $btn_create_agent_class = ' completed'; $btn_create_module_class = ' pending'; $li_create_module_class = 'row_green'; } if (empty($config['welcome_module']) === false) { $btn_create_module_class = ' completed'; $btn_create_alert_class = ' pending'; $li_create_module_class = 'row_green'; } if (empty($config['welcome_alert']) === false) { $btn_create_alert_class = ' completed'; $li_create_alert_class = 'row_green'; } if (empty($config['welcome_task']) === false) { $btn_create_discovery_class = ' completed'; } if ((int) $config['welcome_state'] === WELCOME_FINISHED) { // Nothing left to do. $btn_configure_mail_class = ' completed'; $btn_create_agent_class = ' completed'; $btn_create_module_class = ' completed'; $btn_create_alert_class = ' completed'; $btn_create_discovery_class = ' completed'; $li_create_module_class = 'row_green'; $li_create_alert_class = 'row_green'; } $form = [ 'action' => '#', 'id' => 'welcome_form', 'onsubmit' => 'this.dialog("close");', 'class' => 'modal', ]; $logo_url = 'images/custom_logo/pandora_logo_head_white_bg.png'; if (enterprise_installed() === true) { $logo_url = ENTERPRISE_DIR.'/'.$logo_url; } $inputs = [ [ 'class' => 'white_box', 'block_content' => [ [ 'class' => 'centered_full', 'arguments' => [ 'type' => 'image', 'src' => $logo_url, 'value' => 1, 'return' => true, ], ], ], ], [ 'wrapper' => 'div', 'block_id' => 'div_configure_mail', 'class' => 'hole flex-row flex-items-center w98p '.$li_configure_mail_class, 'direct' => 1, 'block_content' => [ [ 'label' => __('Please ensure mail configuration matches your needs'), 'arguments' => [ 'class' => 'first_lbl', 'name' => 'lbl_create_agent', 'id' => 'lbl_create_agent', ], ], [ 'arguments' => [ 'label' => '', 'type' => 'button', 'attributes' => [ 'class' => (empty($btn_configure_mail_class) === false) ? $btn_configure_mail_class : 'invisible_important', 'mode' => 'onlyIcon', ], 'name' => 'btn_email_conf', 'id' => 'btn_email_conf', ], ], ], ], [ 'label' => 'Learn to monitor', 'class' => 'extra', 'arguments' => [ 'class' => 'class="lbl_learn"', 'name' => 'lbl_learn', 'id' => 'lbl_learn', ], ], [ 'wrapper' => 'div', 'block_id' => 'div_create_agent', 'class' => 'learn_content_indented flex-row flex-items-center w98p '.$li_create_agent_class, 'direct' => 1, 'block_content' => [ [ 'label' => __('Create an agent'), 'arguments' => [ 'class' => 'first_lbl', 'name' => 'lbl_create_agent', 'id' => 'lbl_create_agent', ], ], [ 'arguments' => [ 'label' => '', 'type' => 'button', 'attributes' => [ 'class' => (empty($btn_create_agent_class) === false) ? $btn_create_agent_class : 'invisible_important', 'mode' => 'onlyIcon', ], 'name' => 'btn_create_agent', 'id' => 'btn_create_agent', ], ], ], ], [ 'wrapper' => 'div', 'block_id' => 'div_monitor_actions', 'class' => 'learn_content_indented flex-row flex-items-center w98p '.$li_create_module_class, 'direct' => 1, 'block_content' => [ [ 'label' => __('Create a module to check if an agent is online'), 'arguments' => [ 'class' => 'second_lbl', 'name' => 'lbl_check_agent', 'id' => 'lbl_check_agent', ], ], [ 'arguments' => [ 'label' => '', 'type' => 'button', 'attributes' => [ 'class' => (empty($btn_create_module_class) === false) ? $btn_create_module_class : 'invisible_important', 'mode' => 'onlyIcon', ], 'name' => 'btn_create_module', 'id' => 'btn_create_module', ], ], ], ], [ 'wrapper' => 'div', 'block_id' => 'div_monitor_actions', 'class' => 'hole learn_content_indented flex-row flex-items-center w98p '.$li_create_alert_class, 'direct' => 1, 'block_content' => [ [ 'label' => __('Be warned if something is wrong, create an alert on the module'), 'arguments' => [ 'class' => 'second_lbl', 'name' => 'lbl_create_alert', 'id' => 'lbl_create_alert', ], ], [ 'arguments' => [ 'label' => '', 'type' => 'button', 'attributes' => [ 'class' => (empty($btn_create_alert_class) === false) ? $btn_create_alert_class : 'invisible_important', 'mode' => 'onlyIcon', ], 'name' => 'btn_create_alert', 'id' => 'btn_create_alert', ], ], ], ], [ 'wrapper' => 'div', 'block_id' => 'div_discover', 'class' => 'hole flex-row flex-items-center w98p '.$li_create_discovery_class, 'direct' => 1, 'block_content' => [ [ 'label' => __('Discover hosts and devices in your network'), 'arguments' => [ 'class' => 'first_lbl', 'name' => 'lbl_discover_devices', 'id' => 'lbl_discover_devices', ], ], [ 'arguments' => [ 'label' => '', 'type' => 'button', 'attributes' => [ 'class' => (empty($btn_create_discovery_class) === false) ? $btn_create_discovery_class : 'invisible_important', 'mode' => 'onlyIcon', ], 'name' => 'btn_discover_devices', 'id' => 'btn_discover_devices', ], ], ], ], ]; if (enterprise_installed() === true) { $inputs[] = [ 'wrapper' => 'div', 'block_id' => 'div_not_working', 'class' => 'hole flex-row flex-items-center w98p', 'direct' => 1, 'block_content' => [ [ 'label' => __('If something is not working as expected, look for this icon and report!'), 'arguments' => [ 'class' => 'first_lbl', 'name' => 'lbl_not_working', 'id' => 'lbl_not_working', ], ], [ 'label' => html_print_image( 'images/feedback-header.png', true, [ 'onclick' => '$(\'#feedback-header\').click()', 'style' => 'cursor: pointer;', ] ), ], ], ]; } $output = $this->printForm( [ 'form' => $form, 'inputs' => $inputs, ], true ); $output .= $this->loadJS(); echo $output; // Ajax methods does not continue. exit(); } /** * This function acts as a constructor. Receive the condition to check with * the global config (welcome_state) if continues * * @param boolean $must_run Must be run or not (check register.php). * * @return boolean True if initialized or false if must not run. */ public function initialize($must_run) { global $config; if (isset($config['welcome_state']) === false) { $this->completeStep(); $this->setStep(W_CONFIGURE_MAIL); } // Check current page. $sec2 = get_parameter('sec2', ''); // Search also does not fulfill sec2. if (empty($sec2) === true) { $sec2 = get_parameter('keywords', ''); } if ($must_run === false || ((int) $config['welcome_state']) === WELCOME_FINISHED ) { // Do not show if finished. return false; } $this->step = $this->getStep(); $this->agent = $this->getWelcomeAgent(); /* * Configure mail. Control current flow. * * On empty sec2: show current step. * On setup page: do not show. * After mail configuration: enable agent step. */ if ($this->step === W_CONFIGURE_MAIL) { if ($sec2 === 'godmode/setup/setup' && get_parameter('section', '') == 'general' && get_parameter('update_config', false) !== false ) { // Mail configuration have been processed. $this->step = W_CONFIGURE_MAIL; $this->completeStep(); $this->setStep(W_CREATE_AGENT); } else if ($sec2 === 'godmode/setup/setup' && get_parameter('section', '') === 'general' ) { // Mail configuration is being processed. return false; } else if (empty($sec2) === true) { // Show main page. return true; } } /* * Create agent. Control current flow. * * Welcome wizard is shown if you create your first agent. * */ if (empty($config['welcome_id_agent']) === true) { // Create agent is pending. if ($sec2 === 'godmode/agentes/configurar_agente' && get_parameter('create_agent', false) !== false ) { // Agent have been created. Store. // Here complete step is not needed because is already done // by setWelcomeAgent. $this->setWelcomeAgent( // Non yet processed. Get next available ID. db_get_value_sql( sprintf( 'SELECT AUTO_INCREMENT FROM information_schema.TABLES WHERE TABLE_SCHEMA = "%s" AND TABLE_NAME = "%s"', $config['dbname'], 'tagente' ) ) ); $this->setStep(W_CREATE_MODULE); return true; } else if ($sec2 === 'godmode/agentes/configurar_agente') { // Agent is being created. return false; } else if (empty($sec2) === true) { // If at main page, show welcome. return true; } } else if ($this->step === W_CREATE_AGENT) { $this->step = W_CREATE_MODULE; } /* * Create module. Control current flow. * * On empty sec2: show current step. * On module creation page: do not show. * After module creation: enable alert step. */ if ($this->step === W_CREATE_MODULE) { // Create module is pending. if ($sec2 === 'godmode/agentes/configurar_agente' && get_parameter('tab', '') === 'module' && get_parameter('create_module', false) !== false ) { // Module have been created. $this->completeStep(); $this->setStep(W_CREATE_ALERT); return true; } else if ($sec2 === 'godmode/agentes/configurar_agente' && get_parameter('tab', '') === 'module' ) { // Module is being created. return false; } else if (empty($sec2) === true) { // If at main page, show welcome. return true; } } /* * Create alert. Control current flow. * * On empty sec2: show current step. * On alert creation page: do not show. * After alert creation: enable discovery task step. */ if ($this->step === W_CREATE_ALERT) { // Create alert is pending. if ($sec2 === 'godmode/agentes/configurar_agente' && get_parameter('tab', '') === 'alert' && get_parameter('create_alert', false) !== false ) { // Alert have been created. $this->completeStep(); $this->setStep(W_CREATE_TASK); return true; } else if ($sec2 === 'godmode/agentes/configurar_agente' && get_parameter('tab', '') === 'alert' ) { // Alert is being created. return false; } else if (empty($sec2) === true) { // If at main page, show welcome. return true; } } /* * Create discovery task. Control current flow. * * On empty sec2: show current step. * On discovery task creation page: do not show. * After discovery task creation: finish. */ // Create Discovery task is pending. // Host&Devices finishses on page 2. if ($sec2 === 'godmode/servers/discovery' && (int) get_parameter('page') === 2 ) { // Discovery task have been created. $this->step = W_CREATE_TASK; $this->completeStep(); // Check if all other tasks had been completed. if ($this->checkAllTasks() === true) { // Finished! do not show. $this->setStep(WELCOME_FINISHED); return false; } return true; } else if ($sec2 == 'godmode/servers/discovery') { // Discovery task is being created. return false; } // Check if all other tasks had been completed. if ($this->checkAllTasks() === true) { // Finished! do not show. $this->setStep(WELCOME_FINISHED); return false; } else if (empty($sec2) === true) { // Pending tasks. return true; } if ($this->step === WELCOME_FINISHED) { // Welcome tutorial finished. return false; } // Return a reference to the new object. return false; } /** * Load JS content. * function that enables the functions to the buttons when its action is * completed. * Assign the url of each button. * * @return string HTML code for javascript functionality. */ public function loadJS() { ob_start(); ?> <script type="text/javascript"> <?php if ($this->step > W_CREATE_AGENT) { switch ($this->step) { case W_CREATE_MODULE: ?> document.getElementById("button-btn_create_module").setAttribute( 'onclick', 'checkAgentOnline()' ); <?php break; case W_CREATE_ALERT: ?> document.getElementById("button-btn_create_alert").setAttribute( 'onclick', 'createAlertModule()' ); <?php break; default: // Ignore. break; } } ?> document.getElementById("button-btn_email_conf").setAttribute( 'onclick', 'configureEmail()' ); document.getElementById("button-btn_create_agent").setAttribute( 'onclick', 'createNewAgent()' ); document.getElementById("button-btn_discover_devices").setAttribute( 'onclick', 'discoverDevicesNetwork()' ); function configureEmail() { window.location = '<?php echo ui_get_full_url('index.php?sec=general&sec2=godmode/setup/setup§ion=general#table3'); ?>'; } function createNewAgent() { window.location = '<?php echo ui_get_full_url('index.php?sec=gagente&sec2=godmode/agentes/configurar_agente&new_agent=1&crt-2=Create+agent'); ?>'; } function checkAgentOnline() { window.location = '<?php echo ui_get_full_url('index.php?sec=gagente&sec2=godmode/agentes/configurar_agente&tab=module&id_agente='.$this->getWelcomeAgent().''); ?>'; } function createAlertModule() { window.location = '<?php echo ui_get_full_url('index.php?sec=gagente&sec2=godmode/agentes/configurar_agente&tab=alert&id_agente='.$this->getWelcomeAgent().''); ?>'; } function monitorRemoteCommands() { window.location = '<?php echo ui_get_full_url(''); ?>'; } function discoverDevicesNetwork() { window.location = '<?php echo ui_get_full_url('index.php?sec=gservers&sec2=godmode/servers/discovery&wiz=hd&mode=netscan'); ?>'; } function reportIsNotWorking() { } function cierre_dialog(){ this.dialog("close"); } </script> <?php return ob_get_clean(); } }