Skip to content
Snippets Groups Projects
Class_Install.php 12.6 KiB
Newer Older
  • Learn to ignore specific revisions
  • Giovannoni Laurent's avatar
    Giovannoni Laurent committed
    <?php
    
    Giovannoni Laurent's avatar
    Giovannoni Laurent committed
    /*
    *   Copyright 2008-2012 Maarch
    *
    *   This file is part of Maarch Framework.
    *
    *   Maarch Framework 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, either version 3 of the License, or
    *   (at your option) any later version.
    *
    *   Maarch Framework 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.
    *
    *   You should have received a copy of the GNU General Public License
    *   along with Maarch Framework. If not, see <http://www.gnu.org/licenses/>.
    */
    
    /**
    * @brief class of install tools
    *
    * @file
    * @author Laurent Giovannoni
    * @author Arnaud Veber
    * @date $date$
    * @version $Revision$
    * @ingroup install
    */
    
    
    Giovannoni Laurent's avatar
    Giovannoni Laurent committed
    //Loads the required class
    try {
    
    Giovannoni Laurent's avatar
    Giovannoni Laurent committed
        require_once 'core/class/class_functions.php';
        require_once 'core/class/class_db.php';
        require_once 'install/class/Class_Merge.php';
    
    Giovannoni Laurent's avatar
    Giovannoni Laurent committed
    } catch (Exception $e) {
        echo $e->getMessage() . ' // ';
    }
    
    class Install extends functions
    {
        private $lang = 'en';
    
        private $docservers = array(
            array('FASTHD_AI', 'ai'),
            array('FASTHD_MAN', 'manual'),
            array('OAIS_MAIN_1', 'OAIS_main'),
            array('OAIS_SAFE_1', 'OAIS_safe'),
            array('OFFLINE_1', 'offline'),
            array('TEMPLATES', 'templates')
        );
    
        function __construct()
        {
            //merge css & js
            $Class_Merge = new Merge;
            //load lang
            $this->loadLang();
        }
    
        public function getLangList()
        {
            $langList = array();
    
    Giovannoni Laurent's avatar
    Giovannoni Laurent committed
            foreach(glob('install/lang/*.php') as $fileLangPath) {
    
    Giovannoni Laurent's avatar
    Giovannoni Laurent committed
                $langFile = str_replace('.php', '', end(explode('/', $fileLangPath)));
                array_push($langList, $langFile);
            }
    
            return $langList;
        }
    
        private function loadLang()
        {
            if (!isset($_SESSION['lang'])) {
                $this->lang = 'en';
            }
            $this->lang = $_SESSION['lang'];
    
            $langList = $this->getLangList();
            if (!in_array($this->lang, $langList)) {
                $this->lang = 'en';
            }
    
    
    Giovannoni Laurent's avatar
    Giovannoni Laurent committed
            require_once('install/lang/' . $this->lang . '.php');
    
    Giovannoni Laurent's avatar
    Giovannoni Laurent committed
        }
    
        public function getActualLang()
        {
            return $this->lang;
        }
    
        public function checkPrerequisites(
            $is = false,
            $optional = false
        )
        {
            if ($is) {
                return '<img src="img/green_light.png" width="20px"/>';
                exit;
            }
            if (!$optional) {
                return '<img src="img/red_light.png"  width="20px"/>';
                exit;
            }
            return '<img src="img/orange_light.png"  width="20px"/>';
        }
    
        public function checkAllNeededPrerequisites()
        {
            if (!$this->isPhpVersion()) {
                return false;
            }
            if (!$this->isPhpRequirements('pgsql')) {
                return false;
            }
    
            if (!$this->isPhpRequirements('mbstring')) {
                return false;
            }
    
            if (!$this->isMaarchPathWritable()) {
                return false;
            }
    
    Giovannoni Laurent's avatar
    Giovannoni Laurent committed
            if (!$this->isPhpRequirements('gd')) {
                return false;
            }
            if (!$this->isPearRequirements('System.php')) {
                return false;
            }
            if (!$this->isPearRequirements('MIME/Type.php')) {
                return false;
            }
            if (!$this->isIniErrorRepportingRequirements()) {
                return false;
            }
            if (!$this->isIniDisplayErrorRequirements()) {
                return false;
            }
            if (!$this->isIniShortOpenTagRequirements()) {
                return false;
            }
            if (!$this->isIniMagicQuotesGpcRequirements()) {
                return false;
            }
            return true;
        }
    
        public function isPhpVersion()
        {
            if (version_compare(PHP_VERSION, '5.3') < 0) {
                return false;
                exit;
            }
            return true;
        }
    
        public function isPhpRequirements($phpLibrary)
        {
            if (!@extension_loaded($phpLibrary)) {
                return false;
                exit;
            }
            return true;
        }
    
        public function isPearRequirements($pearLibrary)
        {
            $includePath = array();
            $includePath = explode(';', ini_get('include_path'));
            for ($i=0;$i<count($includePath);$i++) {
                if (file_exists($includePath[$i] . '/' . $pearLibrary)) {
                    return true;
                    exit;
                }
            }
            $includePath = explode(':', ini_get('include_path'));
            for ($i=0;$i<count($includePath);$i++) {
                if (file_exists($includePath[$i] . '/' . $pearLibrary)) {
                    return true;
                    exit;
                }
            }
            return false;
        }
    
        public function isIniErrorRepportingRequirements()
        {
    
    Giovannoni Laurent's avatar
    Giovannoni Laurent committed
            if (version_compare(PHP_VERSION, '5.4') >= 0) {
    
                if (ini_get('error_reporting') <> 24567) {
    
    Giovannoni Laurent's avatar
    Giovannoni Laurent committed
            } else {
    
                if (ini_get('error_reporting') <> 22519) {
    
    Giovannoni Laurent's avatar
    Giovannoni Laurent committed
            }
        }
    
        public function isIniDisplayErrorRequirements()
        {
            if (strtoupper(ini_get('display_errors')) ==  'OFF') {
                return false;
            } else {
                return true;
            }
        }
    
        public function isIniShortOpenTagRequirements()
        {
            if (strtoupper(ini_get('short_open_tag')) ==  'OFF') {
                return false;
            } else {
                return true;
            }
        }
    
        public function isIniMagicQuotesGpcRequirements()
        {
            if (strtoupper(ini_get('magic_quotes_gpc')) ==  'ON') {
                return false;
            } else {
                return true;
            }
        }
    
    
    Giovannoni Laurent's avatar
    Giovannoni Laurent committed
        public function getProgress(
            $stepNb,
            $stepNbTotal
        )
        {
    
            $stepNb--;
            $stepNbTotal--;
            if ($stepNb == 0) {
                return '';
                exit;
            }
    
    Giovannoni Laurent's avatar
    Giovannoni Laurent committed
            $return = '';
            $percentProgress = round(($stepNb/$stepNbTotal) * 100);
            $sizeProgress = round(($percentProgress * 910) / 100);
    
            $return .= '<div id="progressButton" style="width: '.$sizeProgress.'px;">';
                $return .= '<div align="center">';
                    $return .= $percentProgress.'%';
                $return .= '</div>';
            $return .= '</div>';
    
            return $return;
        }
    
    
    Giovannoni Laurent's avatar
    Giovannoni Laurent committed
        public function setPreviousStep(
            $previousStep
    
    Giovannoni Laurent's avatar
    Giovannoni Laurent committed
            $_SESSION['previousStep'] = $previousStep;
        }
    
    
    Giovannoni Laurent's avatar
    Giovannoni Laurent committed
        public function checkDatabaseParameters(
            $databaseserver,
            $databaseserverport,
            $databaseuser,
            $databasepassword,
            $databasetype
        )
        {
    
    Giovannoni Laurent's avatar
    Giovannoni Laurent committed
            $connect  = 'host='.$databaseserver . ' ';
            $connect .= 'port='.$databaseserverport . ' ';
            $connect .= 'user='.$databaseuser . ' ';
    
            $connect .= 'password='.$databasepassword . ' ';
            $connect .= 'dbname=postgres';
    
    Giovannoni Laurent's avatar
    Giovannoni Laurent committed
    
    
    Giovannoni Laurent's avatar
    Giovannoni Laurent committed
            if (!@pg_connect($connect)) {
                return false;
                exit;
            }
    
            pg_close();
    
            return true;
        }
    
        public function createDatabase(
            $databasename
        )
        {
            $connect  = 'host='.$_SESSION['config']['databaseserver'] . ' ';
            $connect .= 'port='.$_SESSION['config']['databaseserverport'] . ' ';
            $connect .= 'user='.$_SESSION['config']['databaseuser'] . ' ';
    
            $connect .= 'password='.$_SESSION['config']['databasepassword'] . ' ';
            $connect .= 'dbname=postgres';
    
    Giovannoni Laurent's avatar
    Giovannoni Laurent committed
    
            if (!@pg_connect($connect)) {
    
    Giovannoni Laurent's avatar
    Giovannoni Laurent committed
                return false;
                exit;
            }
    
    
    Giovannoni Laurent's avatar
    Giovannoni Laurent committed
            $sqlCreateDatabase  = 'CREATE DATABASE "'.$databasename.'"';
    
    Giovannoni Laurent's avatar
    Giovannoni Laurent committed
                $sqlCreateDatabase .= " WITH TEMPLATE template0";
                $sqlCreateDatabase .= " ENCODING = 'UTF8'";
    
    
    Giovannoni Laurent's avatar
    Giovannoni Laurent committed
            $execute = @pg_query($sqlCreateDatabase);
    
    Giovannoni Laurent's avatar
    Giovannoni Laurent committed
            if (!$execute) {
                return false;
                exit;
            }
    
            
            @pg_query('ALTER DATABASE "'.$databasename.'" SET DateStyle =iso, dmy');
            
    
    Giovannoni Laurent's avatar
    Giovannoni Laurent committed
            pg_close();
    
    
    Giovannoni Laurent's avatar
    Giovannoni Laurent committed
            $db = new dbquery();
    
    Giovannoni Laurent's avatar
    Giovannoni Laurent committed
            $db->connect();
            if (!$db) {
    
    Giovannoni Laurent's avatar
    Giovannoni Laurent committed
                return false;
    
    Giovannoni Laurent's avatar
    Giovannoni Laurent committed
                exit;
    
    Giovannoni Laurent's avatar
    Giovannoni Laurent committed
    
            if (!$this->executeSQLScript('structure.sql')) {
                return false;
                exit;
            }
    
    Giovannoni Laurent's avatar
    Giovannoni Laurent committed
    
            if (!$this->setConfigXml()) {
                return false;
                exit;
            }
            return true;
        }
    
        private function setConfigXml()
        {
    
            $xmlconfig = simplexml_load_file('apps/maarch_entreprise/xml/config.xml.default');
    
    Giovannoni Laurent's avatar
    Giovannoni Laurent committed
            $CONFIG = $xmlconfig->CONFIG;
    
            $CONFIG->databaseserver = $_SESSION['config']['databaseserver'];
            $CONFIG->databaseserverport = $_SESSION['config']['databaseserverport'];
            $CONFIG->databasename = $_SESSION['config']['databasename'];
            $CONFIG->databaseuser = $_SESSION['config']['databaseuser'];
            $CONFIG->databasepassword = $_SESSION['config']['databasepassword'];
            $CONFIG->lang = $_SESSION['lang'];
            $res = $xmlconfig->asXML();
            $fp = @fopen("apps/maarch_entreprise/xml/config.xml", "w+");
            if (!$fp) {
                return false;
                exit;
            }
            $write = fwrite($fp,$res);
            if (!$write) {
                return false;
                exit;
            }
    
    Giovannoni Laurent's avatar
    Giovannoni Laurent committed
            return true;
        }
    
        public function getDataList()
        {
            $sqlList = array();
            foreach(glob('data*.sql') as $fileSqlPath) {
                $sqlFile = str_replace('.sql', '', end(explode('/', $fileSqlPath)));
                array_push($sqlList, $sqlFile);
            }
    
            return $sqlList;
        }
    
        public function createData(
            $dataFile
        )
        {
            $db = new dbquery();
            $db->connect();
            if (!$db) {
                return false;
                exit;
            }
    
    Giovannoni Laurent's avatar
    Giovannoni Laurent committed
    
    
    Giovannoni Laurent's avatar
    Giovannoni Laurent committed
            if (!$this->executeSQLScript($dataFile)) {
                return false;
                exit;
            }
    
    Giovannoni Laurent's avatar
    Giovannoni Laurent committed
            return true;
    
    Giovannoni Laurent's avatar
    Giovannoni Laurent committed
    
    
    Giovannoni Laurent's avatar
    Giovannoni Laurent committed
        public function executeSQLScript($filePath)
        {
            $fileContent = fread(fopen($filePath, 'r'), filesize($filePath));
            $db = new dbquery();
            $db->connect();
    
    Giovannoni Laurent's avatar
    Giovannoni Laurent committed
            $execute = $db->query($fileContent, true, true);
    
    Giovannoni Laurent's avatar
    Giovannoni Laurent committed
    
            if (!$execute) {
                return false;
                exit;
            }
            return true;
    
        /**
         * test if maarch path is writable
         * @return boolean or error message
         */
        public function isMaarchPathWritable()
        {
            if (!is_writable('.')
                    || !is_readable('.')
            ) {
                $error .= _THE_MAARCH_PATH_DOES_NOT_HAVE_THE_ADEQUATE_RIGHTS;
            } else {
                return true;
            }
        }
    
    Giovannoni Laurent's avatar
    Giovannoni Laurent committed
    
    
    Giovannoni Laurent's avatar
    Giovannoni Laurent committed
        /**
         * test if docserver path is read/write
         * @param $docserverPath string path to the docserver
         * @return boolean or error message
         */
        public function checkDocserverRoot($docserverPath)
        {
            if (!is_dir($docserverPath)) {
                $error .= _PATH_OF_DOCSERVER_UNAPPROACHABLE;
            } else {
                if (!is_writable($docserverPath)
                    || !is_readable($docserverPath)
                ) {
                    $error .= _THE_DOCSERVER_DOES_NOT_HAVE_THE_ADEQUATE_RIGHTS;
                }
            }
            if ($error <> '') {
                return $error;
            } else {
                return true;
            }
        }
    
    Giovannoni Laurent's avatar
    Giovannoni Laurent committed
    
    
    Giovannoni Laurent's avatar
    Giovannoni Laurent committed
        /**
         * create the docservers
         * @param $docserverPath string path to the docserver
         * @return boolean
         */
        public function createDocservers($docserverPath)
        {
            for ($i=0;$i<count($this->docservers);$i++) {
                if (!is_dir(
    
    Giovannoni Laurent's avatar
    Giovannoni Laurent committed
                    $docserverPath . DIRECTORY_SEPARATOR
    
    Giovannoni Laurent's avatar
    Giovannoni Laurent committed
                    . $this->docservers[$i][1])
                ) {
                    if (!mkdir(
    
    Giovannoni Laurent's avatar
    Giovannoni Laurent committed
                        $docserverPath . DIRECTORY_SEPARATOR
    
    Giovannoni Laurent's avatar
    Giovannoni Laurent committed
                        . $this->docservers[$i][1])
                    ) {
                        return false;
                    }
                }
            }
            return true;
        }
    
    Giovannoni Laurent's avatar
    Giovannoni Laurent committed
    
    
    Giovannoni Laurent's avatar
    Giovannoni Laurent committed
        /**
         * update the docservers on DB
         * @param $docserverPath string path to the docserver
         * @return nothing
         */
        public function updateDocserversDB($docserverPath)
        {
            $db = new dbquery();
            $db->connect();
            for ($i=0;$i<count($this->docservers);$i++) {
    
    Giovannoni Laurent's avatar
    Giovannoni Laurent committed
              $query = "update docservers set path_template = '"
                . $db->protect_string_db($docserverPath . DIRECTORY_SEPARATOR
    
    Giovannoni Laurent's avatar
    Giovannoni Laurent committed
                . $this->docservers[$i][1] . DIRECTORY_SEPARATOR)
                . "' where docserver_id = '" . $this->docservers[$i][0] . "'";
                $db->query($query);
            }
        }
    
    Giovannoni Laurent's avatar
    Giovannoni Laurent committed
    
        public function setSuperadminPass(
            $newPass
        )
        {
            $db = new dbquery();
            $db->connect();
            $query = "UPDATE users SET password='".md5($newPass)."' WHERE user_id='superadmin'";
            $db->query($query);
        }
    
    Giovannoni Laurent's avatar
    Giovannoni Laurent committed
    }