[ 'Connection failed. Try again' => 'Ошибка соединения. Попробуйте снова', 'MySQL setup complete' => 'Настройка MySQL завершена', 'Installation complete' => 'Установка завершена', 'Please set subdomains aliases in you domain DNS:' => 'Настройте DNS домена для поддоменов:', 'Select initialization type' => 'Укажите тип установки', '[d] - Development' => '[d] - Для разработки', '[p] - Production' => '[p] - Для работы', 'Select installer language' => 'Укажите язык установщика', 'Language [en]: ' => 'Язык [en]', 'Type [p]: ' => 'Тип [p]', 'MySQL settings' => 'Параметры соединения с MySQL', 'Host [localhost]: ' => 'Хост [localhost]: ', 'Database name: ' => 'Название базы: ', 'Database name must be set' => 'Название базы не должно быть пустым', 'User: ' => 'Пользователь: ', 'User must be set' => 'Имя пользователя не должно быть пустым', 'Password: ' => 'Пароль: ', 'Set your HTTP protocol (http/https)' => 'Укажите HTTP протокол (http/https)', 'HTTP Protocol [http]: ' => 'HTTP протокол [http]: ', 'Website domain name' => 'Домен сайта', 'Example: site.com, domain.ru' => 'Например: site.com, domain.ru', 'Domain name: ' => 'Домен: ', 'Domain must be set' => 'Назание домена не должно быть пустым', 'Create admin account' => 'Создание аккаунта администратора', 'Username: ' => 'Имя пользователя: ', 'Username must be set' => 'Имя пользователя не должно быть пустым', 'E-mail must be set' => 'E-mail адрес не должен быть пустым', 'E-mail must be correct' => 'Ошибка e-mail адреса', 'Password must be set' => 'Пароль не может быть пустым', 'Repeat password: ' => 'Повторите пароль: ', 'Passwords must be equal' => 'Пароли должны совпадать', 'Admin account complete' => 'Аккаунт администратора создан', 'Prepare MySQL tables' => 'Подготовка MySQL таблиц', 'Complete' => 'Готово', 'Server HTTP configuration' => 'Конфигурация HTTP сервера', 'Does your server use Apache? [y]: ' => 'Ваш сервер использует Apache? [y]: ', 'Creating permissions' => 'Создание разрешений', 'Activating modules' => 'Активация модулей', ], ]; public function run() { // select language $this->selectLanguage(); // select type $this->selectType(); // run init if ($this->_type == 'd') { shell_exec('php ' . __DIR__ . '/init --env=Development --overwrite=y'); } else { shell_exec('php ' . __DIR__ . '/init --env=Production --overwrite=y'); } // config db while (!$this->setupMySQL()) { echo Console::log($this->l('Connection failed. Try again'), 'red') . PHP_EOL; } $this->setConfigMySQL(); echo Console::log($this->l('MySQL setup complete'), 'green') . PHP_EOL; // apply migrations $this->runMigrations(); // create admin $this->addAdmin(); // setup domain data $this->setConfigDomains(); // install modules $this->activateSystemModules(); // install system permissions $this->addPermissions(); // apache htaccess $this->apache(); echo '---------------------' . PHP_EOL; echo Console::log($this->l('Installation complete'), 'yellow') . PHP_EOL; echo PHP_EOL; echo Console::log($this->l('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() : void { echo '---------------------' . PHP_EOL; echo Console::log($this->l('Select initialization type'), 'white') . PHP_EOL; echo Console::log($this->l('[d] - Development'), 'normal') . PHP_EOL; echo Console::log($this->l('[p] - Production'), 'normal') . PHP_EOL; echo '---------------------' . PHP_EOL; $this->_type = readline($this->l('Type [p]: ')) ?: 'p'; } private function selectLanguage() : void { echo '---------------------' . PHP_EOL; echo Console::log($this->l('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($this->l('Language [en]: ')) ?: 'en'; } private function setupMySQL() : bool { echo '---------------------' . PHP_EOL; echo Console::log($this->l('MySQL settings'), 'white') . PHP_EOL; echo '---------------------' . PHP_EOL; $this->_db_host = readline($this->l('Host [localhost]: ')) ?: 'localhost'; while (!$this->_db_name = readline($this->l('Database name: '))) { echo Console::log($this->l('Database name must be set'), 'red') . PHP_EOL; }; while (!$this->_db_user = readline($this->l('User: '))) { echo Console::log($this->l('User must be set'), 'red') . PHP_EOL; }; $this->_db_pass = readline($this->l('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() : void { $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() : void { echo '---------------------' . PHP_EOL; echo Console::log($this->l('Set your HTTP protocol (http/https)'), 'white') . PHP_EOL; echo '---------------------' . PHP_EOL; $this->_http_protocol = readline($this->l('HTTP Protocol [http]: ')) ?: 'http'; echo '---------------------' . PHP_EOL; echo Console::log($this->l('Website domain name'), 'white') . PHP_EOL; echo Console::log($this->l('Example: site.com, domain.ru'), 'normal') . PHP_EOL; echo '---------------------' . PHP_EOL; while (!$this->_domain = readline($this->l('Domain name: '))) { echo Console::log($this->l('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; $cookie_domain = '.' . $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); $content = preg_replace('/(("|\')cookieDomain("|\')\s*=>\s*)(""|\'\')/', "\\1'$cookie_domain'", $content); file_put_contents($file, $content); } private function addAdmin() : void { echo '---------------------' . PHP_EOL; echo Console::log($this->l('Create admin account'), 'white') . PHP_EOL; echo '---------------------' . PHP_EOL; while (!$this->_username = readline($this->l('Username: '))) { echo Console::log($this->l('Username must be set'), 'red') . PHP_EOL; }; while (!$this->_email || ($this->_email && !$this->trueEmail($this->_email))) { $this->_email = readline('E-mail: '); if (!$this->_email) { echo Console::log($this->l('E-mail must be set'), 'red') . PHP_EOL; } if (!$this->trueEmail($this->_email)) { echo Console::log($this->l('E-mail must be correct'), 'red') . PHP_EOL; } } $password = null; while (!$this->_password || $this->_password != $password) { while (!$this->_password = readline($this->l('Password: '))) { echo Console::log($this->l('Password must be set'), 'red') . PHP_EOL; }; $password = readline($this->l('Repeat password: ')); if ($this->_password != $password) { echo Console::log($this->l('Passwords must be equal'), 'red') . PHP_EOL; } }; shell_exec('php ' . __DIR__ . '/yii user/add-admin "' . $this->_username . '" "' . $this->_email . '" "' . $this->_password . '"'); echo Console::log($this->l('Admin account complete'), 'green') . PHP_EOL; } private function trueEmail($email) : bool { $email = filter_var($email, FILTER_VALIDATE_EMAIL); return $email ? true : false; } private function runMigrations() : void { echo '---------------------' . PHP_EOL; echo Console::log($this->l('Prepare MySQL tables'), 'white') . PHP_EOL; echo '---------------------' . PHP_EOL; shell_exec('php ' . __DIR__ . '/yii migrate --interactive=0'); echo Console::log($this->l('Complete'), 'green') . PHP_EOL; } private function apache() : void { echo '---------------------' . PHP_EOL; echo Console::log($this->l('Server HTTP configuration'), 'white') . PHP_EOL; echo '---------------------' . PHP_EOL; $apache = readline($this->l('Does your server use Apache? [yes]: ')) ?: 'y'; if ($apache == 'y' || $apache == 'yes') { $this->prepareHtaccess(); } } private function prepareHtaccess() : void { // main $ssh_rules = <<_domain}%{REQUEST_URI} [L,R=301] RewriteCond %{HTTPS} on RewriteCond %{HTTP_HOST} ^(www\.)+(.*)$ [NC] RewriteRule (.*) https://{$this->_domain}%{REQUEST_URI} [L,R=301] SSH; $ssh_rules = $this->_http_protocol == 'https' ? $ssh_rules : ''; $main_htacces = << Options +FollowSymlinks RewriteEngine On {$ssh_rules} #static RewriteCond %{HTTP_HOST} ^static.{$this->_domain} RewriteRule ^(.*)$ zxcms/static/$1 [L] #RewriteCond %{HTTP_HOST} ^static.{$this->_domain} #RewriteRule ^(.*)$ $1 [L] RewriteCond %{HTTP_HOST} ^admin.{$this->_domain} RewriteRule ^(.*)$ zxcms/backend/web/$1 [L] # if /admin - backend RewriteCond %{HTTP_HOST} ^admin.{$this->_domain} RewriteRule ^assets/(.*)$ zxcms/backend/web/assets/$1 [L] RewriteCond %{HTTP_HOST} ^admin.{$this->_domain} RewriteRule ^css/(.*)$ zxcms/backend/web/css/$1 [L] RewriteCond %{HTTP_HOST} ^admin.{$this->_domain} RewriteRule ^js/(.*)$ zxcms/backend/web/js/$1 [L] RewriteCond %{REQUEST_URI} !^/zxcms/backend/web/(assets|js|css)/ RewriteCond %{HTTP_HOST} ^admin.{$this->_domain} RewriteRule ^.*$ zxcms/backend/web/index.php [L] #RewriteCond %{REQUEST_URI} !^/zxcms/static RewriteCond %{REQUEST_URI} ^/(assets|css|js|images) RewriteRule ^assets/(.*)$ zxcms/frontend/web/assets/$1 [L] RewriteRule ^css/(.*)$ zxcms/frontend/web/css/$1 [L] RewriteRule ^js/(.*)$ zxcms/frontend/web/js/$1 [L] RewriteRule ^images/(.*)$ zxcms/frontend/web/images/$1 [L] RewriteRule ^(.*)$ zxcms/frontend/web/$1 [L] #RewriteCond %{REQUEST_URI} !^/zxcms/static RewriteCond %{REQUEST_URI} !^/zxcms/(frontend|backend)/web/(assets|css|js)/ RewriteCond %{REQUEST_URI} !index.php RewriteCond %{REQUEST_FILENAME} !-f [OR] RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^.*$ zxcms/frontend/web/index.php MH; file_put_contents(__DIR__ . '/../.htaccess', $main_htacces); // backend, frontend $bf_htaccess = <<_http_protocol}://{$this->_domain}/site/error [R=404,L] ErrorDocument 404 {$this->_http_protocol}://{$this->_domain}/site/error SH; file_put_contents(__DIR__ . '/frontend/web/.htaccess', $static_htaccess); } private function addPermissions() : void { echo '---------------------' . PHP_EOL; echo Console::log($this->l('Creating permissions'), 'white') . PHP_EOL; echo '---------------------' . PHP_EOL; $systemPermissions = [ 'SettingsManagement' => 'Settings Management', 'MenuManagement' => 'Menu Management', 'ModuleManagement' => 'Modules Management', 'UserManagement' => 'Users Management', 'Dashboard' => 'Dashboard', 'SliderManagement' => 'Slider Management', ]; foreach ($systemPermissions as $name => $description) { shell_exec('php ' . __DIR__ . '/yii permission/add "' . $name . '" "' . $description . '"'); } echo Console::log($this->l('Complete'), 'green') . PHP_EOL; } private function activateSystemModules(): void { Console::log($this->l('Activating modules: '), 'white'); $systemModules = [ 'languages', 'pages', 'forms', 'links' ]; foreach ($systemModules as $name) { shell_exec('php ' . __DIR__ . '/yii module/add "' . $name . '"'); } echo Console::log($this->l('Complete'), 'green') . PHP_EOL; } private function l($str): string { return isset($this->_l[$this->_language]) && isset($this->_l[$this->_language][$str]) ? $this->_l[$this->_language][$str] : $str; } } 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); } }