| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408 |
- <?php
- /**
- * Author: lf
- * Blog: https://blog.feehi.com
- * Email: job@feehi.com
- * Created at: 2017-03-15 21:16
- */
- namespace install\controllers;
- use Yii;
- use common\components\Feehi;
- use install\database\Tables;
- use Exception;
- use yii\db\Connection;
- use yii\helpers\Url;
- use common\models\AdminUser;
- use common\models\Options;
- use yii\web\Response;
- use yii\web\ErrorAction;
- /**
- * Site controller
- */
- class SiteController extends \yii\web\Controller
- {
- public $enableCsrfValidation = false;
- public static $installLockFile = '@install/install.lock';
- public function init()
- {
- self::$installLockFile = Yii::getAlias(self::$installLockFile);
- Feehi::determineLanguage();
- parent::init();
- if (self::getIsInstalled()) {
- $response = Yii::$app->getResponse();
- $response->content = Yii::t('install', "Has been installed, if you want to reinstall please remove {lock_file} and try it again", ['lock_file'=>self::$installLockFile]);
- $response->send();
- exit(0);
- }
- }
- public static function getIsInstalled()
- {
- return file_exists(self::$installLockFile);
- }
- public function actions()
- {
- return [
- 'error' => [
- 'class' => ErrorAction::className(),
- ],
- ];
- }
- public function actionError()
- {
- return $this->render('error');
- }
- public function actionIndex()
- {
- return $this->redirect(['choose-language']);
- }
- public function actionChooseLanguage()
- {
- return $this->render('choose-language');
- }
- public function actionAccept()
- {
- return $this->render('accept');
- }
- public function actionCheckEnvironment()
- {
- if (!isset($_SESSION['_install_env_passed']) || $_SESSION['_install_env_passed'] != 1) {
- if (!in_array(Yii::$app->getRequest()->headers['referer'], [
- Url::to(['accept'], true),
- Url::to(['check-environment'], true)
- ])
- ) {
- return $this->redirect(['accept']);
- };
- }
- $data = array();
- $data['phpversion'] = @phpversion();
- $data['os'] = PHP_OS;
- $tmp = function_exists('gd_info') ? gd_info() : array();
- $max_execution_time = ini_get('max_execution_time');
- $allow_reference = (ini_get('allow_call_time_pass_reference') ? '<font color=green>[√]On</font>' : '<font color=red>[×]Off</font>');
- $allow_url_fopen = (ini_get('allow_url_fopen') ? '<font color=green>[√]On</font>' : '<font color=red>[×]Off</font>');
- $safe_mode = (ini_get('safe_mode') ? '<font color=red>[×]On</font>' : '<font color=green>[√]Off</font>');
- $err = 0;
- if (!version_compare($data['phpversion'], '5.4', '<')) {
- $data['phpversion'] = '<i class="fa fa-check correct"></i> ' . Yii::t('install', 'Yes') . ' ' . $data['phpversion'];
- } else {
- $data['phpversion'] = '<i class="fa fa-remove error"></i> ' . Yii::t('install', 'No') . ' ' . $data['phpversion'];
- $err++;
- }
- if (empty($tmp['GD Version'])) {
- $gd = '<font color=red>[×]Off</font>';
- if (!extension_loaded('imagick')){
- $err++;
- }
- } else {
- $gd = '<font color=green>[√]On</font> ' . $tmp['GD Version'];
- }
- if (class_exists('pdo')) {
- $data['pdo'] = '<i class="fa fa-check correct"></i> ' . Yii::t('install', 'Yes');
- } else {
- $data['pdo'] = '<i class="fa fa-remove error"></i> ' . Yii::t('install', 'No');
- $err++;
- }
- /*if (extension_loaded('pdo_mysql')) {
- $data['pdo_mysql'] = '<i class="fa fa-check correct"></i> ' . Yii::t('install', 'Yes');
- } else {
- $data['pdo_mysql'] = '<i class="fa fa-remove error"></i> ' . Yii::t('install', 'No');
- $err++;
- }*/
- if (extension_loaded('curl')) {
- $data['curl'] = '<i class="fa fa-check correct"></i> ' . Yii::t('install', 'Yes');
- } else {
- $data['curl'] = '<i class="fa fa-remove error"></i> ' . Yii::t('install', 'No');
- $err++;
- }
- if (extension_loaded('gd')) {
- $data['gd'] = '<i class="fa fa-check correct"></i> ' . Yii::t('install', 'Yes');
- } else {
- $data['gd'] = '<i class="fa fa-remove error"></i> ' . Yii::t('install', 'No');
- if (function_exists('imagettftext')) {
- $data['gd'] .= '<br><i class="fa fa-remove error"></i> FreeType Support ' . Yii::t('install', 'No');
- }
- $err++;
- }
- if (extension_loaded('json')) {
- $data['json'] = '<i class="fa fa-check correct"></i> ' . Yii::t('install', 'Yes');
- } else {
- $data['json'] = '<i class="fa fa-remove error"></i> ' . Yii::t('install', 'No');
- $err++;
- }
- if (extension_loaded('mbstring')) {
- $data['mbstring'] = '<i class="fa fa-check correct"></i> ' . Yii::t('install', 'Yes');
- } else {
- $data['mbstring'] = '<i class="fa fa-remove error"></i> ' . Yii::t('install', 'No');
- $err++;
- }
- if (ini_get('file_uploads')) {
- $data['upload_size'] = '<i class="fa fa-check correct"></i> ' . ini_get('upload_max_filesize');
- } else {
- $data['upload_size'] = '<i class="fa fa-remove error"></i> ' . Yii::t('install', 'Forbidden');
- }
- if (function_exists('session_start')) {
- $data['session'] = '<i class="fa fa-check correct"></i> ' . Yii::t('install', 'Yes');
- } else {
- $data['session'] = '<i class="fa fa-remove error"></i> ' . Yii::t('install', 'No');
- $err++;
- }
- $folders = array(
- '@frontend/runtime',
- '@frontend/web/assets',
- '@backend/runtime',
- '@frontend/web/admin/assets',
- );
- $newFolders = array();
- foreach ($folders as &$dir) {
- $dir = Yii::getAlias($dir);
- if (is_writable($dir)) {
- $newFolders[$dir]['w'] = true;
- } else {
- $newFolders[$dir]['w'] = false;
- $err++;
- }
- if (is_readable($dir)) {
- $newFolders[$dir]['r'] = true;
- } else {
- $newFolders[$dir]['r'] = false;
- $err++;
- }
- }
- $data['folders'] = $newFolders;
- $_SESSION['_install_env_passed'] = 0;
- if ($err == 0) {
- $_SESSION['_install_env_passed'] = 1;
- }
- $data['err'] = $err;
- return $this->render('check-environment', $data);
- }
- public function actionSetinfo()
- {
- set_time_limit(300);
- if (! isset($_SESSION['_install_env_passed']) || $_SESSION['_install_env_passed'] != 1) {
- $url = Url::to(['check-environment']);
- echo "<script>alert('" . Yii::t('install', 'Please check your environment to suite the cms') . Yii::t('install', ' If environment have been suit to the cms please check php session can set correctly') . "');location.href='{$url}';</script>";
- exit(0);
- }
- if (Yii::$app->getRequest()->getIsPost()) {
- $this->on(self::EVENT_AFTER_ACTION, function () {
- $request = Yii::$app->getRequest();
- Yii::$app->getResponse()->format = Response::FORMAT_JSON;
- try {
- $db = $this->_getDbConnection();
- Yii::$app->set("db", $db);
- $tables = new Tables(['db' => Yii::$app->db]);
- $tables->importDatabase();
- //更新配置信息
- $data = [
- 'username' => $request->post('manager', 'admin'),
- 'password_hash' => Yii::$app->security->generatePasswordHash($request->post('manager_pwd')),
- 'email' => $request->post('manager_email'),
- ];
- Yii::$app->getDb()->createCommand()->update(AdminUser::tableName(), $data, 'id = 1')->execute();
- $model = Options::findOne(['name' => 'website_title']);
- $model->value = $request->post('sitename', 'Feehi CMS');
- $model->save(false);
- $model = Options::findOne(['name' => 'website_url']);
- $model->value = $request->post('website_url', '');
- $model->save(false);
- $model = Options::findOne(['name' => 'website_url']);
- $model->value = $request->post('siteurl', '');
- $model->save(false);
- $model = Options::findOne(['name' => 'seo_keywords']);
- $model->value = $request->post('sitekeywords', '');
- $model->save(false);
- $model = Options::findOne(['name' => 'seo_description']);
- $model->value = $request->post('siteinfo', '');
- $model->save(false);
- }catch (Exception $e){
- echo str_repeat(" ", 1024 * 64 * 99);
- $msg = str_replace(array("\r\n", "\r", "\n"), "", $e->getMessage());
- $msg = str_replace('"', '', $msg);
- $msg = str_replace("'", '', $msg);
- echo "<script type=\"text/javascript\">alert(\"$msg\");history.back();</script>";
- ob_flush();
- flush();
- exit(0);
- }
- $_SESSION["_install_setinfo"] = 1;
- $configFile = yii::getAlias("@common/config/main-local.php");
- $array = require $configFile;
- $array['components']['db'] = [
- 'class' => yii\db\Connection::className(),
- 'dsn' => $db->dsn,
- 'username' => $db->username,
- 'password' => $db->password,
- 'charset' => 'utf8',
- 'tablePrefix' => $db->tablePrefix,
- ];
- $str = "<?php \n return " . var_export($array,true) . ";";
- $str = str_replace('\\\\', '\\', $str);
- if( !file_put_contents($configFile, $str) ){
- sleep(1);
- $message = Yii::t("install", "Installed success;but update write config file error.please update common/config/main-local.php components db section.");
- echo "<script>alert('{$message}');location.href='" . Url::to(['success']) . "';</script>";
- }else {
- sleep(1);
- echo "<script>location.href='" . Url::to(['success']) . "';</script>";
- }
- exit(0);
- });
- $html = $this->render('installing');
- echo $html;
- flush();
- if(ob_get_level() > 0){
- ob_flush();
- }
- } else {
- return $this->render('setinfo');
- }
- }
- public function actionCreateDatabase()
- {
- Yii::$app->getResponse()->format = Response::FORMAT_JSON;
- try {
- $this->_getDbConnection();
- return ['message' => ''];
- } catch (Exception $e) {
- throw new Exception($e->getMessage());
- }
- }
- private function _getDbConnection()
- {
- $request = Yii::$app->getRequest();
- $dbtype = $request->post('dbtype', 'mysql');
- $dbhost = $request->post('dbhost', 'dbhost');
- $dbuser = $request->post('dbuser', 'root');
- $dbpassword = $request->post('dbpw', '');
- $dbport = $request->post('dbport', '3306');
- $dbname = $request->post('dbname', '');
- $tablePrefix = $request->post("dbprefix", '');
- $dsn = '';
- switch ($dbtype) {
- case "pgsql":
- case "mysql":
- $dsn = $dbtype . ":host=" . $dbhost . ';port=' . $dbport;
- if( !empty($dbname) ) $dsn .= ";dbname=" . $dbname;
- break;
- case "sqlite":
- $path = Yii::getAlias($dbhost);
- $dsn = "sqlite:$path";
- break;
- }
- $db = new Connection([
- 'dsn' => $dsn,
- 'username' => $dbuser,
- 'password' => $dbpassword,
- 'charset' => 'utf8',
- 'tablePrefix' => $tablePrefix,
- ]);
- $this->checkAccountPermission($db, $dbtype, $dbname);
- return $db;
- }
- public function actionSuccess()
- {
- if (isset($_SESSION["_install_setinfo"]) && $_SESSION["_install_setinfo"] == 1) {
- if( !touch(Yii::getAlias(self::$installLockFile)) ){
- $message = Yii::t("install", "Touch install lock file {lock_file} failed,please touch file handled", ['lock_file'=>self::$installLockFile]);
- echo "<script>alert('{$message}')</script>";
- }
- session_destroy();
- return $this->render("success");
- } else {
- return $this->redirect(['setinfo']);
- }
- }
- public function actionLanguage()
- {
- $language = Yii::$app->getRequest()->get('lang');
- if (isset($language)) {
- Yii::$app->session['language'] = $language;
- }
- return $this->redirect(['accept']);
- }
- private function checkAccountPermission(Connection $db, $dbtype, $dbname)
- {
- if($dbtype != "sqlite") {
- try {
- if($dbtype === "pgsql"){
- }else {
- $db->createCommand("use $dbname")->execute();
- }
- }catch (\yii\db\Exception $e){
- if( $e->getCode() == 1049 ) {
- $request = Yii::$app->getRequest();
- $dbhost = $request->post('dbhost', 'dbhost');
- $dbport = $request->post('dbport', '3306');
- $dsn = $dbtype . ":host=" . $dbhost . ';port=' . $dbport;
- $db->dsn = $dsn;
- $db->pdo = null;
- $db->open();
- $result = $db->createCommand("CREATE DATABASE IF NOT EXISTS `{$dbname}` DEFAULT CHARACTER SET utf8")->execute();
- if ($result == 1) {
- $this->checkAccountPermission($db, $dbtype, $dbname);
- return;
- } else {
- throw new Exception(Yii::t('install', 'Create database error, please create yourself and retry'));
- }
- }else{
- throw new Exception($e->getMessage());
- }
- }
- $db->createCommand("create table test(id integer)")->execute();
- $db->createCommand("insert into test values(1)")->execute();
- $result = $db->createCommand("select * from test where id=1")->queryOne();
- if ($result === false) {
- throw new Exception(Yii::t('install', 'Access to database `{database}` error. Maybe permission denied', ['database' => $dbname]));
- }
- try {
- $db->createCommand("drop table test")->execute();
- } catch (Exception $exception) {
- Yii::error("after install feehicms delete test database table `test` error:" . $exception->getFile() . "(" . $exception->getLine() . ")" . $exception->getMessage());
- }
- }
- }
- }
|