|  |  |  | <?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('php init --env=Development --overwrite=n');
 | 
					
						
							|  |  |  |         }
 | 
					
						
							|  |  |  |         else {
 | 
					
						
							|  |  |  |             shell_exec('php 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->_type = 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 = __DIR__ . '/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 = __DIR__ . '/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);
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  | }
 |