diff --git a/setup/setuputils.class.inc.php b/setup/setuputils.class.inc.php index 9c1ac06ca..39047e177 100644 --- a/setup/setuputils.class.inc.php +++ b/setup/setuputils.class.inc.php @@ -21,7 +21,6 @@ * @copyright Copyright (C) 2010-2017 Combodo SARL * @license http://opensource.org/licenses/AGPL-3.0 */ - class CheckResult { // Severity levels @@ -42,44 +41,47 @@ class CheckResult } /** - * Namespace for storing all the functions/utilities needed by both - * the setup wizard and the installation process + * All of the functions/utilities needed by both the setup wizard and the installation process + * * @copyright Copyright (C) 2010-2012 Combodo SARL * @license http://opensource.org/licenses/AGPL-3.0 */ - class SetupUtils { + // Minimum versions (requirements : forbids installation if not met) const PHP_MIN_VERSION = '5.3.6'; const MYSQL_MIN_VERSION = '5.0.0'; + // versions that will be the minimum in next iTop major release (warning if not met) + const PHP_NEXT_MIN_VERSION = '5.6.32'; + const MYSQL_NEXT_MIN_VERSION = '5.6.38'; + const MIN_MEMORY_LIMIT = 33554432; // = 32*1024*1024 Beware: Computations are not allowed in defining constants const SUHOSIN_GET_MAX_VALUE_LENGTH = 2048; /** - * Check the version of PHP, the needed PHP extension and a number - * of configuration parameters (memory_limit, max_upload_file_size, etc...) - * @param SetupPage $oP The page used only for its 'log' method - * @return array An array of CheckResults objects + * Check configuration parameters, for example : + * + * + * @internal SetupPage $oP The page used only for its 'log' method + * @return CheckResult[] */ - static function CheckPHPVersion() + static function CheckPhpAndExtensions() { $aResult = array(); - + // For log file(s) if (!is_dir(APPROOT.'log')) { @mkdir(APPROOT.'log'); } - - SetupPage::log('Info - CheckPHPVersion'); - if (version_compare(phpversion(), self::PHP_MIN_VERSION, '>=')) - { - $aResult[] = new CheckResult(CheckResult::INFO, "The current PHP Version (".phpversion().") is greater than the minimum version required to run ".ITOP_APPLICATION.", which is (".self::PHP_MIN_VERSION.")"); - } - else - { - $aResult[] = new CheckResult(CheckResult::ERROR, "Error: The current PHP Version (".phpversion().") is lower than the minimum version required to run ".ITOP_APPLICATION.", which is (".self::PHP_MIN_VERSION.")"); - } + + self::CheckPhpVersion($aResult); // Check the common directories $aWritableDirsErrors = self::CheckWritableDirs(array('log', 'env-production', 'env-production-build', 'conf', 'data')); @@ -338,8 +340,44 @@ class SetupUtils } /** - * Check that the selected modules meet their dependencies - */ + * @param CheckResult[] $aResult checks log + */ + private static function CheckPhpVersion(&$aResult) + { + SetupPage::log('Info - CheckPHPVersion'); + $sPhpVersion = phpversion(); + + if (version_compare($sPhpVersion, self::PHP_MIN_VERSION, '>=')) + { + $aResult[] = new CheckResult(CheckResult::INFO, + "The current PHP Version (".$sPhpVersion.") is greater than the minimum version required to run ".ITOP_APPLICATION.", which is (".self::PHP_MIN_VERSION.")"); + + + if (version_compare($sPhpVersion, self::PHP_NEXT_MIN_VERSION, '>=')) + { + $aResult[] = new CheckResult(CheckResult::INFO, + "The current PHP Version (".$sPhpVersion.") is greater than the minimum version required to run next ".ITOP_APPLICATION." release, which is (".self::PHP_NEXT_MIN_VERSION.")"); + } + else + { + $aResult[] = new CheckResult(CheckResult::WARNING, + "Error: The current PHP Version (".$sPhpVersion.") is lower than the minimum version required to run next ".ITOP_APPLICATION." release, which is (".self::PHP_NEXT_MIN_VERSION.")"); + } + } + else + { + $aResult[] = new CheckResult(CheckResult::ERROR, + "Error: The current PHP Version (".$sPhpVersion.") is lower than the minimum version required to run ".ITOP_APPLICATION.", which is (".self::PHP_MIN_VERSION.")"); + } + } + + /** + * Check that the selected modules meet their dependencies + * @param $sSourceDir + * @param $sExtensionDir + * @param $aSelectedModules + * @return array + */ static function CheckSelectedModules($sSourceDir, $sExtensionDir, $aSelectedModules) { $aResult = array(); @@ -961,12 +999,17 @@ EOF } - /** - * Helper function check the connection to the database, verify a few conditions (minimum version, etc...) and (if connected) - * enumerate the existing databases (if possible) - * @return mixed false if the connection failed or array('checks' => Array of CheckResult, 'databases' => Array of database names (as strings) or null if not allowed) - */ - static function CheckServerConnection($sDBServer, $sDBUser, $sDBPwd) + /** + * Helper function : check the connection to the database, verify a few conditions (minimum version, etc...) and (if connected) + * enumerate the existing databases (if possible) + * + * @param string $sDBServer + * @param string $sDBUser + * @param string $sDBPwd + * + * @return mixed false if the connection failed or array('checks' => Array of CheckResult, 'databases' => Array of database names (as strings) or null if not allowed) + */ + static function CheckDbServer($sDBServer, $sDBUser, $sDBPwd) { $aResult = array('checks' => array(), 'databases' => null); try @@ -976,10 +1019,10 @@ EOF $aResult['checks'][] = new CheckResult(CheckResult::INFO, "Connection to '$sDBServer' as '$sDBUser' successful."); $aResult['checks'][] = new CheckResult(CheckResult::INFO, "Info - User privileges: ".($oDBSource->GetRawPrivileges())); - $sDBVersion = $oDBSource->GetDBVersion(); - if (version_compare($sDBVersion, self::MYSQL_MIN_VERSION, '>=')) + $bHasDbVersionRequired = self::CheckDbServerVersion($aResult, $oDBSource); + + if ($bHasDbVersionRequired) { - $aResult['checks'][] = new CheckResult(CheckResult::INFO, "Current MySQL version ($sDBVersion), greater than minimum required version (".self::MYSQL_MIN_VERSION.")"); // Check some server variables $iMaxAllowedPacket = $oDBSource->GetServerVariable('max_allowed_packet'); $iMaxUploadSize = utils::ConvertToBytes(ini_get('upload_max_filesize')); @@ -1001,10 +1044,7 @@ EOF $aResult['checks'][] = new CheckResult(CheckResult::INFO, "MySQL server's max_connections is set to $iMaxConnections."); } } - else - { - $aResult['checks'][] = new CheckResult(CheckResult::ERROR, "Error: Current MySQL version is ($sDBVersion), minimum required version (".self::MYSQL_MIN_VERSION.")"); - } + try { $aResult['databases'] = $oDBSource->ListDB(); @@ -1020,6 +1060,40 @@ EOF } return $aResult; } + + /** + * @param array $aResult two keys : 'checks' with CheckResult array, 'databases' with list of databases available + * @param CMDBSource $oDBSource + * + * @return boolean false if DB doesn't meet the minimum version requirement + */ + private static function CheckDbServerVersion(&$aResult, $oDBSource) + { + $sDBVersion = $oDBSource->GetDBVersion(); + if (version_compare($sDBVersion, self::MYSQL_MIN_VERSION, '>=')) + { + $aResult['checks'][] = new CheckResult(CheckResult::INFO, + "Current MySQL version ($sDBVersion), greater than minimum required version (".self::MYSQL_MIN_VERSION.")"); + + if (version_compare($sDBVersion, self::MYSQL_NEXT_MIN_VERSION, '>=')) + { + $aResult['checks'][] = new CheckResult(CheckResult::INFO, + "Current MySQL version ($sDBVersion), greater than minimum required version for next ".ITOP_APPLICATION." release (".self::MYSQL_NEXT_MIN_VERSION.")"); + } + else + { + $aResult['checks'][] = new CheckResult(CheckResult::WARNING, + "Warning : Current MySQL version is $sDBVersion, minimum required version for next ".ITOP_APPLICATION." release will be ".self::MYSQL_NEXT_MIN_VERSION); + } + + return true; + } + + $aResult['checks'][] = new CheckResult(CheckResult::ERROR, + "Error: Current MySQL version is $sDBVersion, minimum required version is ".self::MYSQL_MIN_VERSION); + + return false; + } static public function GetMySQLVersion($sDBServer, $sDBUser, $sDBPwd) { @@ -1036,9 +1110,9 @@ EOF $sDBPwd = $aParameters['db_pwd']; $sDBName = $aParameters['db_name']; - $oPage->add_ready_script('oXHRCheckDB = null;'); + $oPage->add_ready_script('oXHRCheckDB = null;'); - $checks = SetupUtils::CheckServerConnection($sDBServer, $sDBUser, $sDBPwd); + $checks = SetupUtils::CheckDbServer($sDBServer, $sDBUser, $sDBPwd); if ($checks === false) { // Connection failed, disable the "Next" button diff --git a/setup/wizardsteps.class.inc.php b/setup/wizardsteps.class.inc.php index 1c7f29f46..a8b5fec8c 100644 --- a/setup/wizardsteps.class.inc.php +++ b/setup/wizardsteps.class.inc.php @@ -77,7 +77,7 @@ class WizStepWelcome extends WizardStep EOF ); $oPage->add('

'.ITOP_APPLICATION.' Installation Wizard

'); - $aResults = SetupUtils::CheckPHPVersion($oPage); + $aResults = SetupUtils::CheckPhpAndExtensions($oPage); $this->bCanMoveForward = true; $aInfo = array(); $aWarnings = array();