Source for file jInstallChecker.class.php

Documentation is available at jInstallChecker.class.php

  1. <?php
  2. /**
  3. * check a jelix installation
  4. *
  5. @package  jelix
  6. @subpackage core
  7. @author   Laurent Jouanneau
  8. @contributor Bastien Jaillot
  9. @copyright 2007-2009 Laurent Jouanneau, 2008 Bastien Jaillot
  10. @link     http://www.jelix.org
  11. @licence  GNU Lesser General Public Licence see LICENCE file or http://www.gnu.org/licenses/lgpl.html
  12. @since 1.0b2
  13. */
  14.  
  15. /**
  16.  * interface for objects which output result of the install check
  17.  * @package  jelix
  18.  * @subpackage core
  19.  * @since 1.0b2
  20.  */
  21. interface jIInstallCheckReporter {
  22.     function start();
  23.     function showError($message);
  24.     function showWarning($message);
  25.     function showOk($message);
  26.     function showNotice($message);
  27.     function end($checker);
  28. }
  29.  
  30. /**
  31.  * message provider for jInstallCheck
  32.  * @package  jelix
  33.  * @subpackage core
  34.  * @since 1.0b2
  35.  */
  36. class jInstallMessageProvider {
  37.     protected $currentLang;
  38.  
  39.     protected $messages = array(
  40.         'fr'=>array(
  41.             'checker.title'=>'Vérification de l\'installation de Jelix',
  42.             'number.errors'=>' erreurs.',
  43.             'number.error'=>' erreur.',
  44.             'number.warnings'=>' avertissements.',
  45.             'number.warning'=>' avertissement.',
  46.             'number.notices'=>' remarques.',
  47.             'number.notice'=>' remarque.',
  48.             'build.not.found'=>'Le fichier BUILD de jelix est introuvable',
  49.             'conclusion.error'=>'Vous devez corriger l\'erreur pour faire fonctionner correctement votre application.',
  50.             'conclusion.errors'=>'Vous devez corriger les erreurs pour faire fonctionner correctement votre application.',
  51.             'conclusion.warning'=>'Votre application peut à priori fonctionner, mais il est préférable de corriger l\'avertissement pour être sûr.',
  52.             'conclusion.warnings'=>'Votre application peut à priori fonctionner, mais il est préférable de corriger les avertissements pour être sûr.',
  53.             'conclusion.notice'=>'L\'installation est correcte malgré la remarque.',
  54.             'conclusion.notices'=>'L\'installation est correcte malgré les remarques.',
  55.             'conclusion.ok'=>'L\'installation est correcte',
  56.             'cannot.continue'=>'Les vérifications ne peuvent continuer : ',
  57.             'extension.dom'=>'L\'extension DOM n\'est pas installée',
  58.             'extension.spl'=>'L\'extension spl  n\'est pas installée',
  59.             'extension.simplexml'=>'L\'extension simplexml n\'est pas installée',
  60.             'extension.pcre'=>'L\'extension pcre n\'est pas installée',
  61.             'extension.session'=>'L\'extension session n\'est pas installée',
  62.             'extension.tokenizer'=>'L\'extension tokenizer n\'est pas installée',
  63.             'extension.iconv'=>'L\'extension iconv n\'est pas installée',
  64.             'extensions.required.ok'=>'Toutes les extensions obligatoires sont installées',
  65.             'extension.filter'=>'Cette édition de Jelix a besoin de l\'extension filter',
  66.             'extension.json'=>'Cette édition de Jelix a besoin de l\'extension json',
  67.             'extension.xmlrpc'=>'Cette édition de Jelix a besoin de l\'extension xmlrpc',
  68.             'extension.jelix'=>'Cette édition de Jelix a besoin de l\'extension jelix',
  69.             'extension.opcode.cache'=>'Cette édition de Jelix a besoin d\'une extension de cache d\'opcode (apc, eaccelerator...)',
  70.             'path.core'=>'Le fichier init.php  de jelix ou le fichier application.ini.php de votre application n\'est pas chargé',
  71.             'path.temp'=>'Le repertoire temporaire n\'est pas accessible en écriture ou alors JELIX_APP_TEMP_PATH n\'est pas configurée comme il faut',
  72.             'path.log'=>'Le repertoire var/log dans votre application n\'est pas accessible en écriture ou alors JELIX_APP_LOG_PATH n\'est pas configurée comme il faut',
  73.             'path.var'=>'JELIX_APP_VAR_PATH n\'est pas configuré correctement : ce répertoire n\'existe pas',
  74.             'path.config'=>'JELIX_APP_CONFIG_PATH n\'est pas configuré correctement : ce répertoire n\'existe pas',
  75.             'path.www'=>'JELIX_APP_WWW_PATH n\'est pas configuré correctement : ce répertoire n\'existe pas',
  76.             'php.bad.version'=>'Mauvaise version de PHP',
  77.             'php.version.current'=>'Version courante :',
  78.             'php.version.required'=>'Cette édition de Jelix nécessite au moins PHP ',
  79.             'too.critical.error'=>'Trop d\'erreurs critiques sont apparues. Corrigez les.',
  80.             'config.file'=>'La variable $config_file n\'existe pas ou le fichier qu\'elle indique n\'existe pas',
  81.             'paths.ok'=>'Les répertoires temp, log, var, config et www sont ok',
  82.             'ini.magic_quotes_gpc_with_plugin'=>'php.ini : le plugin magicquotes est activé mais vous devriez mettre magic_quotes_gpc à off',
  83.             'ini.magicquotes_plugin_without_php'=>'php.ini : le plugin magicquotes est activé alors que magic_quotes_gpc est déjà à off, désactivez le plugin',
  84.             'ini.magic_quotes_gpc'=>'php.ini : l\'activation des magicquotes n\'est pas recommandée pour jelix. Vous devez les désactiver ou activer le plugin magicquotes si ce n\'est pas fait',
  85.             'ini.magic_quotes_runtime'=>'php.ini : magic_quotes_runtime doit être à off',
  86.             'ini.session.auto_start'=>'php.ini : session.auto_start doit être à off',
  87.             'ini.safe_mode'=>'php.ini : le safe_mode n\'est pas recommandé pour jelix.',
  88.             'ini.register_globals'=>'php.ini : il faut désactiver register_globals, pour des raisons de sécurité et parce que Jelix n\'en a pas besoin.',
  89.             'ini.asp_tags'=>'php.ini :  il est conseillé de désactiver asp_tags. Jelix n\'en a pas besoin.',
  90.             'ini.short_open_tag'=>'php.ini :  il est conseillé de désactiver short_open_tag. Jelix n\'en a pas besoin.',
  91.             'ini.ok'=>'Les paramètres de php sont ok',
  92.         ),
  93.  
  94.         'en'=>array(
  95.             'checker.title'=>'Jelix Installation checking',
  96.             'number.errors'=>' errors.',
  97.             'number.error'=>' error.',
  98.             'number.warnings'=>' warnings.',
  99.             'number.warning'=>' warning.',
  100.             'number.notices'=>' notices.',
  101.             'number.notice'=>' notice.',
  102.             'build.not.found'=>'BUILD jelix file is not found',
  103.             'conclusion.error'=>'You must fix the error in order to run your application correctly.',
  104.             'conclusion.errors'=>'You must fix errors in order to run your application correctly.',
  105.             'conclusion.warning'=>'Your application may run without problems, but it is recommanded to fix the warning.',
  106.             'conclusion.warnings'=>'Your application may run without problems, but it is recommanded to fix warnings.',
  107.             'conclusion.notice'=>'The installation is ok, although there is a notice.',
  108.             'conclusion.notices'=>'The installation is ok, although there are notices.',
  109.             'conclusion.ok'=>'The installation is ok',
  110.             'cannot.continue'=>'Cannot continue the checking: ',
  111.             'extension.dom'=>'DOM extension is not installed',
  112.             'extension.spl'=>'SPL extension is not installed',
  113.             'extension.simplexml'=>'simplexml extension is not installed',
  114.             'extension.pcre'=>'pcre extension is not installed',
  115.             'extension.session'=>'session extension is not installed',
  116.             'extension.tokenizer'=>'tokenizer extension is not installed',
  117.             'extension.iconv'=>'iconv extension is not installed',
  118.             'extensions.required.ok'=>'All needed PHP extensions are installed',
  119.             'extension.filter'=>'This Jelix edition require the filter extension',
  120.             'extension.json'=>'This Jelix edition require the json extension',
  121.             'extension.xmlrpc'=>'This Jelix edition require the xmlrpc extension',
  122.             'extension.jelix'=>'This Jelix edition require the jelix extension',
  123.             'extension.opcode.cache'=>'This Jelix edition require an extension for opcode cache (apc, eaccelerator...)',
  124.             'path.core'=>'jelix init.php file or application.ini.php file is not loaded',
  125.             'path.temp'=>'temp/yourApp directory is not writable or JELIX_APP_TEMP_PATH is not correctly set !',
  126.             'path.log'=>'var/log directory (in the directory of your application) is not writable or JELIX_APP_LOG_PATH is not correctly set!',
  127.             'path.var'=>'JELIX_APP_VAR_PATH is not correctly set: var directory  doesn\'t exist!',
  128.             'path.config'=>'JELIX_APP_CONFIG_PATH is not correctly set: config directory  doesn\'t exist!',
  129.             'path.www'=>'JELIX_APP_WWW_PATH is not correctly set: www directory  doesn\'t exist!',
  130.             'php.bad.version'=>'Bad PHP version',
  131.             'php.version.current'=>'Current version:',
  132.             'php.version.required'=>'This edition of Jelix require at least PHP ',
  133.             'too.critical.error'=>'Too much critical errors. Fix them.',
  134.             'config.file'=>'$config_file variable does not exist or doesn\'t contain a correct application config file name',
  135.             'paths.ok'=>'temp, log, var, config and www directory are ok',
  136.             'ini.magic_quotes_gpc_with_plugin'=>'php.ini : the magicquotes plugin is actived but you should set magic_quotes_gpc to off',
  137.             'ini.magicquotes_plugin_without_php'=>'php.ini : the magicquotes plugin is actived whereas magic_quotes_gpc is already off, you should disable the plugin',
  138.             'ini.magic_quotes_gpc'=>'php.ini : magicquotes are not recommended for Jelix. You should deactivate it or activate the magicquote jelix plugin',
  139.             'ini.magic_quotes_runtime'=>'php.ini : magic_quotes_runtime must be off',
  140.             'ini.session.auto_start'=>'php.ini : session.auto_start must be off',
  141.             'ini.safe_mode'=>'php.ini : safe_mode is not recommended.',
  142.             'ini.register_globals'=>'php.ini : you must deactivate register_globals, for security reasons, and because Jelix doesn\'t need it.',
  143.             'ini.asp_tags'=>'php.ini :  you should deactivate  asp_tags. Jelix doesn\'t need it.',
  144.             'ini.short_open_tag'=>'php.ini :  you should deactivate short_open_tag. Jelix doesn\'t need it.',
  145.             'ini.ok'=>'php settings are ok',
  146.            /* ''=>'',*/
  147.         ),
  148.     );
  149.  
  150.     function __construct($lang=''){
  151.         if($lang == ''){
  152.             $languages explode(','$_SERVER['HTTP_ACCEPT_LANGUAGE']);
  153.             foreach($languages as $bl){
  154.                 // pour les user-agents qui livrent un code internationnal
  155.                 if(preg_match("/^([a-zA-Z]{2})(?:[-_]([a-zA-Z]{2}))?(;q=[0-9]\\.[0-9])?$/",$bl,$match)){
  156.                     $lang strtolower($match[1]);
  157.                     break;
  158.                 }
  159.             }
  160.         }elseif(preg_match("/^([a-zA-Z]{2})(?:[-_]([a-zA-Z]{2}))?$/",$lang,$match)){
  161.             $lang strtolower($match[1]);
  162.         }
  163.         if(!isset($this->messages[$lang])){
  164.             $lang 'en';
  165.         }
  166.         $this->currentLang = $lang;
  167.     }
  168.  
  169.     function get($key){
  170.         if(isset($this->messages[$this->currentLang][$key])){
  171.             return $this->messages[$this->currentLang][$key];
  172.         }else{
  173.             throw new Exception ("Error : don't find error message '$key'");
  174.         }
  175.     }
  176.  
  177.     function getLang(){
  178.         return $this->currentLang;
  179.     }
  180. }
  181.  
  182.  
  183. /**
  184.  * check an installation of a jelix application
  185.  * @package  jelix
  186.  * @subpackage core
  187.  * @since 1.0b2
  188.  */
  189. class jInstallCheck {
  190.  
  191.     /**
  192.      * the object responsible of the results output
  193.      * @var jIInstallCheckReporter 
  194.      */
  195.     protected $reporter;
  196.  
  197.     /**
  198.      * @var JInstallMessageProvider 
  199.      */
  200.     public $messages;
  201.  
  202.     public $nbError = 0;
  203.     public $nbOk = 0;
  204.     public $nbWarning = 0;
  205.     public $nbNotice = 0;
  206.  
  207.     protected $buildProperties;
  208.  
  209.     function __construct ($reporter$lang=''){
  210.         $this->reporter = $reporter;
  211.         $this->messages = new jInstallMessageProvider($lang);
  212.     }
  213.  
  214.     function run(){
  215.         $this->nbError = 0;
  216.         $this->nbOk = 0;
  217.         $this->nbWarning = 0;
  218.         $this->nbNotice = 0;
  219.         $this->reporter->start();
  220.         try {
  221.             $this->checkAppPaths();
  222.             $this->loadBuildFile();
  223.             $this->checkPhpExtensions();
  224.             $this->checkPhpSettings();
  225.         }catch(Exception $e){
  226.             $this->reporter->showError($this->messages->get('cannot.continue').$e->getMessage());
  227.             $this->nbError ++;
  228.         }
  229.         $this->reporter->end($this);
  230.     }
  231.  
  232.     protected function error($msg){
  233.         if($this->reporter)
  234.             $this->reporter->showError($this->messages->get($msg));
  235.         $this->nbError ++;
  236.     }
  237.  
  238.     protected function ok($msg){
  239.         if($this->reporter)
  240.             $this->reporter->showOk($this->messages->get($msg));
  241.         $this->nbOk ++;
  242.     }
  243.     /**
  244.      * generate a warning
  245.      * @param string $msg  the key of the message to display
  246.      */
  247.     protected function warning($msg){
  248.         if($this->reporter)
  249.             $this->reporter->showWarning($this->messages->get($msg));
  250.         $this->nbWarning ++;
  251.     }
  252.  
  253.     protected function notice($msg){
  254.         if($this->reporter)
  255.             $this->reporter->showNotice($this->messages->get($msg));
  256.         $this->nbNotice ++;
  257.     }
  258.  
  259.     function checkPhpExtensions(){
  260.         $ok=true;
  261.         if(!version_compare($this->buildProperties['PHP_VERSION_TARGET']phpversion()'<=')){
  262.             $this->error('php.bad.version');
  263.             $notice $this->messages->get('php.version.required')
  264.                      .$this->buildProperties['PHP_VERSION_TARGET'];
  265.             $notice.= '. '.$this->messages->get('php.version.current').phpversion();
  266.             $this->reporter->showNotice($notice);
  267.             $ok=false;
  268.         }
  269.         if(!class_exists('DOMDocument',false)){
  270.             $this->error('extension.dom');
  271.             $ok=false;
  272.         }
  273.         if(!class_exists('DirectoryIterator',false)){
  274.             $this->error('extension.spl');
  275.             $ok=false;
  276.         }
  277.  
  278.         $funcs=array(
  279.             'simplexml_load_file'=>'simplexml',
  280.             'preg_match'=>'pcre',
  281.             'session_start'=>'session',
  282.             'token_get_all'=>'tokenizer',
  283.             'iconv_set_encoding'=>'iconv',
  284.         );
  285.         foreach($funcs as $f=>$name){
  286.             if(!function_exists($f)){
  287.                 $this->error('extension.'.$name);
  288.                 $ok=false;
  289.             }
  290.         }
  291.         if($this->buildProperties['ENABLE_PHP_FILTER'== '1' && !extension_loaded ('filter')) {
  292.             $this->error('extension.filter');
  293.             $ok=false;
  294.         }
  295.         if($this->buildProperties['ENABLE_PHP_JSON'== '1' && !extension_loaded ('json')) {
  296.             $this->error('extension.json');
  297.             $ok=false;
  298.         }
  299.         /*if($this->buildProperties['ENABLE_PHP_XMLRPC'] == '1' && !extension_loaded ('xmlrpc')) {
  300.             $this->error('extension.xmlrpc');
  301.             $ok=false;
  302.         }*/
  303.         if($this->buildProperties['ENABLE_PHP_JELIX'== '1' && !extension_loaded ('jelix')) {
  304.             $this->error('extension.jelix');
  305.             $ok=false;
  306.         }
  307.         if($this->buildProperties['WITH_BYTECODE_CACHE'!= 'auto' &&
  308.            $this->buildProperties['WITH_BYTECODE_CACHE'!= ''{
  309.             if(!extension_loaded ('apc'&& !extension_loaded ('eaccelerator'&& !extension_loaded ('xcache')) {
  310.                 $this->error('extension.opcode.cache');
  311.                 $ok=false;
  312.             }
  313.         }
  314.         if($ok)
  315.             $this->ok('extensions.required.ok');
  316.  
  317.         return $ok;
  318.     }
  319.     function checkAppPaths(){
  320.         $ok true;
  321.         if(!defined('JELIX_LIB_PATH'|| !defined('JELIX_APP_PATH')){
  322.             throw new Exception($this->messages->get('path.core'));
  323.         }
  324.  
  325.         if(!file_exists(JELIX_APP_TEMP_PATH|| !is_writable(JELIX_APP_TEMP_PATH)){
  326.             $this->error('path.temp');
  327.             $ok=false;
  328.         }
  329.         if(!file_exists(JELIX_APP_LOG_PATH|| !is_writable(JELIX_APP_LOG_PATH)){
  330.             $this->error('path.log');
  331.             $ok=false;
  332.         }
  333.         if(!file_exists(JELIX_APP_VAR_PATH)){
  334.             $this->error('path.var');
  335.             $ok=false;
  336.         }
  337.         if(!file_exists(JELIX_APP_CONFIG_PATH)){
  338.             $this->error('path.config');
  339.             $ok=false;
  340.         }
  341.         if(!file_exists(JELIX_APP_WWW_PATH)){
  342.             $this->error('path.www');
  343.             $ok=false;
  344.         }
  345.  
  346.         if($ok)
  347.             $this->ok('paths.ok');
  348.         else
  349.             throw new Exception($this->messages->get('too.critical.error'));
  350.  
  351.         if(!isset($GLOBALS['config_file']||
  352.            empty($GLOBALS['config_file']||
  353.            !file_exists(JELIX_APP_CONFIG_PATH.$GLOBALS['config_file'])){
  354.             throw new Exception($this->messages->get('config.file'));
  355.         }
  356.  
  357.         return $ok;
  358.     }
  359.  
  360.     function loadBuildFile({
  361.         if (!file_exists(JELIX_LIB_PATH.'BUILD')){
  362.             throw new Exception($this->messages->get('build.not.found'));
  363.         else {
  364.             $this->buildProperties = parse_ini_file(JELIX_LIB_PATH.'BUILD');
  365.         }
  366.     }
  367.  
  368.     function checkPhpSettings(){
  369.         $ok true;
  370.         $defaultconfig parse_ini_file(JELIX_APP_CONFIG_PATH."defaultconfig.ini.php"true);
  371.         $indexconfig parse_ini_file(JELIX_APP_CONFIG_PATH."index/config.ini.php"true);
  372.  
  373.         if ((isset ($defaultconfig['coordplugins']['magicquotes']&& $defaultconfig['coordplugins']['magicquotes'== 1||
  374.             (isset ($indexconfig['coordplugins']['magicquotes']&& $indexconfig['coordplugins']['magicquotes'== 1)) {
  375.             if(ini_get('magic_quotes_gpc'== 1){
  376.                 $this->notice('ini.magic_quotes_gpc_with_plugin');
  377.             }
  378.             else {
  379.                 $this->error('ini.magicquotes_plugin_without_php');
  380.                 $ok=false;
  381.             }
  382.         }
  383.         else {
  384.             if(ini_get('magic_quotes_gpc'== 1){
  385.                 $this->warning('ini.magic_quotes_gpc');
  386.                 $ok=false;
  387.             }
  388.         }
  389.         if(ini_get('magic_quotes_runtime'== 1){
  390.             $this->error('ini.magic_quotes_runtime');
  391.             $ok=false;
  392.         }
  393.  
  394.         if(ini_get('session.auto_start'== 1){
  395.             $this->error('ini.session.auto_start');
  396.             $ok=false;
  397.         }
  398.  
  399.         if(ini_get('safe_mode'== 1){
  400.             $this->warning('safe_mode');
  401.             $ok=false;
  402.         }
  403.  
  404.         if(ini_get('register_globals'== 1){
  405.             $this->warning('ini.register_globals');
  406.             $ok=false;
  407.         }
  408.  
  409.         if(ini_get('asp_tags'== 1){
  410.             $this->notice('ini.asp_tags');
  411.         }
  412.         if(ini_get('short_open_tag'== 1){
  413.             $this->notice('ini.short_open_tag');
  414.         }
  415.         if($ok){
  416.             $this->ok('ini.ok');
  417.         }
  418.         return $ok;
  419.     }
  420. }

Documentation generated on Thu, 22 Mar 2012 22:16:21 +0100 by phpDocumentor 1.4.3