Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/matomo-org/matomo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormattab <matthieu.aubry@gmail.com>2014-11-27 04:27:01 +0300
committermattab <matthieu.aubry@gmail.com>2014-11-27 04:27:01 +0300
commite7539ffa249d841cfeb65939cbcb7878cf951352 (patch)
treefb9a3d975d307bec1ae1b041af92f78e936d79c4 /plugins
parent0d349bd5f2d5ac4c09d14ff39c8e1bfdecff42ed (diff)
Refactoring System check which was six year old code
Diffstat (limited to 'plugins')
-rw-r--r--plugins/Installation/SystemCheck.php361
1 files changed, 232 insertions, 129 deletions
diff --git a/plugins/Installation/SystemCheck.php b/plugins/Installation/SystemCheck.php
index b175528310..be456bf213 100644
--- a/plugins/Installation/SystemCheck.php
+++ b/plugins/Installation/SystemCheck.php
@@ -23,36 +23,16 @@ use Piwik\SettingsServer;
class SystemCheck
{
-
/**
* Get system information
*/
public static function getSystemInformation()
{
global $piwik_minimumPHPVersion;
- $minimumMemoryLimit = Config::getInstance()->General['minimum_memory_limit'];
$infos = array();
- $directoriesToCheck = array(
- '/tmp/',
- '/tmp/assets/',
- '/tmp/cache/',
- '/tmp/climulti/',
- '/tmp/latest/',
- '/tmp/logs/',
- '/tmp/sessions/',
- '/tmp/tcpdf/',
- '/tmp/templates_c/',
- );
-
- if (!DbHelper::isInstalled()) {
- // at install, need /config to be writable (so we can create config.ini.php)
- $directoriesToCheck[] = '/config/';
- }
-
- $infos['directories'] = Filechecks::checkDirectoriesWritable($directoriesToCheck);
-
+ $infos['directories'] = self::getDirectoriesWritableStatus();
$infos['can_auto_update'] = Filechecks::canAutoUpdate();
self::initServerFilesForSecurity();
@@ -62,111 +42,41 @@ class SystemCheck
$infos['phpVersion_ok'] = self::isPhpVersionValid($infos['phpVersion']);
// critical errors
- $extensions = @get_loaded_extensions();
- $needed_extensions = array(
- 'zlib',
- 'SPL',
- 'iconv',
- 'json',
- 'mbstring',
- );
- // HHVM provides the required subset of Reflection but lists Reflections as missing
- if (!defined('HHVM_VERSION')) {
- $needed_extensions[] = 'Reflection';
- }
- $infos['needed_extensions'] = $needed_extensions;
- $infos['missing_extensions'] = array();
- foreach ($needed_extensions as $needed_extension) {
- if (!in_array($needed_extension, $extensions)) {
- $infos['missing_extensions'][] = $needed_extension;
- }
- }
-
- // Special case for mbstring
- if (!function_exists('mb_get_info')
- || ((int)ini_get('mbstring.func_overload')) != 0) {
- $infos['missing_extensions'][] = 'mbstring';
- }
-
- $infos['pdo_ok'] = false;
- if (in_array('PDO', $extensions)) {
- $infos['pdo_ok'] = true;
- }
+ $infos['needed_extensions'] = self::getRequiredExtensions();
+ $infos['missing_extensions'] = self::getRequiredExtensionsMissing();
+ $infos['pdo_ok'] = self::isPhpExtensionLoaded('PDO');
$infos['adapters'] = Adapter::getAdapters();
- $needed_functions = array(
- 'debug_backtrace',
- 'create_function',
- 'eval',
- 'gzcompress',
- 'gzuncompress',
- 'pack',
- );
- $infos['needed_functions'] = $needed_functions;
- $infos['missing_functions'] = array();
- foreach ($needed_functions as $needed_function) {
- if (!self::functionExists($needed_function)) {
- $infos['missing_functions'][] = $needed_function;
- }
- }
+ $infos['needed_functions'] = self::getRequiredFunctions();
+ $infos['missing_functions'] = self::getRequiredFunctionsMissing();;
// warnings
- $desired_extensions = array(
- 'json',
- 'libxml',
- 'dom',
- 'SimpleXML',
- );
- $infos['desired_extensions'] = $desired_extensions;
- $infos['missing_desired_extensions'] = array();
- foreach ($desired_extensions as $desired_extension) {
- if (!in_array($desired_extension, $extensions)) {
- $infos['missing_desired_extensions'][] = $desired_extension;
- }
- }
- $desired_functions = array(
- 'set_time_limit',
- 'mail',
- 'parse_ini_file',
- 'glob',
- 'gzopen',
- );
- $infos['missing_desired_functions'] = array();
- foreach ($desired_functions as $desired_function) {
- if (!self::functionExists($desired_function)) {
- $infos['missing_desired_functions'][] = $desired_function;
- }
- }
+ $infos['desired_extensions'] = self::getRecommendedExtensions();
+ $infos['missing_desired_extensions'] = self::getRecommendedExtensionsMissing();
- $sessionAutoStarted = (int)ini_get('session.auto_start');
- if ($sessionAutoStarted) {
- $infos['missing_desired_functions'][] = 'session.auto_start';
- }
+ $infos['missing_desired_functions'] = self::getRecommendedFunctionsMissing();
+ //TODO create recommended settings
$desired_settings = array(
'session.auto_start',
);
- $infos['desired_functions'] = array_merge($desired_functions, $desired_settings);
+ $infos['desired_functions'] = array_merge(self::getRecommendedFunctions(), $desired_settings);
$infos['openurl'] = Http::getTransportMethod();
-
$infos['gd_ok'] = SettingsServer::isGdExtensionEnabled();
-
- $serverSoftware = isset($_SERVER['SERVER_SOFTWARE']) ? $_SERVER['SERVER_SOFTWARE'] : '';
- $infos['serverVersion'] = addslashes($serverSoftware);
+ $infos['serverVersion'] = addslashes(isset($_SERVER['SERVER_SOFTWARE']) ?: '');
$infos['serverOs'] = @php_uname();
$infos['serverTime'] = date('H:i:s');
- $infos['memoryMinimum'] = $minimumMemoryLimit;
-
+ $infos['memoryMinimum'] = self::getMinimumRecommendedMemoryLimit();
$infos['memory_ok'] = true;
$infos['memoryCurrent'] = '';
- $raised = SettingsServer::raiseMemoryLimitIfNecessary();
+ SettingsServer::raiseMemoryLimitIfNecessary();
if (($memoryValue = SettingsServer::getMemoryLimitValue()) > 0) {
$infos['memoryCurrent'] = $memoryValue . 'M';
- $infos['memory_ok'] = $memoryValue >= $minimumMemoryLimit;
+ $infos['memory_ok'] = $memoryValue >= self::getMinimumRecommendedMemoryLimit();
}
$infos['isWindows'] = SettingsServer::isWindows();
@@ -189,7 +99,6 @@ class SystemCheck
$infos['tracker_status'] = Common::getRequestVar('trackerStatus', 0, 'int');
- // check if filesystem is NFS, if it is file based sessions won't work properly
$infos['is_nfs'] = Filesystem::checkIfFileSystemIsNFS();
$infos = self::enrichSystemChecks($infos);
@@ -197,6 +106,9 @@ class SystemCheck
}
/**
+ * This can be overriden to provide a Customised System Check.
+ *
+ * @api
* @param $infos
* @return mixed
*/
@@ -228,31 +140,91 @@ class SystemCheck
}
/**
- * Test if function exists. Also handles case where function is disabled via Suhosin.
- *
- * @param string $functionName Function name
- * @return bool True if function exists (not disabled); False otherwise.
+ * @return array
*/
- public static function functionExists($functionName)
+ protected static function getDirectoriesShouldBeWritable()
{
- // eval() is a language construct
- if ($functionName == 'eval') {
- // does not check suhosin.executor.eval.whitelist (or blacklist)
- if (extension_loaded('suhosin')) {
- return @ini_get("suhosin.executor.disable_eval") != "1";
- }
- return true;
+ $directoriesToCheck = array(
+ '/tmp/',
+ '/tmp/assets/',
+ '/tmp/cache/',
+ '/tmp/climulti/',
+ '/tmp/latest/',
+ '/tmp/logs/',
+ '/tmp/sessions/',
+ '/tmp/tcpdf/',
+ '/tmp/templates_c/',
+ );
+
+ if (!DbHelper::isInstalled()) {
+ // at install, need /config to be writable (so we can create config.ini.php)
+ $directoriesToCheck[] = '/config/';
+ return $directoriesToCheck;
}
+ return $directoriesToCheck;
+ }
- $exists = function_exists($functionName);
- if (extension_loaded('suhosin')) {
- $blacklist = @ini_get("suhosin.executor.func.blacklist");
- if (!empty($blacklist)) {
- $blacklistFunctions = array_map('strtolower', array_map('trim', explode(',', $blacklist)));
- return $exists && !in_array($functionName, $blacklistFunctions);
- }
+ /**
+ * @return array
+ */
+ protected static function getRequiredFunctions()
+ {
+ return $needed_functions = array(
+ 'debug_backtrace',
+ 'create_function',
+ 'eval',
+ 'gzcompress',
+ 'gzuncompress',
+ 'pack',
+ );
+ }
+
+ /**
+ * @return array
+ */
+ protected static function getRecommendedExtensions()
+ {
+ return array(
+ 'json',
+ 'libxml',
+ 'dom',
+ 'SimpleXML',
+ );
+ }
+
+ /**
+ * @return array
+ */
+ protected static function getRecommendedFunctions()
+ {
+ return array(
+ 'set_time_limit',
+ 'mail',
+ 'parse_ini_file',
+ 'glob',
+ 'gzopen',
+ );
+ }
+
+ /**
+ * @return array
+ */
+ protected static function getRequiredExtensions()
+ {
+ $requiredExtensions = array(
+ 'zlib',
+ 'SPL',
+ 'iconv',
+ 'json',
+ 'mbstring',
+ );
+
+ if (!defined('HHVM_VERSION')) {
+ // HHVM provides the required subset of Reflection but lists Reflections as missing
+ $requiredExtensions[] = 'Reflection';
}
- return $exists;
+
+ return $requiredExtensions;
}
/**
@@ -276,6 +248,34 @@ class SystemCheck
return $result;
}
+ /**
+ * Test if function exists. Also handles case where function is disabled via Suhosin.
+ *
+ * @param string $functionName Function name
+ * @return bool True if function exists (not disabled); False otherwise.
+ */
+ protected static function functionExists($functionName)
+ {
+ // eval() is a language construct
+ if ($functionName == 'eval') {
+ // does not check suhosin.executor.eval.whitelist (or blacklist)
+ if (extension_loaded('suhosin')) {
+ return @ini_get("suhosin.executor.disable_eval") != "1";
+ }
+ return true;
+ }
+
+ $exists = function_exists($functionName);
+ if (extension_loaded('suhosin')) {
+ $blacklist = @ini_get("suhosin.executor.func.blacklist");
+ if (!empty($blacklist)) {
+ $blacklistFunctions = array_map('strtolower', array_map('trim', explode(',', $blacklist)));
+ return $exists && !in_array($functionName, $blacklistFunctions);
+ }
+ }
+ return $exists;
+ }
+
private static function checkGeolocation(&$result)
{
$currentProviderId = LocationProvider::getCurrentProviderId();
@@ -320,13 +320,11 @@ class SystemCheck
{
ServerFilesGenerator::createWebConfigFiles();
ServerFilesGenerator::createHtAccessFiles();
-
ServerFilesGenerator::createWebRootFiles();
}
/**
- * @param $piwik_minimumPHPVersion
- * @param $infos
+ * @param string $phpVersion
* @return bool
*/
public static function isPhpVersionValid($phpVersion)
@@ -335,4 +333,109 @@ class SystemCheck
return version_compare($piwik_minimumPHPVersion, $phpVersion) <= 0;
}
+ /**
+ * @return array
+ */
+ protected static function getDirectoriesWritableStatus()
+ {
+ $directoriesToCheck = self::getDirectoriesShouldBeWritable();
+ $directoriesWritableStatus = Filechecks::checkDirectoriesWritable($directoriesToCheck);
+ return $directoriesWritableStatus;
+ }
+
+ /**
+ * @return array
+ */
+ protected static function getLoadedExtensions()
+ {
+ static $extensions = null;
+
+ if(is_null($extensions)) {
+ $extensions = @get_loaded_extensions();
+ }
+ return $extensions;
+ }
+
+
+ /**
+ * @param $needed_extension
+ * @return bool
+ */
+ protected static function isPhpExtensionLoaded($needed_extension)
+ {
+ return in_array($needed_extension, self::getLoadedExtensions());
+ }
+
+ /**
+ * @return array
+ */
+ protected static function getRequiredExtensionsMissing()
+ {
+ $missingExtensions = array();
+ foreach (self::getRequiredExtensions() as $needed_extension) {
+ if (!self::isPhpExtensionLoaded($needed_extension)) {
+ $missingExtensions[] = $needed_extension;
+ }
+ }
+
+ // Special case for mbstring
+ if (!function_exists('mb_get_info')
+ || ((int)ini_get('mbstring.func_overload')) != 0) {
+ $missingExtensions[] = 'mbstring';
+ }
+
+ return $missingExtensions;
+ }
+
+ /**
+ * @return array
+ */
+ protected static function getRecommendedExtensionsMissing()
+ {
+ return array_diff(self::getRecommendedExtensions(), self::getLoadedExtensions());
+ }
+
+ /**
+ * @return array
+ */
+ protected static function getRecommendedFunctionsMissing()
+ {
+ $recommendedFunctionsMissing = self::getFunctionsMissing(self::getRecommendedFunctions());
+
+ $sessionAutoStarted = (int)ini_get('session.auto_start');
+ if ($sessionAutoStarted) {
+ $recommendedFunctionsMissing[] = 'session.auto_start';
+ }
+
+ return $recommendedFunctionsMissing;
+ }
+
+ /**
+ * @return array
+ */
+ protected static function getRequiredFunctionsMissing()
+ {
+ return self::getFunctionsMissing(self::getRequiredFunctions());
+ }
+
+ protected static function getFunctionsMissing($functionsToTestFor)
+ {
+ $missingFunctions = array();
+ foreach ($functionsToTestFor as $function) {
+ if (!self::functionExists($function)) {
+ $missingFunctions[] = $function;
+ }
+ }
+ return $missingFunctions;
+ }
+
+ /**
+ * @return mixed
+ */
+ protected static function getMinimumRecommendedMemoryLimit()
+ {
+ return Config::getInstance()->General['minimum_memory_limit'];
+ }
+
+
} \ No newline at end of file