You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							334 lines
						
					
					
						
							11 KiB
						
					
					
				
			
		
		
	
	
							334 lines
						
					
					
						
							11 KiB
						
					
					
				| <?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 = '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); | |
|     } | |
| }
 | |
| 
 |