From fe7652902840c2368acfd4ac1621ae7f03a29824 Mon Sep 17 00:00:00 2001 From: Egorka Date: Mon, 3 Sep 2018 16:33:00 +0300 Subject: [PATCH] Installer --- composer.json | 7 +- console/controllers/UserController.php | 49 +++-- setup.php | 334 +++++++++++++++++++++++++++++++++ 3 files changed, 369 insertions(+), 21 deletions(-) create mode 100644 setup.php diff --git a/composer.json b/composer.json index f69687b..b66fd5e 100644 --- a/composer.json +++ b/composer.json @@ -65,5 +65,10 @@ "type": "vcs", "url": "https://github.com/zertex/yii2-elfinder.git" } - ] + ], + "scripts": { + "post-create-project-cmd": [ + "@php setup.php" + ] + } } diff --git a/console/controllers/UserController.php b/console/controllers/UserController.php index 61bf4ce..ab06dbb 100644 --- a/console/controllers/UserController.php +++ b/console/controllers/UserController.php @@ -8,65 +8,74 @@ namespace console\controllers; -use core\entities\user\User; use core\forms\user\UserForm; use yii\helpers\ArrayHelper; use core\services\user\UserManageService; use yii\console\Controller; -use yii\console\Exception; use Yii; -use yii\mail\MailerInterface; class UserController extends Controller { - private $service; + private $_service; public function __construct($id, $module, UserManageService $service, $config = []) { parent::__construct($id, $module, $config); - $this->service = $service; + $this->_service = $service; } public function actionAdd() { - $username = $this->prompt('Username:', ['required' => true]); - $email = $this->prompt('Email:', ['required' => true]); + $username = $this->prompt('Username:', ['required' => true]); + $email = $this->prompt('Email:', ['required' => true]); $password = $this->prompt('Password:', ['required' => true]); - $role = $this->select('Role:', ArrayHelper::map(Yii::$app->authManager->getRoles(), 'name', 'description')); + $role = $this->select('Role:', ArrayHelper::map(Yii::$app->authManager->getRoles(), 'name', 'description')); //$this->findModel($username, $email); - $form = new UserForm(); + $form = new UserForm(); $form->username = $username; - $form->email = $email; + $form->email = $email; $form->password = $password; - $form->role = $role; + $form->role = $role; - if ($form->validate()) - { - $this->service->create($form); + if ($form->validate()) { + $this->_service->create($form); $this->stdout('Done!' . PHP_EOL); + return; } $this->stdout('Errors found!' . PHP_EOL); - foreach ($form->errors as $error) - { + foreach ($form->errors as $error) { $this->stdout(is_string($error) ? $error : $error[0] . PHP_EOL); } //$this->stdout(print_r($form->errors, true) . PHP_EOL); - /* $user = User::create($username, $email, $phone, $password); $user->save();*/ } - private function findModel(string $username, string $email): void + public function actionAddAdmin($username, $email, $password) + { + $form = new UserForm(); + $form->username = $username; + $form->email = $email; + $form->password = $password; + $form->role = 'admin'; + + if ($form->validate()) { + $this->_service->create($form); + return; + } + } + + /*private function findModel(string $username, string $email): void { if ($model = User::find()->where(['username' => $username])->orWhere(['email' => $email])->one()) { throw new Exception('User is already exists.'); } - } -} \ No newline at end of file + }*/ +} diff --git a/setup.php b/setup.php new file mode 100644 index 0000000..dad9efb --- /dev/null +++ b/setup.php @@ -0,0 +1,334 @@ +selectLanguage(); + + // select type + $this->selectType(); + + // run init + if ($this->_type == 'd') { + shell_exec('init --env=Development --overwrite=n'); + } + else { + shell_exec('init --env=Production --overwrite=n'); + } + + // config db + while (!$this->setupMySQL()) { + echo Console::log('Connection failed. Try again', 'red') . PHP_EOL; + } + $this->setConfigMySQL(); + echo Console::log('MySQL setup complete', 'green') . PHP_EOL; + + // apply migrations + $this->runMigrations(); + + // create admin + $this->addAdmin(); + + // setup domain data + $this->setConfigDomains(); + + echo '---------------------' . PHP_EOL; + echo Console::log('Installation complete', 'yellow') . PHP_EOL; + echo PHP_EOL; + echo Console::log('Please set subdomains aliases in you domain DNS:', 'normal') . PHP_EOL; + echo Console::log('admin.' . $this->_domain, 'normal') . PHP_EOL; + echo Console::log('static.' . $this->_domain, 'normal') . PHP_EOL; + echo '---------------------' . PHP_EOL; + } + + private function selectType() + { + echo '---------------------' . PHP_EOL; + echo Console::log('Select initialization type', 'white') . PHP_EOL; + echo Console::log('[d] - Development', 'normal') . PHP_EOL; + echo Console::log('[p] - Production', 'normal') . PHP_EOL; + echo '---------------------' . PHP_EOL; + $this->_language = readline('Type [p]: ') ?: 'p'; + } + + private function selectLanguage() + { + echo '---------------------' . PHP_EOL; + echo Console::log('Select installer language', 'white') . PHP_EOL; + echo Console::log('[ru] - Русский', 'normal') . PHP_EOL; + echo Console::log('[en] - English', 'normal') . PHP_EOL; + echo '---------------------' . PHP_EOL; + $this->_language = readline('Language [en]: ') ?: 'en'; + } + + private function setupMySQL(): bool + { + echo '---------------------' . PHP_EOL; + echo Console::log('MySQL settings', 'white') . PHP_EOL; + echo '---------------------' . PHP_EOL; + $this->_db_host = readline('Host [localhost]: ') ?: 'localhost'; + while (!$this->_db_name = readline('Database name: ')) { + echo Console::log('Database name must be set', 'red') . PHP_EOL; + }; + while (!$this->_db_user = readline('User: ')) { + echo Console::log('User must be set', 'red') . PHP_EOL; + }; + $this->_db_pass = readline('Password: '); + + return $this->checkDatabaseConnection(); + } + + private function checkDatabaseConnection(): bool + { + try { + $this->_db_connection = new \PDO('mysql:host=' . $this->_db_host . ';dbname=' . $this->_db_name, $this->_db_user, $this->_db_pass); + $this->_db_connection->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); + return true; + } catch (\Exception $e) { + return false; + } + } + + private function setConfigMySQL() + { + $mysql_line = 'mysql:host=' . $this->_db_host . ';dbname=' . $this->_db_name; + $file = 'common/config/main-local.php'; + $content = file_get_contents($file); + $content = preg_replace('/(("|\')dsn("|\')\s*=>\s*)(""|\'\')/', "\\1'$mysql_line'", $content); + $content = preg_replace('/(("|\')username("|\')\s*=>\s*)(""|\'\')/', "\\1'$this->_db_user'", $content); + $content = preg_replace('/(("|\')password("|\')\s*=>\s*)(""|\'\')/', "\\1'$this->_db_pass'", $content); + file_put_contents($file, $content); + } + + private function setConfigDomains() + { + echo '---------------------' . PHP_EOL; + echo Console::log('Set your HTTP protocol (http/https)', 'white') . PHP_EOL; + echo '---------------------' . PHP_EOL; + $this->_http_protocol = readline('HTTP Protocol [http]: ') ?: 'http'; + + echo '---------------------' . PHP_EOL; + echo Console::log('Website domain name', 'white') . PHP_EOL; + echo Console::log('Example: site.com, domain.ru', 'normal') . PHP_EOL; + echo '---------------------' . PHP_EOL; + while (!$this->_domain = readline('Domain name: ')) { + echo Console::log('Domain must be set', 'red') . PHP_EOL; + }; + + $file = 'common/config/params-local.php'; + $content = file_get_contents($file); + + $site_domain = $this->_http_protocol . '://' . $this->_domain; + $admin_domain = $this->_http_protocol . '://admin.' . $this->_domain; + $static_domain = $this->_http_protocol . '://static.' . $this->_domain; + + $content = preg_replace('/(("|\')frontendHostInfo("|\')\s*=>\s*)(""|\'\')/', "\\1'$site_domain'", $content); + $content = preg_replace('/(("|\')backendHostInfo("|\')\s*=>\s*)(""|\'\')/', "\\1'$admin_domain'", $content); + $content = preg_replace('/(("|\')staticHostInfo("|\')\s*=>\s*)(""|\'\')/', "\\1'$static_domain'", $content); + $content = preg_replace('/(("|\')supportEmail("|\')\s*=>\s*)(""|\'\')/', "\\1'$this->_email'", $content); + $content = preg_replace('/(("|\')adminEmail("|\')\s*=>\s*)(""|\'\')/', "\\1'$this->_email'", $content); + + file_put_contents($file, $content); + } + + private function addAdmin(): void + { + echo '---------------------' . PHP_EOL; + echo Console::log('Create admin account', 'white') . PHP_EOL; + echo '---------------------' . PHP_EOL; + while (!$this->_username = readline('Username: ')) { + echo Console::log('Username must be set', 'red') . PHP_EOL; + }; + while (!$this->_email || ($this->_email && $this->checkEmail($this->_email))) { + $this->_email = readline('E-mail: '); + if (!$this->_email) { + echo Console::log('E-mail must be set', 'red') . PHP_EOL; + } + if (!$this->checkEmail($this->_email)) { + echo Console::log('E-mail must be correct', 'red') . PHP_EOL; + } + } + $password = null; + while (!$this->_password || $this->_password != $password) { + while (!$this->_password = readline('Password: ')) { + echo Console::log('Password must be set', 'red') . PHP_EOL; + }; + $password = readline('Repeat password: '); + if ($this->_password != $password) { + echo Console::log('Passwords must be equal', 'red') . PHP_EOL; + } + }; + shell_exec('php yii user/add-admin "' . $this->_username . '" "' . $this->_email . '" "' . $this->_password . '"'); + echo Console::log('Admin account complete', 'green') . PHP_EOL; + } + + private function checkEmail($email): bool + { + $email = filter_var($email, FILTER_VALIDATE_EMAIL); + return $email ? true : false; + } + + private function runMigrations(): void + { + echo '---------------------' . PHP_EOL; + echo Console::log('Prepare MySQL tables', 'white') . PHP_EOL; + echo '---------------------' . PHP_EOL; + shell_exec('php yii migrate --interactive=0'); + echo Console::log('Complete', 'green') . PHP_EOL; + } +} + +chdir(dirname(__DIR__)); +$setup = new Setup(); +$setup->run(); + + +// Colored class + +class Console +{ + + static $foreground_colors = array( + 'bold' => '1', + 'dim' => '2', + 'black' => '0;30', + 'dark_gray' => '1;30', + 'blue' => '0;34', + 'light_blue' => '1;34', + 'green' => '0;32', + 'light_green' => '1;32', + 'cyan' => '0;36', + 'light_cyan' => '1;36', + 'red' => '0;31', + 'light_red' => '1;31', + 'purple' => '0;35', + 'light_purple' => '1;35', + 'brown' => '0;33', + 'yellow' => '1;33', + 'light_gray' => '0;37', + 'white' => '1;37', + 'normal' => '0;39', + ); + + static $background_colors = array( + 'black' => '40', + 'red' => '41', + 'green' => '42', + 'yellow' => '43', + 'blue' => '44', + 'magenta' => '45', + 'cyan' => '46', + 'light_gray' => '47', + ); + + static $options = array( + 'underline' => '4', + 'blink' => '5', + 'reverse' => '7', + 'hidden' => '8', + ); + static $EOF = "\n"; + + /** + * Logs a string to console. + * + * @param string $str Input String + * @param string $color Text Color + * @param boolean $newline Append EOF? + * @param [type] $background Background Color + * + * Formatted output + */ + public static function log($str = '', $color = 'normal', $newline = false, $background_color = null) + { + if (is_bool($color)) { + $newline = $color; + $color = 'normal'; + } elseif (is_string($color) && is_string($newline)) { + $background_color = $newline; + $newline = true; + } + $str = $newline ? $str . self::$EOF : $str; + echo self::$color($str, $background_color); + } + + /** + * Anything below this point (and its related variables): + * Colored CLI Output is: (C) Jesse Donat + * https://gist.github.com/donatj/1315354 + * ------------------------------------------------------------- + */ + + /** + * Catches static calls (Wildcard) + * + * @param string $foreground_color Text Color + * @param array $args Options + * + * @return string Colored string + */ + public static function __callStatic($foreground_color, $args) + { + $string = $args[0]; + $colored_string = ""; + + // Check if given foreground color found + if (isset(self::$foreground_colors[$foreground_color])) { + $colored_string .= "\033[" . self::$foreground_colors[$foreground_color] . "m"; + } else { + die($foreground_color . ' not a valid color'); + } + + array_shift($args); + foreach ($args as $option) { + // Check if given background color found + if (isset(self::$background_colors[$option])) { + $colored_string .= "\033[" . self::$background_colors[$option] . "m"; + } elseif (isset(self::$options[$option])) { + $colored_string .= "\033[" . self::$options[$option] . "m"; + } + } + + // Add string and end coloring + $colored_string .= $string . "\033[0m"; + + return $colored_string; + + } + + /** + * Plays a bell sound in console (if available) + * + * @param integer $count Bell play count + * + * Bell play string + */ + public static function bell($count = 1) + { + echo str_repeat("\007", $count); + } +}