Egorka
6 years ago
3 changed files with 369 additions and 21 deletions
@ -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…
Reference in new issue