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

Documentation generated on Wed, 07 Sep 2011 13:47:32 +0200 by phpDocumentor 1.4.3