* @package install * @version $Id$ * @link http://www.zentao.net */ ?> app->loadClass('snoopy'); if(@$snoopy->fetchText('http://www.zentao.net/misc-getlatestrelease.json')) { $result = json_decode($snoopy->results); if(isset($result->release) and $this->config->version != $result->release->version) { return $result->release; } } return false; } /** * Check php version. * * @access public * @return string ok|fail */ public function checkPHP() { return $result = version_compare(PHP_VERSION, '5.2.0') >= 0 ? 'ok' : 'fail'; } /** * Check PDO. * * @access public * @return string ok|fail */ public function checkPDO() { return $result = extension_loaded('pdo') ? 'ok' : 'fail'; } /** * Check PDO::MySQL * * @access public * @return string ok|fail */ public function checkPDOMySQL() { return $result = extension_loaded('pdo_mysql') ? 'ok' : 'fail'; } /** * Check json extension. * * @access public * @return string ok|fail */ public function checkJSON() { return $result = extension_loaded('json') ? 'ok' : 'fail'; } /** * Get tempRoot info. * * @access public * @return array */ public function getTmpRoot() { $result['path'] = $this->app->getTmpRoot(); $result['exists'] = is_dir($result['path']); $result['writable']= is_writable($result['path']); return $result; } /** * Check tmpRoot. * * @access public * @return string ok|fail */ public function checkTmpRoot() { $tmpRoot = $this->app->getTmpRoot(); return $result = (is_dir($tmpRoot) and is_writable($tmpRoot)) ? 'ok' : 'fail'; } /** * Get data root * * @access public * @return array */ public function getDataRoot() { $result['path'] = $this->app->getAppRoot() . 'www' . $this->app->getPathFix() . 'data'; $result['exists'] = is_dir($result['path']); $result['writable']= is_writable($result['path']); return $result; } /** * Check the data root. * * @access public * @return string ok|fail */ public function checkDataRoot() { $dataRoot = $this->app->getAppRoot() . 'www' . $this->app->getPathFix() . 'data'; return $result = (is_dir($dataRoot) and is_writable($dataRoot)) ? 'ok' : 'fail'; } /** * Get the php.ini info. * * @access public * @return string */ public function getIniInfo() { $iniInfo = ''; ob_start(); phpinfo(1); $lines = explode("\n", strip_tags(ob_get_contents())); ob_end_clean(); foreach($lines as $line) if(strpos($line, 'ini') !== false) $iniInfo .= $line . "\n"; return $iniInfo; } /** * Get web root. * * @access public * @return string */ public function getWebRoot() { return rtrim(str_replace('\\', '/', pathinfo($_SERVER['PHP_SELF'], PATHINFO_DIRNAME)), '/') . '/'; } /** * Check config ok or not. * * @access public * @return array */ public function checkConfig() { $return->result = 'ok'; /* Connect to database. */ $this->setDBParam(); $this->dbh = $this->connectDB(); if(!is_object($this->dbh)) { $return->result = 'fail'; $return->error = $this->lang->install->errorConnectDB . $this->dbh; return $return; } /* Get mysql version. */ $version = $this->getMysqlVersion(); /* If database no exits, try create it. */ if(!$this->dbExists()) { if(!$this->createDB($version)) { $return->result = 'fail'; $return->error = $this->lang->install->errorCreateDB; return $return; } } elseif($this->post->clearDB == false) { $return->result = 'fail'; $return->error = $this->lang->install->errorDBExists; return $return; } /* Create tables. */ if(!$this->createTable($version)) { $return->result = 'fail'; $return->error = $this->lang->install->errorCreateTable; return $return; } return $return; } /** * Set database params. * * @access public * @return void */ public function setDBParam() { $this->config->db->host = $this->post->dbHost; $this->config->db->name = $this->post->dbName; $this->config->db->user = $this->post->dbUser; $this->config->db->password = $this->post->dbPassword; $this->config->db->port = $this->post->dbPort; $this->config->db->prefix = $this->post->dbPrefix; } /** * Connect to database. * * @access public * @return object */ public function connectDB() { $dsn = "mysql:host={$this->config->db->host}; port={$this->config->db->port}"; try { $dbh = new PDO($dsn, $this->config->db->user, $this->config->db->password); $dbh->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ); $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $dbh->exec("SET NAMES {$this->config->db->encoding}"); return $dbh; } catch (PDOException $exception) { return $exception->getMessage(); } } /** * Check db exits or not. * * @access public * @return bool */ public function dbExists() { $sql = "SHOW DATABASES like '{$this->config->db->name}'"; return $this->dbh->query($sql)->fetch(); } /** * Get mysql version. * * @access public * @return string */ public function getMysqlVersion() { $sql = "SELECT VERSION() AS version"; $result = $this->dbh->query($sql)->fetch(); return substr($result->version, 0, 3); } /** * Create database. * * @param string $version * @access public * @return bool */ public function createDB($version) { $sql = "CREATE DATABASE `{$this->config->db->name}`"; if($version > 4.1) $sql .= " DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci"; return $this->dbh->query($sql); } /** * Create tables. * * @param string $version * @access public * @return bool */ public function createTable($version) { $dbFile = $this->app->getAppRoot() . 'db' . $this->app->getPathFix() . 'zentao.sql'; $tables = explode(';', file_get_contents($dbFile)); foreach($tables as $table) { $table = trim($table); if(empty($table)) continue; if(strpos($table, 'CREATE') !== false and $version <= 4.1) { $table = str_replace('DEFAULT CHARSET=utf8', '', $table); } elseif(strpos($table, 'DROP') !== false and $this->post->clearDB != false) { $table = str_replace('--', '', $table); } $table = str_replace('`zt_', $this->config->db->name . '.`zt_', $table); $table = str_replace('zt_', $this->config->db->prefix, $table); if(!$this->dbh->query($table)) return false; } return true; } /** * Create a comapny, set admin. * * @access public * @return void */ public function grantPriv() { if($this->post->password == '') die(js::error($this->lang->install->errorEmptyPassword)); /* Insert a company. */ $company->name = $this->post->company; $company->pms = $this->post->pms; $company->admins = ",{$this->post->account},"; $this->dao->insert(TABLE_COMPANY)->data($company)->autoCheck()->batchCheck('name, pms', 'notempty')->check('pms', 'unique')->exec(); if(!dao::isError()) { /* Set admin. */ $companyID = $this->dbh->lastInsertID(); $admin->account = $this->post->account; $admin->realname = $this->post->account; $admin->password = md5($this->post->password); $admin->company = $companyID; $this->dao->insert(TABLE_USER)->data($admin)->autoCheck()->check('account', 'notempty')->exec(); /* Update the group and groupPriv table. */ $this->dao->update(TABLE_GROUP)->set('company')->eq($companyID)->exec($autoCompany = false); $this->dao->update(TABLE_GROUPPRIV)->set('company')->eq($companyID)->exec($autoCompany = false); } } }