Browse Source

Installer

master
Egorka 6 years ago
parent
commit
fe76529028
  1. 7
      composer.json
  2. 47
      console/controllers/UserController.php
  3. 334
      setup.php

7
composer.json

@ -65,5 +65,10 @@
"type": "vcs",
"url": "https://github.com/zertex/yii2-elfinder.git"
}
]
],
"scripts": {
"post-create-project-cmd": [
"@php setup.php"
]
}
}

47
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.');
}
}
}*/
}

334
setup.php

@ -0,0 +1,334 @@
<?php
/**
* Created by Error202
* Date: 03.09.2018
*/
namespace zertex;
class Setup
{
private $_language;
private $_type;
private $_db_host;
private $_db_name;
private $_db_user;
private $_db_pass;
private $_db_connection;
private $_username;
private $_password;
private $_email;
private $_http_protocol;
private $_domain;
public function run()
{
// select language
$this->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);
}
}
Loading…
Cancel
Save